@needle-tools/engine 5.0.2 → 5.1.0-canary.87c4c44
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/CHANGELOG.md +24 -0
- package/README.md +6 -7
- package/SKILL.md +39 -21
- package/components.needle.json +1 -1
- package/dist/needle-engine.bundle-BlVD1I5a.min.js +1656 -0
- package/dist/{needle-engine.bundle-BoTyA-Le.js → needle-engine.bundle-CFOipCo_.js} +8519 -7920
- package/dist/needle-engine.bundle-DX2Y-SQF.umd.cjs +1656 -0
- package/dist/needle-engine.d.ts +628 -61
- package/dist/needle-engine.js +575 -565
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{vendor-vHLk8sXu.js → vendor-CAcsI0eU.js} +116 -115
- package/dist/{vendor-CntUvmJu.umd.cjs → vendor-CEM38hLE.umd.cjs} +2 -2
- package/dist/{vendor-DPbfJJ4d.min.js → vendor-HRlxIBga.min.js} +2 -2
- package/lib/engine/api.d.ts +2 -0
- package/lib/engine/api.js +2 -0
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_addressables.js +5 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_animation.d.ts +14 -7
- package/lib/engine/engine_animation.js +49 -9
- package/lib/engine/engine_animation.js.map +1 -1
- package/lib/engine/engine_components.js +33 -4
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_context.d.ts +7 -2
- package/lib/engine/engine_context.js +10 -2
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +4 -0
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_init.js +2 -0
- package/lib/engine/engine_init.js.map +1 -1
- package/lib/engine/engine_input.js +4 -1
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_materialpropertyblock.js +1 -20
- package/lib/engine/engine_materialpropertyblock.js.map +1 -1
- package/lib/engine/engine_networking.d.ts +11 -8
- package/lib/engine/engine_networking.js +43 -26
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_networking_instantiate.d.ts +100 -5
- package/lib/engine/engine_networking_instantiate.js +150 -16
- package/lib/engine/engine_networking_instantiate.js.map +1 -1
- package/lib/engine/engine_networking_prefabs.d.ts +59 -0
- package/lib/engine/engine_networking_prefabs.js +67 -0
- package/lib/engine/engine_networking_prefabs.js.map +1 -0
- package/lib/engine/postprocessing/api.d.ts +2 -0
- package/lib/engine/postprocessing/api.js +2 -0
- package/lib/engine/postprocessing/api.js.map +1 -0
- package/lib/engine/postprocessing/index.d.ts +2 -0
- package/lib/engine/postprocessing/index.js +2 -0
- package/lib/engine/postprocessing/index.js.map +1 -0
- package/lib/engine/postprocessing/postprocessing.d.ts +83 -0
- package/lib/engine/postprocessing/postprocessing.js +280 -0
- package/lib/engine/postprocessing/postprocessing.js.map +1 -0
- package/lib/engine/postprocessing/types.d.ts +39 -0
- package/lib/engine/postprocessing/types.js +2 -0
- package/lib/engine/postprocessing/types.js.map +1 -0
- package/lib/engine/webcomponents/WebXRButtons.js +17 -3
- package/lib/engine/webcomponents/WebXRButtons.js.map +1 -1
- package/lib/engine/webcomponents/icons.js +3 -1
- package/lib/engine/webcomponents/icons.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.d.ts +1 -0
- package/lib/engine/xr/NeedleXRSession.js +43 -10
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine/xr/init.d.ts +4 -0
- package/lib/engine/xr/init.js +49 -0
- package/lib/engine/xr/init.js.map +1 -0
- package/lib/engine-components/AnimationUtils.d.ts +4 -1
- package/lib/engine-components/AnimationUtils.js +7 -19
- package/lib/engine-components/AnimationUtils.js.map +1 -1
- package/lib/engine-components/AnimatorController.d.ts +135 -2
- package/lib/engine-components/AnimatorController.js +216 -13
- package/lib/engine-components/AnimatorController.js.map +1 -1
- package/lib/engine-components/OrbitControls.d.ts +4 -0
- package/lib/engine-components/OrbitControls.js +5 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/SeeThrough.d.ts +0 -2
- package/lib/engine-components/SeeThrough.js +0 -89
- package/lib/engine-components/SeeThrough.js.map +1 -1
- package/lib/engine-components/SyncedRoom.d.ts +4 -0
- package/lib/engine-components/SyncedRoom.js +23 -8
- package/lib/engine-components/SyncedRoom.js.map +1 -1
- package/lib/engine-components/SyncedTransform.js +5 -5
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/Voip.d.ts +46 -0
- package/lib/engine-components/Voip.js +126 -2
- package/lib/engine-components/Voip.js.map +1 -1
- package/lib/engine-components/api.d.ts +1 -0
- package/lib/engine-components/api.js +1 -0
- package/lib/engine-components/api.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +5 -2
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +11 -18
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +3 -4
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +6 -15
- package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +2 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/postprocessing/Volume.d.ts +18 -11
- package/lib/engine-components/postprocessing/Volume.js +61 -140
- package/lib/engine-components/postprocessing/Volume.js.map +1 -1
- package/lib/engine-components/postprocessing/index.d.ts +1 -0
- package/lib/engine-components/postprocessing/index.js +1 -0
- package/lib/engine-components/postprocessing/index.js.map +1 -1
- package/lib/engine-components/postprocessing/utils.d.ts +2 -0
- package/lib/engine-components/postprocessing/utils.js +2 -0
- package/lib/engine-components/postprocessing/utils.js.map +1 -1
- package/lib/engine-components/ui/Canvas.js +2 -2
- package/lib/engine-components/ui/Canvas.js.map +1 -1
- package/lib/engine-components/ui/Graphic.d.ts +3 -3
- package/lib/engine-components/ui/Graphic.js +6 -2
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/Text.d.ts +64 -11
- package/lib/engine-components/ui/Text.js +154 -45
- package/lib/engine-components/ui/Text.js.map +1 -1
- package/lib/engine-components/ui/index.d.ts +1 -0
- package/lib/engine-components/ui/index.js +1 -0
- package/lib/engine-components/ui/index.js.map +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +25 -3
- package/lib/engine-components-experimental/networking/PlayerSync.js +60 -11
- package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
- package/package.json +6 -5
- package/plugins/vite/ai.d.ts +11 -10
- package/plugins/vite/ai.js +305 -31
- package/plugins/vite/dependencies.js +5 -0
- package/src/engine/api.ts +3 -0
- package/src/engine/engine_addressables.ts +4 -1
- package/src/engine/engine_animation.ts +47 -9
- package/src/engine/engine_components.ts +36 -7
- package/src/engine/engine_context.ts +11 -2
- package/src/engine/engine_gameobject.ts +5 -0
- package/src/engine/engine_init.ts +2 -0
- package/src/engine/engine_input.ts +2 -1
- package/src/engine/engine_materialpropertyblock.ts +1 -20
- package/src/engine/engine_networking.ts +46 -23
- package/src/engine/engine_networking_instantiate.ts +160 -18
- package/src/engine/engine_networking_prefabs.ts +80 -0
- package/src/engine/postprocessing/api.ts +2 -0
- package/src/engine/postprocessing/index.ts +2 -0
- package/src/engine/postprocessing/postprocessing.ts +322 -0
- package/src/engine/postprocessing/types.ts +43 -0
- package/src/engine/webcomponents/WebXRButtons.ts +21 -4
- package/src/engine/webcomponents/icons.ts +5 -3
- package/src/engine/xr/NeedleXRSession.ts +50 -15
- package/src/engine/xr/init.ts +56 -0
- package/src/engine-components/AnimationUtils.ts +7 -17
- package/src/engine-components/AnimatorController.ts +288 -18
- package/src/engine-components/OrbitControls.ts +5 -1
- package/src/engine-components/SeeThrough.ts +0 -116
- package/src/engine-components/SyncedRoom.ts +28 -9
- package/src/engine-components/SyncedTransform.ts +5 -5
- package/src/engine-components/Voip.ts +129 -2
- package/src/engine-components/api.ts +1 -0
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +16 -24
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +9 -16
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +2 -1
- package/src/engine-components/postprocessing/Volume.ts +72 -163
- package/src/engine-components/postprocessing/index.ts +1 -0
- package/src/engine-components/postprocessing/utils.ts +2 -0
- package/src/engine-components/ui/Canvas.ts +2 -2
- package/src/engine-components/ui/Graphic.ts +7 -3
- package/src/engine-components/ui/Text.ts +170 -52
- package/src/engine-components/ui/index.ts +2 -1
- package/src/engine-components-experimental/networking/PlayerSync.ts +64 -11
- package/dist/needle-engine.bundle-B3ywqx5o.min.js +0 -1654
- package/dist/needle-engine.bundle-CzOPcOui.umd.cjs +0 -1654
|
@@ -0,0 +1,1656 @@
|
|
|
1
|
+
import{Vector2 as K,Vector3 as b,Vector4 as ye,Quaternion as N,Box3 as Nt,ShadowMaterial as Eb,Euler as ht,PlaneGeometry as Pn,WebGLRenderer as _r,PerspectiveCamera as de,OrthographicCamera as Ad,Scene as Ti,Mesh as H,Texture as Se,Uniform$1 as Ki,Color as oe,ShaderMaterial as Xn,MeshStandardMaterial as yt,Box3Helper as lC,GridHelper as Rb,Object3D as M,Material as we,Matrix3 as Tb,Matrix4 as J,Layers as xs,PropertyBinding as La,AnimationClip as Ai,KeyframeTrack as cC,FileLoader as Ab,BufferGeometry as Ji,TextureLoader as vr,MeshBasicMaterial as Ce,DoubleSide as Ii,Group as Mo,CylinderGeometry as Ib,SphereGeometry as Id,BoxGeometry as Da,SpriteMaterial as hC,Sprite as dC,Shape as uC,ExtrudeGeometry as pC,Ray as Eo,CubeUVReflectionMapping as Ro,LinearSRGBColorSpace as To,ShaderChunk as Jt,Sphere as Ld,DataTexture as Fm,RGBAFormat as Dd,EquirectangularReflectionMapping as Ao,SRGBColorSpace as Io,Clock as mC,NeutralToneMapping as ja,AgXToneMapping as jd,ACESFilmicToneMapping as Bd,NoToneMapping as Fd,PCFSoftShadowMap$1 as gC,BasicNodeLibrary as fC,WebGLRenderTarget as Qn,DepthTexture as Lb,NearestFilter as Ud,AxesHelper as Li,MathUtils as Lo,Fog as Db,DirectionalLight as Um,PointLight as zm,EdgesGeometry as yC,LineSegments as Nm,LineBasicMaterial as zd,Line as Ba,BufferAttribute as tt,Raycaster as Nd,ArrayCamera as bC,Plane as wr,SkinnedMesh as Ss,InterleavedBufferAttribute as jb,Skeleton as _C,Bone as vC,WebGLCubeRenderTarget as wC,CubeCamera as xC,LoopRepeat as SC,LoopOnce as Wm,AnimationMixer as Vm,CompressedTexture as CC,FrontSide as Cs,Camera as PC,Frustum as Bb,AudioListener as OC,PositionalAudio as kC,AudioLoader as $m,VectorKeyframeTrack as MC,QuaternionKeyframeTrack as EC,Audio as RC,BackSide as Wd,PMREMGenerator$1 as TC,EquirectangularRefractionMapping as Fb,CubeTexture as Ub,CompressedCubeTexture as AC,EventDispatcher as Hm,MeshDepthMaterial as IC,CustomBlending as LC,MaxEquation as DC,AlwaysStencilFunc as jC,GreaterEqualStencilFunc as BC,NotEqualStencilFunc as FC,GreaterStencilFunc as UC,LessEqualStencilFunc as zC,EqualStencilFunc as NC,LessStencilFunc as WC,NeverStencilFunc as zb,InvertStencilOp as VC,DecrementWrapStencilOp as $C,IncrementWrapStencilOp as HC,DecrementStencilOp as GC,IncrementStencilOp as qC,ReplaceStencilOp as XC,ZeroStencilOp as QC,KeepStencilOp as YC,AmbientLight as ZC,HemisphereLight as KC,Loader as JC,GLSL3 as eP,AlwaysDepth as tP,GreaterEqualDepth as iP,GreaterDepth as nP,LessEqualDepth as oP,LessDepth as sP,NotEqualDepth as rP,EqualDepth as aP,RawShaderMaterial as Nb,BatchedMesh as Wb,LinearFilter as Vd,UnsignedByteType as lP,MeshPhysicalMaterial as Vb,RingGeometry as cP,Line3 as hP,AdditiveBlending as $b,BoxHelper as dP,SpotLight as uP,DirectionalLightHelper as pP,CameraHelper as mP,LOD as gP,Triangle as fP,NormalBlending as yP,ReinhardToneMapping as Gm,LinearToneMapping as qm,VideoTexture as bP,CatmullRomCurve3 as _P,MirroredRepeatWrapping as Hb,ShaderLib as $d,UniformsUtils as Gb,MeshNormalMaterial as vP,AudioContext as wP,HalfFloatType as Xm,Source as xP}from"./three.min.js";import{createLoaders as Qm,LODsManager as xr,NEEDLE_progressive as He,getRaycastMesh as qb,setKTX2TranscoderLocation as SP,setDracoDecoderLocation as CP,addDracoAndKTX2Loaders as PP,configureLoader as OP}from"./gltf-progressive-BryRjllq.min.js";import{GroundedSkybox as Fa,Font as kP,TextGeometry as MP,FontLoader as EP,GLTFLoader as Do,EXRLoader as Ym,RGBELoader as Xb,Stats as RP,nodeFrame as Qb,TransformControlsGizmo as Yb,OrbitControls as TP,PositionalAudioHelper as AP,HorizontalBlurShader as IP,VerticalBlurShader as LP,GLTFExporter as Zb,strToU8 as Kb,zipSync as DP,XRControllerModelFactory as jP,XRHandMeshModel as BP,Line2 as FP,LineGeometry as UP,LineMaterial as zP,TransformControls as NP,InteractiveGroup as WP,HTMLMesh as VP,VertexNormalsHelper as $P,OBJLoader as Zm,FBXLoader as Jb,mergeVertices as HP}from"./three-examples.min.js";import{_md5 as e_,md5 as GP,v5 as Km,ByteBuffer as qP,fetchProfile as XP,MotionController as QP,SIZE_PREFIX_LENGTH as t_,Builder as Jm,createNoise4D as YP,Matrix4 as eg,BatchedParticleRenderer as ZP,ParticleSystem as KP,RenderMode as jo,ConstantColor as JP,Vector4 as eO,ConstantValue as tO,TrailParticle as i_,WorkerBase as iO,MeshBVH as nO}from"./vendor-HRlxIBga.min.js";import{__webpack_exports__default as Oe,__webpack_exports__Text as n_,__webpack_exports__update as oO,__webpack_exports__Block as o_,SimpleStateBehavior as sO,__webpack_exports__Inline as tg,__webpack_exports__FontLibrary as s_,ThreeMeshUI as r_}from"./three-mesh-ui-n3JU4M2W.min.js";import{EffectAttribute as rO}from"./postprocessing-B_9sKVU7.min.js";const a_=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var ue=(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))(ue||{});class pe{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&&(a_&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(a_&&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 ig=new Map;function Di(o=globalThis.location?.hostname){if(ig.has(o))return ig.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return ig.set(o,e),e===!0}function l_(){return window.location.hostname.includes("glitch.me")}const c_=()=>o=>o;function aO(o){return c_()(o)}function lO(){return!!w("debug")}class ji{_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 Sr=!1;const ng=new Array;typeof window<"u"&&setTimeout(()=>{if(Sr){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 ng){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.
|
|
2
|
+
Append any of these parameters to the URL to enable specific debug options.
|
|
3
|
+
Example: ${i} will show an onscreen console window.`);const n=Sr===!0?"":` (containing "${Sr}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof Sr=="string"&&!s.toLowerCase().includes(Sr.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function _c(){return new URLSearchParams(globalThis.location?.search)}function w(o){Sr&&!ng.includes(o)&&ng.push(o);const e=_c();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}Sr=w("help");function cO(o,e){const t=_c();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function Ua(o,e,t=!0){const i=_c();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?h_(o,i):sg(o,i)}function og(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function h_(o,e,t){window.history.pushState(t,o,"?"+e.toString())}function sg(o,e,t){window.history.replaceState(t,o,"?"+e.toString())}function hO(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 dO(o,e){return Math.floor(Math.random()*(e-o+1))+o}const d_=["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"],u_=["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 p_(){const o=d_[Math.floor(Math.random()*d_.length)],e=u_[Math.floor(Math.random()*u_.length)];return o+"_"+e}function m_(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function za(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=za(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=za(o,s,t,i);if(r)return r}}}function vc(o,e){if(o!=null&&typeof o=="object"){let t;Array.isArray(o)?t=[]:(t=Object.create(o),Object.assign(t,o));for(const i of Object.keys(o)){const n=o[i];e&&!e(o,i,n)?t[i]=n:n?.clone!==void 0&&typeof n.clone=="function"?t[i]=n.clone():t[i]=vc(n,e)}return t}return o}function Bo(o){return new Promise((e,t)=>{setTimeout(e,o)})}function wc(o,e){if(o<=0)return Promise.resolve();if(e||(e=pe.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 Hd=w("debugresolveurl"),g_="rel:";function uO(o,e){return Fo(o,e)}function Fo(o,e){if(e===void 0)return Hd&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return Hd&&console.warn("getPath: uri is absolute, returning uri",e),e;if(o===void 0)return Hd&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(g_)&&(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 Hd&&console.log("source:",o,`changed uri
|
|
4
|
+
from`,e,`
|
|
5
|
+
to `,n,`
|
|
6
|
+
basePath: `+i),n}return e}function f_(o){if(o)return o=o.trim(),o=o.split("?")[0]?.split("#")[0],o}class pO{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 fs{_watches=[];constructor(e,t){if(Array.isArray(t))for(const i of t)this._watches.push(new fs(e,i));else this._watches.push(new pO(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 Gd(o,e){if(!o[Na])if(o instanceof K)o[Na]=new fs(o,["x","y"]);else if(o instanceof b)o[Na]=new fs(o,["x","y","z"]);else if(o instanceof ye||o instanceof N)o[Na]=new fs(o,["x","y","z","w"]);else return!1;return o[Na].subscribeWrite(e),!0}function rg(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;const te=window.navigator.userAgent,$e=/Windows|MacOS|Mac OS/.test(te),hi=/Windows NT/.test(te)&&/Edg/.test(te)&&!/Win64/.test(te);return e=$e&&!hi&&!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 f;function g(){if(f!==void 0)return f;if(O()||a())return f=!1;const te=navigator.userAgent.toLowerCase();return navigator.userAgentData?f=navigator.userAgentData.platform==="macOS":f=te.includes("mac os x")||te.includes("macintosh")}o.isMacOS=g;let y;function _(){return y!==void 0?y:y=a()&&"xr"in navigator&&G()}o.isVisionOS=_;let v;const C=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function O(){return v!==void 0?v:v=C.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}o.isiOS=O;let k;function j(){return k!==void 0||(k=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),k}o.isSafari=j;let L;function V(){return L!==void 0?L:L=navigator.userAgent.includes("OculusBrowser")}o.isQuest=V;let W;function G(){return W!==void 0||(W=document.createElement("a").relList.supports("ar")),W}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 R;function $(){if(R!==void 0)return R;const te=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(te&&(R=te[1].replace("_",".")),!R){const $e=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);$e&&(R=$e[1])}return R||(R=null),R}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 re;function ge(){if(re!==void 0)return re;const te=navigator.userAgent.match(/Version\/(\d+\.\d+)/);return te&&j()?re=te[1]:re=null,re}o.getSafariVersion=ge})(I||(I={}));function mO(){return I.isDesktop()}function gO(){return I.isMobileDevice()}function fO(){return I.isiPad()}function yO(){return I.isiPad()}function bO(){return I.isAndroidDevice()}function _O(){return I.isMozillaXR()}function vO(){return I.isMacOS()}function wO(){return I.isiOS()}function xO(){return I.isSafari()}function SO(){return I.isQuest()}async function CO(){return I.microphonePermissionsGranted()}const Ps=new WeakMap;function ag(o,e,t){if(!Ps.get(o)){const n=new MutationObserver(s=>{PO(o,s)});Ps.set(o,{observer:n,attributeChangedListeners:new Map}),n.observe(o,{attributes:!0})}const i=Ps.get(o).attributeChangedListeners;return i.has(e)||i.set(e,[]),i.get(e).push(t),()=>{lg(o,e,t)}}function lg(o,e,t){if(!Ps.get(o))return;const i=Ps.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),Ps.get(o)?.observer.disconnect(),Ps.delete(o)))}function PO(o,e){const t=Ps.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 cg{reason;constructor(e){this.reason=e}}async function hg(o){const e=await Promise.allSettled(o).catch(n=>[new cg(n.message)]);let t=!1;const i=e.map(n=>"value"in n?n.value:(t=!0,new cg(n.reason)));return{anyFailed:t,results:i}}const OO=w("debugdebug");let dg=!1;(w("noerrors")||w("nooverlaymessages"))&&(dg=!0);const ug="needle_engine_global_error_container";var Bi=(o=>(o[o.Log=0]="Log",o[o.Warn=1]="Warn",o[o.Error=2]="Error",o))(Bi||{});function y_(){return v_}const pg=new Array;function kO(o){pg.push(o)}let mg=!1;function MO(...o){if(!mg){mg=!0;try{for(let e=0;e<pg.length;e++)pg[e](...o)}catch(e){console.error(e)}mg=!1}}const b_=console.error,EO=function(...o){b_.apply(console,o),AO(o),Cr(2,o,{}),TO(...o)};function __(o){dg=!o,o?console.error=EO:console.error=b_}function RO(o){return __(o)}let v_=0;function TO(...o){v_+=1,MO(...o)}function AO(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 w_=new Set;function Cr(o,e,t={},i,n){if(dg)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(w_.has(a))return;w_.add(a)}const s=pe.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||IO(o,r,e,t)}}const Wa=new Map,x_=.2;function IO(o,e,t,i={}){if(t==null)return;const n=jO(e);if(n.childElementCount>=20){const c=n.lastElementChild;C_(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=BO(o,t);n.prepend(r);const a=()=>{Wa.delete(s),C_(r)};let l=setTimeout(a,Math.max(x_,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(x_,h.duration)*1e3))},removeFunction:a})}function LO(){OO&&console.log("Clearing messages");for(const o of Wa.values())o?.removeFunction.call(o);Wa.clear()}const DO=`
|
|
7
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
8
|
+
|
|
9
|
+
div[data-needle_engine_debug_overlay] {
|
|
10
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
11
|
+
font-weight: 400;
|
|
12
|
+
font-size: 16px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div[data-needle_engine_debug_overlay] strong {
|
|
16
|
+
font-weight: 700;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
div[data-needle_engine_debug_overlay] a {
|
|
20
|
+
color: white;
|
|
21
|
+
text-decoration: none;
|
|
22
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
div[data-needle_engine_debug_overlay] a:hover {
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
border: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
div[data-needle_engine_debug_overlay] .log strong {
|
|
31
|
+
color: rgba(200,200,200,.9);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
div[data-needle_engine_debug_overlay] .warn strong {
|
|
35
|
+
color: rgba(255,255,230, 1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
div[data-needle_engine_debug_overlay] .error strong {
|
|
39
|
+
color: rgba(255,100,120, 1);
|
|
40
|
+
}
|
|
41
|
+
`;function jO(o){globalThis[ug]||(globalThis[ug]=new Map);const e=globalThis[ug];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=`
|
|
42
|
+
position: absolute;
|
|
43
|
+
top: 0;
|
|
44
|
+
right: 5px;
|
|
45
|
+
padding-top: env(safe-area-inset-top, 0px);
|
|
46
|
+
max-width: 70%;
|
|
47
|
+
max-height: calc(100% - 105px);
|
|
48
|
+
z-index: 100000;
|
|
49
|
+
pointer-events: scroll;
|
|
50
|
+
display: flex;
|
|
51
|
+
align-items: end;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
color: white;
|
|
54
|
+
overflow: auto;
|
|
55
|
+
word-break: break-word;
|
|
56
|
+
`,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=DO,t.appendChild(n),t}}const S_=Symbol("logtype"),qd=new Map;function C_(o){o.remove();const e=o[S_],t=qd.get(e)??[];t.push(o),qd.set(e,t)}function BO(o,e){if(qd.has(o)){const i=qd.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[S_]=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 FO=w("nodevlogs");let gg,fg;function A(){if(FO)return!1;if(gg!==void 0)return gg;if(fg!==void 0)return fg;let o=Di();return o||(o=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),fg=o,o}function UO(o){gg=o}class zO{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 NO){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 NO=["x","y","z","w"],D=new zO;class P_{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 Xd{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 P_(this.alpha(this.minCutOff)),this.dx=new P_(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 yg{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new Xd(e,t,i,n),this.y=new Xd(e,t,i,n),this.z=new Xd(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 Qd="needle:cameraController";function O_(o){return o[Qd]}function bg(o,e,t){t?o[Qd]=e:o[Qd]===e&&(o[Qd]=null)}const _g="needle:autofit";function k_(o){return o[_g]===void 0?!0:o[_g]!==!1}function Yd(o,e){o[_g]=e}let On;const WO={x:0,y:0,width:0,height:0},VO=w("debugfocusrect");function $O(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()),On=n.domElement.getBoundingClientRect();const s=WO;s.x=o.x,s.y=o.y,s.width=o.width,s.height=o.height,s.x-=On.x,s.y-=On.y;const r=On.width,a=On.height,l=i.view,c=e.zoom;let h=l?.offsetX||0,d=l?.offsetY||0,p=On.width,m=On.height;p/=c,m/=c,h=p*(c-1)*.5,d=m*(c-1)*.5;const f=s.x+s.width*.5,g=s.y+s.height*.5,y=On.width*.5,_=On.height*.5,v=f-y,C=g-_;h-=v/c,d-=C/c,e.offsetX!==void 0&&(h+=e.offsetX*(On.width*.5)),e.offsetY!==void 0&&(d-=e.offsetY*(On.height*.5));const O=l?.offsetX||h,k=l?.offsetY||d;h=D.lerp(O,h,t),d=D.lerp(k,d,t);const j=l?.width||r,L=l?.height||a;p=D.lerp(j,p,t),m=D.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 M_(o,e,t){const i=o.length(),n=e.length(),s=D.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const vg=new N,E_=new N().setFromAxisAngle(new b(0,1,0),Math.PI);function HO(o,e){o.lookAt(e),o.quaternion.multiply(E_)}function xc(o,e,t=!0,i=!1){if(o===e)return;vg.copy(o.quaternion);const n=ee(e),s=ee(o);if(i){if(kn(o,_e(e)),t){const r=s.y,a=s.sub(L_(o));a.y=r,o.lookAt(a),o.quaternion.multiply(E_)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vg);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vg)}function GO(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 qO=new ji(()=>new b,100);function F(o,e,t){const i=qO.get();return i.set(0,0,0),o instanceof b?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 XO=new ji(()=>new oe,30);function R_(o){const e=XO.get();return o?e.copy(o):e.set(0,0,0),e}const QO=new ji(()=>new N,100);function di(o,e,t,i){const n=QO.get();return n.identity(),o instanceof N?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 wg=new ji(()=>new b,100),T_=Symbol("lastMatrixWorldUpdateKey");function ee(o,e=null,t=!0){const i=e??wg.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[T_]!==Date.now()&&(o[T_]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function bt(o,e){if(!o)return o;const t=wg.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 Pr(o,e,t,i){const n=wg.get();return n.set(e,t,i),bt(o,n),o}const Zd=new ji(()=>new N,100),Or=new N,xg=new N;function _e(o,e=null){if(!o)return Zd.get().identity();const t=e??Zd.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function kn(o,e){if(!o)return;e!==Or&&Or.copy(e);const t=Or;o?.parent?.getWorldQuaternion(xg),xg.invert();const i=xg.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Sg(o,e,t,i,n){Or.set(e,t,i,n),kn(o,Or)}const YO=new ji(()=>new b,100),ZO=new b;function Ge(o,e=null){return e||(e=YO.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=ZO;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const KO=new b,A_=new N;function JO(o){return _e(o,A_),KO.set(0,0,1).applyQuaternion(A_)}const ek=new ji(()=>new b,100),I_=new N;function L_(o,e){return e||(e=ek.get().set(0,0,1)),_e(o,I_),e.applyQuaternion(I_)}const D_=new ht,j_=new ht,tk=new b;function Cg(o){const e=Zd.get();return o.getWorldQuaternion(e),j_.setFromQuaternion(e),j_}function Pg(o,e){const t=Zd.get();kn(o,t.setFromEuler(e))}function Kd(o){const e=Cg(o),t=tk;return t.set(e.x,e.y,e.z),t.x=D.toDegrees(t.x),t.y=D.toDegrees(t.y),t.z=D.toDegrees(t.z),t}function B_(o,e){Sc(o,e.x,e.y,e.z,!0)}function Sc(o,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),D_.set(e,t,i),Or.setFromEuler(D_),kn(o,Or)}function Jd(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 ik(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 F_(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 Am extends Xn{static vertex=`
|
|
57
|
+
varying vec2 vUv;
|
|
58
|
+
void main(){
|
|
59
|
+
vUv = uv;
|
|
60
|
+
gl_Position = vec4(position.xy, 0., 1.0);
|
|
61
|
+
}`;constructor(){super({vertexShader:Am.vertex,uniforms:{map:new Ki(null),flipY:new Ki(!0),writeDepth:new Ki(!1),depthTexture:new Ki(null)},fragmentShader:`
|
|
62
|
+
uniform sampler2D map;
|
|
63
|
+
uniform bool flipY;
|
|
64
|
+
uniform bool writeDepth;
|
|
65
|
+
uniform sampler2D depthTexture;
|
|
66
|
+
|
|
67
|
+
varying vec2 vUv;
|
|
68
|
+
|
|
69
|
+
void main(){
|
|
70
|
+
vec2 uv = vUv;
|
|
71
|
+
if (flipY) uv.y = 1.0 - uv.y;
|
|
72
|
+
gl_FragColor = texture2D(map, uv);
|
|
73
|
+
|
|
74
|
+
if (writeDepth) {
|
|
75
|
+
float depth = texture2D(depthTexture, uv).r;
|
|
76
|
+
gl_FragDepth = depth;
|
|
77
|
+
|
|
78
|
+
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
|
|
79
|
+
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
|
|
80
|
+
}
|
|
81
|
+
}`})}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 gr{static planeGeometry=new Pn(2,2,1,1);static renderer=new _r({antialias:!1,alpha:!0});static perspectiveCam=new de;static orthographicCam=new Ad;static scene=new Ti;static blitMaterial=new Am;static mesh=new H(gr.planeGeometry,gr.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=Am.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 Ki(!0),s.uniforms.depthTexture.value=a):(s.uniforms.writeDepth=new Ki(!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 oe(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=U_(e));const i=e.image;if(ok(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 U_(o){return gr.copyTexture(o)}function nk(o,e=!1){return gr.textureToCanvas(o,e)}function ok(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 sk(o){const e=o.type;return e==="Mesh"||e==="SkinnedMesh"}function Og(o,e){e?o["needle:rendercustomshadow"]=!0:o["needle:rendercustomshadow"]=!1}function z_(o){return!!(o&&(o["needle:rendercustomshadow"]===!0||o["needle:rendercustomshadow"]==null))}function ui(o,e=void 0,t=void 0,i=void 0){const n=i||new Nt;n.makeEmpty();const s=[];function r(l){let c=!0;if(l.visible&&k_(l)!==!1&&!(l.type==="TransformControlsGizmo"||l.type==="TransformControlsPlane")){if(l instanceof lC&&(c=!1),l instanceof Rb&&(c=!1),l instanceof Fa&&(c=!1),l.isGizmo===!0&&(c=!1),l.material instanceof Eb&&(c=!1),sk(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 N_(o,e,t){const i=ui([o],t?.ignore),n=new b;i.getSize(n);const s=new b;i.getCenter(s);const r=new b;e.getSize(r);const a=new b;e.getCenter(a);const l=new b;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,Ge(o).multiplyScalar(c)),t?.position!==!1){const d=new b;i.getCenter(d),d.y=i.min.y;const p=new b;e.getCenter(p),p.y=e.min.y;const m=p.clone().sub(d);h&&m.multiplyScalar(c),bt(o,ee(o).add(m))}return{boundsBefore:i,scale:l}}function W_(o,e){const t=ui([o]),i=new b;t.getCenter(i),i.y=t.min.y;const n=e.clone().sub(i),s=ee(o);return bt(o,s.add(n)),{offset:n,bounds:t}}function kg(o,e,t,i){if(Array.isArray(e)){let r=!0;for(let a=0;a<e.length;a++)kg(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 yt;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 eu=!1;kO((...o)=>{A()&&pe.Current?.isInXR&&($a(!0),V_("error",...o))});function $a(o){if(o){if(eu)return;eu=!0,ak()}else{if(!eu)return;eu=!1,lk()}}const Cc={log:void 0,warn:void 0,error:void 0};class rk{familyName="needle-xr";root=null;context=null;defaultFontSize=.06;constructor(){this.ensureFont()}onEnable(){this.context=pe.Current||pe.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 M;userForwardViewPoint=new b;oneEuroFilter=new yg(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),xc(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 M&&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 kr=null;function ak(){kr||(kr=new rk),kr.onEnable();for(const o in Cc){Cc[o]=console[o];let e=!1;console[o]=function(){if(Cc[o]?.apply(console,arguments),!e)try{e=!0,V_(o,...arguments)}finally{e=!1}}}}function lk(){kr?.onDisable();for(const o in Cc)console[o]=Cc[o]}const Pc=new Map;function V_(o,...e){try{switch(Pc.clear(),o){case"log":kr?.addLog("log",t());break;case"warn":kr?.addLog("warn",t());break;case"error":kr?.addLog("error",t());break}}catch(s){console.error("Error in spatial console",s)}finally{Pc.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 K)return`(${i(s.x)}, ${i(s.y)})`;if(s instanceof b)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 N)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof we||s instanceof Se)return s.name;if(s instanceof Tb)return`[${s.elements.join(", ")}]`;if(s instanceof J)return`[${s.elements.join(", ")}]`;if(s instanceof xs)return s.mask.toString();if(typeof s=="object"){if(Pc.has(s))return"*";let a=`{
|
|
82
|
+
`;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(Pc.has(p)){c+="";continue}Pc.set(p,!0),c+=d+":"+i(p,r+1),h<l.length-1&&(c+=", "),c.length>=60&&(c+=`
|
|
83
|
+
`,c+=n(r),a+=c,c="")}return a+=c,a+=`
|
|
84
|
+
}`,a}return s}function n(s){let r="";for(let a=0;a<s;a++)r+=" ";return r}}function ke(o,e){Cr(e?.type??Bi.Log,o,e)}function be(o,e){ke(o,{...e,type:Bi.Warn})}function Oc(o,e){ke(o,{...e,type:Bi.Error})}let pi,Mr=null,Yn=null,kc=!1,$_=null;const H_="terminal",ck=w("console");ck&&Mg();const hk=Symbol("consoleParent");function Mg(){if(pi){pi.showSwitch();return}gk()}function G_(){pi&&(pi.hide(),pi.hideSwitch())}function dk(){$_||($_=setInterval(uk,500))}let q_=0;function uk(){const o=y_(),e=o!==q_;q_=o,e&&pk()}function pk(){Mg(),Yn&&(Yn.setAttribute("error","true"),Yn.innerText="\u{1F92C}")}function mk(){Yn&&(Yn.removeAttribute("error"),Yn.innerText=H_)}function gk(o=!1){if(pi!==void 0||kc)return;kc=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),kc=!1,pi=null;return}kc=!1,dk(),pi=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&pi.addPlugin(fk()),pi.addPlugin(vk()),pi.addPlugin(wk()),Mr=Ak(),Mr&&(Mr[hk]=Mr.parentElement,Mr.style.position="absolute",Mr.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),pi.setSwitchPosition(20,30),Yn=Tk(),Yn){Yn.innerText=H_,Yn.addEventListener("click",mk);const i=document.createElement("style"),n=40;i.innerHTML=`
|
|
85
|
+
#__vconsole .vc-switch {
|
|
86
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
87
|
+
border-radius: 50%;
|
|
88
|
+
width: ${n}px;
|
|
89
|
+
height: ${n}px;
|
|
90
|
+
padding: 0;
|
|
91
|
+
line-height: ${n}px;
|
|
92
|
+
font-size: ${n*.4}px;
|
|
93
|
+
text-align: center;
|
|
94
|
+
background: #ffffff5c;
|
|
95
|
+
backdrop-filter: blur(16px);
|
|
96
|
+
-webkit-backdrop-filter: blur(16px);
|
|
97
|
+
user-select: none;
|
|
98
|
+
pointer-events: auto;
|
|
99
|
+
transition: transform .2s ease-in-out;
|
|
100
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
101
|
+
|
|
102
|
+
font-family: 'Material Symbols Outlined';
|
|
103
|
+
color: black;
|
|
104
|
+
font-size: 2.3em;
|
|
105
|
+
font-weight: 100;
|
|
106
|
+
}
|
|
107
|
+
#__vconsole .vc-switch:hover {
|
|
108
|
+
cursor: pointer;
|
|
109
|
+
transform: scale(1.1);
|
|
110
|
+
transition: transform .1s ease-in-out, background .1s linear;
|
|
111
|
+
background: rgba(245, 245, 245, .8);
|
|
112
|
+
outline: rgba(0, 0, 0, .05) 1px solid;
|
|
113
|
+
}
|
|
114
|
+
#__vconsole .vc-switch[error] {
|
|
115
|
+
background: rgba(255,0,0,.2);
|
|
116
|
+
animation: vconsole-notify 1s ease-in-out;
|
|
117
|
+
line-height: 35px;
|
|
118
|
+
}
|
|
119
|
+
@keyframes vconsole-notify {
|
|
120
|
+
from {
|
|
121
|
+
transform: scale(1, 1);
|
|
122
|
+
}
|
|
123
|
+
10% {
|
|
124
|
+
transform: scale(1.3, 1.3);
|
|
125
|
+
}
|
|
126
|
+
70% {
|
|
127
|
+
transform: scale(1.4, 1.4);
|
|
128
|
+
}
|
|
129
|
+
to {
|
|
130
|
+
transform: scale(1, 1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
#__vconsole .vc-panel {
|
|
134
|
+
font-family: monospace;
|
|
135
|
+
font-size: 11px;
|
|
136
|
+
}
|
|
137
|
+
#__vconsole .vc-plugin-box.vc-actived {
|
|
138
|
+
height: 100%;
|
|
139
|
+
}
|
|
140
|
+
#__vconsole .vc-mask {
|
|
141
|
+
overflow: hidden;
|
|
142
|
+
}
|
|
143
|
+
`,Mr?.prepend(i),o===!0&&y_()<=0&&G_(),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.":"")),kc=!1,pi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function fk(){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"),pi?.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 Eg="padding: 10px; font-family: monospace;",X_="margin-bottom: 10px;",Er="margin-bottom: 10px; margin-top: 15px;",yk="width: 100%; border-collapse: collapse; border: 1px solid rgba(0,0,0,0.1); table-layout: fixed;",Q_="border: 1px solid rgba(0,0,0,0.1); padding: 5px;",bk=Q_,_k=Q_+" 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='${yk}'>`;t+="<tbody>";for(const i of o){const n=typeof i.value=="boolean"?i.value?"\u2705":"\u274C":i.value;t+=`<tr><td style='${bk}'>${i.label}</td><td style='${_k}'>${n}</td></tr>`}return t+="</tbody></table>",t}function Y_(){try{if(document.createElement("canvas").getContext("webgl2"))return"\u2705"}catch{}return"\u274C"}function vk(){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='${Eg}'>`;const i=Rk();t+=`<h3 style='${X_}'>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='${Eg} margin-top: 20px;'>`,t+=`<h3 style='${X_}'>User Agent Info</h3>`;const l=[{label:"User Agent",value:navigator.userAgent},{label:"Platform",value:navigator.platform},{label:"App Version",value:navigator.appVersion},{label:"User Agent Data",value:navigator.userAgentData?`Platform: ${navigator.userAgentData.platform}, Mobile: ${navigator.userAgentData.mobile}`:"Not supported"},{label:"WebXR",value:"xr"in navigator?"\u2705":"\u274C"},{label:"WebGPU",value:"gpu"in navigator?"\u2705":"\u274C"},{label:"WebGL 2",value:Y_()}];t+=Zn(l,!1),t+="</div>",e(t)}),o}function wk(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("graphics-info","\u{1F3A8} Graphics Info");return o.on("renderTab",async function(e){let t=`<div style='${Eg}'>`;const i=xk();i.length>0&&(t+=`<h3 style='${Er}'>General GPU Info</h3>`,t+=Zn(i,!1));const n=Ck();n.length>0&&(t+=`<h3 style='${Er}'>WebGL</h3>`,t+=Zn(n,!1));const s=Pk();s.length>0&&(t+=`<h3 style='${Er}'>WebGL 2 Features</h3>`,t+=Zn(s,!1));const r=Ok();r.length>0&&(t+=`<h3 style='${Er}'>WebGL Limits</h3>`,t+=Zn(r,!1));const a=kk();a.length>0&&(t+=`<h3 style='${Er}'>Texture Formats</h3>`,t+=Zn(a,!1));const l=await Mk();if(l.length>0&&(t+=`<h3 style='${Er}'>WebGPU</h3>`,t+=Zn(l,!1)),I.isSafari()){const c=Ek();c.length>0&&(t+=`<h3 style='${Er}'>Safari GPU Info</h3>`,t+=Zn(c,!1))}t+="</div>",e(t)}),o}function xk(){const o=[],e=window.devicePixelRatio;o.push({label:"Device Pixel Ratio",value:e.toString()}),o.push({label:"Width (px)",value:(window.innerWidth*e).toString()}),o.push({label:"Height (px)",value:(window.innerHeight*e).toString()});const t=I.isMobileDevice()?150:96,i=screen.width/t,n=screen.height/t,s=i*2.54,r=n*2.54;o.push({label:"Estimated Width (cm)",value:s.toFixed(1)}),o.push({label:"Estimated Height (cm)",value:r.toFixed(1)});const a=Z_();if(a){o.push({label:"GPU",value:a.renderer}),o.push({label:"Driver",value:a.vendor}),o.push({label:"ANGLE",value:a.angle||"Not detected"});const l=Sk(a.renderer);l&&(l.manufacturer&&o.push({label:"Manufacturer",value:l.manufacturer}),l.cardVersion&&o.push({label:"Card Version",value:l.cardVersion}),l.brand&&o.push({label:"Brand",value:l.brand}),o.push({label:"Integrated",value:l.integrated?"Yes":"No"}),l.layer&&o.push({label:"WebGL Layer",value:l.layer}))}return o}function Sk(o){if(!o)return null;const e=(l,c)=>{const h=c.match(l);return h&&h[0]},t=e(/(ANGLE)/g,o)||void 0,i=e(/((NVIDIA|AMD|Intel)[^\d]*[^\s]+)/,o)||o,n=i.split(" ");n.shift();const s=e(/(NVIDIA|AMD|Intel)/g,i)||void 0,r=n.length>0?n.pop():void 0,a=n.length>0?n.join(" "):void 0;return{manufacturer:s,cardVersion:r,brand:a,integrated:s==="Intel",layer:t,card:i}}function Ck(){const o=[],e=Z_();return e&&(o.push({label:"\u{1F4CA} WebGL Version",value:e.version}),o.push({label:"\u{1F3AE} WebGL 2 Available",value:Y_()})),o}function Pk(){const o=[];try{const e=document.createElement("canvas").getContext("webgl2");if(!e)return o;o.push({label:"Float Color Buffer",value:e.getExtension("EXT_color_buffer_float")?"\u2705":"\u274C"}),o.push({label:"Anisotropic Filtering",value:e.getExtension("EXT_texture_filter_anisotropic")?"\u2705":"\u274C"}),o.push({label:"Float Texture Linear",value:e.getExtension("OES_texture_float_linear")?"\u2705":"\u274C"}),o.push({label:"S3TC Compression",value:e.getExtension("WEBGL_compressed_texture_s3tc")?"\u2705":"\u274C"}),o.push({label:"ETC Compression",value:e.getExtension("WEBGL_compressed_texture_etc")?"\u2705":"\u274C"}),o.push({label:"PVRTC Compression",value:e.getExtension("WEBGL_compressed_texture_pvrtc")?"\u2705":"\u274C"}),o.push({label:"ASTC Compression",value:e.getExtension("WEBGL_compressed_texture_astc")?"\u2705":"\u274C"})}catch{}return o}function Ok(){const o=[];try{const e=document.createElement("canvas"),t=e.getContext("webgl2")||e.getContext("webgl");if(!t)return o;const i=t instanceof WebGL2RenderingContext;o.push({label:"\u{1F4CF} Max Texture Size",value:t.getParameter(t.MAX_TEXTURE_SIZE).toString()}),o.push({label:"\u{1F3A8} Max Renderbuffer Size",value:t.getParameter(t.MAX_RENDERBUFFER_SIZE).toString()}),o.push({label:"\u{1F517} Max Vertex Attribs",value:t.getParameter(t.MAX_VERTEX_ATTRIBS).toString()}),o.push({label:"\u{1F3AF} Max Texture Units",value:t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS).toString()}),i&&(o.push({label:"\u26A1 Max Samples",value:t.getParameter(t.MAX_SAMPLES).toString()}),o.push({label:"\u{1F504} Max Uniform Buffer Bindings",value:t.getParameter(t.MAX_UNIFORM_BUFFER_BINDINGS).toString()}),o.push({label:"\u{1F4D0} Max 3D Texture Size",value:t.getParameter(t.MAX_3D_TEXTURE_SIZE).toString()}))}catch{}return o}function kk(){const o=[];try{document.createElement("canvas").getContext("webgl")&&(o.push({label:"WebGL 1 RGBA",value:"\u2705"}),o.push({label:"WebGL 1 RGB",value:"\u2705"}));const e=document.createElement("canvas").getContext("webgl2");e&&(o.push({label:"WebGL 2 RGBA32F",value:e.getExtension("EXT_color_buffer_float")?"\u2705":"\u274C"}),o.push({label:"WebGL 2 RGB32F",value:e.getExtension("EXT_color_buffer_float")?"\u2705":"\u274C"}),o.push({label:"WebGL 2 R11F_G11F_B10F",value:"\u2705"}),o.push({label:"WebGL 2 RGB565",value:"\u2705"}),o.push({label:"WebGL 2 RGB5_A1",value:"\u2705"}),o.push({label:"WebGL 2 RGBA4444",value:"\u2705"}))}catch{}return o}async function Mk(){const o=[];if(!("gpu"in navigator))return o.push({label:"\u{1F680} WebGPU Support",value:"\u274C Not supported"}),o;o.push({label:"\u{1F680} WebGPU Support",value:"\u2705 Supported"});try{const e=await navigator.gpu.requestAdapter();if(!e)return o.push({label:"\u{1F3AF} Adapter",value:"No adapter available"}),o;o.push({label:"\u{1F3AF} Adapter",value:e.name||"Unknown Adapter"});const t=await e.requestDevice();o.push({label:"\u{1F527} Device",value:t.label||"WebGPU Device"}),o.push({label:"\u{1F4CF} Max Texture 2D",value:t.limits.maxTextureDimension2D.toString()}),o.push({label:"\u{1F4D0} Max Texture 3D",value:t.limits.maxTextureDimension3D.toString()}),o.push({label:"\u{1F4CA} Max Texture Array Layers",value:t.limits.maxTextureArrayLayers.toString()}),o.push({label:"\u{1F4BE} Max Buffer Size",value:`${(t.limits.maxBufferSize/1024/1024).toFixed(1)}MB`}),o.push({label:"\u{1F517} Max Bind Groups",value:t.limits.maxBindGroups.toString()})}catch(e){o.push({label:"\u274C Error",value:e.message})}return o}function Z_(){try{const o=document.createElement("canvas"),e=o.getContext("webgl2")||o.getContext("webgl");if(!e)return null;const t=e.getExtension("WEBGL_debug_renderer_info"),i=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER),n=t?e.getParameter(t.UNMASKED_VENDOR_WEBGL):e.getParameter(e.VENDOR),s=e.getParameter(e.VERSION);let r;if(i&&i.includes("ANGLE")){const a=i.match(/ANGLE \(([^)]+)\)/);a&&(r=a[1])}return{renderer:i,vendor:n,version:s,angle:r}}catch{return null}}function Ek(){const o=[];try{const e=document.createElement("canvas").getContext("webgl");if(e){const t=e.getExtension("WEBGL_debug_renderer_info");if(t){const i=e.getParameter(t.UNMASKED_RENDERER_WEBGL);i&&i.includes("Apple")&&o.push({label:"\u{1F34E} Apple GPU",value:i})}}}catch{}try{const e=document.createElement("canvas").getContext("webgl");e&&(e.getSupportedExtensions()||[]).includes("WEBGL_compressed_texture_pvrtc")&&o.push({label:"\u{1F5DC}\uFE0F PVRTC Support",value:"\u2705"})}catch{}return o}function Rk(){return I.isQuest()?"Meta Quest":I.isVisionOS()?"Vision Pro":I.isiOS()?I.isiPad()?"iPad":"iPhone/iPod":I.isAndroidDevice()?"Android Device":I.isMozillaXR()?"Mozilla XR Browser":I.isNeedleAppClip()?"Needle App Clip":I.isMacOS()?"Mac":I.isDesktop()?"Desktop PC":"Unknown Device"}function Tk(){return document.querySelector("#__vconsole .vc-switch")||null}function Ak(){return document.querySelector("#__vconsole")||null}const tu=w("debugtypes");class Ik{_types=new Map;_reverseTypes=new Map;_lazyLoaders=new Map;constructor(){tu&&console.warn("TypeStore: Created",this)}add(e,t){tu&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?tu&&i!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):(this._types.set(e,t),this._reverseTypes.set(t,e))}addLazy(e,t){this._types.has(e)||this._lazyLoaders.set(e,t)}get(e){return this._types.get(e)||null}async getAsync(e){const t=this._types.get(e);if(t)return t;const i=this._lazyLoaders.get(e);if(i){tu&&console.warn("LAZY LOAD TYPE",e);const n=await i();return this.add(e,n),this._lazyLoaders.delete(e),n}return null}getKey(e){return this._reverseTypes.get(e)||null}}const Lk=Symbol("BuiltInType"),P=new Ik,Rg=function(o){P.get(o.name)||P.add(o.name,o)};class Dk{context;mixers=[];constructor(e){this.context=e}onDestroy(){this.mixers.forEach(e=>e.stopAllAction()),this.mixers.length=0}registerAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.registerAnimationMixer called with null or undefined mixer");return}this.mixers.includes(e)||this.mixers.push(e)}unregisterAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.unregisterAnimationMixer called with null or undefined mixer");return}const t=this.mixers.indexOf(e);t!==-1&&this.mixers.splice(t,1)}}var mi;(o=>{function e(h,d){const p=h.getRoot();return p&&(p.userData.static||p.matrixAutoUpdate===!1||p.matrixWorldAutoUpdate===!1)?((d===!0||d===void 0&&A())&&console.warn(`AnimationUtils: The root object (${p.name||p.type}) of this AnimationAction has matrixAutoUpdate or matrixWorldAutoUpdate set to false. This may prevent the animation from working correctly. If the object is marked as static, try to change it to dynamic.`,{static:p.userData.static,name:p.userData.name,tag:p.userData.tag,matrixAutoUpdate:p.matrixAutoUpdate,matrixWorldAutoUpdate:p.matrixWorldAutoUpdate}),!1):!0}o.testIfRootCanAnimate=e;function t(h){return h._actions||null}o.tryGetActionsFromMixer=t;function i(h,d){if(d||(d=new Array),h)h.animations&&d.push(...h.animations);else return d;if(h.children)for(const p of h.children)i(p,d);return d}o.tryGetAnimationClipsFromObjectHierarchy=i;const n=Symbol("objectIsAnimatedData");function s(h,d,p){if(!h)return;if(h[n]===void 0){if(!p)return;h[n]=new Set}const m=h[n];p?m.add(d):m.has(d)&&m.delete(d)}o.setObjectAnimated=s;function r(h){if(!h)return!1;const d=h[n];return d!==void 0&&d.size>0}o.getObjectAnimated=r;function a(h){if(!h||!h.animations)return console.debug("No animations found in file"),null;const d="scene"in h?h.scene:h,p=new Array;for(let f=0;f<h.animations.length;f++){const g=h.animations[f];if(!g.tracks||g.tracks.length<=0){console.warn("Animation has no tracks");continue}for(const y in g.tracks){const _=g.tracks[y],v=La.parseTrackName(_.name);let C=La.findNode(d,v.nodeName);if(!C){const k=_.__objectName??_.name.substring(0,_.name.indexOf("."));if(C=d.getObjectByProperty("uuid",k),!C)continue}let O=m(C)||m(d);if(!O){const k=P.get("Animation");if(O=d.addComponent(k),!O){console.error("Failed creating Animation component: No 'Animation' component found in TypeStore");break}}p.push(O),O.addClip&&O.addClip(g)}}return p;function m(f){if(!f)return null;const g=f.userData?.components;if(g&&g.length>0)for(let y=0;y<g.length;y++){const _=g[y];if(_.isAnimationComponent===!0)return _}return m(f.parent)}}o.autoplayAnimations=a;function l(){return new Ai("empty",0,[])}o.emptyClip=l;function c(h){const d=h?.duration??.3;let p={x:1,y:1,z:1};h?.scale!==void 0&&(typeof h.scale=="number"?p={x:h.scale,y:h.scale,z:h.scale}:p=h.scale);const m=h?.type??"linear",f=h?.scaleFactor??1.2,g=new Array,y=new Array;switch(m){case"linear":g.push(0,d),y.push(p.x,p.y,p.z,p.x*f,p.y*f,p.z*f);break;case"spring":g.push(0,d*.3,d*.5,d*.7,d*.9,d),y.push(p.x,p.y,p.z,p.x*f,p.y*f,p.z*f,p.x*.9,p.y*.9,p.z*.9,p.x*1.05,p.y*1.05,p.z*1.05,p.x*.98,p.y*.98,p.z*.98,p.x,p.y,p.z);break}const _=new cC(".scale",g,y);return new Ai("scale",g[g.length-1],[_])}o.createScaleClip=c})(mi||(mi={}));const qe=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=K_(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=K_(t)}return function(e,t){if(!e){const n=typeof t=="string"?t:t.name;console.warn(`@serializable without a target at '${n}'.`);return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const i=e.$serializedTypes=e.$serializedTypes||{};i[t]=o}};function K_(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const J_=w("debugcomponentevents");class iu{static eventListeners=new Map;static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let i=this.eventListeners.get(e);i||(i=[]),i.push(t),this.eventListeners.set(e,i),J_&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const i=this.eventListeners.get(e);if(!i)return;const n=i.indexOf(t);n<0||i.splice(n,1)}static dispatchComponentLifecycleEvent(e,t){const i=this.eventListeners.get(e);if(J_&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const ev=w("debugdefines");ks('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ks('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ks('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ks('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ks('globalThis["__NEEDLE_ENGINE_VERSION__"] = "5.1.0-alpha";'),ks('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),ks('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Tue Apr 07 2026 16:34:59 GMT+0000 (Coordinated Universal Time)";'),ks('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const gi="5.1.0-alpha",Ha="undefined",Mc="Tue Apr 07 2026 16:34:59 GMT+0000 (Coordinated Universal Time)";ev&&console.log(`Engine version: ${gi} (generator: ${Ha})
|
|
144
|
+
Project built at ${Mc}`);const Os=NEEDLE_PUBLIC_KEY,Kn="needle_isActiveInHierarchy",Rr="builtin_components",Ec="needle_editor_guid";function ks(o){try{(0,eval)(o)}catch(e){ev&&console.error(e)}}const Tg={experimentalSmartHierarchyUpdate:!1},Fi=Symbol("shadowDomOwner"),jk=w("debugpatch");function nu(o,e,t,i){const n=jk===e;if(!t&&!i)return;const s=e+"___needle";Fk(o,e,t,i);const r=Object.getOwnPropertyDescriptor(o,e),a=o[e];n&&console.log("Patch",o.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",o.constructor.name,e,r),typeof r.value=="function"&&(o[e]=iv(r.value,o,e))):(n&&console.log("Create patch with new property",o.constructor.name,e,r),Object.defineProperty(o,e,{set:function(l){if(typeof l=="function")this[s]=iv(l,o,e);else{const c=this[s];nv(o,e,this,c,l),this[s]=l,ov(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function Bk(o,e,t){const i=Ig(o,e);if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];s.prefix===t&&(s.prefix=null),s.postfix===t&&(s.postfix=null),!s.prefix&&!s.postfix&&i.splice(n,1)}}const tv=Symbol("Needle:Patches:WrappedFunction");function iv(o,e,t){if(o[tv])return o;const i=function(...n){nv(e,t,this,...n);const s=o.apply(this,n);return ov(e,t,this,s,...n),s};return i[tv]=!0,i}const ou="Needle:Patches";function Ag(){return globalThis[ou]||(globalThis[ou]=new WeakMap),globalThis[ou]}function Ig(o,e){const t=Ag().get(o);return t?t.get(e):null}function Fk(o,e,t,i){let n=Ag().get(o);n||(n=new Map,Ag().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function nv(o,e,t,...i){if(!t)return;const n=Ig(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function ov(o,e,t,i,...n){if(!t)return;const s=Ig(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}function Uk(o,e){if(typeof window!==void 0&&window.SPECTOR){console.log(window.SPECTOR);const t=new URLSearchParams(window.location.search);if(t.has("spector")){let i=function(){if(n>o.time.frame)return window.requestAnimationFrame(()=>i());const r=s.captureCanvas(e);r&&r instanceof Promise?r.then(()=>s.displayUI()):s.displayUI()};const n=Number.parseInt(t.get("spector")||"0")||0;console.log("Scheduled Spector capture at frame #"+n);const s=new window.SPECTOR.Spector;s.spyCanvases=!0,i();return}else A()&&console.debug("Spector available: Add '?spector=<frame>' to the URL to enable it and capture a frame.")}}function sv(o){const e=o;return!!(e.parser&&e.parser.json)}var su=(o=>(o[o.None=0]="None",o[o.DontExport=1]="DontExport",o))(su||{});const Lg=Symbol("component-name");function Dg(o){return o&&o.isComponent}const zk=Symbol("object"),jg=new ji(()=>new b,20);class rv{_point;_normal;_tangentVelocity;distance;impulse;friction;get point(){return jg.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return jg.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return jg.get().set(this._tangentVelocity.x,this._tangentVelocity.y,this._tangentVelocity.z)}constructor(e,t,i,n,s,r){this._point=e,this.distance=t,this._normal=i,this.impulse=n,this.friction=s,this._tangentVelocity=r}}class av{contacts;constructor(e,t,i){this.me=e,this._collider=t,this._gameObject=t.gameObject,this.contacts=i}me;_collider;get collider(){return this._collider}_gameObject;get gameObject(){return this._gameObject}get rigidBody(){return this.collider?.attachedRigidbody}}class lv{object;collider;constructor(e,t){this.object=e,this.collider=t}}class Im{constructor(e){this.context=e,this.root.style.cssText=`
|
|
145
|
+
position: absolute;
|
|
146
|
+
width: 1px; height: 1px;
|
|
147
|
+
padding: 0; margin: -1px;
|
|
148
|
+
overflow: hidden;
|
|
149
|
+
clip: rect(0, 0, 0, 0);
|
|
150
|
+
white-space: nowrap;
|
|
151
|
+
border: 0;
|
|
152
|
+
`,this.root.setAttribute("role","region"),this.root.setAttribute("aria-label","3D Needle Engine scene"),this.liveRegion.setAttribute("aria-live","polite"),this.liveRegion.setAttribute("aria-atomic","true"),this.liveRegion.setAttribute("role","status"),this.root.appendChild(this.liveRegion),this.enabled=!0}static _managers=new WeakMap;static get(e){return Dg(e)?this._managers.get(e.context):this._managers.get(e)}_enabled;set enabled(e){e!==this._enabled&&(this._enabled=e,e?(Im._managers.set(this.context,this),(this.context.domElement.shadowRoot||this.context.domElement).prepend(this.root)):this.root.remove())}clear(){this.root.childNodes.forEach(e=>e.remove()),this.root.appendChild(this.liveRegion)}dispose(){this.root.remove(),Im._managers.delete(this.context)}root=document.createElement("div");liveRegion=document.createElement("div");treeElements=new WeakMap;updateElement(e,t){let i=this.treeElements.get(e);i||(i=document.createElement("div"),this.treeElements.set(e,i),this.root.appendChild(i),typeof t=="object"&&(t.role&&i.setAttribute("role",t.role),t.label&&i.setAttribute("aria-label",t.label),t.hidden!==void 0&&i.setAttribute("aria-hidden",String(t.hidden)),t.busy!==void 0&&i.setAttribute("aria-busy",String(t.busy))))}focus(e){const t=this.treeElements.get(e);t&&t.focus()}unfocus(e){const t=this.treeElements.get(e);t&&t.blur()}hover(e,t){const i=this.treeElements.get(e);this.liveRegion.textContent=t||i?.getAttribute("aria-label")||""}removeElement(e){this.treeElements.get(e)?.remove(),this.treeElements.delete(e)}set liveRegionMode(e){this.liveRegion.setAttribute("aria-live",e)}}let cv,hv=null;function Mn(){return cv}function dv(o){if(o==null){console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");return}hv!==o&&(hv=o,cv=new o)}const Ga=new Map,qa=new Map;let uv=0;function Uo(o,e,t){if(Ga.has(e)||Ga.set(e,new Array),Ga.get(e).push({method:o,options:{once:!1,...t}}),uv<30){const i=qa.get(e);i&&i?.length>100&&(uv+=1,console.warn(`You have ${i.length} methods registered for Event ${e}.
|
|
153
|
+
|
|
154
|
+
This might be a performance issue!
|
|
155
|
+
Consider unregistering the methods when they are not needed anymore!
|
|
156
|
+
|
|
157
|
+
To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
|
|
158
|
+
|
|
159
|
+
or by using the once option like onStart(()=>{}, { once:true }).
|
|
160
|
+
|
|
161
|
+
See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function Ms(o,e){const t=qa.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=Ga.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Jn(o,e){e===ue.ContextCreated&&Bg.delete(o),pv(o,e)}function pv(o,e){e===xe.Start&&Ga.get(ue.ContextCreated)&&pv(o,ue.ContextCreated);const t=e===xe.Start||e===ue.ContextCreated,i=qa.get(e);i&&i.length>0&&gv(o,i,t);const n=Ga.get(e);if(n&&n.length>0){const s=[...n];n.length=0,gv(o,s,t),s.length>0&&(qa.has(e)||qa.set(e,new Array),qa.get(e).push(...s))}}const ru=new Array,mv={context:null};function gv(o,e,t){ru.length=0;for(let n=0;n<e.length;n++)ru.push(e[n]);let i=Bg.get(o);for(let n=0;n<ru.length;n++){const s=ru[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{mv.context=o,s.method?.call(mv,o)}catch(a){console.error("Error in lifecycle method",a)}if(s.options?.once){for(let a=0;a<e.length;a++)if(e[a]===s){e.splice(a,1);break}}else t&&(i||(i=new Set,Bg.set(o,i)),i.add(s))}}const Bg=new WeakMap;function Fg(o,e){return Uo(o,ue.ContextCreated,e),()=>Ms(o,ue.ContextCreated)}function Nk(o,e){return Uo(o,ue.ContextClearing,e),()=>Ms(o,ue.ContextClearing)}function Wk(o,e){return Uo(o,ue.ContextDestroying,e),()=>Ms(o,ue.ContextDestroying)}function au(o,e){return Uo(o,xe.Start,e),()=>Ms(o,xe.Start)}function fv(o,e){return Uo(o,xe.Update,e),()=>Ms(o,xe.Update)}function Vk(o,e){return Uo(o,xe.OnBeforeRender,e),()=>Ms(o,xe.OnBeforeRender)}function $k(o,e){return Uo(o,xe.OnAfterRender,e),()=>Ms(o,xe.OnAfterRender)}const Mt=w("debuglicense"),yv=[];let En="basic";Mt&&console.log("License Type: "+En);function eo(){switch(En){case"pro":case"enterprise":return!0}return!1}function Rc(){return En==="indie"}function Ug(){return En==="edu"}function to(){return eo()||Rc()||Ug()}function Hk(o){if(eo()||Rc()||Ug())return o(!0);yv.push(o)}function lu(o){for(const e of yv)try{e(o)}catch{}}var fi;(o=>{window.addEventListener("error",a=>{s(z.Current,"unhandled_error",a)}),window.addEventListener("unhandledrejection",a=>{s(z.Current,"unhandled_promise_rejection",{message:a.reason?.message,stack:a.reason?.stack,timestamp:Date.now()})}),Fg(a=>e(a),{once:!0});function e(a){if(!t(a)){Mt&&console.debug("Telemetry is disabled via no-telemetry attribute");return}return r({site_id:"dabb8317376f",type:"pageview",pathname:window.location.pathname,hostname:window.location.hostname,page_title:document.title,referrer:document.referrer,user_agent:navigator.userAgent,querystring:window.location.search,language:navigator.language,screenWidth:window.screen.width,screenHeight:window.screen.height,event_name:"page_view"}).then(l=>{if(l instanceof Response&&l.ok&&Di()){const c=(a.domElement?.getAttribute("src")||"")+gi+Ha+Mc+Os;window.sessionStorage.getItem("session_key")!==c&&(window.sessionStorage.setItem("session_key",c),n(a,"info",{src:a.domElement?.getAttribute("src")||"",version:gi,generator:Ha,build_time:Mc,public_key:Os}))}})}function t(a){let l=a?.domElement;if(l||(l=document.querySelector("needle-engine")),!l&&!a)return!1;const c=l?.getAttribute("no-telemetry");return(c===""||c==="true"||c==="1")&&(En==="pro"||En==="enterprise")?(Mt&&console.debug("Telemetry is disabled via no-telemetry attribute"),!1):!0}o.isAllowed=t;const i="dabb8317376f";async function n(a,l,c){if(!t(a)){Mt&&console.debug("Telemetry is disabled");return}const h={site_id:i,type:"custom_event",pathname:window.location.pathname,event_name:l,properties:c?JSON.stringify(c):void 0};return r(h)}o.sendEvent=n;async function s(a,l,c){if(!t(a)){Mt&&console.debug("Telemetry is disabled");return}c instanceof ErrorEvent?c={message:c.message,stack:c.error?.stack,filename:c.filename,lineno:c.lineno,colno:c.colno,timestamp:c.timeStamp||Date.now()}:c instanceof Error&&(c={message:c.message,stack:c.stack,timestamp:Date.now()});const h={site_id:i,type:"error",event_name:l||"error",properties:JSON.stringify({error_name:l,message:c.message,stack:c.stack,filename:c.filename,lineno:c.lineno,colno:c.colno,timestamp:c.timestamp})};return r(h)}o.sendError=s;function r(a){try{return fetch("https://needle.tools/api/v1/rum/t",{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json"},keepalive:!0,mode:"cors",priority:"low"}).catch(l=>{Mt&&console.error("Failed to send telemetry",l)})}catch(l){Mt&&console.error(l)}return Promise.resolve()}})(fi||(fi={})),pe.registerCallback(ue.ContextRegistered,o=>{Xk(o.context),qk(o.context),setTimeout(()=>Yk(o.context),2e3)});let cu,zg=!1,Ng="";async function Gk(){if(cu)return cu;if(En==="basic")try{const o="https://needle.tools/api/v1/needle-engine/check?location="+encodeURIComponent(window.location.href)+"&version="+gi+"&generator="+encodeURIComponent(Ha),e=await fetch(o,{method:"GET"}).catch(t=>{Mt&&console.error("License check failed",t)});e?.status===200?(zg=!1,Mt&&console.log("License check succeeded"),En="pro",lu(!0)):e?.status===403?(lu(!1),zg=!0,Ng=await e.text()):(lu(!1),Mt&&console.log("License check failed with status "+e?.status))}catch(o){lu(!1),Mt&&console.error("License check failed",o)}else Mt&&console.log('Runtime license check is skipped because license is already applied as "'+En+'"')}cu=Gk();async function qk(o){function e(){const n=document.createElement("div");n.className="needle-forbidden",n.style.cssText=`
|
|
162
|
+
position: fixed;
|
|
163
|
+
top: 0;
|
|
164
|
+
left: 0;
|
|
165
|
+
width: 100%;
|
|
166
|
+
height: 100%;
|
|
167
|
+
pointer-events: all;
|
|
168
|
+
zIndex: 2147483647;
|
|
169
|
+
line-height: 1.5;
|
|
170
|
+
backdrop-filter: blur(15px);
|
|
171
|
+
-webkit-backdrop-filter: blur(15px);
|
|
172
|
+
`;const s=n.style.cssText,r=document.createElement("div");n.appendChild(r),r.style.cssText=`
|
|
173
|
+
position: absolute;
|
|
174
|
+
left: 0;
|
|
175
|
+
right: 0;
|
|
176
|
+
top:0;
|
|
177
|
+
bottom: 0;
|
|
178
|
+
padding: 10%;
|
|
179
|
+
color: white;
|
|
180
|
+
font-size: 20px;
|
|
181
|
+
font-family: sans-serif;
|
|
182
|
+
text-align: center;
|
|
183
|
+
pointer-events: all;
|
|
184
|
+
display: flex;
|
|
185
|
+
justify-content: center;
|
|
186
|
+
align-items: center;
|
|
187
|
+
background-color: rgba(0,0,0,.3);
|
|
188
|
+
text-shadow: 0 0 2px black;
|
|
189
|
+
`;const a=r.style.cssText,l=Ng?.length>1?Ng:"This web application has been paused.<br/>You might be in violation of the Needle Engine terms of use.<br/>Please contact the Needle support if you think this is a mistake.";return r.innerHTML=l,setInterval(()=>{r.innerHTML!==l&&(r.innerHTML=l),r.parentNode!==n&&n.appendChild(r),n.style.cssText!==s&&(n.style.cssText=s),r.style.cssText!==a&&(r.style.cssText=a)},500),n}let t=e();const i=t.style.cssText;setInterval(()=>{zg===!0&&(t.style.cssText!==i&&(t=e()),o.domElement.shadowRoot?t.parentNode!==o.domElement.shadowRoot&&o.domElement.shadowRoot?.appendChild(t):t.parentNode!=document.body&&document.body.appendChild(t))},500)}async function Xk(o){try{if(!eo()&&!Rc())return Wg(o)}catch(e){return Mt&&console.log("License check failed",e),Wg(o)}Mt&&Wg(o)}async function Wg(o){let e=!1;o.domElement.addEventListener("ready",()=>e=!0),await cu?.catch(()=>{}),!(eo()||Rc())&&(to()===!1&&Qk(),e?Vg(o):o.domElement.addEventListener("ready",()=>{Vg(o)}))}function Vg(o){const e=`
|
|
190
|
+
position: relative;
|
|
191
|
+
display: block;
|
|
192
|
+
background-size: 20px;
|
|
193
|
+
background-position: 10px 5px;
|
|
194
|
+
background-repeat:no-repeat;
|
|
195
|
+
background-image:url('${bv}');
|
|
196
|
+
background-max-size: 40px;
|
|
197
|
+
padding: 10px;
|
|
198
|
+
padding-left: 30px;
|
|
199
|
+
`;if(En==="edu")navigator.webdriver?console.log("This project is supported by Needle for Education \u2013 https://needle.tools"):console.log("%c This project is supported by Needle for Education \u2013 https://needle.tools",e);else return;const t=document.createElement("div");t.className="needle-non-commercial-use",t.innerHTML="Made with Needle for Education",o.domElement.shadowRoot?.appendChild(t);let i=`
|
|
200
|
+
position: absolute;
|
|
201
|
+
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
202
|
+
font-size: 12px;
|
|
203
|
+
color: rgb(100, 100, 100);
|
|
204
|
+
/*mix-blend-mode: difference;*/
|
|
205
|
+
background-color: transparent;
|
|
206
|
+
z-index: 10000;
|
|
207
|
+
|
|
208
|
+
cursor: pointer;
|
|
209
|
+
user-select: none;
|
|
210
|
+
opacity: 0;
|
|
211
|
+
|
|
212
|
+
bottom: 6px;
|
|
213
|
+
right: 12px;
|
|
214
|
+
transform: translateY(0px);
|
|
215
|
+
transition: all .5s ease-in-out 1s;
|
|
216
|
+
`;t.style.cssText=i,t.addEventListener("click",()=>{window.open("https://needle.tools","_blank")});let n=t.style.cssText;setTimeout(()=>{i=i.replace("opacity: 0","opacity: 1"),i=i.replace("transform: translateY(10px)","transform: translateY(0)"),t.style.cssText=i,n=t.style.cssText},100);const s=setInterval(()=>{const r=o.domElement.shadowRoot||o.domElement;t.parentNode!==r&&r.appendChild(t),n!=t.style.cssText&&(t.style.cssText=i,n=t.style.cssText)},1e3);Ug()&&setTimeout(()=>{clearInterval(s),t?.remove(),setTimeout(()=>{o.domElement.parentNode&&Vg(o)},1e3*60*5)},2e4)}const bv="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let _v=0;async function Qk(o){const e=Date.now();if(e-_v<2e3)return;_v=e;const t=`
|
|
217
|
+
position: relative;
|
|
218
|
+
display: block;
|
|
219
|
+
font-size: 18px;
|
|
220
|
+
background-size: 20px;
|
|
221
|
+
background-position: 10px 5px;
|
|
222
|
+
background-repeat:no-repeat;
|
|
223
|
+
background-image:url('${bv}');
|
|
224
|
+
background-max-size: 40px;
|
|
225
|
+
margin-bottom: 5px;
|
|
226
|
+
margin-top: .3em;
|
|
227
|
+
margin-bottom: .5em;
|
|
228
|
+
padding: .2em;
|
|
229
|
+
padding-left: 25px;
|
|
230
|
+
border-radius: .5em;
|
|
231
|
+
border: 2px solid rgba(160,160,160,.3);
|
|
232
|
+
`,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${gi}`;z.Current?.xr||navigator.webdriver?console.log(i):console.log("%c "+i,t)}async function Yk(o){if(!window.crossOriginIsolated){if(!fi.isAllowed(o)){Mt&&console.debug("Telemetry is disabled via no-telemetry attribute");return}try{const e="https://needle.tools/api/v1/needle-engine/ping";if(e){const t=window.location.href.split("?")[0],i={license:En,url:t,hostname:window.location.hostname,pathname:window.location.pathname,version:gi,generator:Ha,build_time:Mc,public_key:Os},n=navigator.sendBeacon?.(e,JSON.stringify(i));Mt&&console.debug("Sent beacon: "+n)}}catch(e){Mt&&console.log("Failed to send non-commercial usage message to analytics backend",e)}}}const vv=typeof e_=="function"?e_:GP;var Tr;(o=>{o.baseUrl="https://networking.needle.tools";function e(l){return vv(new Uint8Array(l))}o.hashMD5=e;function t(l){const c=vv(new Uint8Array(l),{encoding:"binary",asBytes:!0});return btoa(String.fromCharCode(...c))}o.hashMD5_Base64=t;function i(l){const c=new Uint8Array(l);return crypto.subtle.digest("SHA-256",c).then(h=>btoa(String.fromCharCode(...new Uint8Array(h))))}o.hashSha256=i;function n(l){const c=l.filesize/1024/1024;return to()?c<50:c<5}o.canUpload=n;async function s(l,c){const h=o.baseUrl;if(h){if(!l.name)return console.error("Upload: file name is missing"),null}else return console.error("Blob storage base url is not set"),null;let d=null;l instanceof File?d=await l.arrayBuffer():d=l.data;const p=d.byteLength,m=p/1024/1024;if(m>50)return c?.silent!==!0&&be(`File (${m.toFixed(1)}MB) is too large for uploading (see console for details)`),console.warn(`Your file is too large for uploading (${m.toFixed(1)}MB). Max allowed size is 50MB`),null;if(!to()&&m>5)return c?.silent!==!0&&be('File is too large for uploading. Please get a <a href="https://needle.tools/pricing" target="_blank">commercial license</a> to upload files larger than 5MB'),console.warn(`Your file is too large for uploading (${m.toFixed(1)}MB). Max size is 5MB for non-commercial users. Please get a commercial license at https://needle.tools/pricing for larger files (up to 50MB)`),null;if(p<1)return console.warn(`Your file is too small for uploading (${m.toFixed(1)}MB). Min size is 1 byte`),null;const f=t(d),g={filename:l.name,"Content-Md5":f,"Content-Type":l.type||"application/octet-stream",FileSize:p.toString(),"Content-Disposition":`attachment; filename="${l.name}"`,"x-amz-server-side-encryption":"AES256"},y=await fetch(h+"/api/needle/blob",{method:"POST",headers:g,signal:c?.abort}).then(_=>_.json()).catch(_=>(console.error(_),null));if(y==null)return console.warn("Upload failed..."),null;if("error"in y)return console.error(y.error),null;if("upload"in y&&y.upload){let _=function(O){return c?.onProgress?.call(null,{progress01:0,state:"inprogress"}),fetch(O,{method:"PUT",headers:g,body:d,signal:c?.abort}).then(k=>(c?.onProgress?.call(null,{progress01:1,state:"finished"}),k)).catch(k=>k)};console.debug("Uploading file",y.upload);let v=!1,C=null;for(let O=0;O<3;O++)try{if(v)break;if(c?.abort?.aborted)return console.debug("Aborted upload"),null;const k=await _(y.upload);k instanceof Error?(C=k,await Bo(1e3*O)):k.ok&&(console.debug("File uploaded successfully"),v=!0)}catch(k){console.error(k)}if(!v)return console.error(C?.message||"Failed to upload file"),null}if("download"in y){const _=h+y.download;return console.debug("File found in blob storage",_),{key:y.key,success:!0,download_url:_}}return null}o.upload=s;function r(l){return`${o.baseUrl}/api/needle/blob/${l}`}o.getBlobUrlForKey=r;async function a(l,c){const h=new Ab;h.setResponseType("arraybuffer");const d=await h.loadAsync(l,p=>{c&&c.call(null,p)});return d instanceof ArrayBuffer?new Uint8Array(d):(console.error("Download failed, no arraybuffer returned"),null)}o.download=a})(Tr||(Tr={}));var Rn=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(Rn||{});const Tc={},Xa={register(o,e){Tc[o]=e},unregister(o){delete Tc[o]},list(){return Object.keys(Tc)},has(o){return o in Tc},async resolve(o){const e=Tc[o];return e?e(o):null}};pe.registerCallback(ue.ContextCreated,o=>{const e=o.context;kv(e),Sv(e)});const hu=w("debugcomponents"),wv="eff8ba80-635d-11ec-90d6-0242ac120003";class kt{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=kt.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return Km(e,wv);const t=this._seed;return this._seed-=1,Km(t.toString(),wv)}initialize(e){typeof e=="string"?this._seed=kt.hash(e):this._seed=e}static createFromString(e){return new kt(this.hash(e))}static hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}var xv=(o=>(o.NewInstanceCreated="new-instance-created",o.InstanceDestroyed="instance-destroyed",o))(xv||{});class Zk{guid;dontSave;constructor(e){this.guid=e}}function Ac(o,e,t=!0,i){if(!o)return;const n=o;if(Ui(o,t),!e){console.warn("Can not send destroy: No networking connection provided",o.guid);return}if(!e.isConnected){A()&&console.debug("Can not send destroy: not connected",o.guid);return}let s=o.guid;if(!s&&n.uuid&&(s=n.uuid),!s){console.warn("Can not send destroy: failed to find guid",o);return}$g(s,e,i)}function $g(o,e,t){const i=new Zk(o);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,Rn.Queued)}const du=[];function Kk(o){return du.push(o),()=>{const e=du.indexOf(o);e>=0&&du.splice(e,1)}}function Sv(o){o.connection.beginListen("instance-destroyed",e=>{hu&&console.log("[Remote] Destroyed",o.scene,e);const t=If(e.guid,o.scene);if(t){for(const i of du)try{i(e.guid,t)}catch(n){console.error("Error in onSyncDestroy callback",n)}Ui(t)}})}class Jk{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class Cv{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}const uu=[];function Pv(o){return uu.push(o),()=>{const e=uu.indexOf(o);e>=0&&uu.splice(e,1)}}function Hg(o,e,t,i){const n=o;if(!n.guid)if(n.name)n.guid=n.name;else return console.error("[syncInstantiate] Can not instantiate: a 'guid' is required. For runtime-created objects, either set a name (`obj.name = 'my-prefab'`) or a guid (`obj.guid = 'my-prefab-id'`). The identifier must be the same on all clients.",n),null;if(Xa.has(n.guid)||Xa.register(n.guid,async()=>n),e.context||(e.context=z.Current),!e.context)return console.error("[syncInstantiate] Missing network instantiate options / reference to network connection in sync instantiate. Please pass in the Needle Engine context."),null;const s=e?{...e}:null,{instance:r,seed:a}=eM(n,e);if(r){const l=r;if(l.guid){hu&&console.log("[Local] new instance","gameobject:",r?.guid);const c=new Cv(n.guid,l.guid);c.seed=a,e.deleteOnDisconnect===!0&&(c.deleteStateOnDisconnect=!0),s&&(s.position&&(Array.isArray(s.position)?c.position={x:s.position[0],y:s.position[1],z:s.position[2]}:c.position={x:s.position.x,y:s.position.y,z:s.position.z}),s.rotation&&(s.rotation instanceof ht?s.rotation=new N().setFromEuler(s.rotation):s.rotation instanceof Array&&(s.rotation=new N().fromArray(s.rotation)),c.rotation={x:s.rotation.x,y:s.rotation.y,z:s.rotation.z,w:s.rotation.w}),s.scale&&(Array.isArray(s.scale)?c.scale={x:s.scale[0],y:s.scale[1],z:s.scale[2]}:c.scale={x:s.scale.x,y:s.scale.y,z:s.scale.z})),c.position||(c.position={x:l.position.x,y:l.position.y,z:l.position.z}),c.rotation||(c.rotation={x:l.quaternion.x,y:l.quaternion.y,z:l.quaternion.z,w:l.quaternion.w}),c.scale||(c.scale={x:l.scale.x,y:l.scale.y,z:l.scale.z}),c.visible=n.visible,s?.parent&&(typeof s.parent=="string"?c.parent=s.parent:s.parent?.guid?c.parent=s.parent.guid:s.parent instanceof Ti?c.parent="scene":console.warn("Unsupported parent type in sync instantiate options: "+s.parent?.name)),c.hostData=t,i===!1&&(c.dontSave=!0),!e?.context?.connection&&A()&&console.debug("Object will be instantiated but it will not be synced: not connected",n.guid),e.context.connection.isInRoom&&Qa.push(new WeakRef(l)),e?.context?.connection.send("new-instance-created",c)}else console.warn("Missing guid, can not send new instance event",l)}return r}function Ov(){return Math.random()*9999999}const Qa=new Array;function kv(o){const e=o.connection.beginListen("new-instance-created",async i=>{const n=await iM(i.originalGuid,o.scene);if(i.preventCreation===!0)return;if(!n){console.warn("could not find object that was instantiated: "+i.guid);return}const s=new qn;i.position&&(s.position=new b(i.position.x,i.position.y,i.position.z)),i.rotation&&(s.rotation=new N(i.rotation.x,i.rotation.y,i.rotation.z,i.rotation.w)),i.scale&&(s.scale=new b(i.scale.x,i.scale.y,i.scale.z)),s.parent=i.parent,i.seed&&(s.idProvider=new kt(i.seed)),s.visible=i.visible,s.context=o,hu&&o.alias&&console.log("[Remote] instantiate in: "+o.alias);const r=Nr(n,s);if(Qa.push(new WeakRef(r)),r){i.parent==="scene"&&o.scene.add(r),hu&&console.log("[Remote] new instance","gameobject:",r?.guid,n);for(const a of uu)try{a(r,i,o)}catch(l){console.error("Error in onSyncInstantiate callback",l)}}}),t=o.connection.beginListen("left-room",()=>{Qa.length>0&&console.debug(`Left networking room, cleaning up ${Qa.length} instantiated objects`);for(const i of Qa){const n=i.deref();n&&n.destroy()}Qa.length=0});return()=>{o.connection.stopListen("new-instance-created",e),o.connection.stopListen("left-room",t)}}function eM(o,e){const t=Ov(),i=e??new qn;i.idProvider=new kt(t);const n=Nr(o,i);return{seed:t,instance:n}}function Mv(o,e){Xa.register(o,e)}function tM(o){Xa.unregister(o)}async function iM(o,e){return await Xa.resolve(o)||Ev(o,e)}function Ev(o,e){if(e===null||!o)return null;if(e.guid===o)return e;if(e.children)for(const t of e.children){const i=Ev(o,t);if(i)return i}return null}const Ic=w("gizmos"),_t=w("debugextension"),Gg=w("debugresolvedependencies"),nM=["/extensions/","extensions/"],oM=[{prefix:"/nodes/",dependencyName:"node"},{prefix:"/meshes/",dependencyName:"mesh"},{prefix:"/materials/",dependencyName:"material"},{prefix:"/textures/",dependencyName:"texture"},{prefix:"/animations/",dependencyName:"animation"},{prefix:"nodes/",dependencyName:"node"},{prefix:"meshes/",dependencyName:"mesh"},{prefix:"materials/",dependencyName:"material"},{prefix:"textures/",dependencyName:"texture"},{prefix:"animations/",dependencyName:"animation"}];async function qg(o,e){Gg&&console.log(o,e);const t=[];Xg(oM,o,e,t);const i=await Promise.all(t);return typeof e=="string"&&i.length===1?i[0]:i}function Rv(o,e){return!o||!e?!1:o["needle:identifier"]!=null&&e["needle:identifier"]!=null?o["needle:identifier"]===e["needle:identifier"]:!1}function sM(o,e){o["needle:identifier"]=e}function Xg(o,e,t,i){if(typeof t=="object"&&t!==void 0&&t!==null)for(const n of Object.keys(t)){const s=t[n];if(typeof s=="string"){const r=Tv(e,s);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=Av(o,e,s);if(a){i.push(a.then(l=>(t[n]=l,l)));continue}}}else if(Array.isArray(s))for(let r=0;r<s.length;r++){const a=s[r],l=Tv(e,a);if(l!=null){typeof l.then=="function"?i.push(l.then(c=>s[r]=c)):s[r]=l;continue}for(const c of o){const h=Iv(c.prefix,a);if(h>=0){Gg&&console.log(c,h,c.dependencyName),i.push(e.getDependency(c.dependencyName,h).then(d=>s[r]=d));break}}typeof a=="object"&&Xg(o,e,a,i)}else typeof s=="object"&&Xg(o,e,s,i)}else if(typeof t=="string"){const n=Av(o,e,t);n&&i.push(n)}}function Tv(o,e){if(o&&o.plugins&&typeof e=="string"){for(const t of nM)if(e.startsWith(t)){let i=e.substring(t.length);const n=i.indexOf("/");n>=0&&(i=i.substring(0,n));const s=o.plugins[i];if(_t&&console.log(i,s),typeof s?.resolve=="function"){const r=e.substring(t.length+i.length+1);return s.resolve(o,r)}break}}return null}function Av(o,e,t){for(const i of o){const n=Iv(i.prefix,t);if(n>=0)return Gg&&console.warn("GET DEPENDENCY",i,n,i.dependencyName),e.getDependency(i.dependencyName,n)}return null}function Iv(o,e){if(typeof e=="string"&&e.startsWith(o)){const t=e.substring(o.length),i=Number.parseInt(t);if(i>=0)return i}return-1}const Qg="NEEDLE_persistent_assets";function rM(o){return o?.___persistentAsset===!0}class aM{get name(){return Qg}parser;constructor(e){this.parser=e}async afterRoot(e){if(!this.parser?.json?.extensions)return;const t=this.parser.json.extensions[Qg];if(!t)return;_t&&console.log(t);const i=new Array;for(const n of t?.assets){const s=qg(this.parser,n);s&&i.push(s)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){_t&&console.log(t);const n=e.json.extensions[Qg];if(n){const s=n?.assets[i];if(s&&typeof s=="object"){s.___persistentAsset=!0;const r=s.__type;r&&P.get(r)}return s}}return null}}const io=w("debugserializer");class lM{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;io&&console.warn("Type: "+e+" is already registered",t,i)}io&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}typeMap=new Map;getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){io&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return io&&console.log("FOUND SERIALIZER",n?.name,e.name,e.constructor.name,"for type: "+i,n,e,this.typeMap),n;const s=Object.getPrototypeOf(e);if(s&&s!==e){const r=this.getSerializerForConstructor(s,++t);if(r){const a=s.constructor||s.prototype;io&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}io&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const pu=new lM;class en{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)pu.register(i,this);else pu.register(e,this)}}class cM{isDevMode=Di();cache={};registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const i=t;i.$serializedTypes&&Object.keys(i.$serializedTypes)&&this.cache[e].push(...Object.keys(i.$serializedTypes)),io&&console.log("registerDefinedKeys for "+e,this.cache[e],t)}}getDefinedKey(e,t){return this.cache[e]===void 0?!1:this.cache[e].includes(t)}}class Yg{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function Lv(o,e){const t=o.$serializedTypes;if(t===void 0)return null;const i={};for(const s in t){const r=o[s];if(r!=null&&typeof r=="object"){const a=pu.getSerializerForConstructor(r);if(a){i[s]=a.onSerialize(r,e);continue}}i[s]=r}function n(s){const r=P._types;for(const[a,l]of r)if(l===o.constructor)return a;return s.__name||s.constructor.name}return i.name=n(o),typeof o.guid=="string"&&(i.guid=o.guid),i}const mu=[];function Dv(o,e){if(!o)return e;typeof o.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,o.$serializedTypes));const t=Object.getPrototypeOf(o);return Dv(t,e)}function gu(o,e,t){if(!o)return!1;if(t.target=o,o.onBeforeDeserialize!==void 0){const n=o.onBeforeDeserialize(e,t);if(typeof n=="boolean")return n}const i=Dv(o);if(e){if(typeof e.guid=="string"&&(o.guid=e.guid),i)for(const n in i){let s=function(l){const c=l.type;return c?Zg(a,c,t,void 0,o[n]):Zg(a,l,t,void 0,o[n])};const r=i[n],a=e[n];if(io&&console.log(n,a,o,r),!(o[n]!==void 0&&a===void 0)&&(t.type=void 0,t.path=n,t.serializable=r,!(o.onBeforeDeserializeMember!==void 0&&o.onBeforeDeserializeMember(n,a,t)===!0))){if(r===null)o[n]=a;else{if(Array.isArray(r))for(let l=0;l<r.length;l++){const c=r[l],h=s(c);if(h!==void 0||l===r.length-1){o[n]=h;break}}else o[n]=s(r);mu.length=0}o.onAfterDeserializeMember!==void 0&&o.onAfterDeserializeMember(n,a,t)}}uM(o,e)}return dM(o,e,t.implementationInformation),o.onAfterDeserialize!==void 0&&o.onAfterDeserialize(e,t),!0}const hM=w("noerrors");function dM(o,e,t){if(hM||!e||!Di()||!o||o.constructor&&o.constructor[Lk]===!0)return;const i=o.constructor?.name,n=Object.getOwnPropertyNames(e);for(const s of n){if(s==="sourceId")continue;const r=o[s];if(r==null)continue;const a=e[s];if(t?.getDefinedKey(i,s)===!1){const l=s.charAt(0).toUpperCase()+s.slice(1);t.getDefinedKey(i,l)&&(Cr(Bi.Warn,'<strong>Please rename</strong> "'+l+'" to "'+s+'" in '+i),console.warn('Please use lowercase for field: "'+l+'" in '+i,a,o));continue}if(a!=null){if(typeof a=="object"&&(r===void 0||!r.isObject3D)){if(typeof a.node=="number"||typeof a.guid=="string"){if(a.could_not_resolve)continue;if(!(r!==void 0&&Object.keys(r).length>1)){Cr(Bi.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
233
|
+
|
|
234
|
+
Please change to:
|
|
235
|
+
@serializable(Object3D)
|
|
236
|
+
${s}? : Object3D;
|
|
237
|
+
|
|
238
|
+
in ${i}.ts
|
|
239
|
+
<a href="https://docs.needle.tools/serializable" target="_blank">See documentation</a>`),console.warn(i,s,o[s],o);continue}}else if(!Array.isArray(r)){const l=r.constructor?.name;if(l==="Object"&&!r.constructor["did_warn:missing_serializable"]){r.constructor["did_warn:missing_serializable"]=!0;const c='You might be missing a @serializable(Type) decorator for field "'+s+'" in '+i+".ts";console.warn(c+`
|
|
240
|
+
${s}:`,a,l),Cr(Bi.Warn,"Dev Warning: Are you missing a type in @serializable? Please check the browser console for details")}}}if(typeof r=="string"&&typeof a=="string"&&(a.endsWith(".gltf")||a.endsWith(".glb"))){Cr(Bi.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
241
|
+
|
|
242
|
+
Please change to:
|
|
243
|
+
@serializable(AssetReference)
|
|
244
|
+
${s}? : AssetReference;
|
|
245
|
+
|
|
246
|
+
in script ${i}.ts
|
|
247
|
+
<a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(i,s,o[s],o);continue}}}}function uM(o,e){for(const t of Object.keys(e)){const i=e[t];if(typeof i=="object"&&i!==null&&i!==void 0){const n=o[t];if(!n){io&&console.log(t,"is undefined on",o);continue}for(const s of Object.keys(i))if(n[s]===void 0&&jv(i[s])&&!jv(n)){const r=pM(n,s);if(r&&(r?.writable===void 0||r?.writable===!1)&&r.set===void 0){io&&console.warn('Property is not writable "'+s+'"',n,r,i[s],n[s]);continue}n[s]=i[s]}}}}function pM(o,e){for(;o;){const t=Object.getOwnPropertyDescriptor(o,e);if(t)return t;o=Object.getPrototypeOf(o)}}function jv(o){switch(typeof o){case"number":case"string":case"boolean":return!0}return!1}function Zg(o,e,t,i,n){let s=typeof e=="function"&&e.prototype===void 0,r=e;if(s)try{if(r=e?.call(e,n),s=!1,r==null)return}catch(h){console.error("Error in callback",h,o)}if(t.type=r,!s&&n&&(n instanceof we||n instanceof H||n instanceof Ji||n instanceof Ai))return n;if(i||(i={serializer:pu.getSerializerForConstructor(r)}),n&&typeof n=="object"&&rM(n)){if(n.__concreteInstance)return n.__concreteInstance;const h=n;if(!h.$serializedTypes&&r.prototype.$serializedTypes&&(h.$serializedTypes=r.prototype.$serializedTypes),h.$serializedTypes&&gu(h,o,t),n&&r!==void 0)try{let d=null;i.serializer&&(d=i.serializer.onDeserialize(o,t)),d||(d=new r,_t&&console.log("Create concrete instance for persistent asset",n,"instance:",d),Ya(d,n)),n.__concreteInstance=d,n=d}catch(d){console.error("Error creating instance or creating values on instance",d,n,r)}return n}if(Array.isArray(o)){const h=[];for(let d=0;d<o.length;d++){const p=o[d],m=Zg(p,e,t,i,p);h.push(m)}return h}const a=i?.serializer;if(a)return a.onDeserialize(o,t);if(n instanceof Se)return n;let l;if(o&&(o.isMaterial||o.isTexture||o.isObject3D||o instanceof Ai))l=o;else{if(o===void 0)return;if(o===null&&(r===we||r===Se||r===H||r===Ai))return null;try{l=new r(...mM(o))}catch(h){console.error("Error creating "+t.path,t.target,h);return}}const c=l;return c.$serializedTypes&&gu(c,o,t),l}function mM(o){if(mu.length=0,typeof o=="object"&&o!==null&&o!==void 0)for(const e of Object.keys(o))mu.push(o[e]);return mu}const Kg=Symbol("assigned component properties");function Ya(o,e,t,i){if(e==null||o==null)return;o[Kg]=!0;const n=o.constructor?.name??"unknown";t?.registerDefinedKeys(n,o);for(const s of Object.keys(e)){const r=gM(o,s);if(typeof r?.value!="function"&&(!r||r.writable===!0||r.set!==void 0)){const a=e[s],l=o[s];o[s]=a,i?.onAssigned&&i.onAssigned(o,s,l,a)}}delete o[Kg]}function gM(o,e){let t;do t=Object.getOwnPropertyDescriptor(o,e);while(!t&&(o=Object.getPrototypeOf(o)));return t}const Es=w("debugaddressables");class Bv{_context;_assetReferences={};constructor(e){this._context=e,this._context.pre_update_callbacks.push(this.preUpdate)}dispose(){const e=this._context.pre_update_callbacks.indexOf(this.preUpdate);e>=0&&this._context.pre_update_callbacks.splice(e,1);for(const t in this._assetReferences)this._assetReferences[t]?.unload();this._assetReferences={}}preUpdate=()=>{};findAssetReference(e){return this._assetReferences[e]||null}registerAssetReference(e){return e.url&&(this._assetReferences[e.url]?console.warn("Asset reference already registered",e):this._assetReferences[e.url]=e),e}unregisterAssetReference(e){e.url&&delete this._assetReferences[e.url]}}const Jg=Symbol("assetReference");class ne{static getOrCreateFromUrl(e,t){if(!t&&(t=z.Current,!t))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.');const i=t.addressables,n=i.findAssetReference(e);if(n)return n;const s=new ne(e,t.hash);return i.registerAssetReference(s),s}static getOrCreate(e,t,i){if(typeof e=="string"){if(!i&&(i=z.Current,!i))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.')}else i=e.context,e=e.sourceId;const n=Fo(e,t);Es&&console.log("GetOrCreate Addressable from",e,t,"FinalPath=",n);const s=i.addressables,r=s.findAssetReference(n);if(r)return r;const a=new ne(n,i.hash);return s.registerAssetReference(a),a}isAssetReference=!0;get rawAsset(){return this._rawAsset}get asset(){return this._glbRoot??(this._rawAsset?.scene||null)}set asset(e){e?this._rawAsset={animations:e.animations,scene:e,scenes:[e]}:this._rawAsset=null}get uri(){return this._url}get url(){return this._url}get urlName(){return this._urlName}get hasUrl(){return this._url!==void 0&&(this._url.startsWith("http")||this._url.startsWith("blob:")||this._url.startsWith("www.")||this._url.includes("/"))}_rawAsset=null;_glbRoot;_url;_urlName;_progressListeners=[];_isLoadingRawBinary=!1;_rawBinary;constructor(...e){typeof e[0]=="object"?"url"in e[0]?this._url=e[0].url:(this._url="",e[0].asset&&(this.asset=e[0].asset)):(this._url=e[0],e[2]instanceof M&&(this.asset=e[2]));const t=this._url.lastIndexOf("/");if(t>=0){this._urlName=this._url.substring(t+1);const i=this._urlName.lastIndexOf(".");i>=0&&(this._urlName=this._urlName.substring(0,i))}else this._urlName=this._url;Mv(this._url,this.onResolvePrefab.bind(this))}async onResolvePrefab(e){return e===this.url&&(this.mustLoad&&await this.loadAssetAsync(),this.asset)?this.asset:null}get mustLoad(){return!this.asset||this.asset.__destroyed===!0||Ur(this.asset)===!0}_loadingPromise=null;isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(Es&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Ui(this.asset.scene,!0,!0),Ui(this.asset,!0,!0)),this.asset=null,this._rawBinary=void 0,this._glbRoot=null,this._loadingPromise=null,z.Current&&z.Current.addressables.unregisterAssetReference(this)}async preload(){if(!this.mustLoad||this._isLoadingRawBinary)return null;if(this._rawBinary!==void 0)return this._rawBinary;this._isLoadingRawBinary=!0,Es&&console.log("Preload",this.url);const e=await Tr.download(this.url,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(Es&&console.log("[AssetReference] loadAssetAsync",this.url),!this.mustLoad)return this.asset?.parent&&console.warn(`[AssetReference] "${this.urlName}" is already loaded and parented to "${this.asset.parent.name||"scene"}". loadAssetAsync() returns the same shared instance \u2014 use .instantiate() to create a new copy.`),this.asset;if(e&&this._progressListeners.push(e),this._loadingPromise!==null)return this._loadingPromise.then(n=>this.asset);const t=z.Current;if(this._rawBinary){if(!(this._rawBinary instanceof ArrayBuffer))return console.error("[AssetReference] Failed loading \u2013 Invalid data. Must be of type ArrayBuffer. "+typeof this._rawBinary),null;this._loadingPromise=Mn().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else Es&&console.log("Load async",this.url),this._loadingPromise=Mn().loadSync(t,this.url,this.url,null,n=>{this.raiseProgressEvent(n)});this._loadingPromise.finally(()=>this._loadingPromise=null);const i=await this._loadingPromise;return this._progressListeners.length=0,this._glbRoot=this.tryGetActualGameObjectRoot(i),i?(i[Jg]=this,this._glbRoot&&(this._glbRoot[Jg]=this),this.asset&&(this.asset[Jg]=this),Uu(t),i.scene!==void 0&&(this._rawAsset=i),this.asset):null}instantiate(e){return this.onInstantiate(e,!1)}instantiateSynced(e,t=!0){return this.onInstantiate(e,!0,t)}beginListenDownload(e){this._progressListeners.indexOf(e)<0&&this._progressListeners.push(e)}endListenDownload(e){const t=this._progressListeners.indexOf(e);t>=0&&this._progressListeners.splice(t,1)}raiseProgressEvent(e){for(const t of this._progressListeners)t(this,e)}static currentlyInstantiating=new Map;async onInstantiate(e,t=!1,i){const n=z.Current,s=new qn;if(e instanceof M?s.parent=e:e&&(Object.assign(s,e),s.cloneAssign(e)),s.parent===void 0&&(s.parent=n.scene),this.mustLoad&&await this.loadAssetAsync(),Es&&console.log("Instantiate",this.url,"parent:",e),this.asset){Es&&console.log("Add to scene",this.asset);let r=ne.currentlyInstantiating.get(this.url);if(r!==void 0&&r>=1e4)return console.error("Recursive or too many instantiations of "+this.url+" in the same frame ("+r+")"),null;try{if(r===void 0&&(r=0),r+=1,ne.currentlyInstantiating.set(this.url,r),t){s.context=n;const a=this.asset;this.url&&(a.guid=this.url);const l=Hg(a,s,void 0,i);if(l)return l}else{const a=Nr(this.asset,s);if(a)return a}}finally{n.post_render_callbacks.push(()=>{r===void 0||r<0?r=0:r-=1,ne.currentlyInstantiating.set(this.url,r)})}}else Es&&console.warn("Failed to load asset",this.url);return null}tryGetActualGameObjectRoot(e){if(e&&e.scene){const t=e.scene;if(t.isGroup&&t.children.length===1&&t.children[0].name+"glb"===t.name){const i=t.children[0];return i.animations=t.animations,i}else return t}return null}}class fM extends en{constructor(){super([ne],"AssetReferenceSerializer")}onSerialize(e,t){if(e&&e.uri!==void 0&&typeof e.uri=="string")return e.uri}onDeserialize(e,t){if(typeof e=="string")return t.context?t.gltfId?ne.getOrCreate(t.gltfId,e,t.context):(console.error("Missing source id"),null):(console.error("Missing context"),null);if(e instanceof M){if(!t.context)return console.error("Missing context"),null;if(!t.gltfId)return console.error("Missing source id"),null;const i=e,n=t.context,s=i.guid??i.uuid,r=n.addressables.findAssetReference(s);if(r)return r;const a=new ne(s,void 0,i);return n.addressables.registerAssetReference(a),a}return null}}new fM;const yM=Promise.resolve(null);class Ra{static imageReferences=new Map;static getOrCreate(e){let t=Ra.imageReferences.get(e);return t||(t=new Ra(e),Ra.imageReferences.set(e,t)),t}constructor(e){this.url=e}url;_bitmap;_bitmapObject;dispose(){this._bitmapObject&&this._bitmapObject.close(),this._bitmap=void 0}createHTMLImage(){const e=new Image;return e.src=this.url,e}loader=null;createTexture(){return this.url?(this.loader||(this.loader=new vr),this.loader.setCrossOrigin("anonymous"),this.loader.loadAsync(this.url).then(e=>(e&&!e.name?.length&&(e.name=this.url.split("/").pop()??this.url),e))):(console.error("Can not load texture without url"),yM)}getBitmap(){return this._bitmap?this._bitmap:(this._bitmap=new Promise((e,t)=>{const i=document.createElement("img");i.addEventListener("load",()=>{this._bitmap=createImageBitmap(i).then(n=>(this._bitmapObject=n,e(n),n))}),i.addEventListener("error",n=>{console.error("Failed to load image:"+this.url,n),e(null)}),i.src=this.url}),this._bitmap)}}class Fv extends en{constructor(){super([Ra],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=Fo(t.gltfId,e);return Ra.getOrCreate(i)}}}new Fv;class Ta{static cache=new Map;static getOrCreate(e){let t=Ta.cache.get(e);return t||(t=new Ta(e),Ta.cache.set(e,t)),t}async loadRaw(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.blob())}async loadText(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.text())}url;res;constructor(e){this.url=e}}class Uv extends en{constructor(){super([Ta],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=Fo(t.gltfId,e);return Ta.getOrCreate(i)}}}new Uv;var ef=(o=>(o.Visible="application-visible",o.Hidden="application-hidden",o.MuteChanged="application-mutechanged",o))(ef||{});let Lc=!1;const Ar=[];function Ir(){if(Lc)return;A()&&console.debug("[Needle Engine] User input registered: Media playback is now allowed."),Lc=!0;const o=[...Ar];Ar.length=0,o.forEach(e=>e())}document.addEventListener("mousedown",Ir),document.addEventListener("pointerup",Ir),document.addEventListener("click",Ir),document.addEventListener("dragstart",Ir),document.addEventListener("touchend",Ir),document.addEventListener("keydown",Ir),typeof window<"u"&&"userActivation"in navigator&&navigator.userActivation?.isActive&&(A()&&console.debug("[Needle Engine] User input already active: Media playback is now allowed."),Ar.length=0,Lc=!0);class Gn extends EventTarget{static get userInteractionRegistered(){return Lc}static registerWaitForAllowAudio=Gn.registerWaitForInteraction;static registerWaitForInteraction(e){if(e!==null){if(Lc){e();return}Ar.indexOf(e)===-1&&Ar.push(e)}}static unregisterWaitForInteraction(e){const t=Ar.indexOf(e);t!==-1&&Ar.splice(t,1)}_mute=!1;get muted(){return this._mute}set muted(e){e!==this._mute&&(this._mute=e,this.dispatchEvent(new Event("application-mutechanged")))}context;get hasFocus(){return document.hasFocus()}get isVisible(){return this._isVisible}_isVisible=!0;constructor(e){super(),this.context=e,window.addEventListener("visibilitychange",this.onVisiblityChanged.bind(this),!1)}onVisiblityChanged(e){switch(e.target.visibilityState){case"hidden":this._isVisible=!1,this.dispatchEvent(new Event("application-hidden"));break;case"visible":this._isVisible=!0,this.dispatchEvent(new Event("application-visible"));break}}}function*tf(o,e=null){const t=e?e.time:z.Current.time,i=t.time;for(;t.time-i<o;)yield}function*bM(o){for(let e=0;e<o;e++)yield}function*zv(o){let e=!0;for(o.then(()=>e=!1),o.catch(()=>e=!1);e;)yield}var Za=(o=>(o[o.Quad=0]="Quad",o[o.Cube=1]="Cube",o[o.Sphere=2]="Sphere",o[o.Cylinder=3]="Cylinder",o[o.RoundedCube=10]="RoundedCube",o))(Za||{});class Rs{static createText(e,t){let i=null;const n=t?.font||vM(t?.familyFamily||null);n instanceof kP?i=this.#t(e,n,t):i==null&&(i=new Ji);const s=t?.color||16777215,r=new H(i,t?.material??new yt({color:s}));return this.applyDefaultObjectOptions(r,t),n instanceof Promise?n.then(a=>{r.geometry=this.#t(e,a,t),t?.onGeometry&&t.onGeometry(r)}):t?.onGeometry&&t.onGeometry(r),r}static#t(e,t,i){const n=i?.depth||.1;return new MP(e,{font:t,size:1,depth:n,height:n,bevelEnabled:i?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})}static createOccluder(e){const t=new Ce({colorWrite:!1,depthWrite:!0,side:Ii});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let i;const n=t?.color||16777215;switch(e){case"Quad":case 0:{const s=new Pn(1,1,1,1),r=t?.material??new yt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Quad"}break;case"Cube":case 1:{const s=new Da(1,1,1),r=t?.material??new yt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cube"}break;case 10:case"RoundedCube":{const s=_M(1,1,1,.1,2),r=t?.material??new yt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="RoundedCube"}break;case"Sphere":case 2:{const s=new Id(.5,16,16),r=t?.material??new yt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Sphere"}break;case"Cylinder":case 3:{const s=new Ib(.5,.5,1,32),r=t?.material??new yt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cylinder"}break;case"ShaderBall":i=new Mo,i.name="ShaderBall",wM(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const t=new hC({color:16777215});e?.texture&&"map"in t&&(t.map=e.texture);const i=new dC(t);return this.applyDefaultObjectOptions(i,e),i}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t?.name&&(e.name=t.name),t?.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x||0,t.position.y||0,t.position.z||0)),t?.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x||0,t.rotation.y||0,t.rotation.z||0)),t?.scale&&(typeof t.scale=="number"?e.scale.set(t.scale,t.scale,t.scale):Array.isArray(t.scale)?e.scale.set(t.scale[0],t.scale[1],t.scale[2]):e.scale.set(t.scale.x||1,t.scale.y||1,t.scale.z||1)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t?.parent&&t.parent.add(e)}}function _M(o,e,t,i,n){const s=new uC,r=1e-5,a=i-r;s.absarc(r,r,r,-Math.PI/2,-Math.PI,!0),s.absarc(r,e-a*2,r,Math.PI,Math.PI/2,!0),s.absarc(o-a*2,e-a*2,r,Math.PI/2,0,!0),s.absarc(o-a*2,r,r,0,-Math.PI/2,!0);const l=new pC(s,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(c,h)=>{const d=[];for(let p=0;p<h.length;p+=3)d.push(new K(h[p]/o,h[p+1]/e));return d},generateSideWallUV:(c,h,d,p,m,f)=>{const g=[];return g.push(new K(h[d]/o,h[d+1]/e)),g.push(new K(h[p]/o,h[p+1]/e)),g.push(new K(h[m]/o,h[m+1]/e)),g.push(new K(h[f]/o,h[f+1]/e)),g}}});return l.scale(1,1,1-i),l.center(),l.index||l.setIndex(Array.from({length:l.attributes.position.count},(c,h)=>h)),l.computeVertexNormals(),l}const fu=new Map;function vM(o){let e="";switch(o){default:case"OpenSans":e="https://cdn.needle.tools/static/fonts/facetype/Open Sans_Regular_ascii.json";break;case"Helvetiker":e="https://cdn.needle.tools/static/fonts/facetype/Helvetiker_Regular_ascii.json";break}if(fu.has(e)){const n=fu.get(e);if(n)return n}const t=new EP,i=new Promise((n,s)=>{t.load(e,r=>{fu.set(e,r),n(r)},void 0,s)});return fu.set(e,i),i}let nf=!1,of=null;function wM(o,e){if(of===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new Do,n=Qm(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),nf=!0,of=i.loadAsync(t).then(s=>{const r=s.scene;return r.position.y-=.5,r}).catch(s=>(console.warn("Failed to load shaderball mesh: "+s.message),Wv())).finally(()=>{nf=!1})}if(nf){const t=Wv();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&Nv(i,e),o.add(t)}of.then(t=>{o.children.forEach(s=>{s.name==="ShaderBall-Placeholder"&&o.remove(s)});const i=t.clone(),n=i.children[0];n?.type==="Mesh"&&(n.geometry.attributes.tangent||n.geometry.computeTangents(),Nv(n,e)),o.add(i)})}function Nv(o,e){if(e?.color||e?.material||e?.texture){const t=e?.material??o.material?.clone()??new yt;e.color&&"color"in t&&t.color instanceof oe&&t.color.set(e.color),e?.texture&&"map"in t&&(t.map=e.texture),o.material=t}}function Wv(){return new Mo().add(Rs.createPrimitive("Sphere",{material:new Ce({transparent:!0,opacity:.1})}))}const Qe=w("debuginput");var yu=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(yu||{}),Ae=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Ae||{});class zo extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new Eo(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}_ray;space;isClick=!1;isDoubleClick=!1;get used(){return this._used}_used=!1;use(){this._used=!0}get pointerId(){return this._pointerid}_pointerid;get pointerType(){return this._pointerType}_pointerType;buttonName=void 0;get type(){return this._type}_type;metadata={};intersections=new Array;constructor(e,t,i){super(e,i),this.clientZ=i.clientZ,this._pointerid=i.pointerId,this._pointerType=i.pointerType,this._type=e,this.deviceIndex=i.deviceIndex,this.origin=i.origin,this.source=t,this.mode=i.mode,this._ray=i.ray,this.space=i.device,this.buttonName=i.buttonName}_immediatePropagationStopped=!1;get immediatePropagationStopped(){return this._immediatePropagationStopped}_propagationStopped=!1;get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}stopPropagation(){this._propagationStopped=!0,super.stopPropagation(),this.source?.stopPropagation(),Qe&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class Dc extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class xM{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var yi=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(yi||{});class Vv{_eventListeners={};addEventListener(e,t,i){if(this._eventListeners[e]||(this._eventListeners[e]=[]),!t||typeof t!="function"){console.error("Invalid call to addEventListener: callback is required and must be a function!");return}i?i={...i}:i={};let n=0;i?.queue!=null&&(n=i.queue);const s=this._eventListeners[e],r=s.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(s.push({priority:n,listeners:[{callback:t,options:i}]}),s.sort((a,l)=>a.priority-l.priority))}removeEventListener(e,t,i){if(!this._eventListeners[e]||!t)return;const n=this._eventListeners[e];if(i?.queue!=null){const s=n.find(a=>a.priority===i.queue);if(!s)return;const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}else for(const s of n){const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}}dispatchEvent(e){let t=!1;if(e instanceof Dc){const i=this._eventListeners[e.type];if(i)for(const n of i)for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}if(e instanceof zo){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}if(e.immediatePropagationStopped){t=!0,Qe&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,Qe&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const s of e)if(i===s){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new K];_pointerPositionsLastFrame=[new K];_pointerPositionsDelta=[new K];_pointerPositionsRC=[new K];_pointerPositionDown=[new b];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":Qe&&ke("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":Qe&&ke("Create Pointer move"),this.onMove(e);break;case"pointerup":Qe&&ke("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}constructor(e){this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}_htmlEventSource;bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){for(const e in this._eventListeners)this._eventListeners[e].length=0;window.removeEventListener("contextmenu",this.onContextMenu),this._htmlEventSource?.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),this._htmlEventSource?.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}onLostFocus=()=>{for(const e in this.keysPressed)this.keysPressed[e].pressed=!1};_receivedPointerMoveEventsThisFrame=new Array;onEndOfFrame=()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let e=0;e<this._pointerUp.length;e++)this._pointerUp[e]=!1;for(let e=0;e<this._pointerDown.length;e++)this._pointerDown[e]=!1;for(let e=0;e<this._pointerClick.length;e++)this._pointerClick[e]=!1;for(let e=0;e<this._pointerDoubleClick.length;e++)this._pointerDoubleClick[e]=!1;for(const e of this._pointerPositionsDelta)e.set(0,0);for(let e=0;e<this._mouseWheelChanged.length;e++)this._mouseWheelChanged[e]=!1;for(let e=0;e<this._mouseWheelDeltaY.length;e++)this._mouseWheelDeltaY[e]=0};canReceiveInput(e){return e.target===this.context.renderer?.domElement||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&I.isMozillaXR()?!0:(Qe&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)};keysPressed={};onKeyDown=e=>{if(Qe&&console.log(`key down ${e.code}, ${this.context.application.hasFocus}`,e),!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(t&&t.pressed)return;this.keysPressed[e.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:e.key,code:e.code};const i=new Dc("keydown",e,e);this.onDispatchEvent(i)};onKeyPressed=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!0,t.frame=this.context.time.frameCount+1;const i=new Dc("keypress",e,e);this.onDispatchEvent(i)};onKeyUp=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!1,t.frame=this.context.time.frameCount+1;const i=new Dc("keyup",e,e);this.onDispatchEvent(i)};onWheelWindow=e=>{document.pointerLockElement&&this.onMouseWheel(e)};onMouseWheel=e=>{if(this.canReceiveInput(e)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const t=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=t+e.deltaY};onPointerDown=e=>{if(this.context.isInAR||this.canReceiveInput(e)===!1)return;if(e.target instanceof HTMLElement)try{e.target.setPointerCapture(e.pointerId)}catch{}const t=this.getPointerId(e);Qe&&ke(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new zo("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:i,pressure:e.pressure});this.onDown(n)};onPointerMove=e=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(e.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(e.pointerId);let t=e.button;e.pointerType==="mouse"&&(t=this.getFirstPressedButtonForPointer(0)??0);const i=this.getPointerId(e,t);t===-1&&(t=i);const n=this.getAndUpdateSpatialObjectForScreenPosition(i,e.clientX,e.clientY),s=new zo("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:i,button:t,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:n,pressure:e.pressure});this.onMove(s)};onPointerCancel=e=>{this.context.isInAR||(Qe&&console.log("Pointer cancel",e),this.onPointerUp(e))};onPointerUp=e=>{if(this.context.isInAR)return;e.target instanceof HTMLElement&&e.target.releasePointerCapture(e.pointerId);const t=this.getPointerId(e),i=new zo("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),pressure:e.pressure});this.onUp(i),this._pointerIds[t]=-1,Qe&&console.log("ID="+t,"PointerId="+e.pointerId,"ALL:",[...this._pointerIds])};getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}onTouchStart=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new zo("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onDown(r)}};onTouchMove=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new zo("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onMove(r)}};onTouchEnd=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=new zo("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(s),this._pointerIds[n]=-1}};tempNearPlaneVector=new b;tempFarPlaneVector=new b;tempLookMatrix=new J;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new M,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const s=this.context.mainCamera;if(s){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(s),a.unproject(s);const l=s.worldUp||F(0,1,0).applyQuaternion(_e(s));this.tempLookMatrix.lookAt(a,r,l),n.position.set(r.x,r.y,r.z),n.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return n}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),i=e.clientX,n=e.clientY,s=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return Qe&&!s&&console.log("Not in rect",t,i,n),s}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)){Qe&&console.warn(`Received pointerDown event for pointerId that is already pressed: ${t}/${e.button}`,Qe?e:"");return}if(Qe&&console.log(e.pointerType,"DOWN",t,e.button),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new b);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new K);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){Qe&&console.warn(`Received pointerUp for pointerId that is not pressed: ${t}/${e.button}`,Qe?e:"");return}Qe&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let a=this._pointerEventsPressed.length-1;a>=0;a--)if(this._pointerEventsPressed[a].pointerId===t){this._pointerEventsPressed.splice(a,1);break}if(!this._pointerPositionDown[t]){Qe&&be("[Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const i=this._pointerUpTime[t],n=this._pointerDownTime[t],s=this.context.time.realtimeSinceStartup,r=s-n;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=s,r<1){let a=e.clientX-this._pointerPositionDown[t].x,l=e.clientY-this._pointerPositionDown[t].y,c=0;if(e.isSpatial&&e.clientZ!=null&&(c=e.clientZ-this._pointerPositionDown[t].z,a*=200,l*=200,c*=200),Math.abs(a)<5&&Math.abs(l)<5&&Math.abs(c)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const h=s-i;Qe&&console.log("CLICK",t,a,l,c,h),h<this._doubleClickTimeThreshold&&h>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new K);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new K);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new K);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let s=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const h=e.source;s===0&&h.movementX!==0&&(s=h.movementX||0),r===0&&h.movementY!==0&&(r=h.movementY||0)}n.x+=s,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new K);const c=this._pointerPositionsRC[t];c.set(a,l),this.convertScreenspaceToRaycastSpace(c)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(Qe&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=z.Current;try{z.Current=this.context,this.dispatchEvent(e)}finally{z.Current=t}}}const $v=w("debugexr")||w("debugpmrem");class Lm{get name(){return"NEEDLE_pmrem"}parser;constructor(e){this.parser=e}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if(!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=i.options.ktx2Loader;return r?($v&&console.log("NEEDLE_pmrem.loadTexture",e,s),i.loadTextureImage(e,s.source,r).then(a=>(Lm.postprocess(a),a.name="PMREM_"+a.name,$v&&console.log("NEEDLE_pmrem: loaded PMREM texture",a),a))):(console.warn("NEEDLE_pmrem: No KTX2Loader available on GLTFLoader \u2014 cannot load PMREM texture"),null)}static postprocess(e){return e.mapping=Ro,e}}const Hv="NEEDLE_lightmaps",Ka=w("debuglightmapsextension")||w("debuglightmaps");var no=(o=>(o[o.Lightmap=0]="Lightmap",o[o.Skybox=1]="Skybox",o[o.Reflection=2]="Reflection",o))(no||{});class SM{get name(){return Hv}parser;registry;source;constructor(e,t,i){this.parser=e,this.registry=t,this.source=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[Hv];if(i){const n=i.textures;return n?.length?(Ka&&console.log(i),new Promise(async(s,r)=>{const a=[];for(const c of n)if(c.pointer){Ka&&console.log(c);let h=null;if(c.pointer.startsWith("/textures/")||c.pointer.startsWith("textures/"))Ka&&console.log("Load texture from gltf",c.pointer),h=qg(this.parser,c.pointer).then(d=>this.resolveTexture(c,d));else if(typeof c.pointer=="string"){Ka&&console.log("Load texture from path",c.pointer);const d=Fo(this.source,c.pointer),p=d.endsWith(".pmrem.ktx2");let m;d.endsWith(".exr")?m=new Ym(this.parser.options.manager):d.endsWith(".hdr")?m=new Xb(this.parser.options.manager):p?m=this.parser.options.ktx2Loader:m=new vr(this.parser.options.manager),h=m.loadAsync(d,void 0).then(f=>(p&&f&&Lm.postprocess(f),this.resolveTexture(c,f)))}else c.pointer;h&&a.push(h)}const l=await hg(a);l?.anyFailed&&(A()||Ka)&&console.error("[NEEDLE_lightmaps]Error during extension loading:",l),s()})):null}}return null}resolveTexture(e,t){const i=t;Ka&&console.log("Light Texture loaded:",i),i?.isTexture&&(this.registry?(i.colorSpace=To,this.registry.registerTexture(this.source,e.type,i,e.index)):console.log(no[e.type],e.pointer,i))}}const Ja=!!w("debuglightmaps");class CM{context;map=new Map;clear(){this.map.clear()}constructor(e){this.context=e}registerTexture(e,t,i,n){Ja&&console.log("Registering ",no[t]+' "'+e+'"',i),this.map.has(e)||this.map.set(e,new Map);const s=this.map.get(e),r=s?.get(t)??[];r.length<n&&(r.length=n+1),Fw(i,!1),r[n]=i,s?.set(t,r)}tryGetLightmap(e,t=0){return this.tryGet(e,no.Lightmap,t)}tryGetSkybox(e){return Ja&&console.log("[Get Skybox]",e,this.map),this.tryGet(e,no.Skybox,0)}tryGetReflection(e){return Ja&&console.log("[Get Reflection]",e,this.map),this.tryGet(e,no.Reflection,0)}tryGet(e,t,i){if(!e)return Ja&&console.warn("Missing source id"),null;const n=this.map.get(e);if(!n)return Ja&&console.warn(`[Lighting] No ${no[t]} texture entry for`,e),null;const s=n.get(t);return s===void 0?(Ja&&console.warn(`[Lighting] No ${no[t]} texture for`,e,"index",i),null):!s?.length||s.length<=i?null:s[i]}}Jt.lights_fragment_maps=Jt.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
|
|
248
|
+
vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );
|
|
249
|
+
// The range of RGBM lightmaps goes from 0 to 34.49 (5^2.2) in linear space, and from 0 to 5 in gamma space.
|
|
250
|
+
lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
|
|
251
|
+
lightMapTexel.a = 1.;
|
|
252
|
+
lightMapTexel = conv_sRGBToLinear(lightMapTexel);
|
|
253
|
+
`),Jt.lightmap_pars_fragment=`
|
|
254
|
+
#ifdef USE_LIGHTMAP
|
|
255
|
+
uniform sampler2D lightMap;
|
|
256
|
+
uniform float lightMapIntensity;
|
|
257
|
+
|
|
258
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
259
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
260
|
+
return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );
|
|
261
|
+
}
|
|
262
|
+
#endif
|
|
263
|
+
`,Jt.lights_fragment_begin=Jt.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
|
|
264
|
+
#if defined(USE_LIGHTMAP)
|
|
265
|
+
irradiance += 0.;
|
|
266
|
+
#else
|
|
267
|
+
irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
|
|
268
|
+
#endif`);const sf=w("debugprogressive"),bu=new Nt,_u=new Ld;class PM{static GLTF_PROGRESSIVE_LODSMANAGER_TYPE=xr;context;_lodsManager;_settings={};get manager(){return this._lodsManager}get skinnedMeshAutoUpdateBoundsInterval(){return this._lodsManager?.skinnedMeshAutoUpdateBoundsInterval||this._settings.skinnedMeshAutoUpdateBoundsInterval||0}set skinnedMeshAutoUpdateBoundsInterval(e){this._settings.skinnedMeshAutoUpdateBoundsInterval=e,this.applySettings()}get targetTriangleDensity(){return this._lodsManager?.targetTriangleDensity||this._settings.targetTriangleDensity||2e5}set targetTriangleDensity(e){this._settings.targetTriangleDensity=e,this.applySettings()}constructor(e){this.context=e}applySettings(){if(this._lodsManager)for(const e in this._settings)this._lodsManager[e]=this._settings[e]}setRenderer(e){this._lodsManager?.disable(),xr.removePlugin(this),xr.addPlugin(this),xr.debugDrawLine=B.DrawLine,this._lodsManager=xr.get(e,{engine:"needle-engine"}),this.applySettings(),this._lodsManager.enable()}disable(){this._lodsManager?.disable(),xr.removePlugin(this)}onAfterUpdatedLOD(e,t,i,n,s){sf&&this.onRenderDebug(i,n,s)}onRenderDebug(e,t,i){if(!t.geometry||!He.hasLODLevelAvailable(t.geometry)&&!He.hasLODLevelAvailable(t.material))return;const n=xr.getObjectLODState(t);if(!n)return;let s=i.mesh_lod;const r=i.mesh_lod!=n.lastLodLevel_Mesh||i.texture_lod!=n.lastLodLevel_Texture;if(sf&&t.geometry.boundingSphere){const a=t.geometry.boundingSphere;_u.copy(a),_u.applyMatrix4(t.matrixWorld);const l=_u.center,c=_u.radius,h=["#76c43e","#bcc43e","#c4ac3e","#c4673e","#ff3e3e"];if(r)B.DrawWireSphere(l,c,h[s],.1);else{const d=t.geometry.index?.count??0,p=He.getMeshLODExtension(t.geometry)?.lods;s=p?Math.min(p?.length-1,s):0;let m="";if(p&&n.lastScreenCoverage>0)for(let y=0;y<p.length;y++){const _=p[y].density,v=y==p.length-1;m+=_.toFixed(0)+">"+(_/n.lastScreenCoverage).toFixed(0)+(v?"":",")}const f=p?p[s]?.density:-1;let g="LOD "+i.mesh_lod+`
|
|
269
|
+
TEX `+i.texture_lod;if(sf=="density"&&(g+=`
|
|
270
|
+
`+d+` tris
|
|
271
|
+
`+(f/n.lastScreenCoverage).toFixed(0)+` dens
|
|
272
|
+
`+(n.lastScreenCoverage*100).toFixed(1)+`% cov
|
|
273
|
+
`+(n.lastCentrality*100).toFixed(1)+`% centr
|
|
274
|
+
`+(bu.min.x.toFixed(2)+"-"+bu.max.x.toFixed(2)+"x"+bu.min.y.toFixed(2)+"-"+bu.max.y.toFixed(2))+" scr"),n.lastScreenCoverage>.1){const y=e,_=y.worldForward,v=y.worldPosition,C=F(_).multiplyScalar(c*.7).add(l),O=C.distanceTo(v),k=h[Math.min(h.length-1,Math.max(0,s))]+"88",j=this.context.domHeight>0?screen.height/this.context.domHeight:1,L=e.isPerspectiveCamera?Math.tan(e.fov*Math.PI/180/2):1;B.DrawLabel(C,g,O*.012*j*L,void 0,16777215,k)}}}}}const rf={};function af(o,e){rf[o]=e}function Gv(o){const e=o.getBufferIdentifier(),t=rf[e];return t(o)}function qv(o){return typeof o.guid=="function"?o.guid():null}function jc(o){const e=[],t={MODULE:void 0,MAYBEMODULE:null,ready(){return t.MODULE?Promise.resolve(t.MODULE):new Promise(i=>{e.push(i)})},async load(){if(t.MODULE)return t.MODULE;const i=await o();t.MODULE=i,t.MAYBEMODULE=i;for(const n of e)n(i);return e.length=0,i}};return t}const T={MaterialX:jc(()=>import("./materialx-qPScBWhj.min.js")),RAPIER_PHYSICS:jc(()=>import("./rapier-DJ-luMxr.min.js")),POSTPROCESSING:jc(()=>import("./postprocessing-B_9sKVU7.min.js").then(o=>o.index)),POSTPROCESSING_AO:jc(()=>import("./postprocessing-B_9sKVU7.min.js").then(o=>o.N8AO)),PEERJS:jc(()=>import("./vendor-HRlxIBga.min.js").then(o=>o.bundler))};let lf;function OM(){return lf}function kM(o){lf=o}async function Xv(o,e){const t=(await T.PEERJS.load()).default;return e||(e={}),e={...lf,...e},o?new t(o,e):new t(e)}async function Qv(){const o=await T.PEERJS.load();return o.default===void 0?o:o.default}class Yv{get isHost(){return this._host!==void 0}_host;_client;_clientData;constructor(){this.onEnable()}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await Qv(),i=new t(e);i.on("error",n=>{console.error(n),this._host=void 0,this.trySetupClient(e)}),i.on("open",n=>{this._host=new EM(i)})}async trySetupClient(e){const t=await Qv();this._client=new t,this._client.on("error",i=>{console.error("Client error",i)}),this._client.on("open",i=>{console.log("client connected",i),this._clientData=this._client.connect(e,{metadata:{id:i}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",n=>{console.log("<<",n)})})}}class MM{_peer;constructor(e){this._peer=e}}class EM extends MM{get isHost(){return!0}_connections=[];constructor(e){super(e),console.log("I AM THE HOST"),this._peer?.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(i=>i.metadata?.id).filter(i=>i!==void 0);this.broadcast({type:"connection-list",connections:t})}broadcast(e){if(e!=null){console.log(">>",e);for(const t in this._peer.connections){const i=this._peer.connections[t];if(i)if(Array.isArray(i))for(const n of i)n&&n.send(e);else console.warn(i)}}}}const Zv="https://urls.needle.tools/default-networking-backend/index";let tn="wss://networking-2.needle.tools/socket";const bi=!!w("debugnet"),el=!!(bi||w("debugowner")),vu=w("debugnetbin");var Kv=(o=>(o.ConnectionInfo="connection-start-info",o))(Kv||{}),ie=(o=>(o.Join="join-room",o.Leave="leave-room",o.JoinedRoom="joined-room",o.LeftRoom="left-room",o.UserJoinedRoom="user-joined-room",o.UserLeftRoom="user-left-room",o.RoomStateSent="room-state-sent",o))(ie||{});class RM{room;viewId;allowEditing;inRoom}class TM{room}class AM{userId}var Jv=(o=>(o.RequestHasOwner="request-has-owner",o.ResponseHasOwner="response-has-owner",o.RequestIsOwner="request-is-owner",o.ResponseIsOwner="response-is-owner",o.RequestOwnership="request-ownership",o.GainedOwnership="gained-ownership",o.RemoveOwnership="remove-ownership",o.LostOwnership="lost-ownership",o.GainedOwnershipBroadcast="gained-ownership-broadcast",o.LostOwnershipBroadcast="lost-ownership-broadcast",o))(Jv||{});class cf{guid;connection;get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}_hasOwnership=!1;_isOwned=void 0;_gainSubscription;_lostSubscription;_hasOwnerResponse;_pendingOwnershipResolve=null;constructor(e,t){this.connection=e,this.guid=t,this._gainSubscription=this.onGainedOwnership.bind(this),this._lostSubscription=this.onLostOwnership.bind(this),e.beginListen("lost-ownership",this._lostSubscription),e.beginListen("gained-ownership-broadcast",this._gainSubscription),this._hasOwnerResponse=this.onHasOwnerResponse.bind(this),e.beginListen("response-has-owner",this._hasOwnerResponse)}_isWaitingForOwnershipResponseCallback=null;updateIsOwned(){this.connection.send("request-has-owner",{guid:this.guid})}onHasOwnerResponse(e){e.guid===this.guid&&(this._isOwned=e.value)}requestOwnershipIfNotOwned(){return this._isWaitingForOwnershipResponseCallback!==null?this:(this._isWaitingForOwnershipResponseCallback=this.waitForHasOwnershipRequestResponse.bind(this),this.connection.beginListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this.connection.send("request-has-owner",{guid:this.guid}),this)}waitForHasOwnershipRequestResponse(e){e.guid===this.guid&&(this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._isOwned=e.value,e.value||(el&&console.log("request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid})))}requestOwnership(){return this._hasOwnership?Promise.resolve(!0):(this._pendingOwnershipResolve?.(!1),this._pendingOwnershipResolve=null,el&&console.log("Request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid}),new Promise(e=>{this._pendingOwnershipResolve=e,setTimeout(()=>{this._pendingOwnershipResolve===e&&(this._pendingOwnershipResolve=null,e(!1))},2e3)}))}async requestOwnershipAsync(){return el&&console.log("Request ownership",this.guid),this.connection.send("request-ownership",{guid:this.guid}),this}freeOwnership(){return this.connection.send("remove-ownership",{guid:this.guid}),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this}destroy(){this.connection.stopListen("gained-ownership",this._gainSubscription),this.connection.stopListen("lost-ownership",this._lostSubscription),this.connection.stopListen("response-has-owner",this._hasOwnerResponse),this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._pendingOwnershipResolve?.(!1),this._pendingOwnershipResolve=null}onGainedOwnership(e){e.guid===this.guid&&(this._isOwned=!0,this.connection.connectionId===e.owner?(el&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0,this._pendingOwnershipResolve&&(this._pendingOwnershipResolve(!0),this._pendingOwnershipResolve=null)):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(el&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1,this._pendingOwnershipResolve&&(this._pendingOwnershipResolve(!1),this._pendingOwnershipResolve=null))}}class ew{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new Yv),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return bi}get isConnected(){return this.connected}get currentRoomName(){return this._currentRoomName}get allowEditing(){return this._currentRoomAllowEditing}get currentRoomViewId(){return this._currentRoomViewId}getViewOnlyUrl(){if(this.currentRoomViewId===null)return null;const e=new URL(window.location.href);return e.searchParams.set("view",this.currentRoomViewId),e.href}get isInRoom(){return this._isInRoom}get currentLatency(){return this._currentDelay}get currentServerUrl(){return this._ws?.url??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}_usersInRoomCopy=[];usersInRoom(e=null){e||(e=this._usersInRoomCopy),e.length=0;for(const t of this._currentInRoom)e.push(t);return e}joinRoom(e,t=!1){return e?e.length>1024?(console.error('Room name too long, can not join: "'+e+'". Max length is 1024 characters.'),!1):(this.isInRoom&&this.currentRoomName!==e&&console.warn("Needle Engine is already connected to a networking room. Connecting to multiple rooms is not supported"),this.connect(),bi&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},Rn.OnConnection),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}leaveRoom(e=null){return e||(e=this.currentRoomName),e?(this.send("leave-room",{room:e}),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}send(e,t=null,i=Rn.Queued){if(t===null&&(t={}),i===Rn.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,i)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){vu&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),this._ws?.send(e)}_defaultMessagesBuffer=[];_defaultMessagesBufferArray=[];sendBufferedMessagesNow(){if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const e=Object.keys(this._defaultMessagesBuffer).length;for(const i in this._defaultMessagesBuffer){const n=this._defaultMessagesBuffer[i];if(e<=1){this.sendWithWebsocket(n.key,n.value,Rn.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&bi&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const t=JSON.stringify(this._defaultMessagesBufferArray);this._ws?.send(t)}beginListen(e,t){return this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t),t}stopListening(e,t){return this.stopListen(e,t)}stopListen(e,t){if(!t||!this._listeners[e])return;const i=this._listeners[e].indexOf(t);i>=0&&this._listeners[e].splice(i,1)}beginListenBinary(e,t){return this._listenersBinary[e]||(this._listenersBinary[e]=[]),this._listenersBinary[e].push(t),t}stopListenBinary(e,t){if(!this._listenersBinary[e])return;const i=this._listenersBinary[e].indexOf(t);i>=0&&this._listenersBinary[e].splice(i,1)}netWebSocketUrlProvider;registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){if(this.connected&&e&&e!==tn)return Promise.reject("Can not connect to different server url. Please disconnect first.");if(this.connected)return Promise.resolve(!0);e&&console.debug("Connecting to user provided url "+e);const t=e||this.netWebSocketUrlProvider?.getWebsocketUrl();return t?tn=t:l_()&&(tn="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){this._ws?.close(),this._ws=void 0,tn=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}_listeners={};_listenersBinary={};connected=!1;channelId;_connectionId=null;_ws;_waitingForSocket={};_isInRoom=!1;_currentRoomName=null;_currentRoomViewId=null;_currentRoomAllowEditing=!0;_currentInRoom=[];_state={};_currentDelay=-1;_connectingToWebsocketPromise=null;connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{let i=!1;const n=c=>{i||(i=!0,e(c))};if(tn===void 0&&(console.log("Fetch default backend url: "+Zv),tn=await(await fetch(Zv)).text()),tn===void 0){n(!1);return}console.debug(`Connecting to networking backend on
|
|
275
|
+
`+tn);const s=await import("./vendor-HRlxIBga.min.js").then(c=>c.index),r=s.default?.WebsocketBuilder??s.WebsocketBuilder,a=s.default?.ExponentialBackoff??s.ExponentialBackoff,l=new r(tn).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,A()||bi?console.log(`Connected to networking backend
|
|
276
|
+
`+tn):console.debug("Connected to networking backend",tn),n(!0),this.onSendQueued(Rn.OnConnection)}).onClose(c=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let h="Websocket connection closed...";tn?.includes("/socket")||(h+=' Do you perhaps mean to connect to "/socket"?'),console.error(h)}).onError(c=>{console.error("Websocket connection failed..."),n(!1),fi.sendEvent(this.context,"networking",{event:"connection_error"})}).onRetry(()=>{console.log("Retry connecting to networking websocket")}).build();l.addEventListener(s.WebsocketEvent.message,(c,h)=>{this.onMessage(c,h)})})}onMessage(e,t){const i=t.data;try{if(typeof i!="string"){i.size&&this.handleIncomingBinaryMessage(i);return}const n=JSON.parse(i);if(Array.isArray(n))for(const s of n)this.handleIncomingStringMessage(s);else this.handleIncomingStringMessage(n);return}catch(n){bi&&i==="pong"?console.log("<<",i):A()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){vu&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new qP(i),s=n.getBufferIdentifier(),r=this._listenersBinary[s],a=Gv(n),l=qv(a);if(l&&typeof l=="string"&&(this._state[l]=a),!r)return;const c=a??n;for(const h of r)h(c)}handleIncomingStringMessage(e){if(bi&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const r=e.data;r&&(console.assert(r.id!==void 0&&r.id!==null&&r.id.length>0,"server did not send connection id",r.id),console.debug("Your id is: "+r.id,this.context.alias??""),this._connectionId=r.id,fi.sendEvent(this.context,"networking",{event:"connected"}))}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(bi&&console.log(e),e){this._isInRoom=!0;const r=e;this._currentRoomName=r.room,this._currentRoomViewId=r.viewId,this._currentRoomAllowEditing=r.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...r.inRoom),(vu||A())&&console.debug("Joined Needle Engine Room: "+r.room);const a=new URL(window.location.href);a.searchParams.has("room")&&a.searchParams.delete("room"),a.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
|
|
277
|
+
${a.href}`)}this.onSendQueued(Rn.OnRoomJoin),fi.sendEvent(this.context,"networking",{event:"joined_room",room:this._currentRoomName});break;case"left-room":const n=e;n.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(vu||A())&&console.debug("Left Needle Engine Room: "+n.room)),fi.sendEvent(this.context,"networking",{event:"left_room",room:n.room});break;case"user-joined-room":if(e.data){const r=e.data;this._currentInRoom.push(r.userId),bi&&console.log(r.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const r=e.data,a=this._currentInRoom.indexOf(r.userId);a>=0&&(bi&&console.log(r.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(a,1)),r.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":bi&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const s=e.data?.time;s&&(this._currentDelay=this.context.time.time-s),bi&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+this._currentInRoom?.length);break}const t=e.data;t&&(this._state[t.guid]=t);let i=this._listeners[e.key];if(i){i=[...i];for(const n of i)try{n(e.data)}catch(s){console.error('Error invoking callback for "'+e.key+'"',s)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,i=Rn.OnRoomJoin){if(!this._ws){const s=this._waitingForSocket[i]||[];s.push(()=>this.sendWithWebsocket(e,t,i)),this._waitingForSocket[i]=s;return}const n=JSON.stringify(this.toMessage(e,t));bi&&console.log(">>",e),this._ws.send(n)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const i of t)i();t.length=0}}}const IM=w("debugplayerview");var No=(o=>(o.Browser="browser",o.Headset="headset",o.Handheld="handheld",o))(No||{});class tw{userId;context;viewDevice="browser";get currentObject(){return this._object}set currentObject(e){this._object=e}get isConnected(){return this.context.connection.userIsInRoom(this.userId)}removed=!1;_object;constructor(e,t){this.userId=e,this.context=t}}class iw{context;playerViews=new Map;constructor(e){this.context=e}setPlayerView(e,t,i){let n=this.playerViews.get(e);n||(n=new tw(e,this.context),this.playerViews.set(e,n)),n.viewDevice=i,n.currentObject=t,n.removed=!1}getPlayerView(e){if(!!e){if(!this.context.connection.userIsInRoom(e)){this.playerViews.delete(e);return}return this.playerViews.get(e)}}removePlayerView(e,t){const i=this.playerViews.get(e);i?.viewDevice===t&&(IM&&console.log("REMOVE",e),i.removed=!0,this.playerViews.delete(e))}}const Bc=new Uint8Array(4);Bc[0]=255,Bc[1]=255,Bc[2]=255,Bc[3]=255;const LM=new Fm(Bc,1,1,Dd);function hf(o,e=1){const t="alpha"in o,i=e*e,n=new Uint8Array(4*i),s=Math.floor(o.r*255),r=Math.floor(o.g*255),a=Math.floor(o.b*255);for(let c=0;c<i;c++){const h=c*4;n[h+0]=s,n[h+1]=r,n[h+2]=a,t?n[h+3]=Math.floor(o.alpha*255):n[h+3]=255}const l=new Fm(n,e,e);return l.needsUpdate=!0,l}function DM(o,e,t,i=1,n=3){const s=i*n,r=[o,e,t],a=r.length,l=new Uint8Array(4*a*s),c=new oe;for(let d=0;d<n;d++){const p=Math.floor(d/n*a),m=D.clamp(p+1,0,a-1),f=r[p],g=r[m],y=d/n*a%1;c.lerpColors(f,g,y);const _=Math.floor(c.r*255),v=Math.floor(c.g*255),C=Math.floor(c.b*255);for(let O=0;O<i;O++){const k=(d*i+O)*4;l[k+0]=_,l[k+1]=v,l[k+2]=C,l[k+3]=255}}const h=new Fm(l,i,n);return h.needsUpdate=!0,h}function wu(o,e){const t=o.elements;e||(e=[]),e.length=0;for(let i=0;i<16;i+=4){const n=t[i],s=t[i+1],r=t[i+2],a=t[i+3],l=new ye(n,s,r,a);e.push(l)}return e}const df=[],nw=[];function jM(o,e){if(df.length===0)for(let t=0;t<27;t++)df.push(0);e||(e=df);for(let t=0;t<27;t++)nw[t]=e[t];e=nw,o.unity_SHAr={value:new ye(e[9],e[3],e[6],e[0])},o.unity_SHBr={value:new ye(e[12],e[15],e[18],e[21])},o.unity_SHAg={value:new ye(e[10],e[4],e[7],e[1])},o.unity_SHBg={value:new ye(e[13],e[16],e[19],e[22])},o.unity_SHAb={value:new ye(e[11],e[5],e[8],e[2])},o.unity_SHBb={value:new ye(e[14],e[17],e[20],e[23])},o.unity_SHC={value:new ye(e[24],e[25],e[26],1)}}class BM{vertexShader;fragmentShader;technique;constructor(e,t,i){this.vertexShader=e,this.fragmentShader=t,this.technique=i}}async function FM(o,e){if(!o)return console.error("Can not find technique: no shader data"),null;const t=o.programs[e],i=t.vertexShader,n=t.fragmentShader;if(i!==void 0&&n!==void 0){const s=o.shaders[i],r=o.shaders[n];if(s.uri&&r.uri||s.code&&r.code){if(!s.code&&s.uri&&await ow(s),!r.code&&r.uri&&await ow(r),!s.code||!r.code)return null;const a=o.techniques[e];return new BM(s.code,r.code,a)}}return console.error("Shader technique not found",e),null}async function ow(o){const e=o.uri;if(e)if(e.endsWith(".glsl")){const t=await new Ab().loadAsync(e);o.code=t.toString()}else o.code=UM(o.uri)}function UM(o){return decodeURIComponent(Array.prototype.map.call(atob(o),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const Tn=w("debugenvlight");var tl=(o=>(o[o.Skybox=0]="Skybox",o[o.Trilight=1]="Trilight",o[o.Flat=3]="Flat",o[o.Custom=4]="Custom",o))(tl||{}),xu=(o=>(o[o.Skybox=0]="Skybox",o[o.Custom=1]="Custom",o))(xu||{});class sw{context;constructor(e){this.context=e,this.context.pre_update_callbacks.push(this.preUpdate.bind(this))}_currentLightSettingsId;_sceneLightSettings;get currentLightSettingsId(){return this._currentLightSettingsId}preUpdate(){const e=this.context.time;this._timevec4.x=e.time,this._timevec4.y=Math.sin(e.time),this._timevec4.z=Math.cos(e.time),this._timevec4.w=e.deltaTime}_timevec4=new ye;get timeVec4(){return this._timevec4}get environmentIntensity(){if(!this._sceneLightSettings||!this._currentLightSettingsId)return 1;const e=this._sceneLightSettings.get(this._currentLightSettingsId);return e?e.ambientIntensity:1}get sceneLightSettings(){return this._sceneLightSettings?.values()}enable(e){e instanceof ne&&(e=e.url);const t=this._sceneLightSettings?.get(e);return t?(Tn&&console.log("Enable scene light settings",e,t),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,t.enabled=!0,!0):(Tn&&console.warn("No light settings found for",e),!1)}disable(e){if(e instanceof ne&&(e=e.url),e==null)return!1;const t=this._sceneLightSettings?.get(e);return t?(Tn&&console.log("Disable scene light settings",e,t),t.enabled=!1,!0):!1}enableCurrent(){return this._currentLightSettingsId?(this.enable(this._currentLightSettingsId),this._currentLightSettingsId??null):null}disableCurrent(){if(this._currentLightSettingsId){const e=this._currentLightSettingsId;return this.disable(this._currentLightSettingsId),e}return null}internalRegisterSceneLightSettings(e){const t=e.sourceId;if(!t){console.error("Missing source id for scene light settings, can not register:",e);return}Tn&&console.log("Register "+e?.sourceId+" lighting",e),this._sceneLightSettings||(this._sceneLightSettings=new Map),this._sceneLightSettings.set(t,e)}internalUnregisterSceneLightSettings(e){const t=e.sourceId;if(!t){console.error("Missing source id for scene light settings, can not unregister:",e);return}Tn&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){Tn&&console.log("Register reflection",e,t);const i=new rw(this.context,t,1);this._lighting[e]=i}internalGetReflection(e){return this._lighting[e]}__currentReflectionId=null;internalEnableReflection(e){this.__currentReflectionId=e;const t=this._sceneLightSettings?.get(e);switch(Tn&&console.log("Enable reflection",e,t?tl[t.ambientMode]:"Unknown ambient mode",t),t?.ambientMode){case 0:case 4:const i=this.internalGetReflection(e);if(i&&i.Source){Tn&&console.log("Setting environment reflection",i);const n=this.context.scene,s=i.Source;return s.mapping!==Ro&&(s.mapping=Ao),n.environment=s,n.environmentIntensity=this.environmentIntensity||1,s}else Tn&&console.warn("Could not find reflection for source",e);break}if(t?.environmentReflectionSource===1)switch(t?.ambientMode){case 1:if(t.ambientTrilight){const i=t.ambientTrilight,n=DM(i[0],i[1],i[2],64,64);return n.colorSpace=Io,n.mapping=Ao,this.context.scene.environment=n,n}else console.error("Missing ambient trilight",t.sourceId);case 3:if(t.ambientLight){const i=hf(t.ambientLight,64);return i.colorSpace=Io,i.mapping=Ao,this.context.scene.environment=i,i}else console.error("Missing ambientlight",t.sourceId)}return null}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){Tn&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}Tn&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}_lighting={}}class rw{get Source(){return this._source}_source;constructor(e,t,i=1){this._source=t,t.mapping!==Ro&&(t.mapping=Ao)}}const aw=w("timescale");let uf=1;typeof aw=="number"&&(uf=aw);class lw{get time(){return this._time}set time(e){this._time=e}_time=0;get deltaTime(){return this._deltaTime}set deltaTime(e){this._deltaTime=e}_deltaTime=0;get deltaTimeUnscaled(){return this._deltaTimeUnscaled}_deltaTimeUnscaled=0;timeScale=1;get frame(){return this._frame}set frame(e){this._frame=e}_frame=0;get frameCount(){return this.frame}get realtimeSinceStartup(){return this.clock.elapsedTime}get fps(){return 1/this.deltaTime}get smoothedFps(){return this._smoothedFps}get smoothedDeltaTime(){return 1/this._smoothedFps}clock=new mC;_smoothedFps=0;_smoothedDeltaTime=0;_fpsSamples=[];_fpsSampleIndex=0;constructor(){typeof uf=="number"&&(this.timeScale=uf)}update(){this.deltaTime=this.clock.getDelta(),this.deltaTime=Math.min(.1,this.deltaTime),this._deltaTimeUnscaled=this.deltaTime,this.deltaTime<=0&&(this.deltaTime=1e-12),this.deltaTime*=this.timeScale,this.frame+=1,this.time+=this.deltaTime,this._fpsSamples.length<60?this._fpsSamples.push(this.deltaTime):this._fpsSamples[this._fpsSampleIndex++%60]=this.deltaTime;let e=0;for(let t=0;t<this._fpsSamples.length;t++)e+=this._fpsSamples[t];this._smoothedDeltaTime=e/this._fpsSamples.length,this._smoothedFps=1/this._smoothedDeltaTime}}let cw=!1;function hw(o){cw||(cw=!0,zM(),NM())}function zM(){const o=`
|
|
278
|
+
float startCompression = 0.8;
|
|
279
|
+
float desaturation = 0.5;
|
|
280
|
+
// Patched tonemapping function
|
|
281
|
+
vec3 NeutralToneMapping( vec3 color ) {
|
|
282
|
+
color *= toneMappingExposure;
|
|
283
|
+
|
|
284
|
+
float d = 1. - startCompression;
|
|
285
|
+
// float peak = dot(color, vec3(0.299, 0.587, 0.114));
|
|
286
|
+
float peak = max(color.r, max(color.g, color.b));
|
|
287
|
+
if (peak < startCompression) return color;
|
|
288
|
+
float newPeak = 1. - d * d / (peak + d - startCompression);
|
|
289
|
+
float invPeak = 1. / peak;
|
|
290
|
+
|
|
291
|
+
float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
|
|
292
|
+
|
|
293
|
+
color *= newPeak * invPeak;
|
|
294
|
+
float g = 1. - 3. / (desaturation * extraBrightness + 3.);
|
|
295
|
+
return mix(color, vec3(1, 1, 1), g);
|
|
296
|
+
}
|
|
297
|
+
`,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
|
|
298
|
+
}`,i=Jt.tonemapping_pars_fragment.indexOf(e),n=Jt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Jt.tonemapping_pars_fragment.substring(i,n+t.length);Jt.tonemapping_pars_fragment=Jt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function NM(){const o=`
|
|
299
|
+
// 0: Default, 1: Golden, 2: Punchy
|
|
300
|
+
#define AGX_LOOK 0
|
|
301
|
+
|
|
302
|
+
vec3 userSlope = vec3(1.0);
|
|
303
|
+
vec3 userOffset = vec3(0.0);
|
|
304
|
+
vec3 userPower = vec3(1.0);
|
|
305
|
+
float userSaturation = 1.0;
|
|
306
|
+
|
|
307
|
+
// Mean error^2: 3.6705141e-06
|
|
308
|
+
vec3 _agxDefaultContrastApprox(vec3 x) {
|
|
309
|
+
vec3 x2 = x * x;
|
|
310
|
+
vec3 x4 = x2 * x2;
|
|
311
|
+
|
|
312
|
+
return + 15.5 * x4 * x2
|
|
313
|
+
- 40.14 * x4 * x
|
|
314
|
+
+ 31.96 * x4
|
|
315
|
+
- 6.868 * x2 * x
|
|
316
|
+
+ 0.4298 * x2
|
|
317
|
+
+ 0.1191 * x
|
|
318
|
+
- 0.00232;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
vec3 _agx(vec3 val) {
|
|
322
|
+
const mat3 agx_mat = mat3(
|
|
323
|
+
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
|
|
324
|
+
0.0784335999999992, 0.878468636469772, 0.0784336,
|
|
325
|
+
0.0792237451477643, 0.0791661274605434, 0.879142973793104);
|
|
326
|
+
|
|
327
|
+
const float min_ev = -12.47393;
|
|
328
|
+
const float max_ev = 4.026069;
|
|
329
|
+
|
|
330
|
+
// val = pow(val, vec3(2.2));
|
|
331
|
+
|
|
332
|
+
// Input transform (inset)
|
|
333
|
+
val = agx_mat * val;
|
|
334
|
+
|
|
335
|
+
// Log2 space encoding
|
|
336
|
+
val = clamp(log2(val), min_ev, max_ev);
|
|
337
|
+
val = (val - min_ev) / (max_ev - min_ev);
|
|
338
|
+
|
|
339
|
+
// Apply sigmoid function approximation
|
|
340
|
+
val = _agxDefaultContrastApprox(val);
|
|
341
|
+
|
|
342
|
+
return val;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
vec3 _agxEotf(vec3 val) {
|
|
346
|
+
const mat3 agx_mat_inv = mat3(
|
|
347
|
+
1.19687900512017, -0.0528968517574562, -0.0529716355144438,
|
|
348
|
+
-0.0980208811401368, 1.15190312990417, -0.0980434501171241,
|
|
349
|
+
-0.0990297440797205, -0.0989611768448433, 1.15107367264116);
|
|
350
|
+
|
|
351
|
+
// Inverse input transform (outset)
|
|
352
|
+
val = agx_mat_inv * val;
|
|
353
|
+
|
|
354
|
+
// sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
|
|
355
|
+
// NOTE: We're linearizing the output here. Comment/adjust when
|
|
356
|
+
// *not* using a sRGB render target
|
|
357
|
+
val = pow(val, vec3(2.2));
|
|
358
|
+
|
|
359
|
+
return val;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
vec3 _agxLook(vec3 val) {
|
|
363
|
+
const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
|
|
364
|
+
float luma = dot(val, lw);
|
|
365
|
+
|
|
366
|
+
// Default
|
|
367
|
+
vec3 offset = vec3(0.0);
|
|
368
|
+
vec3 slope = vec3(1.0);
|
|
369
|
+
vec3 power = vec3(1.0);
|
|
370
|
+
float sat = 1.0;
|
|
371
|
+
|
|
372
|
+
#if AGX_LOOK == 1
|
|
373
|
+
// Golden
|
|
374
|
+
slope = vec3(1.0, 0.9, 0.5);
|
|
375
|
+
power = vec3(0.8);
|
|
376
|
+
sat = 0.8;
|
|
377
|
+
#elif AGX_LOOK == 2
|
|
378
|
+
// Punchy
|
|
379
|
+
slope = vec3(1.0);
|
|
380
|
+
power = vec3(1.35, 1.35, 1.35);
|
|
381
|
+
sat = 1.4;
|
|
382
|
+
#endif
|
|
383
|
+
|
|
384
|
+
// Needle
|
|
385
|
+
slope = vec3(1.05);
|
|
386
|
+
power = vec3(1.10, 1.10, 1.10);
|
|
387
|
+
sat = 1.15;
|
|
388
|
+
|
|
389
|
+
// User
|
|
390
|
+
// slope = userSlope;
|
|
391
|
+
// offset = userOffset;
|
|
392
|
+
// power = userPower;
|
|
393
|
+
// sat = userSaturation;
|
|
394
|
+
|
|
395
|
+
// ASC CDL
|
|
396
|
+
val = pow(val * slope + offset, power);
|
|
397
|
+
return luma + sat * (val - luma);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
vec3 AgXToneMapping( vec3 color ) {
|
|
402
|
+
// apply AGX
|
|
403
|
+
color *= toneMappingExposure;
|
|
404
|
+
color = max(color, vec3(0.001)); // Prevent NaN
|
|
405
|
+
color = _agx(color);
|
|
406
|
+
color = _agxLook(color); // Optional
|
|
407
|
+
color = _agxEotf(color);
|
|
408
|
+
return color;
|
|
409
|
+
`,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",i=Jt.tonemapping_pars_fragment.indexOf(e),n=Jt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Jt.tonemapping_pars_fragment.substring(i,n+t.length);Jt.tonemapping_pars_fragment=Jt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function dw(o){if(typeof o=="string")switch(o=o.toLowerCase(),o){case"none":return Fd;case"neutral":return ja;case"aces":return Bd;case"agx":return jd;case"khronos_neutral":return ja;default:console.warn("[PostProcessing] Unknown tone mapping mode",o);return}}const Lr=w("debugpost");class uw{_context;_handler=null;_effects=[];_isDirty=!1;get effects(){return this._effects}get dirty(){return this._isDirty}set dirty(e){this._isDirty=e}get handler(){return this._handler}get composer(){return this._composer}set composer(e){this._composer=e}_composer=null;multisampling="auto";adaptiveResolution=!0;constructor(e){this._context=e}addEffect(e){this._effects.includes(e)||(this._effects.push(e),this._isDirty=!0)}removeEffect(e){const t=this._effects.indexOf(e);t!==-1&&(this._effects.splice(t,1),this._isDirty=!0)}markDirty(){this._isDirty=!0}_enabledTime=-1;_multisampleAutoChangeTime=0;_multisampleAutoDecreaseTime=0;update(){const e=this._context;if(e.isInXR)return;if(this._isDirty&&e.mainCamera&&this.apply(),this._tonemappingOnlyActive){const i=this._effects.filter(n=>n.active&&n.enabled&&n.isToneMapping===!0);if(i.length>0){const n=i[i.length-1];e.renderer.toneMapping=n.threeToneMapping,e.renderer.toneMappingExposure=n.toneMappingExposure}return}if(!this._handler||!this._composer||this._handler.composer!==this._composer)return;const t=this._composer;if(e.renderer.getContext().isContextLost()&&e.renderer.forceContextRestore(),t.getRenderer()!==e.renderer&&t.setRenderer(e.renderer),t.setMainScene(e.scene),this.multisampling==="auto")if(this._handler.hasSmaaEffect)this._handler.multisampling!==0&&(this._handler.multisampling=0,(Lr||A())&&console.log(`[PostProcessing] multisampling is disabled because it's set to 'auto' and there is an SMAA effect.
|
|
410
|
+
|
|
411
|
+
If you need multisampling consider changing 'auto' to a fixed value (e.g. 4).`));else{const i=e.time.realtimeSinceStartup-this._multisampleAutoChangeTime;if(e.time.realtimeSinceStartup-this._enabledTime>2&&i>.5){const n=this._handler.multisampling;if(this._handler.multisampling>0&&e.time.smoothedFps<=50){this._multisampleAutoChangeTime=e.time.realtimeSinceStartup,this._multisampleAutoDecreaseTime=e.time.realtimeSinceStartup;let s=this._handler.multisampling*.5;s=Math.floor(s),s!=this._handler.multisampling&&(this._handler.multisampling=s),Lr&&console.debug(`[PostProcessing] Reduced multisampling from ${n} to ${this._handler.multisampling}`)}else if(i>1&&e.time.smoothedFps>=59&&this._handler.multisampling<e.renderer.capabilities.maxSamples&&e.time.realtimeSinceStartup-this._multisampleAutoDecreaseTime>10){this._multisampleAutoChangeTime=e.time.realtimeSinceStartup;let s=this._handler.multisampling<=0?1:this._handler.multisampling*2;s=Math.floor(s),s!==this._handler.multisampling&&(this._handler.multisampling=s),Lr&&console.debug(`[PostProcessing] Increased multisampling from ${n} to ${this._handler.multisampling}`)}}}else{const i=Math.max(0,Math.min(this.multisampling,e.renderer.capabilities.maxSamples));i!==this._handler.multisampling&&(this._handler.multisampling=i)}if(this._handler.adaptivePixelRatio=this.adaptiveResolution,this._handler.updateAdaptivePixelRatio(),e.mainCamera){const i=t.passes;for(const n of i)if(n.mainCamera&&n.mainCamera!==e.mainCamera){t.setMainCamera(e.mainCamera);break}}}_lastApplyTime;_rapidApplyCount=0;_tonemappingOnlyActive=!1;_previousToneMapping;_previousToneMappingExposure;apply(){Lr&&console.log(`[PostProcessing] Apply stack (${this._effects.length} effects)`),A()&&(this._lastApplyTime!==void 0&&Date.now()-this._lastApplyTime<100&&(this._rapidApplyCount++,this._rapidApplyCount===5&&console.warn("[PostProcessing] Detected rapid post processing modifications - this might be a bug")),this._lastApplyTime=Date.now()),this._isDirty=!1;const e=this._effects.filter(t=>t.active&&t.enabled);if(e.length<=0){this.restoreTonemapping(),this._handler?.unapply(!1);return}if(e.every(t=>t.isToneMapping===!0)){const t=e[e.length-1];Lr&&console.log("[PostProcessing] Only tonemapping effects in stack \u2014 applying directly to renderer"),this._tonemappingOnlyActive||(this._previousToneMapping=this._context.renderer.toneMapping,this._previousToneMappingExposure=this._context.renderer.toneMappingExposure,this._tonemappingOnlyActive=!0),this._context.renderer.toneMapping=t.threeToneMapping,this._context.renderer.toneMappingExposure=t.toneMappingExposure,this._handler?.unapply(!1);return}this.restoreTonemapping(),this.ensureHandler().then(t=>{if(t)return t.apply(e)}).then(()=>{this._handler&&(this.multisampling==="auto"?this._handler.multisampling=I.isMobileDevice()?2:4:this._handler.multisampling=Math.max(0,Math.min(this.multisampling,this._context.renderer.capabilities.maxSamples)),Lr&&console.debug(`[PostProcessing] Set multisampling to ${this._handler.multisampling} (Is Mobile: ${I.isMobileDevice()})`))}),this._enabledTime=this._context.time.realtimeSinceStartup}restoreTonemapping(){this._tonemappingOnlyActive&&(this._previousToneMapping!==void 0&&(this._context.renderer.toneMapping=this._previousToneMapping),this._previousToneMappingExposure!==void 0&&(this._context.renderer.toneMappingExposure=this._previousToneMappingExposure),this._tonemappingOnlyActive=!1,this._previousToneMapping=void 0,this._previousToneMappingExposure=void 0,Lr&&console.log("[PostProcessing] Restored renderer tonemapping"))}async ensureHandler(){if(!this._handler){const{PostProcessingHandler:e}=await Promise.resolve().then(()=>ND);this._handler||(this._handler=new e(this._context))}return this._handler}dispose(){this.restoreTonemapping(),this._handler?.dispose(),this._handler=null,this._composer=null,this._effects.length=0}}const il=[];function Su(o){il.indexOf(o)===-1&&il.push(o)}function WM(o){const e=il.indexOf(o);e!==-1&&il.splice(e,1)}const nl=[];function pf(o){nl.indexOf(o)===-1&&nl.push(o)}function VM(o){const e=nl.indexOf(o);e!==-1&&nl.splice(e,1)}function pw(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<il.length;e++)il[e](o)}function mw(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<nl.length;e++)nl[e](o)}const $M='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 187.74"><defs><linearGradient id="a" x1="89.64" y1="184.81" x2="90.48" y2="21.85" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#62d399"/><stop offset=".51" stop-color="#acd842"/><stop offset=".9" stop-color="#d7db0a"/></linearGradient><linearGradient id="b" x1="69.68" y1="178.9" x2="68.08" y2="16.77" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0ba398"/><stop offset=".5" stop-color="#4ca352"/><stop offset="1" stop-color="#76a30a"/></linearGradient><linearGradient id="c" x1="36.6" y1="152.17" x2="34.7" y2="84.19" gradientUnits="userSpaceOnUse"><stop offset=".19" stop-color="#36a382"/><stop offset=".54" stop-color="#49a459"/><stop offset="1" stop-color="#76a30b"/></linearGradient><linearGradient id="d" x1="15.82" y1="153.24" x2="18" y2="90.86" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#267880"/><stop offset=".51" stop-color="#457a5c"/><stop offset="1" stop-color="#717516"/></linearGradient><linearGradient id="e" x1="135.08" y1="135.43" x2="148.93" y2="63.47" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#b0d939"/><stop offset="1" stop-color="#eadb04"/></linearGradient><linearGradient id="f" x1="-4163.25" y1="2285.12" x2="-4160.81" y2="2215.34" gradientTransform="rotate(20 4088.49 13316.712)" gradientUnits="userSpaceOnUse"><stop offset=".17" stop-color="#74af52"/><stop offset=".48" stop-color="#99be32"/><stop offset="1" stop-color="#c0c40a"/></linearGradient><symbol id="g" viewBox="0 0 160 187.74"><path style="fill:url(#a)" d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75z"/><path style="fill:url(#b)" d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98z"/><path style="fill:url(#c)" d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z"/><path style="fill:url(#d)" d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04z"/><path style="fill:#9c3" d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5z"/><path style="fill:url(#e)" d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59z"/><path style="fill:url(#f)" d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z"/><path style="fill:#ffe113" d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1z"/><path style="fill:#f3e600" d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75z"/></symbol></defs><use width="160" height="187.74" xlink:href="#g"/></svg>',HM=btoa($M),GM="data:image/svg+xml;base64,"+HM,ol=GM,qM=`<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 1014 282" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m665.95 132.73v44.88l-10.56-8.4c-0.8-0.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18 0.4-6.06 1.2s-3.54 1.8-4.98 3-2.56 2.5-3.36 3.9-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c0.32 0.24 0.56 0.44 0.72 0.6s0.36 0.32 0.6 0.48c0.96-1.2 2.14-2.28 3.54-3.24s2.92-1.76 4.56-2.4 3.34-1.14 5.1-1.5 3.44-0.54 5.04-0.54c1.44 0 2.92 0.04 4.44 0.12s2.84 0.28 3.96 0.6c4.56 1.12 7.8 3.12 9.72 6s2.88 6.56 2.88 11.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m732.38 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m795.93 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m858.57 97.21c0.64 0.48 0.96 1.16 0.96 2.04v74.88c-0.08 1.04-0.12 2.12-0.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18s-2.06-1.66-2.46-1.98c-1.76 2.48-4.26 4.44-7.5 5.88s-7.02 2.16-11.34 2.16c-3.84 0-7.4-0.7-10.68-2.1s-6.14-3.44-8.58-6.12-4.34-5.94-5.7-9.78-2.04-8.16-2.04-12.96c0-4.32 0.78-8.34 2.34-12.06s3.6-6.92 6.12-9.6 5.38-4.78 8.58-6.3 6.48-2.28 9.84-2.28c2.56 0 4.82 0.22 6.78 0.66s3.68 1.06 5.16 1.86 2.78 1.74 3.9 2.82 2.16 2.22 3.12 3.42v-35.04l10.68 8.64zm-27.96 67.92c3.6 0 6.52-0.68 8.76-2.04s3.98-3.06 5.22-5.1 2.1-4.22 2.58-6.54 0.72-4.44 0.72-6.36v-1.2c0-1.12-0.22-2.7-0.66-4.74s-1.28-4.06-2.52-6.06-3-3.7-5.28-5.1-5.22-2.02-8.82-1.86c-3.44 0-6.26 0.74-8.46 2.22s-3.96 3.26-5.28 5.34-2.24 4.2-2.76 6.36-0.78 3.92-0.78 5.28c0 1.84 0.24 3.92 0.72 6.24s1.36 4.48 2.64 6.48 3.04 3.68 5.28 5.04 5.12 2.04 8.64 2.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m882.81 97.09c0.64 0.48 0.96 1.12 0.96 1.92l-0.12 41.04v37.08l-10.56-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-77.88l10.8 8.64z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m950.36 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.8559 0 0 .7642 45.348 36.475)"> <g transform="translate(2.7114)"> <path d="m3.935 173.02c-0.331 0-0.497-0.402-0.497-1.207v-51.002c0-0.738 0.138-1.107 0.414-1.107h1.781c0.277 0 0.415 0.335 0.415 1.006v5.935c0 0.336 0.027 0.553 0.083 0.654 0.055 0.101 0.151-0.017 0.289-0.352 0.912-1.744 1.754-3.236 2.527-4.477 0.773-1.24 1.554-2.179 2.341-2.816s1.65-0.956 2.588-0.956c1.685 0 3.011 0.922 3.977 2.766 0.967 1.845 1.602 3.84 1.905 5.986 0.056 0.268 0.139 0.369 0.249 0.302s0.221-0.235 0.331-0.503c0.939-1.811 1.802-3.353 2.589-4.628 0.787-1.274 1.581-2.246 2.382-2.917s1.671-1.006 2.61-1.006c2.016 0 3.569 1.392 4.66 4.175 1.09 2.783 1.636 6.421 1.636 10.915v37.925c0 0.871-0.18 1.307-0.539 1.307h-1.739c-0.138 0-0.249-0.1-0.332-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.338-6.321-1.015-8.3-0.676-1.978-1.76-2.967-3.251-2.967-0.884 0-1.726 0.386-2.527 1.157s-1.519 1.727-2.154 2.867-1.201 2.213-1.699 3.219c-0.248 0.469-0.421 0.905-0.517 1.308-0.097 0.402-0.145 0.972-0.145 1.71v37.221c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.166 0-0.29-0.1-0.373-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.332-6.321-0.994-8.3-0.663-1.978-1.754-2.967-3.273-2.967-1.242 0-2.375 0.704-3.396 2.112-1.022 1.409-2.223 3.555-3.604 6.439v39.031c0 0.805-0.18 1.207-0.539 1.207h-1.698z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m53.642 166.28c-1.077 2.549-2.237 4.477-3.479 5.785-1.243 1.307-2.61 1.961-4.101 1.961-2.154 0-3.853-1.324-5.095-3.973-1.243-2.649-1.864-6.187-1.864-10.613 0-3.488 0.4-6.489 1.201-9.004s1.988-4.51 3.562-5.985c1.574-1.476 3.521-2.414 5.841-2.817l3.686-0.704c0.221-0.067 0.394-0.218 0.518-0.453 0.124-0.234 0.187-0.587 0.187-1.056v-2.917c0-3.89-0.504-6.975-1.512-9.255s-2.354-3.42-4.039-3.42c-1.298 0-2.472 0.72-3.521 2.162s-2.002 3.572-2.858 6.388c-0.083 0.268-0.159 0.453-0.228 0.554-0.069 0.1-0.172 0.083-0.311-0.051l-1.698-1.71c-0.083-0.134-0.138-0.285-0.166-0.453-0.027-0.167 0.014-0.452 0.125-0.855 0.856-3.353 2.009-6.052 3.459-8.098 1.449-2.045 3.224-3.068 5.322-3.068 1.74 0 3.211 0.687 4.412 2.062s2.112 3.37 2.734 5.986c0.621 2.615 0.932 5.7 0.932 9.255v35.712c0 0.536-0.035 0.888-0.104 1.056s-0.2 0.251-0.393 0.251h-1.533c-0.166 0-0.29-0.117-0.373-0.352-0.083-0.234-0.124-0.553-0.124-0.955l-0.083-5.231c-0.055-0.939-0.221-1.006-0.497-0.202zm0.456-19.314c0-1.14-0.194-1.643-0.58-1.509l-3.107 0.603c-1.436 0.202-2.686 0.638-3.749 1.308-1.063 0.671-1.953 1.543-2.671 2.616s-1.257 2.33-1.616 3.772-0.538 3.102-0.538 4.98c0 3.152 0.455 5.616 1.367 7.393 0.911 1.778 2.14 2.666 3.686 2.666 0.939 0 1.85-0.419 2.734-1.257s1.671-1.895 2.361-3.169c0.663-1.408 1.181-2.85 1.553-4.326 0.373-1.475 0.56-2.883 0.56-4.225v-8.852z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m79.034 173.02c-0.166 0-0.297-0.117-0.394-0.352-0.096-0.234-0.145-0.553-0.145-0.955v-4.628c0-0.536-0.041-0.838-0.124-0.905s-0.207 0.1-0.373 0.503c-0.276 0.67-0.69 1.593-1.242 2.766-0.553 1.174-1.271 2.23-2.154 3.169-0.884 0.939-1.961 1.408-3.231 1.408-1.74 0-3.314-0.989-4.722-2.967-1.409-1.979-2.534-4.963-3.376-8.953-0.843-3.991-1.264-8.937-1.264-14.838 0-5.701 0.415-10.68 1.243-14.939s1.988-7.595 3.479-10.009c1.492-2.415 3.204-3.622 5.137-3.622 1.436 0 2.616 0.57 3.541 1.71 0.926 1.14 1.719 2.381 2.382 3.722 0.249 0.47 0.414 0.637 0.497 0.503s0.125-0.536 0.125-1.207v-23.841c0-0.805 0.151-1.208 0.455-1.208h1.864c0.276 0 0.414 0.369 0.414 1.107v72.128c0 0.537-0.041 0.905-0.124 1.107-0.083 0.201-0.235 0.301-0.455 0.301h-1.533zm-0.621-42.049c-0.939-2.213-1.885-3.94-2.838-5.181s-2.009-1.861-3.169-1.861c-1.463 0-2.768 0.889-3.914 2.666s-2.044 4.376-2.693 7.796-0.973 7.578-0.973 12.474c0 5.097 0.338 9.272 1.015 12.524 0.676 3.253 1.567 5.651 2.672 7.193 1.104 1.543 2.305 2.314 3.603 2.314 1.188 0 2.258-0.704 3.211-2.113 0.952-1.408 1.705-3.118 2.257-5.13s0.829-3.957 0.829-5.835v-24.847z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m89.514 149.38c0 3.42 0.345 6.606 1.035 9.557 0.691 2.951 1.609 5.315 2.755 7.092s2.437 2.666 3.873 2.666c1.519 0 2.837-0.738 3.956-2.213 1.118-1.476 2.064-3.655 2.837-6.539 0.083-0.336 0.166-0.52 0.249-0.554 0.083-0.033 0.179 0.017 0.29 0.151l1.408 1.912c0.221 0.268 0.235 0.67 0.041 1.207-0.69 2.548-1.47 4.661-2.34 6.337-0.87 1.677-1.857 2.935-2.962 3.773-1.104 0.838-2.319 1.257-3.645 1.257-2.043 0-3.838-1.14-5.385-3.42-1.546-2.28-2.761-5.482-3.645-9.607-0.884-4.124-1.325-8.836-1.325-14.134 0-5.901 0.455-10.931 1.367-15.089 0.911-4.158 2.14-7.377 3.686-9.658 1.547-2.28 3.3-3.42 5.261-3.42 1.988 0 3.714 1.073 5.178 3.219 1.463 2.146 2.595 5.231 3.396 9.255s1.201 8.886 1.201 14.587c0 0.469-0.02 0.939-0.062 1.408-0.041 0.469-0.214 0.704-0.517 0.704h-16.362c-0.083 0-0.152 0.151-0.207 0.453-0.056 0.302-0.083 0.654-0.083 1.056zm13.752-6.237c0.304 0 0.497-0.1 0.58-0.302 0.083-0.201 0.124-0.57 0.124-1.106 0-3.219-0.283-6.187-0.849-8.903s-1.367-4.896-2.402-6.539c-1.036-1.643-2.272-2.464-3.708-2.464-1.629 0-2.996 0.955-4.101 2.867-1.104 1.911-1.94 4.342-2.506 7.293s-0.849 6.002-0.849 9.154h13.711z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m148.54 119.7c0.165 0 0.283 0.117 0.352 0.352s0.076 0.52 0.02 0.855l-6.254 50.902c-0.028 0.47-0.104 0.788-0.228 0.956s-0.297 0.251-0.518 0.251h-1.615c-0.442 0-0.718-0.402-0.829-1.207l-5.26-40.138c-0.111-0.604-0.201-0.905-0.27-0.905s-0.131 0.301-0.186 0.905l-5.012 40.138c-0.028 0.47-0.097 0.788-0.207 0.956-0.111 0.168-0.277 0.251-0.497 0.251h-1.74c-0.442 0-0.718-0.402-0.829-1.207l-6.503-50.801c-0.055-0.403-0.048-0.721 0.021-0.956s0.2-0.352 0.393-0.352h1.823c0.166 0 0.297 0.067 0.393 0.201 0.097 0.134 0.159 0.403 0.187 0.805l5.302 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.219-41.949c0.055-0.268 0.124-0.47 0.207-0.604s0.193-0.201 0.331-0.201h1.533c0.138 0 0.262 0.067 0.373 0.201 0.11 0.134 0.179 0.403 0.207 0.805l5.468 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.053-41.849c0.055-0.335 0.138-0.57 0.249-0.704 0.11-0.134 0.234-0.201 0.373-0.201h1.284z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m156.49 171.51c0 0.604-0.042 1.006-0.125 1.208-0.082 0.201-0.262 0.301-0.538 0.301h-1.533c-0.221 0-0.366-0.083-0.435-0.251s-0.103-0.486-0.103-0.956v-50.902c0-0.805 0.152-1.207 0.456-1.207h1.822c0.304 0 0.456 0.402 0.456 1.207v50.6zm0.165-63.979c0 1.207-0.207 1.811-0.621 1.811h-1.905c-0.221 0-0.366-0.135-0.435-0.403s-0.104-0.67-0.104-1.207v-7.847c0-1.006 0.18-1.509 0.539-1.509h1.988c0.359 0 0.538 0.47 0.538 1.409v7.746z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m168.3 124.83c-0.221 0-0.331 0.269-0.331 0.805v33.801c0 3.42 0.221 5.667 0.663 6.74 0.441 1.073 1.09 1.609 1.946 1.609h3.024c0.138 0 0.242 0.084 0.311 0.252 0.069 0.167 0.103 0.419 0.103 0.754v2.716c0 0.537-0.138 0.906-0.414 1.107-0.248 0.067-0.614 0.134-1.098 0.201-0.483 0.067-0.959 0.118-1.429 0.151-0.469 0.034-0.828 0.05-1.077 0.05-1.712 0-2.934-0.955-3.665-2.867-0.732-1.911-1.098-5.013-1.098-9.305v-35.108c0-0.604-0.124-0.906-0.373-0.906h-3.521c-0.248 0-0.373-0.268-0.373-0.804v-3.521c0-0.537 0.111-0.805 0.332-0.805h3.686c0.166 0 0.263-0.268 0.29-0.805l0.415-16.095c0-0.805 0.124-1.207 0.372-1.207h1.492c0.303 0 0.455 0.436 0.455 1.307v15.995c0 0.537 0.097 0.805 0.29 0.805h5.468c0.221 0 0.331 0.268 0.331 0.805v3.521c0 0.536-0.124 0.804-0.373 0.804h-5.426z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m179.4 173.02c-0.331 0-0.497-0.402-0.497-1.207v-72.329c0-0.738 0.138-1.107 0.414-1.107h1.782c0.276 0 0.414 0.336 0.414 1.006v27.162c0 0.335 0.034 0.536 0.103 0.603s0.159-0.033 0.27-0.302c0.994-1.81 1.898-3.319 2.713-4.526 0.814-1.208 1.629-2.113 2.444-2.717 0.814-0.603 1.691-0.905 2.63-0.905 2.182 0 3.839 1.375 4.971 4.125 1.132 2.749 1.698 6.404 1.698 10.965v37.925c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.165 0-0.29-0.1-0.373-0.301-0.082-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.366-6.321-1.097-8.3-0.732-1.978-1.899-2.967-3.501-2.967-0.883 0-1.705 0.318-2.464 0.956-0.76 0.637-1.526 1.576-2.299 2.816-0.773 1.241-1.643 2.834-2.61 4.779v39.031c0 0.805-0.179 1.207-0.538 1.207h-1.699z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> </g> <g transform="matrix(.80638 0 0 .80638 452.53 65.421)" fill-rule="nonzero"> <path d="m79.32 36.98v150.76l15.68-13.2 6.59-156.31-22.27 18.75z" fill="url(#f)"/> <path d="m79.32 36.98-22.27-18.75 6.59 156.31 15.68 13.2v-150.76z" fill="url(#e)"/> <path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z" fill="url(#d)"/> <path d="m25.19 104.83-25.19-14.59 16.97 53.86 16.85 9.77-8.63-49.04z" fill="url(#c)"/> <path d="M43.86,82.5L18.69,67.98L0,90.24L25.18,104.83L43.86,82.5Z" fill="#9c3"/> <path d="m134.82 78.69-9.97 56.5 15.58-9.04 19.57-62.05-25.18 14.59z" fill="url(#b)"/> <path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z" fill="url(#a)"/> <path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33 25.19-14.59z" fill="#ffe113"/> <path d="M101.59,18.23L79.32,0L57.05,18.23L79.32,36.98L101.59,18.23Z" fill="#f3e600"/> </g> <defs> <linearGradient id="f" x2="1" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)" gradientUnits="userSpaceOnUse"><stop stop-color="#62d399" offset="0"/><stop stop-color="#acd842" offset=".51"/><stop stop-color="#d7db0a" offset=".9"/><stop stop-color="#d7db0a" offset="1"/></linearGradient> <linearGradient id="e" x2="1" gradientTransform="matrix(-1.6,-162.13,162.13,-1.6,69.68,178.9)" gradientUnits="userSpaceOnUse"><stop stop-color="#0ba398" offset="0"/><stop stop-color="#4ca352" offset=".5"/><stop stop-color="#76a30a" offset="1"/></linearGradient> <linearGradient id="d" x2="1" gradientTransform="matrix(-1.9,-67.98,67.98,-1.9,36.6,152.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#36a382" offset="0"/><stop stop-color="#36a382" offset=".19"/><stop stop-color="#49a459" offset=".54"/><stop stop-color="#76a30b" offset="1"/></linearGradient> <linearGradient id="c" x2="1" gradientTransform="matrix(2.18,-62.38,62.38,2.18,15.82,153.24)" gradientUnits="userSpaceOnUse"><stop stop-color="#267880" offset="0"/><stop stop-color="#457a5c" offset=".51"/><stop stop-color="#717516" offset="1"/></linearGradient> <linearGradient id="b" x2="1" gradientTransform="matrix(13.85,-71.96,71.96,13.85,135.08,135.43)" gradientUnits="userSpaceOnUse"><stop stop-color="#b0d939" offset="0"/><stop stop-color="#eadb04" offset="1"/></linearGradient> <linearGradient id="a" x2="1" gradientTransform="matrix(26.159 -64.737 64.737 26.159 107.42 128.14)" gradientUnits="userSpaceOnUse"><stop stop-color="#74af52" offset="0"/><stop stop-color="#74af52" offset=".17"/><stop stop-color="#99be32" offset=".48"/><stop stop-color="#c0c40a" offset="1"/></linearGradient> </defs> </svg>`;btoa(qM);const XM='<svg viewBox="0 0 509 154" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M665.95 132.73v44.88l-10.56-8.4c-.8-.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18.4-6.06 1.2-1.88.8-3.54 1.8-4.98 3-1.44 1.2-2.56 2.5-3.36 3.9-.8 1.4-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-.72-.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c.32.24.56.44.72.6.16.16.36.32.6.48.96-1.2 2.14-2.28 3.54-3.24 1.4-.96 2.92-1.76 4.56-2.4 1.64-.64 3.34-1.14 5.1-1.5 1.76-.36 3.44-.54 5.04-.54 1.44 0 2.92.04 4.44.12 1.52.08 2.84.28 3.96.6 4.56 1.12 7.8 3.12 9.72 6 1.92 2.88 2.88 6.56 2.88 11.04ZM732.38 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM795.93 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM858.57 97.21c.64.48.96 1.16.96 2.04v74.88c-.08 1.04-.12 2.12-.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18-1.24-1-2.06-1.66-2.46-1.98-1.76 2.48-4.26 4.44-7.5 5.88-3.24 1.44-7.02 2.16-11.34 2.16-3.84 0-7.4-.7-10.68-2.1-3.28-1.4-6.14-3.44-8.58-6.12-2.44-2.68-4.34-5.94-5.7-9.78-1.36-3.84-2.04-8.16-2.04-12.96 0-4.32.78-8.34 2.34-12.06 1.56-3.72 3.6-6.92 6.12-9.6 2.52-2.68 5.38-4.78 8.58-6.3 3.2-1.52 6.48-2.28 9.84-2.28 2.56 0 4.82.22 6.78.66 1.96.44 3.68 1.06 5.16 1.86s2.78 1.74 3.9 2.82a35.92 35.92 0 0 1 3.12 3.42V88.57l10.68 8.64Zm-27.96 67.92c3.6 0 6.52-.68 8.76-2.04 2.24-1.36 3.98-3.06 5.22-5.1a20.5 20.5 0 0 0 2.58-6.54c.48-2.32.72-4.44.72-6.36v-1.2c0-1.12-.22-2.7-.66-4.74-.44-2.04-1.28-4.06-2.52-6.06s-3-3.7-5.28-5.1c-2.28-1.4-5.22-2.02-8.82-1.86-3.44 0-6.26.74-8.46 2.22-2.2 1.48-3.96 3.26-5.28 5.34-1.32 2.08-2.24 4.2-2.76 6.36-.52 2.16-.78 3.92-.78 5.28 0 1.84.24 3.92.72 6.24.48 2.32 1.36 4.48 2.64 6.48s3.04 3.68 5.28 5.04c2.24 1.36 5.12 2.04 8.64 2.04ZM882.81 97.09c.64.48.96 1.12.96 1.92l-.12 41.04v37.08l-10.56-8.4c-.72-.64-1.08-1.44-1.08-2.4V88.45l10.8 8.64ZM950.36 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14Z" style="fill-rule:nonzero" transform="translate(-452.406 -63.709) scale(1.00797)"/><path d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75Z" style="fill:url(#a);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98Z" style="fill:url(#b);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33Z" style="fill:url(#c);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04Z" style="fill:url(#d);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5Z" style="fill:#9c3;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59Z" style="fill:url(#e);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5Z" style="fill:url(#f);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1Z" style="fill:#ffe113;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75Z" style="fill:#f3e600;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><defs><linearGradient id="a" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)"><stop offset="0" style="stop-color:#62d399;stop-opacity:1"/><stop offset=".51" style="stop-color:#acd842;stop-opacity:1"/><stop offset=".9" style="stop-color:#d7db0a;stop-opacity:1"/><stop offset="1" style="stop-color:#d7db0a;stop-opacity:1"/></linearGradient><linearGradient id="b" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90.565 123.412 54.953) scale(162.14)"><stop offset="0" style="stop-color:#0ba398;stop-opacity:1"/><stop offset=".5" style="stop-color:#4ca352;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30a;stop-opacity:1"/></linearGradient><linearGradient id="c" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="scale(-68) rotate(88.4 .881 -1.396)"><stop offset="0" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".19" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".54" style="stop-color:#49a459;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30b;stop-opacity:1"/></linearGradient><linearGradient id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-88 87.255 68.431) scale(62.42)"><stop offset="0" style="stop-color:#267880;stop-opacity:1"/><stop offset=".51" style="stop-color:#457a5c;stop-opacity:1"/><stop offset="1" style="stop-color:#717516;stop-opacity:1"/></linearGradient><linearGradient id="e" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-79.1 149.53 -14.065) scale(73.28)"><stop offset="0" style="stop-color:#b0d939;stop-opacity:1"/><stop offset="1" style="stop-color:#eadb04;stop-opacity:1"/></linearGradient><linearGradient id="f" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-67.997 148.705 -15.558) scale(69.8226)"><stop offset="0" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".17" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".48" style="stop-color:#99be32;stop-opacity:1"/><stop offset="1" style="stop-color:#c0c40a;stop-opacity:1"/></linearGradient></defs></svg>',QM=btoa(XM),YM="data:image/svg+xml;charset=utf-8;base64,"+QM,gw=YM;var Fc;(o=>{function e(n){return n==="0"||n?.toLowerCase()==="false"}o.isFalsey=e;function t(n,s,r){const a=n.getAttribute(s);return e(a)?null:(r?.onAttribute?.call(null,a),a)}o.getAttributeValueIfNotFalsey=t;function i(n,s,r){const a=n.getAttribute(s);return a===null?null:e(a)?(r?.onAttribute?.call(null,a,!0),!1):(r?.onAttribute?.call(null,a,!1),a)}o.getAttributeAndCheckFalsey=i})(Fc||(Fc={}));async function fw(o){if(!globalThis.QRCode){const l="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs@gh-pages/qrcode.min.js";let c=document.head.querySelector(`script[src="${l}"]`);c||(c=document.createElement("script"),c.src=l,document.head.appendChild(c)),await new Promise((h,d)=>{c.addEventListener("load",()=>{h(!0)})})}const e=globalThis.QRCode,t=o.domElement??document.createElement("div"),i=new e(t,{width:o.width??256,height:o.height??256,colorDark:"#000000",colorLight:"#ffffff",correctLevel:o.showLogo?e.CorrectionLevel.H:e.CorrectLevel.M,...o}),n=i?._oQRCode.moduleCount||0,s=i?._oDrawing?._elCanvas;let r=.25;n<40?r=Math.floor(n/4)/n:r=Math.floor(n/6)/n;const a=Math.floor(n/20)/n;try{const l=await ZM(s,{showLogo:o.showLogo,logoSize:r,logoPadding:a}).catch(c=>{});l&&(t.innerHTML="",t.append(l))}catch{}if(o.showUrl!==!1&&o.text){const l=t.querySelector(".qr-code-link-label");let c=o.text.replace(/^(https?:\/\/)?(www\.)?/,"").replace(/\/+$/,"").replace(/\?+$/,"");if(c="Scan to visit "+c,l)l.textContent=c;else{const h=document.createElement("div");h.classList.add("qr-code-link-label"),o.text=c,h.textContent=o.text,h.addEventListener("click",d=>{d.stopImmediatePropagation()}),h.style.textAlign="center",h.style.fontSize="0.8em",h.style.marginTop="0.1em",h.style.color="#000000",h.style.fontFamily="'Roboto Flex', sans-serif",h.style.opacity="0.5",h.style.wordBreak="break-all",h.style.wordWrap="break-word",h.style.marginBottom="0.3em",t.style.width="calc(210px + 20px)",t.appendChild(h)}}return t}async function ZM(o,e){if(!o)return;const t=8,i=20,n=e.logoPadding||1/32,s="transparent",r=0,a=new Image,l=document.querySelector("needle-engine");l||console.debug("[QR Code] No web component found");const c=to();let h=null;if(h=Fc.getAttributeAndCheckFalsey(l,"qrcode-logo-src"),c&&e.showLogo!==!0&&h===!1||(h||=Fc.getAttributeAndCheckFalsey(l,"logo-src"),c&&e.showLogo!==!0&&h===!1)||(h||=Fc.getAttributeAndCheckFalsey(l,"loading-logo-src",{onAttribute:()=>{A()?console.warn("[QR Code] 'loading-logo-src' is deprecated, please use 'logo-src' or 'qrcode-logo-src' instead."):console.debug("[QR Code] 'loading-logo-src' is deprecated.")}}),c&&e.showLogo!==!0&&h===!1)||(h&&!c&&(console.warn("[QR Code] Custom logo is only available with a commercial license. Using default Needle logo. Please get a commercial license at https://needle.tools/pricing."),h=null),h||=ol,!h))return;let d=!1;e.showLogo!==!1&&(a.src=h,d=await new Promise((C,O)=>{a.onload=()=>C(!0),a.onerror=k=>{const j=h!==ol?"'"+h+"'":null;console.error("[QR Code] Error loading logo image for QR code",j,A()?k:""),C(!1)}}));const p=document.createElement("canvas");p.width=o.width+t,p.height=o.height+t;const m=p.getContext("2d");if(!m)return;m.fillStyle="#ffffff",m.fillRect(0,0,p.width,p.height),m.drawImage(o,t/2,t/2),m.imageSmoothingEnabled=!0,m.imageSmoothingQuality="high",m.mozImageSmoothingEnabled=!0,m.webkitImageSmoothingEnabled=!0,m.globalCompositeOperation="lighten";const f=m.createLinearGradient(0,0,0,p.height);f.addColorStop(0,"rgb(45, 45, 45)"),f.addColorStop(1,"rgb(45, 45, 45)"),m.fillStyle=f,m.fillRect(0,0,p.width,p.height),m.globalCompositeOperation="source-over";let g=Math.min(o.width,o.height)*(e.logoSize||.25),y=g;if(d){const C=a.width/a.height;C>1?y=g/C:g=y*C;const O=n*o.width,k=Math.max(g,y),j=Math.round(k+O),L=Math.round(k+O),V=(p.width-k)/2,W=(p.height-k)/2;m.shadowColor=s,m.shadowBlur=i;const G=r,X=Math.round(V-O/2),R=Math.round(W-O/2);m.beginPath(),m.moveTo(X+G,R),m.lineTo(X+j-G,R),m.quadraticCurveTo(X+j,R,X+j,R+G),m.lineTo(X+j,R+L-G),m.quadraticCurveTo(X+j,R+L,X+j-G,R+L),m.lineTo(X+G,R+L),m.quadraticCurveTo(X,R+L,X,R+L-G),m.lineTo(X,R+G),m.quadraticCurveTo(X,R,X+G,R),m.fillStyle="#ffffff",m.closePath(),m.fill(),m.clip(),m.shadowColor="transparent";const $=(p.width-g)/2,q=(p.height-y)/2;m.drawImage(a,$,q,g,y)}const _=p.toDataURL("image/png"),v=document.createElement("img");return v.src=_,v.style.width="100%",v.style.height="auto",v}const mf="Material Symbols Outlined";function vt(o){const e=document.createElement("span");return e.style.maxWidth="48px",e.style.maxHeight="48px",e.style.overflow="hidden",e.classList.add("material-symbols-outlined","notranslate"),e.setAttribute("translate","no"),e.innerText=o,e.style.visibility="hidden",e.style.userSelect="none",e.setAttribute("role","img"),e.setAttribute("aria-label",o+" icon"),e.setAttribute("aria-hidden","true"),yf(mf).then(t=>{t?(e.style.visibility="",e.innerText=o):o==="more_vert"?(e.style.visibility="",e.innerText="More"):e.style.display="none"}),e}function yw(o){return o.classList?.contains("material-symbols-outlined")||!1}const Cu=new Map;async function gf(o){if(await yf(mf),Cu.has(o))return Cu.get(o);const e=document.createElement("canvas"),t=48;e.width=t,e.height=t;const i=e.getContext("2d");if(i){i.font=`${t}px '${mf}'`,i.fillStyle="black",i.fillText(o,0,t);const n=e.toDataURL(),s=new Se;return s.name=o+" icon",s.image=new Image,s.image.src=n,s.needsUpdate=!0,Cu.set(o,s),s}return Cu.set(o,null),null}const ff=new Map;async function yf(o,e=5,t=0){document.fonts.check(`1em '${o}'`)||await document.fonts.ready;const i=ff.get(o)||document.fonts.load(`1em '${o}'`).then(n=>n?.length>0).finally(()=>{ff.delete(o)});return ff.set(o,i),await i?!0:t<e?new Promise(n=>{setTimeout(()=>{n(yf(o,e,t+1))},1e3)}):!1}function Pu(o,e){o.setAttribute("priority",String(e))}function KM(o){const e=o.getAttribute("priority");if(e){const t=Number.parseFloat(e);if(!Number.isNaN(t))return t}}class _n{static _instance;static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new _n),this._instance}static create(){return new _n}_fullscreenButton;get fullscreenButton(){return this._fullscreenButton}createFullscreenButton(e){if(this._fullscreenButton)return this._fullscreenButton;if(!document.fullscreenEnabled)return A()&&console.warn("NeedleMenu: Fullscreen button could not be created, device doesn't support the Fullscreen API"),null;const t=document.createElement("button");this._fullscreenButton=t,t.classList.add("fullscreen-button"),t.title="Click to enter fullscreen mode",Pu(t,3);const i=vt("fullscreen"),n=vt("fullscreen_exit");return t.appendChild(i),t.onclick=()=>{document.fullscreenElement?document.exitFullscreen():"webkitRequestFullscreen"in e.domElement&&typeof e.domElement.webkitRequestFullscreen=="function"?e.domElement.webkitRequestFullscreen():"requestFullscreen"in e.domElement&&e.domElement.requestFullscreen()},document.addEventListener("fullscreenchange",()=>{document.fullscreenElement?(i.remove(),t.appendChild(n),t.title="Click to enter fullscreen mode"):(n.remove(),t.appendChild(i),t.title="Click to exit fullscreen mode")}),globalThis.addEventListener("needle-xrsession-start",()=>{t.style.display="none"}),globalThis.addEventListener("needle-xrsession-end",()=>{t.style.display=""}),t}_muteButton;get muteButton(){return this._muteButton}createMuteButton(e){if(this._muteButton)return this._muteButton;const t=document.createElement("button");this._muteButton=t,t.classList.add("mute-button"),t.title="Click to mute/unmute";const i=vt("volume_off"),n=vt("volume_up");return Pu(t,1),e.application.muted?t.appendChild(i):t.appendChild(n),t.onclick=()=>{e.application.muted?(i.remove(),t.appendChild(n),e.application.muted=!1):(n.remove(),t.appendChild(i),e.application.muted=!0)},t}_qrButton;get qrButton(){return this._qrButton}_customQRButtonUrl;set qrButtonUrl(e){try{new URL(e),this._customQRButtonUrl=e}catch{console.warn(`[Needle] QR code button URL is not a valid URL '${e}'`)}}get qrButtonUrl(){return this._customQRButtonUrl||window.location.href}createQRCode(e){if(this._qrButton)return this._qrButton;const t=this,i=document.createElement("button");this._qrButton=i,i.innerText="QR Code",i.prepend(vt("qr_code")),i.title="Scan this QR code with your phone to open this page",this.hideElementDuringXRSession(i),Pu(this._qrButton,20);const n=document.createElement("div");n.style.cssText=`
|
|
412
|
+
position: fixed;
|
|
413
|
+
display: inline-block;
|
|
414
|
+
padding: 0.5rem;
|
|
415
|
+
background-color: white;
|
|
416
|
+
border-radius: 0.4rem;
|
|
417
|
+
cursor: pointer;
|
|
418
|
+
z-index: 1000;
|
|
419
|
+
box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
|
|
420
|
+
`;const s=document.createElement("div");s.classList.add("qr-code-container"),n.appendChild(s),i.addEventListener("click",()=>{if(n.parentNode)return a();A()&&window.location.href.includes("://localhost")&&be("To access your website from another device in the same local network you have to use the IP address instead of localhost. The IP address is logged in your development server console when you start the server."),r()});async function r(){await l();const c=document.body.querySelector("needle-engine"),h=e?.anchorElement?.parentElement||c||document.body;h.appendChild(n);const d=s.getBoundingClientRect(),p=i.getBoundingClientRect();n.style.left=p.left+p.width*.5-d.width*.5+"px";const m=p.top<d.height,f="1.3rem";m?n.style.top=`calc(${p.bottom}px + ${n.style.padding} + 0.0rem)`:n.style.top=`calc(${p.top-d.height}px - ${n.style.padding} - ${f})`,n.style.opacity="0",n.style.pointerEvents="all",n.style.transition="opacity 0.2s ease-in-out",setTimeout(()=>{n.style.opacity="1",window.addEventListener("click",a,{once:!0})}),window.addEventListener("resize",a),window.addEventListener("scroll",a),document.fullscreenElement?document.fullscreenElement.appendChild(n):h.appendChild(n)}function a(){n.style.pointerEvents="none",n.style.transition="opacity 0.2s",n.style.opacity="0",setTimeout(()=>n.parentNode?.removeChild(n),500),window.removeEventListener("click",a),window.removeEventListener("resize",a),window.removeEventListener("scroll",a)}async function l(){const c=await fw({text:t.qrButtonUrl,width:200,height:200});s.innerHTML="",s.appendChild(c)}return i.addEventListener("pointerenter",()=>{l()},{once:!0}),i}hideElementDuringXRSession(e){Su(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),pf(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}}const bw="https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap",bf="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block";function Uc(o,e){const t=e?.element||document.head,i=Array.from(t.querySelectorAll(`link[href*='${o}']`));if(i.length<=0){const n=document.createElement("link");n.href=o,n.rel="preload",n.as="style",n.crossOrigin="",n.onload=()=>{n.rel="stylesheet"},t.appendChild(n),i.push(n)}if(e?.loadedCallback)for(let n=0;n<i.length;n++)e?.loadedCallback&&i[n].addEventListener("load",e.loadedCallback)}function _w(){Uc(bw)}const Ou="needle-logo-element";class Dm extends HTMLElement{static get elementName(){return Ou}static create(){return customElements.get(Ou)||customElements.define(Ou,Dm),document.createElement(Ou)}_didInitialize=!1;constructor(){super()}initializeDom(){this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
|
|
421
|
+
:host {
|
|
422
|
+
position: relative;
|
|
423
|
+
min-width: fit-content;
|
|
424
|
+
/* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
|
|
425
|
+
display: flex;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.wrapper {
|
|
429
|
+
position: relative;
|
|
430
|
+
display: grid;
|
|
431
|
+
grid-template-columns: auto auto;
|
|
432
|
+
padding: .1rem;
|
|
433
|
+
}
|
|
434
|
+
.wrapper:hover {
|
|
435
|
+
cursor: pointer;
|
|
436
|
+
}
|
|
437
|
+
img {
|
|
438
|
+
height: 100%;
|
|
439
|
+
align-self: end;
|
|
440
|
+
transition: transform 0.2s;
|
|
441
|
+
}
|
|
442
|
+
img.with-text {
|
|
443
|
+
width: 11.5ch;
|
|
444
|
+
&:hover {
|
|
445
|
+
transform: scale(1.02);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
img.compact {
|
|
449
|
+
width: 1.7em;
|
|
450
|
+
&:hover {
|
|
451
|
+
transform: scale(1.1);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
span {
|
|
455
|
+
font-size: 1rem;
|
|
456
|
+
white-space: nowrap;
|
|
457
|
+
}
|
|
458
|
+
</style>
|
|
459
|
+
<div class="wrapper">
|
|
460
|
+
<img class="logo with-text" src=${gw} />
|
|
461
|
+
</div>
|
|
462
|
+
`,this._root.appendChild(e.content.cloneNode(!0)),this.wrapper=this._root.querySelector(".wrapper"),this._root.appendChild(this.wrapper),this.logoElement=this._root.querySelector("img.logo"),this.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")})}ensureInitialized(){this._didInitialize||(this._didInitialize=!0,this.initializeDom())}connectedCallback(){this.ensureInitialized(),this.wrapper&&(this.wrapper.setAttribute("title","Made with Needle Engine"),this.setAttribute("aria-label","Needle Engine logo. Click to open the Needle Engine website."))}_root;wrapper;logoElement;setLogoVisible(e){this.ensureInitialized(),this.logoElement&&(this.logoElement.style.display=e?"block":"none")}setType(e){this.ensureInitialized(),this.logoElement&&(e==="full"?(this.logoElement.src=gw,this.logoElement.classList.remove("with-text"),this.logoElement.classList.remove("compact")):(this.logoElement.src=ol,this.logoElement.classList.add("with-text"),this.logoElement.classList.add("compact")))}}const _f=w("debugspatialmenu");class JM{_context;needleMenu;htmlButtonsMap=new Map;enabled=!0;constructor(e,t){this._context=e,this._context.pre_render_callbacks.push(this.preRender),this.needleMenu=t;const i=this.needleMenu.shadowRoot?.querySelector(".options");i?new MutationObserver(n=>{if(this.enabled&&!(this._context.isInXR==!1&&!_f))for(const s of n)s.type==="childList"&&(s.addedNodes.forEach(r=>{this.createButtonFromHTMLNode(r)}),s.removedNodes.forEach(r=>{const a=r,l=this.htmlButtonsMap.get(a);l&&(this.htmlButtonsMap.delete(a),l.remove(),Oe.update())}))}).observe(i,{childList:!0}):console.error("Could not find options container in needle menu")}setEnabled(e){this.enabled=e,e||this.menu?.removeFromParent()}userRequestedMenu=!1;setDisplay(e){return this.enabled?(this.userRequestedMenu=e,!0):!1}onDestroy(){const e=this._context.pre_render_callbacks.indexOf(this.preRender);e>-1&&this._context.pre_render_callbacks.splice(e,1)}uiisDirty=!1;markDirty(){this.uiisDirty=!0}_showNeedleLogo;showNeedleLogo(e){this._showNeedleLogo=e}_wasInXR=!1;preRender=()=>{if(!this.enabled){this.menu?.removeFromParent();return}_f&&I.isDesktop()&&this.updateMenu();const e=this._context.xr;if(!(e?.running&&(e?.isPassThrough||e?.isVR))){this._wasInXR&&(this._wasInXR=!1,this.onExitXR());return}this._wasInXR||(this._wasInXR=!0,this.onEnterXR()),this.updateMenu()};onEnterXR(){const e=this.needleMenu.shadowRoot?.querySelector(".options");e&&e.childNodes.forEach(t=>{this.createButtonFromHTMLNode(t)})}onExitXR(){this.menu?.removeFromParent()}createButtonFromHTMLNode(e){const t=this.getMenu(),i=this.htmlButtonsMap.get(e);if(i){i.add();return}if(e instanceof HTMLButtonElement){const n=this.createButton(t,e);this.htmlButtonsMap.set(e,n),n.add()}else e instanceof HTMLSlotElement&&e.assignedNodes().forEach(n=>{this.createButtonFromHTMLNode(n)})}_menuTarget=new M;positionFilter=new yg(90,.5);updateMenu(){const e=this.getMenu();this.handleNeedleWatermark(),this._context.scene.add(e);const t=this._context.mainCamera,i=this._context.xr?.rigScale||1;if(t){const n=t.worldPosition,s=t.worldForward.multiplyScalar(-1),r=s.y>.6,a=s.y>.4,l=(e.visible?a:r)||this.userRequestedMenu,c=!e.visible&&l;e.visible=l||I.isDesktop()&&_f,s.multiplyScalar(3*i),n.add(s),c&&(e.position.copy(this._menuTarget.position),e.position.y+=.25,this._menuTarget.position.copy(e.position),this.positionFilter.reset(e.position),e.quaternion.copy(this._menuTarget.quaternion),this.markDirty());const h=this._menuTarget.position.distanceTo(n);(c||h>1.5*i)&&(this.ensureRenderOnTop(this.menu),this._menuTarget.position.copy(n),this._context.scene.add(this._menuTarget),xc(this._menuTarget,this._context.mainCamera,!0,!0),this._menuTarget.removeFromParent()),this.positionFilter.filter(this._menuTarget.position,e.position,this._context.time.time),this.menu?.quaternion.slerp(this._menuTarget.quaternion,this._context.time.deltaTime*5),this.menu?.scale.setScalar(i)}this.uiisDirty&&(this.uiisDirty=!1,Oe.update())}ensureRenderOnTop(e,t=0){e instanceof H&&(e.material.depthTest=!1,e.material.depthWrite=!1),e.renderOrder=1e3+t*2;for(const i of e.children)this.ensureRenderOnTop(i,t+1)}familyName="Needle Spatial Menu";menu;get isVisible(){return this.menu?.visible}getMenu(){if(this.menu)return this.menu;this.ensureFont(),this.menu=new Oe.Block({boxSizing:"border-box",fontFamily:this.familyName,height:"auto",fontSize:.1,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:.55,borderRadius:1,whiteSpace:"pre-wrap",flexDirection:"row",alignItems:"center",padding:new ye(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=P.get("ObjectRaycaster");return e&&Wr(this.menu,new e),this.menu}_poweredByNeedleElement;handleNeedleWatermark(){if(!this._poweredByNeedleElement){this._poweredByNeedleElement=new Oe.Block({width:"auto",height:"auto",fontSize:.05,whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",margin:.02,borderRadius:.02,padding:.02,backgroundColor:16777215,backgroundOpacity:1}),this._poweredByNeedleElement["needle:use_eventsystem"]=!0;const e=new vw(this._context,()=>globalThis.open("https://needle.tools","_self"));Wr(this._poweredByNeedleElement,e);const t=new Oe.Text({textContent:"Powered by",width:"auto",height:"auto"}),i=new Oe.Text({textContent:"needle",width:"auto",height:"auto",fontSize:.07,margin:new ye(0,0,0,.02)});this._poweredByNeedleElement.add(t),this._poweredByNeedleElement.add(i),this.menu?.add(this._poweredByNeedleElement),this.markDirty(),new vr().load("https://cdn.needle.tools/static/branding/poweredbyneedle.webp",n=>{if(n){e.allowModifyUI=!1,t.removeFromParent(),i.removeFromParent();const s=n.image.width/n.image.height;this._poweredByNeedleElement?.set({backgroundImage:n,backgroundOpacity:1,width:.1*s,height:.1}),this.markDirty()}})}if(this.menu){const e=this.menu.children.indexOf(this._poweredByNeedleElement);if(!this._showNeedleLogo&&eo())e>=0&&(this._poweredByNeedleElement.removeFromParent(),this.markDirty());else{this._poweredByNeedleElement.visible=!0,this.menu.add(this._poweredByNeedleElement);const t=this.menu.children.indexOf(this._poweredByNeedleElement);e!==t&&this.markDirty()}}}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",()=>{this.markDirty()}))}createButton(e,t){const i=new Oe.Block({width:"auto",height:"auto",whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",backgroundColor:16777215,backgroundOpacity:0,padding:.02,margin:.01,borderRadius:.02,cursor:"pointer",fontSize:.05}),n=new Oe.Text({textContent:"",width:"auto",justifyContent:"center",alignItems:"center",backgroundOpacity:0,backgroundColor:16777215,fontFamily:this.familyName,color:0,borderRadius:.02,padding:.01});i.add(n),i["needle:use_eventsystem"]=!0;const s=new vw(this._context,()=>t.click());return Wr(i,s),new eE(this,e,t,i,n)}}class eE{menu;root;htmlbutton;spatialContainer;spatialText;spatialIcon;constructor(e,t,i,n,s){this.menu=e,this.root=t,this.htmlbutton=i,this.spatialContainer=n,this.spatialText=s,new MutationObserver(r=>{for(const a of r)a.type==="attributes"?a.attributeName==="style"&&this.updateVisible():a.type==="childList"&&this.updateText()}).observe(i,{attributes:!0,childList:!0}),this.updateText()}add(){this.spatialContainer.parent!=this.root&&(this.root.add(this.spatialContainer),this.menu.markDirty(),this.updateVisible(),this.updateText())}remove(){this.spatialContainer.parent&&(this.spatialContainer.removeFromParent(),this.menu.markDirty())}updateVisible(){const e=this.spatialContainer.visible;this.spatialContainer.visible=this.htmlbutton.style.display!=="none",e!==this.spatialContainer.visible&&this.menu.markDirty()}_lastText="";updateText(){let e="",t="";this.htmlbutton.childNodes.forEach(i=>{i.nodeType===Node.TEXT_NODE?e+=i.textContent:i instanceof HTMLElement&&yw(i)&&i.textContent&&(t=i.textContent)}),this._lastText!==e&&(this._lastText=e,this.spatialText.name=e,this.spatialText.set({textContent:e}),this.menu.markDirty()),e.length<=0?this.spatialText.parent&&(this.spatialText.removeFromParent(),this.menu.markDirty()):this.spatialText.parent||(this.spatialContainer.add(this.spatialText),this.menu.markDirty()),t&&this.createIcon(t)}_lastTexture;async createIcon(e){if(!this.spatialIcon){const i=await gf(e);if(i&&!this.spatialIcon){const n=new Oe.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:i,backgroundOpacity:1,margin:new ye(0,.005,0,0)});this.spatialIcon=n,this.spatialContainer.add(n),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const i=await gf(e);i&&(this.spatialIcon?.set({backgroundImage:i}),this.menu.markDirty())}const t=this.spatialContainer.children.indexOf(this.spatialIcon);t>0&&(this.spatialContainer.children.splice(t,1),this.spatialContainer.children.unshift(this.spatialIcon),this.menu.markDirty())}}class vw{isComponent=!0;enabled=!0;get activeAndEnabled(){return!0}__internalAwake(){}__internalEnable(){}__internalDisable(){}__internalStart(){}onEnable(){}onDisable(){}gameObject;allowModifyUI=!0;get element(){return this.gameObject}context;onclick;constructor(e,t){this.context=e,this.onclick=t}onPointerEnter(){this.context.input.setCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:1}),Oe.update())}onPointerExit(){this.context.input.unsetCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:0}),Oe.update())}onPointerDown(e){e.use()}onPointerUp(e){e.use()}onPointerClick(e){e.use(),this.onclick()}}const sl="needle-menu",rl=w("debugmenu"),ww=w("debugnoncommercial");let zc=class{static setElementPriority(o,e){Pu(o,e)}static getElementPriority(o){return KM(o)}_context;_menu;_spatialMenu;constructor(o){this._menu=Ed.getOrCreate(o.domElement,o),this._menu.ensureInitialized(),this._context=o,this._spatialMenu=new JM(o,this._menu),window.addEventListener("message",this.onPostMessage),Su(this.onStartXR)}onDestroy(){window.removeEventListener("message",this.onPostMessage),this._menu.remove(),this._spatialMenu.onDestroy()}onPostMessage=o=>{if(o.origin===globalThis.location.origin&&typeof o.data=="object"){const e=o.data,t=e.type;if(t==="needle:menu"){const i=e.button;if(i){if(!i.label)return console.error("NeedleMenu: buttoninfo.label is required");if(!i.onclick)return console.error("NeedleMenu: buttoninfo.onclick is required");const n=document.createElement("button");if(n.textContent=i.label,i.icon){const s=vt(i.icon);n.prepend(s)}i.priority&&n.setAttribute("priority",i.priority.toString()),n.onclick=()=>{if(i.onclick){const s=i.onclick.startsWith("http")||i.onclick.startsWith("www."),r=i.target||"_blank";s?globalThis.open(i.onclick,r):console.error("NeedleMenu: onclick is not a valid link",i.onclick)}},fi.sendEvent(this._context,"needle-menu",{action:"button_added_via_postmessage"}),this._menu.appendChild(n)}else rl&&console.error("NeedleMenu: unknown postMessage event",e)}else rl&&console.warn("NeedleMenu: unknown postMessage type",t,e)}};onStartXR=o=>{o.session.isScreenBasedAR&&(this._menu.previousParent=this._menu.parentNode,this._context.arOverlayElement.appendChild(this._menu),o.session.session.addEventListener("end",this.onExitXR),this._menu.closeFoldout())};onExitXR=()=>{this._menu.previousParent&&(this._menu.previousParent.appendChild(this._menu),delete this._menu.previousParent)};setPosition(o){this._menu.setPosition(o)}setVisible(o){this._menu.setVisible(o)}showNeedleLogo(o){this._menu.showNeedleLogo(o),this._spatialMenu?.showNeedleLogo(o)}get logoIsVisible(){return this._menu.logoIsVisible}showSpatialMenu(o){this._spatialMenu.setEnabled(o)}setSpatialMenuVisible(o){this._spatialMenu.setDisplay(o)}get spatialMenuIsVisible(){return this._spatialMenu.isVisible}showQRCodeButton(o){if(o==="desktop-only"&&(o=!I.isMobileDevice()),o){const e=_n.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=_n.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(o){if(!o){this._muteButton?.remove();return}this._muteButton=_n.getOrCreate().createMuteButton(this._context),this._menu.appendChild(this._muteButton)}_muteButton;showFullscreenOption(o){if(!o){this._fullscreenButton?.remove();return}this._fullscreenButton=_n.getOrCreate().createFullscreenButton(this._context),this._fullscreenButton&&this._menu.appendChild(this._fullscreenButton)}_fullscreenButton;appendChild(o){return this._menu.appendChild(o)}};class Ed extends HTMLElement{static create(){return customElements.get(sl)||customElements.define(sl,Ed),document.createElement(sl)}static getOrCreate(e,t){let i=e.querySelector(sl);return!i&&e.shadowRoot&&(i=e.shadowRoot.querySelector(sl)),i||(i=window.document.body.querySelector(sl)),i||(i=Ed.create(),e.shadowRoot?e.shadowRoot.appendChild(i):e.appendChild(i)),i._domElement=e,i._context=t,i}_domElement=null;_context=null;_didInitialize=!1;constructor(){super()}initializeDom(){const e=document.createElement("template");e.innerHTML=`<style>
|
|
463
|
+
|
|
464
|
+
/** Styling attributes that ensure the nested menu z-index does not cause it to overlay elements outside of <needle-engine> */
|
|
465
|
+
:host {
|
|
466
|
+
position: absolute;
|
|
467
|
+
width: 100%;
|
|
468
|
+
height: 100%;
|
|
469
|
+
z-index: 0;
|
|
470
|
+
top: 0;
|
|
471
|
+
pointer-events: none;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** we put base styles in a layer to allow overrides more easily (e.g. the button.mode requested animation should override the base styles) */
|
|
475
|
+
@layer base {
|
|
476
|
+
|
|
477
|
+
#root {
|
|
478
|
+
position: absolute;
|
|
479
|
+
width: auto;
|
|
480
|
+
max-width: 95%;
|
|
481
|
+
left: 50%;
|
|
482
|
+
transform: translateX(-50%);
|
|
483
|
+
top: min(20px, 10vh);
|
|
484
|
+
padding: 0.3rem;
|
|
485
|
+
display: flex;
|
|
486
|
+
visibility: visible;
|
|
487
|
+
flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
|
|
488
|
+
pointer-events: all;
|
|
489
|
+
z-index: 1000;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/** hide the menu if it's empty **/
|
|
493
|
+
#root.has-no-options.logo-hidden {
|
|
494
|
+
display: none;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/** using a div here because then we can change the class for placement **/
|
|
498
|
+
#root.bottom {
|
|
499
|
+
top: auto;
|
|
500
|
+
bottom: min(30px, 10vh);
|
|
501
|
+
}
|
|
502
|
+
#root.top {
|
|
503
|
+
top: calc(.7rem + env(safe-area-inset-top));
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.wrapper {
|
|
507
|
+
position: relative;
|
|
508
|
+
display: flex;
|
|
509
|
+
flex-direction: row;
|
|
510
|
+
justify-content: center;
|
|
511
|
+
align-items: stretch;
|
|
512
|
+
gap: 0px;
|
|
513
|
+
padding: 0 0rem;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.wrapper > *, .options > button, .options > select, ::slotted(*) {
|
|
517
|
+
position: relative;
|
|
518
|
+
border: none;
|
|
519
|
+
border-radius: 0;
|
|
520
|
+
outline: 1px solid rgba(0,0,0,0);
|
|
521
|
+
display: flex;
|
|
522
|
+
justify-content: center;
|
|
523
|
+
align-items: center;
|
|
524
|
+
max-height: 2.3rem;
|
|
525
|
+
max-width: 100%;
|
|
526
|
+
|
|
527
|
+
/** basic font settings for all entries **/
|
|
528
|
+
font-size: 1rem;
|
|
529
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
530
|
+
font-optical-sizing: auto;
|
|
531
|
+
font-weight: 400;
|
|
532
|
+
font-variation-settings: "wdth" 100;
|
|
533
|
+
color: rgb(20,20,20);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.options > select[multiple]:hover {
|
|
537
|
+
max-height: 300px;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.floating-panel-style {
|
|
541
|
+
background: rgba(255, 255, 255, .4);
|
|
542
|
+
outline: rgb(0 0 0 / 5%) 1px solid;
|
|
543
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
544
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
545
|
+
border-radius: 1.5rem;
|
|
546
|
+
/**
|
|
547
|
+
* to make nested background filter work
|
|
548
|
+
* https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
|
|
549
|
+
**/
|
|
550
|
+
&::before {
|
|
551
|
+
content: '';
|
|
552
|
+
position: absolute;
|
|
553
|
+
width: 100%;
|
|
554
|
+
height: 100%;
|
|
555
|
+
top: 0;
|
|
556
|
+
left: 0;
|
|
557
|
+
z-index: -1;
|
|
558
|
+
border-radius: 1.5rem;
|
|
559
|
+
-webkit-backdrop-filter: blur(8px);
|
|
560
|
+
backdrop-filter: blur(8px);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
a {
|
|
565
|
+
color: inherit;
|
|
566
|
+
text-decoration: none;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.options {
|
|
570
|
+
display: flex;
|
|
571
|
+
flex-direction: row;
|
|
572
|
+
align-items: center;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
.options > *, ::slotted(*) {
|
|
576
|
+
max-height: 2.25rem;
|
|
577
|
+
padding: .4rem .5rem;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
:host .options > *, ::slotted(*) {
|
|
581
|
+
background: transparent;
|
|
582
|
+
border: none;
|
|
583
|
+
white-space: nowrap;
|
|
584
|
+
transition: all 0.1s linear .02s;
|
|
585
|
+
border-radius: 1.5rem;
|
|
586
|
+
user-select: none;
|
|
587
|
+
}
|
|
588
|
+
:host .options > *:hover, ::slotted(*:hover) {
|
|
589
|
+
cursor: pointer;
|
|
590
|
+
color: black;
|
|
591
|
+
background: rgba(245, 245, 245, .8);
|
|
592
|
+
box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
|
|
593
|
+
outline: rgba(0,0,0,.1) 1px solid;
|
|
594
|
+
}
|
|
595
|
+
:host .options > *:active, ::slotted(*:active) {
|
|
596
|
+
background: rgba(255, 255, 255, .8);
|
|
597
|
+
box-shadow: inset 0px 1px 1px rgba(255,255,255,.5), inset 0 0 2rem rgba(0,0,30,.2), inset 0px 2px 4px rgba(0,0,20,.5);
|
|
598
|
+
transition: all 0.05s linear;
|
|
599
|
+
}
|
|
600
|
+
:host .options > *:focus, ::slotted(*:focus) {
|
|
601
|
+
outline: rgba(255,255,255,.5) 1px solid;
|
|
602
|
+
}
|
|
603
|
+
:host .options > *:focus-visible, ::slotted(*:focus-visible) {
|
|
604
|
+
outline: rgba(0,0,0,.5) 1px solid;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
:host .options > *:disabled, ::slotted(*:disabled) {
|
|
608
|
+
background: rgba(0,0,0,.05);
|
|
609
|
+
color: rgba(60,60,60,.7);
|
|
610
|
+
pointer-events: none;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
button, ::slotted(button) {
|
|
615
|
+
gap: 0.3rem;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/** XR button animation **/
|
|
619
|
+
|
|
620
|
+
:host button.this-mode-is-requested {
|
|
621
|
+
background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
|
|
622
|
+
background-size: 200% auto;
|
|
623
|
+
background-position: 0 100%;
|
|
624
|
+
animation: AnimationName .7s ease infinite forwards;
|
|
625
|
+
}
|
|
626
|
+
:host button.other-mode-is-requested {
|
|
627
|
+
opacity: .5;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
@keyframes AnimationName {
|
|
631
|
+
0% {
|
|
632
|
+
background-position: 0% 0
|
|
633
|
+
}
|
|
634
|
+
100% {
|
|
635
|
+
background-position: -200% 0
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
.logo {
|
|
643
|
+
cursor: pointer;
|
|
644
|
+
padding-left: 0.5em;
|
|
645
|
+
padding-bottom: .02em;
|
|
646
|
+
margin-right: 0.6em;
|
|
647
|
+
}
|
|
648
|
+
.logo-hidden {
|
|
649
|
+
.logo {
|
|
650
|
+
display: none;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
:host .has-options .logo {
|
|
654
|
+
border-left: 1px solid rgba(40,40,40,.4);
|
|
655
|
+
margin-left: 0.3em;
|
|
656
|
+
margin-right: 0.6em;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.logo > span {
|
|
660
|
+
white-space: nowrap;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
/** COMPACT */
|
|
666
|
+
|
|
667
|
+
/** Hide the menu button normally **/
|
|
668
|
+
.compact-menu-button { display: none; }
|
|
669
|
+
|
|
670
|
+
/** Hide the compact only options when not in compact mode */
|
|
671
|
+
.options.compact-only { display: none; }
|
|
672
|
+
|
|
673
|
+
/** And show it when we're in compact mode **/
|
|
674
|
+
.compact .compact-menu-button {
|
|
675
|
+
position: relative;
|
|
676
|
+
display: block;
|
|
677
|
+
background: none;
|
|
678
|
+
border: none;
|
|
679
|
+
border-radius: 2rem;
|
|
680
|
+
|
|
681
|
+
margin: 0;
|
|
682
|
+
padding: 0 .3rem;
|
|
683
|
+
padding-top: .2rem;
|
|
684
|
+
|
|
685
|
+
z-index: 100;
|
|
686
|
+
|
|
687
|
+
color: #000;
|
|
688
|
+
|
|
689
|
+
&:hover {
|
|
690
|
+
background: rgba(255,255,255,.2);
|
|
691
|
+
cursor: pointer;
|
|
692
|
+
}
|
|
693
|
+
&:focus {
|
|
694
|
+
outline: 1px solid rgba(255,255,255,.5);
|
|
695
|
+
}
|
|
696
|
+
&:focus-visible {
|
|
697
|
+
outline: 1px solid rgba(0,0,0,.5);
|
|
698
|
+
}
|
|
699
|
+
& .expanded-click-area {
|
|
700
|
+
position: absolute;
|
|
701
|
+
left: 0;
|
|
702
|
+
right: 0;
|
|
703
|
+
top: 10%;
|
|
704
|
+
bottom: 10%;
|
|
705
|
+
transform: scale(1.8);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
.has-no-options .compact-menu-button {
|
|
709
|
+
display: none;
|
|
710
|
+
}
|
|
711
|
+
.open .compact-menu-button {
|
|
712
|
+
background: rgba(255,255,255,.2);
|
|
713
|
+
}
|
|
714
|
+
.logo-visible .compact-menu-button {
|
|
715
|
+
margin-left: .2rem;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/** Open and hide menu **/
|
|
719
|
+
.compact .foldout {
|
|
720
|
+
display: none;
|
|
721
|
+
}
|
|
722
|
+
.open .options, .open .foldout {
|
|
723
|
+
display: flex;
|
|
724
|
+
justify-content: center;
|
|
725
|
+
}
|
|
726
|
+
.compact .wrapper {
|
|
727
|
+
padding: 0;
|
|
728
|
+
}
|
|
729
|
+
.compact .wrapper, .compact .options {
|
|
730
|
+
height: auto;
|
|
731
|
+
max-height: initial;
|
|
732
|
+
flex-direction: row;
|
|
733
|
+
gap: .12rem;
|
|
734
|
+
}
|
|
735
|
+
.compact .options {
|
|
736
|
+
flex-wrap: wrap;
|
|
737
|
+
gap: .3rem;
|
|
738
|
+
}
|
|
739
|
+
.compact .top .options {
|
|
740
|
+
height: auto;
|
|
741
|
+
flex-direction: row;
|
|
742
|
+
}
|
|
743
|
+
.compact .bottom .wrapper {
|
|
744
|
+
height: auto;
|
|
745
|
+
flex-direction: column;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.compact .foldout {
|
|
749
|
+
max-height: min(100ch, calc(100vh - 100px));
|
|
750
|
+
overflow: auto;
|
|
751
|
+
overflow-x: hidden;
|
|
752
|
+
align-items: center;
|
|
753
|
+
|
|
754
|
+
position: fixed;
|
|
755
|
+
bottom: calc(100% + 5px);
|
|
756
|
+
z-index: 100;
|
|
757
|
+
width: auto;
|
|
758
|
+
max-width: 90vw;
|
|
759
|
+
left: 50%;
|
|
760
|
+
transform: translateX(-50%);
|
|
761
|
+
padding: .2rem 1em;
|
|
762
|
+
|
|
763
|
+
}
|
|
764
|
+
.compact.logo-hidden .foldout {
|
|
765
|
+
/** for when there's no logo we want to center the foldout **/
|
|
766
|
+
min-width: 24ch;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
.compact.top .foldout {
|
|
770
|
+
top: calc(100% + 5px);
|
|
771
|
+
bottom: auto;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
::-webkit-scrollbar {
|
|
775
|
+
max-width: 7px;
|
|
776
|
+
background: rgba(100,100,100,.2);
|
|
777
|
+
border-radius: .2rem;
|
|
778
|
+
}
|
|
779
|
+
::-webkit-scrollbar-thumb {
|
|
780
|
+
background: rgba(255, 255, 255, .3);
|
|
781
|
+
border-radius: .2rem;
|
|
782
|
+
}
|
|
783
|
+
::-webkit-scrollbar-thumb:hover {
|
|
784
|
+
background: rgb(150,150,150);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
.compact .options > *, .compact .options > ::slotted(*) {
|
|
788
|
+
font-size: 1.2em;
|
|
789
|
+
padding: .6em .5em;
|
|
790
|
+
width: 100%;
|
|
791
|
+
}
|
|
792
|
+
.compact.has-options .logo {
|
|
793
|
+
border: none;
|
|
794
|
+
padding-left: 0;
|
|
795
|
+
margin-bottom: .02em;
|
|
796
|
+
}
|
|
797
|
+
.compact .options.compact-only {
|
|
798
|
+
display: initial;
|
|
799
|
+
& > * {
|
|
800
|
+
min-height: 1em;
|
|
801
|
+
padding: .4em .4em;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
.compact .options {
|
|
805
|
+
/** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
|
|
806
|
+
max-width: 100%;
|
|
807
|
+
|
|
808
|
+
& > button, & > select {
|
|
809
|
+
display: flex;
|
|
810
|
+
flex-basis: 100%;
|
|
811
|
+
min-height: 3rem;
|
|
812
|
+
min-width: 3rem;
|
|
813
|
+
}
|
|
814
|
+
& > button.row2 {
|
|
815
|
+
//border: 1px solid red !important;
|
|
816
|
+
display: flex;
|
|
817
|
+
flex: 1;
|
|
818
|
+
flex-basis: 30%;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
/** If there's really not enough space then just hide all options **/
|
|
823
|
+
@media (max-width: 100px) or (max-height: 100px){
|
|
824
|
+
.foldout {
|
|
825
|
+
display: none !important;
|
|
826
|
+
}
|
|
827
|
+
.compact-menu-button {
|
|
828
|
+
display: none !important;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
</style>
|
|
833
|
+
|
|
834
|
+
<div id="root" class="logo-hidden floating-panel-style bottom">
|
|
835
|
+
<div class="wrapper">
|
|
836
|
+
<div class="options compact-only" part="options">
|
|
837
|
+
</div>
|
|
838
|
+
<div class="foldout">
|
|
839
|
+
<div class="options main-container" part="options">
|
|
840
|
+
<slot></slot>
|
|
841
|
+
</div>
|
|
842
|
+
<div class="options" part="options">
|
|
843
|
+
<slot name="end"></slot>
|
|
844
|
+
</div>
|
|
845
|
+
</div>
|
|
846
|
+
<div style="user-select:none;" class="logo">
|
|
847
|
+
<span class="madewith notranslate" style="display:none;">powered by</span>
|
|
848
|
+
</div>
|
|
849
|
+
</div>
|
|
850
|
+
<button class="compact-menu-button">
|
|
851
|
+
<div class="expanded-click-area"></div>
|
|
852
|
+
</button>
|
|
853
|
+
</div>
|
|
854
|
+
`;const t=this.attachShadow({mode:"open"});_w(),Uc(bf,{loadedCallback:()=>{this.handleSizeChange()}}),Uc(bf,{element:t});const i=e.content.cloneNode(!0);t?.appendChild(i),this.root=t.querySelector("#root"),this.wrapper=this.root?.querySelector(".wrapper"),this.options=this.root?.querySelector(".options.main-container"),this.optionsCompactMode=this.root?.querySelector(".options.compact-only"),this.logoContainer=this.root?.querySelector(".logo"),this.compactMenuButton=this.root?.querySelector(".compact-menu-button"),this.compactMenuButton.append(vt("more_vert")),this.foldout=this.root?.querySelector(".foldout"),this.root?.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const n=Dm.create();n.setType("compact"),n.style.minHeight="1rem",this.logoContainer.append(n),this.logoContainer.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")});try{window.requestAnimationFrame(()=>Hk(c=>{if(c==!0&&to()&&!ww){let h=this._userRequestedLogoVisible;h===void 0&&(h=!1),this.___onSetLogoVisible(h)}else this.___onSetLogoVisible(!0)}))}catch(c){console.error("[Needle Menu] License check failed.",c)}this.compactMenuButton.addEventListener("click",c=>{c.preventDefault(),this.root.classList.toggle("open")});let s=this._context;setTimeout(()=>s=this._context);let r=0;const a=(c,h)=>{rl&&console.log("Set menu visible",h),s?.isInAR&&s.arOverlayElement?c!=s.arOverlayElement&&s.arOverlayElement.appendChild(this):this.parentNode!=this._domElement?.shadowRoot&&this._domElement?.shadowRoot?.appendChild(this),this.style.display=h?"flex":"none",this.style.visibility="visible",this.style.opacity="1"};let l=!1;new MutationObserver(c=>{if(!l)try{l=!0,this.onChangeDetected(c);const h=this?.parentNode;if((this.style.display!="flex"||this.style.visibility!="visible"||this.style.opacity!="1"||h!=this._domElement?.shadowRoot)&&!to()){const d=r++;Di()&&this._userRequestedMenuVisible===!1?(d===0&&a(h,this._userRequestedMenuVisible),d===1&&console.warn("Needle Menu Warning: You need a PRO license to hide the Needle Engine menu \u2192 The menu will be visible in your deployed website if you don't have a PRO license. See https://needle.tools/pricing for details.")):d===0?a(h,!0):setTimeout(()=>a(h,!0),5)}}finally{l=!1}}).observe(this.root,{childList:!0,subtree:!0,attributes:!0}),rl&&this.___insertDebugOptions()}ensureInitialized(){this._didInitialize||(this._didInitialize=!0,this.initializeDom())}_sizeChangeInterval;connectedCallback(){this.ensureInitialized(),window.addEventListener("resize",this.handleSizeChange),this.handleMenuVisible(),this._sizeChangeInterval=setInterval(()=>this.handleSizeChange(void 0,!1),5e3),setTimeout(()=>{this._domElement?.addEventListener("resize",this.handleSizeChange),this._domElement?.addEventListener("click",this.#t)},1)}disconnectedCallback(){window.removeEventListener("resize",this.handleSizeChange),clearInterval(this._sizeChangeInterval),this._domElement?.removeEventListener("resize",this.handleSizeChange),this._context?.domElement.removeEventListener("click",this.#t)}#t=e=>{if(!e.defaultPrevented&&e.target==this._domElement&&e instanceof PointerEvent&&e.button===0&&this.root.classList.contains("open")){const t=this.foldout.getBoundingClientRect(),i=e;i.clientX>t.left&&i.clientX<t.right&&i.clientY>t.top&&i.clientY<t.bottom||this.root.classList.toggle("open",!1)}};_userRequestedLogoVisible=void 0;showNeedleLogo(e){this._userRequestedLogoVisible=e,!(!e&&(!to()||ww)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!Di()))&&this.___onSetLogoVisible(e)}get logoIsVisible(){return!this.root.classList.contains("logo-hidden")}___onSetLogoVisible(e){this.logoContainer.style.display="",this.logoContainer.style.opacity="1",this.logoContainer.style.visibility="visible",e?(this.root.classList.remove("logo-hidden"),this.root.classList.add("logo-visible")):(this.root.classList.remove("logo-visible"),this.root.classList.add("logo-hidden"))}setPosition(e){if(e!=="top"&&e!=="bottom")return console.error("NeedleMenu.setPosition: invalid position",e);this.root.classList.remove("top","bottom"),this.root.classList.add(e)}_userRequestedMenuVisible=void 0;setVisible(e){this._userRequestedMenuVisible=e,this.style.display=e?"flex":"none"}closeFoldout(){this.root.classList.remove("open")}root;wrapper;options;optionsCompactMode;logoContainer;compactMenuButton;foldout;trackedElements=new WeakSet;trackElement(e){this.trackedElements.has(e)||(this.trackedElements.add(e),e.addEventListener("click",t=>{fi.sendEvent(this._context,"needle-menu",{action:"button_clicked",element:t.target instanceof Node?t.target.nodeName:e.nodeName,label:e.textContent,title:e instanceof HTMLElement?e.title:void 0,pointerid:t instanceof PointerEvent?t.pointerId:void 0})}))}append(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.trackElement(i),this.options.appendChild(i)}else this.trackElement(t),this.options.appendChild(t)}appendChild(e){if(!(e instanceof Node)){const t=document.createElement("button");if(t.textContent=e.label,t.onclick=e.onClick,t.setAttribute("priority",e.priority?.toString()??"0"),e.title&&(t.title=e.title),e.icon){const i=vt(e.icon);e.iconSide==="right"?t.appendChild(i):t.prepend(i)}e.class&&t.classList.add(e.class),e=t}return this.trackElement(e),this.options.appendChild(e)}prepend(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.trackElement(i),this.options.prepend(i)}else this.trackElement(t),this.options.prepend(t)}_isHandlingChange=!1;_pauseMutationObserverOptionsContainer=!1;onChangeDetected(e){if(!this._isHandlingChange){this._isHandlingChange=!0;try{this.handleMenuVisible();for(const t of e)t.target==this.options&&(this._pauseMutationObserverOptionsContainer||this.onOptionsChildrenChanged(t))}finally{this._isHandlingChange=!1}}}onOptionsChildrenChanged(e){if(this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions),this.handleSizeChange(void 0,!0),e.type==="childList"&&e.addedNodes.length>0){const t=Array.from(this.options.children);t.sort((n,s)=>{const r=parseInt(n.getAttribute("priority")||"0"),a=parseInt(s.getAttribute("priority")||"0");return r-a});let i=!1;for(let n=0;n<t.length;n++){const s=this.options.children[n],r=t[n];if(s!==r){i=!0;break}}if(i)for(const n of t)this.options.appendChild(n)}}_didSort=new Map;handleMenuVisible(){rl&&console.log("Update VisibleState: Any Content?",this.hasAnyContent),this.hasAnyContent?this.root.style.display="":this.root.style.display="none",this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions)}get hasAnyContent(){return!!(this.logoContainer.style.display!="none"||this.hasAnyVisibleOptions)}get hasAnyVisibleOptions(){for(let e=0;e<this.options.children.length;e++){const t=this.options.children[e];if(t.tagName==="SLOT"){const i=t.assignedNodes();for(const n of i)if(n instanceof HTMLElement&&n.style.display!="none")return!0}else if(t.style.display!="none")return!0}return!1}_lastAvailableWidthChange=0;_timeoutHandleSize=0;_timeoutHandleCompactItems=0;handleSizeChange=(e,t)=>{if(!this._domElement)return;const i=this._domElement.clientWidth;if(i<100){clearTimeout(this._timeoutHandleSize),this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style");return}const n=i-20;if(!t&&Math.abs(n-this._lastAvailableWidthChange)<1)return;this._lastAvailableWidthChange=n,clearTimeout(this._timeoutHandleSize),this._timeoutHandleSize=setTimeout(()=>{const l=a();l<0?(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")):l>0&&(this.root.classList.remove("compact"),this.foldout.classList.remove("floating-panel-style"),a()<0&&(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style"))),this._pauseMutationObserverOptionsContainer=!0,this.updateCompactFoldoutItem(),window.requestAnimationFrame(()=>this._pauseMutationObserverOptionsContainer=!1)},150);const s=()=>{let l=0;return l+=this.options.getBoundingClientRect().width,l+=this.optionsCompactMode.getBoundingClientRect().width,l+=10*this.options.childElementCount,l+=this.logoContainer.style.display!="none"?this.logoContainer.getBoundingClientRect().width:0,l};let r=-1;const a=()=>{const l=n-s();return rl&&l!==r&&(r=l,ke(`Menu space left: ${l.toFixed(0)}px`)),l}};updateCompactFoldoutItem(){if(this.root.classList.contains("compact")){let e=null,t=-1e7;const i=n=>{if(n instanceof HTMLElement){const s=zc.getElementPriority(n);if(s!==void 0&&s>=t){const r=window.getComputedStyle(n);if(r.display==="none"||r.visibility==="hidden"||r.opacity==="0")return;e=n,t=s}}};for(let n=0;n<this.options.children.length;n++)i(this.options.children.item(n));for(let n=0;n<this.optionsCompactMode.children.length;n++)i(this.optionsCompactMode.children.item(n));if(e&&!this.optionsCompactMode.contains(e)){this.optionsCompactMode.childNodes.forEach(s=>{this.options.appendChild(s)});const n=e;this.optionsCompactMode.appendChild(n)}else e||this.optionsCompactMode.childNodes.forEach(n=>{this.options.appendChild(n)})}else this.optionsCompactMode.childNodes.forEach(e=>{this.options.appendChild(e)})}___insertDebugOptions(){window.addEventListener("keydown",i=>{i.key==="p"&&this.setPosition(this.root.classList.contains("top")?"bottom":"top")});const e=document.createElement("button");e.textContent="Hide Buttons",e.onclick=()=>{const i=new Array(this.options.children.length);for(let n=0;n<this.options.children.length;n++)i[n]=this.options.children[n];for(const n of i)this.options.removeChild(n);setTimeout(()=>{for(const n of i)this.options.appendChild(n)},1e3)},this.appendChild(e);const t=document.createElement("button");t.textContent="Toggle Logo",t.addEventListener("click",()=>{this.logoContainer.style.display=this.logoContainer.style.display==="none"?"":"none"}),this.appendChild(t)}}const Ye=w("debugcontext"),tE=w("stats"),iE=w("debugactive"),nE=w("debugframerate"),oE=w("debugcoroutine"),sE={};class rE{name;alias;hash;runInBackground;domElement;renderer;camera;scene}var xe=(o=>(o[o.Start=-1]="Start",o[o.EarlyUpdate=0]="EarlyUpdate",o[o.Update=1]="Update",o[o.LateUpdate=2]="LateUpdate",o[o.OnBeforeRender=3]="OnBeforeRender",o[o.OnAfterRender=4]="OnAfterRender",o[o.PrePhysicsStep=9]="PrePhysicsStep",o[o.PostPhysicsStep=10]="PostPhysicsStep",o[o.Undefined=-1]="Undefined",o))(xe||{});function ku(o,e){if(!o)return;if(!o.isComponent){(A()||Ye)&&console.error(`Registered script is not a Needle Engine component.
|
|
855
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
856
|
+
`,o);return}e||(e=z.Current,Ye&&console.warn("> Registering component without context"));const t=e?.new_scripts;t.includes(o)||t.push(o)}class z{static _defaultTargetFramerate={value:90,toString(){return this.value}};static get DefaultTargetFrameRate(){return z._defaultTargetFramerate.value}static set DefaultTargetFrameRate(e){z._defaultTargetFramerate.value=e}static _defaultWebglRendererParameters={antialias:!0,alpha:!1,powerPreference:I.isiOS()||I.isMacOS()?"default":"high-performance",stencil:!0};static get DefaultWebGLRendererParameters(){return z._defaultWebglRendererParameters}get version(){return gi}static get Current(){return pe.Current}static set Current(e){pe.Current=e}static get All(){return pe.All}name;alias;isManagedExternally=!1;isPaused=!1;runInBackground=!1;targetFrameRate;physicsSteps=1;hash;domElement;appendHTMLElement(e){return this.domElement.shadowRoot?this.domElement.shadowRoot.appendChild(e):this.domElement.appendChild(e)}get resolutionScaleFactor(){return this._resolutionScaleFactor}set resolutionScaleFactor(e){if(e!==this._resolutionScaleFactor&&typeof e=="number"){if(e<=0){console.error("Invalid resolution scale factor",e);return}this._resolutionScaleFactor=e,this.updateSize()}}_resolutionScaleFactor=1;_boundingClientRectFrame=-1;_boundingClientRect=null;_domX;_domY;calculateBoundingClientRect(){if(this.xr){this._domX=0,this._domY=0;return}this._boundingClientRectFrame!==this.time.frame&&(this._boundingClientRectFrame=this.time.frame,this._boundingClientRect=this.domElement.getBoundingClientRect(),this._domX=this._boundingClientRect.x,this._domY=this._boundingClientRect.y)}get domWidth(){return this.isInAR?window.innerWidth:this.domElement.clientWidth}get domHeight(){return this.isInAR?window.innerHeight:this.domElement.clientHeight}get domX(){return this.calculateBoundingClientRect(),this._domX}get domY(){return this.calculateBoundingClientRect(),this._domY}get isInXR(){return this.renderer?.xr?.isPresenting||!1}xr=null;get xrSessionMode(){return this.xr?.mode}get isInVR(){return this.xrSessionMode==="immersive-vr"}get isInAR(){return this.xrSessionMode==="immersive-ar"}get isInPassThrough(){return this.xr?this.xr.isPassThrough:!1}get xrSession(){return this.renderer?.xr?.getSession()}get xrFrame(){return this._xrFrame}get xrCamera(){return this.renderer.xr.isPresenting?this.renderer?.xr?.getCamera():void 0}_xrFrame=null;get arOverlayElement(){const e=this.domElement;return typeof e.getAROverlayContainer=="function"?e.getAROverlayContainer():this.domElement}get currentFrameEvent(){return this._currentFrameEvent}_currentFrameEvent=-1;scene;renderer;get composer(){return this.postprocessing.composer}set composer(e){this.postprocessing.composer=e}scripts=[];scripts_pausedChanged=[];scripts_earlyUpdate=[];scripts_update=[];scripts_lateUpdate=[];scripts_onBeforeRender=[];scripts_onAfterRender=[];scripts_WithCorroutines=[];scripts_immersive_vr=[];scripts_immersive_ar=[];coroutines={};post_setup_callbacks=[];pre_update_callbacks=[];pre_render_callbacks=[];post_render_callbacks=[];pre_update_oneshot_callbacks=[];new_scripts=[];new_script_start=[];new_scripts_pre_setup_callbacks=[];new_scripts_post_setup_callbacks=[];new_scripts_xr=[];mainCameraComponent=void 0;get mainCamera(){if(this._mainCamera)return this._mainCamera;if(this.mainCameraComponent){const e=this.mainCameraComponent;return e.threeCamera||e.buildCamera(),e.threeCamera}return this._fallbackCamera||(this._fallbackCamera=new de(75,this.domWidth/this.domHeight,.1,1e3)),this._fallbackCamera}set mainCamera(e){this._mainCamera=e}_mainCamera=null;_fallbackCamera=null;application;animations;time;input;physics;postprocessing;connection;assets;mainLight=null;get rendererData(){return this.sceneLighting}sceneLighting;addressables;lightmaps;players;lodsManager;menu;accessibility;get isCreated(){return this._isCreated}get rootSourceId(){return this.rootSceneSourceIdentifiers[0]||void 0}_needsUpdateSize=!1;_isCreated=!1;_isCreating=!1;_isVisible=!1;_stats=tE?new RP:null;constructor(e){this.name=e?.name||"",this.alias=e?.alias,this.domElement=e?.domElement||document.body,this.hash=e?.hash,e?.renderer&&(this.renderer=e.renderer,this.isManagedExternally=!0),e?.runInBackground!==void 0&&(this.runInBackground=e.runInBackground),e?.scene?this.scene=e.scene:this.scene=new Ti,e?.camera&&(this._mainCamera=e.camera),this.application=new Gn(this),this.time=new lw,this.input=new Vv(this),this.physics=new dc(this),this.postprocessing=new uw(this),this.connection=new ew(this),this.assets=new Lw,this.sceneLighting=new sw(this),this.addressables=new Bv(this),this.lightmaps=new CM(this),this.players=new iw(this),this.menu=new zc(this),this.lodsManager=new PM(this),this.animations=new Dk(this),this.accessibility=new Im(this);const t=()=>this._needsUpdateSize=!0;window.addEventListener("resize",t),this._disposeCallbacks.push(()=>window.removeEventListener("resize",t));const i=new ResizeObserver(n=>this._needsUpdateSize=!0);i.observe(this.domElement),this._disposeCallbacks.push(()=>i.disconnect()),this._intersectionObserver=new IntersectionObserver(n=>{this._isVisible=n[0].isIntersecting}),this._disposeCallbacks.push(()=>this._intersectionObserver?.disconnect()),pe.register(this)}createNewRenderer(e){if(this.renderer?.dispose(),e={...z.DefaultWebGLRendererParameters,...e},!e.canvas){const t=this.domElement?.shadowRoot?.querySelector("canvas");t?(e.canvas=t,Ye&&console.log("Using canvas from shadow root",t)):Ye&&console.warn("No canvas found in shadow root, creating new canvas. This may cause input events to not work correctly. To fix this, make sure to use the canvas provided by the Needle Engine Web Component (e.g. by using context.createNewRenderer() without parameters or passing the canvas from the shadow root explicitly).")}return Ye&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new _r(e),this.renderer.domElement.setAttribute("aria-label","3D rendering"),this.renderer.domElement.setAttribute("role","img"),this.renderer.debug.checkShaderErrors=A()||w("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=Fd,this.renderer.setClearColor(new oe("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=gC,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=Io,this.renderer.nodes={library:new fC,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),Uk(this,this.renderer.domElement),this.renderer}_intersectionObserver=null;internalOnUpdateVisible(){this._intersectionObserver?.disconnect(),this._intersectionObserver?.observe(this.domElement)}_disposeCallbacks=[];requestSizeUpdate(){this._needsUpdateSize=!0}maxRenderResolution;get devicePixelRatio(){return this._devicePixelRatio}set devicePixelRatio(e){e!==this._devicePixelRatio&&(this._devicePixelRatio=e,this._needsUpdateSize=!0)}_devicePixelRatio="auto";updateSize(e=!1){if(e||!this.isManagedExternally&&this.renderer.xr?.isPresenting===!1){this._needsUpdateSize=!1;const t=this.resolutionScaleFactor;let i=this.domWidth*t,n=this.domHeight*t;this.maxRenderResolution&&(this.maxRenderResolution.x=Math.max(1,this.maxRenderResolution.x),i=Math.min(this.maxRenderResolution.x,i),this.maxRenderResolution.y=Math.max(1,this.maxRenderResolution.y),n=Math.min(this.maxRenderResolution.y,n));const s=this.mainCamera;this.updateAspect(s),this.renderer.setSize(i,n,!0),this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%";const r=typeof this.devicePixelRatio=="number"?this.devicePixelRatio:this.devicePixelRatio==="auto"?Math.min(2,window.devicePixelRatio):void 0;r!==void 0&&this.renderer.setPixelRatio(r),this.composer&&(this.composer.setSize?.call(this.composer,i,n),r!==void 0&&"setPixelRatio"in this.composer&&typeof this.composer.setPixelRatio=="function"&&this.composer.setPixelRatio?.call(this.composer,window.devicePixelRatio))}}updateAspect(e,t,i){if(!e)return;t===void 0&&(t=this.domWidth),i===void 0&&(i=this.domHeight);const n=t/i;if(e.isPerspectiveCamera){const s=e,r=s.aspect;s.aspect=n,r!==s.aspect&&e.updateProjectionMatrix()}else if(e.isOrthographicCamera){const s=e,r=s.top-s.bottom,a=r*n/2,l=r/2;(s.left!=-a||s.top!=l)&&(s.left=-a,s.right=a,s.top=l,s.bottom=-l,e.updateProjectionMatrix())}}recreate(){this.clear(),this.create(this._originalCreationArgs)}_originalCreationArgs;async onCreate(e){return this.create(e)}async create(e){try{this._isCreating=!0,e!==this._originalCreationArgs&&(this._originalCreationArgs=vc(e)),window.addEventListener("unhandledrejection",this.onUnhandledRejection);const t=await this.internalOnCreate(e);return this._isCreated=t,t}finally{window.removeEventListener("unhandledrejection",this.onUnhandledRejection),this._isCreating=!1}}onUnhandledRejection=e=>{this.onError(e.reason)};onError(e){this.domElement.dispatchEvent(new CustomEvent("error",{detail:e}))}clear(){pe.dispatchCallback(ue.ContextClearing,this),Jn(this,ue.ContextClearing),Ui(this.scene,!0,!0),this.scene=new Ti,this.addressables?.dispose(),this.lightmaps?.clear(),this.physics?.engine?.clearCaches(),this.lodsManager.disable(),this.accessibility?.clear(),this._onBeforeRenderListeners.clear(),this._onAfterRenderListeners.clear(),this.isManagedExternally||this.renderer&&(this.renderer.renderLists.dispose(),this.renderer.state.reset(),this.renderer.resetState()),pe.dispatchCallback(ue.ContextCleared,this)}dispose(){this.internalOnDestroy(),this.accessibility.dispose()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){z.Current=this,pe.dispatchCallback(ue.ContextDestroying,this),Jn(this,ue.ContextDestroying),this.clear(),this.renderer?.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(Ye&&console.log("Disposing renderer"),this.renderer.dispose())),this.scene=null,this.renderer=null,this.input.dispose(),this.menu.onDestroy(),this.animations.onDestroy();for(const e of this._disposeCallbacks)try{e()}catch(t){console.error("Error in on dispose callback:",t,e)}this.domElement?.parentElement&&this.domElement.parentElement.removeChild(this.domElement),this._isCreated=!1,pe.dispatchCallback(ue.ContextDestroyed,this),Jn(this,ue.ContextDestroyed),pe.unregister(this),z.Current===this&&(z.Current=null)}registerCoroutineUpdate(e,t,i){return typeof t?.next!="function"?(console.error("Registered invalid coroutine function from "+e.name+`
|
|
857
|
+
Coroutine functions must be generators: "*myCoroutine() {...}"
|
|
858
|
+
Start a coroutine from a component by calling "this.startCoroutine(myCoroutine())"`),t):(this.coroutines[i]||(this.coroutines[i]=[]),this.coroutines[i].push({comp:e,main:t}),t)}unregisterCoroutineUpdate(e,t){if(!this.coroutines[t])return;const i=this.coroutines[t].findIndex(n=>n.main===e);i>=0&&this.coroutines[t].splice(i,1)}stopAllCoroutinesFrom(e){for(const t in this.coroutines){const i=this.coroutines[t];for(let n=i.length-1;n>=0;n--)i[n].comp===e&&i.splice(n,1)}}_cameraStack=[];setCurrentCamera(e){if(!e)return;if(e.threeCamera||e.buildCamera(),!e.threeCamera){console.warn("Camera component is missing camera",e);return}const t=this._cameraStack.indexOf(e);t>=0&&this._cameraStack.splice(t,1),this._cameraStack.push(e),this.mainCameraComponent=e;const i=e.threeCamera;i.isPerspectiveCamera&&this.updateAspect(i),this.mainCameraComponent?.applyClearFlagsIfIsActiveCamera()}removeCamera(e){if(!e)return;const t=this._cameraStack.indexOf(e);if(t>=0&&this._cameraStack.splice(t,1),this.mainCameraComponent===e&&(this.mainCameraComponent=void 0,this._cameraStack.length>0)){const i=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(i)}}_onBeforeRenderListeners=new Map;_onAfterRenderListeners=new Map;addBeforeRenderListener(e,t){if(!this._onBeforeRenderListeners.has(e.uuid)){const i=[];this._onBeforeRenderListeners.set(e.uuid,i),e.onBeforeRender=this._createRenderCallbackWrapper(i)}this._onBeforeRenderListeners.get(e.uuid).push(t)}removeBeforeRenderListener(e,t){if(this._onBeforeRenderListeners.has(e.uuid)){const i=this._onBeforeRenderListeners.get(e.uuid),n=i.indexOf(t);n>=0&&i.splice(n,1)}}addAfterRenderListener(e,t){if(!this._onAfterRenderListeners.has(e.uuid)){const i=[];this._onAfterRenderListeners.set(e.uuid,i),e.onAfterRender=this._createRenderCallbackWrapper(i)}this._onAfterRenderListeners.get(e.uuid)?.push(t)}removeAfterRenderListener(e,t){if(this._onAfterRenderListeners.has(e.uuid)){const i=this._onAfterRenderListeners.get(e.uuid),n=i.indexOf(t);n>=0&&i.splice(n,1)}}_createRenderCallbackWrapper(e){return(t,i,n,s,r,a)=>{for(let l=0;l<e.length;l++){const c=e[l];c(t,i,n,s,r,a)}}}_requireDepthTexture=!1;_requireColorTexture=!1;_renderTarget;_isRendering=!1;get isRendering(){return this._isRendering}setRequireDepth(e){this._requireDepthTexture=e}setRequireColor(e){this._requireColorTexture=e}get depthTexture(){return this._renderTarget?.depthTexture||null}get opaqueColorTexture(){return this._renderTarget?.texture||null}get isVisibleToUser(){if(this.isInXR)return!0;if(!this._isVisible)return!1;if(!this._needsVisibleUpdate&&this._lastStyleComputedResult!==void 0)return this._lastStyleComputedResult;this._needsVisibleUpdate=!1;const e=getComputedStyle(this.domElement);return this._lastStyleComputedResult=e.visibility!=="hidden"&&e.display!=="none"&&e.opacity!=="0",this._lastStyleComputedResult}_needsVisibleUpdate=!0;_lastStyleComputedResult=void 0;_createId=0;async internalOnCreate(e){const t=++this._createId;Ye&&console.log("Creating context",this.name,e);const i=globalThis["needle:dependencies:ready"];i instanceof Promise&&(Ye&&console.log("Waiting for dependencies to be ready"),await i.catch(h=>{if(Ye||A()){if(Oc("Needle Engine dependencies failed to load. Please check the console for more details"),h instanceof ReferenceError){let d="YourComponentName";const p=h.message.indexOf("'");if(p>0){const m=h.message.indexOf("'",p+1);if(m>0){const f=h.message.substring(p+1,m);f.length>3&&(d=f)}}console.error(`Needle Engine dependencies failed to load:
|
|
859
|
+
|
|
860
|
+
# Make sure you don't have circular imports in your scripts!
|
|
861
|
+
|
|
862
|
+
Possible solutions:
|
|
863
|
+
\u2192 Replace @serializable(${d}) in your script with @serializable(Behaviour)
|
|
864
|
+
\u2192 If you only need type information try importing the type only, e.g: import { type ${d} }
|
|
865
|
+
|
|
866
|
+
---`,h);return}console.error("Needle Engine dependencies failed to load",h)}}).then(()=>{Ye&&console.log("Needle Engine dependencies are ready")})),this.clear();const n=this.renderer,s=!n||n.isDisposed===!0;this.isManagedExternally===!1&&s?this.createNewRenderer():this.lodsManager.setRenderer(this.renderer),this.renderer?.setAnimationLoop(null),z.Current=this,await pe.dispatchCallback(ue.ContextCreationStart,this);let r=!0,a;try{z.Current=this,e?a=await this.internalLoadInitialContent(t,e):a=[]}catch(h){console.error(h),r=!1}if(!r)return this.onError("Failed to load initial content"),!1;if(t!==this._createId||e?.abortSignal?.aborted)return!1;if(this.internalOnUpdateVisible(),!this.renderer)return Ye&&console.warn("Context has no renderer (perhaps it was disconnected?",this.domElement.isConnected),!1;!this.isManagedExternally&&!this.domElement.shadowRoot&&this.domElement.prepend(this.renderer.domElement),z.Current=this,z.Current=this;for(let h=0;h<this.new_scripts.length;h++){const d=this.new_scripts[h];if(d.gameObject!==void 0&&d.gameObject!==null){d.gameObject.userData===void 0&&(d.gameObject.userData={}),d.gameObject.userData.components===void 0&&(d.gameObject.userData.components=[]);const p=d.gameObject.userData.components;p.includes(d)||p.push(d)}}if(this.post_setup_callbacks)for(let h=0;h<this.post_setup_callbacks.length;h++)z.Current=this,await this.post_setup_callbacks[h](this);if(!this._mainCamera){z.Current=this;let h=null;zr(this.scene,d=>{const p=d;if(p?.isCamera){if(Qc(p.gameObject),!p.activeAndEnabled)return;if(p.tag==="MainCamera")return h=p,!0;h=p}}),h?this.setCurrentCamera(h):!pe.dispatchCallback(ue.MissingCamera,this,{files:a})&&!this.mainCamera&&!this.isManagedExternally&&console.warn("Missing camera in main scene",this)}this.input.bindEvents(),z.Current=this,Uu(this),this.physics.engine&&(this.physics.engine?.step(0),this.physics.engine?.postStep()),!this.isManagedExternally&&this.composer&&this.mainCamera,this._needsUpdateSize=!0,this._stats&&(this._stats.showPanel(0),this._stats.dom.style.position="absolute",this.domElement.shadowRoot?.appendChild(this._stats.dom)),Ye&&Jd(this.scene,!0),this.targetFrameRate===void 0?(Ye&&console.warn("No target framerate set, using default",z.DefaultTargetFrameRate),this.targetFrameRate=z._defaultTargetFramerate):Ye&&console.log("Target framerate set to",this.targetFrameRate),this._dispatchReadyAfterFrame=!0;const l=pe.dispatchCallback(ue.ContextCreated,this,{files:a});if(l){const h=this.domElement;"internalSetLoadingMessage"in h&&typeof h.internalSetLoadingMessage=="function"&&h?.internalSetLoadingMessage("finish loading"),await l}if(e?.abortSignal?.aborted)return!1;const c=this.rootSourceId;return c&&this.sceneLighting.enable(c),Jn(this,ue.ContextCreated),Ye&&console.log("Context Created...",this.renderer,this.renderer.domElement),this._isCreating=!1,!this.isManagedExternally&&!e?.abortSignal?.aborted&&this.restartRenderLoop(),!0}rootSceneSourceIdentifiers=[];async internalLoadInitialContent(e,t){this.rootSceneSourceIdentifiers.length=0;const i=new Array;if(t.files.length===0)return i;const n=[...t.files];this.rootSceneSourceIdentifiers.push(...n);const s={name:"",progress:null,index:0,count:n.length},r=Mn(),a=0;for(let l=0;l<n.length;l++){if(t.abortSignal?.aborted){Ye&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){Ye&&console.log("Aborting loading because create id changed",e,this._createId);break}const c=n[l];t?.onLoadingStart?.call(this,l,c),Ye&&console.log("Context Load "+c);const h=await r.loadSync(this,c,c,a,d=>{t.abortSignal?.aborted||(s.name=c,s.progress=d,s.index=l,s.count=n.length,t.onLoadingProgress?.call(this,s))});t?.onLoadingFinished?.call(this,l,c,h??null),h?i.push({src:c,file:h}):console.warn("Could not load file: "+c)}if(e!==this._createId||t.abortSignal?.aborted){Ye&&console.log("Aborting loading because create id changed or abort signal was set",e,this._createId);for(const l of i)if(l&&l.file)for(const c of l.file.scenes)Ui(c,!0,!0)}else{let l=!1;for(const c of i)c&&c.file&&(c.file.scene?(l=!0,this.scene.add(c.file.scene)):console.warn("No scene found in loaded file"));if(!l){for(const c of i)if(c&&c.file&&"parser"in c.file){let h=0;if(!Array.isArray(c.file.parser.json.materials))continue;for(let d=0;d<c.file.parser.json.materials.length;d++){const p=await c.file.parser.getDependency("material",d),m=new M;m.position.x=d*1.1,m.position.y=h,this.scene.add(m),Rs.createPrimitive("ShaderBall",{parent:m,material:p})}h+=1}}}return i}restartRenderLoop(){return this.renderer?this._isCreating?(console.warn("Can not start render loop while creating context"),!1):(this.renderer.setAnimationLoop((e,t)=>{this.isManagedExternally||this.update(e,t)}),!0):(console.error("Can not start render loop without renderer"),!1)}_renderlooperrors=0;update(e,t){if(t===void 0&&(t=null),A()||Ye||FE())try{this.internalStep(e,t),this._renderlooperrors=0}catch(i){this._renderlooperrors+=1,(A()||Ye)&&(i instanceof Error||i instanceof TypeError)&&ke("Caught unhandled exception during render-loop - see console for details.",{type:Bi.Error}),console.error("Frame #"+this.time.frame+`
|
|
867
|
+
`,i),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null),fi.sendError(z.Current,"renderloop",i instanceof Error?i:new Error(String(i)))),this.domElement.dispatchEvent(new CustomEvent("error",{detail:i}))}else this.internalStep(e,t)}updatePhysics(e){this.internalUpdatePhysics(e)}setCameraFocusRect(e,t){const i=this._focusRect;if(this._focusRect=e,t&&Object.assign(this.focusRectSettings,t),t?.damping===void 0&&i){let n=i;i instanceof HTMLElement&&(n=i.getBoundingClientRect()),n&&"top"in n&&n.bottom>=-100&&n.right>=-100&&n.top<=window.innerHeight+100&&n.left<=window.innerWidth+100&&(this.focusRectSettings.damping=.2)}}get focusRect(){return this._focusRect}get focusRectSize(){const e=this._focusRect;if(e&&(e instanceof DOMRect||"width"in e&&"height"in e&&"x"in e&&"y"in e))return{x:e.x,y:e.y,width:e.width,height:e.height};if(e instanceof HTMLElement){const t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height}}return null}focusRectSettings={damping:0,zoom:1,offsetX:0,offsetY:0};_focusRect=null;_lastTimestamp=0;_accumulatedTime=0;_dispatchReadyAfterFrame=!1;internalStep(e,t){this.internalOnBeforeRender(e,t)!==!1&&(this.internalOnRender(),this.internalOnAfterRender())}internalOnBeforeRender(e,t){this.renderer.info.autoReset=!!t,this.renderer.info.autoReset===!1&&this.renderer.info.reset(),this._needsVisibleUpdate=!0;const i=t!==null&&this._xrFrame===null;if(this._xrFrame=t,i&&this.domElement.dispatchEvent(new CustomEvent("xr-session-started",{detail:{context:this,session:this.xrSession,frame:t}})),this._currentFrameEvent=-1,this.isManagedExternally===!1&&this.isInXR===!1&&this.targetFrameRate!==void 0){this._lastTimestamp===0&&(this._lastTimestamp=e),this._accumulatedTime+=(e-this._lastTimestamp)/1e3,this._lastTimestamp=e;let n=this.targetFrameRate;if(typeof n=="object"&&(n=n.value),this._accumulatedTime<1/(n+1))return!1;this._accumulatedTime=0}if(this._stats?.begin(),z.Current=this,this.onHandlePaused())return!1;for(z.Current=this,this.time.update(),nE&&console.log("FPS",this.time.smoothedFps.toFixed(0)),Uu(this),zu(this.scene),Kw(this),Jn(this,-1);this._cameraStack.length>0&&(!this.mainCameraComponent||this.mainCameraComponent.destroyed);){this._cameraStack.splice(this._cameraStack.length-1,1);const n=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(n)}if(this.pre_update_oneshot_callbacks){for(const n in this.pre_update_oneshot_callbacks)this.pre_update_oneshot_callbacks[n]();this.pre_update_oneshot_callbacks.length=0}if(this.pre_update_callbacks)for(const n in this.pre_update_callbacks)this.pre_update_callbacks[n]();this._currentFrameEvent=0;for(let n=0;n<this.scripts_earlyUpdate.length;n++){const s=this.scripts_earlyUpdate[n];s.activeAndEnabled&&s.earlyUpdate!==void 0&&(z.Current=this,s.earlyUpdate())}this.executeCoroutines(0),Jn(this,0),this._currentFrameEvent=1;for(let n=0;n<this.scripts_update.length;n++){const s=this.scripts_update[n];s.activeAndEnabled&&s.update!==void 0&&(z.Current=this,s.update())}this.executeCoroutines(1),Jn(this,1),this._currentFrameEvent=2;for(let n=0;n<this.scripts_lateUpdate.length;n++){const s=this.scripts_lateUpdate[n];s.activeAndEnabled&&s.lateUpdate!==void 0&&(z.Current=this,s.lateUpdate())}if(this.executeCoroutines(2),Jn(this,2),this.physicsSteps===void 0&&(this.physicsSteps=1),this.physics.engine&&this.physicsSteps>0&&this.internalUpdatePhysics(this.physicsSteps),this.isVisibleToUser||this.runInBackground){this._currentFrameEvent=3;for(let n=0;n<this.scripts_onBeforeRender.length;n++){const s=this.scripts_onBeforeRender[n];s.activeAndEnabled&&s.onBeforeRender!==void 0&&(z.Current=this,s.onBeforeRender(t))}if(this.executeCoroutines(3),Jn(this,3),this._needsUpdateSize&&this.updateSize(),this.pre_render_callbacks)for(const n in this.pre_render_callbacks)this.pre_render_callbacks[n](t);if(this._focusRect&&this.mainCamera instanceof de){const n=this.focusRectSettings,s=n.damping>0?this.time.deltaTime/n.damping:1;$O(this._focusRect,this.focusRectSettings,s,this.mainCamera,this.renderer)}}return!0}internalUpdatePhysics(e){if(!this.physics.engine)return!1;const t=e,i=this.time.deltaTime/t;for(let n=0;n<t;n++)this._currentFrameEvent=9,this.executeCoroutines(9),this.physics.engine.step(i),this._currentFrameEvent=10,this.executeCoroutines(10);return this.physics.engine.postStep(),!0}internalOnRender(){this.isManagedExternally||(NE(this),this._currentFrameEvent=-1,Qb.camera=this.mainCamera,Qb.update(),this.renderNow(),this._currentFrameEvent=4)}internalOnAfterRender(){if(this.isVisibleToUser||this.runInBackground){for(let e=0;e<this.scripts_onAfterRender.length;e++){const t=this.scripts_onAfterRender[e];t.activeAndEnabled&&t.onAfterRender!==void 0&&(z.Current=this,t.onAfterRender())}if(this.executeCoroutines(4),Jn(this,4),this.post_render_callbacks)for(const e in this.post_render_callbacks)this.post_render_callbacks[e]()}if(this._currentFrameEvent=-1,this.connection.sendBufferedMessagesNow(),this._stats){this._stats.end();const e=this.time.fps<20?50:150;if(this.time.frameCount%e===0||this.time.frameCount===1){const t=window.performance&&window.performance.memory?`${(window.performance.memory.usedJSHeapSize/1024/1024).toFixed(2)} MB`:"n/a";console.log(this.renderer.info.render.calls+" DrawCalls",`
|
|
868
|
+
Render:`,{shaders:this.renderer.info.programs?.length,...this.renderer.info.render},`
|
|
869
|
+
Memory:`,{usedMemory:t,...this.renderer.info.memory},`
|
|
870
|
+
Target Framerate: `+this.targetFrameRate)}}this._dispatchReadyAfterFrame&&(this._dispatchReadyAfterFrame=!1,this.domElement.dispatchEvent(new CustomEvent("ready")),pe.dispatchCallback(ue.ContextFirstFrameRendered,this))}_tempClearColor=new oe;_tempClearColor2=new oe;renderNow(e){if(!e&&(e=this.mainCamera,!e))return!1;if(this.handleRendererContextLost(),this._isRendering=!0,this.renderRequiredTextures(),this.renderer.toneMapping!==Fd&&hw(),this.postprocessing.update(),this.composer&&!this.isInXR){e&&"setMainCamera"in this.composer&&this.composer.passes[0]?.mainCamera!=e&&this.composer.setMainCamera(e);const t=this.renderer.getClearColor(this._tempClearColor),i=this.renderer.getClearAlpha();this._tempClearColor2.copy(t),this.renderer.setClearColor(t.convertSRGBToLinear(),this.renderer.getClearAlpha()),this.composer.render(this.time.deltaTime),this.renderer.setClearColor(this._tempClearColor2,i)}else e&&(this.isInXR&&I.isMacOS()&&this.renderer.clearDepth(),this.renderer.render(this.scene,e));return this._isRendering=!1,!0}_contextRestoreTries=0;handleRendererContextLost(){this.time.frame%10&&this.renderer.getContext().isContextLost()&&this._contextRestoreTries++<100&&(console.warn("Attempting to recover WebGL context..."),this.renderer.forceContextRestore())}_wasPaused=!1;onHandlePaused(){const e=this.evaluatePaused();if(this._wasPaused!==e){iE&&console.log("Paused?",e,"context:"+this.alias);for(let t=0;t<this.scripts_pausedChanged.length;t++){const i=this.scripts_pausedChanged[t];i.activeAndEnabled&&i.onPausedChanged!==void 0&&(z.Current=this,i.onPausedChanged(e,this._wasPaused))}}return this._wasPaused=e,e}evaluatePaused(){return this.isInXR?!1:this.isPaused?!0:this.runInBackground?!1:!this.isVisibleToUser}renderRequiredTextures(){if(!this.mainCamera||!this._requireDepthTexture&&!this._requireColorTexture)return;if(!this._renderTarget){if(this._renderTarget=new Qn(this.domWidth,this.domHeight),this._requireDepthTexture){const i=new Lb(this.domWidth,this.domHeight);this._renderTarget.depthTexture=i}this._requireColorTexture&&(this._renderTarget.texture=new Se,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=Ud,this._renderTarget.texture.magFilter=Ud,this._renderTarget.texture.format=Dd)}const e=this._renderTarget;e.texture&&(e.texture.colorSpace=this.renderer.outputColorSpace);const t=this.renderer.getRenderTarget();this.renderer.setRenderTarget(e),this.renderer.render(this.scene,this.mainCamera),this.renderer.setRenderTarget(t)}executeCoroutines(e){if(this.coroutines[e]){const i=this.coroutines[e];for(let n=0;n<i.length;n++)try{const s=i[n];if(!s.comp||s.comp.destroyed||!s.main||s.comp.enabled===!1){oE&&console.log("Removing coroutine",s.comp,s.comp.enabled),i.splice(n,1),--n;continue}const r=s.chained;if(r&&r.length>0){const c=r[r.length-1].next();if(c.done&&r.pop(),t(c)&&(s.chained||(s.chained=[]),s.chained.push(c.value)),!c.done)continue}const a=s.main.next();if(a.done===!0){i.splice(n,1),--n;continue}const l=a.value;if(t(l)){if(l.next().done)continue;s.chained||(s.chained=[]),s.chained.push(l)}else if(l instanceof Promise){const c=l;s.chained||(s.chained=[]);const h=zv(c);s.chained?.push(h);continue}}catch(s){console.error(s)}}function t(i){return!!(i&&i.next&&i.return)}}}const al=new J().makeRotationY(Math.PI),nn=new N().setFromAxisAngle(new b(0,1,0),Math.PI),aE=w("debugwebxr");class lE{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new M,this.gameObject.name="Implicit XR Rig",aE){const e=kf(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Wo=w("debugwebxr"),Mu=w("debugcustomgesture"),cE="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",hE="generic-trigger",dE=new N().setFromEuler(new ht(Lo.degToRad(0),Lo.degToRad(-90),Lo.degToRad(-90))),uE=new b(.04,-.04,0);class vf{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new J;_gripPosition=new b;_gripQuaternion=new N;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new N;_rayMatrix=new J;_rayPosition=new b;_rayQuaternion=new N;get gripPosition(){return F(this._gripPosition)}get gripQuaternion(){return di(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return F(this._linearVelocity).applyQuaternion(nn)}get rayPosition(){return F(this._rayPosition)}get rayQuaternion(){return di(this._rayQuaternion)}get gripWorldPosition(){return F(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return di(this._gripWorldQuaternion)}_gripWorldQuaternion=new N;get rayWorldPosition(){return F(this._rayWorldPosition)}_rayWorldPosition=new b;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return di(this._rayWorldQuaternion)}_rayWorldQuaternion=new N;get pinchPosition(){return F(this._pinchPosition)}_pinchPosition=new b;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?_e(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(nn),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(F(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}_ray;_hand_wristDotUp=void 0;get handWristDotUp(){if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const e=this.handObject?.joints.wrist;if(e){const t=F(0,1,0).applyQuaternion(e.quaternion),i=F(0,1,0).dot(t);return this._hand_wristDotUp=i}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){return this.isHandUpsideDown&&this.getGesture("pinch")?.isDown}get object(){return this._object}_object;_gripSpaceObject;_raySpaceObject;model=null;_debugAxesHelper=new Li(.15);_debugGripAxesHelper=new Li(.07);_debugRayAxesHelper=new Li(.07);async getModelUrl(){return this.getMotionController?.then(e=>e?.assetUrl||null)}constructor(e,t,i){this.xr=e,this.inputSource=t,this.index=i,this._object=new M,this._object.name=`NeedleXRController_${i}`,Wo&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new M,this._raySpaceObject=new M,this._gripSpaceObject.name=`NeedleXRController_${i}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${i}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new Eo,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}_hitTestSourcePromise=null;_requestHitTestSource(){return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay})?.then(e=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=e:(e.cancel(),null)))??null:null}onPointerHits=e=>{};onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){B.DrawSphere(this.rayWorldPosition,.003),B.DrawDirection(this.rayWorldPosition,F(0,0,10).applyQuaternion(this.rayWorldQuaternion));const e=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),t=this.inputSource.profiles.join(`
|
|
871
|
+
`);let i=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
|
|
872
|
+
C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(i+=`
|
|
873
|
+
Pinch: ${this.getGesture("pinch")?.value.toFixed(3)}`),i+=`
|
|
874
|
+
`+t,i+=`
|
|
875
|
+
`+(this.inputSource.targetRaySpace?"Ray: x":"Ray: -")+(this.inputSource.gripSpace?" Grip: x":" Grip: -")+(this.inputSource.gamepad?` Gamepad: ${this.inputSource.gamepad.mapping}`:" Gamepad: -"),this.inputSource.gamepad){const n=this.inputSource.gamepad;let s="[btns "+n.buttons.length+"]: "+n.buttons.map(r=>r.value.toPrecision(1)).join(",");s+=`
|
|
876
|
+
[axes `+n.axes.length+"]: "+n.axes.map(r=>r.toPrecision(1)).join(","),i+=`
|
|
877
|
+
`+s}if(this._layout){i+=`
|
|
878
|
+
Layout: `;for(const n of Object.keys(this._layout.components||{})){const s=this.getStick(n),r=this._layout.components[n]?.gamepadIndices,a=r?Object.entries(r).map(l=>l[0][0].toUpperCase()+l[0].slice(1)+"="+l[1]).join(","):"";i+=`
|
|
879
|
+
${n}: ${this._layout.components[n]?.type} [${a}] (${s.x.toPrecision(2)},${s.y.toPrecision(2)})`}}B.DrawLabel(e,i,.006)}onUpdateFrame(e){if(this._handJointPoses.clear(),this._hand_wristDotUp=void 0,!this.xr.referenceSpace||!this.inputSource.gamepad?.connected){this._isTracking=!1;return}const t=e.getPose(this.inputSource.targetRaySpace,this.xr.referenceSpace);this._isTracking=t!=null;let i=null,n=null,s=null,r=null;if(t){const h=t.transform;this._rayMatrix.fromArray(h.matrix).premultiply(al),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,F(1,1,1)),s=F(h.position),r=di(h.orientation),this._rayPositionRaw.copy(s),this._rayRotationRaw.copy(r)}if(this.inputSource.gripSpace){const h=e.getPose(this.inputSource.gripSpace,this.xr.referenceSpace);if(h){const d=h.transform;if(i=F(d.position),n=di(d.orientation),this._gripMatrix.fromArray(d.matrix).premultiply(al),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,F(1,1,1)),"linearVelocity"in h&&h.linearVelocity){const p=h.linearVelocity;this._linearVelocity.set(p.x,p.y,p.z)}}}this.xr.context.mainCamera?.parent&&(this._object.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._object),this._gripSpaceObject!==void 0&&this._gripSpaceObject?.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._gripSpaceObject),this._raySpaceObject!==void 0&&this._raySpaceObject?.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._raySpaceObject));const a=this.hand;if(a){let h=!1;const d=a.get("wrist"),p=d&&this.getHandJointPose(d,e);if(p){h=!0;const g=p.transform.position,y=p.transform.orientation;this._object.position.set(g.x,g.y,g.z),this._object.quaternion.set(y.x,y.y,y.z,y.w).multiply(nn)}h||(this._object.position.copy(this._rayPosition),this._object.quaternion.copy(this._rayQuaternion).multiply(nn));const m=a.get("middle-finger-metacarpal"),f=m&&this.getHandJointPose(m,e);f&&(this._gripMatrix.fromArray(f.transform.matrix).premultiply(al),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,F(1,1,1)),i=F().copy(f.transform.position),n=di().copy(f.transform.orientation),n.multiply(dE),i.add(F(uE).applyQuaternion(n)))}else this.inputSource.gripSpace&&this.targetRayMode==="transient-pointer"&&i&&n?(this._object.position.copy(i),this._object.quaternion.copy(n).multiply(nn)):s&&r&&(this._object.position.copy(s),this._object.quaternion.copy(r).multiply(nn));Wo&&(s&&r&&(this._raySpaceObject?.position.copy(s),this._raySpaceObject?.quaternion.copy(r).multiply(nn)),i&&n&&(this._gripSpaceObject?.position.copy(i),this._gripSpaceObject?.quaternion.copy(n).multiply(nn)));const l=this.xr.context.mainCamera?.parent,c=l?_e(l):void 0;i&&n&&(this._gripWorldPosition.copy(i),l&&this._gripWorldPosition.applyMatrix4(l.matrixWorld),this._gripWorldQuaternion.copy(n),this._gripWorldQuaternion.multiply(nn),c&&this._gripWorldQuaternion.premultiply(c)),this.updateRayWorldPosition(),this.updateRayWorldQuaternion()}onDisconnected(){this._connected=!1,Wo&&console.warn("Controller disconnected",this.index);for(const e of this._object.children)this.xr.context.scene.attach(e);this._object?.removeFromParent(),this._debugAxesHelper?.removeFromParent(),this._debugGripAxesHelper?.removeFromParent(),this._debugRayAxesHelper?.removeFromParent(),this._gripSpaceObject?.removeFromParent(),this._raySpaceObject?.removeFromParent(),this.unsubscribeEvents(),this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}getButton(e){if(!this._layout)return;switch(e){case"primary-button":if(this.isLeft)e="x-button";else if(this.isRight)e="a-button";else return;break;case"primary":return this.hand?this.getGesture("pinch"):this.toNeedleGamepadButton(0,e);case"xr-standard-trigger":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(0,e);break;case"xr-standard-squeeze":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(1,e);break;case"xr-standard-thumbstick":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(3,e);break}if(this._buttonMap.has(e))return this.toNeedleGamepadButton(this._buttonMap.get(e),e);const t=this._layout?.components[e];if(t?.gamepadIndices)switch(t.type){case"button":case"squeeze":if(this.inputSource.gamepad){const i=t.gamepadIndices.button;return this._buttonMap.set(e,i),this.toNeedleGamepadButton(i,e)}break;default:console.warn("Unsupported component type",t.type);break}this._buttonMap.set(e,void 0)}getGesture(e){const t=this.states[e];if(!t)return null;this.states[e]=t;const i=this._needleGamepadButtons[e]||new Sw(void 0,e);return i.pressed=t.pressed,i.value=t.value,i.isDown=t.isDown,i.isUp=t.isUp,this._needleGamepadButtons[e]=i,i}getPointerId(e){if((e==="primary"||e==="pinch")&&(e=0),typeof e!="number"){const t=this._buttonMap.get(e);if(t===void 0)return;e=t}return this.index*10+e}_needleGamepadButtons={};toNeedleGamepadButton(e,t){if(!this.inputSource.gamepad?.buttons)return;const i=this.inputSource.gamepad?.buttons[e],n=this.states[e],s=this._needleGamepadButtons[e]||new Sw(e,t);return i&&(s.pressed=i.pressed,s.value=i.value,s.touched=i.touched),n&&(s.isDown=n.isDown,s.isUp=n.isUp),this._needleGamepadButtons[e]=s,s}getStick(e){if(!this._layout)return{x:0,y:0,z:0};if(this.isHand)return{x:0,y:0,z:0};e==="primary"&&this._layout.components["xr-standard-thumbstick"]&&(e="xr-standard-thumbstick");const t=this._layout?.components[e];if(t?.gamepadIndices)switch(t.type){case"thumbstick":case"touchpad":if(this.inputSource.gamepad){const i=t.gamepadIndices.xAxis,n=t.gamepadIndices.yAxis;let s=this.inputSource.gamepad.axes[i]||0,r=this.inputSource.gamepad.axes[n]||0;s*=-1,r*=-1;const a=t.gamepadIndices.button,l=this.inputSource.gamepad?.buttons[a]?.value||0;return{x:s,y:r,z:l}}}return{x:0,y:0,z:0}}_buttonMap=new Map;_motioncontroller;_layout;getMotionController;initialize(){if(this._hasSelectEvent=this.profiles.includes("generic-hand-select")||this.profiles.some(e=>e.startsWith("generic-trigger")),this._isMetaQuestTouchController=this.profiles.includes("meta-quest-touch-plus")||this.profiles.includes("oculus-touch-v3"),this._isMxInk=this.profiles.includes("logitech-mx-ink"),!this._layout){if(this.inputSource.targetRayMode==="transient-pointer")return;const e=XP(this.inputSource,cE,hE);this.getMotionController=e.then(t=>{if(!this.connected)return null;this._motioncontroller=new QP(this.inputSource,t.profile,t.assetPath||"");const i=t.profile.layouts[this.inputSource.handedness];if(this._layout=i,this._layout){if(!this._layout.gamepad?.length){this._layout.gamepad=[];for(const n in this._layout.components){const s=this._layout.components[n];this._layout.gamepad[s.gamepadIndices.button]=n}}this.profiles.length>=1&&this.profiles[0]==="htc-vive-focus-plus"&&this.inputSource.gamepad&&this.inputSource.gamepad.axes.length===4&&!this._layout.components["xr-standard-thumbstick"]&&(this._layout.components["xr-standard-thumbstick"]={type:"thumbstick",gamepadIndices:{xAxis:2,yAxis:3}})}return this._motioncontroller}).catch(t=>(this.inputSource&&console.warn("Couldn't initialize motion controller profile for ",this.inputSource,t),null))}}emitPointerDownEvent=!0;emitPointerUpEvent=!0;emitPointerMoveEvent=!0;pointerMoveDistanceThreshold=.03;pointerMoveAngleThreshold=.05;subscribeEvents(){this.xr.session.addEventListener("selectstart",this.onSelectStart),this.xr.session.addEventListener("selectend",this.onSelectEnd),this.xr.session.addEventListener("squeezestart",this.onSequeezeStart),this.xr.session.addEventListener("squeezeend",this.onSequeezeEnd)}unsubscribeEvents(){this.xr.session.removeEventListener("selectstart",this.onSelectStart),this.xr.session.removeEventListener("selectend",this.onSelectEnd),this.xr.session.removeEventListener("squeezestart",this.onSequeezeStart),this.xr.session.removeEventListener("squeezeend",this.onSequeezeEnd)}_selectButtonIndex=void 0;_squeezeButtonIndex=void 0;onSelectStart=e=>{if(!this.emitPointerDownEvent||this.inputSource!==e.inputSource)return;this.onUpdateFrame(e.frame),this._hasSelectEvent=!0;const t=this._layout?.selectComponentId,i=this._layout?.components[t]?.gamepadIndices?.button;i!==void 0&&(this._selectButtonIndex=i),!Mu&&(Wo&&B.DrawDirection(this.rayWorldPosition,F(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Ae.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSelectEnd=e=>{this.emitPointerUpEvent&&(Mu||this.inputSource===e.inputSource&&this.emitPointerEvent(Ae.PointerUp,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSequeezeStart=e=>{this.emitPointerDownEvent&&this.inputSource===e.inputSource&&(this._squeezeButtonIndex=this._layout?.components["xr-standard-squeeze"]?.gamepadIndices?.button,this._squeezeButtonIndex!==void 0&&(Wo&&B.DrawDirection(this.rayWorldPosition,F(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Ae.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)))};onSequeezeEnd=e=>{this.emitPointerUpEvent&&this.inputSource===e.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Ae.PointerUp,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)};states={};updateInputEvents(){if(this.gamepad?.buttons){for(let e=0;e<this.gamepad.buttons.length;e++){const t=this.gamepad.buttons[e],i=this.states[e]||new xw;let n=null;this._isMxInk&&(e===4||e===5)?(t.value>0&&!i.pressed?(n="pointerdown",i.isDown=!0,i.isUp=!1):t.value===0&&i.pressed?(n="pointerup",i.isDown=!1,i.isUp=!0):i.pressed&&(n="pointermove",i.isDown=!1,i.isUp=!1),i.pressed=t.value>0,i.value=t.value):(t.pressed&&!i.pressed?(n="pointerdown",i.isDown=!0,i.isUp=!1):!t.pressed&&i.pressed?(n="pointerup",i.isDown=!1,i.isUp=!0):(i.isDown=!1,i.isUp=!1),i.pressed=t.pressed,i.value=t.value),this.states[e]=i;const s=e!==this._selectButtonIndex&&e!==this._squeezeButtonIndex;if(n!=null&&s){let r=this._layout?.gamepad[e];this._isMxInk&&e===4&&(r="stylus-touch"),this._isMxInk&&e===5&&(r="stylus-tip"),(Wo||Mu)&&console.log("Emitting pointer event",n,e,r,t.value,this.gamepad,this._layout),this.emitPointerEvent(n,e,r??"none",!1,null,t.value)}}if(this._isMetaQuestTouchController){const e=this.gamepad.buttons.length-1,t=this.states[e];if(t&&t.isDown){const i=this.context.menu;i.spatialMenuIsVisible?i.setSpatialMenuVisible(!1):this.context.menu.setSpatialMenuVisible(!0)}}}if(this.hand){const e=this.handObject;if(e){const t=e.joints["index-finger-tip"],i=e.joints["thumb-tip"];if(t&&i){const n=t.position.distanceTo(i.position);this._pinchPosition.lerpVectors(t.position,i.position,.5);const s=this.xr.context.mainCamera?.parent;if(s&&this._pinchPosition.applyMatrix4(s.matrixWorld),n!==0){const r=this.states.pinch||new xw,a=(.02+.01)*1.5;r.value=1-(n-.02)/a;const l=n<.02-.01,c=n>.02+.01;l&&!r.pressed?(Mu&&console.log("pinch start",n),r.isDown=!0,r.isUp=!1,r.pressed=!0):c&&r.pressed?(r.isDown=!1,r.isUp=!0,r.pressed=!1):(r.isDown=!1,r.isUp=!1),this.states.pinch=r}}}}}_didMoveLastFrame=!1;_lastPointerMovePosition=new b;_lastPointerMoveQuaternion=new N;onUpdateMove(){if(!this.emitPointerMoveEvent)return;let e=!1;if(this._lastPointerMovePosition.distanceTo(this.gripWorldPosition)>this.pointerMoveDistanceThreshold*this.xr.rigScale&&(e=!0),e||this._lastPointerMoveQuaternion.angleTo(this.gripWorldQuaternion)>this.pointerMoveAngleThreshold&&(e=!0),e){this._didMoveLastFrame=!0,this._lastPointerMovePosition.copy(this.gripWorldPosition),this._lastPointerMoveQuaternion.copy(this.gripWorldQuaternion),Wo&&B.DrawLabel(this.rayWorldPosition.add(this.object.worldForward.multiplyScalar(.1)),"move",.01);let t=this.xr.context.input.getFirstPressedButtonForPointer(this.index);t===void 0&&(t=0);const i=this.gamepad?.buttons[t]?.value;this.emitPointerEvent("pointermove",t,"none",!1,null,i)}else this._didMoveLastFrame=!1}pointerInit;emitPointerEvent(e,t,i,n,s=null,r){if(!this.emitEvents){Wo&&e!==Ae.PointerMove&&console.warn("Pointer events are disabled for this controller",this.index,e,t);return}if(this.xr.mode==="immersive-vr"||this.xr.isPassThrough){this.pointerInit.origin=this,this.pointerInit.pointerId=this.getPointerId(t),this.pointerInit.pointerType=this.hand?"hand":"controller",this.pointerInit.button=t,this.pointerInit.buttonName=i,this.pointerInit.isPrimary=n,this.pointerInit.mode=this.inputSource.targetRayMode,this.pointerInit.ray=this.ray,this.pointerInit.device=this.object,this.pointerInit.pressure=r,this.pointerInit.clientX=this._rayPosition.x/this.xr.rigScale,this.pointerInit.clientY=this._rayPosition.y/this.xr.rigScale,this.pointerInit.clientZ=this._rayPosition.z/this.xr.rigScale;const a=z.Current;z.Current=this.xr.context,Wo&&e!=="pointermove"&&console.warn("Pointer event",e,t,i,{...this.pointerInit}),this.xr.context.input.createInputEvent(new zo(e,s,this.pointerInit)),z.Current=a}}}class xw{isDown=!1;isUp=!1;pressed=!1;value=0}class Sw{index;name;touched=!1;pressed=!1;value=0;isDown=!1;isUp=!1;constructor(e,t){this.index=e,this.name=t}}const Nc=w("debugwebxr");class wf{controllerStates=[];userId;context;userStateEvtName;constructor(e,t){this.userId=e,this.context=t,this.userStateEvtName="xr-sync-user-state-"+e,this.context.connection.beginListen(this.userStateEvtName,this.onReceivedControllerState)}dispose(){this.context.connection.stopListen(this.userStateEvtName,this.onReceivedControllerState)}onReceivedControllerState=e=>{Nc&&console.log(`XRSync: Received change for ${this.userId}: ${e.type} ${e.handedness}; tracked=${e.isTracking}`);let t=!1;for(let i=0;i<this.controllerStates.length;i++)if(this.controllerStates[i].index===e.index){this.controllerStates[i]=e,t=!0;break}t||this.controllerStates.push(e)};update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const i=this.controllerStates[t];let n=!1;for(let s=0;s<e.controllers.length;s++)e.controllers[s].index===i.index&&(n=!0);n||(Nc&&console.log(`XRSync: ${i.type} ${i.handedness} removed`,i.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(i))}for(const t of e.controllers)this.updateControllerStates(t)}}onExitXR(e){for(const t of this.controllerStates)this.sendControllerRemoved(t);this.controllerStates.length=0}sendControllerRemoved(e){e.isTracking=!1,e.guid="",this.context.connection.send(this.userStateEvtName,e),this.context.connection.sendDeleteRemoteState(e.guid)}updateControllerStates(e){const t=this.controllerStates.find(i=>i.index===e.index);if(t){let i=!1;i||=t.isTracking!=e.isTracking,i&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const i={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(i),this.context.connection.send(this.userStateEvtName,i),Nc&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class Cw{hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.isTracking||!1:void 0}getDeviceType(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.type||"unknown":void 0}context;constructor(e){this.context=e,this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(Nc&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new wf(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new wf(e,this.context))}};onLeftRoom=()=>{this.context.connection.connectionId&&(this._states.has(this.context.connection.connectionId)||(this._states.get(this.context.connection.connectionId)?.dispose(),this._states.delete(this.context.connection.connectionId)))};onOtherUserJoinedRoom=e=>{const t=e.userId;this._states.has(t)||(Nc&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new wf(t,this.context)))};onOtherUserLeftRoom=e=>{const t=e.userId;this._states.has(t)||(this._states.get(t)?.dispose(),this._states.delete(t))};_states=new Map;onUpdate(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.update(e)}onExitXR(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.onExitXR(e)}}class Pw{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new Ce({color:0,transparent:!0,depthTest:!1,fog:!1,side:Ii}),this._fadeToColorQuad=new H(new Pn(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const i=this._fadeToColorQuad,n=this._fadeToColorMaterial;i.parent!==e&&n.opacity>0?e.add(i):n.opacity===0&&i.removeFromParent(),i.layers.set(2),i.material=this._fadeToColorMaterial,i.position.z=-1,i.renderOrder=1/0;const s=this._requestedFadeValue;n.opacity=D.lerp(n.opacity,s,t/.03),Math.abs(n.opacity-s)<=.01&&this._transitionResolve&&(this._transitionResolve(),this._transitionResolve=null,this._transitionPromise=null,this._requestedFadeValue=0)}remove(){this._fadeToColorQuad.removeFromParent()}fadeTransition(){if(this._transitionPromise)return this._transitionPromise;this._requestedFadeValue=1;const e=new Promise(t=>{this._transitionResolve=t});return this._transitionPromise=e,e}_requestedFadeValue=0;_transitionPromise=null;_transitionResolve=null}class hc{static _active=null;static get active(){return this._active}static _requestInFlight=!1;static async start(e,t){if(this._active)return console.error("Cannot start a new XR session while one is already active"),null;if(this._requestInFlight)return console.error("Cannot start a new XR session while a request is already in flight"),null;if("xr"in navigator&&navigator.xr){if(!t)return console.error("XRSessionInit must be provided"),null;this._requestInFlight=!0;const i=await navigator.xr.requestSession(e,t).catch(n=>{console.error("Failed to start temporary XR session:",n)});return i?(i.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new hc(e,t,i),this._active):(i.end(),null)):(this._requestInFlight=!1,null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await Bo(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}get isVR(){return this._mode==="immersive-vr"}_renderer;_camera;_scene;constructor(e,t,i){this._mode=e,this._init=t,this._session=i,this._session.addEventListener("end",this.onEnd),this._renderer=new _r({alpha:!0,antialias:!0}),this._renderer.outputColorSpace="srgb",this._renderer.setPixelRatio(Math.min(2,window.devicePixelRatio)),this._renderer.setSize(window.innerWidth,window.innerHeight,!0),I.isNeedleAppClip()&&window.requestAnimationFrame(()=>{const n=Math.min(2,window.devicePixelRatio),s=Math.floor(window.innerWidth*n),r=Math.floor(window.innerHeight*n);this._renderer.domElement.width=s,this._renderer.domElement.height=r}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new de,this._scene=new Ti,this._scene.fog=new Db(4473924,10,250),this._scene.add(this._camera),this.setupScene()}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}onEnd=()=>{this._session?.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()};_lastTime=0;_frames=0;onFrame=(e,t)=>{const i=e-this._lastTime;this.update(e,i),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera),this._lastTime=e,this._frames++};_roomFlyObjects=[];_logoObject=null;get _logoDistance(){return this.isAR?.3:5}get _logoScale(){return this.isAR?.04:1}update(e,t){const i=e*4e-4;for(let r=0;r<this._roomFlyObjects.length;r++){const a=this._roomFlyObjects[r];a.position.y+=Math.sin(i+r*.5)*.005,a.rotateY(.002)}const n=this._logoObject,s=this._renderer.xr.getCamera();if(n){const r=new b;s.getWorldDirection(r);const a=s.position.clone().addScaledVector(r,this._logoDistance),l=this.isAR?.005:1e-5;n.position.lerp(a,this._frames<=2?1:t*l),n.lookAt(this._camera.position)}}async onBeforeHandoff(){await Bo(1e3),this._scene.clear()}setupScene(){this._scene.background=new oe(0);let e=ol;if(to()){const h=document.querySelector("needle-engine");if(h){const d=h.getAttribute("logo-src");d?.length&&(e=d,A()&&console.debug("[XR] Using custom loading logo from license:",e))}}const t=this._logoObject=new H(new Pn(1,1,1,1),new Ce({transparent:!0,side:2}));t.scale.multiplyScalar(this._logoScale*window.devicePixelRatio),t.renderOrder=1e3,t.material.opacity=0,this._scene.add(t);const i=document.createElement("canvas"),n=i.getContext("2d"),s=new Image,r=h=>{if(!n)return;t.material.opacity=1;const d=1024;i.width=d,i.height=d,n.imageSmoothingQuality="high";const p=d*.19,m=s.width/s.height;{const C=i.height-p*1.5,O=C*m,k=(i.width-O)/2;n.drawImage(s,k,0,O,C)}const f=d*.12,g="Loading...";n.shadowBlur=0,n.fillStyle=this.isAR?"white":"rgba(255,255,255,0.4)",n.font=`${f}px Arial`,n.shadowBlur=d*.02,n.shadowColor="rgba(0,0,0,0.5)",n.shadowOffsetX=0,n.shadowOffsetY=0;const y=n.measureText(g);n.fillText(g,i.width/2-y.width/2,i.height-p/4),n.font=`${f}px Arial`,n.fillText(g,i.width/2-y.width/2,i.height-p/4);const _=new vr().load(i.toDataURL());_.generateMipmaps=!0,_.colorSpace="srgb",_.anisotropy=4;const v=i.width/i.height;t.scale.x=this._logoScale*v*window.devicePixelRatio,t.scale.y=this._logoScale*window.devicePixelRatio,t.material.map=_,t.material.needsUpdate=!0};s.onload=()=>r(),s.onerror=h=>{console.error("Failed to load temporary XR logo:",e,h),s.src=ol},s.crossOrigin="anonymous",s.src=e;const a=new Um(16777215,1);a.position.set(0,20,0),a.castShadow=!1,this._scene.add(a);const l=new Um(16777215,1);l.position.set(0,-1,0),l.castShadow=!1,this._scene.add(l);const c=new zm(16777215,1,100,1);if(c.position.set(0,2,0),c.castShadow=!1,c.distance=200,this._scene.add(c),this.isAR===!1)for(let h=0;h<100;h++){const d=new yt({color:2236962,metalness:1,roughness:.8}),p=Za.Sphere,m=Rs.createPrimitive(p,{material:d});m.position.x=D.random(-50,50),m.position.y=D.random(-2,50),m.position.z=D.random(-50,50),m.rotation.x=D.random(0,Math.PI*2),m.rotation.y=D.random(0,Math.PI*2),m.rotation.z=D.random(0,Math.PI*2),m.scale.multiplyScalar(.5+Math.random()*10);const f=m.position.distanceTo(this._camera.position)-m.scale.x;f<10&&(m.position.z+=5,m.position.multiplyScalar(1+1/f)),this._roomFlyObjects.push(m),this._scene.add(m)}}}var Wc;(o=>{const e=[];function t(){e?.length||A()&&console.warn("No USDZ exporters found \u2013 cannot export USDZ for QuickLook.");for(const s of e)s.exportAndOpen();return!0}o.exportAndOpen=t;function i(s){e.push(s)}o.registerExporter=i;function n(s){if(!e)return;const r=e.indexOf(s);r>=0&&e.splice(r,1)}o.unregisterExporter=n})(Wc||(Wc={}));const Ze=w("debugwebxr"),Ow=w("stats");let xf=0;function pE(o){let e=null;const t=o;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=o,e}mE();async function mE(){let o="immersive-vr";try{if(I.isNeedleAppClip()?o="immersive-ar":await navigator.xr?.isSessionSupported("immersive-vr")||(o="immersive-ar"),!await navigator.xr?.isSessionSupported("immersive-ar")&&o==="immersive-ar")return}catch(e){console.debug("[NeedleXRSession:granted] Error while checking XR support:",e);return}if(w("debugasap")){let e=globalThis["needle:XRSession"];if(e instanceof Promise){delete globalThis["needle:XRSession"],pe.addContextCreatedCallback(async t=>{if(!e)return;$a(!0);const i=await e;if(i){const n=Z.getDefaultSessionInit(o);Z.setSession(o,i,n,t.context)}else console.error("[NeedleXRSession:granted] ASAP session was rejected");e=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}navigator.xr?.addEventListener("sessiongranted",async()=>{const e=sessionStorage.getItem("needle_xr_session_mode"),t=sessionStorage.getItem("needle_xr_session_init")??null,i=t?JSON.parse(t):null;let n=null;if(kw()&&(await hc.start(e||o,i||Z.getDefaultSessionInit(o)).catch(s=>console.warn("[NeedleXRSession:granted] TemporaryXRContext start failed:",s)),await yE(),n=await hc.handoff()),n)Z.setSession(n.mode,n.session,n.init,z.Current);else if(e&&t){console.log("[NeedleXRSession:granted] Restore last session");const s=JSON.parse(t);Z.start(e,s).catch(r=>console.warn(r))}else Z.start(o).catch(s=>console.warn("[NeedleXRSession:granted] failed:",s))},{once:!0})}}function gE(o,e){sessionStorage.setItem("needle_xr_session_mode",o),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function fE(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const Sf=new Set;pe.registerCallback(ue.ContextCreationStart,async o=>{Sf.add(o.context)}),pe.registerCallback(ue.ContextCreated,async o=>{Sf.delete(o.context);const e=o.context?.domElement.getAttribute("autostart")||null;bE(e)});function kw(){return Sf.size>0}function yE(){return new Promise(o=>{const e=Date.now(),t=setInterval(()=>{(!kw()||Date.now()-e>6e4)&&(clearInterval(t),o())},100)})}I.isDesktop()&&A()&&window.addEventListener("keydown",o=>{(o.key==="x"||o.key==="Escape")&&Z.active&&Z.stop()});function bE(o){o&&o?.toLowerCase()==="ar"&&Gn.registerWaitForInteraction(()=>{Z.start("ar")})}const Eu=Symbol("initial-fov"),Cf=Symbol("initial-near");class Z{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new Cw(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static _currentSessionRequestMode=null;static get active(){return this._activeSession}static get activeMode(){return this._activeSession?.mode??null}static get xrSystem(){return"xr"in navigator?navigator.xr:void 0}static isXRSupported(){return Promise.all([this.isVRSupported(),this.isARSupported()]).then(e=>e.some(t=>t)).catch(()=>!1)}static isVRSupported(){return this.isSessionSupported("immersive-vr")}static isARSupported(){return this.isSessionSupported("immersive-ar")}static isSessionSupported(e){return this._sessionSupportedCache[e]!==void 0?Promise.resolve(this._sessionSupportedCache[e]):this.xrSystem?.isSessionSupported(e).then(t=>(this._sessionSupportedCache[e]=t,t)).catch(t=>(Ze&&console.error(t),!1))??Promise.resolve(!1)}static _sessionSupportedCache={};static _currentSessionRequest;static _activeSession;static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static _sessionRequestStartListeners=[];static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static _sessionRequestEndListeners=[];static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static _xrStartListeners=[];static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static _xrEndListeners=[];static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static _controllerAddedListeners=[];static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static _controllerRemovedListeners=[];static offerSession(e,t,i){return"xr"in navigator&&navigator.xr&&"offerSession"in navigator.xr?(typeof navigator.xr.offerSession=="function"&&(console.log("WebXR offerSession is available - requesting mode: "+e),t=="default"&&(t=this.getDefaultSessionInit(e)),navigator.xr.offerSession(e,{...t}).then(n=>Z.setSession(e,n,t,i)).catch(n=>{console.log("XRSession offer rejected (perhaps because another call to offerSession was made or a call to requestSession was made)")})),!0):!1}static getDefaultSessionInit(e){switch(e){case"immersive-ar":const t=["anchors","local-floor","layers","dom-overlay","hit-test","unbounded"];return I.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return I.isVisionOS()||i.push("hand-tracking"),{optionalFeatures:i};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,i){if(t||(t={}),I.isiOS()){const r=this._sessionSupportedCache["immersive-ar"]??await this.isARSupported();if(I.isVisionOS()&&!r&&(e==="ar"||e==="immersive-ar")&&(e="quicklook"),e==="quicklook")return fi.sendEvent(z.Current,"xr",{action:"quicklook_export",source:"NeedleXRSession.start"}),Wc.exportAndOpen(),null;if(!r&&(e==="immersive-ar"||e==="ar")){this.invokeSessionRequestStart("immersive-ar",t);const a=window.top||window;a.location.href;const l=new URL("https://appclip.apple.com/id?p=tools.needle.launch-app.Clip");l.searchParams.set("url",location.href);const c=l.toString();fi.sendEvent(z.Current,"xr",{action:"app_clip_launch",source:"NeedleXRSession.start",url:c});try{console.debug("iOS device detected - opening Needle App Clip for AR experience",{mode:e,init:t,url:l});const h="appclip-prewarm:"+new URL(l).origin,d=sessionStorage.getItem(h)===null;if(d){const p=new URL(l);p.searchParams.set("prewarm","1"),a.location.href=p.toString(),await new Promise(m=>setTimeout(m,300))}a.location.href=c,d&&!I.isSafari()&&setTimeout(()=>{const p=new URL(l);p.searchParams.set("prewarm","1"),a.location.href=p.toString()},500),sessionStorage.setItem(h,"1")}catch(h){console.warn(`Error navigating to AppClip ${c}
|
|
880
|
+
`,h),window!==window.top?window.open(c,"_blank"):window.location.href=c}return setTimeout(()=>{this.invokeSessionRequestEnd("immersive-ar",t||{},null)},3e3),null}}if(e==="quicklook")return console.error("QuickLook mode is only supported on iOS devices."),null;if(e=="ar"&&(e="immersive-ar"),A()&&w("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await hc.start(e,t||Z.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Ze||A())&&be("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(i||(i=z.Current),i||(i=pe.All[0]),!i)throw new Error("No Needle Engine Context found");switch(e){case"immersive-ar":{if(await this.xrSystem?.isSessionSupported("immersive-ar")!==!0)return console.error(e+" is not supported by this browser."),null;const r=this.getDefaultSessionInit(e),a=pE(i.domElement);a&&!I.isQuest()&&(r.domOverlay={root:a},r.optionalFeatures.push("dom-overlay")),t={...r,...t}}break;case"immersive-vr":{if(await this.xrSystem?.isSessionSupported("immersive-vr")!==!0)return console.error(e+" is not supported by this browser."),null;t={...this.getDefaultSessionInit(e),...t}}break;default:console.warn("No default session init for mode",e);break}t.optionalFeatures??=[],t.requiredFeatures??=[],await hc.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;Ze?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,n):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const r of n)r.onBeforeXR&&r.activeAndEnabled&&!r.destroyed&&r.onBeforeXR(e,t);this.invokeSessionRequestStart(e,t),Ze&&ke("Requesting "+e+" session ("+Date.now()+")"),fi.sendEvent(z.Current,"xr",{action:"session_request",mode:e,features:(t.requiredFeatures??[]).concat(t.optionalFeatures??[]).join(","),source:"NeedleXRSession.start"}),this._currentSessionRequest=navigator?.xr?.requestSession(e,t),this._currentSessionRequestMode=e;const s=await this._currentSessionRequest?.catch(r=>{console.error(r,"Code: "+r?.code),r?.code===9&&be("Couldn't start XR session. Make sure you allow the required permissions."),console.log("If the specified XR configuration is not supported (e.g. entering AR doesnt work) - make sure you access the website on a secure connection (HTTPS) and your device has the required permissions (e.g. camera access)"),location.protocol==="http:"&&be("XR requires a secure connection (HTTPS)")});return this._currentSessionRequest=void 0,this._currentSessionRequestMode=null,this.invokeSessionRequestEnd(e,t,s),s?this.setSession(e,s,t,i):(console.warn("XR Session request was rejected"),null)}static invokeSessionRequestStart(e,t){for(const i of this._sessionRequestStartListeners)i({mode:e,init:t})}static invokeSessionRequestEnd(e,t,i){for(const n of this._sessionRequestEndListeners)n({mode:e,init:t,newSession:i||null})}static setSession(e,t,i,n){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const s=e=="immersive-ar"?n.scripts_immersive_ar:n.scripts_immersive_vr;return this._activeSession=new Z(e,t,n,{scripts:s,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),Ze?console.log(`%cStarted ${e} session`,"font-weight:bold;",s):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static $_stop_request=Symbol();static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Ze&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Ze&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{Ze&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return Z._sync}get running(){return!this._ended&&this.session!=null}session;mode;get interactionMode(){return this.session.interactionMode}get visibilityState(){return this.session.visibilityState}get isVisibleBlurred(){return this.session.visibilityState==="visible-blurred"}get isSystemKeyboardSupported(){return this.session.isSystemKeyboardSupported}get environmentBlendMode(){return this.session.environmentBlendMode}get frame(){return this.context.xrFrame}controllers=[];get leftController(){return this.controllers.find(e=>e.side==="left")}get rightController(){return this.controllers.find(e=>e.side==="right")}getController(e){return typeof e=="number"?this.controllers[e]||null:this.controllers.find(t=>t.side===e)||null}get isPassThrough(){return!!(this.environmentBlendMode!=="opaque"&&this.interactionMode==="world-space"||this.mode==="immersive-ar"&&this.environmentBlendMode!=="opaque"&&this.controllers.some(e=>e.inputSource.targetRayMode==="tracked-pointer")||A()&&I.isDesktop()&&this.mode==="immersive-ar")}get isAR(){return this.mode==="immersive-ar"}get isVR(){return this.mode==="immersive-vr"}get isScreenBasedAR(){return this.isAR&&!this.isPassThrough}get posePosition(){return this._transformPosition}get poseOrientation(){return this._transformOrientation}get referenceSpace(){return this.context.renderer.xr.getReferenceSpace()}get viewerPose(){return this._viewerPose}get isTrackingImages(){if(this.frame&&"getImageTrackingResults"in this.frame&&typeof this.frame.getImageTrackingResults=="function")try{const e=this.frame.getImageTrackingResults();for(const t of e)if(t.trackingState==="tracked")return!0}catch{return!1}return!1}get rig(){const e=this._rigs[0]??null;return e?.gameObject&&Ur(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}_rigScale=1;_lastRigScaleUpdate=-1;get rigScale(){return this._rigs[0]?(this._lastRigScaleUpdate!==this.context.time.frame&&(this._lastRigScaleUpdate=this.context.time.frame,this._rigScale=this._rigs[0].gameObject.worldScale.x),this._rigScale):1}addRig(e){this._rigs.indexOf(e)>=0||(e.priority===void 0&&(e.priority=0),this._rigs.push(e),this.updateActiveXRRig())}removeRig(e){const t=this._rigs.indexOf(e);t!==-1&&(this._rigs.splice(t,1),this.updateActiveXRRig())}setRigActive(e){const t=this._rigs.indexOf(e),i=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=i?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){const e=this.context.mainCamera?.position;if(!e||!this.rig)return F(0,0,0);const t=F(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(di(this.rig.gameObject.quaternion)),t}updateActiveXRRig(){const e=this._rigs[0]??null;this._defaultRig.gameObject.parent!==this.context.scene&&this.context.scene.add(this._defaultRig.gameObject),this._defaultRig.gameObject.visible=!0,this._rigs.includes(this._defaultRig)||this._rigs.push(this._defaultRig);let t=this._rigs[0];t&&t.priority===void 0&&(t.priority=0);for(let i=1;i<this._rigs.length;i++){const n=this._rigs[i];if(n.isActive){if(Ur(n.gameObject)){this._rigs.splice(i,1),i--;continue}(!t||t.isActive===!1||n.priority!==void 0&&n.priority>t.priority)&&(t=n)}}if(e!==t){const i=this._rigs.indexOf(t);i>=0&&this._rigs.splice(i,1),this._rigs.unshift(t)}Ze&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}_rigs=[];_viewerHitTestSource=null;getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,i=this.frame.getHitTestResults(t);if(i.length>0){const n=i[0];return this.convertHitTestResult(n)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const i=this.frame.getHitTestResultsForTransientInput(t);for(const n of i)if(n.inputSource===e.inputSource)for(const s of n.results)return this.convertHitTestResult(s);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),i=t&&e.getPose(t);if(i){const n=F(i.transform.position),s=di(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(al),r?.parent){n.applyMatrix4(r.parent.matrixWorld),s.multiply(nn);const a=_e(r.parent);a.premultiply(nn),s.premultiply(a)}return{hit:e,position:n,quaternion:s}}return null}convertSpace(e){const t=F(e.position);t.applyMatrix4(al);const i=di(e.orientation);return i.premultiply(nn),{position:t,quaternion:i}}_defaultRig;_xr_scripts;_xr_update_scripts=[];_inactive_scripts=[];_controllerAdded;_controllerRemoved;_originalCameraWorldPosition;_originalCameraWorldRotation;_originalCameraWorldScale;_originalCameraParent;_mainCamera=null;constructor(e,t,i,n){gE(e,n.init),this.session=t,this.mode=e,this.context=i,(Ze||w("console"))&&$a(!0),this._xr_scripts=[...n.scripts],this._xr_update_scripts=this._xr_scripts.filter(s=>typeof s.onUpdateXR=="function"),this._controllerAdded=n.controller_added,this._controllerRemoved=n.controller_removed,Uo(this.onBefore,xe.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),(n.init.optionalFeatures?.includes("hit-test")||n.init.requiredFeatures?.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(s=>t.requestHitTestSource?.call(t,{space:s})?.then(r=>this._viewerHitTestSource=r).catch(r=>console.error(r))).catch(s=>console.error(s)),this.context.mainCamera&&(this._originalCameraWorldPosition=ee(this.context.mainCamera,new b),this._originalCameraWorldRotation=_e(this.context.mainCamera,new N),this._originalCameraWorldScale=Ge(this.context.mainCamera,new b),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof de&&(this.context.mainCamera[Eu]=this.context.mainCamera.fov)),this._defaultRig=new lE,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let s=0;s<t.inputSources.length;s++){const r=t.inputSources[s];if(!r.handedness){console.warn("Input source in xr session has no handedness - ignoring",s);continue}this.onInputSourceAdded(r)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",s=>{for(const r of s.removed)this.disconnectInputSource(r);for(const r of s.added)this.onInputSourceAdded(r)}),this.context.xr=this,this.context.renderer.xr.setSession(this.session).then(this.onRendererSessionSet),"controllerAutoUpdate"in this.context.renderer.xr?(console.debug("Disabling three.js controllerAutoUpdate"),this.context.renderer.xr.controllerAutoUpdate=!1):Ze&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it"),I.isNeedleAppClip()&&window.requestAnimationFrame(()=>{const s=this.context.renderer.domElement,r=window.devicePixelRatio||1,a=s.width,l=s.height,c=Math.floor(window.innerWidth*r),h=Math.floor(window.innerHeight*r);(Math.abs(a-c)>2||Math.abs(l-h)>2)&&(s.width=c,s.height=h,console.debug("Applied DPR scaling for Needle AppClip XR session",r,s.width,s.height))})}onRendererSessionSet=()=>{this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),this.context.mainCameraComponent?.applyClearFlags())};onInputSourceAdded=e=>{if(e.targetRayMode==="screen")return;let t=0;for(let n=0;n<this.session.inputSources.length;n++)if(this.session.inputSources[n]===e){t=n;break}if(this.controllers.find(n=>n.inputSource===e)){console.debug("Controller already exists for input source",t);return}else if(this._newControllers.find(n=>n.inputSource===e)){console.debug("Controller already registered for input source",t);return}const i=new vf(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(s,r)=>{if(s.inputSource===e){Ze&&console.log("Disconnecting controller",s.index);const a=r.indexOf(s);a>=0&&r.splice(a,1),this.invokeControllerEvent(s,this._controllerRemoved,"removed");const l={xr:this,controller:s,change:"removed"};for(const c of this._xr_scripts)c.onXRControllerRemoved&&c.onXRControllerRemoved(l);s.onDisconnected()}},i=[...this.controllers];for(let s=i.length-1;s>=0;s--){const r=i[s];t(r,this.controllers)}const n=[...this._newControllers];for(let s=n.length-1;s>=0;s--){const r=n[s];t(r,this._newControllers)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}_ended=!1;_newControllers=[];onEnd=e=>{if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),fi.sendEvent(z.Current,"xr",{action:"session_end",mode:this.mode,source:"NeedleXRSession.onEnd"}),fE(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,Ms(this.onBefore,xe.LateUpdate);const t=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);t>=0&&this.context.pre_render_callbacks.splice(t,1);const i=this.context.post_render_callbacks.indexOf(this.onAfterRender);i>=0&&this.context.post_render_callbacks.splice(i,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{this.context.mainCameraComponent?.applyClearFlags(),this.context.mainCameraComponent?.applyClippingPlane()}),mw({session:this});for(const s of Z._xrEndListeners)s({xr:this});const n=[...this.controllers];for(let s=0;s<n.length;s++)this.disconnectInputSource(n[s].inputSource);this.controllers.length=0,this._newControllers.length=0;for(const s of this._xr_scripts)s?.onLeaveXR?.({xr:this});this.sync?.onExitXR(this),this.context.mainCamera&&(this._originalCameraParent?.add(this.context.mainCamera),this._originalCameraWorldPosition&&bt(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&kn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&Va(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof de&&(this.context.mainCamera[Eu]&&(this.context.mainCamera.fov=this.context.mainCamera[Eu],this.context.mainCamera[Eu]=0),this.context.mainCamera[Cf]&&(this.context.mainCamera.near=this.context.mainCamera[Cf],this.context.mainCamera[Cf]=0))),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),$a(!1)};_didStart=!1;onBefore=e=>{const t=e.xrFrame;if(!t)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),this.rig?.isActive==!1&&(Ze&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&this._mainCamera?.gameObject&&this._mainCamera?.gameObject?.parent!==this.rig.gameObject&&this.rig.gameObject.add(this._mainCamera?.gameObject),this.internalUpdateState(),this.applyCustomForward();const i={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const n=[...this.context.new_scripts_xr];for(let s=0;s<n.length;s++){const r=this.context.new_scripts_xr[s];if(!r||r.destroyed||r.supportsXR?.(this.mode)==!1){this.context.new_scripts_xr.splice(s,1);continue}if(!r.activeAndEnabled){this.context.new_scripts_xr.splice(s,1),this.markInactive(r);continue}if(this.addScript(r)){this.invokeCallback_EnterXR(r);for(const a of this.controllers)this.invokeCallback_ControllerAdded(r,a)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const s=ui(this.context.scene.children);if(s){const r=s.getSize(F());if(r.length()>0){const a=this._defaultRig.gameObject;a.position.set(s.min.x+r.x*.5,s.min.y,s.max.z+r.z*.5+1.5);const l=s.getCenter(F());l.y=a.position.y,a.lookAt(l)}}}pw({session:this}),Ir();for(const s of Z._xrStartListeners)s(i);const n=[...this._xr_scripts];Ze&&console.log("NeedleXRSession start, handle scripts:",n);for(const s of n){if(s.destroyed){this._script_to_remove.push(s);continue}if(!s.activeAndEnabled){this.markInactive(s);continue}this.invokeCallback_EnterXR(s);for(const r of this.controllers)this.invokeCallback_ControllerAdded(s,r)}}this.syncCameraCullingMask();for(const n of this.controllers)n.onUpdate(t);if(this._newControllers.length>0){const n=[...this._newControllers];this._newControllers.length=0;for(const s of n){if(!s.connected){console.warn("New controller is not connected",s);continue}this.controllers.push(s);for(const r of this._xr_scripts){if(r.destroyed){this._script_to_remove.push(r);continue}r.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(r,s)}}this.controllers.sort((s,r)=>s.index-r.index)}Ze&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&($a(!0),console.error("XRControllers are not added but inputSources are present"));for(const n of this._xr_update_scripts){if(n.destroyed===!0){this._script_to_remove.push(n);continue}if(n.activeAndEnabled===!1){this.markInactive(n);continue}n.onUpdateXR&&n.onUpdateXR(i)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const n=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const s of n)!s.destroyed&&this.running&&s.onLeaveXR?.(i),this.removeScript(s)}this.sync?.onUpdate(this),this.onRenderDebug()};onRenderDebug(){if(Ze)for(const e of this.controllers)e.onRenderDebug();if((Ze||Ow)&&this.rig&&(xf++,xf>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const i=this.rig.gameObject.worldUp;e.add(i.multiplyScalar(2.5));let n="";if(n+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,n+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Ze||Ow)for(const s of this.controllers)n+=`
|
|
881
|
+
${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;xf=0,B.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof de&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),I.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Ze&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Ze&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const s=this._inactive_scripts.indexOf(e);s>=0&&this._inactive_scripts.splice(s,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const s=t[n];if(s)try{s({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new M().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=Ge(this.rig.gameObject);e*=i.x}this._camera instanceof de&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Ze&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof de&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new N;_transformPosition=new b;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new Pw),this._transition}fadeTransition(){return this._transition||(this._transition=new Pw),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof de&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const Pf=w("debugwebxr");class Mw{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(Pf&&console.log("FOUND AVATAR HEAD",e.name),i.head=new ne("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(Pf&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new ne("",t,e)),!i.rightHand&&n.includes("right")&&(Pf&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new ne("",t,e)));for(let s=0;s<e.children.length;s++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[s];this.tryFindAvatarObjects(r,t,i)}}}class se extends oe{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=D.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,s=t;return n.alpha!=null&&s.alpha!=null&&(this.alpha=D.lerp(n.alpha,s.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new se(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,s=t>>8&255,r=t>>0&255;return new se(i/255,n/255,s/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,s=t>>0&255;return new se(i/255,n/255,s/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new se(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new se(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new se(e[0],e[1],e[2],e[3]);if(e.length===3)return new se(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new se(e)}}const Wt=new b,Ew=new b,Rw=new N,_E=w("debuggizmos"),An=8947848,Of=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[Mf]!==void 0}static setVisible(e){for(const t of on.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,s,r,a){if(!B.enabled)return null;s||(s=An);const l=Z.active?.rigScale??1,c=on.getTextLabel(n,t,i*l,s,r);return a instanceof M&&a.add(c),c.position.x=e.x,c.position.y=e.y,c.position.z=e.z,c}static DrawRay(e,t,i=An,n=0,s=!0){if(!B.enabled)return;const r=on.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),Wt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+Wt.x,e.y+Wt.y,e.z+Wt.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,In(r.material,i)}static DrawDirection(e,t,i=An,n=0,s=!0,r=1){if(!B.enabled)return;const a=on.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(Wt.set(0,0,-r),Rw.set(t.x,t.y,t.z,t.w),Wt.applyQuaternion(Rw)):(Wt.set(t.x,t.y,t.z),Wt.multiplyScalar(r)),l.setXYZ(1,e.x+Wt.x,e.y+Wt.y,e.z+Wt.z),l.needsUpdate=!0,a.material.depthTest=s,a.material.depthWrite=!1,In(a.material,i)}static DrawLine(e,t,i=An,n=0,s=!0){if(!B.enabled)return;const r=on.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,In(r.material,i)}static DrawCircle(e,t,i,n=An,s=0,r=!0){if(!B.enabled)return;const a=on.getCircle(s);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,Wt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,In(a.material,n)}static DrawWireSphere(e,t,i=An,n=0,s=!0){if(!B.enabled)return;const r=on.getSphere(t,n,!0);Pr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,In(r.material,i)}static DrawSphere(e,t,i=An,n=0,s=!0){if(!B.enabled)return;const r=on.getSphere(t,n,!1);Pr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,In(r.material,i)}static DrawWireBox(e,t,i=An,n=0,s=!0,r=void 0){if(!B.enabled)return;const a=on.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=s,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,In(a.material,i)}static DrawWireBox3(e,t=An,i=0,n=!0){if(!B.enabled)return;const s=on.getBox(i);s.position.copy(e.getCenter(Wt)),s.scale.copy(e.getSize(Wt)),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1,In(s.material,t)}static _up=new b(0,1,0);static DrawArrow(e,t,i=An,n=0,s=!0,r=!1){if(!B.enabled)return;const a=on.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),Wt.set(t.x,t.y,t.z).sub(Ew.set(e.x,e.y,e.z)).normalize());const l=Wt.set(t.x,t.y,t.z).sub(Ew.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.depthTest=s,a.material.wireframe=r,In(a.material,i),this.DrawLine(e,t,i,n,s)}static DrawWireMesh(e){const t=on.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrixWorld.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrixWorld.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,In(t.material,e.color??An)}}const vE=new Da(1,1,1);function kf(o=null){const e=new oe(o??14540253),t=new yC(vE);return new Nm(t,new zd({color:e}))}function In(o,e){if(Array.isArray(o)){for(const i of o)In(i,e);return}const t=e instanceof se?e.a:1;o.color.set(e),o.opacity=t,o.transparent=t<1}const Mf=Symbol("GizmoCache");class on{static familyName="needle-gizmos";static 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()}))}static getTextLabel(e,t,i,n,s){this.ensureFont();let r=this.textLabelCache.pop(),a=1;s&&typeof s=="string"&&s?.length>=8&&s.startsWith("#")?(a=parseInt(s.substring(7),16)/255,s=s.substring(0,7),_E&&console.log(s,a)):typeof s=="object"&&s.a!==void 0&&(a=s.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:s??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new n_(l);const c=this,h=r;h.setText=function(d){this.set({textContent:d}),c.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(z.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new Da(1,1,1);t=new H(i)}return this.registerTimedObject(z.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new Ba;let i=t.geometry.getAttribute("position");i||(i=new tt(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new Ba;let i=t.geometry.getAttribute("position");if(!i){i=new tt(new Float32Array(Of*3),3),t.geometry.setAttribute("position",i);const n=F(0,1,0),s=F(0,0,1),r=F(s);r.cross(n).normalize();const a=F(r),l=Math.PI*2/(Of-1);for(let c=0;c<Of+1;c++){const h=l*c;n.copy(a).multiplyScalar(Math.cos(h)*1),r.copy(s).multiplyScalar(Math.sin(h)*1);const d=n.add(r);i.setXYZ(c,d.x,d.y,d.z)}}}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new H(new Id(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(z.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new H(new Ib(0,.5,1,8))),this.registerTimedObject(z.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new H,t.material=new Ce),this.registerTimedObject(z.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const s=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(s){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==s){const a=e.pre_render_callbacks.indexOf(s);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(s)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[Mf]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(z.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Oe.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof Oe.MeshUIBaseElement){if(Ur(n))continue;const s=e.isInVR,r=!1,a=!s;xc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let s=t.length-1;s>=0;s--){const r=t[s];n>=i[s]-1e-6&&(t.splice(s,1),i.splice(s,1),r.removeFromParent(),Ur(r)!=!0&&r[Mf].push(r))}}}const ei=w("debugphysics"),wE=w("debugworker"),Tw=new xs;class Ts{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new K),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Tw.set(e),this.layerMask=Tw}setMask(e){this.layerMask||(this.layerMask=new xs);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Ef{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class dc{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new Nd;defaultRaycastOptions=new Ts;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new xs;sphere=new Ld;sphereOverlap(e,t,i=!0,n=!1,s=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,s);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){ei&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return ei&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof bC&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let s=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),s||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),s=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof xs?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),ei&&console.time("raycast"),s.length=0,dc._raycasting++,this.intersect(this.raycaster,n,s,e),s.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(s=s.filter(a=>!r.includes(a.object))),dc._raycasting--,ei&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",s?.length?[...s]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),s}intersect(e,t,i,n){for(const s of t){if(!s||s.visible===!1||B.isGizmo(s)||n.lineThreshold!==void 0&&n.lineThreshold<0&&s instanceof Ba)continue;let r=!0;const a=s,l=a.geometry;if(s.raycastAllowed===!1&&(r=!1),r&&n.testObject){const c=n.testObject?.(s);if(c===!1)continue;c==="continue in children"&&(r=!1)}else r&&(l&&Aw(l)||(r=!1));if(r){const c=i.length,h=s.raycastPreference||"lod";let d=h!=="bounds";if(n.precise===!1&&(d=!1),l&&(d||=l.getAttribute("position")?.array?.length<64),a instanceof Fa&&(d=!1),h==="lod"){const p=qb(s);p&&(a.geometry=p)}if(!d&&SE(a,e,i)||(n.useAcceleratedRaycast!==!1?Tu.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,ei&&i.length!=c){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new Nt;intersectSphere(e,t,i,n,s,r,a,l){let c=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);c&&=e.visible,c&&=!(e instanceof Ba),c&&=!(e instanceof Fa);const h=e,d=h.geometry;if(c&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(c=!1)}if(d&&Aw(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=s.length;if(Tu.runMeshBVHRaycast(this.sphere,h,s,this.context,{}),m!=s.length&&!r)return}else if(d.boundingBox||d.computeBoundingBox(),d.boundingBox){h.matrixWorldNeedsUpdate&&h.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(d.boundingBox).applyMatrix4(h.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const f=ee(e),g=f.distanceTo(m.center),y=new Ef(e,g,f);if(s.push(y),!r)return}}}if(e.children)for(const p of e.children){const m=s.length;if(this.intersectSphere(p,t,i,n,s,r,a,l),m!=s.length&&!r)return}}}function Aw(o){return!(o.index&&o.index.array.length<3)}const Dr=new Ld,Ru=new wr,xE=new Tb;function SE(o,e,t){const i=o._computeIntersections;if(!i)return!1;let n=o["_computeIntersections:Needle"];return n||(n=o["_computeIntersections:Needle"]=function(s,r,a){const l=this,c=l.geometry.boundingSphere;if(c){if(l instanceof Fa){Ru.setFromNormalAndCoplanarPoint(F(0,1,0),F(0,-l.position.y,0)),Ru.applyMatrix4(l.matrixWorld,xE);const d=s.ray.intersectPlane(Ru,F());if(d){Dr.copy(c),Dr.applyMatrix4(l.matrixWorld);const p=F(d).sub(s.ray.origin).length(),m=Dr.radius*.5;p<m&&r.push({distance:p,point:d,object:l,normal:Ru.normal.clone()})}return}Dr.copy(c),Dr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(Dr,F());if(h){const d=F(h).sub(s.ray.origin),p=d.length();if(p>Dr.radius){const m=d.clone().normalize();r.push({distance:p,point:h,object:l,normal:m})}}}}),o._computeIntersections=n,e.intersectObject(o,!1,t),o._computeIntersections=i,!0}var Tu;(o=>{let e=0;function t(v,C,O,k,j){if(!C.geometry||!C.geometry.hasAttribute("position"))return!1;const L=C.geometry;if(C?.isSkinnedMesh){const V=C,W=V.bvhNeedsUpdate;if(!V.staticGenerator)l(),r&&(V.staticGenerator=new r(C),V.staticGenerator.applyWorldTransforms=!1,V.staticGeometry=V.staticGenerator.generate(),L.boundsTree=a?.call(V.staticGeometry),V.staticGeometryLastUpdate=performance.now()+Math.random()*200,V.bvhNeedsUpdate=!0);else if(L.boundsTree&&(V.autoUpdateMeshBvhInterval!==void 0&&V.autoUpdateMeshBvhInterval>=0||W===!0)){const G=performance.now(),X=G-V.staticGeometryLastUpdate,R=V.autoUpdateMeshBvhInterval??100;(W||X>R)&&(ei&&console.warn(`Physics: updating skinned mesh bvh for ${C.name} after ${X.toFixed(2)}ms`),V.bvhNeedsUpdate=!1,V.staticGeometryLastUpdate=G,V.staticGenerator?.generate(V.staticGeometry),L.boundsTree.refit())}}else if(!L.boundsTree){h||_();let V=!0;if((k.xr||L[f]===!1||L.getAttribute("position")?.isInterleavedBufferAttribute||L.index&&L.index?.isInterleavedBufferAttribute||e>10)&&(V=!1),V&&p){if(L[m]===void 0){let W=null;if(y.length>0){const G=y.shift();G&&!G.running&&(W=G)}if(!W&&g.length<3)try{wE&&console.warn("[GenerateMeshBVHWorker] Creating worker with import.meta.url:",import.meta.url),W=new p,g.push(W)}catch(G){G instanceof DOMException&&G.name==="SecurityError"?(console.warn("Failed to create MeshBVH worker, falling back to main thread generation. This can happen when running from file://, if the browser does not support workers or if the browser is blocking workers for other reasons."),console.debug(G),e+=10):(console.error("Failed to create MeshBVH worker. Please see below for more details:"),console.log(G)),e++}if(W!=null&&!W.running){const G=C.name;ei&&console.log("<<<< worker start",G,W),L[m]="queued",performance.mark("bvh.create.start");const X=L.clone();try{W.generate(X).then(R=>{L[m]="done",L.boundsTree=R}).catch(R=>{L[m]="failed - "+R?.message,L[f]=!1,ei&&console.error("Failed to generate mesh bvh on worker",R)}).finally(()=>{ei&&console.log(">>>>> worker done",G,{hasBoundsTre:L.boundsTree!=null}),y.push(W),X.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(R){console.error("Failed to generate mesh bvh on worker",R)}}else ei&&console.warn("No worker available")}}else(!d||!V)&&(l(),s&&(performance.mark("bvh.create.start"),L.boundsTree=new s(L),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(v instanceof Nd){const V=v,W=C.raycast;if(L.boundsTree)l(),n&&(C.acceleratedRaycast||(C.acceleratedRaycast=n.bind(C),ei&&console.debug(`Physics: bind acceleratedRaycast fn to "${C.name}"`)),C.raycast=C.acceleratedRaycast);else if(ei&&console.warn("No bounds tree found for mesh",C.name,{workerTask:L[m],hasAcceleratedRaycast:n!=null}),j.allowSlowRaycastFallback===!1&&(L.getAttribute("position")?.array?.length??0)>2e3)return ei&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const G=V.firstHitOnly;return V.firstHitOnly=!1,V.intersectObject(C,!1,O),V.firstHitOnly=G,C.raycast=W,!0}else if(v instanceof Ld){const V=L.boundsTree;if(V){const W=v;if(c.copy(C.matrixWorld).invert(),W.applyMatrix4(c),V.intersectsSphere(W)){const G=ee(C),X=G.distanceTo(W.center),R=new Ef(C,X,G);O.push(R)}}return!0}return!1}o.runMeshBVHRaycast=t;let i=!1,n=null,s=null,r=null,a=null;function l(){i||(i=!0,import("./vendor-HRlxIBga.min.js").then(v=>v.index$1).then(v=>{n=v.acceleratedRaycast,s=v.MeshBVH,r=v.StaticGeometryGenerator,a=v.computeBoundsTree}).catch(v=>{(ei||A())&&console.error("Failed to load BVH library...",v.message)}))}const c=new J;let h=!1,d=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),f=Symbol("Needle:MeshBVH-CanUseWorker"),g=[],y=[];function _(){h=!0,d=!0,Promise.resolve().then(()=>$D).then(v=>{p=v.GenerateMeshBVHWorker}).catch(v=>{ei||A()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",v)}).finally(()=>{d=!1})}})(Tu||(Tu={}));const Iw=Symbol("gltf-loader-internal-usage-tracker"),CE=w("debugusers");class uc{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return uc._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){uc._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const s=t.call(this,i,n);return s.then(r=>(r&&(e._loadedObjects.add(r),r[Iw]=e._loadingId),r)),s},null}afterRoot(e){uc._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Iw],t instanceof M&&(t.parent||t instanceof H&&setTimeout(()=>{CE&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class Lw{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
882
|
+
`+i.src),e.preventDefault())}})}}const Au=w("trackresources");function Dw(){return Au==="dispose"}let jr=!0;Au===0&&(jr=!1);function PE(o){jr=o}function jw(){return jr}const Bw=Symbol("disposable");function Fw(o,e){o&&(o[Bw]=e,Br&&console.warn("Set disposable",e,o))}const Uw=Symbol("disposed");function OE(o){return o[Uw]===!0}function Me(o){if(o){if(o[Bw]===!1){Br&&console.warn("Object is marked as not disposable",o);return}if(typeof o=="object"&&(o[Uw]=!0),o instanceof Ti)Me(o.environment),Me(o.background),Me(o.customDepthMaterial),Me(o.customDistanceMaterial);else if(o instanceof Ss)Me(o.geometry),Me(o.material),Me(o.skeleton),Me(o.bindMatrix),Me(o.bindMatrixInverse),Me(o.customDepthMaterial),Me(o.customDistanceMaterial),o.visible=!1;else if(o instanceof H)Me(o.geometry),Me(o.material),Me(o.customDepthMaterial),Me(o.customDistanceMaterial),o.visible=!1;else if(o instanceof M)o.visible=!1;else if(o instanceof Ji){ll(o);for(const e of Object.keys(o.attributes)){const t=o.attributes[e];Me(t)}}else if(o instanceof tt||o instanceof jb)Br&&console.warn("BufferAttribute dispose not supported",o.count);else if(o instanceof Array)for(const e of o)e instanceof we&&Me(e);else if(o instanceof we){ll(o);for(const t of Object.keys(o)){const i=o[t];i instanceof Se&&Me(i)}const e=o.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof Se?Me(i):i instanceof Ki&&Me(i.value)}}else o instanceof Se?(ll(o),ll(o.source),o.source?.data instanceof ImageBitmap&&ll(o.source.data)):o instanceof _C?(ll(o.boneTexture),o.boneTexture=null):o instanceof vC||!(o instanceof M)&&Br&&console.warn("Unknown object type",o)}}function ll(o){o&&((Br||Dw()||Au)&&console.warn("\u{1F9E8} FREE",o),o instanceof ImageBitmap||"dispose"in o&&typeof o.dispose=="function"&&o.dispose())}function kE(o){}const ME=new Set;function Rf(o,e,t=null,i){if(i||(i=ME,i.clear()),!o)return i;const n=o[Vc];if(n)for(const s of n)i.has(s)||t?.call(null,s)!==!1&&(i.add(s),e&&Rf(s,!0,t,i));return i}function EE(o){return o[$c]}const Br=w("debugresourceusers")||w("debugmemory"),Vc=Symbol("needle-resource-users"),$c=Symbol("needle-resource-users-count");function ti(o,e){nu(o,e,function(t,i){jr&&!dc.raycasting&&(Iu(Vc,this,t,!1),Iu(Vc,this,i,!0))})}jr&&(ti(H.prototype,"material"),ti(H.prototype,"geometry"),ti(we.prototype,"map"),ti(we.prototype,"bumpMap"),ti(we.prototype,"alphaMap"),ti(we.prototype,"normalMap"),ti(we.prototype,"displacementMap"),ti(we.prototype,"roughnessMap"),ti(we.prototype,"metalnessMap"),ti(we.prototype,"emissiveMap"),ti(we.prototype,"specularMap"),ti(we.prototype,"envMap"),ti(we.prototype,"lightMap"),ti(we.prototype,"aoMap"),ti(we.prototype,"gradientMap"));function RE(o){if(jr===!1)return;const e=o[Vc];if(e)for(const t of e)Iu(Vc,t,o,!1)}jr&&nu(we.prototype,"dispose",function(){RE(this)});let Tf=0;function Iu(o,e,t,i){if(Tf>0)return;if(Array.isArray(t)){for(const s of t)Iu(o,e,s,i);return}if(!t)return;let n=t[o];if(n||(n=new Set),i){if(e&&!n.has(e)){n.add(e);let s=t[$c]||0;s+=1,t[$c]=s,Br&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,s,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let s=t[$c]||0;s>0&&(s-=1,t[$c]=s),Br&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,s,"users:",n),s<=0&&(uc.isLoading(t)||(Au&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),Dw()&&Me(t)))}t[o]=n}try{nu(_r.prototype,"render",function(){Tf++},function(){Tf--})}catch(o){console.warn("Could not wrap WebGLRenderer.render",o)}const Hc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),zw=Symbol("isUsingInstancing"),Nw=Symbol("instancingRenderer"),Gc=Symbol("instancingAutoUpdateBounds");class vn{static isUsingInstancing(e){return e[zw]===!0}static getRenderer(e){return e[Nw]||null}setAutoUpdateBounds(e,t){const i=vn.getRenderer(e);i&&(i[Gc]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[Hc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)vn.markDirty(i,!0)}}const Ww=new Map;function Vw(o,e){if(!o)return;if(!e){console.warn("No prototype found",o,o.prototype,o.constructor);return}const t=Ww.get(e);t&&t.apply(o)}function Af(o){const e=TE(o.prototype);Ww.set(o,e)}function TE(o){return new AE(o)}class AE{$symbol;extensions;descriptors;constructor(e){this.$symbol=Symbol("prototype-extension"),this.extensions=Object.keys(e),this.descriptors=new Array;for(let t=0;t<this.extensions.length;t++){const i=this.extensions[t],n=Object.getOwnPropertyDescriptor(e,i);n&&this.descriptors.push(n)}}apply(e){if(!e[this.$symbol]){e[this.$symbol]=!0;for(let t=0;t<this.extensions.length;t++){const i=this.extensions[t],n=this.descriptors[t];n&&Object.defineProperty(e,i,n)}}}}function Lu(o){o&&o.isObject3D===!0&&Vw(o,M)}let $w=!1;function IE(){if($w)return;if($w=!0,Tg.experimentalSmartHierarchyUpdate){const i=M.prototype.add;M.prototype.add=function(...r){return Nf(),i.apply(this,r)};const n=M.prototype.attach;M.prototype.attach=function(...r){return Nf(),n.apply(this,r)};const s=M.prototype.remove;M.prototype.remove=function(...r){return Nf(),s.apply(this,r)}}M.prototype.SetActive=function(i){this.visible=i},M.prototype.setActive=function(i){this.visible=i},M.prototype.destroy=function(){Ui(this)},M.prototype.addComponent=function(i,n){return oo(this,i,n)},M.prototype.addNewComponent=function(i,n){return oo(this,i,n)},M.prototype.removeComponent=function(i){return Hf(this,i)},M.prototype.getOrAddComponent=function(i,n){return Yc(this,i,n)},M.prototype.getComponent=function(i){return Vr(this,i)},M.prototype.getComponents=function(i,n){return dl(this,i,n)},M.prototype.getComponentInChildren=function(i,n=!1){return Zc(this,i,n)},M.prototype.getComponentsInChildren=function(i,n){return ul(this,i,n)},M.prototype.getComponentInParent=function(i,n=!1){return Kc(this,i,n)},M.prototype.getComponentsInParent=function(i,n){return Wu(this,i,n)},Object.getOwnPropertyDescriptor(M.prototype,"activeSelf")||Object.defineProperty(M.prototype,"activeSelf",{get:function(){return cl(this)},set:function(i){qc(this,i)}}),Object.getOwnPropertyDescriptor(M.prototype,"raycastAllowed")||Object.defineProperty(M.prototype,"raycastAllowed",{get:function(){return this.userData&&this.userData.raycastAllowed!==!1},set:function(i){const n=this;n.userData||(n.userData={}),n.userData.raycastAllowed=i}}),Object.getOwnPropertyDescriptor(M.prototype,"worldPosition")||Object.defineProperty(M.prototype,"worldPosition",{get:function(){return this instanceof Yb?ee(this.object):ee(this)},set:function(i){bt(this,i)}}),Object.getOwnPropertyDescriptor(M.prototype,"worldQuaternion")||Object.defineProperty(M.prototype,"worldQuaternion",{get:function(){return this instanceof Yb?_e(this.object):_e(this)},set:function(i){kn(this,i)}}),Object.getOwnPropertyDescriptor(M.prototype,"worldRotation")||Object.defineProperty(M.prototype,"worldRotation",{get:function(){return Kd(this)},set:function(i){B_(this,i)}}),Object.getOwnPropertyDescriptor(M.prototype,"worldScale")||Object.defineProperty(M.prototype,"worldScale",{get:function(){return Ge(this)},set:function(i){Va(this,i)}});const o=new J,e=new b(0,0,0),t=new b(0,1,0);Object.getOwnPropertyDescriptor(M.prototype,"worldForward")||Object.defineProperty(M.prototype,"worldForward",{get:function(){return F().set(0,0,1).applyQuaternion(_e(this))},set:function(i){const n=di().setFromRotationMatrix(o.lookAt(e.set(0,0,0),i,t.set(0,1,0)));this.worldQuaternion=n}}),Object.getOwnPropertyDescriptor(M.prototype,"worldRight")||Object.defineProperty(M.prototype,"worldRight",{get:function(){return F().set(1,0,0).applyQuaternion(_e(this))}}),Object.getOwnPropertyDescriptor(M.prototype,"worldUp")||Object.defineProperty(M.prototype,"worldUp",{get:function(){return F().set(0,1,0).applyQuaternion(_e(this))}}),Object.getOwnPropertyDescriptor(M.prototype,"contains")||Object.defineProperty(M.prototype,"contains",{value:function(i){if(!i)return!1;if(this===i)return!0;for(const n of this.children)if(n.contains(i))return!0;return!1}}),Af(M)}const Du=w("debuggetcomponent"),Fr=w("debuginstantiate");class qn{idProvider;parent;keepWorldPosition;position;rotation;scale;visible;context;components;clone(){const e=new qn;return e.idProvider=this.idProvider,e.parent=this.parent,e.keepWorldPosition=this.keepWorldPosition,e.position=Array.isArray(this.position)?[...this.position]:this.position?.clone(),e.rotation=Array.isArray(this.rotation)?[...this.rotation]:this.rotation?.clone(),e.scale=Array.isArray(this.scale)?[...this.scale]:this.scale?.clone(),e.visible=this.visible,e.context=this.context,e.components=this.components,e}cloneAssign(e){this.idProvider=e.idProvider,this.parent=e.parent,this.keepWorldPosition=e.keepWorldPosition,this.position=Array.isArray(e.position)?[...e.position]:e.position?.clone(),this.rotation=Array.isArray(e.rotation)?[...e.rotation]:e.rotation?.clone(),this.scale=Array.isArray(e.scale)?[...e.scale]:e.scale?.clone(),this.visible=e.visible,this.context=e.context,this.components=e.components}}function cl(o){return o.visible}function qc(o,e){return typeof e=="number"&&(e=e>.5),o.visible=e,o.visible}function Hw(o){return o[Kn]||ju(o)}function Gw(o,e){o[zw]=e}function ju(o){return vn.isUsingInstancing(o)}function If(o,e){return za(o,e,!0,!0)}const qw=Symbol("isDestroyed");function Ur(o){return o[qw]}function Xw(o,e){o[qw]=e}const Lf=Symbol("isDontDestroy");function hl(o,e=!0){o[Lf]=e}const Bu=[],Fu=[];function Ui(o,e=!0,t=!1){Bu.length=0,Fu.length=0,Df(o,e,!0);for(const i of Bu)i.gameObject=null,i.context=null;for(const i of Fu)Xw(i,!0),t&&Me(i);Fu.length=0,Bu.length=0}function Df(o,e=!0,t=!0){if(o==null)return;const i=o;if(i.isComponent){if(i[Lf])return;Bu.push(i);const r=i.gameObject;i.__internalDisable(),i.__internalDestroy(),i.gameObject=r;return}if(o[Lf])return;const n=o;Du&&console.log(n),Fu.push(n);const s=n.userData?.components;if(s!=null&&Array.isArray(s)){let r=s.length;for(let a=0;a<s.length;a++){const l=s[a];Df(l,e,!1),s.length<r&&(r=s.length,a--)}}if(e&&n.children)for(const r of n.children)Df(r,e,!1);t&&n.removeFromParent()}function zr(o,e,t=!0){return Qw(o,e,t)}function*jf(o,e,t=!1,i=999,n=0){if(o?.userData.components&&!(n>i)){for(const s of o.userData.components)e&&s?.isComponent===!0&&s instanceof e?yield s:yield s;if(t===!0)for(const s of o.children)yield*jf(s,e,!0,i,n+1)}}function Qw(o,e,t,i=0){if(o){if(o.isObject3D,i>1e3){console.warn("Failed to iterate components: too many levels");return}if(o.userData?.components)for(let n=0;n<o.userData.components.length;n++){const s=o.userData.components[n];if(s?.isComponent===!0){const r=e(s);if(r!==void 0)return r}}if(t&&o.children){const n=i+1;for(let s=0;s<o.children.length;s++){const r=o.children[s];if(!r)continue;const a=Qw(r,e,t,n);if(a!==void 0)return a}}}}function Nr(o,e){if("isAssetReference"in o)return o.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new qn,t.position=e):t=e);let i=z.Current;t?.context&&(i=t.context),Du&&i.alias&&console.log("context",i.alias),t&&!t.idProvider&&(t.idProvider=new kt(Date.now()));const n=[],s={},r={},a=Yw(i,o,t,n,s,r);a&&(jE(a,s),DE(r,s)),Du&&(Jd(o,!0),Jd(a,!0));const l={};if(t?.components!==!1){for(const c in n){const h=n[c],d=h.guid;t&&t.idProvider&&(h.guid=t.idProvider.generateUUID(),l[d]=h.guid,Du&&console.log(h.name,h.guid)),ku(h,i),h.__internalNewInstanceCreated&&h.__internalNewInstanceCreated()}for(const c in n){const h=n[c];h.resolveGuids&&h.resolveGuids(l),h.enabled!==!1&&(h.enabled=!0)}Uu(i)}return a}function Yw(o,e,t,i,n,s){if(!e||e[Fi])return null;const r=e.userData;e.userData={};const a=e.children;e.children=[];const l=e.clone(!1);if(Lu(l),e.userData=r,e.children=a,n[e.uuid]={original:e,clone:l},Fr&&console.log("ADD",e,l),e.type==="SkinnedMesh"&&(s[e.uuid]={original:e,clone:l}),t?.visible!==void 0&&(l.visible=t.visible),t?.idProvider){l.uuid=t.idProvider.generateUUID();const h=l;h&&(h.guid=l.uuid)}e.animations&&e.animations.length>0&&(l.animations=[...e.animations]);const c=e.parent;if(c&&c.add(l),t?.position)if(Array.isArray(t.position)){const h=new b;h.fromArray(t.position),l.worldPosition=h}else l.worldPosition=t.position;else l.position.copy(e.position);if(t?.rotation){if(t.rotation instanceof N)l.worldQuaternion=t.rotation;else if(t.rotation instanceof ht)l.worldQuaternion=di().setFromEuler(t.rotation);else if(Array.isArray(t.rotation)){const h=new ht;h.fromArray(t.rotation),l.worldQuaternion=di().setFromEuler(h)}}else l.quaternion.copy(e.quaternion);if(t?.scale)if(Array.isArray(t.scale)){const h=new b;h.fromArray(t.scale),t.scale=h}else l.scale.copy(t.scale);else l.scale.copy(e.scale);if(t?.parent&&t.parent!=="scene"){let h=null;if(typeof t.parent=="string"?h=za(t.parent,o.scene,!0):h=t.parent,h){const d=t.keepWorldPosition===!0?h.attach:h.add;d?d.call(h,l):console.error("Invalid parent object",h,"received when instantiating:",e)}else console.warn("could not find parent:",t.parent)}for(const[h,d]of Object.entries(e.userData))h!=="components"&&(l.userData[h]=d);if(e.userData?.components){const h=e.userData.components,d=[];l.userData.components=d;for(let p=0;p<h.length;p++){const m=h[p],f=new m.constructor;LE(m,f),m[Ec]!==void 0&&(f[Ec]=m[Ec]),d.push(f),f.gameObject=l,i.push(f),n[m.guid]={original:m,clone:f},iu.dispatchComponentLifecycleEvent("component-added",f)}}t&&(t.position=void 0,t.rotation=void 0,t.scale=void 0,t.parent=void 0,t.visible=void 0);for(const h in e.children){const d=e.children[h],p=Yw(o,d,t,i,n,s);p&&(n[p.uuid]={original:d,clone:p},l.add(p))}return l}function LE(o,e,t){Ya(e,o,void 0,{})}function DE(o,e){for(const t in o){const i=o[t],n=i.original,s=n.skeleton,r=i.clone;if(!s){console.warn("Skinned mesh has no skeleton?",i);continue}const a=s.bones,l=r.skeleton.clone();r.skeleton=l,r.bindMatrix.clone().copy(n.bindMatrix),r.bindMatrixInverse.copy(n.bindMatrixInverse);const c=[];l.bones=c;for(let h=0;h<a.length;h++){const d=a[h],p=e[d.uuid].clone;c.push(p)}}for(const t in o){const i=o[t].clone;i.skeleton.update(),i.bind(i.skeleton,i.bindMatrix),i.updateMatrixWorld(!0)}}function jE(o,e){for(const t in e){const i=e[t].clone;if(i?.isObject3D&&i?.userData?.components)for(let n=0;n<i.userData.components.length;n++){const s=i.userData.components[n],r=Object.entries(s);for(const[a,l]of r)if(Array.isArray(l)){const c=[];s[a]=c;for(let h=0;h<l.length;h++){const d=l[h];if(typeof d!="object"){c.push(d);continue}const p=Zw(s,a,d,e);p!==void 0?(Fr&&console.log("Found new instance for",a,d,"->",p),c.push(p)):(Fr&&console.warn("Could not find new instance for",a,d),c.push(d))}}else if(typeof l=="object"){const c=Zw(s,a,l,e);c!==void 0?s[a]=c:Fr&&console.warn("Could not find new instance for",a,l)}}}}function Zw(o,e,t,i){if(t!=null)if(t.isComponent===!0){const n=t.gameObject;if(n){const s=n.uuid,r=i[s]?.clone;if(!r){Fr&&console.log("reference did not change",e,o,t);return}const a=n.userData.components.indexOf(t);if(a>=0&&r.isObject3D)return Fr&&console.log(e,s),r.userData.components[a];console.warn("could not find component",e,t)}}else if(t.isObject3D===!0){if(e==="gameObject")return;const n=t;if(n){const s=n.uuid,r=i[s]?.clone;if(r)return Fr&&console.log(e,"old",t,"new",r),r}}else{if(t.isVector4||t.isVector3||t.isVector2||t.isQuaternion||t.isEuler||t.isColor===!0)return t.clone();if(t.isEventList===!0)return t.__internalOnInstantiate(i)}}function Xc(o,e){try{e||o()}catch(t){return console.error(t),!1}return!0}const Bf=w("debugnewscripts"),BE=w("debughierarchy"),Ie=[];function FE(){return Ie.length>0}function Uu(o){if(Bf&&console.log("Register new components",o.new_scripts.length,[...o.new_scripts],o.alias?"element: "+o.alias:o.hash,o),o.new_scripts_pre_setup_callbacks.length>0){for(const e of o.new_scripts_pre_setup_callbacks)e&&e();o.new_scripts_pre_setup_callbacks.length=0}if(!(o.new_scripts.length<=0)){Ie.length=0,o.new_scripts.length>0&&Ie.push(...o.new_scripts),o.new_scripts.length=0;for(let e=0;e<Ie.length;e++)try{const t=Ie[e];if(t.isComponent!==!0){(A()||Bf)&&console.error(`Registered script is not a Needle Engine component.
|
|
883
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
884
|
+
`,t),Ie.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
|
|
885
|
+
Did you add and remove a component in the same frame?`),Ie.splice(e,1),e--;continue}t.context=o,Qc(t.gameObject),Ff(t,o)}catch(t){console.error(t),Vo(Ie[e],o),Ie.splice(e,1),e--}for(let e=0;e<Ie.length;e++)try{const t=Ie[e];if(t.destroyed){Vo(Ie[e],o),Ie.splice(e,1),e--;continue}if(t.registering)try{t.registering()}catch(i){console.error(i)}t.__internalAwake!==void 0&&(t.gameObject||console.error("Calling awake for a component without a GameObject",t,t.gameObject),Qc(t.gameObject),t.activeAndEnabled&&Xc(t.__internalAwake.bind(t)))}catch(t){console.error(t),Vo(Ie[e],o),Ie.splice(e,1),e--}for(let e=0;e<Ie.length;e++)try{const t=Ie[e];if(t.destroyed||t.enabled===!1||(Qc(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,Xc(t.__internalEnable.bind(t)))}catch(t){console.error(t),Vo(Ie[e],o),Ie.splice(e,1),e--}for(let e=0;e<Ie.length;e++)try{const t=Ie[e];if(t.destroyed||!t.gameObject)continue;o.new_script_start.push(t)}catch(t){console.error(t),Vo(Ie[e],o),Ie.splice(e,1),e--}Ie.length=0;for(const e of o.new_scripts_post_setup_callbacks)e&&e();o.new_scripts_post_setup_callbacks.length=0}}function UE(o){o&&(o.__internalDisable(!0),Vo(o,o.context))}function Kw(o,e){for(let t=0;t<o.new_script_start.length;t++)try{const i=o.new_script_start[t];if(e!==void 0&&i.gameObject!==e||i.destroyed||i.activeAndEnabled===!1)continue;Xc(i.__internalAwake.bind(i)),i.enabled&&(Xc(i.__internalEnable.bind(i)),Xc(i.__internalStart.bind(i)),o.new_script_start.splice(t,1),t--)}catch(i){console.error(i),Vo(o.new_script_start[t],o),o.new_script_start.splice(t,1),t--}}function Ff(o,e){e.scripts.indexOf(o)===-1&&(e.scripts.push(o),o.earlyUpdate&&e.scripts_earlyUpdate.push(o),o.update&&e.scripts_update.push(o),o.lateUpdate&&e.scripts_lateUpdate.push(o),o.onBeforeRender&&e.scripts_onBeforeRender.push(o),o.onAfterRender&&e.scripts_onAfterRender.push(o),o.onPausedChanged&&e.scripts_pausedChanged.push(o),Uf(o,null)&&e.new_scripts_xr.push(o),Uf(o,"immersive-vr")&&e.scripts_immersive_vr.push(o),Uf(o,"immersive-ar")&&e.scripts_immersive_ar.push(o))}function Vo(o,e){sn(o,e.new_scripts),sn(o,e.new_script_start),sn(o,e.scripts),sn(o,e.scripts_earlyUpdate),sn(o,e.scripts_update),sn(o,e.scripts_lateUpdate),sn(o,e.scripts_onBeforeRender),sn(o,e.scripts_onAfterRender),sn(o,e.scripts_pausedChanged),sn(o,e.new_scripts_xr),sn(o,e.scripts_immersive_vr),sn(o,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(o)}function sn(o,e){const t=e.indexOf(o);t>=0&&e.splice(t,1)}function Uf(o,e){if(o){const t=o;if(t.onBeforeXR||t.onEnterXR||t.onUpdateXR||t.onLeaveXR||t.onXRControllerAdded||t.onXRControllerRemoved)return!(e!=null&&t.supportsXR?.(e)===!1)}return!1}let zf=!0;function Nf(){zf=!0}function zu(o,e=!1){if(Tg.experimentalSmartHierarchyUpdate){if(!e&&!zf)return;zf=!1}if(o||(o=pe.Current.scene),!o){console.trace("Invalid call - no current context.");return}const t=cl(o);Wf(o,t,!0)||(Bf||A()?console.error(`Error updating hierarchy
|
|
886
|
+
Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,o):console.error('Failed to update active state in hierarchy of "'+o.name+'"',o),console.warn(" \u2191 this error might be caused by circular references. Please make sure you don't have files with circular references (e.g. one GLB 1 is loading GLB 2 which is then loading GLB 1 again)."))}function Wf(o,e,t,i=0){if(i>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const n=cl(o);if(e&&(e=n,e&&o.parent&&i===0)){const a=o.parent;e=a[Kn],e===void 0&&(a instanceof Ti||(e=!0))}const s=o[Kn]!==e;if(s){o[Kn]=e,BE&&console.warn("ACTIVE CHANGE",{name:o.name,activeSelf:n,visible:o.visible,activeInHierarchy:e,changed:s,go:o});{const a=o.userData?.components;if(a)for(let l=a.length-1,c=-1;l>c;l--){const h=a[l];if(e){if(h?.enabled){try{h.__internalAwake()}catch(d){console.error(d)}h.enabled&&h.__internalEnable()}}else h&&h.__didAwake&&h.enabled&&(h.__didEnable=!1,h.onDisable())}}}const r=o.children;if(r){if(!s&&!e){let l=!0;for(let c=0,h=r.length;c<h;c++){const d=r[c];d[Kn]!==!1&&Wf(d,!1,t,i+1)===!1&&(l=!1)}return l}let a=!0;for(let l=0,c=r.length;l<c;l++)Wf(r[l],e,t,i+1)===!1&&(a=!1);return a}return!0}function Qc(o){if(!o){console.error("GO is null");return}let e=!0,t=!1,i=o;for(;i;){if(i.type==="Scene"&&(t=!0),!cl(i)){e=!1;break}i=i.parent}o[Kn]=e&&t}const Nu=new Map,Jw=Symbol("prewarmFlag"),Vf=Symbol("waitingForPrewarm"),$f=w("debugprewarm");function zE(o,e){!o||o[Jw]===!0||o[Vf]===!0||(Nu.has(e)||Nu.set(e,[]),o[Vf]=!0,Nu.get(e).push(o),$f&&console.debug("register prewarm",o.name))}let ex=null,tx=null;function NE(o){if(!o)return;const e=Nu.get(o);if(!e?.length)return;const t=o.mainCamera;if(t){$f&&console.log("prewarm",e.length,"objects",[...e]);const i=o.renderer;if(i.compile){const n=o.scene;i.compile(n,t),ex??=new wC(64),tx??=new xC(.001,9999999,ex),tx.update(i,n);for(const s of e)s[Jw]=!0,s[Vf]=!1;e.length=0,$f&&console.log("prewarm done")}}}const WE="eff8ba80-635d-11ec-90d6-0242ac120003";function ix(o,e){const t=o.guid;if(t){const i=e[Lg]??e.constructor?.name??"Component",n=dl(o,e.constructor);let s=0;for(const a of n)a!==e&&s++;const r=`${t}:${i}:${s}`;return Km(r,WE)}return GE().generateUUID()}const VE=w("debuggetcomponent"),nx=()=>VE||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function $E(o){return o==null||o.isObject3D?o:o.object&&o.object.isObject3D?o.object:o}function Hf(o,e){if(!o||!o.userData.components)return e;const t=o.userData.components.indexOf(e);return t<0||(iu.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,o.userData.components.splice(t,1)),e}function Yc(o,e,t){return Vr(o,e)||oo(o,e,t)}let HE;function GE(){return HE??=new kt("addComponentIdProvider")}function Wr(o,e,t=!0){o.userData||(o.userData={}),o.userData.components||(o.userData.components=[]),o.userData.components.push(e),e.gameObject=o,(e.guid===void 0||e.guid==="invalid")&&(e.guid=ix(o,e)),Lu(o),ku(e,e.context);try{t&&e.__internalAwake&&(Qc(o),e.activeAndEnabled&&e.__internalAwake()),iu.dispatchComponentLifecycleEvent("component-added",e)}catch(i){console.error(i)}return e}function oo(o,e,t,i){if(typeof e=="function"){const n=new e;t&&n.__internalNewInstanceCreated(t);let s=!0;return i?.callAwake!=null&&(s=i.callAwake),Wr(o,n,s)}if(e.destroyed)return console.warn("Can not move/add a destroyed component",e),e;if(e.gameObject===o)return e;if(e.gameObject&&e.gameObject.userData?.components){const n=e.gameObject.userData.components.indexOf(e);e.gameObject.userData.components.splice(n,1)}if(o.userData||(o.userData={}),!o.userData.components)o.userData.components=[];else if(o.userData.components.includes(e))return e;return o.userData.components.push(e),e.gameObject=o,(e.guid===void 0||e.guid==="invalid")&&(e.guid=ix(o,e)),t&&e._internalInit(t),ku(e,e.context),e}function ox(o){if(o.gameObject&&o.gameObject.userData.components){const e=o.gameObject.userData.components.indexOf(o);o.gameObject.userData.components.splice(e,1)}o.__internalDisable&&o.__internalDisable(),Vo(o,o.context??z.Current),o.destroy(),o.gameObject=null}let sx=!1;function rx(o,e,t){if(o==null)return null;if(!o.isObject3D)return console.error("Object is not object3D"),null;if(!o?.userData?.components)return null;if(typeof e=="string"){const i=P.get(e);!sx&&!i&&(sx=!0,console.warn(`Accessing components by name is not supported.
|
|
887
|
+
Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
|
|
888
|
+
|
|
889
|
+
You can import other modules your main module to get access to types
|
|
890
|
+
or if you use npmdefs you can make types available globally using globalThis:
|
|
891
|
+
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e)),i&&(e=i)}if(nx()&&console.log("[onGetComponent] FIND",e),e==null)return null;for(let i=0;i<o.userData.components.length;i++){const n=o.userData.components[i];let s=Object.getPrototypeOf(n);for(;s;){if(s===e.prototype)if(nx()&&console.log("[onGetComponent] MATCH BY PROTOYPE",s),t)t.push(n);else return n;s=Object.getPrototypeOf(s)}}return t||null}function Vr(o,e){const t=rx(o,e);return t?Array.isArray(t)?t[0]:t:null}function dl(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),rx(o,e,t),t}function Zc(o,e,t=!1){if(t===!1&&o[Kn]===!1)return null;const i=Vr(o,e);if(t===!1&&(i?.enabled===!1||i?.activeAndEnabled===!1))return null;if(i)return i;for(let n=0;n<o?.children?.length;n++){const s=Zc(o.children[n],e,t);if(s)return s}return null}function ul(o,e,t,i=!0){t||(t=[]),i&&(t.length=0),dl(o,e,t,!1);for(let n=0;n<o?.children?.length;n++)ul(o.children[n],e,t,!1);return t}function Kc(o,e,t=!1){if(!o)return null;if(Array.isArray(o)){for(let n=0;n<o.length;n++){const s=$E(o[n]),r=Kc(s,e,t);if(r)return r}return null}return Vr(o,e)||(o.parent?Kc(o.parent,e,t):null)}function Wu(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),o?(dl(o,e,t,!1),o.parent?Wu(o.parent,e,t,!1):t):t}function pl(o,e=void 0,t=!0){if(!o)return null;if(!e&&(e=z.Current,!e))return console.error("Can not search object without any needle context or scene!!!"),null;let i=e;return i.isScene||(i=e?.scene),i&&Zc(i,o,t)||null}function ax(o,e,t=void 0){if(!o)return e??[];if(e||(e=[]),e.length=0,!t&&(t=z.Current,!t))return console.error("Can not search object without any needle context or scene!!!"),e;"scene"in t&&(t=t.scene);const i=t;return i&&ul(i,o,e,!1),e}const As=w("debughotreload");let Jc=!1;const eh=new Map;function qE(){return Jc}function Gf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function lx(o){if(Jc){As&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}As&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;eh.has(e)?eh.get(e)?.push(o):eh.set(e,[o])}function cx(o){if(Jc){As&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}As&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=eh.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let hx=!1;function XE(){if(As||hx)return;hx=!0;const o=console.error;console.error=(...e)=>{if(e.length){const t=e[0];if(typeof t=="string"&&t.includes("[hmr] Failed to reload ")){console.log("[Needle Engine] Hot reloading failed"),window.location.reload();return}}o.apply(console,e)}}function QE(o){As&&console.log("[HMR] Apply changes",o,Object.keys(o)),XE();for(const e of Object.keys(o))try{Jc=!0;const t=P.get(e);if(!t){As&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=eh.get(i.name);let s="[Needle Engine] Updating type: "+e;const r=n?.length??-1;r>0?s+=" x"+r:s+=" (No instances registered)",console.log(s);const a=Object.getOwnPropertyNames(t.prototype),l=Object.getOwnPropertyDescriptors(i.prototype);for(const c in l)l[c].writable&&(t.prototype[c]=o[e].prototype[c]);for(const c of a)l[c]||delete t.prototype[c];if(n){const c=new i,h=Object.getOwnPropertyDescriptors(c);for(const d of n){const p=d,m=p.isComponent===!0,f=m?p.activeAndEnabled:!0,g=m?p.context:void 0;try{if(m&&g&&Vo(p,g),m&&f&&(p.enabled=!1),d.onBeforeHotReloadFields&&d.onBeforeHotReloadFields()===!1)continue;for(const y in h)if(h[y].writable){if(d[y]===void 0)d[y]=c[y];else if(typeof d[y]=="function"&&!d[y].prototype){const _=d[y],v=_.name,C="bound ";if(v===C)continue;const O=_.name.substring(C.length),k=i.prototype[O];k&&(d[y]=k.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{m&&g&&Ff(p,g),m&&f&&(p.enabled=!0)}}}}catch(t){if(As)console.error(t);else return!1}finally{Jc=!1,Cr(Bi.Log,"Script changes applied (HMR)")}return!0}class x extends M{guid;static isDestroyed(e){return Ur(e)}static setActive(e,t,i=!0){e&&(qc(e,t),zu(e),t&&i&&Kw(z.Current,e))}static isActiveSelf(e){return cl(e)}static isActiveInHierarchy(e){return Hw(e)}static markAsInstancedRendered(e,t){Gw(e,t)}static isUsingInstancing(e){return ju(e)}static foreachComponent(e,t,i=!0){return zr(e,t,i)}static instantiateSynced(e,t){return e?Hg(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Nr(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??z.Current,Ac(n,t.connection,i)}static destroy(e,t=!0){return Ui(e,t)}static add(e,t,i){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}i||(i=z.Current),t.add(e),qc(e,!0),zu(e),i?x.foreachComponent(e,n=>{Ff(n,i),!n.__internalDidAwakeAndStart&&i.new_script_start.includes(n)===!1&&i.new_script_start.push(n)},!0):console.warn("Missing context")}}static remove(e){e&&(e.parent?.remove(e),qc(e,!1),zu(e),x.foreachComponent(e,t=>{UE(t)},!0))}static invokeOnChildren(e,t,...i){this.invoke(e,t,!0,i)}static invoke(e,t,i=!1,...n){e&&this.foreachComponent(e,s=>{const r=s[t];r&&typeof r=="function"&&r?.call(s,...n)},i)}static addNewComponent(e,t,i,n=!0){return oo(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return oo(e,t,i,n)}static moveComponent(e,t){return oo(e,t)}static removeComponent(e){return Hf(e.gameObject,e),e}static getOrAddComponent(e,t){return Yc(e,t)}static getComponent(e,t){return e===null?null:Vr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:dl(e,t,i)}static findByGuid(e,t){return If(e,t)}static findObjectOfType(e,t,i=!0){return pl(e,t??z.Current,i)}static findObjectsOfType(e,t){const i=[];return ax(e,i,t),i}static getComponentInChildren(e,t,i=!1){return Zc(e,t,i)}static getComponentsInChildren(e,t,i=null){return ul(e,t,i??void 0)}static getComponentInParent(e,t){return Kc(e,t)}static getComponentsInParent(e,t,i=null){return Wu(e,t,i)}static getAllComponents(e){const t=e.userData?.components;return t?[...t]:[]}static*iterateComponents(e){const t=e?.userData?.components;if(t&&Array.isArray(t))for(let i=0;i<t.length;i++)yield t[i]}}class E{get isComponent(){return!0}get[Lg](){return P.getKey(this.constructor)||void 0}__context;get context(){return this.__context??z.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){return this.gameObject?.userData?.layer}get name(){return this.gameObject?.name?this.gameObject.name:this.gameObject?.userData.name}__name;set name(e){this.gameObject?(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.name=e,this.__name=e):this.__name=e}get tag(){return this.gameObject?.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){return this.gameObject?.userData.static}set static(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.static=e)}get activeAndEnabled(){return!(this.destroyed||this.__isEnabled===!1||!this.__isActiveInHierarchy)}get __isActive(){return this.gameObject.visible}get __isActiveInHierarchy(){if(!this.gameObject)return!1;const e=this.gameObject[Kn];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[Kn]=e)}gameObject;guid="invalid";sourceId;awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=xe.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=xe.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}__didAwake=!1;__didStart=!1;__didEnable=!1;__isEnabled=void 0;__destroyed=!1;get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}constructor(e){this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),Gf()&&lx(this)}__internalNewInstanceCreated(e){return this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),this}_internalInit(e){if(typeof e=="object")for(const t of Object.keys(e)){const i=e[t];typeof i!="function"&&(this[t]=i)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(A()&&console.warn("[Needle Engine Dev] Trying to enable destroyed component"),!1):this.__didAwake?this.__didEnable?(e!==!0&&(this.__isEnabled=!0),!1):(this.__didEnable=!0,this.__isEnabled=!0,this.onEnable(),!0):!1}__internalDisable(e){if(this.__didAwake){if(!this.__didEnable){e!==!0&&(this.__isEnabled=!1);return}this.__didEnable=!1,this.__isEnabled=!1,this.onDisable()}}__internalDestroy(){this.__destroyed||(this.__destroyed=!0,this.__didAwake&&(this.onDestroy?.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),ox(this),Gf()&&cx(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){A()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return ee(this.gameObject)}set worldPosition(e){bt(this.gameObject,e)}setWorldPosition(e,t,i){Pr(this.gameObject,e,t,i)}get worldQuaternion(){return _e(this.gameObject)}set worldQuaternion(e){kn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){Sg(this.gameObject,e,t,i,n)}get worldEuler(){return Cg(this.gameObject)}set worldEuler(e){Pg(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,i,n=!0){Sc(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return E._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return E._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return E._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}_eventListeners=new Map;addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let i=0;i<t.length;i++)t[i](e);return!1}}const YE=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:E,Component:E,GameObject:x},Symbol.toStringTag,{value:"Module"}));var ZE=Object.defineProperty,KE=Object.getOwnPropertyDescriptor,$r=(o,e,t,i)=>{for(var n=i>1?void 0:i?KE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&ZE(e,t,n),n};const Is=w("debuganimation");let dx=class{x;y};class Vt extends E{get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.includes(e)||this.animations.push(e)}playAutomatically=!0;randomStartTime=!1;minMaxSpeed;minMaxOffsetNormalized;loop=!0;clampWhenFinished=!1;get time(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.time}return 0}set time(e){if(this.actions)for(const t of this.actions)t.time=e}get duration(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.getClip().duration}return 0}_tempAnimationClipBeforeGameObjectExisted=null;get clip(){return this.animations?.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){Is&&console.warn("Assign clip during serialization",e),this._tempAnimationClipBeforeGameObjectExisted=e;return}e&&(this.gameObject.animations||(this.gameObject.animations=[]),!this.animations.includes(e)&&(this.animations.length>0?this.animations.splice(0,0,e):this.animations.push(e)))}set clips(e){this.animations=e}_tempAnimationsArray;set animations(e){e==null||!Array.isArray(e)||(this.gameObject?this.gameObject.animations=e:this._tempAnimationsArray=e)}get animations(){return this.gameObject?.animations||this._tempAnimationsArray||[]}mixer=void 0;get actions(){return this._actions}set actions(e){this._actions=e}_actions;_handles;awake(){this.mixer=void 0,Is&&console.log("Animation Awake",this.name,this),this._tempAnimationsArray&&(this.animations=this._tempAnimationsArray,this._tempAnimationsArray=void 0),this._tempAnimationClipBeforeGameObjectExisted&&(this.clip=this._tempAnimationClipBeforeGameObjectExisted,this._tempAnimationClipBeforeGameObjectExisted=null),this.actions=[],this._handles=[]}onEnable(){if(this.playAutomatically&&this.animations?.length>0){const e=Math.floor(Math.random()*this.animations.length),t=this.animations[e];this.play(e,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*t.duration:0,loop:this.loop,clampWhenFinished:this.clampWhenFinished})}}update(){this.mixer&&(this.mixer.update(this.context.time.deltaTime),this._handles.forEach(e=>e.update()))}onDisable(){this.mixer&&this.mixer.stopAllAction()}onDestroy(){this.context.animations.unregisterAnimationMixer(this.mixer)}getAction(e){return this.actions?.find(t=>t.getClip().name===e)||null}get isPlaying(){if(this.actions){for(let e=0;e<this.actions.length;e++)if(this.actions[e].isRunning())return!0}return!1}stopAll(e){if(this.actions)for(const t of this.actions)e?.fadeDuration?t.fadeOut(e.fadeDuration):t.stop()}stop(e,t){if(e===void 0){this.stopAll();return}else if(typeof e=="number"){if(e>=this.animations.length){Is&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}t?.fadeDuration?i.fadeOut(t.fadeDuration):i.stop()}pause(e,t=!1){if(e===void 0){for(const n of this.actions)n.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){Is&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}i.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(Is&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){Is&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){Is&&console.log("No animation at index",e);return}i=this.animations[e]}else typeof e=="string"&&(i=this.animations.find(s=>s.name===e));if(!i){console.error("Could not find clip",e);return}t||(t={});for(const s of this.actions)if(s.getClip()===i)return this.internalOnPlay(s,t);if(!i.tracks){console.warn("Clip is no AnimationClip",i);return}const n=this.mixer.clipAction(i);return this.actions.push(n),this.internalOnPlay(n,t)}internalOnPlay(e,t){var i=this.actions.find(s=>s===e);if(i===e&&i.isRunning()&&i.time<i.getClip().duration){const s=this.tryFindHandle(e);if(i.paused&&(i.paused=!1),s)return s.waitForFinish()}if(t.loop===void 0&&(t.loop=this.loop),t.clampWhenFinished===void 0&&(t.clampWhenFinished=this.clampWhenFinished),t.minMaxOffsetNormalized===void 0&&this.randomStartTime&&(t.minMaxOffsetNormalized=this.minMaxOffsetNormalized),t.minMaxSpeed===void 0&&(t.minMaxSpeed=this.minMaxSpeed),t?.exclusive??!0)for(const s of this.actions)s!=i&&(t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop());if(t?.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t?.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const s=e.getClip();e.time=D.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*s.duration}else e.time>=e.getClip().duration&&(e.time=0);t?.minMaxSpeed?e.timeScale=D.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?SC:Wm:e.loop=Wm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),window.requestAnimationFrame(()=>mi.testIfRootCanAnimate(e)),Is&&console.log("PLAY",e.getClip().name,e);const n=new JE(e,this.mixer,t,s=>{this._handles.splice(this._handles.indexOf(n),1)});return this._handles.push(n),n.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new Vm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}$r([u()],Vt.prototype,"playAutomatically",2),$r([u()],Vt.prototype,"randomStartTime",2),$r([u(dx)],Vt.prototype,"minMaxSpeed",2),$r([u(dx)],Vt.prototype,"minMaxOffsetNormalized",2),$r([u()],Vt.prototype,"loop",2),$r([u()],Vt.prototype,"clampWhenFinished",2),$r([u(Ai)],Vt.prototype,"clips",1);class JE{mixer;action;promise=null;_options;_resolveCallback=null;_resolvedOrRejectedCallback;constructor(e,t,i,n){this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=n,this._options=i}waitForFinish(){return this.promise?this.promise:(this.promise=new Promise(e=>{this._resolveCallback=e}),this.mixer.addEventListener("finished",this.onFinished),this.promise)}update(){this._options&&this._options.endTime!==void 0&&this.action.time>this._options.endTime&&(this._options.loop===!0?this.action.time=this._options.startTime??0:(this.action.time=this._options.endTime,this.action.timeScale=0,this.onResolve()))}onResolve(){this.dispose(),this._resolvedOrRejectedCallback?.call(this,this),this._resolveCallback?.call(this,this.action)}onFinished=e=>{e.action===this.action&&this.onResolve()};dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}function ux(o,e,t){return mi.setObjectAnimated(o,e,t)}function eR(o){return mi.getObjectAnimated(o)||!1}class tR{_context;get context(){return this._context??z.Current}get isStateMachineBehaviour(){return!0}}class th{name;nameHash;normalizedTime;length;speed;action;hasTransitions;constructor(e,t,i,n){this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=i,this.speed=n,this.action=e.motion.action||null,this.hasTransitions=e.transitions?.length>0||!1}}function px(o,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??Lo.generateUUID(),index:-1,clip:new Ai(o,0,[])}}var _i=(o=>(o[o.If=1]="If",o[o.IfNot=2]="IfNot",o[o.Greater=3]="Greater",o[o.Less=4]="Less",o[o.Equals=6]="Equals",o[o.NotEqual=7]="NotEqual",o))(_i||{}),Hr=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(Hr||{});const dt=w("debuganimatorcontroller"),Vu=w("debugrootmotion");function iR(o){switch(o){case"if":return _i.If;case"ifNot":return _i.IfNot;case"greater":return _i.Greater;case"less":return _i.Less;case"equals":return _i.Equals;case"notEqual":return _i.NotEqual}}class mx{_name;_parameters=[];_states=[];_anyStateTransitions=[];_defaultStateName=null;_lastTransition=null;constructor(e){this._name=e??"AnimatorController"}floatParameter(e,t=0){return this._parameters.push({name:e,hash:this._parameters.length,type:Hr.Float,value:t}),this}intParameter(e,t=0){return this._parameters.push({name:e,hash:this._parameters.length,type:Hr.Int,value:t}),this}boolParameter(e,t=!1){return this._parameters.push({name:e,hash:this._parameters.length,type:Hr.Bool,value:t}),this}triggerParameter(e){return this._parameters.push({name:e,hash:this._parameters.length,type:Hr.Trigger,value:!1}),this}state(e,t){return this._states.push({name:e,options:t,transitions:[]}),this}transition(e,t,i){const n={to:t,options:i??{},conditions:[]};if(e==="*")this._anyStateTransitions.push(n);else{const s=this._states.find(r=>r.name===e);if(!s)throw new Error(`AnimatorControllerBuilder: source state "${e}" not found. Add it with .state() first.`);s.transitions.push(n)}return this._lastTransition=n,this}condition(e,t,i=0){if(!this._lastTransition)throw new Error("AnimatorControllerBuilder: .condition() must be called after .transition()");return this._lastTransition.conditions.push({parameter:e,mode:t,threshold:i}),this}defaultState(e){return this._defaultStateName=e,this}build(){const e=new Map;this._states.forEach((r,a)=>e.set(r.name,a));let t=0;if(this._defaultStateName!==null){const r=e.get(this._defaultStateName);if(r===void 0)throw new Error(`AnimatorControllerBuilder: default state "${this._defaultStateName}" not found`);t=r}const i=r=>{const a=e.get(r.to);if(a===void 0)throw new Error(`AnimatorControllerBuilder: transition target "${r.to}" not found`);return{exitTime:r.options.exitTime??1,hasExitTime:r.options.hasExitTime??!1,duration:r.options.duration??0,offset:r.options.offset??0,hasFixedDuration:r.options.hasFixedDuration??!1,destinationState:a,conditions:r.conditions.map(l=>({parameter:l.parameter,mode:iR(l.mode),threshold:l.threshold}))}},n=this._states.map((r,a)=>{const l=r.transitions.map(i);for(const c of this._anyStateTransitions)e.get(c.to)!==a&&l.push(i(c));return{name:r.name,hash:a,motion:{name:r.options.clip.name,clip:r.options.clip,isLooping:r.options.loop??!1},transitions:l,behaviours:[],speed:r.options.speed,speedParameter:r.options.speedParameter,cycleOffset:r.options.cycleOffset,cycleOffsetParameter:r.options.cycleOffsetParameter}}),s={name:this._name,guid:new kt(Date.now()).generateUUID(),parameters:this._parameters,layers:[{name:"Base Layer",stateMachine:{defaultState:t,states:n}}]};return new Zi(s)}}class Zi{static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=[];if(t.autoTransition!==!1){const c=t.transitionDuration??0,h=c/r.duration;let d=s;(t.autoTransition===void 0||t.autoTransition===!0)&&(d=(s+1)%e.length),a.push({exitTime:1-h,offset:0,duration:c,hasExitTime:!0,destinationState:d,conditions:[]})}const l={name:r.name,hash:s,motion:{name:r.name,clip:r,isLooping:t?.looping??!1},transitions:a,behaviours:[]};i.push(l)}const n={name:"AnimatorController",guid:new kt(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new Zi(n)}static build(e){return new mx(e)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const s=this.model.layers[t].stateMachine;for(const r of s.states)if(r.name===e||r.hash===e){dt&&console.log("transition to ",r),this.transitionTo(r,n,i);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getBool(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}setFloat(e,t){const i=typeof e=="string"?"name":"hash",n=this.model?.parameters?.filter(s=>s[i]===e);return n.forEach(s=>s.value=t),n?.length>0}getFloat(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setInteger(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getInteger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setTrigger(e){dt&&console.log("SET TRIGGER",e);const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!0)}resetTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!1)}getTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}_speed=1;FindState(e){return this.findState(e)}findState(e){if(!e)return null;if(Array.isArray(this.model.layers)){for(const t of this.model.layers)for(const i of t.stateMachine.states)if(i.name===e||i.hash==e)return i}return null}getCurrentStateInfo(){if(!this._activeState)return null;const e=this._activeState.motion.action;if(!e)return null;const t=this._activeState.motion.clip.duration,i=t<=0?0:Math.abs(e.time/t);return new th(this._activeState,i,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}normalizedStartOffset=0;animator;model;get context(){return this.animator?.context}get mixer(){return this._mixer}dispose(){if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const e of this._activeStates)e.motion.clip&&this.mixer.uncacheAction(e.motion.clip,this.animator.gameObject)}this.context?.animations.unregisterAnimationMixer(this._mixer)}bind(e){e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),this.context?.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new Vm(this.animator.gameObject),this.context?.animations.registerAnimationMixer(this._mixer),this.createActions(this.animator)):console.error("AnimatorController.bind: animator is null")}clone(){if(typeof this.model=="string")return console.warn("AnimatorController has not been resolved, can not create model from string",this.model),null;dt&&console.warn("AnimatorController clone()",this.model);const e=vc(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||F_(n)||n.tracks!==void 0||n instanceof Zi));return console.assert(e!==this.model),new Zi(e)}update(e){if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const t=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&this.rootMotionHandler?.onBeforeUpdate(e),this._mixer.update(t),this.animator.applyRootMotion&&this.rootMotionHandler?.onAfterUpdate(e)}_mixer;_activeState;get activeState(){return this._activeState}constructor(e){this.model=e,dt&&console.log(this)}_activeStates=[];updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const i=this._activeStates[t],n=i.motion;if(!n.action)this._activeStates.splice(t,1),t--;else{const s=n.action;s.weight=e,s.getEffectiveWeight()<=0&&!s.isRunning()&&(dt&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(dt||A())&&console.warn("Multiple layers are not supported yet "+this.animator?.name);for(const e of this.model.layers){const t=e.stateMachine;t.defaultState===void 0&&(dt&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",e),t.defaultState=0);const i=t.states[t.defaultState];this.transitionTo(i,0,this.normalizedStartOffset);break}}evaluateTransitions(){let e=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;e=!0}const t=this._activeState,i=t.motion.action;for(const s of t.transitions){if(!s.hasExitTime&&s.conditions.length<=0)continue;let r=!0;for(const a of s.conditions)if(!this.evaluateCondition(a)){r=!1;break}if(r)if(i){const a=t.motion.clip.duration,l=a<=0?1:Math.abs(i.time/a);let c=s.exitTime;i.timeScale<0&&(c=1-c);let h=!1;if(s.hasExitTime?i.timeScale>0?h=l>=s.exitTime:i.timeScale<0&&(h=1-l>=s.exitTime):h=!0,h){for(const d of s.conditions){const p=this.model.parameters.find(m=>m.name===d.parameter);p?.type===Hr.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,dt){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
|
|
892
|
+
Timescale: `+i.timeScale,`
|
|
893
|
+
Normalized time: `+l.toFixed(3),`
|
|
894
|
+
Exit Time: `+c,s.hasExitTime)}this.transitionTo(s.destinationState,s.duration,s.offset);return}}else{this.transitionTo(s.destinationState,s.duration,s.offset);return}}i&&this.setTimescale(i,t);let n=!1;if(t.motion.isLooping&&i&&(i.time>=i.getClip().duration?(n=!0,i.reset(),i.time=0,i.play()):i.time<=0&&i.timeScale<0&&(n=!0,i.reset(),i.time=i.getClip().duration,i.play())),!n&&t&&!e&&i&&this.animator&&t.behaviours){const s=i?.getClip().duration,r=i.time/s,a=new th(this._activeState,r,s,this._speed);for(const l of t.behaviours)l.instance&&l.instance.onStateUpdate?.call(l.instance,this.animator,a,0)}}setTimescale(e,t){let i=t.speed??1;t.speedParameter&&(i*=this.getFloat(t.speedParameter)),i!==void 0&&(e.timeScale=i*this._speed)}getState(e,t){return typeof e=="number"&&(e==-1&&(e=this.model.layers[t].stateMachine.defaultState,e===void 0&&(dt&&console.warn("AnimatorController default state is undefined: ",this.model,"Layer: "+t),e=0)),e=this.model.layers[t].stateMachine.states[e]),e}_heldActions=[];releaseHeldActions(e){for(const t of this._heldActions)t.fadeOut(e);this._heldActions.length=0}transitionTo(e,t,i){if(!this.animator)return;const n=0;if(e=this.getState(e,n),!e?.motion||!e.motion.clip||!(e.motion.clip instanceof Ai))return;const s=this._activeState===e;if(s){const h=e.motion;if(!h.action_loopback&&h.clip){const d=this.rootMotionHandler?this.animator.gameObject.matrix.clone():null;this._mixer.uncacheAction(h.clip,this.animator.gameObject),d&&d.decompose(this.animator.gameObject.position,this.animator.gameObject.quaternion,this.animator.gameObject.scale),h.action_loopback=this.createAction(h.clip)}}if(this._activeState?.behaviours&&this._activeState.motion.action){const h=this._activeState?.motion.clip.duration,d=this._activeState.motion.action.time/h,p=new th(this._activeState,d,h,this._speed);for(const m of this._activeState.behaviours)m.instance?.onStateExit?.call(m.instance,this.animator,p,n)}const r=this._activeState?.motion.action;s&&(e.motion.action=e.motion.action_loopback,e.motion.action_loopback=r);const a=this._activeState;this._activeState=e;const l=e.motion?.action,c=e.motion.clip;if(c?.duration<=0&&c.tracks.length<=0?r&&this._heldActions.push(r):r&&(r.fadeOut(t),this.releaseHeldActions(t)),l){if(i=Math.max(0,Math.min(1,i)),e.cycleOffsetParameter){let d=this.getFloat(e.cycleOffsetParameter);typeof d=="number"?(d<0&&(d+=1),i+=d,i%=1):dt&&console.warn("AnimatorController cycle offset parameter is not a number",e.cycleOffsetParameter)}else typeof e.cycleOffset=="number"&&(i+=e.cycleOffset,i%=1);l.isRunning()&&l.stop(),l.reset(),l.enabled=!0,this.setTimescale(l,e);const h=e.motion.clip.duration;if(l.time=s?0:i*h,l.timeScale<0&&(l.time=h-l.time),l.clampWhenFinished=!0,l.setLoop(Wm,0),t>0?l.fadeIn(t):l.weight=1,l.play(),window.requestAnimationFrame(()=>mi.testIfRootCanAnimate(l)),this.rootMotionHandler&&this.rootMotionHandler.onStart(l),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const d=new th(e,i,h,this._speed);for(const p of this._activeState.behaviours)p.instance?.onStateEnter?.call(p.instance,this.animator,d,n)}}else dt&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));dt&&console.log("TRANSITION FROM "+a?.name+" TO "+e.name,t,r,l,l?.getEffectiveTimeScale(),l?.getEffectiveWeight(),l?.isRunning(),l?.isScheduled(),l?.paused)}createAction(e){if(this._mixer.existingAction(e)&&this._mixer.uncacheAction(e,this.animator?.gameObject),this.animator?.applyRootMotion){this.rootMotionHandler||(this.rootMotionHandler=new nR(this));const t=this.animator.gameObject;return this.rootMotionHandler.createClip(this._mixer,t,e)}else return this._mixer.clipAction(e)}evaluateCondition(e){const t=this.model.parameters.find(i=>i.name===e.parameter);if(!t)return!1;switch(e.mode){case _i.If:return t.value===!0;case _i.IfNot:return t.value===!1;case _i.Greater:return t.value>e.threshold;case _i.Less:return t.value<e.threshold;case _i.Equals:return t.value===e.threshold;case _i.NotEqual:return t.value!==e.threshold}return!1}createActions(e){dt&&console.log("AnimatorController createActions",this.model);for(const t of this.model.layers){const i=t.stateMachine;for(let n=0;n<i.states.length;n++){const s=i.states[n];s.transitions||(s.transitions=[]);for(const r of s.transitions)r.conditions||(r.conditions=[]);if(s.motion||(dt&&console.warn("No motion",s),s.motion=px(s.name)),this.animator&&s.motion.clips){const r=s.motion.clips?.find(a=>a.node.name===this.animator?.gameObject?.name);r?s.motion.clip=r.clip:(dt||A())&&console.warn('Could not find clip for animator "'+this.animator?.gameObject?.name+'"',s.motion.clips.map(a=>a.node.name))}if(!s.motion.clip){dt&&console.warn("No clip assigned to state",s);const r=new Ai(void 0,void 0,[]);s.motion.clip=r}if(s.motion?.clip){const r=s.motion.clip;if(r instanceof Ai){const a=this.createAction(r);s.motion.action=a}else(dt||A())&&console.warn("No valid animationclip assigned",s)}if(s.behaviours&&Array.isArray(s.behaviours))for(const r of s.behaviours){if(!r?.typeName)continue;const a=P.get(r.typeName);if(a){const l=new a;l.isStateMachineBehaviour&&(l._context=this.context??void 0,Ya(l,r.properties),r.instance=l),dt&&console.log("Created animator controller behaviour",s.name,r.typeName,r.properties,l)}else(dt||A())&&console.warn("Could not find AnimatorBehaviour type: "+r.typeName)}}}}*enumerateActions(){if(this.model.layers)for(const e of this.model.layers){const t=e.stateMachine;for(let i=0;i<t.states.length;i++){const n=t.states[i];n?.motion&&(n.motion.action&&(yield n.motion.action),n.motion.action_loopback&&(yield n.motion.action_loopback))}}}rootMotionHandler}class gx{track;createdInterpolant;originalEvaluate;customEvaluate;constructor(e,t){this.track=e;const i=e,n=i.createInterpolant.bind(e);i.createInterpolant=()=>(i.createInterpolant=n,this.createdInterpolant=n(),this.originalEvaluate=this.createdInterpolant.evaluate.bind(this.createdInterpolant),this.customEvaluate=s=>{if(!this.originalEvaluate)return;const r=this.originalEvaluate(s);return t(s,r)},this.createdInterpolant.evaluate=this.customEvaluate,this.createdInterpolant)}dispose(){this.createdInterpolant&&this.originalEvaluate&&(this.createdInterpolant.evaluate=this.originalEvaluate),this.track=void 0,this.createdInterpolant=null,this.originalEvaluate=void 0,this.customEvaluate=void 0}}class ft{static lastObjPosition={};static lastObjRotation={};static firstKeyframeRotation={};static spaceRotation={};static effectiveSpaceRotation={};static clipOffsetRotation={};set action(e){this._action=e}get action(){return this._action}get cacheId(){return this.root.uuid}_action;root;clip;positionWrapper=null;rotationWrapper=null;context;positionChange=new b;rotationChange=new N;constructor(e,t,i,n,s){if(this.context=e,this.root=t,this.clip=i,ft.firstKeyframeRotation[this.cacheId]||(ft.firstKeyframeRotation[this.cacheId]=new N),s){const r=s.values;ft.firstKeyframeRotation[this.cacheId].set(r[0],r[1],r[2],r[3])}ft.spaceRotation[this.cacheId]||(ft.spaceRotation[this.cacheId]=new N),ft.effectiveSpaceRotation[this.cacheId]||(ft.effectiveSpaceRotation[this.cacheId]=new N),ft.clipOffsetRotation[this.cacheId]=new N,s&&ft.clipOffsetRotation[this.cacheId].set(s.values[0],s.values[1],s.values[2],s.values[3]).invert(),this.handlePosition(i,n),this.handleRotation(i,s)}onStart(e){if(e.getClip()!==this.clip)return;ft.lastObjRotation[this.cacheId]||(ft.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=ft.lastObjRotation[this.cacheId];if(ft.spaceRotation[this.cacheId].copy(t),Vu){const i=new ht().setFromQuaternion(t);console.log("START",this.clip.name,D.toDegrees(i.y),this.root.position.z)}}getClipRotationOffset(){return ft.clipOffsetRotation[this.cacheId]}_prevTime=0;handlePosition(e,t){if(t){const i=this.root;Vu&&i.add(new Li),ft.lastObjPosition[this.cacheId]||(ft.lastObjPosition[this.cacheId]=this.root.position.clone());const n=new b,s=new b;this.positionWrapper=new gx(t,(r,a)=>{const l=this.action.getEffectiveWeight();return Vu&&i.position.length()>8&&i.position.set(0,i.position.y,0),r>this._prevTime&&(n.set(a[0],a[1],a[2]),n.sub(s),n.multiplyScalar(l),n.applyQuaternion(this.getClipRotationOffset()),n.applyQuaternion(i.quaternion),this.positionChange.copy(n)),s.fromArray(a),this._prevTime=r,a[0]=0,a[1]=0,a[2]=0,a})}}static identityQuaternion=new N;handleRotation(e,t){if(t){if(Vu){const r=t.values,a=new ht().setFromQuaternion(new N(r[0],r[1],r[2],r[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",D.toDegrees(a.y));const l=t.values.length-4,c=new N().set(r[l],r[l+1],r[l+2],r[l+3]),h=new ht().setFromQuaternion(c);console.log(e.name,t.name,"LAST ROTATION IN TRACK",D.toDegrees(h.y))}let i=0;const n=new N,s=new N;this.rotationWrapper=new gx(t,(r,a)=>(r>i&&(s.set(a[0],a[1],a[2],a[3]),n.invert(),s.multiply(n),this.rotationChange.copy(s)),n.fromArray(a),i=r,a[0]=0,a[1]=0,a[2]=0,a[3]=1,a))}}onBeforeUpdate(e){this.positionChange.set(0,0,0),this.rotationChange.set(0,0,0,1)}onAfterUpdate(e){return!this.action||(e*=this.action.getEffectiveWeight(),e<=0)?!1:(this.positionChange.multiplyScalar(e),this.rotationChange.slerp(ft.identityQuaternion,1-e),!0)}}class nR{controller;handler=[];root;basePosition=new b;baseQuaternion=new N;baseRotation=new ht;constructor(e){this.controller=e}createClip(e,t,i){this.root=t,t&&"name"in t&&t.name;const n=this.findRootTrack(i,".position"),s=this.findRootTrack(i,".quaternion"),r=new ft(this.controller.context,t,i,n,s);this.handler.push(r);const a=e.clipAction(i);return r.action=a,a}onStart(e){for(const t of this.handler)t.onStart(e)}onBeforeUpdate(e){this.basePosition.copy(this.root.position),this.baseQuaternion.copy(this.root.quaternion);for(const t of this.handler)t.onBeforeUpdate(e)}summedPosition=new b;summedRotation=new N;onAfterUpdate(e){if(!(e<=0)){this.root.position.copy(this.basePosition),this.root.quaternion.copy(this.baseQuaternion),this.summedPosition.set(0,0,0),this.summedRotation.set(0,0,0,1);for(const t of this.handler)t.onAfterUpdate(e)&&(this.summedPosition.add(t.positionChange),this.summedRotation.multiply(t.rotationChange));this.root.position.add(this.summedPosition),this.root.quaternion.multiply(this.summedRotation)}}findRootTrack(e,t){const i=e.tracks;if(!i)return null;for(const n of i)if(n.name.endsWith(t))return n;return null}}class oR extends en{onSerialize(e,t){}onDeserialize(e,t){if(t.type===Zi&&e?.__type==="AnimatorController")return new Zi(e)}}new oR(Zi);var sR=Object.defineProperty,rR=Object.getOwnPropertyDescriptor,$u=(o,e,t,i)=>{for(var n=i>1?void 0:i?rR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&sR(e,t,n),n};const rn=w("debuganimator");class wt extends E{get isAnimationComponent(){return!0}applyRootMotion=!1;hasRootMotion=!1;keepAnimatorControllerStateOnDisable=!1;set runtimeAnimatorController(e){this._animatorController&&this._animatorController.model===e||(e?e instanceof Zi?(e.animator&&e.animator!==this&&(console.warn("AnimatorController can not be bound to multiple animators",e.model?.name),e.model||console.error("AnimatorController has no model"),e=new Zi(e.model)),this._animatorController=e,this._animatorController.bind(this)):(rn&&console.log("Assign animator controller",e,this),this._animatorController=new Zi(e),this.__didAwake&&this._animatorController.bind(this)):this._animatorController=null)}get runtimeAnimatorController(){return this._animatorController}getCurrentStateInfo(){return this.runtimeAnimatorController?.getCurrentStateInfo()}get currentAction(){return this.runtimeAnimatorController?.currentAction||null}get parametersAreDirty(){return this._parametersAreDirty}_parametersAreDirty=!1;get isDirty(){return this._isDirty}_isDirty=!1;Play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.play(e,t,i,n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.runtimeAnimatorController?.play(e,t,i,n),this._isDirty=!0}Reset(){this.reset()}reset(){this._animatorController?.reset(),this._isDirty=!0}SetBool(e,t){this.setBool(e,t)}setBool(e,t){rn&&console.log("setBool",e,t),this.runtimeAnimatorController?.getBool(e)!==t&&(this._parametersAreDirty=!0),this.runtimeAnimatorController?.setBool(e,t)}GetBool(e){return this.getBool(e)}getBool(e){const t=this.runtimeAnimatorController?.getBool(e)??!1;return rn&&console.log("getBool",e,t),t}toggleBool(e){this.setBool(e,!this.getBool(e))}SetFloat(e,t){this.setFloat(e,t)}setFloat(e,t){this.runtimeAnimatorController?.getFloat(e)!==t&&(this._parametersAreDirty=!0),rn&&console.log("setFloat",e,t),this.runtimeAnimatorController?.setFloat(e,t)}GetFloat(e){return this.getFloat(e)}getFloat(e){const t=this.runtimeAnimatorController?.getFloat(e)??-1;return rn&&console.log("getFloat",e,t),t}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){this.runtimeAnimatorController?.getInteger(e)!==t&&(this._parametersAreDirty=!0),rn&&console.log("setInteger",e,t),this.runtimeAnimatorController?.setInteger(e,t)}GetInteger(e){return this.getInteger(e)}getInteger(e){const t=this.runtimeAnimatorController?.getInteger(e)??-1;return rn&&console.log("getInteger",e,t),t}SetTrigger(e){this.setTrigger(e)}setTrigger(e){this._parametersAreDirty=!0,rn&&console.log("setTrigger",e),this.runtimeAnimatorController?.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){this._parametersAreDirty=!0,rn&&console.log("resetTrigger",e),this.runtimeAnimatorController?.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){const t=this.runtimeAnimatorController?.getTrigger(e);return rn&&console.log("getTrigger",e,t),t}IsInTransition(){return this.isInTransition()}isInTransition(){return this.runtimeAnimatorController?.isInTransition()??!1}SetSpeed(e){return this.setSpeed(e)}setSpeed(e){e!==this._speed&&(rn&&console.log("setSpeed",e),this._speed=e,this._animatorController?.animator==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){this._speed=D.lerp(e.x,e.y,Math.random()),this._animatorController?.animator==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){this._normalizedStartOffset=D.lerp(e.x,e.y,Math.random()),this.runtimeAnimatorController?.animator==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}_speed=1;_normalizedStartOffset=0;_animatorController=null;awake(){rn&&console.log("ANIMATOR",this.name,this),this.gameObject&&this.initializeRuntimeAnimatorController()}_initializeWithRuntimeAnimatorController;initializeRuntimeAnimatorController(e=!1){const t=e||this.runtimeAnimatorController!==this._initializeWithRuntimeAnimatorController;if(this.runtimeAnimatorController&&t){const i=this.runtimeAnimatorController.clone();this._initializeWithRuntimeAnimatorController=i,i?(console.assert(this.runtimeAnimatorController!==i),this.runtimeAnimatorController=i,console.assert(this.runtimeAnimatorController===i),this.runtimeAnimatorController.bind(this),this.runtimeAnimatorController.setSpeed(this._speed),this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset):console.warn("Could not clone animator controller",this.runtimeAnimatorController)}}onDisable(){this.keepAnimatorControllerStateOnDisable||this._animatorController?.reset()}onBeforeRender(){this._isDirty=!1,this._parametersAreDirty=!1,!eR(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}$u([u()],wt.prototype,"applyRootMotion",2),$u([u()],wt.prototype,"hasRootMotion",2),$u([u()],wt.prototype,"keepAnimatorControllerStateOnDisable",2),$u([u()],wt.prototype,"runtimeAnimatorController",1);const $o=new Array;class Ho{enabled=!0;target;methodName;arguments;get canClone(){return this.target instanceof Object}constructor(e,t,i,n){this.target=e,this.methodName=t||null,this.arguments=i,n!=null&&(this.enabled=n)}invoke(...e){if(this.enabled!==!1){if(typeof this.target=="function")this.arguments?($o.length=0,e!==void 0&&e.length>0&&$o.push(...e),$o.push(...this.arguments),this.target(...this.arguments),$o.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?($o.length=0,e!==void 0&&e.length>0&&$o.push(...e),$o.push(...this.arguments),t.call(this.target,...$o),$o.length=0):t.call(this.target,...e):this.arguments?e!==void 0&&e.length>0?this.target[this.methodName]=e[0]:this.target[this.methodName]=this.arguments[0]:this.target[this.methodName]=e[0]}}}}const aR=o=>/^[A-Z]*$/.test(o);class Hu extends Event{args}class ae{isEventList=!0;__internalOnInstantiate(e){const t=new Array;for(let i=0;i<this.methods.length;i++){const n=this.methods[i];if(!(n.target instanceof Function)){const s=n.target;let r=s?.uuid;if(s&&(r=s.guid),r){const a=e[r];if(a){const l=n.arguments?.map(c=>c instanceof Object&&c.uuid?e[c.uuid].clone:c?.isComponent?e[c.guid].clone:c);t.push(new Ho(a.clone,n.methodName,l,n.enabled))}else A()&&console.warn("Could not find target for event listener")}}}return new ae(t)}target;key;setEventTarget(e,t){if(this.key=e,this.target=t,this.key!==void 0){let i="",n=!1;for(const s of this.key)n&&aR(s)&&(i+="-"),n=!0,i+=s.toLowerCase();this.key=i}}get listenerCount(){return this.methods?.length??0}get isInvoking(){return this._isInvoking}_isInvoking=!1;methods=[];_methodsCopy=[];static from(...e){return new ae(e)}constructor(e){if(this.methods=[],Array.isArray(e))for(const t of e)t instanceof Ho?this.methods.push(t):typeof t=="function"&&this.methods.push(new Ho(t));else typeof e=="function"&&this.methods.push(new Ho(e))}invoke(...e){if(this._isInvoking)return console.warn("Circular event invocation detected. Please check your event listeners for circular references.",this),!1;if(this.methods?.length<=0)return!1;this._isInvoking=!0;try{this._methodsCopy.length=0,this._methodsCopy.push(...this.methods);for(const t of this._methodsCopy)t.invoke(...e);if(typeof this.target=="object"&&typeof this.key=="string"){const t=this.target.dispatchEvent;if(typeof t=="function"){const i=new Hu(this.key);i.args=e,t.call(this.target,i)}}}finally{this._isInvoking=!1,this._methodsCopy.length=0}return!0}addEventListener(e){return this.methods.push(new Ho(e)),()=>this.removeEventListener(e)}removeEventListener(e){if(!e)return!1;let t=!1;for(let i=this.methods.length-1;i>=0;i--)this.methods[i].target===e&&(this.methods[i].enabled=!1,this.methods.splice(i,1),t=!0);return t}removeAllEventListeners(){this.methods.length=0}}const fx=Symbol("previous-visibility");class ko extends Qn{render(e,t,i){if("addPass"in i)this._unsupported_effectcomposer_warning||(console.warn("RenderTexture.render() does not yet support EffectComposer"),this._unsupported_effectcomposer_warning=!0);else if(i instanceof _r){this.onBeforeRender();const n=i.getRenderTarget(),s=i.xr.enabled;i.xr.enabled=!1,i.setRenderTarget(this),i.clear(!0,!0,!0),i.render(e,t),i.setRenderTarget(n),i.xr.enabled=s,this.onAfterRender()}}static _userSet=new Set;onBeforeRender(){ko._userSet.clear();const e=Rf(this.texture,!0,null,ko._userSet);for(const t of e)t instanceof H&&(t[fx]=t.visible,t.visible=!1)}onAfterRender(){for(const e of ko._userSet)e instanceof H&&(e.visible=e[fx]);ko._userSet.clear()}}class lR extends en{constructor(){super([oe,se],"ColorSerializer")}onDeserialize(e){if(e!=null)return e.a!==void 0?new se(e.r,e.g,e.b,e.a):e.alpha!==void 0?new se(e.r,e.g,e.b,e.alpha):new oe(e.r,e.g,e.b)}onSerialize(e){if(e!=null)return e.a!==void 0?{r:e.r,g:e.g,b:e.b,a:e.a}:{r:e.r,g:e.g,b:e.b}}}const cR=new lR;class hR extends en{constructor(){super([ht],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new ht(e.x,e.y,e.z,e.order);if(e.x!=null)return new ht(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const dR=new hR;class uR extends en{constructor(){super(M,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const i=t.objectToNode[e.uuid];return _t&&console.log(i,e.name,e.uuid),{node:i}}}onDeserialize(e,t){if(typeof e=="string"){if(e.endsWith(".glb")||e.endsWith(".gltf")){if(t.serializable instanceof Array&&t.serializable.includes(ne))return;A()&&be("Detected wrong usage of @serializable with Object3D or GameObject. Instead you should use AssetReference here! Please see the console for details.");const i=t.target?.constructor?.name;console.warn(`Wrong usage of @serializable detected in your script "${i}"
|
|
895
|
+
|
|
896
|
+
It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
|
|
897
|
+
|
|
898
|
+
To fix this please change your code to:
|
|
899
|
+
|
|
900
|
+
@serializable(AssetReference)
|
|
901
|
+
${t.path}! : AssetReference;
|
|
902
|
+
\0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const i=t.nodeToObject[e.node];return _t&&console.log("Deserialized object reference?",e,i,t?.nodeToObject),i||console.warn("Did not find node: "+e.node,t.nodeToObject,t.object),i}else if(e.guid){if(!t.context){console.error("Missing context");return}let i;const n=t.gltf?.scene;return n&&(i=x.findByGuid(e.guid,n)),i||(i=x.findByGuid(e.guid,t.context.scene)),i?(i&&i.isComponent===!0&&(_t&&console.warn("Deserialized object reference is a component"),i=i.gameObject),_t&&console.log("Deserialized object reference?",e,i,t?.nodeToObject)):((A()||_t)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),i}}}}const yx=new uR;class pR extends en{constructor(){super([E,E],"ComponentSerializer")}onSerialize(e,t){if(e?.guid)return{guid:e.guid}}onDeserialize(e,t){if(e?.guid){if(e.___persistentAsset){_t&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const i=t.path;_t&&console.log(e.guid,t.root,t.object,t.target);let n=this.findObjectForGuid(e.guid,t.root);if(n||t.context&&(n=this.findObjectForGuid(e.guid,t.context?.scene),n))return n;(A()||_t)&&console.warn('Could not resolve component reference: "'+i+'" using guid '+e.guid,t.target),e.could_not_resolve=!0;return}}findObjectForGuid(e,t){if(t.guid===e)return t;const i=x.foreachComponent(t,n=>{if(n.guid===e)return n},!1);if(i!==void 0)return i;for(let n=0;n<t.children.length;n++){const s=t.children[n],r=this.findObjectForGuid(e,s);if(r)return r}}}const Gu=new pR;class mR extends en{constructor(){super([ae])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){if(typeof e=="function")return new ae([new Ho(e,null,[],!0)]);if(e&&e.type==="EventList"){_t&&console.log("DESERIALIZE EVENT",e);const i=new Array;if(e.calls&&Array.isArray(e.calls))for(const r of e.calls){let a=function(h){if(typeof h=="object"){let d=yx.onDeserialize(h,t);if(d||(d=Gu.onDeserialize(h,t)),d)return d}return h};_t&&console.log(r);let l=Gu.findObjectForGuid(r.target,t.root);!l&&t.context?.scene&&(l=Gu.findObjectForGuid(r.target,t.context?.scene));const c=r.method?.length>0;if(l&&c){const h=()=>{const d=r.method[0].toUpperCase()+r.method.slice(1);if(typeof l[d]=="function"){console.warn(`EventList method:
|
|
903
|
+
Could not find method ${r.method} on object ${l.name}. Please rename ${r.method} to ${d}?
|
|
904
|
+
`,l[d],`
|
|
905
|
+
in script: `,l),be("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
|
|
906
|
+
Could not find method ${r.method} on object ${l.name}`,l,typeof l[r.method])};if(typeof l[r.method]!="function"){let d=!1,p=l;for(;p;){const m=Object.getOwnPropertyDescriptor(p,r.method);if(m&&(m.writable===!0||m.set)){d=!0;break}p=Object.getPrototypeOf(p)}!d&&(A()||_t)&&h()}}if(l){let h=r.argument;if(h!==void 0?h=a(h):r.arguments!==void 0&&(h=r.arguments.map(a)),l[r.method]===void 0)console.warn(`EventList method not found: "${r.method}" on ${l?.name}`);else{h!==void 0&&!Array.isArray(h)&&(h=[h]);const d=new Ho(l,r.method,h,r.enabled);i.push(d)}}else A()&&console.warn(`[Dev] EventList: Could not find event listener in scene (${t.object?.name})`,r)}const n=new ae(i);_t&&console.log(n);const s=t.target;return s!==void 0&&t.path!==void 0&&n.setEventTarget(t.path,s),n}}}const gR=new mR,qu=new WeakMap,fR=Se.prototype.clone;Se.prototype.clone=function(){const o=fR.call(this);return qu.has(o)||qu.set(o,this),o};class bx extends en{constructor(){super([ko,Qn])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof Se&&t.type===ko){let i=e;qu.has(i)&&(i=qu.get(i)),i.isRenderTargetTexture=!0,i.flipY=!0,i.offset.y=1,i.repeat.y=-1,i.needsUpdate=!0,i.mipmaps=[],i instanceof CC&&(i.isCompressedTexture=!1,i.format=Dd);const n=new ko(i.image.width,i.image.height,{colorSpace:To});return n.texture=i,n}}}new bx;class _x extends en{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return Fo(t.gltfId,e)}}new _x;var yR=Object.defineProperty,bR=Object.getOwnPropertyDescriptor,ih=(o,e,t,i)=>{for(var n=i>1?void 0:i?bR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&yR(e,t,n),n};const Xu=w("debuggroundprojection");class so extends E{applyOnAwake=!1;autoFit=!0;set radius(e){this._radius=e,this._projection&&this.updateProjection()}get radius(){return this._radius}_radius=50;set height(e){this._height=e,this._projection&&this.updateProjection()}get height(){return this._height}_height=3;set arBlending(e){this._arblending=e,this._needsTextureUpdate=!0}get arBlending(){return this._arblending}_arblending=0;_lastBackground;_lastRadius;_lastHeight;_projection;_watcher;awake(){this.applyOnAwake&&this.updateAndCreate()}onEnable(){this.context.time.frameCount>0&&this.applyOnAwake&&this.updateAndCreate(),this._watcher||(this._watcher=new fs(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{Xu&&console.log("Background changed",this.context.scene.background),this._needsTextureUpdate=!0}))}onDisable(){this._watcher?.revoke(),this._projection?.removeFromParent()}onEnterXR(){this.activeAndEnabled&&(this._needsTextureUpdate=!0,this.updateProjection())}async onLeaveXR(){this.activeAndEnabled&&(await wc(1),this.updateProjection())}onBeforeRender(){this._projection&&this.scene.backgroundRotation&&this._projection.rotation.copy(this.scene.backgroundRotation),this.context.scene.backgroundBlurriness!==void 0&&this._lastBlurriness!=this.context.scene.backgroundBlurriness&&this.context.scene.backgroundBlurriness>.001?this.updateProjection():this._needsTextureUpdate&&this.context.scene.background instanceof Se&&this.updateBlurriness(this.context.scene.background,this.context.scene.backgroundBlurriness)}updateAndCreate(){this.updateProjection(),this._watcher?.apply()}_needsTextureUpdate=!1;updateProjection(){if(!this.context.scene.background){this._projection?.removeFromParent();return}const e=this.context.scene.background;if(!(e instanceof Se)){this._projection?.removeFromParent();return}if((this.context.xr?.isPassThrough||this.context.xr?.isAR)&&this.arBlending===0){this._projection?.removeFromParent();return}if(!this.gameObject||this.destroyed)return;let t=!0;const i=0,n=e!==this._lastBackground||this._height!==this._lastHeight||this._radius!==this._lastRadius;if(!this._projection||n){Xu&&console.log("Create/Update Ground Projection",e.name),this._projection?.removeFromParent();try{this._projection=new Fa(e,this._height,this._radius,64)}catch(s){console.error("Error creating three GroundProjection",s);return}this._projection.position.y=this._height-i,this._projection.name="GroundProjection",Og(this._projection,!1)}else t=!1;if(this._projection.parent||this.gameObject.add(this._projection),this.autoFit&&t){this._projection.updateWorldMatrix(!0,!0);const s=ui(this.context.scene.children,[this._projection]),r=s.min.y;if(r<1/0){const a=F();a.x=s.min.x+(s.max.x-s.min.x)*.5;const l=Ge(this.gameObject).x;a.y=r+this._height*l-i,a.z=s.min.z+(s.max.z-s.min.z)*.5,bt(this._projection,a)}Xu&&B.DrawWireBox3(s,65280,5)}this.context.scene.backgroundBlurriness>.001&&this._needsTextureUpdate&&this.updateBlurriness(e,this.context.scene.backgroundBlurriness),this._lastBackground=e,this._lastHeight=this._height,this._lastRadius=this._radius,this._needsTextureUpdate=!1}_blurrynessShader=null;_lastBlurriness=-1;updateBlurriness(e,t){if(this._projection){if(!e)return}else return;this._needsTextureUpdate=!1,Xu&&console.log("Update Blurriness",t),this._blurrynessShader??=new Xn({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:_R,fragmentShader:vR}),this._blurrynessShader.depthWrite=!1,this._blurrynessShader.uniforms.map.value=e,this._blurrynessShader.uniforms.blurriness.value=t,this._lastBlurriness=t,e.needsUpdate=!0;const i=this._projection.material.transparent;this._projection.material.transparent=(this.context.xr?.isAR===!0&&this.arBlending>1e-6)??!1,this._projection.material.transparent?this._blurrynessShader.uniforms.blending.value=this.arBlending:this._blurrynessShader.uniforms.blending.value=0,this.context.isInPassThrough?this._blurrynessShader.uniforms.alphaFactor.value=.95:this._blurrynessShader.uniforms.alphaFactor.value=1,i!==this._projection.material.transparent&&(this._projection.material.needsUpdate=!0),this._projection.material.map=gr.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}ih([u()],so.prototype,"applyOnAwake",2),ih([u()],so.prototype,"autoFit",2),ih([u()],so.prototype,"radius",1),ih([u()],so.prototype,"height",1),ih([u()],so.prototype,"arBlending",1);const _R=`
|
|
907
|
+
varying vec2 vUv;
|
|
908
|
+
|
|
909
|
+
void main() {
|
|
910
|
+
vUv = uv;
|
|
911
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
912
|
+
}
|
|
913
|
+
`,vR=`
|
|
914
|
+
uniform sampler2D map;
|
|
915
|
+
uniform float blurriness;
|
|
916
|
+
uniform float alphaFactor;
|
|
917
|
+
uniform float blending;
|
|
918
|
+
varying vec2 vUv;
|
|
919
|
+
|
|
920
|
+
const float PI = 3.14159265359;
|
|
921
|
+
|
|
922
|
+
// Gaussian function
|
|
923
|
+
float gaussian(float x, float sigma) {
|
|
924
|
+
return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
// Custom smoothstep function for desired falloff
|
|
928
|
+
float customSmoothstep(float edge0, float edge1, float x) {
|
|
929
|
+
float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
|
|
930
|
+
return t * t * (3.0 - 2.0 * t);
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
void main() {
|
|
934
|
+
vec2 center = vec2(0.0, 0.0);
|
|
935
|
+
vec2 pos = vUv;
|
|
936
|
+
pos.x = 0.0; // Only consider vertical distance
|
|
937
|
+
float distance = length(pos - center);
|
|
938
|
+
|
|
939
|
+
// Calculate blur amount based on custom falloff
|
|
940
|
+
float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
|
|
941
|
+
blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
|
|
942
|
+
|
|
943
|
+
// Gaussian blur
|
|
944
|
+
vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
|
|
945
|
+
vec4 color = vec4(0.0);
|
|
946
|
+
float totalWeight = 0.0;
|
|
947
|
+
int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
|
|
948
|
+
float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
|
|
949
|
+
|
|
950
|
+
for (int x = -blurSize; x <= blurSize; x++) {
|
|
951
|
+
for (int y = -blurSize; y <= blurSize; y++) {
|
|
952
|
+
vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
|
|
953
|
+
float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
|
|
954
|
+
color += textureLod(map, vUv + offset, lodLevel) * weight;
|
|
955
|
+
totalWeight += weight;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
|
|
960
|
+
|
|
961
|
+
gl_FragColor = color;
|
|
962
|
+
|
|
963
|
+
float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
|
|
964
|
+
float stepFactor = blending - brightness * .1;
|
|
965
|
+
gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
|
|
966
|
+
gl_FragColor.a *= alphaFactor;
|
|
967
|
+
// gl_FragColor.rgb = vec3(1.0);
|
|
968
|
+
|
|
969
|
+
// #include <tonemapping_fragment>
|
|
970
|
+
// #include <colorspace_fragment>
|
|
971
|
+
|
|
972
|
+
// Uncomment to visualize blur amount
|
|
973
|
+
// gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
|
|
974
|
+
}
|
|
975
|
+
`;function vx(o){if(Z.active)return console.warn("[OrbitControls] Can not fit camera while XR session is active"),null;const e=z.Current;if(!e)return console.warn("[OrbitControls] No context found"),null;const t=o?.camera||e.mainCamera;if(!t)return console.warn("No camera or controls found to fit camera to objects..."),null;o||(o={}),o.autoApply=o.autoApply!==!1,o.minZoom||=0,o.maxZoom||=1/0;const{centerCamera:i,cameraNearFar:n="auto",fitOffset:s=1.1,fov:r=t instanceof de?t?.fov:-1}=o,a=new b,l=new b,c=t instanceof de?t.aspect:1,h=o.objects||e.scene,d=ui(h,void 0,t?.layers),p=d.clone();d.getCenter(l);const m=new b;if(d.getSize(m),t instanceof de&&t.updateProjectionMatrix(),t.updateMatrixWorld(),d.applyMatrix4(t.matrixWorldInverse),d.getSize(a),d.setFromCenterAndSize(l,a),Number.isNaN(a.x)||Number.isNaN(a.y)||Number.isNaN(a.z))return console.warn("Camera fit size resultet in NaN",t,d),null;if(a.length()<=1e-10)return console.warn("Camera fit size is zero",d),null;const f=r,g=2*Math.atan(Math.tan(f*Math.PI/360/2)*c)/Math.PI*360,y=a.y/(2*Math.atan(Math.PI*f/360)),_=a.x/(2*Math.atan(Math.PI*g/360)),v=s*Math.max(y,_)+a.z/2;o.maxZoom=v*10,o.minZoom=v*.01,o.debug===!0&&console.log("Fit camera to objects",{fitHeightDistance:y,fitWidthDistance:_,distance:v,verticalFov:f,horizontalFov:g});const C=.05,O=l.clone();if(O.y-=a.y*C,o.targetOffset&&(o.targetOffset.x!==void 0&&(O.x+=o.targetOffset.x),o.targetOffset.y!==void 0&&(O.y+=o.targetOffset.y),o.targetOffset.z!==void 0&&(O.z+=o.targetOffset.z)),o.relativeTargetOffset&&(o.relativeTargetOffset.x!==void 0&&(O.x+=o.relativeTargetOffset.x*a.x),o.relativeTargetOffset.y!==void 0&&(O.y+=o.relativeTargetOffset.y*a.y),o.relativeTargetOffset.z!==void 0&&(O.z+=o.relativeTargetOffset.z*a.z)),n==null||n=="auto"){const L=pl(so),V=L?L.radius:0,W=Math.max(m.x,m.y,m.z,V);t instanceof de&&(t.near=v/100,t.far=W+v*10,t.updateProjectionMatrix()),L&&(o.maxZoom=Math.max(Math.min(o.maxZoom,V*.5),v))}o.currentZoom!==void 0&&(o.currentZoom<o.minZoom&&(o.minZoom=o.currentZoom*.9),o.currentZoom>o.maxZoom&&(o.maxZoom=o.currentZoom*1.1));const k=l.clone();o.fitDirection?k.sub(new b().copy(o.fitDirection).multiplyScalar(1e6)):k.sub(t.worldPosition),i==="y"&&(k.y=0),k.normalize(),k.multiplyScalar(v),i==="y"&&(k.y+=-C*4*v);let j=l.clone().sub(k);return o.cameraOffset&&(o.cameraOffset.x!==void 0&&(j.x+=o.cameraOffset.x),o.cameraOffset.y!==void 0&&(j.y+=o.cameraOffset.y),o.cameraOffset.z!==void 0&&(j.z+=o.cameraOffset.z)),o.relativeCameraOffset&&(o.relativeCameraOffset.x!==void 0&&(j.x+=o.relativeCameraOffset.x*a.x),o.relativeCameraOffset.y!==void 0&&(j.y+=o.relativeCameraOffset.y*a.y),o.relativeCameraOffset.z!==void 0&&(j.z+=o.relativeCameraOffset.z*a.z)),t.parent&&(j=t.parent.worldToLocal(j)),o.debug&&(B.DrawWireBox3(d,16777011,10),B.DrawWireBox3(p,65280,10)),o.autoApply&&(t.position.copy(j),t.lookAt(O),r>0&&t instanceof de&&(t.fov=r,t.updateProjectionMatrix())),{camera:t,position:j,lookAt:O,fov:o.fov}}var wR=Object.defineProperty,qf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wR(e,t,n),n};class Gr extends E{constraintActive=!0;locked=!1;sources=[];setConstraintPosition(e){const t=this.sources[0];t&&(t.worldPosition=e)}}qf([u()],Gr.prototype,"constraintActive"),qf([u()],Gr.prototype,"locked"),qf([u(M)],Gr.prototype,"sources");let qr=class{bb=null;bb_pos=0;__init(o,e){return this.bb_pos=o,this.bb=e,this}x(){return this.bb.readFloat32(this.bb_pos)}y(){return this.bb.readFloat32(this.bb_pos+4)}z(){return this.bb.readFloat32(this.bb_pos+8)}static sizeOf(){return 12}static createVec3(o,e,t,i){return o.prep(4,12),o.writeFloat32(i),o.writeFloat32(t),o.writeFloat32(e),o.offset()}};class wx{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new qr).__init(this.bb_pos,this.bb)}rotation(e){return(e||new qr).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new qr).__init(this.bb_pos+24,this.bb)}static sizeOf(){return 36}static createTransform(e,t,i,n,s,r,a,l,c,h){return e.prep(4,36),e.prep(4,12),e.writeFloat32(h),e.writeFloat32(c),e.writeFloat32(l),e.prep(4,12),e.writeFloat32(a),e.writeFloat32(r),e.writeFloat32(s),e.prep(4,12),e.writeFloat32(n),e.writeFloat32(i),e.writeFloat32(t),e.offset()}}class bs{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new bs).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+t_),(t||new bs).__init(e.readInt32(e.position())+e.position(),e)}guid(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}fast(){const e=this.bb.__offset(this.bb_pos,6);return e?!!this.bb.readInt8(this.bb_pos+e):!1}transform(e){const t=this.bb.__offset(this.bb_pos,8);return t?(e||new wx).__init(this.bb_pos+t,this.bb):null}dontSave(){const e=this.bb.__offset(this.bb_pos,10);return e?!!this.bb.readInt8(this.bb_pos+e):!1}static startSyncedTransformModel(e){e.startObject(4)}static addGuid(e,t){e.addFieldOffset(0,t,0)}static addFast(e,t){e.addFieldInt8(1,+t,0)}static addTransform(e,t){e.addFieldStruct(2,t,0)}static addDontSave(e,t){e.addFieldInt8(3,+t,0)}static endSyncedTransformModel(e){return e.endObject()}static finishSyncedTransformModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedTransformModelBuffer(e,t){e.finish(t,void 0,!0)}}var xt=(o=>(o[o.Average=0]="Average",o[o.Multiply=1]="Multiply",o[o.Minimum=2]="Minimum",o[o.Maximum=3]="Maximum",o))(xt||{}),Qu=(o=>(o[o.Discrete=0]="Discrete",o[o.Continuous=1]="Continuous",o))(Qu||{}),Ke=(o=>(o[o.None=0]="None",o[o.FreezePositionX=2]="FreezePositionX",o[o.FreezePositionY=4]="FreezePositionY",o[o.FreezePositionZ=8]="FreezePositionZ",o[o.FreezePosition=14]="FreezePosition",o[o.FreezeRotationX=16]="FreezeRotationX",o[o.FreezeRotationY=32]="FreezeRotationY",o[o.FreezeRotationZ=64]="FreezeRotationZ",o[o.FreezeRotation=112]="FreezeRotation",o[o.FreezeAll=126]="FreezeAll",o))(Ke||{}),ml=(o=>(o[o.None=0]="None",o[o.X=2]="X",o[o.Y=4]="Y",o[o.Z=8]="Z",o[o.All=-1]="All",o))(ml||{});const Et=function(o,e){return function(t,i,n){xR(t,i,n,o,e)}};function xR(o,e,t,i,n){if(!n&&!i&&!o.onValidate)return;if(t!==void 0){console.error("Invalid usage of validate decorator. Only fields can be validated.",o,e,t),ke("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,{type:Bi.Error});return}let s="";if(typeof e=="string"?s=e:s=e.name,o.__internalAwake){const r=Symbol(s),a=o.__internalAwake;o.__internalAwake=function(){if(!this.onValidate){A()&&console.warn('Usage of @validate decorate detected but there is no onValidate method in your class: "'+o.constructor?.name+'"');return}if(this[r]===void 0){this[r]=this[s];const l=this[s];if(l instanceof K||l instanceof b||l instanceof ye||l instanceof N){const c=this[s];Gd(c,()=>{this.onValidate(s)})}Object.defineProperty(this,s,{set:function(c){if(this[Kg]===!0)this[r]=c;else{i?.call(this,c);const h=this[r];this[r]=c,this.onValidate?.call(this,s,h)}},get:function(){return n?.call(this),this[r]}})}a.call(this)}}}const SR=function(o){return function(e,t,i){let n="";typeof t=="string"?n=t:n=t.name;const s=o.prototype,r=Object.getOwnPropertyDescriptor(s,n);if(!r?.value){console.warn("Can not apply prefix: type does not have method named",t,o);return}const a=r.value,l=e[n];Object.defineProperty(s,n,{value:function(...c){const h=l?.call(this,...c);if(h instanceof Promise){h.then(d=>{if(d!==!1)return a.call(this,...c)});return}if(h!==!1)return a.call(this,...c)}})}};var CR=Object.defineProperty,PR=Object.getOwnPropertyDescriptor,zi=(o,e,t,i)=>{for(var n=i>1?void 0:i?PR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&CR(e,t,n),n};class OR{get isDirty(){return this.positionChanged||this.rotationChanged}positionChanged=!1;rotationChanged=!1;position;quaternion;_positionKeys=["x","y","z"];_quaternionKeys=["_x","_y","_z","_w"];reset(e=!1){if(this.positionChanged=!1,this.rotationChanged=!1,this.mute=!1,e){if(this.position)for(const t of this._positionKeys)delete this.position[t];if(this.quaternion)for(const t of this._quaternionKeys)delete this.quaternion[t]}}syncValues(){for(const e of this._positionKeys)this.position[e]=this.obj.position[e];for(const e of this._quaternionKeys)this.quaternion[e]=this.obj.quaternion[e]}mute=!1;applyValues(){if(this.positionChanged&&this.position)for(const e of this._positionKeys){const t=this.position[e];t!==void 0&&(this.obj.position[e]=t)}if(this.rotationChanged&&this.quaternion)for(const e of this._quaternionKeys){const t=this.quaternion[e];t!==void 0&&(this.obj.quaternion[e]=t)}}context;obj;_positionWatch;_rotationWatch;constructor(e,t){this.context=t,this.obj=e}start(e,t){this.reset(),e&&(this._positionWatch||(this._positionWatch=new fs(this.obj.position,["x","y","z"])),this._positionWatch.apply(),this.position={},this._positionWatch.subscribeWrite((s,r)=>{if(this.context.physics.engine?.isUpdating||this.mute)return;const a=this.position[r];Math.abs(a-s)<1e-5||(this.position[r]=s,this.positionChanged=!0)})),t&&(this._rotationWatch||(this._rotationWatch=new fs(this.obj.quaternion,["_x","_y","_z","_w"])),this._rotationWatch.apply(),this.quaternion={},this._rotationWatch.subscribeWrite((s,r)=>{if(this.context.physics.engine?.isUpdating||this.mute)return;const a=this.quaternion[r];Math.abs(a-s)<1e-5||(this.quaternion[r]=s,this.rotationChanged=!0)}));const i=this.obj.matrixWorld.multiplyMatrices.bind(this.obj.matrixWorld),n=new J;this.obj.matrixWorld.multiplyMatrices=(s,r)=>(this.context.physics.engine?.isUpdating||this.mute||n.equals(s)||(this.positionChanged=!0,this.rotationChanged=!0,n.copy(s)),i(s,r))}stop(){this._positionWatch?.revoke(),this._rotationWatch?.revoke()}}const vi=class Mm extends E{get isRigidbody(){return!0}autoMass=!0;set mass(e){e!==this._mass&&(this._mass=e,this._propertiesChanged=!0,this.__didAwake&&(this.autoMass=!1))}get mass(){return this.autoMass?this.context.physics.engine?.getBody(this)?.mass()??-1:this._mass}_mass=0;useGravity=!0;centerOfMass=new b(0,0,0);constraints=Ke.None;isKinematic=!1;drag=0;angularDrag=1;detectCollisions=!0;sleepThreshold=.01;collisionDetectionMode=Qu.Discrete;get lockPositionX(){return(this.constraints&Ke.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Ke.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Ke.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Ke.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Ke.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Ke.FreezeRotationZ)!==0}set lockPositionX(e){e?this.constraints|=Ke.FreezePositionX:this.constraints&=~Ke.FreezePositionX}set lockPositionY(e){e?this.constraints|=Ke.FreezePositionY:this.constraints&=~Ke.FreezePositionY}set lockPositionZ(e){e?this.constraints|=Ke.FreezePositionZ:this.constraints&=~Ke.FreezePositionZ}set lockRotationX(e){e?this.constraints|=Ke.FreezeRotationX:this.constraints&=~Ke.FreezeRotationX}set lockRotationY(e){e?this.constraints|=Ke.FreezeRotationY:this.constraints&=~Ke.FreezeRotationY}set lockRotationZ(e){e?this.constraints|=Ke.FreezeRotationZ:this.constraints&=~Ke.FreezeRotationZ}set gravityScale(e){this._gravityScale=e}get gravityScale(){return this._gravityScale}_gravityScale=1;dominanceGroup=0;static tempPosition=new b;_propertiesChanged=!1;_currentVelocity=new b;_smoothedVelocity=new b;_smoothedVelocityGetter=new b;_lastPosition=new b;_watch;awake(){this._watch=void 0,this._propertiesChanged=!1}onEnable(){this._watch||(this._watch=new OR(this.gameObject,this.context)),this._watch.start(!0,!0),this.startCoroutine(this.beforePhysics(),xe.LateUpdate),A()&&(globalThis.NEEDLE_USE_RAPIER?T.RAPIER_PHYSICS.ready().then(async()=>{await wc(3),this.context.physics.engine?.getBody(this)||console.warn(`Rigidbody could not be created. Ensure "${this.name}" has a Collider component.`)}):console.warn("Rigidbody could not be created: Rapier physics are explicitly disabled."))}onDisable(){this._watch?.stop(),this.context.physics.engine?.removeBody(this)}onDestroy(){this.context.physics.engine?.removeBody(this)}onValidate(){this._propertiesChanged=!0}*beforePhysics(){for(;;)this._propertiesChanged&&(this._propertiesChanged=!1,this.context.physics.engine?.updateProperties(this)),this._watch?.isDirty?(this._watch.mute=!0,this._watch.applyValues(),this.context.physics.engine?.updateBody(this,this._watch.positionChanged,this._watch.rotationChanged),this._watch.reset()):this._watch?.syncValues(),this.captureVelocity(),yield}teleport(e,t=!0){this._watch?.reset(!0),t?this.gameObject.position.set(e.x,e.y,e.z):this.setWorldPosition(e.x,e.y,e.z),this.resetForcesAndTorques(),this.resetVelocities()}resetForces(e=!0){this.context.physics.engine?.resetForces(this,e)}resetTorques(e=!0){this.context.physics.engine?.resetTorques(this,e)}resetVelocities(){this.setVelocity(0,0,0),this.setAngularVelocity(0,0,0)}resetForcesAndTorques(){this.resetForces(),this.resetTorques()}wakeUp(){this.context.physics.engine?.wakeup(this)}get isSleeping(){return this.context.physics.engine?.isSleeping(this)}updateProperties(){return this._propertiesChanged=!1,this.context.physics.engine?.updateProperties(this)}applyForce(e,t,i=!0){this._propertiesChanged&&this.updateProperties(),this.context.physics.engine?.addForce(this,e,i)}applyImpulse(e,t=!0){this._propertiesChanged&&this.updateProperties(),this.context.physics.engine?.applyImpulse(this,e,t)}setForce(e,t,i,n=!0){this.context.physics.engine?.resetForces(this,n),typeof e=="number"?(t??=0,i??=0,this.context.physics.engine?.addForce(this,{x:e,y:t,z:i},n)):this.context.physics.engine?.addForce(this,e,n)}getVelocity(){const e=this.context.physics.engine?.getLinearVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setVelocity(e,t,i,n=!0){if(e instanceof b){const s=e;this.context.physics.engine?.setLinearVelocity(this,s,n);return}t===void 0||i===void 0||this.context.physics.engine?.setLinearVelocity(this,{x:e,y:t,z:i},n)}getAngularVelocity(){const e=this.context.physics.engine?.getAngularVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setAngularVelocity(e,t,i,n=!0){if(typeof e=="object"){const s=e;this.context.physics.engine?.setAngularVelocity(this,s,n);return}if(t===void 0||i===void 0||typeof t=="boolean"){console.warn("setAngularVelocity expects either a Vec3 or 3 numbers");return}this.context.physics.engine?.setAngularVelocity(this,{x:e,y:t,z:i},n)}setTorque(e,t,i){typeof e=="number"?this.setAngularVelocity(e,t,i):this.setAngularVelocity(e)}get smoothedVelocity(){return this._smoothedVelocityGetter.copy(this._smoothedVelocity),this._smoothedVelocityGetter.multiplyScalar(1/this.context.time.deltaTime)}setBodyFromGameObject(e=null){}captureVelocity(){const e=this.gameObject.matrixWorld;Mm.tempPosition.setFromMatrixPosition(e);const t=Mm.tempPosition.sub(this._lastPosition);this._lastPosition.copy(Mm.tempPosition),this._smoothedVelocity.lerp(t,this.context.time.deltaTime/.1)}};zi([Et()],vi.prototype,"autoMass",2),zi([u()],vi.prototype,"mass",1),zi([Et(),u()],vi.prototype,"useGravity",2),zi([u(b)],vi.prototype,"centerOfMass",2),zi([Et(),u()],vi.prototype,"constraints",2),zi([Et(),u()],vi.prototype,"isKinematic",2),zi([Et(),u()],vi.prototype,"drag",2),zi([Et(),u()],vi.prototype,"angularDrag",2),zi([Et(),u()],vi.prototype,"detectCollisions",2),zi([Et(),u()],vi.prototype,"sleepThreshold",2),zi([Et(),u()],vi.prototype,"collisionDetectionMode",2),zi([Et()],vi.prototype,"_gravityScale",2),zi([Et()],vi.prototype,"dominanceGroup",2);let Je=vi;new b,new b;const Ls=w("debugsync"),nh="STRS";af(nh,bs.getRootAsSyncedTransformModel);const ro=new Jm;function xx(o,e,t=!0){ro.clear();const i=ro.createString(o);bs.startSyncedTransformModel(ro),bs.addGuid(ro,i),bs.addFast(ro,t);const n=e.worldPosition,s=e.worldEuler,r=e.gameObject.scale;bs.addTransform(ro,wx.createTransform(ro,n.x,n.y,n.z,s.x,s.y,s.z,r.x,r.y,r.z));const a=bs.endSyncedTransformModel(ro);return ro.finish(a,nh),ro.asUint8Array()}let Xf=0,oh=0;fv(o=>{const e=o.connection.currentServerUrl?.includes("glitch")?10:40;oh=Math.floor(Xf/e),Xf=0,Ls&&oh>0&&console.log("Sync Transform Fast Interval",oh)});class Ln extends E{overridePhysics=!0;interpolatePosition=!0;interpolateRotation=!0;fastMode=!1;syncDestroy=!1;_model=null;_needsUpdate=!0;rb=null;_wasKinematic=!1;_receivedDataBefore=!1;_targetPosition;_targetRotation;_receivedFastUpdate=!1;_shouldRequestOwnership=!1;requestOwnership(){Ls&&console.log("[SyncedTransform] Request ownership"),this._model?this._model.requestOwnership():(this._shouldRequestOwnership=!0,this._needsUpdate=!0)}freeOwnership(){this._model?.freeOwnership()}hasOwnership(){return this._model?.hasOwnership??void 0}isOwned(){return this._model?.isOwned}joinedRoomCallback=null;receivedDataCallback=null;awake(){Ls&&console.log("[SyncedTransform] new instance",this.guid,this),this._receivedDataBefore=!1,this._targetPosition=new b,this._targetRotation=new N,this.lastPosition=new b,this.lastRotation=new N,this.lastScale=new b,this.rb=x.getComponentInChildren(this.gameObject,Je),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new cf(this.context.connection,this.guid),this.context.connection.isConnected&&this.tryGetLastState(),this.joinedRoomCallback=this.tryGetLastState.bind(this),this.context.connection.beginListen(ie.JoinedRoom,this.joinedRoomCallback),this.receivedDataCallback=this.onReceivedData.bind(this),this.context.connection.beginListenBinary(nh,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&$g(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(ie.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(nh,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}tempEuler=new ht;onReceivedData(e){if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){Ls&&console.log("[SyncedTransform] new data",this.context.connection.connectionId,this.context.time.frameCount,this.guid,e),this.receivedUpdate=!0,this._receivedFastUpdate=e.fast();const t=e.transform();if(t){vn.markDirty(this.gameObject,!0);const i=t.position();i&&(this.interpolatePosition&&this._targetPosition?.set(i.x(),i.y(),i.z()),(!this.interpolatePosition||!this._receivedDataBefore)&&this.setWorldPosition(i.x(),i.y(),i.z()));const n=t.rotation();n&&(this.tempEuler.set(n.x(),n.y(),n.z()),this.interpolateRotation&&this._targetRotation.setFromEuler(this.tempEuler),(!this.interpolateRotation||!this._receivedDataBefore)&&Pg(this.gameObject,this.tempEuler));const s=t.scale();s&&this.gameObject.scale.set(s.x(),s.y(),s.z())}this._receivedDataBefore=!0}}onEnable(){this.lastPosition.copy(this.worldPosition),this.lastRotation.copy(this.worldQuaternion),this.lastScale.copy(this.gameObject.scale),this._needsUpdate=!0,this._model&&this._model.updateIsOwned()}onDisable(){this._model&&this._model.freeOwnership()}receivedUpdate=!1;lastPosition;lastRotation;lastScale;onBeforeRender(){if(!this.activeAndEnabled||!this.context.connection.isConnected)return;if(!this.context.connection.isInRoom||!this._model){Ls&&console.log("[SyncedTransform] no model or room",this.name,this.guid,this.context.connection.isInRoom);return}this._shouldRequestOwnership&&(this._shouldRequestOwnership=!1,this._model.requestOwnership());const e=this.worldPosition,t=this.worldQuaternion,i=this.gameObject.scale;if(this._model.isOwned&&!this.receivedUpdate){const r=this._model.hasOwnership||this.fastMode?1e-4:.001;(e.distanceTo(this.lastPosition)>r||t.angleTo(this.lastRotation)>r||i.distanceTo(this.lastScale)>r)&&(this._model.hasOwnership?this._needsUpdate=!0:(Ls&&console.log(this.guid,"reset because not owned but",this.gameObject.name,this.lastPosition),this.worldPosition=this.lastPosition,e.copy(this.lastPosition),this.worldQuaternion=this.lastRotation,t.copy(this.lastRotation),this.gameObject.scale.copy(this.lastScale),vn.markDirty(this.gameObject,!0),this._needsUpdate=!1))}if(this._model&&!this._model.hasOwnership&&this._model.isOwned&&this._receivedDataBefore){const r=this._receivedFastUpdate||this.fastMode?.5:.3;let a=!1;if(this.interpolatePosition&&this._targetPosition){const l=this.worldPosition;l.lerp(this._targetPosition,r),this.worldPosition=l,a=!0}if(this.interpolateRotation&&this._targetRotation){const l=this.worldQuaternion;l.slerp(this._targetRotation,r),this.worldQuaternion=l,a=!0}a&&vn.markDirty(this.gameObject,!0)}if(this.receivedUpdate=!1,this.lastPosition.copy(e),this.lastRotation.copy(t),this.lastScale.copy(i),!this._model||!this._model||this._model.hasOwnership===void 0||!this._model.hasOwnership)return;this.rb&&this.overridePhysics&&this._wasKinematic!==void 0&&(Ls&&console.log("[SyncedTransform] reset kinematic",this.rb.name,this._wasKinematic),this.rb.isKinematic=this._wasKinematic);const n=10,s=this.rb||this.fastMode;if(this._needsUpdate&&(this.context.time.frameCount%n===0||s)){if(Xf++,s&&oh>0&&this.context.time.frameCount%oh!==0)return;Ls&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const r=xx(this.guid,this,!!s);this.context.connection.sendBinary(r)}}}class kd{event;get deviceIndex(){return this.event.deviceIndex}get pointerId(){return this.event.pointerId}button;buttonName;get pressure(){return this.event.pressure}get used(){return this._used}_used=!1;use(){this._used||(this._used=!0,this.event.use())}_propagationStopped=!1;get propagationStopped(){return this._propagationStopped}stopPropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}stopImmediatePropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}z__pointer_ctured=!1;setPointerCapture(){this.z__pointer_ctured=!0}z__pointer_cture_rleased=!1;releasePointerCapture(){this.z__pointer_cture_rleased=!0}inputSource;get mode(){return this.event.mode}object;point;normal;face;distance;instanceId;intersection;isDown;isUp;isPressed;isClick;isDoubleClick;input;constructor(e,t){this.event=t,this.input=e,this.button=t.button}clone(){const e=new kd(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function Yu(o,e){return x.foreachComponent(o,t=>{if(!t.enabled)return;const i=t;if(e)switch(e){case"pointerdown":if(i.onPointerDown)return!0;break;case"pointerup":if(i.onPointerUp||i.onPointerClick)return!0;break;case"pointermove":if(i.onPointerEnter||i.onPointerExit||i.onPointerMove)return!0;break}else if(i.onPointerDown||i.onPointerUp||i.onPointerEnter||i.onPointerExit||i.onPointerClick)return!0},!1)===!0}var kR=Object.defineProperty,MR=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&kR(e,t,n),n};class sh extends E{awake(){ci.createIfNoneExists(this.context)}onEnable(){ci.get(this.context)?.register(this)}onDisable(){ci.get(this.context)?.unregister(this)}}class an extends sh{targets=null;raycastHits=[];ignoreSkinnedMeshes=!1;start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??=new Ts,e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=n=>n instanceof Ss?"continue in children":t?t(n):!0);const i=this.context.physics.raycast(e);return e.testObject=t,i}}MR([u()],an.prototype,"ignoreSkinnedMeshes");class Zu extends an{constructor(){super(),this.ignoreSkinnedMeshes=!0}}class Oa extends sh{static allow=!0;performRaycast(e){if(!Z.active||!Oa.allow||!e?.ray)return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}}class Qf{static getObject(e){const t=e[Fi];return t&&(t.isComponent===!0?e=t.gameObject:e=t),e}static isInteractable(e,t){if(t&&(t.canvasGroup=void 0,t.graphic=void 0),e==null||!e.visible||(e=this.getObject(e),!e.visible))return!1;const i=this.tryFindCanvasGroup(e);if(i?.isCanvasGroup===!0&&(t&&(t.canvasGroup=i),i.blocksRaycasts===!1||i.interactable===!1))return!1;const n=zr(e,s=>{if(s.isGraphic===!0)return s},!1);return t&&n?.isGraphic===!0&&(t.graphic=n),!(n?.raycastTarget===!1||n?.layer===2)}static tryFindCanvasGroup(e){if(!e)return null;const t=zr(e,i=>{if(i.activeAndEnabled){const n=i;if(n.blocksRaycasts!==void 0&&n.interactable!==void 0)return n}},!1);return t!==void 0?t:this.tryFindCanvasGroup(e.parent)}}function Yf(o){return o[Fi]||(o.parent?Yf(o.parent):null)}function ER(o){return o.isUI===!0||typeof o[Fi]=="object"}function Ku(o,e){if(!o)return;const t=o.material;if(t?.isMaterial===!0){const i=o.parent;i&&i.isText,t.side=e.doubleSided??!0?Ii:Cs,t.shadowSide=e.doubleSided?Ii:Cs,o.castShadow=e.castShadows?e.castShadows:!1,o.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const i of o.children)Ku(i,e)}function gl(o,e,t){o[e]===void 0&&console.warn("Field",e,"is undefined on",o);const i=Proxy.revocable(o[e],{set(r,a,l,c){const h=r[a],d=Reflect.set(r,a,l,c);return t(l,h),d}}),n=i.revoke,s=o[e];return i.revoke=()=>{o[e]=s,n()},o[e]=i.proxy,i}const Sx=Symbol("Scheduled action");function RR(o,e,t=xe.OnBeforeRender){let i=o[Sx];i||(i=o[Sx]={});const n=e.name;i[t]||(i[t]={});const s=i[t];if(s[n])return;function*r(){e?.call(o),s[n]=null}const a=o.startCoroutine(r(),t);s[n]=a}const Ds=w("debugeventsystem");var Zf=(o=>(o.BeforeHandleInput="BeforeHandleInput",o.AfterHandleInput="AfterHandleInput",o))(Zf||{});Fg(o=>{ci.createIfNoneExists(o)});class ci extends E{static ensureUpdateMeshUI(e,t,i=!1){rh.update(e,t,i)}static markUIDirty(e){rh.markDirty()}static createIfNoneExists(e){e.scene.getComponent(ci)||e.scene.addComponent(ci)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(ci)}static get instance(){return this.get(z.Current)}raycaster=[];register(e){e&&this.raycaster&&!this.raycaster.includes(e)&&this.raycaster?.push(e)}unregister(e){const t=this.raycaster?.indexOf(e);t!==void 0&&t!==-1&&this.raycaster?.splice(t,1)}get hasActiveUI(){return this.currentActiveMeshUIComponents.length>0}get isHoveringObjects(){return this.hoveredByID.size>0}awake(){this.gameObject!==this.context.scene&&(console.debug(`[Needle Engine] EventSystem is only allowed on the scene root. Disabling EventSystem on '${this.gameObject.name}'`),this.enabled=!1)}start(){this.context.scene.getComponent(sh)||this.context.scene.addComponent(an)}onEnable(){this.context.input.addEventListener(Ae.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Ae.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Ae.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Ae.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Ae.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Ae.PointerMove,this.onPointerEvent)}pressedByID=new Map;hoveredByID=new Map;onBeforeRender(){this.resetMeshUIStates()}onPointerEvent=e=>{if(e===void 0||e.propagationStopped||e.defaultPrevented||e.used)return;const t=new kd(this.context.input,e);this._currentPointerEventName=e.type,t.inputSource=this.context.input,t.isClick=e.isClick,t.isDoubleClick=e.isDoubleClick,t.isDown=e.type==Ae.PointerDown,t.isUp=e.type==Ae.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId);const i=new Ts;e.hasRay?i.ray=e.ray:i.screenPoint=this.context.input.getPointerPositionRC(e.pointerId),i.allowSlowRaycastFallback=e.isClick||e.isDoubleClick;const n=this.performRaycast(i);if(Ds&&(t.isDown?console.log("DOWN",{id:t.pointerId,hits:n.length}):t.isUp&&console.log("UP",{id:t.pointerId,hits:n.length}),t.isClick&&console.log("CLICK",{id:t.pointerId,hits:n.length})),n){for(const r of n)r.event=e,e.intersections.push(r);e.origin.onPointerHits&&e.origin.onPointerHits({sender:this,event:e,hits:n})}Ds&&t.isClick&&ke("EventSystem: "+t.pointerId+" - "+this.context.time.frame+" - Up:"+t.isUp+", Down:"+t.isDown);const s={sender:this,args:t,hasActiveUI:this.currentActiveMeshUIComponents.length>0};this.dispatchEvent(new CustomEvent("BeforeHandleInput",{detail:s})),this.handleIntersections(n,t),this.dispatchEvent(new CustomEvent("AfterHandleInput",{detail:s}))};_sortedHits=[];_testObjectsCache=new Map;_currentlyActiveRaycaster=null;_currentPointerEventName=null;shouldRaycastObject=e=>{const t=e&&"getComponent"in e?e.getComponent(sh):null;if(t&&t!=this._currentlyActiveRaycaster)return!1;let i=null;if(ER(e)&&(i=e[Fi]?.gameObject),this._testObjectsCache.has(e)||i&&this._testObjectsCache.has(i))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let n=Yu(e,this._currentPointerEventName);if(!n&&i&&(n=Yu(i,this._currentPointerEventName)),n){this._testObjectsCache.set(e,!0);for(const s of e.children)this.shouldRaycastObject_AddToYesCache(s);return!0}return this._testObjectsCache.set(e,!1),"continue in children"}};shouldRaycastObject_AddToYesCache(e){this._testObjectsCache.set(e,!0);for(const t of e.children)this.shouldRaycastObject_AddToYesCache(t)}performRaycast(e){if(!this.raycaster)return null;this._testObjectsCache.clear(),this._sortedHits.length=0,e.testObject=this.shouldRaycastObject;for(const t of this.raycaster){if(!t.activeAndEnabled)continue;this._currentlyActiveRaycaster=t;const i=t.performRaycast(e);this._currentlyActiveRaycaster=null,i&&i.length>0&&this._sortedHits.push(...i)}return this._sortedHits.sort((t,i)=>t.distance-i.distance),this._sortedHits}assignHitInformation(e,t){t?(e.intersection=t,e.point=t.point,e.normal=t.normal,e.face=t.face,e.distance=t.distance,e.instanceId=t.instanceId):(e.intersection=void 0,e.point=void 0,e.normal=void 0,e.face=void 0,e.distance=void 0,e.instanceId=void 0)}handleIntersections(e,t){if(e?.length){e=this.sortCandidates(e);for(const n of e){if(t.event.immediatePropagationStopped)return!1;if(this.assignHitInformation(t,n),this.handleEventOnObject(n.object,t))return!0}}this.assignHitInformation(t,e?.[0]),this.invokePointerCapture(t);const i=this.hoveredByID.get(t.pointerId);return i&&this.propagatePointerExit(i.obj,i.data,null),this.hoveredByID.delete(t.pointerId),t.isUp&&(this.pressedByID.get(t.pointerId)?.handlers.forEach(n=>this.invokeOnPointerUp(t,n)),this.pressedByID.delete(t.pointerId)),!1}_sortingBuffer=[];_noDepthTestingResults=[];sortCandidates(e){this._sortingBuffer.length=0,this._noDepthTestingResults.length=0;for(let t=0;t<e.length;t++){const i=e[t],n=i.object;if(n.material&&n.material.depthTest===!1){this._noDepthTestingResults.push(i);continue}this._sortingBuffer.push(i)}for(const t of this._sortingBuffer)this._noDepthTestingResults.push(t);return this._noDepthTestingResults}out={};handleEventOnObject(e,t){if(!this.testIsVisible(e))return t.isClick&&Ds&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return Ds&&console.error("Event without pointer can't be handled",t),!1;t.object=e;const i=e.parent,n=t.isClick??!1;let s=null;if(i&&i.isUI){const c=(t.isPressed||t.isClick)??!1;if(i[Fi]){const h=i[Fi].gameObject;if(h){if(!Qf.isInteractable(h,this.out))return!1;s=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,c),e=h}}}n&&Ds&&console.log(this.context.time.frame,e);const r=this.hoveredByID.get(t.pointerId),a=r?.obj;a!==e&&a&&this.propagatePointerExit(a,r.data,e);const l=this.hoveredByID.get(t.pointerId);if(l?(l.obj=e,l.data=t):this.hoveredByID.set(t.pointerId,{obj:e,data:t}),t.isDown){const c=this.pressedByID.get(t.pointerId);c?(c.obj=e,c.data=t):this.pressedByID.set(t.pointerId,{obj:e,data:t,handlers:new Set})}return(s===null||s.interactable)&&this.handleMainInteraction(e,t,a??null),!0}propagate(e,t){for(;e;)x.foreachComponent(e,i=>{t(i)},!1),e=e.parent}handleMainInteraction(e,t,i){const n=this.pressedByID.get(t.pointerId),s=i!==e;let r=!0;switch(t.event.pointerType){case"mouse":case"touch":const a=this.context.input.getPointerPositionLastFrame(t.pointerId),l=this.context.input.getPointerPosition(t.pointerId);r=a&&!D.approximately(a,l);break}this.propagate(e,a=>{const l=a;l.interactable!==!1&&(!l.activeAndEnabled||!l.enabled||(l.onPointerEnter&&s&&this.handlePointerEnter(l,t),t.isDown&&l.onPointerDown&&(l.onPointerDown(t),n?.handlers.add(l),this.handlePointerCapture(t,l)),l.onPointerMove&&(r&&l.onPointerMove(t),this.handlePointerCapture(t,l)),t.isUp&&(l.onPointerUp&&(this.invokeOnPointerUp(t,l),n?.handlers.delete(l)),l.onPointerExit&&t.event?.pointerType===yu.Touch&&(this.handlePointerExit(l,t),this.hoveredByID.delete(t.pointerId))),t.isClick&&l.onPointerClick&&l.onPointerClick(t)))}),t.isUp&&(n?.handlers.forEach(a=>{this.invokeOnPointerUp(t,a)}),this.pressedByID.delete(t.pointerId))}propagatePointerExit(e,t,i){this.propagate(e,n=>{if(!n.gameObject||n.destroyed)return;const s=n;if(s.onPointerExit||s.onPointerEnter){if(i&&this.isChild(i,n.gameObject))return;this.handlePointerExit(s,t)}})}invokeOnPointerUp(e,t){t.onPointerUp?.call(t,e),this.releasePointerCapture(e,t)}handlePointerEnter(e,t){e.onPointerEnter&&this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!0)&&e.onPointerEnter(t),this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!1)}handlePointerExit(e,t){e.onPointerExit&&this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!0)&&e.onPointerExit(t),this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!1)}updatePointerState(e,t,i,n){let s=e[i];if(n)return s&&s.includes(t)?!1:(s=s||[],s.push(t),e[i]=s,!0);{if(!s||!s.includes(t))return!1;const r=s.indexOf(t);return r!==-1&&s.splice(r,1),!0}}_capturedPointer={};handlePointerCapture(e,t){if(e.z__pointer_ctured){e.z__pointer_ctured=!1;const i=e.pointerId;if(t.onPointerMove){const n=this._capturedPointer[i]||[];n.push(t),this._capturedPointer[i]=n}else A()&&!t.z__warned_no_pointermove&&(t.z__warned_no_pointermove=!0,console.warn("PointerCapture was requested but the component doesn't implement onPointerMove. It will not receive any pointer events"))}else e.z__pointer_cture_rleased&&(e.z__pointer_cture_rleased=!1,this.releasePointerCapture(e,t))}releasePointerCapture(e,t){const i=e.pointerId;if(this._capturedPointer[i]){const n=this._capturedPointer[i].indexOf(t);n!==-1&&(this._capturedPointer[i].splice(n,1),Ds&&console.log("released pointer capture",i,t,this._capturedPointer))}}invokePointerCapture(e){if(e.event.type===Ae.PointerMove){const t=e.pointerId,i=this._capturedPointer[t];if(i){Ds&&console.log("Captured",t,i);for(let n=0;n<i.length;n++){const s=i[n];if(s.destroyed){i.splice(n,1),n--;continue}s.onPointerMove?.call(s,e)}}}}pointerEnterSymbol=Symbol("pointerEnter");pointerExitSymbol=Symbol("pointerExit");isChild(e,t){return!e||!t?!1:e===t?!0:e.parent?this.isChild(e.parent,t):!1}handleMeshUiObjectWithoutShadowDom(e,t){return!e||!e.isUI?!0:this.handleMeshUIIntersection(e,t)}currentActiveMeshUIComponents=[];handleMeshUIIntersection(e,t){const i=rh.updateState(e,t);return i&&this.currentActiveMeshUIComponents.push(i),i!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&rh.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];rh.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?x.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class rh{static lastSelected=null;static lastUpdateFrame=[];static needsUpdate=!1;static markDirty(){this.needsUpdate=!0}static update(e,t,i=!1){if(i){e.update();return}const n=t.time.frameCount;for(const s of this.lastUpdateFrame)if(s.context===t){if(n===s.frame)return;s.frame=n;let r=this.needsUpdate||n<1;s.nextUpdate<=n&&(r=!0),r&&(Ds&&console.log("Update threemeshui"),this.needsUpdate=!1,s.nextUpdate=n+60,e.update());return}this.lastUpdateFrame=[{context:t,frame:n,nextUpdate:n+60}],e.update(),this.needsUpdate=!1}static updateState(e,t){let i=null;if(e&&(i=this.findBlockOrTextInParent(e),i&&i!==this.lastSelected)){if(i.interactable===!1)return null;this.needsUpdate=!0}return i}static resetLastSelected(){const e=this.lastSelected;e&&(this.lastSelected=null,this.resetState(e))}static resetState(e){e&&(this.needsUpdate=!0)}static findBlockOrTextInParent(e){return e?e.isBlock||e.isText?e:this.findBlockOrTextInParent(e.parent):null}}var TR=Object.defineProperty,AR=Object.getOwnPropertyDescriptor,Pe=(o,e,t,i)=>{for(var n=i>1?void 0:i?AR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&TR(e,t,n),n};const Rt=w("debugorbit"),Kf=w("freecam"),IR=w("debugcamerafit"),Ju=w("smoothcam"),LR={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let Jf;class ah extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class me extends E{get isCameraController(){return!0}get controls(){return this._controls}get controllerObject(){return this._cameraObject}onStartInteraction(e){this.controls?.addEventListener("start",e)}autoTarget=!0;autoFit=!1;enableRotate=!0;autoRotate=!1;autoRotateSpeed=1;minAzimuthAngle=1/0;maxAzimuthAngle=1/0;minPolarAngle=0;maxPolarAngle=Math.PI;enableKeys=!1;enableDamping=!0;dampingFactor=.1;enableZoom=!0;minZoom=0;maxZoom=1/0;zoomSpeed=1;zoomToCursor=!1;enablePan=!0;lookAtTarget=null;lockLookAtTarget=!0;lookAtConstraint01=1;lookAtConstraint;allowInterrupt=!0;middleClickToFocus=!0;doubleClickToFocus=!0;clickBackgroundToFitScene=2;get targetElement(){return this._controls?.domElement??this._targetElement}set targetElement(e){this._targetElement=e,this._controls&&this._controls.domElement!==e&&(this._controls.disconnect(),this._controls.domElement=e,this._controls.connect())}_targetElement=null;debugLog=!1;get targetLerpSpeed(){return 5}set targetLerpSpeed(e){this.targetLerpDuration=1/e}get targetLerpDuration(){return this._lookTargetLerpDuration}set targetLerpDuration(e){this._lookTargetLerpDuration=e}_lookTargetLerpDuration=1;targetBounds=null;rotateLeft(e){this._controls?._rotateLeft(e)}rotateUp(e){this._controls?._rotateUp(e)}pan(e,t){this._controls?._pan(e,t)}zoomIn(e){e>0?this._controls?._dollyIn(1-e):e<0&&this._controls?._dollyOut(1+e)}_controls=null;_cameraObject=null;_lookTargetLerpActive=!1;_lookTargetStartPosition=new b;_lookTargetEndPosition=new b;_lookTargetLerp01=0;_cameraLerpActive=!1;_cameraStartPosition=new b;_cameraEndPosition=new b;_cameraLerp01=0;_cameraLerpDuration=0;_fovLerpActive=!1;_fovLerpStartValue=0;_fovLerpEndValue=0;_fovLerp01=0;_fovLerpDuration=0;_inputs=0;_enableTime=0;_startedListeningToKeyEvents=!1;_eventSystem;_afterHandleInputFn;_camera=null;_syncedTransform;_didSetTarget=0;_didApplyLookAtTarget=!1;awake(){Rt&&console.debug("OrbitControls",this),this.lookAtConstraint&&(console.warn("[OrbitControls] lookAtConstraint is deprecated, use lookTarget and lockLookAtTarget instead. This will be removed in a future version."),!this.lookAtTarget&&this.lookAtConstraint.sources?.[0]&&(this.lookAtTarget=this.lookAtConstraint.sources[0],this.lockLookAtTarget=this.lookAtConstraint.locked)),this._didSetTarget=0,this._didApplyLookAtTarget=!1,this._startedListeningToKeyEvents=!1,this.context.domElement.cameraControls===!1&&(this.enabled=!1)}start(){this._eventSystem=ci.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(Zf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){this._controls?.dispose(),this._eventSystem?.removeEventListener(Zf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._didApplyLookAtTarget=!1,this._enableTime=this.context.time.time;const e=x.getComponent(this.gameObject,wi);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof de&&(t=this.gameObject),t&&bg(t,this,!0),!this._controls&&t instanceof M){this._cameraObject=t;const i=this.targetElement??this.context.renderer.domElement,n=t?.quaternion.clone();this._controls=new TP(t,i),t?.quaternion.copy(n),Jf===void 0&&(Jf={...this._controls.keys});const s=ee(t),r=this.gameObject.worldForward,a=s.clone().sub(r.multiplyScalar(2.5));this._controls.target.copy(a)}if(this._controls)if(Kf&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,I.isMobileDevice()&&(this.doubleClickToFocus=!0)),this._controls.addEventListener("start",this.onControlsChangeStarted),this._controls.addEventListener("endMovement",this.onControlsChangeEnded),!this._startedListeningToKeyEvents&&this.enableKeys)this._startedListeningToKeyEvents=!0,this._controls.listenToKeyEvents(this.context.domElement);else try{this._controls.stopListenToKeyEvents()}catch{}this._syncedTransform=x.getComponent(this.gameObject,Ln)??void 0,this.context.pre_render_callbacks.push(this.__onPreRender),this._activePointerEvents=[],this.context.input.addEventListener("pointerdown",this._onPointerDown,{queue:yi.Early}),this.context.input.addEventListener("pointerdown",this._onPointerDownLate,{queue:yi.Late}),this.context.input.addEventListener("pointerup",this._onPointerUp,{queue:yi.Early}),this.context.input.addEventListener("pointerup",this._onPointerUpLate,{queue:yi.Late})}onDisable(){if(this._camera?.threeCamera&&bg(this._camera.threeCamera,this,!1),this._controls){this._controls.enabled=!1,this._controls.autoRotate=!1,this._controls.removeEventListener("start",this.onControlsChangeStarted),this._controls.removeEventListener("endMovement",this.onControlsChangeEnded);try{this._controls.stopListenToKeyEvents()}catch{}this._startedListeningToKeyEvents=!1}this._activePointerEvents.length=0,this.context.input.removeEventListener("pointerdown",this._onPointerDown),this.context.input.removeEventListener("pointerdown",this._onPointerDownLate),this.context.input.removeEventListener("pointerup",this._onPointerUp),this.context.input.removeEventListener("pointerup",this._onPointerUpLate)}_activePointerEvents;_lastTimeClickOnBackground=-1;_clickOnBackgroundCount=0;_onPointerDown=e=>{this._activePointerEvents.push(e)};_onPointerDownLate=e=>{e.used&&this._controls&&(this._controls.enabled=!1)};_onPointerUp=e=>{for(let t=this._activePointerEvents.length-1;t>=0;t--){const i=this._activePointerEvents[t];if(i.pointerId===e.pointerId&&i.button===e.button){this._activePointerEvents.splice(t,1);break}}if(this.clickBackgroundToFitScene>0&&e.isClick&&e.button===0){if(e.hasRay||e.intersections.push(...this.context.physics.raycast()),e.intersections.length<=0){const t=this.context.time.time-this._lastTimeClickOnBackground;this._lastTimeClickOnBackground=this.context.time.time,this.clickBackgroundToFitScene<=1||t<this.clickBackgroundToFitScene*.15?(this._clickOnBackgroundCount+=1,this._clickOnBackgroundCount>=this.clickBackgroundToFitScene-1&&(this.autoRotate=!1,this.fitCamera({objects:this.context.scene,immediate:!1}))):this._clickOnBackgroundCount=0}Rt&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}};_onPointerUpLate=e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()};updateTargetNow(e){Rt&&console.warn("OrbitControls: updateTargetNow is using raycasting to update the target immediately. This can be expensive and should be used with caution.",e);const t=new Eo(this._cameraObject?.worldPosition,this._cameraObject?.worldForward.multiplyScalar(-1)),i=this.context.physics.raycastFromRay(t,e),n=i.length>0?i[0]:void 0;n&&n.distance>this.minZoom&&n.distance<this.maxZoom?(Rt&&B.DrawWireSphere(n.point,.1,16711680,2),this._controls?.target.copy(i[0].point)):Rt&&console.log("OrbitControls: No hit found when updating target",{hits:[...i]})}_orbitStartAngle=0;_zoomStartDistance=0;onControlsChangeStarted=()=>{Rt&&console.debug("OrbitControls: Change started"),this._controls&&(this._orbitStartAngle=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle(),this._zoomStartDistance=this._controls.getDistance()),this._syncedTransform&&this._syncedTransform.requestOwnership()};onControlsChangeEnded=()=>{if(Rt&&console.debug("OrbitControls: Change ended",{autoTarget:this.autoTarget}),this._controls&&this.autoTarget){const e=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()-this._orbitStartAngle;Math.abs(e)<.01?(Rt&&console.debug("OrbitControls: Update target",{deltaAngle:e}),this.updateTargetNow({allowSlowRaycastFallback:!1})):Rt&&console.debug("OrbitControls: No target update",{deltaAngle:e})}};_shouldDisable=!1;afterHandleInput(e){e.detail.args.pointerId===0&&(e.detail.args.isDown?this._controls&&this._eventSystem&&(this._shouldDisable=this._eventSystem.hasActiveUI):(!e.detail.args.isPressed||e.detail.args.isUp)&&(this._shouldDisable=!1))}onPausedChanged(e){this._controls&&e&&(this._controls.enabled=!1)}onBeforeRender(){if(!!this._controls){if(this._cameraObject!==this.context.mainCamera){this._controls.enabled=!1;return}if(this._controls.enabled=!0,(this.context.input.getPointerDown(1)||this.context.input.getPointerDown(2)||this.context.input.mouseWheelChanged||this.context.input.getPointerPressed(0)&&this.context.input.getPointerPositionDelta(0)?.length())&&(this._inputs+=1),this._inputs>0&&this.allowInterrupt&&(this.enableRotate&&(this.autoRotate=!1),this._cameraLerpActive=!1,this._lookTargetLerpActive=!1),this._inputs=0,this.autoTarget&&this._didSetTarget++===0){const e=x.getComponent(this.gameObject,wi);if(e&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const t=ee(e.threeCamera),i=Math.max(.01,t.length()),n=new b(0,0,-i).applyMatrix4(e.threeCamera.matrixWorld);Rt&&B.DrawLine(t,n,5592575,10),this.setLookTargetPosition(n,!0)}if(!this.setLookTargetFromConstraint()){const t=new Ts;t.screenPoint=new K(0,0),t.lineThreshold=.1;const i=this.context.physics.raycast(t);i.length>0&&this.setLookTargetPosition(i[0].point,!0),IR&&console.log("OrbitControls hits",...i)}}if(this.middleClickToFocus&&this.context.input.getPointerClicked(1)&&this.setTargetFromRaycast(),this._lookTargetLerpActive||this._cameraLerpActive||this._fovLerpActive){if(this._cameraLerpActive&&this._cameraObject)if(this._cameraLerp01+=this.context.time.deltaTime/this._cameraLerpDuration,this._cameraLerp01>=1)this._cameraObject.position.copy(this._cameraEndPosition),this._cameraLerpActive=!1,this.dispatchEvent(new ah(this,"camera"));else{const e=D.easeInOutCubic(this._cameraLerp01);this._cameraObject.position.lerpVectors(this._cameraStartPosition,this._cameraEndPosition,e)}if(this._lookTargetLerpActive)if(this._lookTargetLerp01+=this.context.time.deltaTime/this._lookTargetLerpDuration,this._lookTargetLerp01>=1)this.lerpLookTarget(this._lookTargetEndPosition,this._lookTargetEndPosition,1),this._lookTargetLerpActive=!1,this.dispatchEvent(new ah(this,"lookat"));else{const e=D.easeInOutCubic(this._lookTargetLerp01);this.lerpLookTarget(this._lookTargetStartPosition,this._lookTargetEndPosition,e)}if(this._fovLerpActive&&this._cameraObject){const e=this._cameraObject;if(this._fovLerp01+=this.context.time.deltaTime/this._fovLerpDuration,this._fovLerp01>=1)e.fov=this._fovLerpEndValue,this._fovLerpActive=!1;else{const t=D.easeInOutCubic(this._fovLerp01);e.fov=D.lerp(this._fovLerpStartValue,this._fovLerpEndValue,t)}e.updateProjectionMatrix()}}if(this.targetBounds){const e=this._controls.target,t=this.targetBounds.worldPosition,i=F(this.targetBounds.worldScale).multiplyScalar(.5),n=F(t).sub(i),s=F(t).add(i),r=F(this._controls.target).clamp(n,s),a=.1;e.lerp(r,this.context.time.deltaTime/a),this._lookTargetLerpActive&&this._lookTargetEndPosition.lerp(r,this.context.time.deltaTime/(a*5)),Rt&&B.DrawWireBox(t,i.multiplyScalar(2),16755200)}if(this._controls){this.debugLog&&(this._controls.domElement=this.context.renderer.domElement);const e=1/(this.context.focusRectSettings?.zoom||1);if(this._controls.enabled=!this._shouldDisable&&this._camera===this.context.mainCameraComponent&&!this.context.isInXR&&!this._activePointerEvents.some(t=>t.used),this._controls.keys=this.enableKeys?Jf:LR,this._controls.autoRotate=this.autoRotate,this._controls.autoRotateSpeed=this.autoRotateSpeed,this._controls.enableZoom=this.enableZoom,this._controls.zoomSpeed=this.zoomSpeed,this._controls.zoomToCursor=this.zoomToCursor,this._controls.enableDamping=this.enableDamping,this._controls.dampingFactor=this.dampingFactor,this._controls.enablePan=this.enablePan,this._controls.panSpeed=e,this._controls.enableRotate=this.enableRotate,this._controls.minAzimuthAngle=this.minAzimuthAngle,this._controls.maxAzimuthAngle=this.maxAzimuthAngle,this._controls.minPolarAngle=this.minPolarAngle,this._controls.maxPolarAngle=this.maxPolarAngle,Kf||(this._camera?.threeCamera?.type==="PerspectiveCamera"?(this._controls.minDistance=this.minZoom,this._controls.maxDistance=this.maxZoom,this._controls.minZoom=0,this._controls.maxZoom=1/0):(this._controls.minDistance=0,this._controls.maxDistance=1/0,this._controls.minZoom=this.minZoom,this._controls.maxZoom=this.maxZoom)),typeof Ju=="number"||Ju===!0){this._controls.enableDamping=!0;const t=typeof Ju=="number"?Ju:.99;this._controls.dampingFactor=Math.max(.001,1-Math.min(1,t))}this.allowInterrupt||(this._lookTargetLerpActive&&(this._controls.enablePan=!1),this._cameraLerpActive&&(this._controls.enableRotate=!1,this._controls.autoRotate=!1),(this._lookTargetLerpActive||this._cameraLerpActive)&&(this._controls.enableZoom=!1)),this.context.isInXR||(!Kf&&this.lookAtTarget&&!this._lookTargetLerpActive&&(this.lockLookAtTarget?this.setLookTargetFromConstraint(this.lookAtConstraint01):this._didApplyLookAtTarget||(this._didApplyLookAtTarget=!0,this.setLookTargetFromConstraint(1))),this._controls.update(this.context.time.deltaTime),Rt&&B.DrawWireSphere(this._controls.target,.1,65280))}}}__onPreRender=()=>{const e=this.context.pre_render_callbacks.indexOf(this.__onPreRender);e>=0&&this.context.pre_render_callbacks.splice(e,1),this.autoFit&&(this.autoFit=!1,this.fitCamera({centerCamera:"y",immediate:!0,objects:this.scene.children}))};setCameraAndLookTarget(e,t=!1){if(!e)return(A()||Rt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof M)&&!(e instanceof wi))return(A()||Rt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof wi&&(e=e.gameObject);const i=e.worldPosition,n=e.worldForward;e instanceof PC&&(Rt&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),n.multiplyScalar(-1));const s=new Eo(i,n);return Rt&&B.DrawRay(s.origin,s.direction,16711680,10),this.setTargetFromRaycast(s,t)||this.setLookTargetPosition(s.at(2,F()),t),this.setCameraTargetPosition(i,t),!0}setCameraTargetPosition(e,t=!1){e&&(e instanceof M&&(e=ee(e)),this._cameraEndPosition||(this._cameraEndPosition=new b),this._cameraEndPosition.copy(e),t===!0?(this._cameraLerpActive=!1,this._cameraObject&&this._cameraObject.position.copy(this._cameraEndPosition)):this._cameraObject&&(this._cameraLerpActive=!0,this._cameraLerp01=0,this._cameraStartPosition.copy(this._cameraObject?.position),typeof t=="number"?this._cameraLerpDuration=t:this._cameraLerpDuration=this.targetLerpDuration))}get cameraLerpActive(){return this._cameraLerpActive}stopCameraLerp(){this._cameraLerpActive=!1}setFieldOfView(e,t=!1){if(!this._controls||typeof e!="number")return;const i=this._camera?.threeCamera;i&&(t===!0?i.fov=e:(this._fovLerpActive=!0,this._fovLerp01=0,this._fovLerpStartValue=i.fov,this._fovLerpEndValue=e,typeof t=="number"?this._fovLerpDuration=t:this._fovLerpDuration=this.targetLerpDuration))}setLookTargetPosition(e=null,t=!1){this._controls&&e&&(e instanceof M&&(e=ee(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,Rt&&(console.warn("OrbitControls: setLookTargetPosition",e,t),B.DrawWireSphere(this._lookTargetEndPosition,.2,16711680,2)),t===!0?this.lerpLookTarget(this._lookTargetEndPosition,this._lookTargetEndPosition,1):(this._lookTargetLerpActive=!0,this._lookTargetLerp01=0,this._lookTargetStartPosition.copy(this._controls.target),typeof t=="number"?this._lookTargetLerpDuration=t:this._lookTargetLerpDuration=this.targetLerpDuration))}get lookTargetLerpActive(){return this._lookTargetLerpActive}stopLookTargetLerp(){this._lookTargetLerpActive=!1}setLookTargetFromConstraint(e=1){return!this._controls||!this.lookAtTarget?!1:(this.lookAtTarget.getWorldPosition(this._lookTargetEndPosition),this.lerpLookTarget(this._controls.target,this._lookTargetEndPosition,e),!0)}lerpLookTarget(e,t,i){this._controls&&(i>=1?this._controls.target.copy(t):this._controls.target.lerpVectors(e,t,i),this.lookAtTarget&&this.lockLookAtTarget&&(this.lookAtTarget.worldPosition=this._controls.target))}setTargetFromRaycast(e,t=!1){if(!this.controls)return!1;const i=e?this.context.physics.raycastFromRay(e):this.context.physics.raycast();for(const n of i)if(n.distance>0&&x.isActiveInHierarchy(n.object)){const s=Yf(n.object);if(s&&s.canvas?.screenspace)break;return this.setLookTargetPosition(n.point,t),!0}return!1}fitCamera(e,t){let i;if(Array.isArray(e)||e&&"type"in e?i=e:e&&typeof e=="object"&&!(e instanceof M)&&!Array.isArray(e)&&(t=e,i=t.objects),i&&!Array.isArray(i)&&(i=[i]),(!Array.isArray(i)||i&&i.length<=0)&&(i=this.context.scene.children),!Array.isArray(i)||i.length<=0){console.warn("No objects to fit camera to...");return}const n=vx({objects:[...i],...t,autoApply:!1,context:this.context,camera:this._cameraObject,currentZoom:this._controls?.getDistance()||void 0,minZoom:this.minZoom,maxZoom:this.maxZoom});n&&(this.setLookTargetPosition(n.lookAt,t?.immediate||!1),this.setCameraTargetPosition(n.position,t?.immediate||!1),this.setFieldOfView(t?.fov,t?.immediate||!1),this.onBeforeRender())}_haveAttachedKeyboardEvents=!1}Pe([u()],me.prototype,"autoTarget",2),Pe([u()],me.prototype,"autoFit",2),Pe([u()],me.prototype,"enableRotate",2),Pe([u()],me.prototype,"autoRotate",2),Pe([u()],me.prototype,"autoRotateSpeed",2),Pe([u()],me.prototype,"minAzimuthAngle",2),Pe([u()],me.prototype,"maxAzimuthAngle",2),Pe([u()],me.prototype,"minPolarAngle",2),Pe([u()],me.prototype,"maxPolarAngle",2),Pe([u()],me.prototype,"enableKeys",2),Pe([u()],me.prototype,"enableDamping",2),Pe([u()],me.prototype,"dampingFactor",2),Pe([u()],me.prototype,"enableZoom",2),Pe([u()],me.prototype,"minZoom",2),Pe([u()],me.prototype,"maxZoom",2),Pe([u()],me.prototype,"zoomSpeed",2),Pe([u()],me.prototype,"enablePan",2),Pe([u(M)],me.prototype,"lookAtTarget",2),Pe([u()],me.prototype,"lockLookAtTarget",2),Pe([u()],me.prototype,"lookAtConstraint01",2),Pe([u(Gr)],me.prototype,"lookAtConstraint",2),Pe([u()],me.prototype,"allowInterrupt",2),Pe([u()],me.prototype,"middleClickToFocus",2),Pe([u()],me.prototype,"doubleClickToFocus",2),Pe([u()],me.prototype,"clickBackgroundToFitScene",2),Pe([u()],me.prototype,"targetLerpDuration",1),Pe([u(M)],me.prototype,"targetBounds",2);var DR=Object.defineProperty,jR=Object.getOwnPropertyDescriptor,ii=(o,e,t,i)=>{for(var n=i>1?void 0:i?jR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&DR(e,t,n),n},Xr=(o=>(o[o.None=0]="None",o[o.Skybox=1]="Skybox",o[o.SolidColor=2]="SolidColor",o[o.Uninitialized=4]="Uninitialized",o))(Xr||{});const js=w("debugcam"),Cx=w("debugscreenpointtoray"),$t=class wd extends E{get isCamera(){return!0}get aspect(){return this._cam instanceof de?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(e){this._cam instanceof de&&this._cam.aspect!==e&&(this._cam.aspect=e,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof de?this._cam.fov:this._fov}set fieldOfView(e){const t=this.fieldOfView!=e;if(this._fov=e,t&&this._cam&&this._cam instanceof de){if(this._fov===void 0){console.warn("Can not set undefined fov on PerspectiveCamera");return}this._cam.fov=this._fov,this._cam.updateProjectionMatrix()}}get nearClipPlane(){return this._nearClipPlane}set nearClipPlane(e){const t=this._nearClipPlane!=e;this._nearClipPlane=e,this._cam&&(t||this._cam.near!=e)&&(this._cam.near=e,this._cam.updateProjectionMatrix())}_nearClipPlane=.1;get farClipPlane(){return this._farClipPlane}set farClipPlane(e){const t=this._farClipPlane!=e;this._farClipPlane=e,this._cam&&(t||this._cam.far!=e)&&(this._cam.far=e,this._cam.updateProjectionMatrix())}_farClipPlane=1e3;applyClippingPlane(){this._cam&&(this._cam.near=this._nearClipPlane,this._cam.far=this._farClipPlane,this._cam.updateProjectionMatrix())}get clearFlags(){return this._clearFlags}set clearFlags(e){if(typeof e=="string")switch(e){case"skybox":e=1;break;case"solidcolor":e=2;break;default:e=0;break}e!==this._clearFlags&&(this._clearFlags=e,this.applyClearFlagsIfIsActiveCamera())}orthographic=!1;orthographicSize=5;ARBackgroundAlpha=0;set cullingMask(e){this._cullingMask=e,this._cam&&(this._cam.layers.mask=e)}get cullingMask(){return this._cam?this._cam.layers.mask:this._cullingMask}_cullingMask=4294967295;set cullingLayer(e){this.cullingMask=(1<<e|0)>>>0}set backgroundBlurriness(e){e!==this._backgroundBlurriness&&(e===void 0?this._backgroundBlurriness=void 0:this._backgroundBlurriness=Math.min(Math.max(e,0),1),this.applyClearFlagsIfIsActiveCamera())}get backgroundBlurriness(){return this._backgroundBlurriness}_backgroundBlurriness=void 0;set backgroundIntensity(e){e!==this._backgroundIntensity&&(e===void 0?this._backgroundIntensity=void 0:this._backgroundIntensity=Math.min(Math.max(e,0),10),this.applyClearFlagsIfIsActiveCamera())}get backgroundIntensity(){return this._backgroundIntensity}_backgroundIntensity=void 0;set backgroundRotation(e){e!==this._backgroundRotation&&(e===void 0?this._backgroundRotation=void 0:this._backgroundRotation=e,this.applyClearFlagsIfIsActiveCamera())}get backgroundRotation(){return this._backgroundRotation}_backgroundRotation=void 0;set environmentIntensity(e){this._environmentIntensity=e}get environmentIntensity(){return this._environmentIntensity}_environmentIntensity=void 0;get backgroundColor(){return this._backgroundColor??null}set backgroundColor(e){e&&(this._backgroundColor||(this._backgroundColor=new se(1,1,1,1)),this._backgroundColor.copy(e),(!("alpha"in e)||e.alpha===void 0)&&(this._backgroundColor.alpha=1),this.applyClearFlagsIfIsActiveCamera())}set targetTexture(e){this._targetTexture=e}get targetTexture(){return this._targetTexture}_targetTexture=null;_backgroundColor;_fov;_cam=null;_clearFlags=2;_skybox;get cam(){return this.threeCamera}get threeCamera(){return this.activeAndEnabled&&this.buildCamera(),this._cam}static _origin=new b;static _direction=new b;screenPointToRay(e,t,i){const n=this.threeCamera,s=wd._origin;s.set(e,t,-1),this.context.input.convertScreenspaceToRaycastSpace(s),Cx&&console.log("screenPointToRay",e.toFixed(2),t.toFixed(2),"now:",s.x.toFixed(2),s.y.toFixed(2),"isInXR:"+this.context.isInXR),s.z=-1,s.unproject(n);const r=wd._direction.set(s.x,s.y,s.z),a=ee(n);return r.sub(a),r.normalize(),i?(i.set(a,r),i):new Eo(a.clone(),r.clone())}_frustum;getFrustum(){return this._frustum||(this._frustum=new Bb,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new Bb),this._frustum.setFromProjectionMatrix(this.getProjectionScreenMatrix(this._projScreenMatrix,!0),this.context.renderer.coordinateSystem)}getProjectionScreenMatrix(e,t){return t&&this._projScreenMatrix.multiplyMatrices(this.threeCamera.projectionMatrix,this.threeCamera.matrixWorldInverse),e===this._projScreenMatrix?e:e.copy(this._projScreenMatrix)}_projScreenMatrix=new J;awake(){Cx&&window.addEventListener("pointerdown",e=>{const t=e.clientX,i=e.clientY;console.log("touch",t.toFixed(2),i.toFixed(2));const n=this.screenPointToRay(t,i),s="#"+Math.floor(Math.random()*16777215).toString(16);B.DrawRay(n.origin,n.direction,s,10)})}onEnable(){js&&console.log(`Camera enabled: "${this.name}". ClearFlags=${Xr[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),FR(this)),this.applyClearFlagsIfIsActiveCamera({applySkybox:!0})}onDisable(){this.context.removeCamera(this)}onLeaveXR(e){this.fieldOfView=this._fov}onBeforeRender(){if(this._cam&&(this._frustum&&this.updateFrustum(),this._clearFlags===2&&this.applyClearFlagsIfIsActiveCamera(),this._targetTexture)){this.context.isManagedExternally&&(this._warnedAboutExternalRenderer||(this._warnedAboutExternalRenderer=!0,console.warn("Rendering with external renderer is not supported yet. This may not work or throw errors. Please remove the the target texture from your camera: "+this.name,this.targetTexture))),this.context.composer;const e=this.context.renderer;if(e){const t=this.context.mainCameraComponent;this.applyClearFlags(),this._targetTexture.render(this.context.scene,this._cam,e),t?.applyClearFlags()}}}buildCamera(){if(this._cam)return;const e=this.gameObject.isCamera;let t=null;if(e?(t=this.gameObject,t?.layers.enableAll(),t instanceof de&&(this._fov=t.fov)):t=this.gameObject.children[0],t&&t.isCamera)t instanceof de&&(this._fov&&(t.fov=this._fov),t.near=this._nearClipPlane,t.far=this._farClipPlane,t.updateProjectionMatrix());else if(!this.orthographic)t=new de(this.fieldOfView,window.innerWidth/window.innerHeight,this._nearClipPlane,this._farClipPlane),this.fieldOfView&&(t.fov=this.fieldOfView),this.gameObject.add(t);else{const i=this.orthographicSize*100;t=new Ad(window.innerWidth/-i,window.innerWidth/i,window.innerHeight/i,window.innerHeight/-i,this._nearClipPlane,this._farClipPlane),this.gameObject.add(t)}this._cam=t,this._cam.layers.mask=this._cullingMask,this.tag=="MainCamera"&&this.context.setCurrentCamera(this)}applyClearFlagsIfIsActiveCamera(e){this.context.mainCameraComponent===this&&this.applyClearFlags(e)}applyClearFlags(e){if(!this._cam){js&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this.fieldOfView,js){const i=`[Camera] Apply ClearFlags: ${Xr[this._clearFlags]} - "${this.name}"`;console.debug(i)}const t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color");switch(this._clearFlags){case 0:return;case 1:if(wd.backgroundShouldBeTransparent(this.context)&&(!this.ARBackgroundAlpha||this.ARBackgroundAlpha<.001)){this.context.scene.background=null,this.context.renderer.setClearColor(0,0);return}(!this.scene.background||!this._skybox||e?.applySkybox===!0)&&this.applySceneSkybox(),this._backgroundBlurriness!==void 0&&!this.context.domElement.getAttribute("background-blurriness")?this.context.scene.backgroundBlurriness=this._backgroundBlurriness:js&&console.warn(`Camera "${this.name}" has no background blurriness`),this._backgroundIntensity!==void 0&&!this.context.domElement.getAttribute("background-intensity")&&(this.context.scene.backgroundIntensity=this._backgroundIntensity),this._backgroundRotation!==void 0&&!this.context.domElement.getAttribute("background-rotation")?this.context.scene.backgroundRotation=this._backgroundRotation:js&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let i=this._backgroundColor.alpha;wd.backgroundShouldBeTransparent(this.context)&&(i=this.ARBackgroundAlpha??0),this.context.scene.background=null,this.context.xr?.isVR?this.context.renderer.setClearColor(R_(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,i)}else this._backgroundColor||js&&console.warn(`[Camera] has no background color "${this.name}" `);break;case 4:t||(this.context.scene.background=null,this.context.renderer.setClearColor(0,0));break}}applySceneSkybox(){this._skybox||(this._skybox=new BR(this)),this._skybox.apply()}static backgroundShouldBeTransparent(e){const t=e.renderer.xr?.getSession();if(!t)return!1;if(typeof t._transparent=="boolean")return t._transparent;const i=t.environmentBlendMode;js&&ke("Environment blend mode: "+i+" on "+navigator.userAgent);let n=i==="additive"||i==="alpha-blend";if(e.isInAR&&i==="opaque"){if(navigator.userAgent?.includes("OculusBrowser"))n=!0;else if(navigator.userAgent?.includes("Mozilla")&&navigator.userAgent?.includes("Mobile WebXRViewer/v2"))n=!0;else if(I.isNeedleAppClip())return!0}return t._transparent=n,n}};ii([u()],$t.prototype,"aspect",1),ii([u()],$t.prototype,"fieldOfView",1),ii([u()],$t.prototype,"nearClipPlane",1),ii([u()],$t.prototype,"farClipPlane",1),ii([u()],$t.prototype,"clearFlags",1),ii([u()],$t.prototype,"orthographic",2),ii([u()],$t.prototype,"orthographicSize",2),ii([u()],$t.prototype,"ARBackgroundAlpha",2),ii([u()],$t.prototype,"cullingMask",1),ii([u()],$t.prototype,"backgroundBlurriness",1),ii([u()],$t.prototype,"backgroundIntensity",1),ii([u(ht)],$t.prototype,"backgroundRotation",1),ii([u()],$t.prototype,"environmentIntensity",1),ii([u(se)],$t.prototype,"backgroundColor",1),ii([u(ko)],$t.prototype,"targetTexture",1);let wi=$t;class BR{_camera;_skybox;get context(){return this._camera?.context}constructor(e){this._camera=e}apply(){if(this._skybox=this.context.lightmaps.tryGetSkybox(this._camera.sourceId),!this._skybox)this._did_log_failed_to_find_skybox||(this._did_log_failed_to_find_skybox=!0,console.warn(`Camera "${this._camera.name}" has no skybox texture. ${this._camera.sourceId}`));else if(this.context.scene.background!==this._skybox){const e=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color");js&&console.debug(`[Camera] Apply Skybox ${this._skybox?.name} ${e} - "${this._camera.name}"`),e?.length||(this._skybox.mapping!==Ro&&(this._skybox.mapping=Ao),this.context.scene.background=this._skybox)}}}function FR(o){w("freecam")&&o.context.mainCameraComponent===o&&x.getOrAddComponent(o.gameObject,me)}class Go extends E{get listener(){return this._listener==null&&(this._listener=new OC),this._listener}_listener=null;onEnable(){Gn.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){Gn.unregisterWaitForInteraction(this.onInteraction),this.removeListenerIfItExists()}onInteraction=()=>{this.destroyed||this.listener==null||this.addListenerIfItExists()};addListenerIfItExists(){const e=this._listener;if(!e||e?.parent)return;const t=this.context.mainCameraComponent||x.getComponentInParent(this.gameObject,wi);t?.threeCamera?t.threeCamera.add(e):this.gameObject.add(e),e.filter?(e.gain.connect(e.filter),e.filter.connect(e.context.destination)):e.gain.connect(e.context.destination)}removeListenerIfItExists(){const e=this._listener;e&&(e.removeFromParent(),e.filter&&e.filter.disconnect(),e.gain&&e.gain.disconnect())}}var UR=Object.defineProperty,zR=Object.getOwnPropertyDescriptor,Dn=(o,e,t,i)=>{for(var n=i>1?void 0:i?zR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&UR(e,t,n),n};const Tt=w("debugaudio"),ln=class ur extends E{static get userInteractionRegistered(){return Gn.userInteractionRegistered}static registerWaitForAllowAudio(e){Gn.registerWaitForInteraction(e)}clip="";playOnAwake=!1;preload=!0;playInBackground=!0;get isPlaying(){return this.sound?.isPlaying??!1}get duration(){return this.sound?.buffer?.duration}get time01(){const e=this.duration;return e&&this.sound?this.sound?.context.currentTime/e:0}set time01(e){const t=this.duration;t&&this.sound&&(this.time=e*t)}get time(){return this.sound?.source?this.sound.source?.context.currentTime-this._lastContextTime+this.sound.offset:0}set time(e){if(this.sound){if(e===this.sound.offset)return;const t=this.isPlaying;this.stop(),this.sound.offset=e,t&&this.play()}}get loop(){return this.sound&&(this._loop=this.sound.getLoop()),this._loop}set loop(e){this._loop=e,this.sound&&this.sound.setLoop(e)}get spatialBlend(){return this._spatialBlend}set spatialBlend(e){e!==this._spatialBlend&&(this._spatialBlend=e,this._needUpdateSpatialDistanceSettings=!0)}get minDistance(){return this._minDistance}set minDistance(e){this._minDistance!==e&&(this._minDistance=e,this._needUpdateSpatialDistanceSettings=!0)}get maxDistance(){return this._maxDistance}set maxDistance(e){this._maxDistance!==e&&(this._maxDistance=e,this._needUpdateSpatialDistanceSettings=!0)}_spatialBlend=0;_minDistance=1;_maxDistance=100;get volume(){return this._volume}set volume(e){this._volume=e,this.sound&&!this.context.application.muted&&(Tt&&console.log(this.name,"audio set volume",e),this.sound.setVolume(e))}_volume=1;set pitch(e){this.sound&&this.sound.setPlaybackRate(e)}get pitch(){return this.sound?this.sound.getPlaybackRate():1}rollOffMode=0;_loop=!1;sound=null;helper=null;wasPlaying=!1;audioLoader=null;shouldPlay=!1;_lastClipStartedLoading=null;_audioElement=null;get Sound(){if(!this.sound&&ur.userInteractionRegistered){let e=this.gameObject.getComponent(Go)??this.context.mainCamera.getComponent(Go)??pl(Go,this.context,!1);!e&&this.context.mainCamera&&(e=this.context.mainCamera.addComponent(Go)),e?.listener?(this.sound=new kC(e.listener),this.gameObject?.add(this.sound)):Tt&&console.warn("No audio listener found in scene - can not play audio")}return this.sound}get ShouldPlay(){return this.shouldPlay}get audioContext(){return this.sound?.context}awake(){Tt&&console.log("[AudioSource]",this),this.audioLoader=new $m,this.playOnAwake&&(this.shouldPlay=!0),this.preload&&typeof this.clip=="string"&&this.audioLoader.load(this.clip,this.createAudio,()=>{},console.error)}onEnable(){this.sound&&this.gameObject.add(this.sound),ur.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():ur.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(ef.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(ef.MuteChanged,this.onApplicationMuteChanged),this.pause()}onVisibilityChanged=()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||I.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":Tt&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,ur.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&ur.userInteractionRegistered&&this.wasPlaying&&this.play();break}};onApplicationMuteChanged=()=>{this.context.application.muted?this.sound?.setVolume(0):this.sound?.setVolume(this.volume)};createAudio=e=>{if(this.destroyed){Tt&&console.warn("AudioSource destroyed, not creating audio",this.name);return}Tt&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){Tt&&console.warn("Failed getting sound?",this.name);return}t.isPlaying&&t.stop(),e&&t.setBuffer(e),t.loop=this._loop,this.context.application.muted?t.setVolume(0):t.setVolume(this.volume),t.autoplay=this.shouldPlay&&ur.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),ur.registerWaitForAllowAudio(this.__onAllowAudioCallback)};__onAllowAudioCallback=()=>{this.shouldPlay&&this.play()};applySpatialDistanceSettings(){const e=this.sound;if(!e)return;this._needUpdateSpatialDistanceSettings=!1;const t=D.lerp(10*this._maxDistance/Math.max(1e-4,this.spatialBlend),this._minDistance,this.spatialBlend);switch(Tt&&console.log(this.name,this._minDistance,this._maxDistance,this.spatialBlend,"Ref distance="+t),e.setRefDistance(t),e.setMaxDistance(Math.max(.01,this._maxDistance)),this.rollOffMode){case 0:e.setDistanceModel("exponential");break;case 1:e.setDistanceModel("linear");break;case 2:console.warn("Custom rolloff for AudioSource is not supported: "+this.name);break}this.spatialBlend>0?Tt&&!this.helper&&(this.helper=new AP(e,e.getRefDistance()),e.add(this.helper)):this.helper&&this.helper.parent&&this.helper.removeFromParent()}async onNewClip(e){if(e&&(this.clip=e),typeof e=="string")if(Tt&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new $m),this.shouldPlay=!0,this._lastClipStartedLoading===e){Tt&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,Tt&&console.log("load audio",e);const t=await this.audioLoader.loadAsync(e).catch(console.error);if(this.destroyed)return;this._lastClipStartedLoading===e&&(this._lastClipStartedLoading=null),t&&this.createAudio(t)}else console.warn("Unsupported audio clip type",e);else this.shouldPlay=!0,this.createAudio()}play(e=void 0){!e&&this.clip&&(e=this.clip),e!==void 0&&typeof e!="string"&&!(e instanceof MediaStream)&&(A()&&console.warn("Called play on AudioSource with unknown argument type:",e+`
|
|
976
|
+
Using the assigned clip instead:`,this.clip),e=this.clip);let t=!this.sound||e&&e!==this.clip;if(typeof e=="string"&&!this.audioLoader&&(t=!0),(e instanceof MediaStream||typeof e=="string")&&(this.clip=e),t){this.shouldPlay=!0,this.onNewClip(e);return}if(this.shouldPlay=!0,this._hasEnded=!1,Tt&&console.log("play",this.sound?.getVolume(),this.sound),this.sound&&!this.sound.isPlaying){const i=this.context.application.muted;i&&this.sound.setVolume(0),this.gameObject?.add(this.sound),this.clip instanceof MediaStream?(this.sound.setMediaStreamSource(this.clip),this._audioElement||(this._audioElement=document.createElement("audio"),this._audioElement.style.display="none"),this._audioElement.parentNode||this.context.domElement.shadowRoot?.append(this._audioElement),this._audioElement.srcObject=this.clip,this._audioElement.autoplay=!1):(this._audioElement&&this._audioElement.remove(),this.sound.play(i?.1:0))}}pause(){Tt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.isPlaying&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,this.sound.pause()),this._audioElement?.remove()}stop(){Tt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,Tt&&console.log(this._lastContextTime),this.sound.stop()),this._audioElement?.remove()}_lastContextTime=0;_hasEnded=!0;_needUpdateSpatialDistanceSettings=!1;update(){this.helper&&(this.isPlaying&&this.helper.update(),this.helper.visible=this.isPlaying),this._needUpdateSpatialDistanceSettings&&this.applySpatialDistanceSettings(),this.sound&&!this.sound.isPlaying&&this.shouldPlay&&!this._hasEnded&&(this._hasEnded=!0,Tt&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};Dn([u(URL)],ln.prototype,"clip",2),Dn([u()],ln.prototype,"playOnAwake",2),Dn([u()],ln.prototype,"preload",2),Dn([u()],ln.prototype,"playInBackground",2),Dn([u()],ln.prototype,"loop",1),Dn([u()],ln.prototype,"spatialBlend",1),Dn([u()],ln.prototype,"minDistance",1),Dn([u()],ln.prototype,"maxDistance",1),Dn([u()],ln.prototype,"volume",1),Dn([u()],ln.prototype,"pitch",1),Dn([u()],ln.prototype,"rollOffMode",2);let Ni=ln;var NR=Object.defineProperty,ep=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&NR(e,t,n),n};const WR=w("debugsignals");class tp{guid}ep([u()],tp.prototype,"guid");class lh{signal;reaction}ep([u(tp)],lh.prototype,"signal"),ep([u(ae)],lh.prototype,"reaction");const Px=class ms extends E{static receivers={};static invoke(e){if(ms.receivers[e]){const t=ms.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){WR&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)ms.receivers[e.signal.guid]||(ms.receivers[e.signal.guid]=[]),ms.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(ms.receivers[e.signal.guid]){const t=ms.receivers[e.signal.guid].indexOf(this);t>=0&&ms.receivers[e.signal.guid].splice(t,1)}}}invoke(e){if(!this.events||!Array.isArray(this.events))return;const t=typeof e=="object"?e.guid:e;for(const i of this.events)if(i.signal.guid===t)try{if(i.reaction){if(!i.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",i,this);continue}}else{console.warn("Missing reaction for signal",i,this);continue}i.reaction.invoke()}catch(n){console.error(n)}}};ep([u(lh)],Px.prototype,"events");let ch=Px;var Wi=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(Wi||{}),ao=(o=>(o[o.None=0]="None",o[o.Hold=1]="Hold",o[o.Loop=2]="Loop",o[o.PingPong=3]="PingPong",o[o.Continue=4]="Continue",o))(ao||{}),ey=(o=>(o.Signal="SignalEmitter",o))(ey||{});const lo=w("debugtimeline");class fl{director;track;get muted(){return this.track.muted}set muted(e){e!==this.track.muted&&(this.track.muted=e,this.onMuteChanged?.call(this))}*forEachClip(e=!1){if(this.track?.clips)if(e)for(let t=this.track.clips.length-1;t>=0;t--)yield this.track.clips[t];else for(const t of this.track.clips)yield t}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,i,n=!0){if(t<0||t>=i.length)return 0;const s=i[t];if(n||e>=s.start&&e<=s.end){let r=1;if(s.easeInDuration>0){const a=Math.min((e-s.start)/s.easeInDuration,1);r*=a}if(s.easeOutDuration>0){const a=Math.min((s.end-e)/s.easeOutDuration,1);r*=a}return r}return 0}}class VR{clip;rootPositionOffset;rootQuaternionOffset;get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}rootStartPosition;rootEndPosition;rootStartQuaternion;rootEndQuaternion;constructor(e){const t=e.getClip();this.clip=t;const i=e.getRoot(),n=i.name+".position",s=i.name+".quaternion";lo&&console.log(t.name,t.tracks,n);for(const r of t.tracks)if(!(r.times.length<=0)){if(r.name.endsWith(n))this.rootStartPosition=new b().fromArray(r.values,0),this.rootEndPosition=new b().fromArray(r.values,r.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),lo&&console.log(this.rootPositionOffset);else if(r.name.endsWith(s)&&(this.rootStartQuaternion=new N().fromArray(r.values,0),this.rootEndQuaternion=new N().fromArray(r.values,r.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),lo)){const a=new ht().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class hh extends fl{models=[];trackOffset;target;mixer;clips=[];actions=[];weight=1;_actionOffsets=[];_didBind=!1;_animator=null;onDisable(){this.mixer?.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&ux(this._animator.gameObject,this,this.director.enabled&&this.director.weight>0)}createHooks(e,t){if(t.tracks?.length<=0){console.warn("No tracks in AnimationClip",t);return}let i=!1,n=!1;const s=t.tracks.find(r=>r.name.includes(".position")||r.name.includes(".quaternion"))?.name.split(".");if(s){const r=s[s.length-2],a=r+".position",l=r+".quaternion";for(const c of t.tracks)!i&&c.name.endsWith(a)?(i=!0,this.createPositionInterpolant(t,e,c)):!n&&c.name.endsWith(l)&&(n=!0,this.createRotationInterpolant(t,e,c))}if(!i||!n){const r=this.mixer?.getRoot(),a=t.tracks[0],l=a.name.lastIndexOf("."),c=a.name.substring(0,l),h=c.substring(c.lastIndexOf(".")+1),d=r.getObjectByName(h);if(d)if(i){if(!n){const p=t.tracks[0].name.substring(0,l)+".quaternion";lo&&console.warn("Create quaternion track",h,d);const m=new EC(p,[0,t.duration],[0,0,0,1,0,0,0,1]);t.tracks.push(m),this.createRotationInterpolant(t,e,m)}}else{const p=c+".position";lo&&console.warn("Create position track",h,d);const m=new MC(p,[0,t.duration],[0,0,0,0,0,0]);t.tracks.push(m),this.createPositionInterpolant(t,e,m)}}}bind(){if(!this._didBind){this._didBind=!0,lo&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new VR(e);this._actionOffsets.push(t)}this.target&&(this._animator=x.getComponent(this.target,wt)??null,this._animator&&ux(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,i=t.position,n=t.rotation;i&&i.x!==void 0&&(i.isVector3||(t.position=new b(i.x,i.y,i.z)),n.isQuaternion||(t.rotation=new N(n.x,n.y,n.z,n.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new b(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new N(t.x,t.y,t.z,t.w)))}}_useclipOffsets=!0;_totalOffsetPosition=new b;_totalOffsetRotation=new N;_totalOffsetPosition2=new b;_totalOffsetRotation2=new N;_summedPos=new b;_tempPos=new b;_summedRot=new N;_tempRot=new N;_clipRotQuat=new N;evaluate(e){if(this.track.muted||!this.mixer)return;this.bind(),this._totalOffsetPosition.set(0,0,0),this._totalOffsetRotation.set(0,0,0,1),this._totalOffsetPosition2.set(0,0,0),this._totalOffsetRotation2.set(0,0,0,1);let t=0,i=0,n=!1,s=!1,r=0;for(let a=0;a<this.clips.length;a++){const l=this.models[a],c=this.actions[a],h=l.asset;c.weight=0;const d=e>=l.start&&e<=l.end,p=l.preExtrapolationMode,m=l.postExtrapolationMode,f=a<this.clips.length-1?this.models[a+1]:null;let g=d,y=!1;if(!g&&!n&&l.end<e&&m!==ao.None?(!f||f.start>e)&&(g=!0,n=!0):a==0&&!g&&!s&&l.start>e&&p!==ao.None&&(!f||f.start<e)&&(g=!0,y=!0,s=!0),g){let _=this.weight;_*=this.evaluateWeight(e,a,this.models,g),_*=this.director.weight;let v=d;if(y)switch(p){case ao.Hold:break;case ao.Loop:e+=l.start,v=!0;break;default:e+=l.start,v=!0;break}let C=this.getClipTime(e,l),O=0;const k=h.duration;if(y&&p===ao.Hold&&(C=0),v){if(h.loop)for(O+=Math.floor(C/(k+1e-6));C>k;)C-=k}else if(!d&&n)switch(m){case ao.Hold:C=this.getClipTime(l.end,l);break;case ao.Loop:C%=k;break;case ao.PingPong:const L=Math.floor(C/k)%2!==0;C%=k,L&&(C=k-C);break}l.reversed===!0?c.time=c.getClip().duration-C:c.time=C,c.timeScale=0;const j=Math.max(0,_);if(c.weight=j,r+=j,c.clampWhenFinished=!1,c.isRunning()||c.play(),this._useclipOffsets){const L=t==0?this._totalOffsetPosition:this._totalOffsetPosition2,V=t==0?this._totalOffsetRotation:this._totalOffsetRotation2;t<1&&(i=1-_),t+=1;const W=this._summedPos.set(0,0,0),G=this._tempPos.set(0,0,0),X=this._summedRot.identity(),R=this._tempRot.identity(),$=h.rotation;$&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp($,_));const q=this._actionOffsets[a];if(q.hasOffsets)for(let he=0;he<O;he++)q.rootPositionOffset?G.copy(q.rootPositionOffset):G.set(0,0,0),G.applyQuaternion(X),this._clipRotQuat&&G.applyQuaternion(this._clipRotQuat),q.rootQuaternionOffset&&(R.copy(q.rootQuaternionOffset),X.multiply(R)),W.add(G);this._clipRotQuat&&V.multiply(this._clipRotQuat),V.multiply(X),h.position&&W.add(h.position),L.add(W)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(lo||A())&&this._animator?.runtimeAnimatorController?.mixer&&this.mixer!==this._animator?.runtimeAnimatorController?.mixer&&(this.__mixerError=!0,console.error("AnimationTrack mixer is not shared with the animator controller - this might result in the timeline to not animate properly. Please report a bug to the Needle Engine team!",this)),this._animator?.runtimeAnimatorController){const a=Math.max(0,1-r);this._animator?.runtimeAnimatorController?.update(a)}else this.mixer.update(e)}createRotationInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new N;this.ensureTrackOffsets();const r=this.trackOffset?.rotation;i.createInterpolant=()=>{const a=n(),l=a.evaluate.bind(a);return a.evaluate=c=>{const h=l(c);if(s.set(h[0],h[1],h[2],h[3]),s.premultiply(this._totalOffsetRotation),r&&s.premultiply(r),this.director.animationCallbackReceivers)for(const d of this.director.animationCallbackReceivers)d?.onTimelineRotation?.call(d,this.director,this.target,c,s);return h[0]=s.x,h[1]=s.y,h[2]=s.z,h[3]=s.w,h},a}}createPositionInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new b;this.ensureTrackOffsets();const r=this.trackOffset?.rotation,a=this.trackOffset?.position;let l;i.createInterpolant=()=>{const c=n(),h=c.evaluate.bind(c);return c.evaluate=d=>{const p=h(d);if(s.set(p[0],p[1],p[2]),t.removeStartOffset&&(l===void 0?(l=null,l=this._actionOffsets.find(m=>m.clip===e)?.rootStartPosition?.clone()):l?.isVector3&&s.sub(l)),s.applyQuaternion(this._totalOffsetRotation),s.add(this._totalOffsetPosition),r&&s.applyQuaternion(r),a&&(s.x-=a.x,s.y+=a.y,s.z+=a.z),this.director.animationCallbackReceivers)for(const m of this.director.animationCallbackReceivers)m?.onTimelinePosition?.call(m,this.director,this.target,d,s);return p[0]=s.x,p[1]=s.y,p[2]=s.z,p},c}}}const $R=w("mutetimeline");class _s extends fl{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return Fo(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const i=this.models[t];this.audio[t].setVolume(e?i.asset.volume:0)}}addModel(e){const t=new RC(this.listener);this.audio.push(t);const i=e;i._didTriggerPlay=!1,this.models.push(i)}onDisable(){for(const e of this.audio)e.isPlaying&&e.stop();for(const e of this.models)e._didTriggerPlay=!1}onDestroy(){for(const e of this.audio)e.source&&e?.disconnect();this.audio.length=0}onMuteChanged(){if(this.muted)for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}_playableDirectorResumed=!1;onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if($R||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,i=this._playableDirectorResumed;this._playableDirectorResumed=!1;const n=t?.1:0;for(let s=0;s<this.models.length;s++){const r=this.models[s],a=this.audio[s],l=r.asset;if((!a||!a.buffer)&&this.isInTimeRange(r,e-1,e+1)&&this.handleAudioLoading(r,a),Ni.userInteractionRegistered!==!1&&!(a===null||!a.buffer))if(a.playbackRate=this.director.context.time.timeScale*this.director.speed,a.loop=l.loop,e>=r.start&&e<=r.end&&e<this.director.duration){if(!a.isPlaying||!this.director.isPlaying)(i||!r._didTriggerPlay&&this.lastTime<e)&&(r.duration*r.timeScale>.3?a.offset=r.clipIn+(e-r.start)*r.timeScale:a.offset=0,lo&&console.log("Timeline Audio ("+this.track.name+") play with offset "+a.offset+" - "+r.asset.clip),a.play(n),r._didTriggerPlay=!0);else{const h=r.clipIn+(e-r.start)*r.timeScale,d=a.context.currentTime-a._startedAt+a.offset;Math.abs(h-d)>.3&&(a.offset=h,a.stop(),a.play(n))}let c=l.volume;if(this.track.volume!==void 0&&(c*=this.track.volume),t&&(c=0),r.easeInDuration>0){const h=Math.min((e-r.start)/r.easeInDuration,1);c*=h}if(r.easeOutDuration>0){const h=Math.min((r.end-e)/r.easeOutDuration,1);c*=h}a.setVolume(c*this.director.weight)}else r._didTriggerPlay=!1,this.director.isPlaying&&a.isPlaying&&a.stop()}this.lastTime=e}loadAudio(e,t=0,i=0){let n=null;const s=e-i,r=e+t;for(const a of this.models)if(this.isInTimeRange(a,s,r)){const l=this.audio[this.models.indexOf(a)],c=this.handleAudioLoading(a,l);c!==null&&(n===null&&(n=[]),n.push(c))}return n!==null?Promise.all(n):null}isInTimeRange(e,t,i){return t<=e.start&&i>=e.end||t>=e.start&&t<=e.end||i>=e.start&&i<=e.end}static _audioBuffers=new Map;static dispose(){_s._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new $m);const i=this.getAudioFilePath(e.asset.clip);if(_s._audioBuffers.get(i)){const s=_s._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}lo&&console.warn("LOAD audio track",i,this.director.sourceId);const n=new Promise((s,r)=>{this._audioLoader.load(i,a=>{t.setBuffer(a),s(a)},void 0,a=>{console.error("Error loading audio",a),s(null)})});return _s._audioBuffers.set(i,n),n}}class ip extends fl{models=[];needsSorting=!0;*foreachMarker(e=null){this.needsSorting&&this.sort();for(const t of this.models)t&&t.type===e&&(yield t)}onEnable(){this.needsSorting=!0}evaluate(e){this.needsSorting&&this.sort()}sort(){this.needsSorting=!1,this.models.sort((e,t)=>e.time-t.time)}}class dh extends fl{models=[];didTrigger=[];receivers=[];evaluate(e){if(this.track.muted)return;const t=this.director.context.time.deltaTime*1.5;for(let i=0;i<this.models.length;i++){const n=this.models[i],s=this.didTrigger[i],r=n.time-e;let a=!1;if(n.retroActive)a=r<=1e-6;else{const l=Math.abs(r);(l===0||l>=1e-5&&l<t)&&(a=!0)}if(a){if(!s)if(lo&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)ch.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class np extends fl{models=[];timelines=[];resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const i=this.models[t].asset;if(!i.sourceObject||typeof i.sourceObject!="object"){console.log("no source object, removing model",t,i),this.models.splice(t,1);continue}else{const n=this.director.constructor,s=x.getComponent(i.sourceObject,n);this.timelines.push(s),s&&i.updateDirector&&(s.playOnAwake=!1)}}}_previousActiveModel=null;evaluate(e){this._previousActiveModel=null;for(let t=0;t<this.models.length;t++){const i=this.models[t],n=i.asset;if(e>=i.start&&e<=i.end){this._previousActiveModel=i;const s=this.getClipTime(e,i);if(n.controlActivation){const r=n.sourceObject;r.visible=!0}if(n.updateDirector){const r=this.timelines[t];r&&(r.isPlaying&&r.pause(),r.time=s,r.evaluate())}}else{const s=this._previousActiveModel?.asset;if(n.controlActivation){const r=n.sourceObject;s?.sourceObject!==r&&(r.visible=!1)}}}}}var HR=Object.defineProperty,Ox=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&HR(e,t,n),n};const jn=w("debugtimeline"),ty=class Pb extends E{static createTrackFunctions={};static registerCreateTrack(e,t){this.createTrackFunctions[e]=t}playableAsset;playOnAwake;extrapolationMode=1;get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(e){typeof e=="number"&&!Number.isNaN(e)?this._time=e:(jn||Di())&&console.error("INVALID TIMELINE.TIME VALUE",e,this.name)}get duration(){return this._duration}set duration(e){this._duration=e}get weight(){return this._weight}set weight(e){this._weight=e}get speed(){return this._speed}set speed(e){this._speed=e}waitForAudio=!0;_visibilityChangeEvt;_clonedPlayableAsset=!1;_speed=1;awake(){jn&&console.log(`[Timeline] Awake '${this.name}'`,this),this.rebuildGraph(),!this.isValid()&&(jn||A())&&(jn?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",this.playableAsset?.tracks,"IsArray?",Array.isArray(this.playableAsset?.tracks),this):this.playableAsset?.tracks?.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){jn&&console.log("[Timeline] OnEnable",this.name,this.playOnAwake);for(const e of this._audioTracks)e.onEnable?.();for(const e of this._customTracks)e.onEnable?.();for(const e of this._animationTracks)e.onEnable?.();this.playOnAwake&&this.play(),this._visibilityChangeEvt||(this._visibilityChangeEvt=()=>{switch(document.visibilityState){case"hidden":this.setAudioTracksAllowPlaying(!1);break;case"visible":this.setAudioTracksAllowPlaying(!0);break}}),window.addEventListener("visibilitychange",this._visibilityChangeEvt)}onDisable(){jn&&console.log("[Timeline] OnDisable",this.name),this.stop();for(const e of this._audioTracks)e.onDisable?.();for(const e of this._customTracks)e.onDisable?.();for(const e of this._animationTracks)e.onDisable?.();this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){for(const e of this._allTracks)for(const t of e)t.onDestroy?.()}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const e=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,e&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const t=[];for(const i of this._audioTracks){const n=i.loadAudio(this._time,1,0);n&&t.push(n)}if(t.length>0&&(await Promise.all(t),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!Ni.userInteractionRegistered&&this.waitForAudio;)await Bo(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),xe.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const i of this._audioTracks)i.stop();const e=this._isPaused==!0,t=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),e&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,e&&!t&&this.invokePauseChangedMethodsOnTracks(),t&&this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine&&this.stopCoroutine(this._internalUpdateRoutine),this._internalUpdateRoutine=null,this._isStopping=!1}evaluate(){this.internalEvaluate(!0)}isValid(){return this.playableAsset&&this.playableAsset.tracks&&Array.isArray(this.playableAsset.tracks)}*forEachTrack(){for(const e of this._allTracks)for(const t of e)yield t}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}get signalTracks(){return this._signalTracks}get markerTracks(){return this._markerTracks}*foreachMarker(e=null){for(const t of this._markerTracks)for(const i of t.foreachMarker(e))yield i}_guidsMap;resolveGuids(e){this._guidsMap=e}_isPlaying=!1;_internalUpdateRoutine;_isPaused=!1;_isStopping=!1;_time=0;_duration=0;_weight=1;_animationTracks=[];_audioTracks=[];_signalTracks=[];_markerTracks=[];_controlTracks=[];_customTracks=[];_tracksArray=[];get _allTracks(){return this._tracksArray.length=0,this._tracksArray.push(this._animationTracks),this._tracksArray.push(this._audioTracks),this._tracksArray.push(this._signalTracks),this._tracksArray.push(this._markerTracks),this._tracksArray.push(this._controlTracks),this._tracksArray.push(this._customTracks),this._tracksArray}invokePauseChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onPauseChanged?.call(e)}invokeStateChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onStateChanged?.call(e,this._isPlaying)}*internalUpdate(){for(;this._isPlaying&&this.activeAndEnabled;)!this._isPaused&&this._isPlaying&&(this._time+=this.context.time.deltaTime*this.speed,this.internalEvaluate()),yield}internalEvaluate(e=!1){if(!this.isValid())return;let t=this._time;switch(this.extrapolationMode){case 0:this._speed>0?t=Math.min(t,this._duration):this._speed<0&&(t=Math.max(t,0)),this._time=t;break;case 1:t%=this._duration,this._time=t;break;case 2:if(t>this._duration){this.stop();return}break}const i=this._time;for(const n of this.playableAsset.tracks)if(!n.muted)switch(n.type){case Wi.Activation:if(!e&&!this._isPlaying)continue;for(let s=0;s<n.outputs.length;s++){const r=n.outputs[s];if(typeof r=="object"){let a=!1;if(n.clips)for(const c of n.clips)c.start<=i&&i<=c.end&&(a=!0);const l=r;l.visible!==void 0&&l.visible!==a&&(l.visible=a,jn&&console.warn(this.name,"set ActivationTrack-"+s,l.name,a,i))}}break}for(const n of this._allTracks)for(const s of n)this._isStopping&&s instanceof hh||s.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=vc(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const e=this.findRoot(this.gameObject);for(const t of this.playableAsset.tracks){for(let i=t.outputs.length-1;i>=0;i--){let n=t.outputs[i];if(typeof n=="string"){this._guidsMap&&this._guidsMap[n]&&(n=this._guidsMap[n]);const s=x.findByGuid(n,e);s===null||typeof s!="object"?(t.outputs.splice(i,1),console.warn("Failed to resolve binding",n,t.name,t.type)):(jn&&console.log("Resolved binding",n,"to",s),t.outputs[i]=s)}else if(n===null){if(t.outputs.splice(i,1),Pb.createTrackFunctions[t.type])continue;t.type!==Wi.Audio&&t.type!==Wi.Control&&t.type!==Wi.Marker&&t.type!==Wi.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===Wi.Control&&t.clips)for(let i=0;i<t.clips.length;i++){const n=t.clips[i];let s=n.asset.sourceObject;if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const r=x.findByGuid(s,e);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",s,t.name,n):(jn&&console.log("Resolved binding",s,"to",r),n.asset.sourceObject=r)}}}}findRoot(e){return e.parent?this.findRoot(e.parent):e}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const e of this.playableAsset.tracks)if(e.muted!==!0){if(e.clips)for(const t of e.clips)t.end>this._duration&&(this._duration=t.end);if(e.markers)for(const t of e.markers)t.time>this._duration&&(this._duration=t.time+.001)}}}setupAndCreateTrackHandlers(){if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let e=x.findObjectOfType(Go,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=Pb.createTrackFunctions[i];if(n!=null){const s=n(this,t);if(typeof s.evaluate=="function"){s.director=this,s.track=t,this._customTracks.push(s);continue}}if(t.type===Wi.Animation){if(!t.clips||t.clips.length<=0){jn&&console.warn("Animation track has no clips",t);continue}for(let s=t.outputs.length-1;s>=0;s--){let r=t.outputs[s];if(r instanceof M){const l=x.getOrAddComponent(r,wt);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new hh;l.trackOffset=t.trackOffset,l.director=this,l.track=t;for(let c=0;c<t.clips.length;c++){const h=t.clips[c],d=h.asset;if(!d){console.error(`Timeline ${this.name}: clip #${c} on track "${t.name}" has no animation data`);continue}const p=d.clip;let m=p;if((typeof m=="string"||typeof m=="number")&&(m=a.find(g=>g.name===p)),jn&&console.log(d,p,"\u2192",m),!m){console.warn("Could not find animationClip for model",h,t.name,this.name,this.playableAsset?.name,a,r);continue}r instanceof wt&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new Vm(r.gameObject),this.context.animations.registerAnimationMixer(l.mixer)),l.clips.push(m),l.mixer.uncacheAction(m),l.createHooks(h.asset,m);const f=l.mixer.clipAction(m);l.actions.push(f),l.models.push(h)}this._animationTracks.push(l)}}}else if(t.type===Wi.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new _s;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Ni),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Go)),s.listener=e.listener;for(let r=0;r<t.clips.length;r++){const a=t.clips[r];s.addModel(a)}}else if(t.type===Wi.Marker){if(t.markers){const s=new dh;s.director=this,s.track=t;const r=new ip;r.director=this,r.track=t;for(const a of t.markers)a.type===ey.Signal?(s.models.push(a),s.didTrigger.push(!1)):r.models.push(a);if(s!==null&&s.models.length>0){const a=x.getComponent(this.gameObject,ch);a&&(s.receivers.push(a),this._signalTracks.push(s))}r!==null&&r.models.length>0&&this._markerTracks.push(r)}}else if(t.type===Wi.Signal){const s=new dh;if(s.director=this,s.track=t,t.markers)for(const r of t.markers)s.models.push(r),s.didTrigger.push(!1);for(const r of t.outputs)s.receivers.push(r);this._signalTracks.push(s)}else if(t.type===Wi.Control){const s=new np;if(s.director=this,s.track=t,t.clips)for(const r of t.clips)s.models.push(r);s.resolveSourceObjects(this.context),this._controlTracks.push(s)}}}setAudioTracksAllowPlaying(e){for(const t of this._audioTracks)t.onAllowAudioChanged(e)}animationCallbackReceivers=[];registerAnimationCallback(e){this.animationCallbackReceivers.push(e)}unregisterAnimationCallback(e){const t=this.animationCallbackReceivers.indexOf(e);t!==-1&&this.animationCallbackReceivers.splice(t,1)}};Ox([u()],ty.prototype,"playOnAwake"),Ox([u()],ty.prototype,"extrapolationMode");let yl=ty,kx=!1;function GR(){kx||(kx=!0,pe.registerCallback(ue.ContextCreated,o=>{const e=o.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&o.files)for(const t of o.files)x.foreachComponent(t.file.scene,i=>{if(i.enabled!==!1){if(i instanceof Vt&&i.playAutomatically||i instanceof wt||i instanceof yl&&i.playOnAwake===!0)return!0;if(i instanceof Vt)return i.playAutomatically=!0,!0;if(i instanceof yl)return i.playOnAwake=!0,!0}},!0)!==!0&&mi.autoplayAnimations(t.file)}))}const qR={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},XR={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class op extends Ti{constructor(e){super(),this.position.y=-3.5;const t=new Da;t.deleteAttribute("uv");const i=new yt({metalness:0,side:Wd}),n=new yt({metalness:0}),s=e=="legacy"?qR:XR,r=new zm(16777215,s.topLight.intensity,28,2);r.position.set(...s.topLight.position),this.add(r);const a=new H(t,i);a.position.set(...s.room.position),a.scale.set(...s.room.scale),this.add(a);for(const l of s.boxes){const c=new H(t,n);c.position.set(...l.position),c.rotation.set(0,l.rotation,0),c.scale.set(...l.scale),this.add(c)}for(const l of s.lights){const c=new H(t,this.createAreaLightMaterial(l.intensity));c.position.set(...l.position),c.scale.set(...l.scale),this.add(c)}}createAreaLightMaterial(e){const t=new Ce;return t.color.setScalar(e),t}}const uh=w("debugmissingcamera");let Mx=!1;function QR(){Mx||(Mx=!0,pe.registerCallback(ue.MissingCamera,o=>{uh&&console.warn("Creating missing camera");const e=o.context.scene,t=new de;t.name="Default Fallback Camera",e.add(t);const i=new wi;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Xr.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Xr.Skybox;else{if(i.clearFlags=Xr.SolidColor,!o.context.domElement.getAttribute("background-color")){let s="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(s="#1f1f1f"),e.background=new oe(s)}if(!e.environment){const s=new TC(o.context.renderer),r=new op("neutral");e.environment=s.fromScene(r,.025).texture}}const n=Wr(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&Ex(o.context,n),n}),pe.registerCallback(ue.ContextCreated,o=>{if(!o.context.mainCamera){uh&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(O_(o.context.mainCamera)?.isCameraController==!0){uh&&console.log("Will not auto-fit because a camera controller exists");return}Ex(o.context)}}))}function Ex(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(uh&&console.log("Creating default camera controls",e?.name),t){const i=Yc(t,me);i.sourceId=e?.sourceId??"unknown";const n=o.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const s=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(s)?.5:s,uh&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=o.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}async function iy(o){const{NeedleEngineWebComponent:e}=await Promise.resolve().then(()=>RD);e.observedAttributes.includes(o)||e.observedAttributes.push(o)}var YR=Object.defineProperty,St=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&YR(e,t,n),n};const Ct=w("debugsceneswitcher"),ZR=w("sceneswitcher:clearscene"),sp="scene";function KR(){iy(sp)}const Bs=Promise.resolve(!1);class et extends E{autoLoadFirstScene=!0;scenes=[];loadingScene;queryParameterName="scene";useSceneName=!0;clamp=!0;useHistory=!0;useKeyboard=!0;useSwipe=!0;useSceneLighting=!0;useSceneBackground=!0;preloadNext=1;preloadPrevious=1;preloadConcurrent=2;createMenuButtons=!1;get currentIndex(){return this._currentIndex}get currentLoadingProgress(){return this._currentLoadingProgress}get currentlyLoadingScene(){return this._currentlyLoadingScene}get currentlyLoadedScene(){return this._currentScene}sceneLoadingStart=new ae;sceneLoadingProgress=new ae;sceneLoaded=new ae;_currentIndex=-1;_currentScene=void 0;_currentSceneAsset=void 0;_engineElementOverserver=void 0;_preloadScheduler;_menuButtons;__lastSwitchScene;__lastSwitchScenePromise;awake(){this._currentScene=void 0,this._lastLoadingScene=void 0,this.__lastSwitchScenePromise=void 0,this.scenes===void 0&&(this.scenes=[]);for(const e of this.scenes)e&&!e.hasUrl&&e.asset instanceof M?x.remove(e.asset):e instanceof M&&x.remove(e);Ct&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Ae.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Ae.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Ae.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===sp){const i=this.context.domElement.getAttribute(sp);i!==null&&this.trySelectSceneFromValue(i)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new JR(this)),this._preloadScheduler.maxLoadAhead=this.preloadNext,this._preloadScheduler.maxLoadBehind=this.preloadPrevious,this._preloadScheduler.maxConcurrent=this.preloadConcurrent,this._preloadScheduler.begin(2e3),this.autoLoadFirstScene&&this._currentIndex===-1&&!await this.tryLoadFromQueryParam()){const e=this.context.domElement.getAttribute(sp);(e===null||!await this.trySelectSceneFromValue(e))&&this._currentIndex===-1&&this.select(0)}this.createMenuButtons&&(this._menuButtons??=[],this._menuButtons.push(this.context.menu.appendChild({label:"Previous",icon:"arrow_back_ios",onClick:()=>this.selectPrev(),priority:-1005,class:"row2"})),this._menuButtons.push(this.context.menu.appendChild({label:"Next",icon:"arrow_forward_ios",iconSide:"right",onClick:()=>this.selectNext(),priority:-1e3,class:"row2"})))}onDisable(){if(globalThis.removeEventListener("popstate",this.onPopState),this.context.input.removeEventListener(Ae.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Ae.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Ae.PointerUp,this.onInputPointerUp),this._preloadScheduler?.stop(),this._menuButtons){for(const e of this._menuButtons)e.remove();this._menuButtons=void 0}}onPopState=async e=>{if(!this.useHistory)return;const t=this.useHistory;try{this.useHistory=!1;let i=!1;if(this.queryParameterName&&(i=await this.tryLoadFromQueryParam()),!i){const n=e?.state;if(n&&n.startsWith(this.guid)){const s=n.substr(this.guid.length+2);Ct&&console.log("PopState",s),await this.trySelectSceneFromValue(s)}}}finally{this.useHistory=t}};normalizedSwipeThresholdX=.1;_didSwipe=!1;onInputPointerMove=e=>{if(this.useSwipe&&!this._didSwipe&&e.button===0&&e.pointerType==="touch"&&this.context.input.getPointerPressedCount()===1){const t=this.context.input.getPointerPositionDelta(e.button);if(t){const i=t.x/this.context.domWidth;i>=this.normalizedSwipeThresholdX?(this._didSwipe=!0,this.selectPrev()):i<=-this.normalizedSwipeThresholdX&&(this._didSwipe=!0,this.selectNext())}}};onInputPointerUp=e=>{e.button===0&&(this._didSwipe=!1)};onInputKeyDown=e=>{if(!this.useKeyboard||!this.scenes)return;const t=e.key.toLowerCase();if(!t)return;const i=parseInt(t)-1;if(i>=0){this.trySelectSceneFromValue(i);return}switch(t){case"arrowright":case"d":this.selectNext();break;case"arrowleft":case"a":this.selectPrev();break}};addScene(e){if(typeof e=="string"){let t=this.context.addressables.findAssetReference(e);return t||(t=new ne(e),this.context.addressables.registerAssetReference(t)),this.scenes.push(t),t}return this.scenes.push(e),e}selectNext(){return this.select(this._currentIndex+1)}selectPrev(){return this.select(this._currentIndex-1)}select(e){if(Ct&&console.log("[SceneSwitcher] select",e),typeof e=="object"&&console.warn('[SceneSwitcher] Switching to "'+e+'" might not work. Please either use an index or a AssetReference (not a scene reference)'),typeof e=="string"){const i=this.scenes?.find(n=>n.url===e);if(!i){const n=ne.getOrCreate(this.sourceId??"",e,this.context);return this.switchScene(n)}if(i)e=this.scenes?.indexOf(i);else return Bs}if(!this.scenes?.length)return Bs;if(e<0){if(this.clamp)return Bs;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return Bs;e=0}const t=this.scenes[e];return this.switchScene(t)}unload(){return this.__lastSwitchScene=void 0,this.__lastSwitchScenePromise=void 0,this.__unloadCurrentScene()}async reload(){if(this.__lastSwitchScene){const e=this.__lastSwitchScene;return this.__lastSwitchScene=void 0,this.switchScene(e)}return!1}async switchScene(e){if(!(e instanceof ne)){const t=typeof e;if(t==="string")return this.select(e);if(t==="number")return this.select(e);if(e&&e instanceof M){const i=this.scenes?.indexOf(e);e=new ne(e.name,void 0,e),i>=0&&(this.scenes[i]=e)}else return console.warn(`[SceneSwitcher] Can't switch to scene of type ${t}`),!1}return e.url===this.sourceId?(console.warn("[SceneSwitcher] Can't load own scene - prevent recursive loading",this.sourceId),!1):this.__lastSwitchScene===e&&this.__lastSwitchScenePromise?this.__lastSwitchScenePromise:(this.__lastSwitchScene=e,this.__lastSwitchScenePromise=this.__internalSwitchScene(e),await this.__lastSwitchScenePromise)}async __unloadCurrentScene(){const e=this._currentScene;if(this._currentScene=void 0,e){Ct&&console.log("[SceneSwitcher] UNLOAD",e.url,"HasURL?: "+e.hasUrl);const t=this.tryGetSceneEventListener(e.asset);if(t?.sceneClosing){const i=t.sceneClosing();i instanceof Promise&&await i}e.hasUrl?(e.unload(),this._currentSceneAsset&&Ui(this._currentSceneAsset,!0,!1)):x.remove(this._currentSceneAsset)}}_currentlyLoadingScene;async __internalSwitchScene(e){await this.__unloadCurrentScene();const t=this._currentIndex=this.scenes?.indexOf(e)??-1;try{Ct&&console.debug(`${Date.now()} [SceneSwitcher] Loading scene start: ${e.url} (index: ${t})`),this._currentlyLoadingScene=e,this._currentLoadingProgress=new ProgressEvent("progress",{loaded:0,total:1});const i=new CustomEvent("loadscene-start",{detail:{scene:e,switcher:this,index:t}});this.dispatchEvent(i),this.sceneLoadingStart?.invoke(i.detail),await this.onStartLoading(),await e.loadAssetAsync((s,r)=>{if(Ct){const a=r.loaded/r.total,l="["+"=".repeat(Math.floor(a*20))+"-".repeat(20-Math.floor(a*20))+"]";console.debug(`${Date.now()} [SceneSwitcher] Loading scene progress: ${(a*100).toFixed(1)} % ${l}`,e.url)}this._currentLoadingProgress=r,this.dispatchEvent(r),this.sceneLoadingProgress?.invoke(r)}).catch(console.error),await this.onEndLoading();const n=new CustomEvent("loadscene-finished",{detail:{scene:e,switcher:this,index:t}});if(this.dispatchEvent(n),this._currentLoadingProgress=void 0,this._currentlyLoadingScene=void 0,n.defaultPrevented)return Ct&&console.warn("[SceneSwitcher] Adding loaded scene prevented:",e,n),!1;if(!e.asset)return Ct&&console.warn("[SceneSwitcher] Failed loading scene:",e),!1;if(this._currentIndex===t){if(Ct&&console.log("[SceneSwitcher] ADD",e.url),this._currentScene=e,ZR){const a=this.context.mainCameraComponent?.gameObject||this.context.mainCamera;a?.removeFromParent();const l=this.gameObject.removeFromParent();Ui(this.context.scene,!0,!0),this.context.scene=new Ti,this.context.scene.add(l),a&&this.context.scene.add(a)}if(e.asset.parent?this._currentSceneAsset=Nr(e.asset,{parent:this.gameObject}):(this._currentSceneAsset=e.asset,x.add(e.asset,this.gameObject)),this.useSceneLighting&&this.context.sceneLighting.enable(e),this.useSceneBackground){const a=this.context.lightmaps.tryGetSkybox(e.url);a?(a.mapping!==Ro&&(a.mapping=Ao),this.context.scene.background=a):Ct&&console.warn("[SceneSwitcher] Can't find skybox for scene "+e.url)}if(this.useHistory&&t>=0){let a=t.toString();if(this.useSceneName&&(e instanceof M?a=e.name:e.url&&(a=Rx(e.url))),this.queryParameterName?.length)Ua(this.queryParameterName,a,this.useHistory);else{const l=history.state,c=this.guid+"::"+t;l!==c&&history.pushState(c,"unused",location.href)}}const s=this.tryGetSceneEventListener(e.asset);if(s?.sceneOpened){const a=s.sceneOpened(this);a instanceof Promise&&await a}Ct&&console.debug(`${Date.now()} [SceneSwitcher] Loading scene finished: ${e.url} (index: ${t})`);const r=new CustomEvent("scene-opened",{detail:{scene:e,switcher:this,index:t}});return this.dispatchEvent(r),this.sceneLoaded?.invoke(this),!0}}catch(i){console.error(i)}return!1}preload(e){if(e>=0&&e<this.scenes.length){const t=this.scenes[e];if(t instanceof ne)return t.preload()}return Bs}tryLoadFromQueryParam(){if(!this.queryParameterName?.length)return Bs;const e=w(this.queryParameterName);return typeof e=="boolean"?Bs:this.trySelectSceneFromValue(e)}trySelectSceneFromValue(e){if(typeof e=="string"){const t=parseInt(e);if(t>=0&&t<this.scenes.length)return this.select(t);{const i=e.toLowerCase();for(let n=0;n<this.scenes.length;n++){const s=this.scenes[n];if(!!s&&(s instanceof M?s.name:Rx(s.url)).toLowerCase().includes(i))return this.select(n)}}}else if(typeof e=="number"&&e>=0&&e<this.scenes.length)return this.select(e);return Di()&&console.warn('[SceneSwitcher] Can not find scene: "'+e+'"',this),Bs}_lastLoadingScene=void 0;_loadingScenePromise=void 0;_isCurrentlyLoading=!1;_currentLoadingProgress=void 0;async onStartLoading(){if(this._isCurrentlyLoading=!0,this.loadingScene&&(this._lastLoadingScene!==this.loadingScene&&(this._loadingScenePromise=void 0),this._lastLoadingScene=this.loadingScene,this._loadingScenePromise||(this._loadingScenePromise=this.loadingScene?.loadAssetAsync().then(e=>e!=null)),await this._loadingScenePromise,this._isCurrentlyLoading&&this.loadingScene?.asset)){Ct&&console.log("Add loading scene",this.loadingScene.url,this.loadingScene.asset);const e=this.loadingScene.asset;x.add(e,this.gameObject);const t=this.tryGetSceneEventListener(e);if(t?.sceneOpened){const i=t.sceneOpened(this);i instanceof Promise&&await i}}if(this._isCurrentlyLoading){const e=this.tryGetSceneEventListener(this.gameObject);if(e&&e.sceneOpened){const t=e.sceneOpened(this);t instanceof Promise&&await t}}}async onEndLoading(){if(this._isCurrentlyLoading=!1,this.loadingScene?.asset){Ct&&console.log("Remove loading scene",this.loadingScene.url);const e=this.loadingScene.asset,t=this.tryGetSceneEventListener(e);if(typeof t?.sceneClosing=="function"){const i=t.sceneClosing();i instanceof Promise&&await i}x.remove(e)}if(!this._isCurrentlyLoading){const e=this.tryGetSceneEventListener(this.gameObject);if(e&&e.sceneClosing){const t=e.sceneClosing();t instanceof Promise&&await t}}}tryGetSceneEventListener(e,t=0){if(!e)return null;const i=x.foreachComponent(e,n=>{const s=n;if(s.sceneClosing||s.sceneOpened)return s});if(t===0&&!i&&e.children.length)for(const n of e.children){const s=this.tryGetSceneEventListener(n,t+1);if(s)return s}return i||null}}St([u()],et.prototype,"autoLoadFirstScene"),St([u(ne)],et.prototype,"scenes"),St([u(ne)],et.prototype,"loadingScene"),St([u()],et.prototype,"queryParameterName"),St([u()],et.prototype,"useSceneName"),St([u()],et.prototype,"clamp"),St([u()],et.prototype,"useHistory"),St([u()],et.prototype,"useKeyboard"),St([u()],et.prototype,"useSwipe"),St([u()],et.prototype,"useSceneLighting"),St([u()],et.prototype,"useSceneBackground"),St([u()],et.prototype,"preloadNext"),St([u()],et.prototype,"preloadPrevious"),St([u()],et.prototype,"preloadConcurrent"),St([u()],et.prototype,"createMenuButtons"),St([u(ae)],et.prototype,"sceneLoadingStart"),St([u(ae)],et.prototype,"sceneLoadingProgress"),St([u(ae)],et.prototype,"sceneLoaded");function Rx(o){const e=o.split("/").pop()?.split(".").shift();return e?.length?e:o}class JR{maxLoadAhead;maxLoadBehind;maxConcurrent;_isRunning=!1;_switcher;_loadTasks=[];_maxConcurrentLoads=1;constructor(e,t=1,i=1,n=2){this._switcher=e,this.maxLoadAhead=t,this.maxLoadBehind=i,this.maxConcurrent=n}begin(e){if(this._isRunning)return;Ct&&console.log("[SceneSwitcher] Preload scheduled",{delay:e}),this._isRunning=!0;let t=-10,i,n;const s=this._switcher.scenes,r=Date.now()+e,a=setInterval(()=>{if(this.allLoaded()&&(Ct&&console.log("[SceneSwitcher] All scenes (pre-)loaded"),this.stop()),!this._isRunning){clearInterval(a);return}if(Date.now()<r||this.canLoadNewScene()===!1)return;(t===-10||t!==this._switcher.currentIndex)&&(t=this._switcher.currentIndex,n=0,i=0);const l=n%2===0;l&&(i+=1),n+=1;const c=l?this.maxLoadAhead:this.maxLoadBehind;if(i>c)return;const h=l?t+i:t-i;if(!(h<0)&&!(h<0||h>=s.length)&&!this._loadTasks.some(d=>d.index===h)){const d=s[h];Ct&&console.log("[SceneSwitcher] Schedule preload scene",{roomIndex:h,searchForward:l,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},d?.url),new eT(h,d,this._loadTasks)}},200)}stop(){this._isRunning=!1}canLoadNewScene(){return this._loadTasks.length<this._maxConcurrentLoads}allLoaded(){if(this._switcher.scenes){for(const e of this._switcher.scenes)if(e?.isLoaded&&e.isLoaded()===!1)return!1}return!0}}class eT{index;asset;tasks;constructor(e,t,i){this.index=e,this.asset=t,this.tasks=i,i.push(this),this.awaitLoading()}async awaitLoading(){this.asset&&!this.asset.isLoaded()&&(Ct&&console.log("[SceneSwitcher] Preload start: "+this.asset.url,this.index),await this.asset.preload(),Ct&&console.log("[SceneSwitcher] Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}const Fs=w("debugautosync"),ny=Symbol("syncerId");class tT{_syncers={};getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new iT(e);return t[ny]=e.guid,this._syncers[t[ny]]=t,t}removeSyncer(e){delete this._syncers[e[ny]]}}const oy=new tT;class iT{comp;constructor(e){this.comp=e}hasChanges=!1;changedProperties={};get networkingKey(){return this.comp.guid}_isReceiving=!1;_isInit=!1;init(e){if(this._isInit)return;this._isInit=!0,this.comp=e,this.comp.context.post_render_callbacks.push(this.onHandleSending),this.comp.context.connection.beginListen(this.networkingKey,this.onHandleReceiving);const t=this.comp.context.connection.tryGetState(this.comp.guid);t&&this.onHandleReceiving(t)}destroy(){this._isInit&&(this.comp.context.post_render_callbacks.splice(this.comp.context.post_render_callbacks.indexOf(this.onHandleSending),1),this.comp.context.connection.stopListen(this.networkingKey,this.onHandleReceiving),this.comp=null,this._isInit=!1)}notifyChanged(e,t){this._isReceiving||(Fs&&console.log("Property changed: "+e,t),this.hasChanges=!0,this.changedProperties[e]=t)}onHandleSending=()=>{if(!this.hasChanges)return;this.hasChanges=!1;const e=this.comp.context.connection;if(!e||!e.isConnected||!e.isInRoom){for(const t in this.changedProperties)delete this.changedProperties[t];return}for(const t in this.changedProperties){const i=this.changedProperties[t];Fs&&console.log("SEND",this.comp.guid,this.networkingKey),e.send(this.networkingKey,{guid:this.comp.guid,property:t,data:i},Rn.Queued),delete this.changedProperties[t]}};onHandleReceiving=e=>{if(Fs&&console.log("SYNCFIELD RECEIVE",this.comp.name,this.comp.guid,e),!!this._isInit&&this.comp&&e.guid===this.comp.guid)try{this._isReceiving=!0,this.comp[e.property]=e.data}catch(t){console.error(t)}finally{this._isReceiving=!1}}}function nT(o,e){let t=e!==o;return!t&&o&&e&&(Array.isArray(o)&&Array.isArray(e)||typeof o=="object"&&typeof e=="object")&&(t=!0),t}const ph=Symbol("AutoSyncHandler");function oT(o){if(o[ph])return o[ph];const e=oy.getOrCreateSyncer(o);return e?.init(o),o[ph]=e,e}function sT(o){const e=o[ph];e&&(oy.removeSyncer(e),e.destroy(),delete o[ph])}const sy=function(o=null){return function(e,t){let i="";typeof t=="string"?i=t:i=t.name;let n=null,s;typeof o=="string"?s=e[o]:typeof o=="function"&&(s=o),s==null&&(A()||Fs)&&o!=null&&console.warn('syncField: no callback function found for property "'+i+'"','"'+o+'"');const r=e,a=r.__internalAwake;if(typeof a!="function"){(Fs||A())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+e?.constructor?.name+'" is not supported',e);return}Fs&&console.log(i);const l=Symbol(i);r.__internalAwake=function(){if(this[l]===void 0){if(this[l]=this[i],n=oy.getOrCreateSyncer(this),Object.getOwnPropertyDescriptor(this,i)?.set===void 0){let h=!1;Object.defineProperty(this,i,{set:function(d){const p=this[l];if(this[l]=d,h){(A()||Fs)&&console.warn("Recursive call detected",i);return}h=!0;try{const m=nT(d,p);Fs&&console.log("SyncField assignment",i,"changed?",m,d,s),m&&s?.call(this,d,p)!==!1&&oT(this)?.notifyChanged(i,d)}finally{h=!1}},get:function(){return this[l]},configurable:!0,enumerable:!0})}n?.init(this),a.call(this)}};const c=r.__internalDestroy;r.__internalDestroy=function(){sT(this),c.call(this)}}},rp=new Map;function ry(o,e){if(rp.has(o))return rp.get(o);const t=new URL(o,window.location.href),i=rT(t,e);return rp.set(o,i),i.finally(()=>{rp.delete(o)}),i}async function rT(o,e){if(!o)return Promise.resolve(null);const t=o.pathname,i=o.toString().toLowerCase().includes("pmrem")||o.searchParams.get("pmrem")!=null,n=t.endsWith(".exr"),s=t.endsWith(".hdr"),r=t.endsWith(".ktx2");let a;if(n)a=new Ym;else if(s)a=new Xb;else if(r){const{ktx2Loader:c}=Qm(e);a=c}else a=new vr;const l=o.toString();return await a.loadAsync(l).then(c=>{if(c){const h=t.lastIndexOf("/");c.name=t.substring(h>=0?h+1:0),i?c.mapping=Ro:c.mapping=Fb,a instanceof vr&&(c.colorSpace=Io)}return c}).catch(c=>(console.warn("Failed to load texture from url:",o),null))}var aT=Object.defineProperty,mh=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&aT(e,t,n),n};const ni=w("debugskybox");function lT(){iy("background-image"),iy("environment-image")}const Tx={studio:{url:"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.pmrem4x4.ktx2?pmrem"},"blurred-skybox":{url:"https://cdn.needle.tools/static/skybox/blurred-skybox.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/blurred-skybox-small.pmrem4x4.ktx2?pmrem"},"quicklook-ar":{url:"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.pmrem4x4.ktx2?pmrem"},quicklook:{url:"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.pmrem4x4.ktx2?pmrem"}};function Ax(o,e,t,i,n){if(e==="transparent"||e?.startsWith("rgb")||e?.startsWith("#"))return console.warn(`Needle Engine: Invalid ${n} value (${e}). Did you mean to set background-color instead?`),null;const s=new lp;s.sourceId=f_(e),s.allowDrop=!1,s.allowNetworking=!1,s.background=t,s.environment=i,x.addComponent(o.scene,s);const r=a=>{if(ni&&console.log(n,"CHANGED TO",a),a){if(typeof a!="string"){console.warn("Invalid attribute value for "+n);return}s.setSkybox(a)}else if(s.sourceId&&(i&&(o.sceneLighting.internalEnableReflection(s.sourceId)||(o.scene.environment=null)),t)){const l=o.lightmaps.tryGetSkybox(s.sourceId);o.scene.background=l}};return ag(o.domElement,n,r),s.addEventListener("destroy",()=>{ni&&console.log("Destroyed attribute remote skybox",n),lg(o.domElement,n,r)}),s.setSkybox(e)}const ap=new Array;pe.registerCallback(ue.ContextCreationStart,o=>{const e=o.context,t=e.domElement.getAttribute("background-image"),i=e.domElement.getAttribute("environment-image");if(t){ni&&console.log("Creating RemoteSkybox to load background "+t);const n=Ax(e,t,!0,!1,"background-image");n&&ap.push(n)}if(i){ni&&console.log("Creating RemoteSkybox to load environment "+i);const n=Ax(e,i,!1,!0,"environment-image");n&&ap.push(n)}}),pe.registerCallback(ue.ContextCreationStart,()=>Promise.all(ap).finally(()=>{ap.length=0}));const Qr=class extends E{url="studio";allowDrop=!0;background=!0;environment=!0;allowNetworking=!0;_prevUrl;_prevLoadedEnvironment;_prevEnvironment=null;_prevBackground=null;onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,wi.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),this.context.mainCameraComponent?.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):ni&&console.warn(`RemoteSkybox: Not setting skybox: ${this.url} is not a remote texture. If you want to set a local texture, set allowNetworking to false.`))}async setSkybox(o,e){if(!this.activeAndEnabled||(o=cT(o,this.environment,this.background),!o))return!1;if(e??=o,this.isValidTextureType(e)||console.warn('Potentially invalid skybox URL: "'+e+'" on '+(this.name||this.gameObject?.name||"context")),ni&&console.log("Set RemoteSkybox url: "+o),this._prevUrl===o&&this._prevLoadedEnvironment)return this.apply(),!0;this._prevLoadedEnvironment?.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=o;const t=await ry(o,this.context.renderer);return t?!this.enabled||this.destroyed?(ni&&console.warn("RemoteSkybox: Component is disabled or destroyed"),!1):this._prevUrl!==o?(ni&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1):(this.url=o,this._prevLoadedEnvironment=t,this.apply(),!0):(ni&&console.warn("RemoteSkybox: Failed to load texture from url",o),!1)}apply(){const o=this._prevLoadedEnvironment;if(o&&(o instanceof Ub||o instanceof AC||o.mapping==Ro||(o.mapping=Fb,o.needsUpdate=!0),!this.destroyed)){if(!this.context){console.warn("RemoteSkybox: Context is not available - can not apply skybox.");return}this.context.scene.background!==o&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==o&&(this._prevEnvironment=this.context.scene.environment),ni&&console.log("Set RemoteSkybox ("+(this.environment&&this.background?"environment and background":this.environment?"environment":this.background?"background":"none")+")",this.url,!wi.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=o),this.background&&!wi.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=o),this.context.mainCameraComponent?.backgroundBlurriness!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness)}}validProtocols=["file:","blob:","data:"];validTextureTypes=[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"];isRemoteTexture(o){return o.startsWith("http://")||o.startsWith("https://")}isValidTextureType(o){for(const e of this.validTextureTypes)if(o.includes(e))return!0;for(const e of this.validProtocols)if(o.startsWith(e))return!0;return!1}registerDropEvents(){this.unregisterDropEvents(),this.context.domElement.addEventListener("dragover",this.onDragOverEvent),this.context.domElement.addEventListener("drop",this.onDrop)}unregisterDropEvents(){this.context.domElement.removeEventListener("dragover",this.onDragOverEvent),this.context.domElement.removeEventListener("drop",this.onDrop)}onDragOverEvent=o=>{if(this.allowDrop&&o.dataTransfer)for(const e of o.dataTransfer.types)(e==="text/uri-list"||e==="Files")&&o.preventDefault()};onDrop=o=>{if(this.allowDrop&&o.dataTransfer){for(const e of o.dataTransfer.types)if(ni&&console.log(e),e==="text/uri-list"){const t=o.dataTransfer.getData(e);ni&&console.log(e,t);let i=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(t)?.groups?.name;if(i||(i=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(t)?.groups?.name),ni&&console.log(i),i){const n="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+i+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${n}`),o.preventDefault(),this.setSkybox(n);break}else if(this.isValidTextureType(t)){console.log("[Remote Skybox] Setting skybox from url: "+t),o.preventDefault(),this.setSkybox(t);break}else{console.warn(`[RemoteSkybox] Unknown url ${t}. If you want to load a skybox from a url, make sure it is a valid image url. Url must end with${this.validTextureTypes.join(", ")}.`);const n=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:o,url:t,apply:s=>{o.preventDefault(),this.setSkybox(s)}}});this.dispatchEvent(n)}}else if(e=="Files"){const t=o.dataTransfer.files.item(0);if(ni&&console.log(e,t),!t)continue;if(!this.isValidTextureType(t.name)){console.warn(`[RemoteSkybox]: File "${t.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}o.preventDefault(),this.setSkybox(t.name);break}}}};mh([sy(Qr.prototype.urlChangedSyncField),u(URL)],Qr.prototype,"url"),mh([u()],Qr.prototype,"allowDrop"),mh([u()],Qr.prototype,"background"),mh([u()],Qr.prototype,"environment"),mh([u()],Qr.prototype,"allowNetworking");let lp=Qr;function cT(o,e,t){if(o==null)return null;const i=e&&!t,n=Tx[o.toLowerCase()];return n?i?n.url_low:n.url:(typeof o=="string"&&o?.length&&(A()||ni)&&(o.includes("/")||o.includes(".")||console.warn(`RemoteSkybox: Unknown magic skybox name "${o}". Valid names are: ${Object.keys(Tx).map(s=>`"${s}"`).join(", ")}`)),o)}var hT=Object.defineProperty,Ix=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&hT(e,t,n),n};class gh extends E{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=ee(this.from).clone(),t=ee(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),bt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(ee(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}Ix([u(x)],gh.prototype,"from"),Ix([u(x)],gh.prototype,"to");const dT=w("debugavatar");class Le extends E{static getAvatar(e){return e>=0&&e<Le.instances.length?Le.instances[e]:null}static instances=[];static onAvatarMarkerCreated(e){return Le._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return Le._onAvatarMarkerDestroyed.push(e),e}static _onNewAvatarMarkerAdded=[];static _onAvatarMarkerDestroyed=[];connectionId;avatar;awake(){Le.instances.push(this),dT&&console.log(this);for(const e of Le._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){Le.instances.splice(Le.instances.indexOf(this),1);for(const e of Le._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}}class Yr{static Pois=[];static LastChangeTime=0;static Add(e,t,i=null){if(t){for(const n of this.Pois)if(n.obj===t)return;this.Pois.push({obj:t,avatar:i}),this.LastChangeTime=e.time.time}}static Remove(e,t){if(t){for(const i of this.Pois)if(i.obj===t){this.Pois.splice(this.Pois.indexOf(i),1),this.LastChangeTime=e?.time.time??z.Current?.time.time;return}}}}class uT{guid;position=new b}class fh extends E{set controlledTarget(e){this.target=e;const t=P.get("MoveRandom");if(t&&this.target){const i=x.getComponent(this.target,t);i&&i.destroy()}}target=null;avatar=null;_model=null;_targetModel=new uT;_currentTargetObject=null;_lastUpdateTime=0;_lookDuration=0;_lastPoiChangedTime=0;awake(){if(this.avatar=x.getComponentInParent(this.gameObject,Le),this.avatar){const e=x.getComponentInParent(this.gameObject,Le);this._model=new cf(this.context.connection,this.guid),e?.isLocalAvatar&&this._model.requestOwnership()}this.context.connection.beginListen("avatar-look-target-changed",e=>{this.target&&e&&e.guid===this.avatar?.guid&&bt(this.target,e.position)})}update(){if((!this.context.connection.isConnected||this._model?.hasOwnership)&&(Yr.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=Yr.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const e=ee(this._currentTargetObject);bt(this.target,e),this.context.connection.isConnected&&this.avatar&&(this.context.connection.send("avatar-look-target-changed",this._targetModel),this._targetModel.guid=this.avatar.guid,this._targetModel.position.copy(e))}}selectTarget(){if(this.context.time.time-this._lastUpdateTime>this._lookDuration){this._lastUpdateTime=this.context.time.time,this._lookDuration=Math.random()*.5+.2;const e=Yr.Pois;if(e.length>0){const t=e[Math.floor(Math.random()*e.length)];if(t&&t.obj){if(t.avatar&&t.avatar===this.avatar)return;this._currentTargetObject=t.obj}}}}}const De=w("debugnetworkingstreams");var co=(o=>(o.Connected="peer-user-connected",o.StreamReceived="receive-stream",o.StreamEnded="call-ended",o.Disconnected="peer-user-disconnected",o.UserJoined="user-joined",o))(co||{});class ay{type="call-ended";userId;direction;constructor(e,t){this.userId=e,this.direction=t}}class Lx{type="receive-stream";userId;stream;target;constructor(e,t,i){this.userId=e,this.stream=t,this.target=i}}class pT{guid;peerId;dontSave=!0;constructor(e,t){this.guid=e.id,this.peerId=t}}var Dx=(o=>(o.Incoming="incoming",o.Outgoing="outgoing",o))(Dx||{});class mT extends Hm{peerId;userId;direction;call;get stream(){return this._stream}_stream=null;_isDisposed=!1;close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),Bn(this._stream))}get isOpen(){return this.call.peerConnection?.connectionState==="connected"}get isOpening(){return this.call.peerConnection?.connectionState==="connecting"}get isClosed(){return!this.isOpen||this._isDisposed}constructor(e,t,i,n=null){super(),this.peerId=t.peer,this.userId=e,this.call=t,this.direction=i,this._stream=n,t.on("stream",s=>{if(De&&console.log("Receive stream",`
|
|
977
|
+
Audio:`,s.getAudioTracks(),`
|
|
978
|
+
Video:`,s.getVideoTracks()),this._stream=s,i==="incoming"){const r=new Lx(e,s,this);this.dispatchEvent(r)}}),t.on("close",()=>{this.dispatchEvent(new ay(e,i))})}}function jx(o){return o=o.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1"),o}class vs extends Hm{static instances=new Map;static getOrCreate(e,t){if(vs.instances.has(t))return vs.instances.get(t);const i=new vs(e,t);return vs.instances.set(t,i),i}getMyPeerId(){if(this.context.connection.connectionId)return this.getPeerIdFromUserId(this.context.connection.connectionId)}getPeerIdFromUserId(e){return this.id+"-"+e}getUserIdFromPeerId(e){return e.substring(this.id.length+1)}makeCall(e,t){if(!t?.id){De?console.warn("Can not make a call: mediastream has no id or is undefined"):console.debug("Can not make a call: mediastream has no id or is undefined");return}const i={metadata:{userId:this.context.connection.connectionId,streamId:t.id},sdpTransform:s=>jx(s)},n=this._peer?.call(e,t,i);if(n){const s=this.registerCall(n,"outgoing",t);return De&&console.warn(`\u{1F4DE} CALL ${e}`,`
|
|
979
|
+
Outgoing:`,this._outgoingCalls,`
|
|
980
|
+
Incoming:`,this._incomingCalls),s}else De&&console.error("Failed to make call",e,t,this._peer)}closeAll(){for(const e of this._incomingCalls)e.close();for(const e of this._outgoingCalls)e.close();this.updateCalls()}updateCalls=()=>{for(let e=this._incomingCalls.length-1;e>=0;e--){const t=this._incomingCalls[e];t.isClosed&&!t.isOpening&&this._incomingCalls.splice(e,1)}for(let e=this._outgoingCalls.length-1;e>=0;e--){const t=this._outgoingCalls[e];let i=!1;t.isClosed&&!t.isOpening&&(t.stream?.active?De&&console.warn("!!! Stream is still active, don't remove call",t.userId,"Your id: "+this.context.connection.connectionId):(De&&console.warn("!!! Remove closed call",t.userId),i=!0)),this.context.connection.userIsInRoom(t.userId)===!1&&(De&&console.warn("!!! User is not in room anymore, remove call",t.userId),i=!0),i&&(t.close(),this._outgoingCalls.splice(e,1))}};get peer(){return this._peer}get incomingCalls(){return this._incomingCalls}id;context;_incomingCalls=[];_outgoingCalls=[];_peer;constructor(e,t){super(),this.context=e,this.id=t,this.setupPeer();const i=Object.getOwnPropertyDescriptor(navigator,"getUserMedia")?.writable;try{i?navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia:De&&console.warn("[PeerJs] getUserMedia is not writable")}catch(n){De&&console.error("[PeerJs] Error setting getUserMedia",n)}}_enabled=!1;_enabledPeer=!1;onConnectRoomFn=this.onConnectRoom.bind(this);enable(){this._enabled||(this._enabled=!0,this.context.connection.beginListen(ie.JoinedRoom,this.onConnectRoomFn),this.subscribePeerEvents())}disable(){this._enabled&&(this._enabled=!1,this.context.connection.stopListen(ie.JoinedRoom,this.onConnectRoomFn),this.unsubscribePeerEvents())}onConnectRoom(){this.setupPeer()}async setupPeer(){if(this.context.connection.connectionId&&!this._enabledPeer){if(this._enabledPeer=!0,!this._peer){const e=this.getMyPeerId();e?this._peer=await Xv(e):console.error("Failed to setup peerjs because we dont have a connection id",this.context.connection.connectionId)}this._enabled&&this.subscribePeerEvents()}}subscribePeerEvents(){this._peer&&(this._peer.on("open",this.onPeerConnect),this._peer.on("close",this.onPeerClose),this._peer.on("call",this.onPeerReceivingCall),this._peer.on("disconnected",this.onPeerDisconnected),this._peer.on("error",this.onPeerError))}unsubscribePeerEvents(){this._peer&&(this._peer.off("open",this.onPeerConnect),this._peer.off("close",this.onPeerClose),this._peer.off("call",this.onPeerReceivingCall),this._peer.off("disconnected",this.onPeerDisconnected),this._peer.off("error",this.onPeerError))}onPeerConnect=e=>{if(De&&console.log("PEER opened as",e),e===null){console.error("Peer connection failed",e);return}this.context.connection.send("peer-user-connected",new pT(this,e))};onPeerClose=()=>{De&&console.log("PEER closed"),this.updateCalls()};onPeerDisconnected=()=>{De&&console.log("PEER disconnected"),this.updateCalls()};onPeerError=e=>{De&&console.error("PEER error",e)};onPeerReceivingCall=e=>{e.answer(void 0,{sdpTransform:t=>jx(t)}),this.registerCall(e,"incoming",null)};registerCall(e,t,i){const n=e.metadata;(!n||!n.userId)&&console.error("Missing call metadata",e);const s=n.userId;t==="incoming"&&De?console.warn("\u2190 Receive call from",e.metadata,e.connectionId):De&&console.warn("\u2192 Make call to",e.metadata);const r=t==="incoming"?this._incomingCalls:this._outgoingCalls,a=new mT(s,e,t,i);return r.push(a),e.on("error",l=>{console.error("Call error",l)}),e.on("close",()=>{De&&console.log("Call ended",e.metadata);const l=r.indexOf(a);l!==-1&&r.splice(l,1),a.close(),this.dispatchEvent(new ay(s,t))}),a.addEventListener("call-ended",l=>{this.dispatchEvent(l)}),t==="incoming"&&(a.addEventListener("receive-stream",l=>{this.dispatchEvent(l)}),e.on("stream",()=>{De&&console.log("Received stream for call",e.metadata);let l=0;const c=setInterval(()=>{const h=l===0;!a.isOpen&&h&&(De&&console.warn("Close call because stream is not active",e.metadata),l+=1,clearInterval(c),a.close())},2e3)})),a}}class Md extends Hm{static create(e,t){const i=vs.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new Md(e.context,i)}context;peer;_sendingStreams=new Map;debug=!1;constructor(e,t){if(super(),Dg(e)){const i=e;e=i.context,t=vs.getOrCreate(i.context,i.guid)}else typeof t=="string"&&(t=vs.getOrCreate(e,t));if(e){if(!(e instanceof z))throw new Error("Failed to create NetworkedStreams because context is not an instance of Context")}else throw new Error("Failed to create NetworkedStreams because context is undefined");if(!t)throw new Error("Failed to create NetworkedStreams because peer is undefined");this.context=e,this.peer=t,De&&(this.debug=!0)}startSendingStream(e){this._sendingStreams.has(e)?console.warn("Received start sending stream with stream that is already being sent"):(this._sendingStreams.set(e,[]),this.updateSendingCalls())}stopSendingStream(e){if(e){const t=this._sendingStreams.get(e);if(t){for(const i of t)i.close();t.length=0}this._sendingStreams.delete(e),t&&this.debug&&this.debugLogCurrentState()}this.updateSendingCalls()}_enabled=!1;get enabled(){return this._enabled}enable(){this._enabled||(this._enabled=!0,this.peer.enable(),this.peer.addEventListener("receive-stream",this.onCallStreamReceived),this.peer.addEventListener("call-ended",this.onCallEnded),this.context.connection.beginListen("peer-user-connected",this.onUserConnected),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId=setInterval(this.tick,5e3))}disable(){this._enabled&&(this._enabled=!1,this.peer.disable(),this.peer.removeEventListener("receive-stream",this.onCallStreamReceived),this.peer.removeEventListener("call-ended",this.onCallEnded),this.context.connection.stopListen("peer-user-connected",this.onUserConnected),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId!=null&&(clearInterval(this._tickIntervalId),this._tickIntervalId=void 0))}_tickIntervalId;tick=()=>{this.updateSendingCalls()};onJoinedRoom=e=>{this._sendingStreams.size>0&&(this.debug&&console.warn(`${e?.userId?`User ${e.userId}`:"You"} joined room`,e,this._sendingStreams.size),this.updateSendingCalls())};onLeftRoom=e=>{this.debug&&console.warn(`${e?.userId||"You"} left room`,e),this.stopCallsToUsersThatAreNotInTheRoomAnymore(),this.peer.closeAll()};onCallStreamReceived=e=>{this.debug&&console.log("Call with "+e.userId+" started"),this.dispatchEvent({type:"receive-stream",target:this,stream:e.stream,userId:e.userId}),this.debug&&this.debugLogCurrentState()};onCallEnded=e=>{this.debug&&console.log("Call with "+e.userId+" ended"),this.dispatchEvent(e),this.debug&&this.debugLogCurrentState()};onUserConnected=e=>{if(this.peer.id===e.guid){this.debug&&console.log("PEER USER CONNECTED",e.guid,e,this._sendingStreams.size);const t=this._sendingStreams.keys().next().value;if(!t)return;this.peer.makeCall(e.peerId,t)}else De&&console.log("Unknown user connected",e.guid,e.peerId)};onUserLeft=e=>{this.debug&&console.log("User left room: "+e.userId),this.stopCallsToUsersThatAreNotInTheRoomAnymore()};updateSendingCalls(){const e=this.context.connection.connectionId;for(const t of this._sendingStreams.keys()){const i=this._sendingStreams.get(t)||[];for(const n of this.context.connection.usersInRoom()){if(n===e)continue;const s=this.peer.getPeerIdFromUserId(n);if(i.find(r=>r.peerId===s&&r.direction==="outgoing"&&!r.isClosed&&r.stream?.active))De&&console.debug("Already have a call with user "+n+" / peer "+s);else{const r=this.peer.makeCall(s,t);r&&i.push(r)}}this._sendingStreams.set(t,i)}this.stopCallsToUsersThatAreNotInTheRoomAnymore()}stopCallsToUsersThatAreNotInTheRoomAnymore(){for(const e of this._sendingStreams.keys()){const t=this._sendingStreams.get(e);if(t)for(let i=t.length-1;i>=0;i--){const n=t[i];this.context.connection.userIsInRoom(n.userId)?De&&(this.context.connection.connectionId===n.userId?console.warn(`You are still in the room [${i}] ${n.userId}`):console.log(`User is still in room [${i}] ${n.userId}`)):(De&&console.log(`Remove call ${[i]} to user that is not in room anymore ${n.userId}`),n.close(),t.splice(i,1))}}this.peer.updateCalls(),this.debug&&this.debugLogCurrentState()}debugLogCurrentState(){console.warn(`You (${this.context.connection.connectionId}) are currently sending ${this._sendingStreams.size} and receiving ${this.peer.incomingCalls.length} calls (${this.peer.incomingCalls.map(e=>e.userId).join(", ")})`,this.peer.incomingCalls)}}function Bn(o){if(o&&o instanceof MediaStream)for(const e of o.getTracks())e.stop()}var gT=Object.defineProperty,fT=Object.getOwnPropertyDescriptor,bl=(o,e,t,i)=>{for(var n=i>1?void 0:i?fT(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&gT(e,t,n),n};const yT="noVoip",bT=w("debugvoip");class Fn extends E{autoConnect=!0;runInBackground=!0;createMenuButton=!0;debug=!1;_volume=1;get volume(){return this._volume}set volume(e){this._volume=e;for(const t of this._incomingStreams.values())t.volume=e}getAudioElement(e){return this._incomingStreams.get(e)}get incomingStreams(){return this._incomingStreams}speakingThreshold=30;onSpeakingChanged=new ae;_speakingStates=new Map;_analysers=new Map;_net;_menubutton;awake(){bT&&(this.debug=!0),this.debug&&(console.log("VOIP debugging: press 'v' to toggle mute or 'c' to toggle connect/disconnect"),window.addEventListener("keydown",async e=>{switch(e.key.toLowerCase()){case"v":console.log("MUTE?",!this.isMuted),this.setMuted(!this.isMuted);break;case"c":this.isSending?this.disconnect():this.connect();break}}),window.addEventListener("blur",()=>{console.log("VOIP: MUTE ON BLUR"),this.setMuted(!0)}),window.addEventListener("focus",()=>{console.log("VOIP: UNMUTE ON FOCUS"),this.setMuted(!1)}))}onEnable(){this._net||(this._net=Md.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(co.StreamReceived,this.onReceiveStream),this._net.addEventListener(co.StreamEnded,this.onStreamEnded),this._net.enable(),this.autoConnect&&this.context.connection.isConnected&&this.connect(),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.addEventListener("visibilitychange",this.onVisibilityChanged)}onDisable(){this._net&&(this._net.stopSendingStream(this._outputStream),this._net.removeEventListener(co.StreamReceived,this.onReceiveStream),this._net.removeEventListener(co.StreamEnded,this.onStreamEnded),this._net?.disable()),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.removeEventListener("visibilitychange",this.onVisibilityChanged);for(const e of[...this._analysers.keys()])this.cleanupAnalyser(e)}onDestroy(){this._menubutton?.remove(),this._menubutton=void 0;for(const e of[...this._analysers.keys()])this.cleanupAnalyser(e);for(const e of this._incomingStreams.values())Bn(e.srcObject);this._incomingStreams.clear(),this._speakingStates.clear()}_allowSending=!0;_outputStream=null;get isSending(){return this._outputStream!=null&&this._outputStream.active}async connect(e){if(!this._net)return console.error("Cannot connect to voice chat - NetworkedStreams not initialized. Make sure the component is enabled before calling this method."),!1;if(this.context.connection.isConnected){if(!await I.microphonePermissionsGranted())return console.error("Cannot connect to voice chat - microphone permissions not granted"),this.updateButton(),!1}else return console.error("Cannot connect to voice chat - not connected to server"),this.updateButton(),!1;return this._allowSending=!0,this._net?.stopSendingStream(this._outputStream),Bn(this._outputStream),this._outputStream=await this.getAudioStream(e),this._outputStream?(this.debug&&console.log("VOIP: Got audio stream"),this._net?.startSendingStream(this._outputStream),this.updateButton(),!0):(this.updateButton(),await I.microphonePermissionsGranted()?console.error("VOIP: Could not get audio stream - please make sure to connect an audio device and grant microphone permissions"):Oc("Microphone permissions not granted: Please grant microphone permissions to use voice chat"),(this.debug||A())&&console.log("VOIP: Failed to get audio stream"),!1)}disconnect(e){e?.remember&&(this._allowSending=!1),this._net?.stopSendingStream(this._outputStream),Bn(this._outputStream),this._outputStream=null,this.updateButton()}setMuted(e){const t=this._outputStream?.getAudioTracks();if(t)for(const i of t)i.enabled=!e}get isMuted(){if(this._outputStream===null)return!1;const e=this._outputStream?.getAudioTracks();if(e){for(const t of e)if(!t.enabled)return!0}return!1}async updateButton(){if(this.createMenuButton){if(this._menubutton||(this._menubutton=document.createElement("button"),this._menubutton.addEventListener("click",()=>{this.isSending?this.disconnect({remember:!0}):this.connect(),I.microphonePermissionsGranted().then(e=>{e||be("<strong>Microphone permissions not granted</strong>. Please allow your browser to use the microphone to be able to talk. Click on the button on the left side of your browser's address bar to allow microphone permissions.")})})),this._menubutton){this.context.menu.appendChild(this._menubutton),this.activeAndEnabled?this._menubutton.style.display="":this._menubutton.style.display="none",this._menubutton.title=this.isSending?"Click to disable your microphone":"Click to enable your microphone";let e=(this.isSending,""),t=this.isSending?"mic":"mic_off";await I.microphonePermissionsGranted()||(e="No Permission",t="mic_off",this._menubutton.title="Microphone permissions not granted. Please allow your browser to use the microphone to be able to talk. This can usually be done in the addressbar of the webpage."),this._menubutton.innerText=e,this._menubutton.prepend(vt(t)),this.context.connection.isConnected==!1?this._menubutton.setAttribute("disabled",""):this._menubutton.removeAttribute("disabled")}}else this.activeAndEnabled||this._menubutton?.remove()}getFrequency(e){return this.unsupported_getfrequency||(this.unsupported_getfrequency=!0,A()&&be("VOIP: getFrequency is currently not supported"),console.warn("VOIP: getFrequency is currently not supported")),null}async getAudioStream(e){if(!navigator.mediaDevices.getUserMedia)return console.error("No getDisplayMedia support"),null;const t=async n=>await navigator.mediaDevices.getUserMedia({audio:n??!0,video:!1}).catch(s=>(console.warn("VOIP failed getting audio stream",s),null)),i=await t(e);if(!i)return null;if(I.isiOS()&&e?.deviceId===void 0){const n=(await navigator.mediaDevices.enumerateDevices()).find(s=>(s.kind==="audioinput"||s.kind==="audiooutput")&&!s.label.includes("iPhone"));if(n){const s=Object.assign({},e);return s.deviceId=n.deviceId,await t(s)}}return i}onJoinedRoom=async()=>{this.debug&&console.log("VOIP: Joined room"),await Bo(300),this.autoConnect&&!this.isSending&&this._allowSending&&this.connect()};onLeftRoom=()=>{this.debug&&console.log("VOIP: Left room"),this.disconnect();for(const e of this._incomingStreams.values())Bn(e.srcObject);this._incomingStreams.clear();for(const e of this._analysers.keys())this.cleanupAnalyser(e)};_incomingStreams=new Map;update(){if(!(!this.onSpeakingChanged||this.onSpeakingChanged.listenerCount<=0))for(const[e,t]of this._analysers){t.analyser.getByteFrequencyData(t.data);let i=0;for(let a=0;a<t.data.length;a++)i+=t.data[a];const n=i/t.data.length,s=this._speakingStates.get(e)??!1,r=n>this.speakingThreshold;r!==s&&(this._speakingStates.set(e,r),this.onSpeakingChanged.invoke({userId:e,isSpeaking:r,volume:n/255}))}}setupAnalyser(e,t,i){if(!this._analysers.has(e))try{const n=new AudioContext,s=n.createMediaStreamSource(i),r=n.createAnalyser();r.fftSize=256,s.connect(r);const a=new Uint8Array(r.frequencyBinCount);this._analysers.set(e,{analyser:r,data:a,context:n})}catch(n){this.debug&&console.warn("VOIP: Failed to create analyser for",e,n)}}cleanupAnalyser(e){const t=this._analysers.get(e);t&&(t.context.close(),this._analysers.delete(e)),this._speakingStates.delete(e)}onReceiveStream=e=>{const t=e.target.userId,i=e.stream;let n=this._incomingStreams.get(t);n||(n=new Audio,this._incomingStreams.set(t,n)),n.srcObject=i,n.volume=this._volume,n.setAttribute("autoplay","true"),this.setupAnalyser(t,n,i),Gn.registerWaitForInteraction(()=>{n?.play().catch(s=>{console.error("VOIP: Failed to play audio",s)})})};onStreamEnded=e=>{const t=this._incomingStreams.get(e.userId);Bn(t?.srcObject),this._incomingStreams.delete(e.userId),this.cleanupAnalyser(e.userId)};onEnabledChanged=()=>{for(const e of this._incomingStreams){const t=e[1];t.muted=!this.enabled}};onVisibilityChanged=()=>{if(this.runInBackground)return;const e=document.visibilityState!=="visible";this.setMuted(e);for(const t of this._incomingStreams){const i=t[1];i.muted=e}}}bl([u()],Fn.prototype,"autoConnect",2),bl([u()],Fn.prototype,"runInBackground",2),bl([u()],Fn.prototype,"createMenuButton",2),bl([u()],Fn.prototype,"volume",1),bl([u()],Fn.prototype,"speakingThreshold",2),bl([u(ae)],Fn.prototype,"onSpeakingChanged",2);var _T=Object.defineProperty,Bx=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&_T(e,t,n),n};const vT=w("debugmouth");class yh extends E{idle=[];talking=[];marker=null;voip=null;lastMouthChangeTime=0;mouthChangeLength=0;awake(){setTimeout(()=>{this.voip=x.findObjectOfType(Fn,this.context),this.marker||(this.marker=x.getComponentInParent(this.gameObject,Le))},3e3)}update(){if(!this.voip||this.context.time.frameCount%10!==0)return;let e=this.marker?.connectionId??null;if(!e){vT&&(e=null);return}const t=this.voip.getFrequency(e)??0;this.updateLips(t)}updateLips(e){if(this.context.time.time-this.lastMouthChangeTime>this.mouthChangeLength){if(this.mouthChangeLength=.05+Math.random()*.1,this.talking&&this.talking.length>0&&e>30){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.talking.length);this.setMouthShapeActive(this.talking,t)}else if(this.idle.length>0&&this.context.time.time-this.lastMouthChangeTime>.5){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.idle.length);this.setMouthShapeActive(this.idle,t)}}}setMouthShapeActive(e,t){if(e){e!=this.idle?this.idle.map(i=>i.visible=!1):this.talking.map(i=>i.visible=!1);for(let i=0;i<e.length;i++){const n=e[i];n&&(n.visible=i===t)}}}}Bx([u(M)],yh.prototype,"idle"),Bx([u(M)],yh.prototype,"talking");class ly extends E{voip=null;marker=null;_startPosition=null;awake(){this.voip=x.findObjectOfType(Fn,this.context),this.marker=x.getComponentInParent(this.gameObject,Le)}update(){if(!this.voip||!this.marker||this.context.time.frameCount%10!==0)return;const e=this.marker.connectionId,t=this.voip.getFrequency(e);if(t==null)return;this._startPosition||(this._startPosition=this.gameObject.position.clone());const i=t/100;this.gameObject.position.y=this._startPosition.y+i*.07}}var wT=Object.defineProperty,xT=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wT(e,t,n),n};const _l=w("debugxrflags"),Fx=w("disablexrflags");Fx&&console.warn("XRFlags are disabled");var ho=(o=>(o[o.Never=0]="Never",o[o.Browser=1]="Browser",o[o.AR=2]="AR",o[o.VR=4]="VR",o[o.FirstPerson=8]="FirstPerson",o[o.ThirdPerson=16]="ThirdPerson",o[o.All=4294967295]="All",o))(ho||{});class li{static Global=new li;Mask=17;Has(e){return(this.Mask&e)!==0}Set(e){_l&&console.warn("Set XR flag state to",e),this.Mask=e,cn.Apply()}Enable(e){this.Mask|=e,cn.Apply()}Disable(e){this.Mask&=~e,cn.Apply()}Toggle(e){this.Mask^=e,cn.Apply()}EnableAll(){this.Mask=-1,cn.Apply()}DisableAll(){this.Mask=0,cn.Apply()}}const Ux=class gs extends E{static registry=[];static Apply(){for(const e of this.registry)e.UpdateVisible(li.Global)}static firstApply;static buffer=new li;visibleIn;awake(){gs.registry.push(this)}onEnable(){gs.firstApply?this.UpdateVisible(li.Global):(gs.firstApply=!0,gs.Apply())}onDestroy(){const e=gs.registry.indexOf(this);e>=0&&gs.registry.splice(e,1)}get isOn(){return this.gameObject.visible}UpdateVisible(e=null){if(Fx)return;let t;const i=e;if(i&&typeof i=="number"&&(console.assert(typeof i=="number","XRFlag.UpdateVisible: state must be a number",i),_l&&console.log(i),gs.buffer.Mask=i,e=gs.buffer),e instanceof li?(_l&&console.warn(this.name,"use passed in mask",e.Mask,this.visibleIn),t=e.Has(this.visibleIn)):(_l&&console.log(this.name,"use global mask"),li.Global.Has(this.visibleIn)),t!==void 0)if(t)_l&&console.log(this.name,"is visible",this.gameObject.uuid),x.setActive(this.gameObject,!0);else{if(_l&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}};xT([u()],Ux.prototype,"visibleIn");let cn=Ux;var ST=Object.defineProperty,cp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ST(e,t,n),n};class Zr extends E{eyes=[];lastBlinkTime=0;blinkLength=0;eyesOpen=!0;state=null;awake(){this.state=x.getComponentInParent(this.gameObject,cn)}update(){if(!(!this.gameObject||!this.gameObject.visible||!this.eyes||!Array.isArray(this.eyes)||this.eyes.length===0)&&this.context.time.time-this.lastBlinkTime>this.blinkLength){if(this.lastBlinkTime=this.context.time.time,this.state&&!this.state.isOn||!this.activeAndEnabled)return;if(this.eyesOpen=!this.eyesOpen,this.blinkLength=Math.random(),this.eyesOpen?(this.blinkLength*=3,this.blinkLength+=.5,Math.random()<.1&&(this.blinkLength=.1+Math.random()*.2)):(this.blinkLength*=Math.random()*.2,this.blinkLength+=.1),Math.random()<.1&&(this.blinkLength*=3),this.blinkLength=Math.max(.2,this.blinkLength),this.blinkLength=Math.min(3,this.blinkLength),this.eyes)for(const e of this.eyes)e&&(e.visible=this.eyesOpen)}}}cp([u(M)],Zr.prototype,"eyes"),cp([u()],Zr.prototype,"lastBlinkTime"),cp([u()],Zr.prototype,"blinkLength"),cp([u()],Zr.prototype,"eyesOpen");var CT=Object.defineProperty,cy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&CT(e,t,n),n};const hp=class ZS extends E{head=null;eyes=null;target=null;brain=null;awake(){this.brain||(this.brain=x.getComponentInParent(this.gameObject,fh)),this.brain||(this.brain=x.addComponent(this.gameObject,fh)),this.brain&&this.target&&(this.brain.controlledTarget=this.target)}vec=new b;static forward=new b(0,0,1);currentTargetPoint=new b;update(){const e=this.target;if(e&&this.head){const t=this.eyes;if(t){const i=ee(e);this.currentTargetPoint.lerp(i,this.context.time.deltaTime/.1);const n=ee(this.head),s=this.vec.copy(this.currentTargetPoint).sub(n).normalize();if(s.length()<.1)return;const r=ZS.forward;if(r.set(0,0,1),r.applyQuaternion(_e(this.head)),r.dot(s)>.45)for(let a=0;a<t.length;a++)t[a].lookAt(this.currentTargetPoint)}}}};cy([u(M)],hp.prototype,"head"),cy([u(M)],hp.prototype,"eyes"),cy([u(M)],hp.prototype,"target");let hy=hp;var PT=Object.defineProperty,dy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&PT(e,t,n),n};class vl extends E{length=1;depthTest=!0;isGizmo=!1;_axes=null;onEnable(){if(this.isGizmo&&!Ic)return;this._axes||(this._axes=new Li(this.length)),this._axes.layers.disableAll(),this._axes.layers.set(this.layer),this.gameObject.add(this._axes);const e=this._axes.material;e&&e.depthTest!==void 0&&(e.depthTest=this.depthTest)}onDisable(){this._axes&&this.gameObject.remove(this._axes)}}dy([u()],vl.prototype,"length"),dy([u()],vl.prototype,"depthTest"),dy([u()],vl.prototype,"isGizmo");class uy extends E{from;to;hint;desiredDistance=1;onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=ee(this.to).clone(),t=ee(this.from).clone(),i=e.distanceTo(t),n=e.clone();n.sub(t);const s=t.clone();s.add(e),s.multiplyScalar(.5);const r=ee(this.hint).clone();r.sub(s);const a=new b;a.crossVectors(r,n),a.crossVectors(n,a),a.normalize();const l=i*.5,c=Math.max(this.desiredDistance,l),h=Math.sqrt(c*c-l*l),d=a.clone();d.multiplyScalar(h),d.add(s),bt(this.gameObject,d);const p=s.clone();p.sub(a),this.gameObject.lookAt(p)}}const OT=w("gizmos"),kT=w("debugboxhelper");class zt extends E{box=null;static testBox=new Nt;_lastMatrixUpdateFrame=-1;static _position=new b;static _size=new b(.01,.01,.01);static _emptyObjectSize=new b(.01,.01,.01);isInBox(e){if(!e)return;if(this.box||(this.box=new Nt),ui([e],void 0,void 0,zt.testBox),zt.testBox.isEmpty()){const i=ee(e,zt._position);zt.testBox.setFromCenterAndSize(i,zt._emptyObjectSize)}this.updateBox();const t=this.box?.intersectsBox(zt.testBox);return t&&kT&&B.DrawWireBox3(zt.testBox,16711680,5),t}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new Nt),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const i=t,n=ee(this.gameObject,zt._position,i),s=Ge(this.gameObject,zt._size);this.box.setFromCenterAndSize(n,s)}return this.box}_helper=null;_color=null;awake(){this._helper=null,this._color=null,this.box=null}showHelper(e=null,t=!1){if(!(!OT&&!t)){if(this._helper){e&&this._color?.set(e),this.gameObject.add(this._helper);return}this._helper=kf(e),this.gameObject.add(this._helper)}}}var MT=Object.defineProperty,xi=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&MT(e,t,n),n};class hn extends E{get isCollider(){return!0}attachedRigidbody=null;isTrigger=!1;sharedMaterial;membership=[0];filter;awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Je))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Je))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Je))}onDisable(){this.context.physics.engine?.setColliderEnabled(this,!1)||this.context.physics.engine?.removeBody(this)}onDestroy(){this.context.physics.engine?.removeBody(this)}get body(){return this.context.physics.engine?.getBody(this)}updateProperties=()=>{this.context.physics.engine?.updateProperties(this)};updatePhysicsMaterial(){this.context.physics.engine?.updatePhysicsMaterial(this)}}xi([u(Je)],hn.prototype,"attachedRigidbody"),xi([u()],hn.prototype,"isTrigger"),xi([u()],hn.prototype,"sharedMaterial"),xi([u()],hn.prototype,"membership"),xi([u()],hn.prototype,"filter");class wl extends hn{radius=.5;center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.setColliderEnabled(this,!0)||this.context.physics.engine?.addSphereCollider(this),Gd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),rg(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}xi([Et(),u()],wl.prototype,"radius"),xi([u(b)],wl.prototype,"center");const py=class KS extends hn{static add(e,t){const i=oo(e,KS);return i.autoFit(),t?.rigidbody===!0&&oo(e,Je,{isKinematic:!1}),i}size=new b(1,1,1);center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.setColliderEnabled(this,!0)||this.context.physics.engine?.addBoxCollider(this,this.size),Gd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),rg(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}autoFit(e){const t=this.gameObject,i=t.position.clone(),n=t.quaternion.clone(),s=t.scale.clone(),r=t.parent;t.position.set(0,0,0),t.quaternion.set(0,0,0,1),t.scale.set(1,1,1),t.parent=null,t.updateMatrix();const a=ui([t]);t.position.copy(i),t.quaternion.copy(n),t.scale.copy(s),t.parent=r,e?.debug===!0&&B.DrawWireBox3(a,16768256,20),this.size=a.getSize(new b)||new b(1,1,1),this.center=a.getCenter(new b)||new b(0,0,0),this.size.length()<=0&&this.size.set(.01,.01,.01)}};xi([Et(),u(b)],py.prototype,"size"),xi([u(b)],py.prototype,"center");let dp=py;class Us extends hn{sharedMesh;convex=!1;onEnable(){if(super.onEnable(),!this.context.physics.engine||this.context.physics.engine.setColliderEnabled(this,!0))return;this.sharedMesh?.isMesh||(this.gameObject instanceof H||this.gameObject instanceof Mo)&&(this.sharedMesh=this.gameObject);const e=0;if(this.sharedMesh?.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),He.assignMeshLOD(this.sharedMesh,e).then(t=>{t&&this.activeAndEnabled&&this.context.physics.engine&&this.sharedMesh&&(this.context.physics.engine.removeBody(this),this.sharedMesh.geometry=t,this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex))});else{const t=this.sharedMesh;if(t?.isGroup){console.warn(`MeshCollider mesh is a group "${this.sharedMesh?.name||this.gameObject.name}", adding all children as colliders. This is currently not fully supported (colliders can not be removed from world again)`,this);const i=new Array;for(const n in t.children){const s=t.children[n];s.isMesh&&(this.context.physics.engine.addMeshCollider(this,s,this.convex),i.push(He.assignMeshLOD(s,e)))}Promise.all(i).then(n=>{if(n.some(r=>r)==!1)return;this.context.physics.engine?.removeBody(this);const s=new H;for(const r of n)r&&this.activeAndEnabled&&(s.geometry=r,this.context.physics.engine?.addMeshCollider(this,s,this.convex))})}else(A()||w("showcolliders"))&&console.warn(`[MeshCollider] A MeshCollider mesh is assigned to an unknown object on "${this.gameObject.name}", but it's neither a Mesh nor a Group. Please double check that you attached the collider component to the right object and report a bug otherwise!`,this)}}}xi([u(H)],Us.prototype,"sharedMesh"),xi([u()],Us.prototype,"convex");class qo extends hn{center=new b(0,0,0);radius=.5;height=2;onEnable(){super.onEnable(),this.context.physics.engine?.setColliderEnabled(this,!0)||this.context.physics.engine?.addCapsuleCollider(this,this.height,this.radius)}}xi([u(b)],qo.prototype,"center"),xi([u()],qo.prototype,"radius"),xi([u()],qo.prototype,"height");var ET=Object.defineProperty,Xo=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ET(e,t,n),n};const zx=w("debugcharactercontroller");class Kr extends E{center=new b(0,0,0);radius=.5;height=2;_rigidbody=null;get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(Je),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(Je)),this.rigidbody)}_activeGroundCollisions;awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(qo);t||(t=this.gameObject.addComponent(qo)),t.center.copy(this.center),t.radius=this.radius,t.height=this.height;const i=new b(0,0,1),n=new b(1,0,0),s=new b(0,1,0),r=this.gameObject.getWorldDirection(new b);r.y=0;const a=n.dot(r)<0?-1:1,l=i.angleTo(r)*a;this.gameObject.setRotationFromAxisAngle(s,l),e.lockRotationX=!0,e.lockRotationY=!0,e.lockRotationZ=!0}move(e){this.gameObject.position.add(e)}onCollisionEnter(e){(e.contacts.length==0||e.contacts.some(t=>t.normal.y>.2))&&(this._activeGroundCollisions.add(e),zx&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),zx&&console.log(`Collision(${this._activeGroundCollisions.size}) - ${this.isGrounded}`)}get isGrounded(){return this._activeGroundCollisions.size>0}_contactVelocity=new b;get contactVelocity(){this._contactVelocity.set(0,0,0);for(const e of this._activeGroundCollisions){const t=this.context.physics.engine?.getLinearVelocity(e.collider);t&&(this._contactVelocity.x+=t.x,this._contactVelocity.y+=t.y,this._contactVelocity.z+=t.z)}return this._contactVelocity}}Xo([u(b)],Kr.prototype,"center"),Xo([u()],Kr.prototype,"radius"),Xo([u()],Kr.prototype,"height");class Qo extends E{controller;movementSpeed=2;rotationSpeed=2;jumpForce=1;doubleJumpForce=2;animator;lookForward=!0;awake(){this._currentRotation=new N}update(){const e=this.context.input;e.isKeyPressed("KeyW")?this.moveInput.y+=1:e.isKeyPressed("KeyS")&&(this.moveInput.y-=1),e.isKeyPressed("KeyD")?this.lookInput.x+=1:e.isKeyPressed("KeyA")&&(this.lookInput.x-=1),this.jumpInput||=e.isKeyDown("Space")}move(e){this.moveInput.add(e)}look(e){this.lookInput.add(e)}jump(){this.jumpInput=!0}lookInput=new K(0,0);moveInput=new K(0,0);jumpInput=!1;onBeforeRender(){this.handleInput(this.moveInput,this.lookInput,this.jumpInput),this.lookInput.set(0,0),this.moveInput.set(0,0),this.jumpInput=!1}_currentSpeed=new b(0,0,0);_currentAngularSpeed=new b(0,0,0);_temp=new b(0,0,0);_jumpCount=0;_currentRotation;handleInput(e,t,i){if(this.controller?.isGrounded&&(this._jumpCount=0,this.doubleJumpForce>0&&this.animator?.setBool("doubleJump",!1)),this._currentSpeed.z+=e.y*this.movementSpeed*this.context.time.deltaTime,this.animator?.setBool("running",e.length()>.01),this.animator?.setBool("jumping",this.controller?.isGrounded===!0&&i),this._temp.copy(this._currentSpeed),this._temp.applyQuaternion(this.gameObject.quaternion),this.controller?this.controller.move(this._temp):this.gameObject.position.add(this._temp),this._currentAngularSpeed.y+=D.toRadians(-t.x*this.rotationSpeed)*this.context.time.deltaTime,this.lookForward&&Math.abs(this._currentAngularSpeed.y)<.01){const n=this.context.mainCameraComponent.forward;n.y=0,n.normalize(),this._currentRotation.setFromUnitVectors(new b(0,0,1),n),this.gameObject.quaternion.slerp(this._currentRotation,this.context.time.deltaTime*10)}if(this.gameObject.rotateY(this._currentAngularSpeed.y),this._currentSpeed.multiplyScalar(1-this.context.time.deltaTime*10),this._currentAngularSpeed.y*=1-this.context.time.deltaTime*10,this.controller&&i&&this.jumpForce>0){let n=this.controller?.isGrounded;if(this.doubleJumpForce>0&&!this.controller?.isGrounded&&this._jumpCount===1&&(n=!0,this.animator?.setBool("doubleJump",!0)),n){this._jumpCount+=1;const s=this.controller.rigidbody,r=this._jumpCount===2?this.doubleJumpForce:this.jumpForce;s.applyImpulse(new b(0,1,0).multiplyScalar(r))}}if(this.controller){const n=this.controller?.rigidbody.getVelocity().y;if(n<-1){this._raycastOptions.ray||(this._raycastOptions.ray=new Eo),this._raycastOptions.ray.origin.copy(ee(this.gameObject)),this._raycastOptions.ray.direction.set(0,-1,0);const s=this.layer;this.gameObject.layers.disableAll(),this.gameObject.layers.set(2);const r=this.context.physics.raycast(this._raycastOptions);this.gameObject.layers.set(s),(r.length&&r[0].distance>2||n<-10)&&this.animator?.setBool("falling",!0)}else this.animator?.setBool("falling",!1)}}_raycastOptions=new Ts}Xo([u(Kr)],Qo.prototype,"controller"),Xo([u()],Qo.prototype,"movementSpeed"),Xo([u()],Qo.prototype,"rotationSpeed"),Xo([u()],Qo.prototype,"jumpForce"),Xo([u()],Qo.prototype,"doubleJumpForce"),Xo([u(wt)],Qo.prototype,"animator");const Nx=Symbol("customVisibilityFlag");function Yo(o,e){o.layers[Nx]=e}const Wx=Symbol("DidPatchLayers");function RT(){const o=xs.prototype;if(o[Wx])return;o[Wx]=!0;const e=o.test;o.test=function(t){return this[Nx]===!1?!1:e.call(this,t)}}var TT=Object.defineProperty,xl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&TT(e,t,n),n};const bh=w("debugcontactshadows");au(o=>{const e=o.domElement.getAttribute("contactshadows")||o.domElement.getAttribute("contact-shadows");if(e!=null&&e!="0"&&e!="false"){console.debug("Auto-creating ContactShadows because of `contactshadows` attribute");const t=_h.auto(o),i=parseFloat(e);isNaN(i)||(t.opacity=i,t.darkness=i)}});const Jr=class xd extends E{static _instances=new Map;static auto(e,t){if(e||(e=z.Current),!e)throw new Error("No context provided and no current context set.");let i=this._instances.get(e);if(!i||i.destroyed){const n=new M;n.name="ContactShadows",i=oo(n,xd,{autoFit:!1,occludeBelowGround:!1}),this._instances.set(e,i)}return e.scene.add(i.gameObject),i.fitShadows(t),i}autoFit=!1;darkness=.5;opacity=.5;blur=4;occludeBelowGround=!1;backfaceShadows=!0;minSize;manualUpdate=!1;set needsUpdate(e){this._needsUpdate=e}get needsUpdate(){return this._needsUpdate}_needsUpdate=!1;shadowsRoot=new M;shadowCamera;shadowGroup=new Mo;renderTarget;renderTargetBlur;plane;occluderMesh;blurPlane;planeMaterial;depthMaterial;horizontalBlurMaterial;verticalBlurMaterial;textureSize=512;fitShadows(e={}){bh&&console.warn("Fitting shadows to scene"),Yd(this.shadowsRoot,!1);const t=e.object||this.context.scene,i=ui(t,[this.shadowsRoot]),n=Math.max(1,this.blur/32),s=i.max.x-i.min.x,r=i.max.z-i.min.z;i.expandByVector(new b(n*s,0,n*r)),bh&&B.DrawWireBox3(i,16776960,60),this.gameObject.parent&&i.applyMatrix4(this.gameObject.parent.matrixWorld.clone().invert());const a=i.min,l=Math.max(1e-5,(i.max.y-a.y)*.002);i.max.y+=l,this.shadowsRoot.position.set((a.x+i.max.x)/2,a.y-l,(a.z+i.max.z)/2),this.shadowsRoot.scale.set(i.max.x-a.x,i.max.y-a.y,i.max.z-a.z),e.positionOffset&&(e.positionOffset.x!==void 0&&(this.shadowsRoot.position.x+=e.positionOffset.x),e.positionOffset.y!==void 0&&(this.shadowsRoot.position.y+=e.positionOffset.y),e.positionOffset.z!==void 0&&(this.shadowsRoot.position.z+=e.positionOffset.z)),e.scaleFactor&&(e.scaleFactor.x!==void 0&&(this.shadowsRoot.scale.x*=e.scaleFactor.x),e.scaleFactor.y!==void 0&&(this.shadowsRoot.scale.y*=e.scaleFactor.y),e.scaleFactor.z!==void 0&&(this.shadowsRoot.scale.z*=e.scaleFactor.z)),this.applyMinSize(),this.shadowsRoot.matrixWorldNeedsUpdate=!0,bh&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){xd._instances.set(this.context,this),this.shadowsRoot.hideFlags=su.DontExport,Yd(this.shadowsRoot,!1)}start(){bh&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new Qn(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new Qn(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const e=new Pn(1,1).rotateX(Math.PI/2);this.gameObject instanceof H&&(console.warn("ContactShadows can not be added to a Mesh. Please add it to a Group or an empty Object"),Yo(this.gameObject,!1));const t=this.planeMaterial=new Ce({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:Cs});this.plane=new H(e,t),this.plane.scale.y=-1,this.plane.layers.set(2),this.shadowsRoot.add(this.plane),this.plane&&(this.plane.renderOrder=1),this.occluderMesh=new H(this.plane.geometry,new Ce({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:Wd})).translateY(-1e-4),this.occluderMesh.renderOrder=-100,this.occluderMesh.layers.set(2),this.shadowsRoot.add(this.occluderMesh),this.blurPlane=new H(e),this.blurPlane.visible=!1,this.shadowGroup.add(this.blurPlane);const i=0,n=1;this.shadowCamera=new Ad(-1/2,1/2,1/2,-1/2,i,n),this.shadowCamera.layers.enableAll(),this.shadowCamera.rotation.x=Math.PI/2,this.shadowCamera.matrixWorldAutoUpdate=!1,this.shadowGroup.add(this.shadowCamera),this.shadowCamera.updateMatrix(),this.depthMaterial=new IC,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=LC,this.depthMaterial.blendEquation=DC,this.depthMaterial.onBeforeCompile=s=>{this.depthMaterial&&(s.uniforms.darkness=this.depthMaterial.userData.darkness,s.fragmentShader=`
|
|
981
|
+
uniform float darkness;
|
|
982
|
+
${s.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );","gl_FragColor = vec4( vec3( 1.0 ), ( 1.0 - fragCoordZ ) * darkness * opacity * (gl_FrontFacing ? 1.0 : 0.66) );")}
|
|
983
|
+
`)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new Xn(IP),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new Xn(LP),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){xd._instances.get(this.context)===this&&xd._instances.delete(this.context),this.renderTarget?.dispose(),this.renderTargetBlur?.dispose(),this.depthMaterial?.dispose(),this.horizontalBlurMaterial?.dispose(),this.verticalBlurMaterial?.dispose(),this.blurPlane?.geometry.dispose(),this.plane?.geometry.dispose(),this.occluderMesh?.geometry.dispose()}onBeforeRender(e){if(this.manualUpdate&&!this._needsUpdate)return;if(this._needsUpdate=!1,!this.renderTarget||!this.renderTargetBlur||!this.depthMaterial||!this.shadowCamera||!this.blurPlane||!this.shadowGroup||!this.plane||!this.horizontalBlurMaterial||!this.verticalBlurMaterial||!this.planeMaterial){bh&&console.error("ContactShadows: not initialized yet");return}this.depthMaterial.userData.darkness.value=this.darkness,this.planeMaterial.opacity=this.opacity;const t=this.context.scene,i=this.context.renderer,n=i.getRenderTarget();this.shadowGroup.visible=!0,this.occluderMesh&&(this.occluderMesh.visible=!1);const s=this.plane.visible;this.plane.visible=!1,this.gameObject instanceof H&&Yo(this.gameObject,!1);const r=t.background;t.background=null,t.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=Ii:this.depthMaterial.side=Cs;const a=i.getClearAlpha();i.setClearAlpha(0);const l=i.xr.enabled;i.xr.enabled=!1;const c=this.context.scene.matrixWorldAutoUpdate;this.context.scene.matrixWorldAutoUpdate=!1;const h=i.renderLists.get(t,0),d=h.transparent;Vx.length=0,h.transparent=Vx,my.length=0;for(const m of h.opaque){if(!m.object.visible)continue;const f=m.material;let g=m.material.colorWrite==!1||f.wireframe===!0||z_(m.object)===!1;!g&&m.material.isLineMaterial&&(g=!0),!g&&m.material.isPointsMaterial&&(g=!0),g&&(my.push(m.object),m.object["needle:visible"]=m.object.visible,m.object.visible=!1)}this.shadowCamera.parent?this.shadowCamera.matrixWorld.multiplyMatrices(this.shadowCamera.parent.matrixWorld,this.shadowCamera.matrix):this.shadowCamera.matrixWorld.copy(this.shadowCamera.matrix),this.shadowCamera.matrixWorldInverse.copy(this.shadowCamera.matrixWorld).invert(),i.setRenderTarget(this.renderTarget),i.clear(),i.render(t,this.shadowCamera),h.transparent=d;for(const m of my)m["needle:visible"]!=null&&(m.visible=m["needle:visible"]);t.overrideMaterial=null;const p=Math.max(this.blur,.05);this.blurShadow(p*2),this.blurShadow(p*.5),this.shadowGroup.visible=!1,this.occluderMesh&&(this.occluderMesh.visible=this.occludeBelowGround),this.plane.visible=s,i.setRenderTarget(n),i.setClearAlpha(a),t.background=r,i.xr.enabled=l,this.context.scene.matrixWorldAutoUpdate=c}blurShadow(e){if(!this.blurPlane||!this.shadowCamera||!this.renderTarget||!this.renderTargetBlur||!this.horizontalBlurMaterial||!this.verticalBlurMaterial)return;this.blurPlane.visible=!0;const t=this.shadowsRoot.worldScale,i=(t.x+t.z)/2,n=t.z/i,s=t.x/i;this.blurPlane.material=this.horizontalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTarget.texture,this.horizontalBlurMaterial.uniforms.h.value=e*1/this.textureSize*n;const r=this.context.renderer,a=r.getRenderTarget();r.setRenderTarget(this.renderTargetBlur),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.material=this.verticalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTargetBlur.texture,this.verticalBlurMaterial.uniforms.v.value=e*1/this.textureSize*s,r.setRenderTarget(this.renderTarget),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.visible=!1,r.setRenderTarget(a)}applyMinSize(){this.minSize&&this.shadowsRoot.scale.set(Math.max(this.minSize.x||0,this.shadowsRoot.scale.x),Math.max(this.minSize.y||0,this.shadowsRoot.scale.y),Math.max(this.minSize.z||0,this.shadowsRoot.scale.z))}};xl([u()],Jr.prototype,"autoFit"),xl([u()],Jr.prototype,"darkness"),xl([u()],Jr.prototype,"opacity"),xl([u()],Jr.prototype,"blur"),xl([u()],Jr.prototype,"occludeBelowGround"),xl([u()],Jr.prototype,"backfaceShadows");let _h=Jr;const Vx=[],my=new Array,AT=w("logstats");class gy extends E{onEnable(){console.log(this),AT&&this.startCoroutine(this.run(),xe.OnAfterRender)}*run(){for(;this.enabled;){const e=this.context.renderer.info;console.log(e.memory,e.render,e.programs),yield}}}class vh extends E{isUsed=!0;usedBy=null}class fy extends E{}const $x=w("debugdeletable");class yr extends zt{static _instances=[];onEnable(){yr._instances.push(this)}onDisable(){const e=yr._instances.indexOf(this);e>=0&&yr._instances.splice(e,1)}}class yy extends E{update(){for(const e of yr._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const i=x.getComponentInParent(this.gameObject,vh);if(i)$x&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,i);else{if($x)try{if(e.box){const n=e.box,s=zt.testBox;B.DrawWireBox3(n,16711680,5),B.DrawWireBox3(s,255,5),console.log("DeleteBox: Destroying",this.gameObject,{deleteBoxArea:n,deletedObjectArea:s})}else console.log("DeleteBox: Destroying",this.gameObject)}catch{}Ac(this.gameObject,this.context.connection)}}}}}var IT=Object.defineProperty,LT=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&IT(e,t,n),n};class up extends E{visibleOn;onEnable(){this.apply()}apply(){this.test()||x.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:I.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}LT([u()],up.prototype,"visibleOn");var DT=Object.defineProperty,ea=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&DT(e,t,n),n};const uo=w("debugdrag"),by=[];var _y=(o=>(o[o.XZPlane=0]="XZPlane",o[o.Attached=1]="Attached",o[o.HitNormal=2]="HitNormal",o[o.DynamicViewAngle=3]="DynamicViewAngle",o[o.SnapToSurfaces=4]="SnapToSurfaces",o[o.None=5]="None",o))(_y||{});const zs=class yn extends E{static get HasAnySelected(){return this._active>0}static _active=0;static get CurrentlySelected(){by.length=0;for(const e of this._instances)e._isDragging&&by.push(e);return by}static _instances=[];dragMode=3;snapGridResolution=0;keepRotation=!0;xrDragMode=1;xrKeepRotation=!1;xrDistanceDragFactor=1;showGizmo=!1;get draggedObject(){return this._targetObject}setTargetObject(e){this._targetObject=e;for(const i of this._dragHandlers.values())i.setTargetObject(e);const t="_rigidbody-was-kinematic";this._rigidbody?.[t]===!1&&(this._rigidbody.isKinematic=!1,this._rigidbody[t]=void 0),this._rigidbody=null,e&&(this._rigidbody=x.getComponentInChildren(e,Je),this._rigidbody?.isKinematic===!1&&(this._rigidbody.isKinematic=!0,this._rigidbody[t]=!1))}_rigidbody=null;_targetObject=null;_dragHelper=null;static lastHovered;_draggingRigidbodies=[];_potentialDragStartEvt=null;_dragHandlers=new Map;_totalMovement=new b;_marker=null;_isDragging=!1;_didDrag=!1;awake(){this._potentialDragStartEvt=null,this._dragHandlers=new Map,this._totalMovement=new b,this._marker=null,this._isDragging=!1,this._didDrag=!1,this._dragHelper=null,this._draggingRigidbodies=[]}start(){this.gameObject.getComponentInParent(an)||this.gameObject.addComponent(an)}onEnable(){yn._instances.push(this),this.context.accessibility.updateElement(this,{role:"button",label:"Drag "+(this.gameObject.name||"object"),hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0}),yn._instances=yn._instances.filter(e=>e!==this)}onDestroy(){this.context.accessibility.removeElement(this)}allowEdit(e=null){return this.context.connection.allowEditing}onPointerEnter(e){if(!this.allowEdit(this.gameObject)||e.mode!=="screen"||(e.event.mode==="tracked-pointer"||e.event.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)return;const t=x.getComponentInParent(e.object,yn);!t||t!==this||(yn.lastHovered=e.object,this.context.domElement.style.cursor="pointer",this.context.accessibility.hover(this,`Draggable ${e.object?.name}`))}onPointerMove(e){(this._isDragging||this._potentialDragStartEvt!==null)&&e.use()}onPointerExit(e){this.allowEdit(this.gameObject)&&e.mode==="screen"&&yn.lastHovered===e.object&&(this.context.domElement.style.cursor="auto")}onPointerDown(e){if(!(!this.allowEdit(this.gameObject)||e.used||(e.mode==="tracked-pointer"||e.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)&&(yn.lastHovered=e.object,e.button===0)){this._dragHandlers.size===0&&(this._didDrag=!1,this._totalMovement.set(0,0,0),this._potentialDragStartEvt=e),this._targetObject||this.setTargetObject(this.gameObject),yn._active+=1;const t=new vy(this,this._targetObject);if(this._dragHandlers.set(e.event.space,t),t.onDragStart(e),this._dragHandlers.size===2){const i=this._dragHandlers.values(),n=i.next().value,s=i.next().value;if(n instanceof vy&&s instanceof vy){const r=new jT(this,this._targetObject,n,s);this._dragHandlers.set(this.gameObject,r),r.onDragStart(e)}else console.error("Attempting to construct a MultiTouchDragHandler with invalid DragPointerHandlers. This is likely a bug.",{a:n,b:s})}e.use(),this.context.accessibility.updateElement(this,{role:"button",label:"Dragging "+(this.gameObject.name||"object"),hidden:!1,busy:!0}),this.context.accessibility.focus(this)}}onPointerUp(e){if(uo&&B.DrawLabel(e.point??this.gameObject.worldPosition,"POINTERUP:"+e.pointerId+", "+e.button,.03,3),!this.allowEdit(this.gameObject)||e.button!==0)return;this._potentialDragStartEvt=null;const t=this._dragHandlers.get(e.event.space),i=this._dragHandlers.get(this.gameObject);i&&(i.handlerA===t||i.handlerB===t)&&(this._dragHandlers.delete(this.gameObject),i.onDragEnd(e)),t&&(yn._active>0&&(yn._active-=1),this.setTargetObject(null),t.onDragEnd&&t.onDragEnd(e),this._dragHandlers.delete(e.event.space),this._dragHandlers.size===0&&this.onLastDragEnd(e),e.use()),this.context.accessibility.unfocus(this),this.context.accessibility.updateElement(this,{busy:!1})}update(){for(const e of this._dragHandlers.values())e.collectMovementInfo&&e.collectMovementInfo(),e.getTotalMovement&&this._totalMovement.add(e.getTotalMovement());if(this._potentialDragStartEvt){if(!this._didDrag)if(this._totalMovement.length()>3e-4)this._didDrag=!0;else return;const e=this._potentialDragStartEvt;this._potentialDragStartEvt=null,this.onFirstDragStart(e)}for(const e of this._dragHandlers.values())e.onDragUpdate&&e.onDragUpdate(this._dragHandlers.size);this._dragHelper&&this._dragHelper.hasSelected&&this.onAnyDragUpdate()}onFirstDragStart(e){if(!e||!e.object)return;const t=x.getComponentInParent(e.object,yn);if(!t||t!==this&&t._isDragging)return;const i=this._targetObject||this.gameObject;if(!i)return;this._isDragging=!0;const n=x.getComponentInChildren(i,Ln);uo&&console.log("DRAG START",n,i),n&&(n.fastMode=!0,n?.requestOwnership()),this._marker=x.addComponent(i,vh),this._draggingRigidbodies.length=0;const s=x.getComponentsInChildren(i,Je);s&&this._draggingRigidbodies.push(...s),i.matrixAutoUpdate===!1&&!globalThis["DragControls:MatrixWarningShown"]&&(globalThis["DragControls:MatrixWarningShown"]=!0,console.warn("Dragging an object with matrixAutoUpdate=false can lead to unexpected behavior. Consider enabling matrixAutoUpdate or updating the matrix manually during dragging."))}onAnyDragUpdate(){if(!this._dragHelper)return;this._dragHelper.showGizmo=this.showGizmo,this._dragHelper.onUpdate(this.context);for(const t of this._draggingRigidbodies)t.wakeUp(),t.resetVelocities(),t.resetForcesAndTorques();const e=this._targetObject||this.gameObject;vn.markDirty(e)}onLastDragEnd(e){if(!this||!this._isDragging)return;this._isDragging=!1;for(const i of this._draggingRigidbodies)i.setVelocity(i.smoothedVelocity.multiplyScalar(this.context.time.deltaTime));if(this._draggingRigidbodies.length=0,this._targetObject=null,e?.object){const i=x.getComponentInChildren(e.object,Ln);i&&(i.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const t=this._dragHelper.selected;uo&&console.log("DRAG END",t,t?.visible),this._dragHelper.setSelected(null,this.context)}};ea([u()],zs.prototype,"dragMode"),ea([u()],zs.prototype,"snapGridResolution"),ea([u()],zs.prototype,"keepRotation"),ea([u()],zs.prototype,"xrDragMode"),ea([u()],zs.prototype,"xrKeepRotation"),ea([u()],zs.prototype,"xrDistanceDragFactor"),ea([u()],zs.prototype,"showGizmo");let ta=zs;class jT{handlerA;handlerB;context;settings;gameObject;_handlerAAttachmentPoint=new b;_handlerBAttachmentPoint=new b;_followObject;_manipulatorObject;_deviceMode;_followObjectStartWorldQuaternion=new N;constructor(e,t,i,n){this.context=e.context,this.settings=e,this.gameObject=t,this.handlerA=i,this.handlerB=n,this._followObject=new M,this._manipulatorObject=new M,this.context.scene.add(this._manipulatorObject);const s=Z.active?.rig?.gameObject;if(!this.handlerA||!this.handlerB||!this.handlerA.hitPointInLocalSpace||!this.handlerB.hitPointInLocalSpace){console.error("Invalid: MultiTouchDragHandler needs two valid DragPointerHandlers with hitPointInLocalSpace set.");return}if(this._tempVec1.copy(this.handlerA.hitPointInLocalSpace),this._tempVec2.copy(this.handlerB.hitPointInLocalSpace),this.gameObject.localToWorld(this._tempVec1),this.gameObject.localToWorld(this._tempVec2),s&&(s.worldToLocal(this._tempVec1),s.worldToLocal(this._tempVec2)),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.02?(uo&&console.log("Finding alternative drag attachment points since initial distance is too low: "+this._initialDistance.toFixed(2)),this.handlerA.followObject.parent.getWorldPosition(this._tempVec1),this.handlerB.followObject.parent.getWorldPosition(this._tempVec2),this._handlerAAttachmentPoint.copy(this._tempVec1),this._handlerBAttachmentPoint.copy(this._tempVec2),this.gameObject.worldToLocal(this._handlerAAttachmentPoint),this.gameObject.worldToLocal(this._handlerBAttachmentPoint),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.001&&(console.warn("Not supported right now \u2013 controller drag points for multitouch are too close!"),this._initialDistance=1)):(this._handlerAAttachmentPoint.copy(this.handlerA.hitPointInLocalSpace),this._handlerBAttachmentPoint.copy(this.handlerB.hitPointInLocalSpace)),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._initialScale.copy(t.scale),uo){this._followObject.add(new Li(2)),this._manipulatorObject.add(new Li(5));const r=a=>`${a.x.toFixed(2)}, ${a.y.toFixed(2)}, ${a.z.toFixed(2)}`;B.DrawLine(this._tempVec1,this._tempVec2,65535,0,!1),B.DrawLabel(this._tempVec3,"A:B "+this._initialDistance.toFixed(2)+`
|
|
984
|
+
`+r(this._tempVec1)+`
|
|
985
|
+
`+r(this._tempVec2),.03,5)}}onDragStart(e){this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.matrix.identity(),this._deviceMode=e.mode,this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this.alignManipulator(),this._manipulatorObject.attach(this._followObject),this._manipulatorPosOffset.copy(this._followObject.position),this._manipulatorRotOffset.copy(this._followObject.quaternion),this._manipulatorScaleOffset.copy(this._followObject.scale)}onDragEnd(e){if(!this.handlerA||!this.handlerB){console.error("onDragEnd called on MultiTouchDragHandler without valid handlers. This is likely a bug.");return}this.handlerA.recenter(),this.handlerB.recenter(),this._manipulatorObject.removeFromParent(),this._followObject.removeFromParent(),this._manipulatorObject.destroy(),this._followObject.destroy()}_manipulatorPosOffset=new b;_manipulatorRotOffset=new N;_manipulatorScaleOffset=new b;_tempVec1=new b;_tempVec2=new b;_tempVec3=new b;tempLookMatrix=new J;_initialScale=new b;_initialDistance=0;alignManipulator(){if(!this.handlerA||!this.handlerB){console.error("alignManipulator called on MultiTouchDragHandler without valid handlers. This is likely a bug.",this);return}if(!this.handlerA.followObject||!this.handlerB.followObject){console.error("alignManipulator called on MultiTouchDragHandler without valid follow objects. This is likely a bug.",this.handlerA,this.handlerB);return}this._tempVec1.copy(this._handlerAAttachmentPoint),this._tempVec2.copy(this._handlerBAttachmentPoint),this.handlerA.followObject.localToWorld(this._tempVec1),this.handlerB.followObject.localToWorld(this._tempVec2),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._manipulatorObject.position.copy(this._tempVec3);const e=this.context.mainCamera;this.tempLookMatrix.lookAt(this._tempVec3,this._tempVec2,e.worldUp),this._manipulatorObject.quaternion.setFromRotationMatrix(this.tempLookMatrix);const t=this._tempVec1.distanceTo(this._tempVec2);this._manipulatorObject.scale.copy(this._initialScale).multiplyScalar(t/this._initialDistance),this._manipulatorObject.updateMatrix(),this._manipulatorObject.updateMatrixWorld(!0),uo&&(B.DrawLabel(this._tempVec3.clone().add(new b(0,.2,0)),"A:B "+t.toFixed(2),.03),B.DrawLine(this._tempVec1,this._tempVec2,65280,0,!1))}onDragUpdate(){this.alignManipulator();const e=30,t=1;this._followObject.position.copy(this._manipulatorPosOffset),this._followObject.quaternion.copy(this._manipulatorRotOffset),this._followObject.scale.copy(this._manipulatorScaleOffset);const i=this.gameObject,n=this._followObject;if(!i){console.error("MultiTouchDragHandler has no dragged object. This is likely a bug.");return}n.updateMatrix(),n.updateMatrixWorld(!0);const s=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrKeepRotation:this.settings.keepRotation;if(this.settings.snapGridResolution>0){const h=this._followObject.worldPosition,d=this.settings.snapGridResolution;h.x=Math.round(h.x/d)*d,h.y=Math.round(h.y/d)*d,h.z=Math.round(h.z/d)*d,this._followObject.worldPosition=h,this._followObject.updateMatrix()}s&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const r=D.clamp01(this.context.time.deltaTime*e*t),a=i.worldPosition;a.lerp(n.worldPosition,r),i.worldPosition=a;const l=i.worldQuaternion;l.slerp(n.worldQuaternion,r),i.worldQuaternion=l;const c=i.worldScale;c.lerp(n.worldScale,r),i.worldScale=c,i.matrixAutoUpdate===!1&&i.updateMatrix()}setTargetObject(e){this.gameObject=e}}class vy{getTotalMovement(){return this._totalMovement}get followObject(){return this._followObject}get hitPointInLocalSpace(){return this._hitPointInLocalSpace}context;gameObject;settings;_lastRig=void 0;_followObject;_totalMovement=new b;_totalMovementAlongRayDirection=0;_grabStartDistance=0;_deviceMode;_followObjectStartPosition=new b;_followObjectStartQuaternion=new N;_followObjectStartWorldQuaternion=new N;_lastDragPosRigSpace;_tempVec=new b;_tempMat=new J;_hitPointInLocalSpace=new b;_hitNormalInLocalSpace=new b;_bottomCenter=new b;_backCenter=new b;_backBottomCenter=new b;_bounds=new Nt;_dragPlane=new wr(new b(0,1,0));_draggedOverObject=null;_draggedOverObjectLastSetUp=null;_draggedOverObjectLastNormal=new b;_draggedOverObjectDuration=0;setTargetObject(e){this.gameObject=e}constructor(e,t){this.settings=e,this.context=e.context,this.gameObject=t,this._followObject=new M}recenter(){if(!this._followObject.parent){console.warn("Error: space follow object doesn't have parent but recenter() is called. This is likely a bug");return}if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}const e=this._followObject.parent;this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.position.set(0,0,0),this._followObject.quaternion.set(0,0,0,1),this._followObject.scale.set(1,1,1),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0),e.attach(this._followObject),this._followObjectStartPosition.copy(this._followObject.position),this._followObjectStartQuaternion.copy(this._followObject.quaternion),this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const t=this._hitPointInLocalSpace.clone();this.gameObject.localToWorld(t),this._grabStartDistance=t.distanceTo(e.worldPosition);const i=Z.active?.rig?.gameObject?.worldScale.x||1;this._grabStartDistance/=i,this._totalMovementAlongRayDirection=0,this._lastDragPosRigSpace=void 0,uo&&(B.DrawLine(t,e.worldPosition,65280,.5,!1),B.DrawLabel(e.worldPosition.add(new b(0,.1,0)),this._grabStartDistance.toFixed(2),.03,.5))}onDragStart(e){if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}if(e.event.space.add(this._followObject),this._lastDragPosRigSpace=void 0,e.point&&e.normal)this._hitPointInLocalSpace.copy(e.point),this.gameObject.worldToLocal(this._hitPointInLocalSpace),this._hitNormalInLocalSpace.copy(e.normal);else if(e){const m=e.event.space,f=m.worldPosition;this.gameObject.worldToLocal(f),this._hitPointInLocalSpace.copy(f);const g=m.worldUp;this._tempMat.copy(this.gameObject.matrixWorld).invert(),g.transformDirection(this._tempMat),this._hitNormalInLocalSpace.copy(g)}this.recenter(),this._totalMovement.set(0,0,0),this._deviceMode=e.mode;const t=this._followObject.parent.worldForward,i=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrDragMode:this.settings.dragMode,n=this._hitPointInLocalSpace.clone();switch(this.gameObject.localToWorld(n),i){case 0:const m=new b(0,1,0);this.gameObject.parent&&m.transformDirection(this.gameObject.parent.matrixWorld.clone().invert()),this._dragPlane.setFromNormalAndCoplanarPoint(m,n);break;case 2:const f=this._hitNormalInLocalSpace.clone();f.transformDirection(this.gameObject.matrixWorld),this._dragPlane.setFromNormalAndCoplanarPoint(f,n);break;case 1:this._dragPlane.setFromNormalAndCoplanarPoint(t,n);break;case 3:this.setPlaneViewAligned(n,!0);break;case 4:this.setPlaneViewAligned(n,!1);break}const s=this.gameObject.parent,r=this.gameObject.position.clone(),a=this.gameObject.quaternion.clone(),l=this.gameObject.scale.clone(),c=this.gameObject.matrixWorld.clone();s&&s.remove(this.gameObject),this.gameObject.position.set(0,0,0),this.gameObject.quaternion.set(0,0,0,1),this.gameObject.scale.set(1,1,1);const h=ui([this.gameObject]);h.expandByPoint(this.gameObject.worldPosition);const d=new b;h.getCenter(d);const p=new b;h.getSize(p),this._bottomCenter.copy(d.clone().add(new b(0,-p.y/2,0))),this._backCenter.copy(d.clone().add(new b(0,0,p.z/2))),this._backBottomCenter.copy(d.clone().add(new b(0,-p.y/2,p.z/2))),this._bounds.copy(h),s&&s.add(this.gameObject),this.gameObject.position.copy(r),this.gameObject.quaternion.copy(a),this.gameObject.scale.copy(l),this.gameObject.matrixWorld.copy(c),this._draggedOverObject=null,this._draggedOverObjectLastSetUp=null,this._draggedOverObjectLastNormal.set(0,1,0),this._draggedOverObjectDuration=0}collectMovementInfo(){if(!this._followObject.parent)return;const e=this._followObject.parent;this._followObject.updateMatrix();const t=e.worldPosition,i=Z.active?.rig?.gameObject;i&&i.worldToLocal(t),(this._lastDragPosRigSpace===void 0||i!=this._lastRig)&&(this._lastDragPosRigSpace=t.clone(),this._lastRig=i),this._tempVec.copy(t).sub(this._lastDragPosRigSpace);const n=e.worldForward;if(i&&(this._tempMat.copy(i.matrixWorld).invert(),n.transformDirection(this._tempMat)),this._totalMovementAlongRayDirection+=n.dot(this._tempVec),this._tempVec.x=Math.abs(this._tempVec.x),this._tempVec.y=Math.abs(this._tempVec.y),this._tempVec.z=Math.abs(this._tempVec.z),this._totalMovement.add(this._tempVec),this._lastDragPosRigSpace.copy(t),uo){let s=t;i&&(s=s.clone(),s.transformDirection(i.matrixWorld)),B.DrawRay(s,n,255)}}onDragUpdate(e){if(e>1)return;const t=this.gameObject;if(!t||!this._followObject){console.warn("Warning: DragPointerHandler doesn't have a dragged object. This is likely a bug.");return}const i=this._followObject.parent;if(!i){console.warn("Warning: DragPointerHandler doesn't have a drag source. This is likely a bug.");return}this._followObject.updateMatrix();const n=i.worldPosition,s=i.worldForward,r=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer",a=r?this.settings.xrKeepRotation:this.settings.keepRotation,l=r?this.settings.xrDragMode:this.settings.dragMode;if(l===5)return;const c=10;a&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);let h=1,d=2;if(r&&this._grabStartDistance>.5){const v=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);h=Math.max(0,v),h=h*h*h}else this._grabStartDistance<=.5&&(d=3);this._followObject.position.copy(this._followObjectStartPosition),a||this._followObject.quaternion.copy(this._followObjectStartQuaternion),this._followObject.position.multiplyScalar(h),this._followObject.updateMatrix();const p=this._hasLastSurfaceHitPoint;this._hasLastSurfaceHitPoint=!1;const m=new Eo(n,s);if(l==4){const v=this.context.physics.raycastFromRay(m,{testObject:C=>C!==this.followObject&&C!==i&&C!==t});if(v.length>0){const C=v[0];if(this._draggedOverObject===C.object?this._draggedOverObjectDuration+=this.context.time.deltaTime:(this._draggedOverObject=C.object,this._draggedOverObjectDuration=0),C.face){this._hasLastSurfaceHitPoint=!0,this._lastSurfaceHitPoint.copy(C.point);const O=this._draggedOverObjectDuration>=.15,k=this._totalMovement.length()>=.001,j=F(C.normal||C.face.normal).applyQuaternion(C.object.worldQuaternion);if((O||k)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(j)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(C.face.normal);const L=F(),V=F();this._bounds.getCenter(L),this._bounds.getSize(V),L.sub(V.multiplyScalar(.5).multiply(j)),this._hitPointInLocalSpace.copy(L),this._hitNormalInLocalSpace.copy(C.face.normal),this._bounds.getCenter(L),this._bounds.getSize(V),L.add(V.multiplyScalar(.5).multiply(C.face.normal));const W=F(this._hitPointInLocalSpace).add(L);this._followObject.localToWorld(W);const G=C.point;this._dragPlane.setFromNormalAndCoplanarPoint(j,G)}else if(!(O||k))return}}else p&&this.gameObject&&this.setPlaneViewAligned(this.gameObject.worldPosition,!1)}if(l!==1&&m.intersectPlane(this._dragPlane,this._tempVec)){this._followObject.worldPosition=this._tempVec,this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const v=F(this._hitPointInLocalSpace);this._followObject.localToWorld(v),uo&&B.DrawLine(v,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(v),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const v=this._followObject.worldPosition,C=this.settings.snapGridResolution;v.x=Math.round(v.x/C)*C,v.y=Math.round(v.y/C)*C,v.z=Math.round(v.z/C)*C,this._followObject.worldPosition=v,this._followObject.updateMatrix()}a&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const f=D.clamp01(this.context.time.deltaTime*c*d),g=D.clamp01(this.context.time.deltaTime*c*.5*d),y=t.worldPosition;y.lerp(this._followObject.worldPosition,f),t.worldPosition=y;const _=t.worldQuaternion;if(_.slerp(this._followObject.worldQuaternion,g),t.worldQuaternion=_,t.matrixAutoUpdate===!1&&t.updateMatrix(),uo){const v=this._hitPointInLocalSpace.clone();t.localToWorld(v),B.DrawSphere(v,.02,16711680);const C=this._hitNormalInLocalSpace.clone();C.applyQuaternion(_),B.DrawRay(v,C,16711680),B.DrawLabel(y.add(new b(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
|
|
986
|
+
|
|
987
|
+
Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
|
|
988
|
+
|
|
989
|
+
Session: ${!!Z.active}
|
|
990
|
+
|
|
991
|
+
Device: ${this._deviceMode}
|
|
992
|
+
|
|
993
|
+
`,.03);const O=this._bottomCenter.clone(),k=this._backCenter.clone(),j=this._backBottomCenter.clone();t.localToWorld(O),t.localToWorld(k),t.localToWorld(j),B.DrawSphere(O,.01,65280,0,!1),B.DrawSphere(k,.01,255,0,!1),B.DrawSphere(j,.01,16711935,0,!1),B.DrawLine(O,j,65535,0,!1),B.DrawLine(j,k,65535,0,!1)}}onDragEnd(e){console.assert(this._followObject.parent===e.event.space,"Drag end: _followObject is not parented to the space object"),this._followObject.removeFromParent(),this._followObject.destroy(),this._lastDragPosRigSpace=void 0}_hasLastSurfaceHitPoint=!1;_lastSurfaceHitPoint=new b;setPlaneViewAligned(e,t){if(!this._followObject.parent)return!1;const i=this._followObject.parent.worldForward,n=F(0,1,0),s=i,r=n.angleTo(s),a=.5;return t&&(r>Math.PI/2+a||r<Math.PI/2-a)?this._dragPlane.setFromNormalAndCoplanarPoint(n,e):this._dragPlane.setFromNormalAndCoplanarPoint(i,e),!0}}class JS{showGizmo=!0;useViewAngle=!0;get hasSelected(){return this._selected!==null&&this._selected!==void 0}get selected(){return this._selected}_selected=null;_context=null;_camera;_cameraPlane=new wr;_hasGroundPlane=!1;_groundPlane=new wr;_groundOffset=new b;_groundOffsetFactor=0;_groundDistance=0;_groundPlanePoint=new b;_raycaster=new Nd;_cameraPlaneOffset=new b;_intersection=new b;_worldPosition=new b;_inverseMatrix=new J;_rbs=[];_groundLine;_groundMarker;static geometry=new Ji().setFromPoints([new b(0,0,0),new b(0,-1,0)]);constructor(e){this._camera=e;const t=new Ba(JS.geometry),i=t.material;i.color=new oe(.4,.4,.4),t.layers.set(2),t.name="line",t.scale.y=1,this._groundLine=t;const n=new Id(.5,22,22),s=new Ce({color:i.color}),r=new H(n,s);r.visible=!1,r.layers.set(2),this._groundMarker=r}setSelected(e,t){if(this._selected&&t)for(const i of this._rbs)i.wakeUp(),i.setVelocity(0,0,0);if(this._selected&&Yr.Remove(t,this._selected),this._selected=e,this._context=t,this._rbs.length=0,e?(t.scene.add(this._groundLine),t.scene.add(this._groundMarker)):(this._groundLine.removeFromParent(),this._groundMarker.removeFromParent()),this._selected){if(!t){console.error("DragHelper: no context");return}Yr.Add(t,this._selected,null),this._groundOffsetFactor=0,this._hasGroundPlane=!0,this._groundOffset.set(0,0,0),this._requireUpdateGroundPlane=!0,this.onUpdateScreenSpacePlane()}}_groundOffsetVector=new b(0,1,0);_requireUpdateGroundPlane=!0;_didDragOnGroundPlaneLastFrame=!1;onUpdate(e){this._selected}onUpdateWorldPosition(e,t,i){if(this._selected){if(i){const n=ee(this._selected);n.y=e.y,e=n}if(bt(this._selected,e),bt(this._groundLine,e),this._hasGroundPlane?this._groundLine.scale.y=this._groundDistance:this._groundLine.scale.y=1e3,this._groundLine.visible=this.showGizmo,this._groundMarker.visible=t!==null&&this.showGizmo,t){const n=ee(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(n,n,n),bt(this._groundMarker,t)}}}onUpdateScreenSpacePlane(){if(!this._selected||!this._context)return;const e=this._context.input.getPointerPositionRC(0);e&&(this._raycaster.setFromCamera(e,this._camera),this._cameraPlane.setFromNormalAndCoplanarPoint(this._camera.getWorldDirection(this._cameraPlane.normal),this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld)),this._raycaster.ray.intersectPlane(this._cameraPlane,this._intersection)&&this._selected.parent&&(this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert(),this._cameraPlaneOffset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))))}onUpdateGroundPlane(){if(!this._selected||!this._context)return;const e=ee(this._selected),t=new Eo(F(0,.1,0).add(e),F(0,-1,0)),i=new Ts;i.testObject=s=>s!==this._selected;const n=this._context.physics.raycastFromRay(t,i);for(let s=0;s<n.length;s++){const r=n[s];if(!r.face||this.contains(this._selected,r.object))continue;const a=F(0,1,0);this._groundPlane.setFromNormalAndCoplanarPoint(a,r.point);break}this._hasGroundPlane=!0,this._groundPlane.setFromNormalAndCoplanarPoint(t.direction.multiplyScalar(-1),t.origin),this._raycaster.ray.intersectPlane(this._groundPlane,this._intersection),this._groundDistance=this._intersection.distanceTo(e),this._groundOffset.copy(this._intersection).sub(e)}contains(e,t){if(e===t)return!0;if(e.children){for(const i of e.children)if(this.contains(i,t))return!0}return!1}}var Hx=(o=>(o.File_Spawned="file-spawned",o))(Hx||{});class BT{guid;file_name;file_hash;file_size;position;scale;seed;sender;downloadUrl;parentGuid;boundsSize;constructor(e,t,i,n,s,r,a,l,c){this.seed=t,this.guid=i,this.file_name=n,this.file_hash=s,this.file_size=r,this.position=a,this.scale=l,this.sender=e,this.downloadUrl=c}}var Ns;(o=>{const e=new Map;function t(n){e.has(n.guid)&&i(n.guid);const s=new M;e.set(n.guid,s);const r=new M;r.position.y=-.5,s.add(r);const a=new H(new Da(1,1,1,1,1,1),new Ce({color:14540253,wireframe:!0,transparent:!0,opacity:.3}));a.position.y=.5,r.add(a);const l=new M;r.add(l);const c=new H(new Da(1,1,1,1,1,1),new Ce({color:12307660,transparent:!0,opacity:.4}));c.position.y=.5,l.scale.y=.01,l.add(c);const h=new H(new Pn(1,1,1,1),new Ce({color:34,transparent:!0,opacity:.05,depthTest:!1}));return h.rotateX(-Math.PI/2),h.position.y=.51,c.add(h),n.parent.add(s),s.rotateY(Math.PI/2),n.position&&s.position?.copy(n.position),n.size&&(s.worldScale=new b().copy(n.size)),s.position.y=s.scale.y/2,{object:s,onProgress:d=>{l instanceof M&&l.scale.set(1,d,1)}}}o.addPreview=t;function i(n){const s=e.get(n);s&&(e.delete(n),s.removeFromParent())}o.removePreview=i})(Ns||(Ns={}));const Sl=[],pp=[];var wy;(o=>{function e(i,n){const s={name:n?.name,priority:n?.priority??0,callback:i};return Sl.push(s),Sl.sort((r,a)=>r.priority===a.priority?0:r.priority>a.priority?-1:1),()=>{const r=Sl.indexOf(s);r>=0&&Sl.splice(r,1)}}o.onCreateCustomModelLoader=e;function t(i){return pp.push(i),()=>{const n=pp.indexOf(i);n>=0&&pp.splice(n,1)}}o.onDetermineModelMimetype=t})(wy||(wy={}));const je=w("debugfileformat");function Gx(o){switch((o.split(".").pop()||o).toUpperCase()){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj";default:return null}}async function qx(o,e){const{useExtension:t=!0}=e;if(t){const s=o,r=new URL(s,globalThis.location.href);let a=null;const l=r.searchParams.get("filetype");switch(l&&(a=l.toUpperCase()),a?.length||(a=r.pathname.split(".").pop()?.toUpperCase()),je&&console.warn(`[Needle Engine] Try to use file extension to determine type: '${a}'`),a){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj";case"MTLX":return"application/materialx+xml"}}const i=o;if(!o.startsWith("blob:")){const s=new URL(o,globalThis.location.href);s.searchParams.append("range","true"),o=s.toString()}const n=await fetch(o,{method:"GET",headers:{range:"bytes=0-32"}}).catch(s=>null);if(n?.ok){const s=await n.arrayBuffer(),r=Xx(i,s,n);return je&&console.log("[Needle Engine] Determined file type from header: "+r),r}return"unknown"}function Xx(o,e,t){if(e.byteLength<4)return"unknown";const i=new Uint8Array(e);je&&je&&console.warn(`[Needle Engine] Trying to determine file type from binary data
|
|
994
|
+
`,'"'+new TextDecoder().decode(e)+`"
|
|
995
|
+
`,i);const n=new TextDecoder().decode(e).replace(/\s/g,"");if(n[0]==="{"&&n[1]==='"')return je&&console.debug("GLTF detected"),"model/gltf+json";if(i[0]==103&&i[1]==108&&i[2]==84&&i[3]==70&&(i[4]==10||i[4]===2))return je&&console.debug("GLTF .bin detected"),"model/gltf+json";if(i[0]==103&&i[1]==108&&i[2]==84&&i[3]==70&&i[4]==98)return je&&console.debug("GLB detected"),"model/gltf-binary";if(i[0]==80&&i[1]==75&&i[2]==3&&i[3]==4)return je&&console.debug("USDZ detected"),"model/vnd.usdz+zip";if(i[0]==80&&i[1]==88&&i[2]==82&&i[3]==45&&i[4]==85&&i[5]==83&&i[6]==68&&i[7]==67)return je&&console.debug("Binary USD detected"),"model/vnd.usd";if(i[0]==35&&i[1]==117&&i[2]==115&&i[3]==100&&i[4]==97)return je&&console.debug("ASCII USD detected"),"model/vnd.usda";if(i[0]==75&&i[1]==97&&i[2]==121&&i[3]==100&&i[4]==97&&i[5]==114&&i[6]==97&&i[7]==32)return je&&console.debug("Binary FBX detected"),"model/fbx";if(i[0]==59&&i[1]==32&&i[2]==70&&i[3]==66&&i[4]==88&&i[5]==32)return je&&console.debug("ASCII FBX detected"),"model/fbx";if(i[0]==35&&i[1]==32&&i[2]==66&&i[3]==108&&i[4]==101&&i[5]==110&&i[6]==100&&i[7]==101&&i[8]==114&&i[9]==32||i[0]==35&&i[1]==32&&i[2]==65&&i[3]==108&&i[4]==105&&i[5]==97&&i[6]==115&&i[7]==32&&i[8]==79&&i[9]==66&&i[10]==74)return je&&console.debug("OBJ detected"),"model/obj";if(t.headers.has("content-type")){const s=t.headers.get("content-type");if(s?.startsWith("image/"))return je&&console.debug("Image detected, not a model file"),"unsupported";switch(je&&console.debug("Content-Type: "+s),s){case"model/gltf+json":case"model/gltf-binary":case"model/vrm":case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usd":case"model/vnd.usda+zip":case"model/vnd.usda":case"model/vnd.usdc":case"model/fbx":case"model/vnd.autodesk.fbx":case"model/obj":case"application/materialx+xml":return s}}if(i[0]==118&&i[1]==32||i[0]==102&&i[1]==32)return je&&console.debug("OBJ detected (the file has no header and starts with vertex or face)"),"obj";if(i[0]==35&&i[1]==32&&i[2]==70&&i[3]==105&&i[4]==108&&i[5]==101&&i[6]==32&&i[7]==101&&i[8]==120&&i[9]==112&&i[10]==111&&i[11]==114&&i[12]==116&&i[13]==101&&i[14]==100&&i[15]==32&&i[16]==98&&i[17]==121&&i[18]==32&&i[19]==90&&i[20]==66&&i[21]==114&&i[22]==117&&i[23]==115&&i[24]==104)return je&&console.debug("OBJ detected (exported by ZBrush)"),"obj";if(i[0]==109&&i[1]==116&&i[2]==108&&i[3]==108&&i[4]==105&&i[5]==98)return je&&console.debug("OBJ detected (mtllib)"),"obj";for(const s of pp){const r=s({url:o,response:t,contentType:t.headers.get("content-type"),bytes:i});if(r)return je&&console.debug(`Mimetype callback returned: ${r}`),r}if(A()||je){const s=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));je&&console.warn(`Could not determine file type.
|
|
996
|
+
|
|
997
|
+
Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
|
|
998
|
+
|
|
999
|
+
Content-Type: "${t.headers.get("content-type")}"
|
|
1000
|
+
"Text: "${s}"
|
|
1001
|
+
Binary:`,i)}else je&&console.debug("Could not determine file type from binary data");return"unknown"}const xy=w("debugstencil");function FT(o,e){return(o&1<<e.layer)!=0}const UT=Symbol("stencils");class fr{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if(xy&&console.log(t,fr.stencils),!t)return;const i=fr.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(FT(s.layer,e)){xy&&console.log(s),setTimeout(()=>{Di()&&ju(e.gameObject)&&(be("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let r=0;r<e.sharedMaterials.length;r++){let a=e.sharedMaterials[r];a&&(a=a.clone(),a[UT]=!0,a.stencilWrite=!0,a.stencilWriteMask=255,a.stencilFuncMask=255,a.stencilRef=s.value,a.stencilFunc=s.compareFunc,a.stencilZPass=s.passOp,a.stencilFail=s.failOp,a.stencilZFail=s.zFailOp,e.sharedMaterials[r]=a)}e.gameObject.renderOrder=s.event*1e3+s.index*50;break}}}parser;source;constructor(e,t){this.parser=e,this.source=t}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[NT];if(i){xy&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=zT(r.compareFunc),r.passOp=Sy(r.passOp),r.failOp=Sy(r.failOp),r.zFailOp=Sy(r.zFailOp),fr.stencils[this.source]||(fr.stencils[this.source]=[]),fr.stencils[this.source].push(r)}}}return null}}function Sy(o){switch(o){case 0:return YC;case 1:return QC;case 2:return XC;case 3:return qC;case 4:return GC;case 6:return HC;case 7:return $C;case 5:return VC}return 0}function zT(o){switch(o){case 1:return zb;case 2:return WC;case 3:return NC;case 4:return zC;case 5:return UC;case 6:return FC;case 7:return BC;case 8:return jC}return zb}const NT="NEEDLE_render_objects";class WT{objectToBlock=new WeakMap;meshToOwners=new WeakMap;meshToOriginalCallbacks=new WeakMap;getBlock(e){return this.objectToBlock.get(e)}setBlock(e,t){this.objectToBlock.set(e,t)}deleteBlock(e){this.objectToBlock.delete(e)}isHooked(e,t){return this.meshToOwners.get(e)?.has(t)??!1}addHook(e,t){let i=this.meshToOwners.get(e);i||(i=new Set,this.meshToOwners.set(e,i)),i.add(t)}removeHook(e,t){const i=this.meshToOwners.get(e);i&&(i.delete(t),i.size===0&&this.meshToOwners.delete(e))}getOriginalCallbacks(e){return this.meshToOriginalCallbacks.get(e)}setOriginalCallbacks(e,t){this.meshToOriginalCallbacks.set(e,t)}}const Ws=new WT;class ys{_overrides=[];_defines={};_object=null;get object(){return this._object}constructor(e=null){this._object=e}static get(e){let t=Ws.getBlock(e);return t||(t=new ys(e),Ws.setBlock(e,t),HT(e,t)),t}static hasOverrides(e){const t=Ws.getBlock(e);return t?t.hasOverrides():!1}dispose(){this._object&&Ws.deleteBlock(this._object),this._overrides=[],this._object=null}setOverride(e,t,i){const n=this._overrides.find(s=>s.name===e);n?(n.value=t,n.textureTransform=i):this._overrides.push({name:e,value:t,textureTransform:i})}getOverride(e){return this._overrides.find(t=>t.name===e)}removeOveride(e){const t=this._overrides.findIndex(i=>i.name===e);t>=0&&this._overrides.splice(t,1)}clearAllOverrides(){this._overrides=[]}get overrides(){return this._overrides}hasOverrides(){return this._overrides.length>0}setDefine(e,t){this._defines[e]=t}clearDefine(e){this._defines[e]=void 0}getDefines(){return this._defines}getCacheKey(){const e=[],t=Object.keys(this._defines).sort();for(const i of t){const n=this._defines[i];n!==void 0&&e.push(`d:${i}=${n}`)}for(const i of this._overrides){if(i.value===null)continue;let n="";if(i.value instanceof Se){if(n=i.value.uuid||"texture",i.textureTransform){const s=i.textureTransform;s.offset&&(n+=`;to:${s.offset.x},${s.offset.y}`),s.repeat&&(n+=`;tr:${s.repeat.x},${s.repeat.y}`)}}else if(Array.isArray(i.value))n=i.value.join(",");else if(i.value&&typeof i.value=="object"&&"r"in i.value){const s=i.value;n=`${s.r},${s.g},${s.b},${s.a!==void 0?s.a:""}`}else if(i.value&&typeof i.value=="object"&&"x"in i.value){const s=i.value;n=`${s.x},${s.y}${s.z!==void 0?`,${s.z}`:""}${s.w!==void 0?`,${s.w}`:""}`}else n=String(i.value);e.push(`${i.name}=${n}`)}return e.join(";")}}const mp=Symbol("originalValues"),gp=Symbol("savedTextureTransforms");function Cy(o){let e=Ws.getBlock(o);if(e)return{block:e,owner:o};if(o.parent&&o.parent.type==="Group"&&(e=Ws.getBlock(o.parent),e))return{block:e,owner:o.parent}}const Cl=Symbol("beforeRenderingFlag"),Py=new WeakMap,Oy=new WeakMap,VT=function(o,e,t,i){const n=Cy(this)?.block;if(n&&n.hasOverrides()){const s=n.getOverride("transmission")?.value,r=n.getOverride("transparent")?.value;s!==void 0&&typeof s=="number"&&"transmission"in t&&s!==t.transmission&&(Oy.set(this,t.transmission),t.transmission=s),r!==void 0&&typeof r=="boolean"&&r!==t.transparent&&(Py.set(this,t.transparent),t.transparent=r)}},$T=function(o,e,t,i){const n=Py.get(o);n!==void 0&&(Py.delete(o),t.transparent=n);const s=Oy.get(o);s!==void 0&&(Oy.delete(o),t.transmission=s)},Qx=function(o,e,t,i,n,s){const r=this.material;if(!r)return;if(Array.isArray(r)){if(!r.includes(n))return}else if(r!==n)return;this[Cl]===void 0&&(this[Cl]=new WeakSet),this[Cl].add(n);const a=Cy(this);if(!a)return;const{block:l,owner:c}=a,h=l.overrides,d=n,p=l.getDefines(),m=Object.keys(p);if(m.length>0){d.defines||(d.defines={});for(const y of m){const _=p[y];_!==void 0&&(d.defines[y]=_)}}if(h.length===0&&m.length===0)return;let f=m.length>0;d[mp]||(d[mp]=[]);const g=d[mp];for(const y of h){if(y.value===null)continue;const _=d[y.name],v=g.find(C=>C.name===y.name);if(v?v.value=_:g.push({name:y.name,value:_}),!f&&!!_!=!!y.value&&(f=!0),d[y.name]=y.value,y.textureTransform&&y.value instanceof Se){const C=y.value;d[gp]||(d[gp]=[]),d[gp].push({name:y.name,offsetX:C.offset.x,offsetY:C.offset.y,repeatX:C.repeat.x,repeatY:C.repeat.y});const O=y.textureTransform;O.offset&&C.offset.copy(O.offset),O.repeat&&C.repeat.copy(O.repeat)}}f&&(d.needsUpdate=!0),d._forceRefresh=!0},Yx=function(o,e,t,i,n,s){if(this[Cl]===void 0||!this[Cl].has(n))return;this[Cl].delete(n);const r=Cy(this);if(!r)return;const{block:a,owner:l}=r,c=a.overrides,h=n,d=h[mp],p=a.getDefines(),m=Object.keys(p);let f=!1;if(m.length>0&&h.defines){for(const y of m)delete h.defines[y];f=!0}if(c.length===0){f&&(h.needsUpdate=!0,h._forceRefresh=!0);return}if(!d)return;const g=h[gp];if(g&&g.length>0){for(const y of g){const _=c.find(v=>v.name===y.name);_?.value instanceof Se&&(_.value.offset.set(y.offsetX,y.offsetY),_.value.repeat.set(y.repeatX,y.repeatY))}g.length=0}for(const y of c){const _=d.find(v=>v.name===y.name);_&&(!f&&!!y.value!=!!_.value&&(f=!0),h[y.name]=_.value)}f&&(h.needsUpdate=!0),h._forceRefresh=!0};function HT(o,e){o.type==="Group"?o.children.forEach(t=>{(t.type==="Mesh"||t.type==="SkinnedMesh")&&Zx(t,o,e)}):(o.type==="Mesh"||o.type==="SkinnedMesh")&&Zx(o,o,e)}function Zx(o,e,t){if(!Ws.isHooked(o,e)){if(Ws.addHook(o,e),o["needle:materialPropertyBlock"]=t,!o.onBeforeRender)o.onBeforeRender=Qx;else{const i=o.onBeforeRender;o.onBeforeRender=function(n,s,r,a,l,c){i.call(this,n,s,r,a,l,c),Qx.call(this,n,s,r,a,l,c)}}if(!o.onAfterRender)o.onAfterRender=Yx;else{const i=o.onAfterRender;o.onAfterRender=function(n,s,r,a,l,c){Yx.call(this,n,s,r,a,l,c),i.call(this,n,s,r,a,l,c)}}o.onBeforeRenderListPush=VT,o.onAfterRenderListPush=$T}}var GT=Object.defineProperty,qT=Object.getOwnPropertyDescriptor,fp=(o,e,t,i)=>{for(var n=i>1?void 0:i?qT(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&>(e,t,n),n};const Pl=w("debugreflectionprobe"),Kx=w("noreflectionprobe");let ia=null;const XT=Symbol("reflectionProbeKey"),wh=class Hn extends E{static _probes=new Map;static testBox=new Nt;static isUsingReflectionProbe(e){return!!e[XT]}static onEnabled=new ae;static onDisabled=new ae;static get(e,t,i,n){if(!e||e.isObject3D!==!0||Kx)return null;const s=Hn._probes.get(t);if(s){for(const r of s)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(n){if(r.gameObject===n)return r}else if(r.isInBox(e))return Pl&&console.log("Found reflection probe",e.name,r.name),r}}return Pl&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;_textureUrlInFlight;set texture(e){if(this._texture!==e){if(typeof e=="string"){Pl&&console.debug(`[ReflectionProbe] Loading reflection probe texture from URL: ${e}`),this._textureUrlInFlight=e;const t=Fo(this.sourceId,e);ry(t,this.context.renderer).then(i=>{this._textureUrlInFlight===e&&i&&(this._textureUrlInFlight=void 0,Pl&&console.debug(`[ReflectionProbe] Successfully loaded reflection probe texture: ${e}`),this.texture=i)});return}this.__didAwake&&(this._textureUrlInFlight=void 0),this._texture=e,Pl&&console.debug("[ReflectionProbe] Set reflection probe texture "+(e?.name||"(removed)")),e&&(e instanceof Ub||e.mapping===Ro||e.mapping!==Ao&&(e.mapping=Ao),e.colorSpace=To,e.needsUpdate=!0)}}get texture(){return this._texture}intensity=1;center=new b;size=new b(1,1,1);__lightmapIntensityScale=!0;isInBox(e){return ia??=new Nt,ia.setFromCenterAndSize(this.gameObject.worldPosition.add(this.center),this.size),ui([e],void 0,void 0,Hn.testBox),Hn.testBox.isEmpty()?ia.containsPoint(e.worldPosition):ia?.intersectsBox(Hn.testBox)}constructor(){super(),Hn._probes.has(this.context)||Hn._probes.set(this.context,[]),Hn._probes.get(this.context)?.push(this)}awake(){this._texture&&(this._texture.mapping!==Ro&&(this._texture.mapping=Ao),this._texture.colorSpace=To,this._texture.needsUpdate=!0)}update(){Pl&&(ia??=new Nt,ia.setFromCenterAndSize(this.gameObject.worldPosition.add(this.center),this.size),B.DrawWireBox3(ia,5592320))}onEnable(){Hn.onEnabled?.invoke(this)}onDisable(){Hn.onDisabled?.invoke(this)}start(){this._texture||console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`)}onDestroy(){const e=Hn._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}apply(e){if(Kx||!this.enabled||!this.texture)return;const t=ys.get(e);t.setOverride("envMap",this.texture),t.setOverride("envMapRotation",this.gameObject.rotation);let i=this.intensity;this.__lightmapIntensityScale&&t.getOverride("lightMap")&&(i/=Math.PI),t.setOverride("envMapIntensity",i)}unapply(e){const t=ys.get(e);t&&t.getOverride("envMap")?.value===this.texture&&t.removeOveride("envMap")}};fp([u([Se,String])],wh.prototype,"texture",1),fp([u()],wh.prototype,"intensity",2),fp([u(b)],wh.prototype,"center",2),fp([u(b)],wh.prototype,"size",2);let Zo=wh;const ky=w("debugexr");class QT{get name(){return"EXT_texture_exr"}parser;constructor(e){this.parser=e,ky&&console.log(e)}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if(ky&&console.log("EXT_texture_exr.loadTexture",e,n),!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=new Ym(i.options.manager);return ky&&console.log("EXT_texture_exr.loadTexture",s),i.loadTextureImage(e,s.source,r)}}typeof window<"u"&&window.addEventListener("unhandledrejection",o=>{});const po=_t,yp="$___Export_Components",YT="NEEDLE_components";class ZT{[Rr]}class KT{node;nodeIndex;nodeDef;constructor(e,t,i){this.node=e,this.nodeIndex=t,this.nodeDef=i}}class Jx{get name(){return YT}exportContext;objectToNodeMap={};context;writer;registerExport(e){e.register(t=>{if("serializeUserData"in t){const i=t.serializeUserData.bind(t);this.writer=t,t.serializeUserData=(n,s)=>{try{this.serializeUserData(n,s)&&(t.extensionsUsed[this.name]=!0),i(n,s)}finally{this.afterSerializeUserData(n,s)}}}return this})}beforeParse(){this.exportContext={},this.objectToNodeMap={}}serializeUserData(e,t){const i=e.userData?.components;return!i||i.length<=0?!1:(delete e.userData.components,e[yp]=i,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&po&&console.log("DONE",JSON.stringify(t)),e[yp]===void 0)return;const i=e[yp];delete e[yp],i!==null&&(e.userData.components=i)}writeNode(e,t){const i=this.writer.json.nodes.length;po&&console.log(e.name,i,e.uuid);const n=new KT(e,i,t);this.exportContext[i]=n,this.objectToNodeMap[e.uuid]=i}afterParse(e){po&&console.log("AFTER",e);for(const t in this.exportContext){const i=this.exportContext[t],n=i.node,s=i.nodeDef,r=i.nodeIndex,a=n.userData?.components;if(!a||a.length<=0)continue;const l=new ZT;s.extensions=s.extensions||{},s.extensions[this.name]=l,this.context.object=n,this.context.nodeId=r,this.context.objectToNode=this.objectToNodeMap;const c=[];for(const h of a){this.context.target=h;const d=Mn().writeBuiltinComponentData(h,this.context);d!==null&&c.push(d)}c.length>0&&(l[Rr]=c,po&&console.log("DID WRITE",n,"nodeIndex",r,c))}}parser;nodeToObjectMap={};gltf=null;beforeRoot(){return po&&console.log("BEGIN LOAD"),this.nodeToObjectMap={},null}async afterRoot(e){this.gltf=e;const t=e.parser,i=t?.extensions;if(!i)return;const n=i[this.name];po&&console.log("After root",e,this.parser,i);const s=[];if(n===!0){const r=t.json.nodes;if(r){for(let a=0;a<r.length;a++){const l=await t.getDependency("node",a);this.nodeToObjectMap[a]=l}for(let a=0;a<r.length;a++){const l=r[a],c=a,h=l.extensions;if(!h)continue;const d=h[this.name];if(!d)continue;po&&console.log("NODE",l);const p=this.nodeToObjectMap[c];if(!p){console.error("Could not find object for node index: "+c,l,t);continue}Lu(p),s.push(this.createComponents(e,l,p,d))}}}await Promise.all(s);for(const r of t.associations.keys()){const a=t.associations.get(r);if(a?.materials!=null){const l="/materials/"+a.materials;sM(r,l)}}}async createComponents(e,t,i,n){if(!n)return;const s=n[Rr];if(s){const r=new Array;po&&console.log(i.name,s);for(const a in s){const l=s[a];if(po&&console.log("Serialized data",JSON.parse(JSON.stringify(l))),(l?.name==="MeshRenderer"||l?.name==="SkinnedMeshRenderer")&&!l.sharedMaterials){let c=!1;if("mesh"in t){const h=t.mesh;if(typeof h=="number"&&e.parser){const d=e.parser.json.meshes?.[h];d?.primitives&&(l.sharedMaterials=d.primitives.map(p=>"/materials/"+(p.material??0)),c=!0)}}!c&&(po||A())&&console.warn(`[NEEDLE_components] Component '${l.name}' on object '${i.name}' is not added to a mesh or failed to retrieve materials from glTF.`)}l&&this.parser&&r.push(qg(this.parser,l).catch(c=>console.error(`Error while resolving references (see console for details)
|
|
1002
|
+
`,c,i,l))),i.userData=i.userData||{},i.userData[Rr]=i.userData[Rr]||[],i.userData[Rr].push(l)}await Promise.all(r).catch(a=>{console.error("Error while loading components",a)})}}}const e1="NEEDLE_gameobject_data";class JT{get name(){return e1}parser;constructor(e){this.parser=e}afterRoot(e){const t=[];for(let i=0;i<this.parser.json.nodes?.length;i++){const n=this.parser.json.nodes[i];if(n&&n.extensions){const s=n.extensions[e1];if(s){const r=this.findAndApplyExtensionData(i,s);t.push(r)}}}return Promise.all(t).then(()=>null)}async findAndApplyExtensionData(e,t){const i=await this.parser.getDependency("node",e);i&&this.applyExtensionData(i,t)}applyExtensionData(e,t){t.layers===void 0&&(t.layers=0),e.userData.layer=t.layers,e.layers.disableAll(),e.layers.set(t.layers),e.userData.tag=t.tag??"none",e.hideFlags=0,e.userData.static=t.static??!1,e.visible=t.activeSelf??!0,e.guid=t.guid}}const t1="NEEDLE_lighting_settings",Ol=w("debugenvlight");class eA{get name(){return t1}parser;sourceId;context;constructor(e,t,i){this.parser=e,this.sourceId=t,this.context=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[t1];if(i){Ol&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',i);let n;if(e.scene.children.length===1){const s=e.scene.children[0];n=x.addComponent(s,bp,{},{callAwake:!1})}else{const s=new M;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=x.addComponent(s,bp,{},{callAwake:!1})}n.sourceId=this.sourceId,n.ambientIntensity=i.ambientIntensity,n.ambientLight=new oe().fromArray(i.ambientLight),Array.isArray(i.ambientTrilight)&&(n.ambientTrilight=i.ambientTrilight.map(s=>new oe().fromArray(s))),n.ambientMode=i.ambientMode,n.environmentReflectionSource=i.environmentReflectionSource}}return null}}pe.registerCallback(ue.ContextCreated,o=>{const e=o.context,t=x.findObjectOfType(bp,e);t?.sourceId&&(t.enabled=!0)});class bp extends E{ambientMode=tl.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=xu.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===xu.Skybox?no.Skybox:no.Reflection,i=this.context.lightmaps.tryGet(this.sourceId,t,0);this._hasReflection=i!=null,i&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,i)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),Ol&&window.addEventListener("keydown",t=>{this.destroyed||t.key==="l"&&(this.enabled=!this.enabled)});const e=this.gameObject.userData?.components;if(e){const t=e.indexOf(this);e.splice(t,1),e.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*D.lerp(0,1.33,t)}onEnable(){if(Ol&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==tl.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new ZC(this.ambientLight,this.ambientIntensity*e),Ol&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===tl.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new KC(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),Ol&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,i)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&(this.context.domElement.getAttribute("environment-image")||this.context.sceneLighting.internalEnableReflection(this.sourceId))}onDisable(){Ol&&console.warn("\u{1F4A1}\u26AB <<< Disable lighting:",this.sourceId,this),this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent(),this.sourceId&&this.context.sceneLighting.internalDisableReflection(this.sourceId)}}var _p;(o=>{async function e(t,i){if(!t)throw new Error("URL or XML string is required to load a MaterialX material");const n=await T.MaterialX.load(),s=t.trimStart().startsWith("<"),r=s?t:await fetch(t).then(c=>c.text()).catch(console.error);if(!r)return console.warn("Failed to load MaterialX file from url",t),null;let a;if(i?.url||!s){const c=(i?.url||t).split("/");c.pop(),a=c.join("/")}const l=new vr;return n.Experimental_API.createMaterialXMaterial(r,i?.materialNameOrIndex??0,{getTexture:async c=>(!c.startsWith("http")&&!c.startsWith("data:")&&!c.startsWith("blob:")&&!c.startsWith("file:")&&a&&(c=a+"/"+c),l.loadAsync(c).catch(h=>{console.warn(`Failed to load texture for MaterialX material ${c}`,h)}))},{cacheKey:t})}o.loadFromUrl=e})(_p||(_p={}));class tA extends JC{loadAsync(e,t){return new Promise((i,n)=>{this.load(e,i,t,n)})}load(e,t,i,n){i?.({type:"progress",loaded:0,total:0}),_p.loadFromUrl(e,{}).then(s=>{s?t(this.onLoaded(s)):n?.(new Error("Failed to load MaterialX material from url: "+e))})}onLoaded(e){return Rs.createPrimitive("ShaderBall",{material:e})}}class iA{constructor(e,t,i,n){this.context=e,this.loader=t,this.url=i,this.parser=n}get name(){return"materialx-loading-helper"}mtlxLoader;async beforeRoot(){if(this.parser.json.extensions?.NEEDLE_materials_mtlx){const e=await T.MaterialX.load();try{this.mtlxLoader=new e.MaterialXLoader(this.parser,{cacheKey:`${this.url}:materialx`,parameters:{precision:this.context.renderer?.capabilities.precision}},{getFrame:()=>this.context.time.frame,getTime:()=>this.context.time.time})}catch(t){console.error(t)}}}loadMaterial(e){return this.mtlxLoader?this.mtlxLoader.loadMaterial(e):null}}var i1=(o=>(o[o.INT=5124]="INT",o[o.FLOAT=5126]="FLOAT",o[o.FLOAT_VEC2=35664]="FLOAT_VEC2",o[o.FLOAT_VEC3=35665]="FLOAT_VEC3",o[o.FLOAT_VEC4=35666]="FLOAT_VEC4",o[o.INT_VEC2=35667]="INT_VEC2",o[o.INT_VEC3=35668]="INT_VEC3",o[o.INT_VEC4=35669]="INT_VEC4",o[o.BOOL=35670]="BOOL",o[o.BOOL_VEC2=35671]="BOOL_VEC2",o[o.BOOL_VEC3=35672]="BOOL_VEC3",o[o.BOOL_VEC4=35673]="BOOL_VEC4",o[o.FLOAT_MAT2=35674]="FLOAT_MAT2",o[o.FLOAT_MAT3=35675]="FLOAT_MAT3",o[o.FLOAT_MAT4=35676]="FLOAT_MAT4",o[o.SAMPLER_2D=35678]="SAMPLER_2D",o[o.SAMPLER_3D=35680]="SAMPLER_3D",o[o.SAMPLER_CUBE=35681]="SAMPLER_CUBE",o[o.UNKNOWN=0]="UNKNOWN",o))(i1||{});const mo=w("debugcustomshader"),kl="NEEDLE_techniques_webgl";class nA{objectToWorldMatrix=new J;worldToObjectMatrix=new J;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),wu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),wu(this.worldToObjectMatrix,this.worldToObject)}}class Te extends Nb{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return n1(e),e}constructor(e,...t){super(...t),this.identifier=e,mo&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&z.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}dispose(){super.dispose();const e=z.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&z.Current.pre_render_callbacks.splice(e,1)}_sphericalHarmonicsName="unity_SpecCube0";_objToWorldName="hlslcc_mtx4x4unity_ObjectToWorld";_worldToObjectName="hlslcc_mtx4x4unity_WorldToObject";static viewProjection=new J;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new J;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new ye;static _mainLightPosition=new b;static _lightData=new ye;_rendererData=new nA;get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&z.Current.setRequireColor(!0),this.depthTextureUniform&&z.Current.setRequireDepth(!0)}onBeforeRender(e,t,i,n,s,r){n.attributes.tangent||n.computeTangents(),this.onUpdateUniforms(i,s)}onUpdateUniforms(e,t){const i=z.Current;if(e&&(Te.viewProjection&&this.uniforms[this._viewProjectionName]&&(Te.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),wu(Te.viewProjection,Te._viewProjectionValues)),Te.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Te.viewMatrix.copy(e.matrixWorldInverse),wu(Te.viewMatrix,Te._viewMatrixValues)),this.uniforms[Te._worldSpaceCameraPosName]&&Te._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=i.sceneLighting.timeVec4),this.uniforms._Time){const a=this.uniforms._Time.value;a.x=i.sceneLighting.timeVec4.x/20,a.y=i.sceneLighting.timeVec4.x,a.z=i.sceneLighting.timeVec4.x*2,a.w=i.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const a=this.uniforms._SinTime.value;a.x=Math.sin(i.sceneLighting.timeVec4.x/8),a.y=Math.sin(i.sceneLighting.timeVec4.x/4),a.z=Math.sin(i.sceneLighting.timeVec4.x/2),a.w=Math.sin(i.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const a=this.uniforms._CosTime.value;a.x=Math.cos(i.sceneLighting.timeVec4.x/8),a.y=Math.cos(i.sceneLighting.timeVec4.x/4),a.z=Math.cos(i.sceneLighting.timeVec4.x/2),a.w=Math.cos(i.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const a=this.uniforms.unity_DeltaTime.value;a.x=i.time.deltaTime,a.y=1/i.time.deltaTime,a.z=i.time.smoothedDeltaTime,a.w=1/i.time.smoothedDeltaTime}const n=i.mainLight;if(n){const a=ee(n.gameObject,Te._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Te._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Te._mainLightColor};const l=n.intensity;Te._lightData.z=l,this.uniforms.unity_LightData={value:Te._lightData}}if(e&&(Te.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Te._viewProjectionValues),Te.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Te._viewMatrixValues),this.uniforms[Te._worldSpaceCameraPosName]&&(this.uniforms[Te._worldSpaceCameraPosName]={value:Te._worldSpaceCameraPos}),i.mainCameraComponent)){if(this.uniforms._ProjectionParams){const a=this.uniforms._ProjectionParams.value;a.x=1,a.y=i.mainCameraComponent.nearClipPlane,a.z=i.mainCameraComponent.farClipPlane,a.w=1/a.z,this.uniforms._ProjectionParams.value=a}if(this.uniforms._ZBufferParams){const a=this.uniforms._ZBufferParams.value,l=i.mainCameraComponent;a.x=1-l.farClipPlane/l.nearClipPlane,a.y=l.farClipPlane/l.nearClipPlane,a.z=a.x/l.farClipPlane,a.w=a.y/l.farClipPlane,this.uniforms._ZBufferParams.value=a}if(this.uniforms._ScreenParams){const a=this.uniforms._ScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScreenParams.value=a}if(this.uniforms._ScaledScreenParams){const a=this.uniforms._ScaledScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScaledScreenParams.value=a}}const s=this.depthTextureUniform;s&&(s.value=i.depthTexture);const r=this.opaqueTextureUniform;if(r&&(r.value=i.opaqueColorTexture),t){const a=this._rendererData;a.updateFrom(t),this.uniforms[this._worldToObjectName].value=a.worldToObject,this.uniforms[this._objToWorldName].value=a.objectToWorld}this.uniformsNeedUpdate=!0}}class oA{get name(){return kl}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return mo&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[kl])return mo&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;mo&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[kl].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[kl];if(!n)return mo?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;mo&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await FM(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();mo&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new ye(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new ye(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new ye(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new ye(0,0,0,0)});for(const g in p){const y=g;switch(y){case"_TimeParameters":const _=new ye;d[y]={value:_};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":d[y]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":d[y]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":d[y]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":d[y]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":d[y]={value:null};break}}let m=!1;if(t.extensions&&t.extensions[kl]){const g=t.extensions[kl];if(g.technique===i){mo&&console.log(t.name,"Material Properties",g);for(const y in g.values){const _=g.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const v=_.substring(10),C=Number.parseInt(v);if(C>=0){const O=await this.parser.getDependency("texture",C);O instanceof Se&&(O.colorSpace=To,O.needsUpdate=!0),d[y]={value:O};continue}}if(y==="alphaMode"){_==="BLEND"&&(m=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new ye(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Te(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=eP,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=Ii;break;case 1:f.side=Wd;break;case 2:f.side=Cs;break;default:f.side=Cs;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=aP;break;case 6:f.depthTest=!0,f.depthFunc=rP;break;case 2:f.depthTest=!0,f.depthFunc=sP;break;case 4:f.depthTest=!0,f.depthFunc=oP;break;case 5:f.depthTest=!0,f.depthFunc=nP;break;case 7:f.depthTest=!0,f.depthFunc=iP;break;case 8:f.depthTest=!1,f.depthFunc=tP;break}f.transparent=m,m&&(f.depthWrite=!1),jM(d),f.onUpdateUniforms();for(const g in p){const y=g,_=p[g].type;d[y]?.value===void 0&&(_===i1.SAMPLER_2D?(d[y]={value:LM},console.warn("Missing/unassigned texture, fallback to white: "+y)):y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[g]))}mo&&console.log(f.uuid,d),n1(f),r(f)}):null}}function n1(o){if(o.uniforms){mo&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break;case"_map":e("map",t);break}}function e(t,i){Object.getOwnPropertyDescriptor(o,t)||Object.defineProperty(o,t,{get:()=>o.uniforms[i].value,set:n=>{o.uniforms[i].value=n,o.needsUpdate=!0}})}}const sA=w("debugextensions");let vp;const rA=import("./vendor-HRlxIBga.min.js").then(o=>o.index$2).then(async o=>(vp=o.GLTFAnimationPointerExtension,vp)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),na=new Array;function aA(o){na.includes(o)||na.push(o)}function lA(o){const e=na.indexOf(o);e>=0&&na.splice(e,1)}function My(o){if(o instanceof Do){const e=new Jx;return o.register(t=>(e.parser=t,e)),e}return null}class cA{resolvePath(e){return e.includes("/extensions/builtin_components/")?e.replace("/extensions/builtin_components/","/userData/components/"):e.includes("extensions/builtin_components/")?e.replace("extensions/builtin_components/","/userData/components/"):e}}async function wp(o,e,t,i){const n=t.indexOf("?");n>=0&&(t=t.substring(0,n)),i||(i=t),(i.startsWith("blob:")||i.startsWith("data:"))&&console.debug("[GLTFLoader] Suspicious sourceId detected"),o.register(s=>new JT(s)),o.register(s=>new aM(s)),o.register(s=>new SM(s,e.lightmaps,i)),o.register(s=>new eA(s,i,e)),o.register(s=>new oA(s,i)),o.register(s=>new fr(s,i)),o.register(s=>new He(s)),o.register(s=>new QT(s)),o.register(s=>new Lm(s)),o.register(s=>new iA(e,o,t,s)),jw()&&o.register(s=>new uc(s)),await rA.catch(s=>{}),o.register(s=>{if(vp){const r=new vp(s);return r.setAnimationPointerResolver.bind(r)(new cA),r}else return(sA||A())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const s of na)s.onImport&&s.onImport(o,t,e)}function Ey(o,e){for(const t of na)t.onExport&&t.onExport(o,e)}function o1(o,e,t){for(const i of na)i.onLoaded&&i.onLoaded(o,e,t)}const Ht=w("debuginstancing");class Ma{static instance=new Ma;static getStartInstanceCount=e=>4;objs=[];setup(e,t,i,n,s,r=0){e.applySettings(t);const a=this.tryCreateOrAddInstance(t,i,s);if(a){n===null&&(n=[]),n.push(a);const l=a.object.material;Array.isArray(l)?l.forEach(d=>He.assignTextureLOD(d,0)):He.assignTextureLOD(l,0);const c=a.object,h=c.geometry;He.assignMeshLOD(c,0).then(d=>{d&&h!=d&&a.setGeometry(d)})}else if(r<=0&&t.type!=="Mesh"){const l=r+1;for(const c of t.children)n=this.setup(e,c,i,n,s,l)}return r===0&&s.useMatrixWorldAutoUpdate&&n&&n.length>=0&&this.autoUpdateInstanceMatrix(t),n}tryCreateOrAddInstance(e,t,i){if(e.type==="Mesh"){const n=i.foundMeshes;if(i.foundMeshes+=1,!i.rend.enableInstancing)return null;if(i.rend.enableInstancing!==!0){if(n>=i.rend.enableInstancing.length)return Ht&&console.error("Something is wrong with instance setup",e,i.rend.enableInstancing,n),null;if(!i.rend.enableInstancing[n])return null}const s=e,r=s.material;for(const h of this.objs)if(!!h.canAdd(s.geometry,r))return h.addInstance(s);let a=Ma.getStartInstanceCount(e);(!a||a<0)&&(a=4);let l=e.name;l?.length||(l=p_());const c=new hA(l,s.geometry,r,a,t);return this.objs.push(c),c.addInstance(s)}return null}autoUpdateInstanceMatrix(e){const t=e.matrixWorld.multiplyMatrices.bind(e.matrixWorld),i=e.matrixWorld.clone(),n=(s,r)=>{const a=t(s,r);return(e[Hc]||i.equals(a)===!1)&&(i.copy(a),e[Hc]=!0),a};e.matrixWorld.multiplyMatrices=n}}class Aa{static all=[];get name(){return this.object.name}get isActive(){return this.__instanceIndex>=0}get vertexCount(){return this.object.geometry.attributes.position.count}get maxVertexCount(){return Math.max(this.meshInformation.vertexCount,this.vertexCount)}get reservedVertexCount(){return this.__reservedVertexRange}get indexCount(){return this.object.geometry.index?this.object.geometry.index.count:0}get maxIndexCount(){return Math.max(this.meshInformation.indexCount,this.indexCount)}get reservedIndexCount(){return this.__reservedIndexRange}object;renderer;__instanceIndex=-1;__reservedVertexRange=0;__reservedIndexRange=0;__geometryIndex=-1;meshInformation;constructor(e,t){this.__instanceIndex=-1,this.object=e,this.renderer=t,e[Nw]=t,this.meshInformation=oa(e.geometry),Aa.all.push(this)}updateMeshInformation(){const e=oa(this.object.geometry),t=this.meshInformation.vertexCount,i=this.meshInformation.indexCount;return Object.assign(this.meshInformation,e),t!==this.meshInformation.vertexCount||i!==this.meshInformation.indexCount}updateInstanceMatrix(e=!1,t=!0){this.__instanceIndex<0||(t&&this.object.updateWorldMatrix(!0,e),this.renderer.updateInstance(this.object.matrixWorld,this.__instanceIndex))}setMatrix(e){this.__instanceIndex<0||this.renderer.updateInstance(e,this.__instanceIndex)}setGeometry(e){if(this.__geometryIndex<0)return!1;const t=this;if(this.vertexCount>this.__reservedVertexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);if(this.indexCount>this.__reservedIndexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);return this.renderer.updateGeometry(e,this.__geometryIndex);function i(n){return t.updateMeshInformation()&&(t.renderer.remove(t,!0),t.renderer.add(t))?!0:((A()||Ht)&&console.error(n),!1)}}add(){this.__instanceIndex>=0||(this.renderer.add(this),x.markAsInstancedRendered(this.object,!0))}remove(e){if(!(this.__instanceIndex<0)&&(this.renderer.remove(this,e),x.markAsInstancedRendered(this.object,!1),e)){const t=Aa.all.indexOf(this);t>=0&&Aa.all.splice(t,1)}}}class hA{get batchedMesh(){return this._batchedMesh}get visible(){return this._batchedMesh.visible}set visible(e){this._batchedMesh.visible=e}get castShadow(){return this._batchedMesh.castShadow}set castShadow(e){this._batchedMesh.castShadow=e}set receiveShadow(e){this._batchedMesh.receiveShadow=e}allowResize=!0;name="";geometry;material;get count(){return this._currentInstanceCount}updateBounds(e=!0,t=!0){if(this._needUpdateBounds=!1,e&&this._batchedMesh.computeBoundingBox(),t&&this._batchedMesh.computeBoundingSphere(),Ht&&this._batchedMesh.boundingSphere){const i=this._batchedMesh.boundingSphere;B.DrawWireSphere(i.center,i.radius,65280)}}_context;_batchedMesh;_handles=[];_geometryIds=new WeakMap;_maxInstanceCount;_currentInstanceCount=0;_currentVertexCount=0;_currentIndexCount=0;_maxVertexCount;_maxIndexCount;static nullMatrix=new J;canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}_needUpdateBounds=!1;_debugMaterial=null;getBatchedMeshName(){return this.name?`${this.name} (BatchedMesh)`:"BatchedMesh"}constructor(e,t,i,n,s){this.name=e,this.geometry=t,this.material=i,this._context=s,this._maxInstanceCount=Math.max(2,n),Ht&&(this._debugMaterial=s1());const r=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],n);this._maxVertexCount=r.vertexCount,this._maxIndexCount=r.indexCount,this._batchedMesh=new Wb(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh.name=this.getBatchedMeshName(),this._batchedMesh[Gc]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),i instanceof Nb&&(i.defines.USE_INSTANCING=!0,i.needsUpdate=!0),s.pre_render_callbacks.push(this.onBeforeRender),s.post_render_callbacks.push(this.onAfterRender),Ht&&console.log(`Instanced renderer (${this.name}) created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}dispose(){Ht&&console.warn("Dispose instanced renderer",this.name),this._context.scene.remove(this._batchedMesh),this._batchedMesh.dispose(),this._batchedMesh=null,this._handles=[]}addInstance(e){const t=new Aa(e,this);e.castShadow===!0&&this._batchedMesh.castShadow===!1&&(this._batchedMesh.castShadow=!0),e.receiveShadow===!0&&this._batchedMesh.receiveShadow===!1&&(this._batchedMesh.receiveShadow=!0);try{this.add(t)}catch(i){if(console.error(`Failed adding mesh to instancing (object name: "${e.name}", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})
|
|
1003
|
+
`,i),A()){Oc("Failed instancing mesh. See the browser console for details.");debugger}return null}return t}add(e){const t=e.object.geometry;if(!t||!t.attributes)return console.error("Cannot add object to instancing without geometry",e.name),!1;if(this._currentInstanceCount+1>this._maxInstanceCount||this.mustGrow(t))if(this.allowResize)this.grow(t);else return console.error("Cannot add instance, max count reached",this.name,this.count,this._maxInstanceCount),!1;return e.object.updateWorldMatrix(!0,!0),this.addGeometry(e),this._handles[e.__instanceIndex]=e,this._currentInstanceCount+=1,this.markNeedsUpdate(),this._currentInstanceCount>0&&(this._batchedMesh.visible=!0),!0}remove(e,t){e&&(e.__instanceIndex<0||this._handles[e.__instanceIndex]!=e||this._currentInstanceCount<=0||(this.removeGeometry(e,t),this._handles[e.__instanceIndex]=null,e.__instanceIndex=-1,this._currentInstanceCount>0&&(this._currentInstanceCount-=1),this._currentInstanceCount<=0&&(this._batchedMesh.visible=!1),this.markNeedsUpdate()))}updateInstance(e,t){this._batchedMesh.setMatrixAt(t,e),this.markNeedsUpdate()}updateGeometry(e,t){return this.validateGeometry(e)?(this.mustGrow()&&this.grow(e),Ht&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,oa(e),e.attributes.position.count,e.index?e.index.count:0),this._batchedMesh.setGeometryAt(t,e),this._geometryIds.set(e,t),this.markNeedsUpdate(),!0):!1}onBeforeRender=()=>{this._batchedMesh.layers.enableAll(),this._needUpdateBounds&&this._batchedMesh[Gc]===!0&&(Ht==="verbose"&&console.log("Update instancing bounds",this.name,this._batchedMesh.matrixWorldNeedsUpdate),this.updateBounds())};onAfterRender=()=>{this._batchedMesh.layers.disableAll()};validateGeometry(e){const t=this.geometry;for(const i in t.attributes)if(i!=="batchId"&&!e.hasAttribute(i))return A()&&console.warn(`BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`),!1;return!0}markNeedsUpdate(){Ht==="verbose"&&console.warn("Marking instanced mesh dirty",this.name),this._needUpdateBounds=!0}mustGrow(e){if(this.count>=this._maxInstanceCount)return!0;if(!e||!e.attributes||this._geometryIds.has(e))return!1;const t=oa(e),i=t.vertexCount,n=t.indexCount;return this._currentVertexCount+i>this._maxVertexCount||this._currentIndexCount+n>this._maxIndexCount}_growId=0;grow(e){const t=++this._growId,i=this.count>=this._maxInstanceCount?Math.ceil(this._maxInstanceCount*2):this._maxInstanceCount,n=this.tryEstimateVertexCountSize(i,[e]),s=1.25,r=Math.max(this._maxVertexCount,Math.ceil(n.vertexCount*s)),a=Math.max(this._maxIndexCount,Math.ceil(n.indexCount*s));if(Ht){const h=oa(e);console.warn(`[Instancing] Growing Buffer
|
|
1004
|
+
Mesh: "${this.name}${e.name?.length?"/"+e.name:""}" (${h.vertexCount.toLocaleString()} vertices, ${h.indexCount.toLocaleString()} indices)
|
|
1005
|
+
Max count ${this._maxInstanceCount.toLocaleString()} \u2192 ${i.toLocaleString()}
|
|
1006
|
+
Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${r.toLocaleString()}
|
|
1007
|
+
Max index count ${this._maxIndexCount.toLocaleString()} -> ${a.toLocaleString()}`),this._debugMaterial=s1()}else A()&&console.debug(`[Instancing] Growing Buffer
|
|
1008
|
+
Mesh: "${this.name}${e.name?.length?"/"+e.name:""}"
|
|
1009
|
+
Max count ${this._maxInstanceCount} \u2192 ${i}
|
|
1010
|
+
Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${r.toLocaleString()}
|
|
1011
|
+
Max index count ${this._maxIndexCount.toLocaleString()} -> ${a.toLocaleString()}`);this._maxVertexCount=r,this._maxIndexCount=a;const l=new Wb(i,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material);l.name=this.getBatchedMeshName(),l.layers=this._batchedMesh.layers,l.castShadow=this._batchedMesh.castShadow,l.receiveShadow=this._batchedMesh.receiveShadow,l.visible=this._batchedMesh.visible,l[Gc]=this._batchedMesh[Gc],l.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,l.matrixWorldNeedsUpdate=this._batchedMesh.matrixWorldNeedsUpdate,l.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,l.matrixWorld.copy(this._batchedMesh.matrixWorld),l.matrix.copy(this._batchedMesh.matrix),this._batchedMesh.dispose(),this._batchedMesh.removeFromParent(),this._geometryIds=new WeakMap,this._batchedMesh=l,this._maxInstanceCount=i;const c=[...this._handles];this._handles=[];for(const h of c){if(t!==this._growId){Ht&&console.warn("[Instancing] Aborting grow since another grow happened in the meantime");return}h&&h.__instanceIndex>=0&&(this.addGeometry(h),this._handles[h.__instanceIndex]=h)}this._context.scene.add(l)}tryEstimateVertexCountSize(e,t,i=1){const n=new Map;for(const h of this._handles)if(h&&h.__instanceIndex>=0&&h.object.geometry){if(n.has(h.object.geometry)){const d=n.get(h.object.geometry);d.count+=1}else{const d={count:1,...oa(h.object.geometry)};n.set(h.object.geometry,d)}if(t&&t?.length>0){const d=t.indexOf(h.object.geometry);d!==-1&&t.splice(d,1)}}let s=0,r=0,a=0;for(const[h,d]of n)a+=1,s+=d.vertexCount,r+=d.indexCount;let l=Math.ceil(s/Math.max(1,a))*a,c=Math.ceil(r/Math.max(1,a))*a;if(t)for(const h of t){const d=oa(h);d!=null&&(l+=d.vertexCount*i,c+=d.indexCount*i)}return Ht&&console.log(`[Instancing] Estimated size for new buffer ${this.name}
|
|
1012
|
+
Geometries: ${a} (New: ${t?.length||0})
|
|
1013
|
+
Instances: ${e}
|
|
1014
|
+
Estimated Vertices: ${l.toLocaleString()}
|
|
1015
|
+
Estimated Indices: ${c.toLocaleString()}`),{vertexCount:l,indexCount:c}}addGeometry(e){const t=e.object.geometry;if(!t)return;let i=this._geometryIds.get(t);i==null?(Ht&&console.warn(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
|
|
1016
|
+
Current Instances: ${this._currentInstanceCount}
|
|
1017
|
+
Max Vertices: ${e.maxVertexCount.toLocaleString()}
|
|
1018
|
+
Max Indices: ${e.maxIndexCount.toLocaleString()}
|
|
1019
|
+
Max Triangles: ${(e.maxIndexCount/3).toLocaleString()}`),i=this._batchedMesh.addGeometry(t,e.maxVertexCount,e.maxIndexCount),this._geometryIds.set(t,i),this._currentVertexCount+=e.maxVertexCount,this._currentIndexCount+=e.maxIndexCount):Ht==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
|
|
1020
|
+
GEOMETRY_ID=${i}
|
|
1021
|
+
${this._currentInstanceCount} instances`);const n=this._batchedMesh.addInstance(i);e.__geometryIndex=i,e.__instanceIndex=n,e.__reservedVertexRange=e.maxVertexCount,e.__reservedIndexRange=e.maxIndexCount,this._batchedMesh.setMatrixAt(n,e.object.matrixWorld),Ht&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
|
|
1022
|
+
GEOMETRY_ID=${i}
|
|
1023
|
+
${this._currentInstanceCount} instances
|
|
1024
|
+
Index: ${e.__instanceIndex}
|
|
1025
|
+
Vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()},
|
|
1026
|
+
Indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()}`)}removeGeometry(e,t){if(e.__instanceIndex<0){console.warn("Cannot remove geometry, instance index is invalid",e.name);return}Ht&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
|
|
1027
|
+
GEOMETRY_ID=${e.__geometryIndex}
|
|
1028
|
+
${this._currentInstanceCount} instances
|
|
1029
|
+
Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}function oa(o){if(!o)return A()&&console.error("Cannot get mesh information from null geometry"),{vertexCount:0,indexCount:0};let e=o.attributes?.position?.count||0,t=o.index?o.index.count:0;const i=He.getMeshLODExtension(o);if(i){const n=i.lods[0];let s=n.vertexCount,r=n.indexCount;const a=Math.min(200,Math.ceil(s*.05));s+=a,r+=20,e=Math.max(e,s),t=Math.max(t,r)}return e=Math.ceil(e),t=Math.ceil(t),{vertexCount:e,indexCount:t}}function s1(){const o=new yt({color:new oe(Math.random(),Math.random(),Math.random())});return o.emissive=o.color,o.emissiveIntensity=.3,w("wireframe")&&(o.wireframe=!0),o}const xp=w("debuglightmaps"),r1=Symbol("lightmapKey");class Ry{get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.updatePropertyBlockTexture(),this.lightmapTexture&&He.assignTextureLOD(this.lightmapTexture,0).then(t=>{t?.isTexture&&(this.lightmapTexture=t,this.updatePropertyBlockTexture())}))}lightmapIndex=-1;lightmapScaleOffset=new ye(1,1,0,0);renderer;_isApplied=!1;get context(){return this.renderer.context}get gameObject(){return this.renderer.gameObject}lightmapTexture=null;constructor(e){this.renderer=e}init(e,t,i){console.assert(this.gameObject!==void 0&&this.gameObject!==null,"Missing gameobject",this),this.lightmapIndex=e,!(this.lightmapIndex<0)&&(this.lightmapScaleOffset=t,this.lightmapTexture=i,He.assignTextureLOD(i,0).then(n=>{n?.isTexture&&(this.lightmapTexture=n,this.updatePropertyBlockTexture())}),xp=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
|
|
1030
|
+
ScaleOffset:`,t,`
|
|
1031
|
+
Texture:`,i),this.setLightmapDebugMaterial()):xp&&console.log("Use debuglightmaps=show to render lightmaps only in the scene."),this.applyLightmap())}updateLightmapUniforms(e){}applyLightmap(){if(this._isApplied)return;if(this.gameObject.type==="Object3D"){xp&&console.warn("Can not add lightmap. Is this object missing a renderer?",this.gameObject.name);return}const e=this.gameObject;if(this.ensureLightmapUvs(e),this.lightmapIndex>=0&&this.lightmapTexture){this.lightmapTexture.channel=1;const t=this.lightmapScaleOffset;for(let i=0;i<this.renderer.sharedMaterials.length;i++){const n=this.renderer.sharedMaterials[i];!n||n.lightMap===void 0||(xp&&console.log("Setting lightmap on material",n.name,"for renderer",this.renderer.name),ys.get(this.gameObject).setOverride("lightMap",this.lightmapTexture,{offset:new K(t.z,1-t.y-t.w),repeat:new K(t.x,t.y)}),n[r1]=!0)}this._isApplied=!0}}updatePropertyBlockTexture(){if(!this._isApplied||!this.lightmapTexture)return;this.lightmapTexture.channel=1;const e=this.lightmapScaleOffset;ys.get(this.gameObject).setOverride("lightMap",this.lightmapTexture,{offset:new K(e.z,1-e.y-e.w),repeat:new K(e.x,e.y)})}onUnset(){for(let t=0;t<this.renderer.sharedMaterials.length;t++){const i=this.renderer.sharedMaterials[t];i&&delete i[r1]}const e=ys.get(this.gameObject);e&&e.removeOveride("lightMap")}ensureLightmapUvs(e){if(e instanceof H)e.geometry.getAttribute("uv1")||e.geometry.setAttribute("uv1",e.geometry.getAttribute("uv"));else if(e instanceof Mo)for(const t of e.children)this.ensureLightmapUvs(t)}setLightmapDebugMaterial(){const e=this.lightmapScaleOffset;this.gameObject.material=new Xn({vertexShader:`
|
|
1032
|
+
varying vec2 vUv1;
|
|
1033
|
+
void main()
|
|
1034
|
+
{
|
|
1035
|
+
vUv1 = uv1;
|
|
1036
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
1037
|
+
}
|
|
1038
|
+
`,fragmentShader:`
|
|
1039
|
+
uniform sampler2D lightMap;
|
|
1040
|
+
uniform float lightMapIntensity;
|
|
1041
|
+
varying vec2 vUv1;
|
|
1042
|
+
|
|
1043
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
1044
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
1045
|
+
return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
void main() {
|
|
1049
|
+
vec2 lUv = vUv1.xy * vec2(${e.x.toFixed(6)}, ${e.y.toFixed(6)}) + vec2(${e.z.toFixed(6)}, ${(1-e.y-e.w).toFixed(6)});
|
|
1050
|
+
|
|
1051
|
+
vec4 lightMapTexel = texture2D( lightMap, lUv);
|
|
1052
|
+
gl_FragColor = lightMapTexel;
|
|
1053
|
+
gl_FragColor.a = 1.;
|
|
1054
|
+
}
|
|
1055
|
+
`,defines:{USE_LIGHTMAP:""}})}}var dA=Object.defineProperty,Ko=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&dA(e,t,n),n};const Ml=w("debugrenderer"),a1=w("debugskinnedmesh"),l1=w("noinstancing"),uA=w("wireframe");class c1{path=null;asset=null;default}class pA{_renderer;_targets=[];_indexMapMaxIndex;_indexMap;_changed=!1;get changed(){return this._changed}set changed(e){e===!0&&Ml&&console.warn("SharedMaterials have changed: "+this._renderer.name),this._changed=e}is(e){return this._renderer===e}constructor(e,t){this._renderer=e;const i=this.setMaterial.bind(this),n=this.getMaterial.bind(this),s=e.gameObject;if(this._targets=[],s)switch(s.type){case"Group":this._targets=[...s.children];break;case"SkinnedMesh":case"Mesh":this._targets.push(s);break}let r=!1,a,l=0;for(let c=0;c<this._targets.length;c++){const h=this._targets[c];if(!h)continue;const d=h.material;if(d){d.shadowSide=d.side;for(let p=0;p<t.length;p++){const m=t[p];if(!m){r=!0;continue}if(d.name===m.name){a===void 0&&(a=new Map),a.set(p,c),l=Math.max(l,p);break}}}}if(r){this._indexMapMaxIndex=l,this._indexMap=a;const c=`Renderer ${e.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;console.warn(c),Di()&&be("Found renderer with missing materials: please check the console for details.")}return new Proxy(this,{get(c,h){if(typeof h=="string"){const d=parseInt(h);if(!isNaN(d))return n(d)}return c[h]},set(c,h,d){return typeof h=="string"&&i(d,Number.parseInt(h)),Reflect.set(c,h,d)?(d instanceof we&&(c.changed=!0),!0):!1}})}get length(){return this._indexMapMaxIndex!==void 0?this._indexMapMaxIndex+1:this._targets.length}*[Symbol.iterator](){for(let e=0;e<this.length;e++)yield this.getMaterial(e)}resolveIndex(e){const t=this._indexMap;return t&&t.has(e)?t.get(e):e}setMaterial(e,t){if(t=this.resolveIndex(t),t<0||t>=this._targets.length)return;const i=this._targets[t];!i||i.material===void 0||(i.material=e,this.changed=!0)}getMaterial(e){if(e=this.resolveIndex(e),e<0)return null;const t=this._targets;if(e>=t.length)return null;const i=t[e];return i?i.material:null}}const go=class Em extends E{static setInstanced(e,t){const i=Yc(e,Em);return i.setInstancingEnabled(t),i}static isInstanced(e){const t=Vr(e,Em);return t?t.isInstancingActive:vn.isUsingInstancing(e)}static setVisible(e,t){Yo(e,t)}receiveShadows=!1;shadowCastingMode=0;lightmapIndex=-1;lightmapScaleOffset=new ye(1,1,0,0);enableInstancing=void 0;renderOrder=void 0;allowOcclusionWhenDynamic=!0;probeAnchor;reflectionProbeUsage=0;_lightmaps;get sharedMesh(){if(this.gameObject.type==="Mesh")return this.gameObject;if(this.gameObject.type==="SkinnesMesh")return this.gameObject;if(this.gameObject.type==="Group")return this.gameObject.children[0]}_sharedMeshes=[];get sharedMeshes(){if(this.destroyed||!this.gameObject)return this._sharedMeshes;if(this._sharedMeshes.length=0,this.gameObject.type==="Group")for(const e of this.gameObject.children)(e.type==="Mesh"||e.type==="SkinnedMesh")&&this._sharedMeshes.push(e);else(this.gameObject.type==="Mesh"||this.gameObject.type==="SkinnedMesh")&&this._sharedMeshes.push(this.gameObject);return this._sharedMeshes}get sharedMaterial(){return this.sharedMaterials?.[0]}set sharedMaterial(e){this.sharedMaterials[0]!==e&&(this.sharedMaterials[0]=e,this.applyLightmapping())}get material(){return this.sharedMaterials?.[0]}set material(e){this.sharedMaterial=e}_sharedMaterials;_originalMaterials;_probeAnchorLastFrame;set sharedMaterials(e){if(!this._originalMaterials)this._originalMaterials=e;else if(e){let t=!1;for(let i=0;i<this._sharedMaterials.length;i++){const n=i<e.length?e[i]:null;n&&n instanceof we?this.sharedMaterials[i]=n:t||(t=!0,console.warn("Can not assign null as material: "+this.name,n))}}}get sharedMaterials(){if(this._originalMaterials===void 0)if(this.__didAwake)this._originalMaterials=[];else return null;return(!this._sharedMaterials||!this._sharedMaterials.is(this))&&(this._originalMaterials||(this._originalMaterials=[]),this._sharedMaterials=new pA(this,this._originalMaterials)),this._sharedMaterials}static get shouldSuppressInstancing(){return l1}_lightmapTextureOverride=void 0;get lightmap(){return this._lightmaps?.length?this._lightmaps[0].lightmap:null}set lightmap(e){if(this._lightmapTextureOverride=e,e===void 0&&(e=this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex)),this._lightmaps?.length)for(const t of this._lightmaps)t.lightmap=e}get hasLightmap(){return this.lightmap!=null}allowProgressiveLoading=!0;_firstFrame=-1;registering(){this.enabled||this.setVisibility(!1)}awake(){if(this._firstFrame=this.context.time.frame,Ml&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&Ml&&this.probeAnchor.add(new Li(.2)),this._reflectionProbe=null,this.isMultiMaterialObject(this.gameObject)){for(const e of this.gameObject.children)this.context.addBeforeRenderListener(e,this.onBeforeRenderThree),e.layers.mask=this.gameObject.layers.mask;if(this.renderOrder!==void 0){let e=0;for(let t=0;t<this.gameObject.children.length;t++){const i=this.gameObject.children[t];if(!(!this.isMeshOrSkinnedMesh(i)||x.getComponent(i,Em))){if(this.renderOrder.length<=e){console.warn("Incorrect renderOrder element count",this,this.renderOrder.length+" but expected "+this.gameObject.children.length,"Index: "+e,"ChildElement:",i);continue}i.renderOrder=this.renderOrder[e],e+=1}}}}else this.isMeshOrSkinnedMesh(this.gameObject)?(this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree),this.renderOrder!==void 0&&this.renderOrder.length>0&&(this.gameObject.renderOrder=this.renderOrder[0])):this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree);if(this._lightmaps=void 0,this.applyLightmapping(),uA)for(let e=0;e<this.sharedMaterials.length;e++){const t=this.sharedMaterials[e];t&&(t.wireframe=!0)}}applyLightmapping(){if(this.lightmapIndex>=0&&!this._lightmaps){const e=this._lightmapTextureOverride!==void 0?this._lightmapTextureOverride:this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex);if(e){this._lightmaps||(this._lightmaps=[]);const t=new Ry(this);t.init(this.lightmapIndex,this.lightmapScaleOffset,e),this._lightmaps.push(t)}else Ml&&console.warn(`[Renderer] No lightmaps found ${this.name} (${this.sourceId}, ${this.lightmapIndex})`)}}_isInstancingEnabled=!1;_handles=void 0;get isInstancingActive(){return this._handles!=null&&this._handles.length>0&&this._isInstancingEnabled}get instances(){if(!this._handles||this._handles.length<=0)return null;if(this._handlesTempArray.length=0,this._handles)for(const e of this._handles)this._handlesTempArray.push(e);return this._handlesTempArray}_handlesTempArray=[];setInstancingEnabled(e){if(this._isInstancingEnabled===e)return e&&(this._handles===void 0||this._handles!=null&&this._handles.length>0);if(this._isInstancingEnabled=e,e){if(this.enableInstancing===void 0&&(this.enableInstancing=!0),this._handles===void 0){if(this._handles=Ma.instance.setup(this,this.gameObject,this.context,null,{rend:this,foundMeshes:0,useMatrixWorldAutoUpdate:this.useInstanceMatrixWorldAutoUpdate()}),this._handles)return x.markAsInstancedRendered(this.gameObject,!0),!0}else if(this._handles!==null){for(const t of this._handles)t.updateInstanceMatrix(!0),t.add();return x.markAsInstancedRendered(this.gameObject,!0),!0}}else{if(this._handles)for(const t of this._handles)t.remove(this.destroyed);return!0}return!1}clearInstancingState(){this._isInstancingEnabled=!1,this._handles=void 0}useInstanceMatrixWorldAutoUpdate(){return!0}start(){if(this.enableInstancing&&!l1&&(this.setInstancingEnabled(!0),vn.markDirty(this.gameObject)),this.gameObject.frustumCulled=this.allowOcclusionWhenDynamic,this.isMultiMaterialObject(this.gameObject))for(let e=0;e<this.gameObject.children.length;e++){const t=this.gameObject.children[e];t.frustumCulled=this.allowOcclusionWhenDynamic}}onEnable(){this.sharedMeshes,this.setVisibility(!0),this._isInstancingEnabled||this.enableInstancing==!0||Array.isArray(this.enableInstancing)&&this.enableInstancing.some(e=>e)?this.__internalDidAwakeAndStart&&this.setInstancingEnabled(!0):this.enabled&&this.applyStencil(),this.updateReflectionProbe(),Zo.onEnabled.addEventListener(this.onReflectionProbeEnabled),Zo.onDisabled.addEventListener(this.onReflectionProbeDisabled)}onDisable(){this.setVisibility(!1),Zo.onEnabled.removeEventListener(this.onReflectionProbeEnabled),Zo.onDisabled.removeEventListener(this.onReflectionProbeDisabled),this._handles&&this._handles.length>0&&this.setInstancingEnabled(!1)}onDestroy(){if(this._handles=null,this.isMultiMaterialObject(this.gameObject))for(const e of this.gameObject.children)this.context.removeBeforeRenderListener(e,this.onBeforeRenderThree);else this.context.removeBeforeRenderListener(this.gameObject,this.onBeforeRenderThree)}onReflectionProbeEnabled=()=>{this.updateReflectionProbe()};onReflectionProbeDisabled=e=>{this._reflectionProbe===e&&(this._reflectionProbe.unapply(this.gameObject),this._reflectionProbe=null)};onBeforeRender(){if(this.gameObject){if((this._probeAnchorLastFrame!==this.probeAnchor||this._reflectionProbe?.activeAndEnabled===!1)&&(this._reflectionProbe?.unapply(this.gameObject),this.updateReflectionProbe()),Ml==this.name&&this.gameObject instanceof H){this.gameObject.geometry.computeBoundingSphere();const e=F(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);B.DrawWireSphere(e,this.gameObject.geometry.boundingSphere.radius,56831)}if(this.isMultiMaterialObject(this.gameObject)&&this.gameObject.children?.length>0)for(const e of this.gameObject.children)this.applySettings(e);else this.applySettings(this.gameObject);if(this.sharedMaterials?.changed&&(this.sharedMaterials.changed=!1,this.applyLightmapping()),this._handles?.length&&this.gameObject[Hc]===!0){this.gameObject[Hc]=!1;for(let e=this._handles.length-1;e>=0;e--)this._handles[e].updateInstanceMatrix();this.gameObject.matrixWorldNeedsUpdate=!1}if(this._handles&&this._handles.length<=0&&x.markAsInstancedRendered(this.gameObject,!1),this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Yo(t.object,!1)}if(this.reflectionProbeUsage!==0&&this._reflectionProbe?this._reflectionProbe.apply(this.gameObject):this.reflectionProbeUsage===0&&this._reflectionProbe&&this._reflectionProbe.unapply(this.gameObject),this._sharedMaterials)for(const e of this._sharedMaterials)e&&"envMap"in e&&"envMapIntensity"in e&&!Zo.isUsingReflectionProbe(e)&&(e.envMap=this.context.scene.environment,e.envMapRotation=this.context.scene.environmentRotation);else Ml&&console.warn("[Renderer] sharedMaterials not initialized yet: "+this.name)}}onBeforeRenderThree=(e,t,i,n,s,r)=>{if(s.envMapIntensity!==void 0){const a=this.hasLightmap?Math.PI:1,l=this.context.scene.environmentIntensity;s.envMapIntensity=Math.max(0,l*this.context.sceneLighting.environmentIntensity/a)}if(this._lightmaps)for(const a of this._lightmaps)a.updateLightmapUniforms(s),a.applyLightmap()};onAfterRender(){if(this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Yo(t.object,!0)}this._reflectionProbe?.activeAndEnabled===!1&&this._reflectionProbe.unapply(this.gameObject),this.static&&this.gameObject.matrixAutoUpdate&&this.context.time.frame-this._firstFrame>=10&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){fr.applyStencil(this)}applySettings(e){e.receiveShadow=this.receiveShadows,this.shadowCastingMode==1?e.castShadow=!0:e.castShadow=!1}_reflectionProbe=null;updateReflectionProbe(){this._reflectionProbe=null,this.reflectionProbeUsage!==0&&(this.startCoroutine(this._updateReflectionProbe(),xe.LateUpdate),this._probeAnchorLastFrame=this.probeAnchor)}*_updateReflectionProbe(){const e=this.probeAnchor||this.gameObject,t=!!this.probeAnchor;this._reflectionProbe=Zo.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Yo(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Yo(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};Ko([u()],go.prototype,"receiveShadows"),Ko([u()],go.prototype,"shadowCastingMode"),Ko([u()],go.prototype,"lightmapIndex"),Ko([u(ye)],go.prototype,"lightmapScaleOffset"),Ko([u()],go.prototype,"enableInstancing"),Ko([u()],go.prototype,"renderOrder"),Ko([u()],go.prototype,"allowOcclusionWhenDynamic"),Ko([u(M)],go.prototype,"probeAnchor"),Ko([u()],go.prototype,"reflectionProbeUsage");let oi=go;class xh extends oi{}class Ty extends xh{_needUpdateBoundingSphere=!1;awake(){super.awake(),a1&&console.log('SkinnedMeshRenderer for "'+this.name+'"',this),this.allowOcclusionWhenDynamic=!1;for(const e of this.sharedMeshes)e.parent?.updateWorldMatrix(!1,!0),this.markBoundsDirty()}onAfterRender(){if(super.onAfterRender(),this._needUpdateBoundingSphere){for(const e of this.sharedMeshes)if(e instanceof Ss){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,i=qb(e);i&&(e.geometry=i),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(a1){for(const e of this.sharedMeshes)if(e instanceof Ss&&e.boundingSphere){const t=F(e.boundingSphere.center).applyMatrix4(e.matrixWorld);B.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var mA=Object.defineProperty,El=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&mA(e,t,n),n};const Gt=w("debugdroplistener");class gA extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const fA="blob";class Jo extends E{dropArea;fitIntoVolume=!1;fitVolumeSize=new b(1,1,1);placeAtHitPosition=!0;useNetworking=!1;onDropped=new ae;loadFromURL(e,t){return this.addFromUrl(e,{screenposition:new K,point:t?.point,size:t?.size},!1)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}awake(){for(const e of this.gameObject.children)this.dropArea&&e.contains(this.dropArea)||this._addedObjects.push(e)}onEnable(){this.context.renderer.domElement.addEventListener("dragover",this.onDrag),this.context.renderer.domElement.addEventListener("drop",this.onDrop),window.addEventListener("paste",this.handlePaste),this.context.connection.beginListen("droplistener",this.onNetworkEvent),A()&&this.dropArea&&(this.dropArea.getComponentInChildren(oi)||console.warn("[DropListener] The assigned DropArea does not seem to have a renderer/mesh. Drag and Drop events will not be detected."))}onDisable(){this.context.renderer.domElement.removeEventListener("dragover",this.onDrag),this.context.renderer.domElement.removeEventListener("drop",this.onDrop),window.removeEventListener("paste",this.handlePaste),this.context.connection.stopListen("droplistener",this.onNetworkEvent)}onNetworkEvent=e=>{if(!this.useNetworking){Gt&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(e.guid?.startsWith(this.guid)){const t=e.url;if(console.debug("[DropListener] Received networked event",e),t)if(Array.isArray(t))for(const i of t)this.addFromUrl(i,{screenposition:new K,point:e.point,size:e.size},!0);else this.addFromUrl(t,{screenposition:new K,point:e.point,size:e.size},!0)}};handlePaste=e=>{this.context.connection.allowEditing===!1||e.defaultPrevented||navigator.clipboard.readText().then(t=>{if(t&&(t.startsWith("http")||t.startsWith("https")||t.startsWith("blob"))){const i={screenposition:new K(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(i)&&this.addFromUrl(t,i,!1)}}).catch(console.warn)};onDrag=e=>{Gt&&console.debug("DropListener Drag",e,this.context.connection.allowEditing),this.context.connection.allowEditing!==!1&&e.preventDefault()};onDrop=async e=>{if(Gt&&console.debug("DropListener Drop",e,this.context.connection.allowEditing),this.context.connection.allowEditing===!1||!e?.dataTransfer||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new K(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const i=e.dataTransfer.items;if(!i)return;const n=[];for(const s in i){const r=i[s];if(r.kind==="file"){const a=r.getAsFile();if(!a)continue;n.push(a)}else r.kind==="string"&&r.type=="text/plain"&&r.getAsString(a=>{this.addFromUrl(a,t,!1)})}n.length>0&&await this.addFromFiles(n,t)};async addFromUrl(e,t,i){Gt&&console.log("dropped url",e);try{if(e.startsWith("https://github.com/")){const r=e.split("/"),a=r[3],l=r[4],c=r[6],h=r.slice(7).join("/");e=`https://raw.githubusercontent.com/${a}/${l}/${c}/${h}`}else e.startsWith("https://polyhaven.com/a")&&(e=yA(e));if(!e)return null;const n=e.toLowerCase();if(n.endsWith(".hdr")||n.endsWith(".hdri")||n.endsWith(".exr")||n.endsWith(".png")||n.endsWith(".jpg")||n.endsWith(".jpeg"))return console.warn(`Fileformat is not supported: ${n}`),null;this.removePreviouslyAddedObjects();const s=await Sp.loadFileFromURL(new URL(e),{guid:this.guid,context:this.context,parent:this.gameObject,point:t.point,size:t.size});if(s&&this._addedObjects.length<=0)return t.url=e,this.onObjectLoaded(s,t,i)}catch{console.warn("String is not a valid URL",e)}return null}_abort=null;async addFromFiles(e,t){if(Gt&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),Ua(fA,null),this._abort?.abort("New files dropped"),this._abort=new AbortController;for(const i of e){if(!i)continue;if(i.type.startsWith("image/")){Gt&&console.warn("Ignoring dropped image file",i.name,i.type);continue}else if(i.name.endsWith(".bin")){Gt&&console.warn("Ignoring dropped binary file",i.name,i.type);continue}console.debug("Load file "+i.name+" + "+i.type);const n=await Sp.loadFile(i,this.context,{guid:this.guid});if(n){this.dispatchEvent(new CustomEvent("file-dropped",{detail:i})),t.file=i;const s=this.onObjectLoaded(n,t,!1);s&&this.context.connection.isConnected&&this.useNetworking&&(console.debug("Uploading dropped file to blob storage"),Tr.upload(i,{abort:this._abort?.signal}).then(r=>{r?.download_url&&this._addedObjects.includes(s)&&this.sendDropEvent(r.download_url,s,n.contentMD5)}).catch(console.warn));break}}}}_addedObjects=new Array;_addedModels=new Array;removePreviouslyAddedObjects(e=!0){if(e)for(const t of this._addedObjects)t.parent===this.gameObject&&t.destroy();this._addedObjects.length=0,this._addedModels.length=0}onObjectLoaded(e,t,i){const{model:n,contentMD5:s}=e;if(Gt&&console.log(`Dropped ${this.gameObject.name}`,n),!n?.scene)return console.warn("No object specified to add to scene",n),null;this.removePreviouslyAddedObjects();const r=n.scene;r.position.copy(this.gameObject.worldPosition);const a=Ge(this.gameObject);let l=new b(0,0,0);a.x=Math.abs(a.x),a.y=Math.abs(a.y),a.z=Math.abs(a.z);let c=r.scale.clone();const h=new Nt().setFromCenterAndSize(new b(0,this.fitVolumeSize.y*a.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize.clone().multiply(a));if(Gt&&B.DrawWireBox3(h,255,5),this.fitIntoVolume&&(N_(r,h,{position:!this.placeAtHitPosition}),c=r.scale.clone().divide(a),l=r.worldPosition.clone().sub(this.gameObject.worldPosition).divide(a),Gt&&B.DrawSphere(l,.1,16711680,5)),this.gameObject.attach(r),r.position.copy(l),r.quaternion.identity(),r.scale.copy(c),Gt&&B.DrawArrow(this.gameObject.worldPosition,r.getWorldPosition(new b),65280,5),this._addedObjects.push(r),this._addedModels.push(n),this.placeAtHitPosition&&t&&t.screenposition){r.visible=!1;const p=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(r.visible=!0,p&&p.length>0)for(const m of p){const f=m.point.clone();Gt&&console.log("Place object at hit",m),W_(r,f);break}}mi.autoplayAnimations(n);const d=new gA({sender:this,gltf:n,model:n,object:r,contentMD5:s,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(d),this.onDropped?.invoke(d.detail),!i&&t.url?.startsWith("http")&&this.context.connection.isConnected&&r&&this.sendDropEvent(t.url,r,s),r}async sendDropEvent(e,t,i){if(!this.useNetworking){Gt&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(this.context.connection.isConnected){console.debug('Sending drop event "'+t.name+'"',e);const n=ui([t]),s={name:t.name,guid:this.guid,url:e,point:t.worldPosition.clone(),size:n.getSize(new b),contentMD5:i};this.context.connection.send("droplistener",s)}}deleteDropEvent(){this.context.connection.sendDeleteRemoteState(this.guid)}testIfIsInDropArea(e){const t=this.context.input.convertScreenspaceToRaycastSpace(e.screenposition.clone()),i=this.context.physics.raycast({screenPoint:t,recursive:!0,testObject:s=>!this._addedObjects.some(r=>r.contains(s))});if(!i.length)return A()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1;const n=i[0];return!!(this.dropArea&&this.dropArea.contains(n.object))}}El([u(M)],Jo.prototype,"dropArea"),El([u()],Jo.prototype,"fitIntoVolume"),El([u(b)],Jo.prototype,"fitVolumeSize"),El([u()],Jo.prototype,"placeAtHitPosition"),El([u()],Jo.prototype,"useNetworking"),El([u(ae)],Jo.prototype,"onDropped");function yA(o){if(!o.startsWith("https://polyhaven.com/"))return o;const e="https://dl.polyhaven.org/file/ph-assets/Models/gltf/4k/",t=new URL(o).pathname.split("/").pop(),i=`${e}${t}/${t}_4k.gltf`;return console.log("Resolved polyhaven asset url",o,"\u2192",i),i}var Sp;(o=>{async function e(i,n,s){const r=s.guid,a=new kt(r),l=new Blob([i],{type:i.type||Gx(i.name)||void 0}),c=URL.createObjectURL(l),h=await Mn().loadSync(n,c,i.name,a).catch(d=>(console.error(`Failed to load file "${i.name}" (${i.type}):`,d),null));return URL.revokeObjectURL(c),h?new Promise((d,p)=>{const m=new FileReader;m.readAsArrayBuffer(i),m.onloadend=async f=>{const g=m.result,y=Tr.hashMD5(g);return d({model:h,contentMD5:y})}}):(console.warn(`Failed to load "${i.name}" (${i.type})`),null)}o.loadFile=e;async function t(i,n){return new Promise(async(s,r)=>{const a=new kt(n.guid),l=i.toString();Gt&&B.DrawWireSphere(n.point,.1,16711680,3);const c=Ns.addPreview({guid:n.guid,parent:n.parent,position:n?.point,size:n?.size}),h=await Mn().loadSync(n.context,l,l,a,d=>{c.onProgress(d.loaded/d.total)}).catch(console.warn);if(h){const d=await fetch(l).then(m=>m.arrayBuffer()),p=Tr.hashMD5(d);Gt?setTimeout(()=>Ns.removePreview(n.guid),3e3):Ns.removePreview(n.guid),s({model:h,contentMD5:p})}else Gt?setTimeout(()=>Ns.removePreview(n.guid),3e3):Ns.removePreview(n.guid),console.warn("Unsupported file type: "+i.toString())})}o.loadFileFromURL=t})(Sp||(Sp={}));var bA=Object.defineProperty,Ay=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&bA(e,t,n),n};const Cp=class eC extends E{parent=null;object=null;limitCount=60;_currentCount=0;_startPosition=null;_startQuaternion=null;start(){if(this._currentCount=0,this._startPosition=null,this._startQuaternion=null,this.object||(this.object=this.gameObject),this.object){if(this.object===this.gameObject){const t=new kt(this.guid);this.object=x.instantiate(this.object,{idProvider:t,keepWorldPosition:!1}),x.getComponent(this.object,eC)?.destroy();let i=this.object.getComponentInChildren(ta);i||(i=this.object.addComponent(ta,{dragMode:_y.SnapToSurfaces}),i.guid=t.generateUUID());let n=x.getComponent(i.gameObject,Ln);n||(n=i.gameObject.addComponent(Ln),n.guid=t.generateUUID())}this.object.visible=!1;const e=this.gameObject.getComponent(ta);e&&(e.enabled=!1),this._startPosition=this.object.position?.clone()??new b(0,0,0),this._startQuaternion=this.object.quaternion?.clone()??new N(0,0,0,1)}this.gameObject.getComponentInParent(an)||this.gameObject.addComponent(an)}onEnable(){this.startCoroutine(this.cloneLimitIntervalFn())}_forwardPointerEvents=new Map;onPointerEnter(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.setCursor("pointer")}onPointerExit(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.unsetCursor("pointer")}onPointerDown(e){if(e.used||!this.object||!this.context.connection.allowEditing||e.button!==0)return;const t=this.handleDuplication();if(t){const i=x.getComponent(t,ta);i?(i.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,i)):A()&&console.warn(`Duplicated object (${t.name}) does not have DragControls`)}else this._currentCount>=this.limitCount?console.warn(`[Duplicatable] Limit of ${this.limitCount} objects created within a few seconds reached. Please wait a moment before creating more objects.`):console.warn("[Duplicatable] Could not duplicate object.")}onPointerUp(e){if(e.used)return;const t=this._forwardPointerEvents.get(e.event.space);t&&(t.onPointerUp(e),this._forwardPointerEvents.delete(e.event.space))}*cloneLimitIntervalFn(){for(;this.activeAndEnabled&&!this.destroyed;)this._currentCount>0?this._currentCount-=1:this._currentCount<0&&(this._currentCount=0),yield tf(1)}handleDuplication(){if(!this.object||this.limitCount>0&&this._currentCount>=this.limitCount||this.object===this.gameObject)return null;if(x.isDestroyed(this.object))return this.object=null,null;this.object.matrixAutoUpdate===!1&&(this.object.updateMatrix(),A()&&(console.warn(`Object "${this.object.name}" has matrixAutoUpdate disabled. This can cause duplicated objects to have incorrect position/rotation/scale. Consider enabling matrixAutoUpdate or calling updateMatrix() before duplication.`),be("Duplicatable: Object has matrixAutoUpdate disabled"))),this.object.visible=!0,this._startPosition&&this.object.position.copy(this._startPosition),this._startQuaternion&&this.object.quaternion.copy(this._startQuaternion);const e=new qn;this.parent||(this.parent=this.gameObject.parent),this.parent&&(e.parent=this.parent.guid??this.parent.userData?.guid,e.keepWorldPosition=!0),e.position=this.worldPosition,e.rotation=this.worldQuaternion,e.context=this.context,this._currentCount+=1;const t=x.instantiateSynced(this.object,e);return console.assert(t!==this.object,"Duplicated object is original"),this.object.visible=!1,this._startPosition&&this.object.position.clone().copy(this._startPosition),this._startQuaternion&&this.object.quaternion.clone().copy(this._startQuaternion),t}};Ay([u(M)],Cp.prototype,"parent"),Ay([u(M)],Cp.prototype,"object"),Ay([u()],Cp.prototype,"limitCount");let Iy=Cp;var es=(o=>(o[o.PointerEnter=0]="PointerEnter",o[o.PointerExit=1]="PointerExit",o[o.PointerDown=2]="PointerDown",o[o.PointerUp=3]="PointerUp",o[o.PointerClick=4]="PointerClick",o))(es||{}),_A=Object.defineProperty,Ly=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&_A(e,t,n),n};class Dy{eventID;callback=new ae}Ly([u()],Dy.prototype,"eventID"),Ly([u(ae)],Dy.prototype,"callback");class Pp extends E{triggers=[];invoke(e){if(this.triggers)for(const t of this.triggers)t.eventID===e&&t.callback?.invoke()}hasTrigger(e){return this.triggers?.some(t=>t.eventID===e)??!1}shouldChangeCursor(){return this.hasTrigger(es.PointerClick)||this.hasTrigger(es.PointerDown)||this.hasTrigger(es.PointerUp)}onPointerClick(e){this.invoke(es.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(es.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(es.PointerExit)}onPointerDown(e){this.invoke(es.PointerDown)}onPointerUp(e){this.invoke(es.PointerUp)}}Ly([u(Dy)],Pp.prototype,"triggers");class h1{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const i=this.writer,n=i.extensionsUsed,s={};t.extensions=t.extensions||{},t.extensions[this.name]=s;let r=new J;const a=new Array,l=new Array,c=new Array;for(let m=0;m<e.count;m++){e.getMatrixAt(m,r);let f=new b,g=new N,y=new b;r.decompose(f,g,y),a.push(f.x,f.y,f.z),l.push(g.x,g.y,g.z,g.w),c.push(y.x,y.y,y.z)}const h=new Float32Array(a),d=new Float32Array(l),p=new Float32Array(c);s.attributes={TRANSLATION:i.processAccessor(new tt(h,3)),ROTATION:i.processAccessor(new tt(d,4)),SCALE:i.processAccessor(new tt(p,3))},n[this.name]=!0}}class d1{writer;constructor(e){this.writer=e}writeNode(e){}}class vA extends d1{beforeWriteNode(e,t){B.isGizmo(e)&&(t.keep=!1)}}class u1 extends d1{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=hf(new se(1,1,1,0)))}}function jy(o){const e=su.DontExport;return!(o.hideFlags&e)}var wA=Object.defineProperty,p1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wA(e,t,n),n};const Op=w("debuggltfexport");class By extends zt{sceneRoot}const Fy=class lc extends E{binary=!0;objects=[];ext;async exportNow(e,t){Op&&console.log("Exporting objects as glTF",this.objects),e||(e="scene"),(!this.objects||this.objects.length<=0)&&(this.objects=[this.context.scene]);const i={binary:this.binary,pivot:lc.calculateCenter(this.objects),...t},n=await this.export(this.objects,i).catch(s=>(console.error(s),!1));return n===!1?!1:(this.binary?e.endsWith(".glb")||(e+=".glb"):e.endsWith(".gltf")||(e+=".gltf"),this.binary?lc.saveArrayBuffer(n,e):lc.saveJson(n,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const i=new Zb;i.register(c=>new h1(c)),i.register(c=>new u1(c)),Ey(i,this.context),lc.filterTopmostParent(e);const n={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||lc.collectAnimations(e),...t},s=new Array,r=new M;t?.pivot&&r.position.sub(t.pivot),Op&&console.log("EXPORT",e),e.forEach(c=>{c&&jy(c)&&(r.children.push(c),c.matrixAutoUpdate=!1,c.matrix.copy(c.matrixWorld),x.getComponentsInChildren(c,oi).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}),c.traverse(h=>{if(!jy(h)){const d=h.parent;h.removeFromParent(),s.push(()=>{d&&d.add(h)})}}))});const a=new Yg(r);return t?.needleComponents&&(this.ext=new Jx),this.ext&&(this.ext.registerExport(i),this.ext.context=a),new Promise((c,h)=>{Op&&console.log("Starting glTF export.");try{i?.parse(r,d=>{l(),c(d)},d=>{l(),h(d)},n)}catch(d){console.error(d),h(d)}finally{s.forEach(d=>d()),Op&&console.log("Finished glTF export.")}});function l(){e.forEach(c=>{c&&(c.matrixAutoUpdate=!0,x.getComponentsInChildren(c,oi).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}))})}}static saveArrayBuffer(e,t){this.save(new Blob([e],{type:"application/octet-stream"}),t)}static saveJson(e,t){this.save("data: text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(e)),t)}static save(e,t){const i=document.createElement("a");i.style.display="none",document.body.appendChild(i),typeof e=="string"?i.href=e:i.href=URL.createObjectURL(e),i.download=t,i.click(),i.remove()}static collectAnimations(e,t){t=t||[];for(const i of e)i&&i.traverseVisible(n=>{n.animations&&n.animations.length>0&&t.push(...n.animations)});return t}static calculateCenter(e,t){const i=t||new b;return i.set(0,0,0),e.forEach(n=>{i.add(ee(n))}),i.divideScalar(e.length),i}static filterTopmostParent(e){if(!(e.length<=0))for(let t=0;t<e.length;t++){let i=e[t];if(!i){e.splice(t,1),t--;continue}for(;i.parent;){if(e.includes(i.parent)){e.splice(t,1),t--;break}i=i.parent}}}};p1([u()],Fy.prototype,"binary"),p1([u(M)],Fy.prototype,"objects");let Uy=Fy;function xA(){typeof globalThis!==void 0&&!("OffscreenCanvas"in globalThis)&&(globalThis.OffscreenCanvas=class{canvas;constructor(o,e){return this.canvas=document.createElement("canvas"),this.canvas.width=o,this.canvas.height=e,this.canvas.convertToBlob=(t,i)=>new Promise(n=>{this.canvas.toBlob(n,t,i)}),this.canvas}})}const SA=w("debugprogress");function m1(o){o=o||new Date;const e=o.getMonth()+1,t=o.getDate(),i=o.getHours(),n=o.getMinutes(),s=o.getSeconds(),r=(e<10?"0":"")+e,a=(t<10?"0":"")+t,l=(i<10?"0":"")+i,c=(n<10?"0":"")+n,h=(s<10?"0":"")+s;return o.getFullYear()+r+a+"-"+l+c+h}class le{static start(e,t){typeof t=="string"&&(t={parentScope:t});const i=new CA(e,t);Sh.set(e,i)}static report(e,t){const i=Sh.get(e);if(!i){console.warn("Reporting progress for non-existing scope",e);return}typeof t=="string"&&(t={message:t,autoStep:!0}),i.report(t)}static end(e){const t=Sh.get(e);t&&(t.end(),Sh.delete(e))}}const Sh=new Map;class CA{scopeLabel;parentScope;childScopes=[];parentDepth=0;lastStep=0;lastAutoStepWeight=1;lastTotalSteps=0;onProgress;showLogs=!1;selfProgress=0;totalProgress=0;selfReports=0;totalReports=0;constructor(e,t){this.parentScope=t?.parentScope?Sh.get(t.parentScope):void 0,this.parentScope&&(this.parentScope.childScopes.push(this),this.parentDepth=this.parentScope.parentDepth+1),this.scopeLabel=" ".repeat(this.parentDepth*2)+e,this.showLogs=t?.logTimings??!!SA,this.showLogs&&console.time(this.scopeLabel),this.onProgress=t?.onProgress}report(e,t=!1){if(e){if(e.totalSteps!==void 0&&(this.lastTotalSteps=e.totalSteps),e.currentStep!==void 0&&(this.lastStep=e.currentStep),e.autoStep!==void 0){if(e.currentStep===void 0){this.lastStep===void 0&&(this.lastStep=0);const n=typeof e.autoStep=="number"?e.autoStep:1;this.lastStep+=this.lastAutoStepWeight,this.lastAutoStepWeight=n,e.currentStep=this.lastStep}e.totalSteps=this.lastTotalSteps}e.progress!==void 0?this.selfProgress=e.progress:e.currentStep!==void 0&&e.totalSteps!==void 0&&(this.selfProgress=e.currentStep/e.totalSteps)}if(this.childScopes.length>0){let n=0,s=0;for(const a of this.childScopes)n+=a.selfProgress,s+=1;s>0&&(n/=s);const r=this.lastAutoStepWeight/(this.lastTotalSteps??1);this.totalProgress=this.selfProgress+n*r}else this.totalProgress=this.selfProgress;this.selfProgress=Math.min(1,this.selfProgress),this.totalProgress=Math.min(1,this.totalProgress);let i=(this.totalProgress*100).toFixed(3)+"%";this.childScopes.length>0&&(i+=" ("+(this.selfProgress*100).toFixed(3)+"% self)"),e?.message&&(i=e.message+" \u2013 "+i),this.lastStep!==void 0&&this.lastTotalSteps!==void 0&&(i="Step "+(this.lastStep+(this.lastAutoStepWeight!=1?"\u2013"+(this.lastStep+this.lastAutoStepWeight):"")+"/"+this.lastTotalSteps)+" "+i),t?this.totalReports++:(this.selfReports++,this.totalReports++),this.showLogs&&console.timeLog(this.scopeLabel,i),this.onProgress&&this.onProgress(this.totalProgress),this.parentScope&&this.parentScope.report(void 0,!0)}end(){this.report({progress:1,autoStep:!0},!0),this.showLogs&&(console.timeLog(this.scopeLabel,"Total reports: "+this.totalReports,"Self reports: "+this.selfReports),console.timeEnd(this.scopeLabel));let e=!1;for(const t of this.childScopes)if(!(t.selfProgress>=1)){e=!0;break}e&&console.warn("Progress end with child scopes that are still running",this),this.onProgress=void 0}}const Be="</StageRoot/Materials";function PA(o,e,t){const i=new Map,n=g=>{const y=g.type___needle,_=i.get(y)||new Map;if(i.set(y,_),!_.has(g)){const v=`${y}${_.size?`_${_.size}`:""}`;_.set(g,v)}return _.get(g)},s=o.colorNode?kp(o.colorNode):[],r=o.colorNode?`color3f inputs:diffuseColor.connect = ${Be}/${e}/${n(s.values().next().value)}.outputs:out>`:"",a=o.roughnessNode?kp(o.roughnessNode):[],l=o.roughnessNode?`float inputs:roughness.connect = ${Be}/${e}/${n(a.values().next().value)}.outputs:out>`:"",c=o.normalNode?kp(o.normalNode):[],h=o.normalNode?`float3 inputs:normal.connect = ${Be}/${e}/${n(c.values().next().value)}.outputs:out>`:"",d=o.metalnessNode?kp(o.metalnessNode):[],p=o.metalnessNode?`float inputs:metallic.connect = ${Be}/${e}/${n(d.values().next().value)}.outputs:out>`:"",m=new Set([...s,...a,...c,...d]),f=MA(m,e,t,n);return console.debug(f),`
|
|
1056
|
+
|
|
1057
|
+
def Material "${e}" ${o.name?`(
|
|
1058
|
+
displayName = "${o.name}"
|
|
1059
|
+
)`:""}
|
|
1060
|
+
{
|
|
1061
|
+
token outputs:mtlx:surface.connect = ${Be}/${e}/N_mtlxsurface.outputs:surface>
|
|
1062
|
+
|
|
1063
|
+
def Shader "N_mtlxsurface"
|
|
1064
|
+
{
|
|
1065
|
+
uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
|
|
1066
|
+
${r}
|
|
1067
|
+
${l}
|
|
1068
|
+
${h}
|
|
1069
|
+
${p}
|
|
1070
|
+
token outputs:surface
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
${f}
|
|
1074
|
+
|
|
1075
|
+
}`}function kp(o){const e=g=>{if(g.nodeType)return g.nodeType;switch(g.type){case"TimerNode":return"float";case"TextureNode":return;case"ConvertNode":return g.convertTo;default:return}},t=g=>{const y=new Set,_=v=>{if(!(!v.isNode||y.has(v))){v.nodeType___needle||(v.nodeType___needle=e(v)),v.shaderNode?(v.type___needle="ShaderCallNodeInternal",v.shaderNodeLayoutName___needle=v.shaderNode.layout.name.slice(3)):v.type___needle=v.type,y.add(v);for(const C in v)v[C]?.isNode&&(_(v[C]),v.nodeType___needle||=v[C].nodeType___needle),Array.isArray(v[C])&&v[C].forEach(O=>{O.isNode&&(_(O),v.nodeType___needle||=O.nodeType___needle)})}};return _(g),y},i=g=>{if(g.type==="ConvertNode"){if(g.convertTo===g.node.nodeType___needle)return!0;if(g.node.type==="ConstNode"){if(g.convertTo==="vec4"&&g.node.value.isVector4||g.convertTo==="vec3"&&g.node.value.isVector3||g.convertTo==="vec2"&&g.node.value.isVector2||g.convertTo==="color"&&g.node.value.isColor||g.convertTo==="float"&&typeof g.node.value=="number")return!0}else if(g.node.type=="SplitNode"&&g.convertTo=="float"&&g.node.components.length===1)return!0}return!1},n=g=>{for(;s(g);)!g.node&&g.shaderNode?g=g.inputNodes[0]:g=g.node??g.aNode??g.bNode??g.cNode;return g},s=g=>{const y=["UniformNode","UniformGroupNode","ShaderNodeInternal"];return!g||i(g)||y.includes(g.type___needle)||g.type___needle===void 0},r=(g,y)=>{for(const _ of y)for(const v in _){if(_[v]?.isNode&&_[v]===g)return{parent:_,label:v};if(Array.isArray(_[v])&&_[v].find(C=>C.isNode&&C===g))return{parent:_,label:v}}return null},a=(g,y)=>{if(g.shaderNode)g.inputNodes[0]=n(g.inputNodes[0]);else if(Array.isArray(g.nodes))for(let _=0;_<g.nodes.length;_++)g.nodes[_]&&s(g.nodes[_])&&(g.nodes[_]=n(g.nodes[_]));else y.forEach(_=>{g[_]&&s(g[_])&&(g[_]=n(g[_]))})},l=g=>{g.type==="MathNode"&&g.method==="mix"&&(g.cNode.nodeType___needle="float",g.cNode.type==="ConvertNode"&&(g.cNode.convertTo="float"))},c=(g,y)=>{y.label==="cNode"&&y.parent.type==="MathNode"&&y.parent.method==="mix"||(y.parent.type==="JoinNode"?g.nodeType___needle="float":g.nodeType___needle=y.parent.nodeType___needle)},h=g=>g?.type==="ConvertNode"&&g.nodeType___needle==="color"&&g.node.nodeType___needle==="vec4",d=(g,y)=>{g.convertTo="vec3",g.nodeType___needle="vec3";const _={type:"ConvertNode",convertTo:"color",node:g,isNode:!0,nodeType___needle:"color",type___needle:"ConvertNode"},v=r(g,y);return v?.parent&&(v.parent[v.label]=_),_},p=g=>g?.type==="ConvertNode"&&g.node.type==="TextureNode"&&g.nodeType___needle!==g.node.nodeType___needle,m=g=>{const y=new Set;for(let _ of g)if(!s(_)){if(l(_),_.type=="SplitNode"){const v=r(_,g);if(_.components.length===1)_.nodeType___needle="float";else if(v)_.nodeType___needle=v.parent.nodeType___needle;else throw new Error("SplitNode without parent found, this should not happen")}if(a(_,["node","aNode","bNode","cNode"]),_.type=="ConstNode"&&_.nodeType==null&&c(_,r(_,g)),h(_)&&y.add(d(_,g)),p(_)){_.node.nodeType___needle=_.convertTo;const v=r(_,g);v?.parent&&(v.parent[v.label]=_.node),_=_.node}y.add(_)}return y},f=t(o);return m(f)}function OA(o,e){switch(e){case"float4":return o.isVector4?`(${o.x}, ${o.y}, ${o.z}, ${o.w})`:`(${o}, ${o}, ${o}, ${o})`;case"float3":return o.isVector3?`(${o.x}, ${o.y}, ${o.z})`:`(${o}, ${o}, ${o})`;case"float2":return o.isVector2?`(${o.x}, ${o.y})`:`(${o}, ${o})`;case"color3f":return o.isColor?`(${o.r}, ${o.g}, ${o.b})`:`(${o}, ${o}, ${o})`;default:return o.isVector4||o.isVector3||o.isVector2?`${o.x}`:o.isColor?`${o.r}`:`${o}`}}function kA(o,e,t,i){const n=" ",s=m=>({float:"float",vec2:"vector2",vec3:"vector3",vec4:"vector4",color:"color3"})[m]||"float",r=m=>({float:"float",vec2:"float2",vec3:"float3",vec4:"float4",color:"color3f"})[m]||"float",a=o.type___needle,l=o.nodeType___needle,c=s(l);let h=r(l),d="";const p=new Array;switch(a){case"UniformGroupNode":case"UniformNode":return"";case"TimerNode":d="time_float";break;case"ConstNode":d="constant_"+c,p.push(`${h} inputs:value = ${OA(o.value,h)}`);break;case"JoinNode":d="combine"+o.nodes.length+"_"+c;let m=1;for(const v of o.nodes)p.push(`float inputs:in${m++}.connect = ${Be}/${e}/${t(v)}.outputs:out>`);break;case"ConvertNode":d="convert_"+s(o.node.nodeType___needle)+"_"+c,o.node&&p.push(`${r(o.node.nodeType___needle)} inputs:in.connect = ${Be}/${e}/${t(o.node)}.outputs:out>`);break;case"MathNode":d=o.method+"_"+c,o.aNode&&!o.bNode&&p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode&&!o.cNode&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in1.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:in2.connect = ${Be}/${e}/${t(o.bNode)}.outputs:out>`)),o.aNode&&o.bNode&&o.cNode&&o.method=="clamp"&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:low.connect = ${Be}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.cNode.nodeType___needle)} inputs:high.connect = ${Be}/${e}/${t(o.cNode)}.outputs:out>`)),o.aNode&&o.bNode&&o.cNode&&o.method=="mix"&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:fg.connect = ${Be}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:bg.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`float inputs:mix.connect = ${Be}/${e}/${t(o.cNode)}.outputs:out>`));break;case"OperatorNode":let f="";switch(o.op){case"*":f="multiply";break;case"/":f="divide";break;case"+":f="add";break;case"-":f="subtract";break}if(d=f+"_"+c,o.aNode&&!o.bNode&&p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode){const v=r(o.aNode.nodeType___needle),C=r(o.bNode.nodeType___needle);(v==="color3f"&&C==="float"||C==="float"&&C==="color3f")&&(d=f+"_color3FA"),p.push(`${v} inputs:in1.connect = ${Be}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${C} inputs:in2.connect = ${Be}/${e}/${t(o.bNode)}.outputs:out>`)}break;case"TextureNode":o.uvNode?(d="tiledimage_"+c,p.push(`float2 inputs:texcoord.connect = ${Be}/${e}/${t(o.uvNode)}.outputs:out>`)):d="image_"+c;const g=o._value,y=Gy.includes(g.format),_=EA(g);p.push(`asset inputs:file = @textures/${_}.${y?"png":"jpg"}@`),i[_]={texture:g,scale:void 0};break;case"NormalMapNode":h="float3",d="normalmap",p.push(`${h} inputs:in.connect = ${Be}/${e}/${t(o.node)}.outputs:out>`);break;case"AttributeNode":d="geompropvalue_"+c,p.push('string inputs:geomprop = "st"');break;case"ShaderCallNodeInternal":d=o.shaderNodeLayoutName___needle+"_"+c,p.push(`${h} inputs:in.connect = ${Be}/${e}/${t(o.inputNodes[0])}.outputs:out>`);break;case"SplitNode":d="swizzle_"+s(o.node.nodeType___needle)+"_"+c,p.push(`${r(o.node.nodeType___needle)} inputs:in.connect = ${Be}/${e}/${t(o.node)}.outputs:out>`),p.push(`string inputs:channels = "${o.components}"`);break}return`
|
|
1076
|
+
${n}def Shader "${t(o)}"
|
|
1077
|
+
${n}{
|
|
1078
|
+
${n}uniform token info:id = "ND_${d}"
|
|
1079
|
+
${n}${h} outputs:out
|
|
1080
|
+
${n}${p.length>0?p.join(`
|
|
1081
|
+
`):""}
|
|
1082
|
+
${n}}
|
|
1083
|
+
`}function MA(o,e,t,i){let n="";for(const s of o)n+=kA(s,e,i,t);return n}function EA(o){return Vi(o.name)+"_"+(o.source?.id??o.id)}function Vi(o){return o=o.replace(/[^a-zA-Z0-9_]/g,""),o.match(/^[a-zA-Z_]/)||(o="_"+o),o}function g1(o){return o=o.replace('"','\\"'),o}function f1(o){if(o.length===0)return null;const e=o.map(t=>{const i=new Array;for(;t.parent;)i.unshift(t.parent),t=t.parent;return i});return e[0].findLast(t=>e.every(i=>i.includes(t)))||null}function y1(o){const e=f1(o),t=new Set;for(const i of o){let n=i.parent;for(;n&&n!==e;)o.includes(n)||t.add(n),n=n.parent}return t}const RA=new b,TA=new N,AA=new b(1,1,1);class ct{static USDObject_export_id=0;uuid;name;type;extraSchemas=[];displayName;visibility;getMatrix(){if(!this.transform)return new J;const{position:e,quaternion:t,scale:i}=this.transform,n=new J;return n.compose(e||RA,t||TA,i||AA),n}setMatrix(e){if(!e||!(e instanceof J)){this.transform=null;return}const t=new b,i=new N,n=new b;e.decompose(t,i,n),this.transform={position:t,quaternion:i,scale:n}}get matrix(){return this.getMatrix()}set matrix(e){this.setMatrix(e)}transform=null;_isDynamic;get isDynamic(){return this._isDynamic}set isDynamic(e){this._isDynamic=e}geometry;material;camera;parent;skinnedMesh;children=[];animations;_eventListeners;needsTranslate=!1;needsOrient=!1;needsScale=!1;static createEmptyParent(e){const t=new ct(Lo.generateUUID(),e.name+"_empty_"+ct.USDObject_export_id++,e.transform),i=e.parent;return i&&i.add(t),t.add(e),t.isDynamic=!0,e.transform=null,t}static createEmpty(){const e=new ct(Lo.generateUUID(),"Empty_"+ct.USDObject_export_id++);return e.isDynamic=!0,e}constructor(e,t,i=null,n=null,s=null,r=null,a=null,l=null){this.uuid=e,this.name=Vi(t),this.displayName=t,i?this.transform={position:i.position?.clone()||null,quaternion:i.quaternion?.clone()||null,scale:i.scale?.clone()||null}:this.transform=null,this.geometry=n,this.material=s,this.camera=r,this.parent=null,this.children=[],this._eventListeners={},this._isDynamic=!1,this.skinnedMesh=a,this.animations=l}is(e){return e?this.uuid===e.uuid:!1}isEmpty(){return!this.geometry}clone(){const e=new ct(Lo.generateUUID(),this.name,this.transform,this.geometry,this.material);return e.isDynamic=this.isDynamic,e}deepClone(){const e=this.clone();for(const t of this.children)t&&e.add(t.deepClone());return e}getPath(){let e=this.parent,t=this.name;for(;e;)t=(e.parent?e.name:e.name+"/Scenes/Scene")+"/"+t,e=e.parent;return"</"+t+">"}add(e){e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}addEventListener(e,t){this._eventListeners[e]||(this._eventListeners[e]=[]),this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}onSerialize(e,t){const i=this._eventListeners.serialize;i&&i.forEach(n=>n(e,t))}}class zy extends ct{stageLength;get isDocumentRoot(){return!0}get isDynamic(){return!1}constructor(){super(void 0,"StageRoot",null,null,null,null),this.children=[],this.stageLength=200}add(e){e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}traverse(e,t=null){if(t!==null?e(t):t=this,t.children)for(const i of t.children)this.traverse(e,i)}findById(e){let t=!1;function i(n){if(!t){if(n.uuid===e)return t=!0,n;if(n.children)for(const s of n.children){if(!s)continue;const r=i(s);if(r)return r}}}return i(this)}buildHeader(e){const t=e.extensions?.find(h=>h?.extensionName==="animation"),i=e.extensions?.find(h=>h?.extensionName==="Behaviour"),n=e.extensions?.find(h=>h?.extensionName==="Physics"),s=t?.getStartTimeCode()??0,r=t?.getEndTimeCode()??0;let a="";const l=t?.registeredClips;if(l)for(const h of l)a+=` # Animation: ${h.name}, start=${t.getStartTimeByClip(h)*60}, length=${h.duration*60}
|
|
1084
|
+
`;const c=a;return`#usda 1.0
|
|
1085
|
+
(
|
|
1086
|
+
customLayerData = {
|
|
1087
|
+
string creator = "Needle Engine ${gi}"
|
|
1088
|
+
dictionary Needle = {
|
|
1089
|
+
bool animations = ${t?1:0}
|
|
1090
|
+
bool interactive = ${i?1:0}
|
|
1091
|
+
bool physics = ${n?1:0}
|
|
1092
|
+
bool quickLookCompatible = ${e.quickLookCompatible?1:0}
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
defaultPrim = "${Vi(this.name)}"
|
|
1096
|
+
metersPerUnit = 1
|
|
1097
|
+
upAxis = "Y"
|
|
1098
|
+
startTimeCode = ${s}
|
|
1099
|
+
endTimeCode = ${r}
|
|
1100
|
+
timeCodesPerSecond = 60
|
|
1101
|
+
framesPerSecond = 60
|
|
1102
|
+
doc = """Generated by Needle Engine USDZ Exporter ${gi}"""
|
|
1103
|
+
${c}
|
|
1104
|
+
)
|
|
1105
|
+
`}}const Rl=`
|
|
1106
|
+
`,si="</StageRoot/Materials";class b1{str;indent;constructor(){this.str="",this.indent=0}clear(){this.str="",this.indent=0}beginBlock(e=void 0,t="{",i=!0){e!==void 0?(e=this.applyIndent(e),this.str+=e,i?(this.str+=Rl,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=Rl,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+Rl}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=Rl,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+Rl}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=Rl}toString(){return this.str}applyIndent(e){let t="";for(let i=0;i<this.indent;i++)t+=" ";return t+e}}class IA{root;exporter;extensions=[];quickLookCompatible;exportInvisible;materials;textures;files;document;output;animations;constructor(e,t,i){this.root=e||void 0,this.exporter=t,this.quickLookCompatible=i.quickLookCompatible,this.exportInvisible=i.exportInvisible,i.extensions&&(this.extensions=i.extensions),this.materials=new Map,this.textures={},this.files={},this.document=new zy,this.output="",this.animations=[]}makeNameSafe(e){return Vi(e)}}const _1=()=>({ar:{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}},quickLookCompatible:!1,extensions:[],maxTextureSize:4096,exportInvisible:!1});let v1=class{debug;pruneUnusedNodes;sceneAnchoringOptions=_1();extensions=[];keepObject;beforeWritingDocument;constructor(){this.debug=!1,this.pruneUnusedNodes=!0}async parse(o,e=_1()){e=Object.assign({},e),this.sceneAnchoringOptions=e;const t=new IA(o,this,e);this.extensions=t.extensions;const i=t.files,n="model.usda";i[n]=null,t.materials;const s=t.textures;le.report("export-usdz","Invoking onBeforeBuildDocument"),await Mp(t,"onBeforeBuildDocument"),le.report("export-usdz","Done onBeforeBuildDocument"),le.report("export-usdz","Reparent bones to common ancestor");const r=[],a=new Set;o?.traverse(f=>{if(!(!e.exportInvisible&&!f.visible)&&f instanceof Ss){const g=f.skeleton.bones,y=f1(g);if(y){const _={object:f,originalParent:f.parent,newParent:y};r.push(_),a.add(_.object.uuid),_.newParent&&a.add(_.newParent.uuid),_.originalParent&&a.add(_.originalParent.uuid)}}});for(const f of r){const{object:g,originalParent:y,newParent:_}=f;_.add(g)}le.report("export-usdz","Traversing hierarchy"),o&&w1(o,t.document,t,this.keepObject),le.report("export-usdz","Invoking onAfterBuildDocument"),await Mp(t,"onAfterBuildDocument");const l=t.extensions.find(f=>f.extensionName==="Behaviour")?.getAllTargetUuids()??new Set;if(this.pruneUnusedNodes){const f={allBehaviorTargets:l,debug:!1,boneReparentings:a,quickLookCompatible:t.quickLookCompatible};this.debug&&x1(t.document,"Hierarchy BEFORE pruning",f),S1(t.document,f),this.debug&&x1(t.document,"Hierarchy AFTER pruning")}else this.debug&&console.log("Pruning of empty nodes is disabled. This may result in a larger USDZ file.");le.report("export-usdz",{message:"Parsing document",autoStep:10}),await LA(t,e),le.report("export-usdz","Invoking onAfterSerialize"),await Mp(t,"onAfterSerialize");for(const f of r){const{object:g,originalParent:y,newParent:_}=f;y&&y.add(g)}t.exporter?.beforeWritingDocument?.();const c=t.document.buildHeader(t)+`
|
|
1107
|
+
`+t.output;this.debug&&console.debug(c),i[n]=Kb(c),t.output="",le.report("export-usdz",{message:"Exporting textures",autoStep:10}),le.start("export-usdz-textures",{parentScope:"export-usdz",logTimings:!1});const h=new _r({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}),d=Object.keys(s).length;le.report("export-usdz-textures",{totalSteps:d*3,currentStep:0});const p=async f=>{const g=s[f],y=g.texture,_=Gy.includes(y.format);let v={imageData:y.image};le.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const C=g.scale!==void 0&&g.scale.x!==1&&g.scale.y!==1&&g.scale.z!==1&&g.scale.w!==1;(y.isCompressedTexture||y.isRenderTargetTexture||C)&&(v=await P1(y,e.maxTextureSize,h,g.scale)),le.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const O=await jA(v.imageBitmap||v.imageData,e.maxTextureSize).catch(k=>{console.error("Error converting texture to canvas",y,k)});if(O){le.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const k=await O.convertToBlob({type:_?"image/png":"image/jpeg",quality:.95});i[`textures/${f}.${_?"png":"jpg"}`]=new Uint8Array(await k.arrayBuffer())}else console.warn("Can`t export texture: ",y)};for(const f in s)await p(f);h.dispose(),le.end("export-usdz-textures");let m=0;for(const f in i){const g=i[f],y=34+f.length;m+=y;const _=m&63;if(_!==4){const v=64-_,C=new Uint8Array(v);i[f]=[g,{extra:{12345:C}}]}m=g.length}return le.report("export-usdz","zip archive"),DP(i,{level:0})}};function w1(o,e,t,i){if(!t.exportInvisible&&!o.visible)return;let n,s,r;const a={position:o.position,quaternion:o.quaternion,scale:o.scale};if(o.position.x===0&&o.position.y===0&&o.position.z===0&&(a.position=null),o.quaternion.x===0&&o.quaternion.y===0&&o.quaternion.z===0&&o.quaternion.w===1&&(a.quaternion=null),o.scale.x===1&&o.scale.y===1&&o.scale.z===1&&(a.scale=null),(o instanceof H||o instanceof Ss)&&(s=o.geometry,r=o.material),i&&!i(o)&&(s=void 0,r=void 0),(o instanceof H||o instanceof Ss)&&r&&typeof r=="object"&&(r instanceof yt||r instanceof Ce||r.isMeshPhysicalNodeMaterial||r instanceof we&&r.type==="MeshLineMaterial")){const l=Tp(o),c=o instanceof Ss?o:null;n=new ct(o.uuid,l,a,s,r,void 0,c,o.animations)}else if(o instanceof de||o instanceof Ad){const l=Tp(o);n=new ct(o.uuid,l,a,void 0,void 0,o)}else{const l=Tp(o);n=new ct(o.uuid,l,a,void 0,void 0,void 0,void 0,o.animations)}if(n){if(n.displayName=o.userData?.name||o.name,n.visibility=o.visible?void 0:"invisible",e&&e.add(n),e=n,t.extensions)for(const l of t.extensions)l.onExportObject&&l.onExportObject.call(l,o,n,t)}else{const l=Tp(o),c=new ct(o.uuid,l,{position:o.position,quaternion:o.quaternion,scale:o.scale});e&&e.add(c),e=c}for(const l of o.children)w1(l,e,t,i)}function x1(o,e,...t){const i={};let n=0;function s(r,a){n++;let l=r.displayName||r.name;l+=" ("+r.uuid+")",(r.geometry||r.material||r.camera||r.skinnedMesh)&&(l+=" ("+(r.geometry?"geo, ":"")+(r.material?"mat, ":"")+(r.camera?"cam, ":"")+(r.skinnedMesh?"skin, ":"")+")"),a[l]={};const c={object:r};r.material&&(c.mat=!0),r.geometry&&(c.geo=!0),r.camera&&(c.cam=!0),r.skinnedMesh&&(c.skin=!0),a[l]._self=c;for(const h of r.children)h&&s(h,a[l])}s(o,i),console.log(e+" ("+n+" nodes)",i,...t)}function S1(o,e){let t=!0;const i=new Array,n=new Array;if(o.children.length===0)t=!0;else{const c=[...o.children];for(const h of c)if(h){const d=S1(h,e);e.debug&&(d?i.push(h):n.push(h)),t=t&&d}}const s=e.allBehaviorTargets.has(o.uuid),r=o.geometry||o.material||o.camera&&!e.quickLookCompatible||o.skinnedMesh||!1,a=e.boneReparentings.has(o.uuid),l=t&&!s&&!r&&!a;return l?(e.debug&&console.log("Pruned object:",(o.displayName||o.name)+" ("+o.uuid+")",{isVisible:r,isBehaviorSourceOrTarget:s,allChildsWerePruned:t,isBoneReparenting:a,object:o,prunedChilds:i,keptChilds:n}),o.parent?.remove(o)):e.debug&&console.log("Kept object:",(o.displayName||o.name)+" ("+o.uuid+")",{isVisible:r,isBehaviorSourceOrTarget:s,allChildsWerePruned:t,isBoneReparenting:a,object:o,prunedChilds:i,keptChilds:n}),l}async function LA(o,e){le.start("export-usdz-resources","export-usdz");const t=[];for(const c of o.document.children)C1(c,o,t);const i=t.length;for(let c=0;c<i;c++)le.report("export-usdz-resources",{totalSteps:i,currentStep:c}),await new Promise((h,d)=>{t[c](),h()});le.end("export-usdz-resources");const n=new b1,s=o.exporter.sceneAnchoringOptions.ar;n.beginBlock(`def Xform "${o.document.name}"`),n.beginBlock(`def Scope "Scenes" (
|
|
1108
|
+
kind = "sceneLibrary"
|
|
1109
|
+
)`),n.beginBlock('def Xform "Scene"',"(",!1),n.appendLine('apiSchemas = ["Preliminary_AnchoringAPI"]'),n.appendLine("customData = {"),n.appendLine(" bool preliminary_collidesWithEnvironment = 0"),n.appendLine(' string sceneName = "Scene"'),n.appendLine("}"),n.appendLine('sceneName = "Scene"'),n.closeBlock(")"),n.beginBlock(),n.appendLine(`token preliminary:anchoring:type = "${s.anchoring.type}"`),s.anchoring.type==="plane"&&n.appendLine(`token preliminary:planeAnchoring:alignment = "${s.planeAnchoring.alignment}"`),s.anchoring.type==="image"&&n.appendLine(`rel preliminary:imageAnchoring:referenceImage = </${o.document.name}/Scenes/Scene/AnchoringReferenceImage>`),n.appendLine();const r=c=>{if(!c)return 0;let h=1;for(const d of c.children)h+=r(d);return h},a=r(o.document);le.start("export-usdz-xforms","export-usdz"),le.report("export-usdz-xforms",{totalSteps:a,currentStep:1});for(const c of o.document.children)M1(c,n,o);le.end("export-usdz-xforms"),le.report("export-usdz","invoke onAfterHierarchy"),await Mp(o,"onAfterHierarchy",n),n.closeBlock(),n.closeBlock(),le.report("export-usdz","Building materials");const l=WA(o.materials,o.textures,e.quickLookCompatible);n.appendLine(l),n.closeBlock(),le.report("export-usdz","write to string"),o.output+=n.toString()}function C1(o,e,t){if(!o)return;const i=o.geometry,n=o.material;if(i)if(n&&("isMeshStandardMaterial"in n&&n.isMeshStandardMaterial||"isMeshBasicMaterial"in n&&n.isMeshBasicMaterial||n.type==="MeshLineMaterial")){const s="geometries/"+Wy(i,o.name)+".usda";if(!(s in e.files)){const r=()=>{const a=UA(i,o.skinnedMesh?.skeleton?.bones,e.quickLookCompatible);e.files[s]=FA(a)};t.push(r)}}else console.warn("NeedleUSDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",n?.name);n&&e.materials.get(n.uuid)===void 0&&(e.materials[n.uuid]=n);for(const s of o.children)C1(s,e,t)}async function Mp(o,e,t=null){if(o.extensions){for(const i of o.extensions)if(i&&typeof i[e]=="function"){const n=i[e].call(i,o,t);n instanceof Promise&&await n}}}let Ep=null,ri=null,Ny,Tl,Rp;async function P1(o,e=1/0,t=null,i=void 0){Ny||(Ny=new Pn(2,2,1,1)),Tl||(Tl=new Xn({uniforms:{blitTexture:new Ki(o),flipY:new Ki(!1),scale:new Ki(new ye(1,1,1,1))},vertexShader:`
|
|
1110
|
+
varying vec2 vUv;
|
|
1111
|
+
uniform bool flipY;
|
|
1112
|
+
void main(){
|
|
1113
|
+
vUv = uv;
|
|
1114
|
+
if (flipY)
|
|
1115
|
+
vUv.y = 1. - vUv.y;
|
|
1116
|
+
gl_Position = vec4(position.xy * 1.0,0.,.999999);
|
|
1117
|
+
}`,fragmentShader:`
|
|
1118
|
+
uniform sampler2D blitTexture;
|
|
1119
|
+
uniform vec4 scale;
|
|
1120
|
+
varying vec2 vUv;
|
|
1121
|
+
|
|
1122
|
+
void main(){
|
|
1123
|
+
gl_FragColor = vec4(vUv.xy, 0, 1);
|
|
1124
|
+
|
|
1125
|
+
#ifdef IS_SRGB
|
|
1126
|
+
gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
|
|
1127
|
+
#else
|
|
1128
|
+
gl_FragColor = texture2D( blitTexture, vUv);
|
|
1129
|
+
#endif
|
|
1130
|
+
|
|
1131
|
+
gl_FragColor.rgba *= scale.rgba;
|
|
1132
|
+
}`}));const n=Tl.uniforms;n.blitTexture.value=o,n.flipY.value=!1,n.scale.value=new ye(1,1,1,1),i!==void 0&&n.scale.value.copy(i),Tl.defines.IS_SRGB=o.colorSpace==Io,Tl.needsUpdate=!0,Rp||(Rp=new H(Ny,Tl),Rp.frustumCulled=!1);const s=new de,r=new Ti;r.add(Rp),t||(t=Ep=new _r({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const a=Math.min(o.image.width,e),l=Math.min(o.image.height,e);ri&&(ri.width!==a||ri.height!==l)&&(ri.dispose(),ri=null),ri||(ri=new Qn(a,l,{format:Dd,type:lP,minFilter:Vd,magFilter:Vd})),t.setRenderTarget(ri),t.setSize(a,l),t.clear(),t.render(r,s),Ep&&(Ep.dispose(),Ep=null);const c=new Uint8ClampedArray(ri.width*ri.height*4);t.readRenderTargetPixels(ri,0,0,ri.width,ri.height,c);const h=new ImageData(c,ri.width,ri.height,void 0),d=await createImageBitmap(h,{premultiplyAlpha:"none"});return{imageData:h,imageBitmap:d}}function DA(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}async function jA(o,e=4096){const t=e/Math.max(o.width,o.height),i=o.width*Math.min(1,t),n=o.height*Math.min(1,t),s=new OffscreenCanvas(i,n),r={premultiplyAlpha:"none"};o.width!==i&&(r.resizeWidth=i),o.height!==n&&(r.resizeHeight=n);const a=await createImageBitmap(o,r),l=s.getContext("bitmaprenderer");return l&&l.transferFromImageBitmap(a),s}async function O1(o,e=void 0,t=!1,i=4096){if(DA(o)){const n=i/Math.max(o.width,o.height),s=new OffscreenCanvas(o.width*Math.min(1,n),o.height*Math.min(1,n)),r=s.getContext("2d",{alpha:!0,premultipliedAlpha:!1});if(!r)throw new Error("Could not get canvas 2D context");if(t===!0&&(r.translate(0,s.height),r.scale(1,-1)),r.drawImage(o,0,0,s.width,s.height),e!==void 0){const a=e.x,l=e.y,c=e.z,h=e.w,d=r.getImageData(0,0,s.width,s.height),p=d.data;for(let m=0;m<p.length;m+=4)p[m+0]=p[m+0]*a,p[m+1]=p[m+1]*l,p[m+2]=p[m+2]*c,p[m+3]=p[m+3]*h;r.putImageData(d,0,0)}return s}else throw new Error("NeedleUSDZExporter: No valid image data found. Unable to process texture.")}const Ee=7;function BA(){return`#usda 1.0
|
|
1133
|
+
(
|
|
1134
|
+
customLayerData = {
|
|
1135
|
+
string creator = "Needle Engine USDZExporter"
|
|
1136
|
+
}
|
|
1137
|
+
metersPerUnit = 1
|
|
1138
|
+
upAxis = "Y"
|
|
1139
|
+
)
|
|
1140
|
+
`}function FA(o,e){let t=BA();return t+=o,Kb(t)}function Tp(o){return o.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+o.id}function k1(o){return Vi(o.name||"bone_"+o.uuid)}function Wy(o,e){return Vi(o.name||"Geometry")+"_"+o.id}function Ap(o){return Vi(o.name||"Material")+"_"+o.id}function Al(o,e){let t=k1(o),i=o.parent;for(;i&&i!==e;)t=k1(i)+"/"+t,i=i.parent;return t}function M1(o,e,t){if(o==null)return;le.report("export-usdz-xforms",{message:"buildXform "+o.displayName||o.name,autoStep:!0});const i=o.transform,n=o.geometry,s=o.material,r=o.camera,a=o.name;if(o.animations)for(const m of o.animations)t.animations.push(m);const l=n&&n.isBufferGeometry&&n.attributes.skinIndex!==void 0&&n.attributes.skinIndex.count>0,c=l?"SkelRoot":"Xform",h=new Array,d=s&&s instanceof Ce&&s.color&&s.color.r===1&&s.color.g===1&&s.color.b===1&&!s.map&&s.opacity===1&&n?.attributes.color;if(n?.attributes.color&&!d&&console.warn("NeedleUSDZExporter: Geometry has vertex colors. Vertex colors will only be shown in QuickLook for unlit materials with white color and no texture. Otherwise, they will be ignored.",o.displayName),e.appendLine(),n?(e.beginBlock(`def ${c} "${a}"`,"(",!1),t.quickLookCompatible&&s&&s.side===Ii&&!l?e.appendLine(`prepend references = @./geometries/${Wy(n)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${Wy(n)}.usda@</Geometry>`),d||h.push("MaterialBindingAPI"),l&&h.push("SkelBindingAPI")):r&&!t.quickLookCompatible?e.beginBlock(`def Camera "${a}"`,"(",!1):o.type!==void 0?e.beginBlock(`def ${o.type} "${a}"`):e.beginBlock(`def Xform "${a}"`,"(",!1),o.type===void 0&&(o.extraSchemas?.length&&h.push(...o.extraSchemas),h.length&&e.appendLine(`prepend apiSchemas = [${h.map(m=>`"${m}"`).join(", ")}]`)),o.displayName&&e.appendLine(`displayName = "${g1(o.displayName)}"`),(r||o.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),n&&s){if(!d){const m=Ap(s);e.appendLine(`rel material:binding = </StageRoot/Materials/${m}>`)}!t.quickLookCompatible&&s.side===Ii&&(e.beginBlock('over "Geometry" '),e.appendLine("uniform bool doubleSided = 1"),e.closeBlock())}let p=!1;if(l?(e.appendLine("rel skel:skeleton = <Rig>"),e.appendLine("rel skel:animationSource = <Rig/_anim>"),p=!1):o.type===void 0&&i&&(p=p||i.position!==null||i.quaternion!==null||i.scale!==null,i.position&&(o.needsTranslate=!0,e.appendLine(`double3 xformOp:translate = (${ce(i.position.x)}, ${ce(i.position.y)}, ${ce(i.position.z)})`)),i.quaternion&&(o.needsOrient=!0,e.appendLine(`quatf xformOp:orient = (${ce(i.quaternion.w)}, ${ce(i.quaternion.x)}, ${ce(i.quaternion.y)}, ${ce(i.quaternion.z)})`)),i.scale&&(o.needsScale=!0,e.appendLine(`double3 xformOp:scale = (${ce(i.scale.x)}, ${ce(i.scale.y)}, ${ce(i.scale.z)})`))),o.visibility!==void 0&&e.appendLine(`token visibility = "${o.visibility}"`),r&&!t.quickLookCompatible&&("isOrthographicCamera"in r&&r.isOrthographicCamera?(e.appendLine(`float2 clippingRange = (${r.near}, ${r.far})`),e.appendLine(`float horizontalAperture = ${((Math.abs(r.left)+Math.abs(r.right))*10).toPrecision(Ee)}`),e.appendLine(`float verticalAperture = ${((Math.abs(r.top)+Math.abs(r.bottom))*10).toPrecision(Ee)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in r&&r.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${r.near.toPrecision(Ee)}, ${r.far.toPrecision(Ee)})`),e.appendLine(`float focalLength = ${r.getFocalLength().toPrecision(Ee)}`),e.appendLine(`float focusDistance = ${r.focus.toPrecision(Ee)}`),e.appendLine(`float horizontalAperture = ${r.getFilmWidth().toPrecision(Ee)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${r.getFilmHeight().toPrecision(Ee)}`))),o.onSerialize&&o.onSerialize(e,t),o.type===void 0){const m=new Array;o.needsTranslate&&m.push('"xformOp:translate"'),o.needsOrient&&m.push('"xformOp:orient"'),o.needsScale&&m.push('"xformOp:scale"'),m.length&&e.appendLine(`uniform token[] xformOpOrder = [${m.join(", ")}]`)}if(o.children){e.appendLine();for(const m of o.children)M1(m,e,t)}e.closeBlock()}function ce(o){return Number.isInteger(o)?o.toString():o.toFixed(10)}function E1(o){const e=o.elements;return`( ${Ip(e,0)}, ${Ip(e,4)}, ${Ip(e,8)}, ${Ip(e,12)} )`}function Ip(o,e){return`(${ce(o[e+0])}, ${ce(o[e+1])}, ${ce(o[e+2])}, ${ce(o[e+3])})`}function UA(o,e=[],t=!0){return`
|
|
1141
|
+
def "Geometry"
|
|
1142
|
+
${zA(o,e,t)}
|
|
1143
|
+
`}function zA(o,e=[],t=!0){const i="Geometry",n=o.attributes,s=n.position.count,r=e&&e.length>0,a=[],l=[];let c=new Array,h=n.skinIndex;if(r){const p=[];for(const y of e)a.push({bone:y,index:e.indexOf(y)}),p.push(y.uuid);let m=1e4;for(;p.length<e.length&&m-- >0;)for(const y of a){const _=y.bone.children;for(const v of _)p.indexOf(v.uuid)===-1&&e.indexOf(v)!==-1&&(a.push({bone:v,index:e.indexOf(v)}),p.push(v.uuid))}m<=0&&console.error("Failed to sort bones in skinned mesh",a,e,p);for(const y of y1(e))a.push({bone:y,index:a.length});const f=a[0].bone.parent;a.sort((y,_)=>Al(y.bone,f)>Al(_.bone,f)?1:-1),a.map(y=>'"'+Al(y.bone,f)+'"').join(", ");for(const y in a)l[a[y].index]=parseInt(y);const g=n.skinIndex;c=new Array;for(let y=0;y<g.count;y++){const _=g.getX(y),v=g.getY(y),C=g.getZ(y),O=g.getW(y);c.push(l[_],l[v],l[C],l[O])}h=new tt(new Uint16Array(c),4)}const d=n.skinWeight&&n.skinIndex;return`
|
|
1144
|
+
{
|
|
1145
|
+
def Mesh "${i}" ${d?`(
|
|
1146
|
+
prepend apiSchemas = ["SkelBindingAPI"]
|
|
1147
|
+
)`:""}
|
|
1148
|
+
{
|
|
1149
|
+
int[] faceVertexCounts = [${Vy(o)}]
|
|
1150
|
+
int[] faceVertexIndices = [${$y(o)}]
|
|
1151
|
+
${n.normal||t?`normal3f[] normals = [${Lp(n.normal,s)}] (
|
|
1152
|
+
interpolation = "vertex"
|
|
1153
|
+
)`:""}
|
|
1154
|
+
point3f[] points = [${Lp(n.position,s)}]
|
|
1155
|
+
${n.uv?`texCoord2f[] primvars:st = [${T1(n.uv,s,!0)}] (
|
|
1156
|
+
interpolation = "vertex"
|
|
1157
|
+
)`:""}
|
|
1158
|
+
${n.uv1?Hy("st1",n.uv1):""}
|
|
1159
|
+
${n.uv2?Hy("st2",n.uv2):""}
|
|
1160
|
+
${n.uv3?Hy("st3",n.uv3):""}
|
|
1161
|
+
${d?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
|
|
1162
|
+
elementSize = 1
|
|
1163
|
+
interpolation = "constant"
|
|
1164
|
+
)`:""}
|
|
1165
|
+
${n.skinIndex?`int[] primvars:skel:jointIndices = [${R1(h,!0)}] (
|
|
1166
|
+
elementSize = 4
|
|
1167
|
+
interpolation = "vertex"
|
|
1168
|
+
)`:""}
|
|
1169
|
+
${n.skinWeight?`float[] primvars:skel:jointWeights = [${R1(n.skinWeight)}] (
|
|
1170
|
+
elementSize = 4
|
|
1171
|
+
interpolation = "vertex"
|
|
1172
|
+
)`:""}
|
|
1173
|
+
${n.color?`color3f[] primvars:displayColor = [${Lp(n.color,s)}] (
|
|
1174
|
+
interpolation = "vertex"
|
|
1175
|
+
)`:""}
|
|
1176
|
+
uniform token subdivisionScheme = "none"
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
${t?`
|
|
1180
|
+
# This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
|
|
1181
|
+
# geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
|
|
1182
|
+
def "${i}_doubleSided" (
|
|
1183
|
+
prepend references = </Geometry>
|
|
1184
|
+
)
|
|
1185
|
+
{
|
|
1186
|
+
over "Geometry"
|
|
1187
|
+
{
|
|
1188
|
+
int[] faceVertexCounts = [${Vy(o)+", "+Vy(o)}]
|
|
1189
|
+
int[] faceVertexIndices = [${$y(o)+", "+$y(o,!0)}]
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
`:""}
|
|
1193
|
+
`}function Vy(o){const e=o.index!==null?o.index.count:o.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function $y(o,e=!1){const t=o.index,i=[];if(t!==null)for(let n=0;n<t.count;n++){let s=n;e&&(s=n%3===0?n+2:n%3===2?n-2:n),i.push(t.getX(s))}else{const n=o.attributes.position.count;for(let s=0;s<n;s++){let r=s;e&&(r=s%3===0?s+2:s%3===2?s-2:s),i.push(r)}}return i.join(", ")}function Hy(o,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${o} = [${T1(e,t,!0)}] (
|
|
1194
|
+
interpolation = "vertex"
|
|
1195
|
+
)`;case 3:return`texCoord3f[] primvars:${o} = [${Lp(e,t)}] (
|
|
1196
|
+
interpolation = "vertex"
|
|
1197
|
+
)`;case 4:return`double4[] primvars:${o} = [${NA(e,t)}] (
|
|
1198
|
+
interpolation = "vertex"
|
|
1199
|
+
)`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+o+"."),""}}function Lp(o,e){if(o===void 0)return console.warn("USDZExporter: A mesh attribute is missing and will be set with placeholder data. The result may look incorrect."),Array(e).fill("(0, 0, 1)").join(", ");const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i);t.push(`(${n.toPrecision(Ee)}, ${s.toPrecision(Ee)}, ${r.toPrecision(Ee)})`)}return t.join(", ")}function NA(o,e){if(o===void 0)return console.warn("USDZExporter: Attribute is missing. Results may be undefined."),Array(e).fill("(0, 0, 0, 0)").join(", ");const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i)||0,a=o.getW(i)||0;t.push(`(${n.toPrecision(Ee)}, ${s.toPrecision(Ee)}, ${r.toPrecision(Ee)}, ${a.toPrecision(Ee)})`)}return t.join(", ")}function R1(o,e=!1){const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i),a=o.getW(i);t.push(`${e?n:n.toPrecision(Ee)}`),t.push(`${e?s:s.toPrecision(Ee)}`),t.push(`${e?r:r.toPrecision(Ee)}`),t.push(`${e?a:a.toPrecision(Ee)}`)}return t.join(", ")}function T1(o,e,t=!1){if(o===void 0)return console.warn("USDZExporter: UVs missing."),Array(e).fill("(0, 0)").join(", ");const i=[];for(let n=0;n<o.count;n++){const s=o.getX(n);let r=o.getY(n);t&&(r=1-r),i.push(`(${s.toPrecision(Ee)}, ${r.toPrecision(Ee)})`)}return i.join(", ")}function WA(o,e,t=!1){const i=[];for(const n in o){const s=o[n];i.push(VA(s,e,t))}return`
|
|
1200
|
+
def "Materials"
|
|
1201
|
+
{
|
|
1202
|
+
${i.join("")}
|
|
1203
|
+
}`}function dn(o){return Vi(o.name)+"_"+(o.source?.id??o.id)}function Vs(o,e,t,i,n,s,r=void 0,a=void 0){const l=dn(o),c=l+(a!==void 0&&a!==1?"_"+a:""),h=t&&a!==void 0&&a!==1,d=h?new ye(1,1,1,a):void 0;a===void 0&&(a=1),h&&(a=1),d&&d.w<=.05&&(d.w=.05),i[c]={texture:o,scale:d};const p=o.channel>0?"st"+o.channel:"st";s.add(o.channel);const m=Gy.includes(o.format),f={1e3:"repeat",1001:"clamp",1002:"mirror"},g=o.repeat.clone(),y=o.offset.clone(),_=o.rotation,v=Math.sin(_),C=Math.cos(_);y.y=1-y.y-g.y,t?(g.x===0&&(g.x=1e-4),g.y===0&&(g.y=1e-4),y.x=y.x/g.x,y.y=y.y/g.y,y.x+=v/g.x,y.y+=C-1):(y.x+=v*g.x,y.y+=(1-C)*g.y);const O=Ap(n),k=g.x!=1||g.y!=1||y.x!=0||y.y!=0||_!=0,j=`${si}/${O}/${"uvReader_"+p}.outputs:result>`,L=`${si}/${O}/Transform2d_${e}.outputs:result>`,V=e!=="normal"&&r&&(r.r!==1||r.g!==1||r.b!==1||a!==1)||!1,W=e==="normal",G=n instanceof yt&&n.normalScale?n.normalScale.x*2:2,X=G.toFixed(Ee),R=(-1*(G/2)).toFixed(Ee),$=(1-G).toFixed(Ee);return`
|
|
1204
|
+
${k?`def Shader "Transform2d_${e}" (
|
|
1205
|
+
sdrMetadata = {
|
|
1206
|
+
string role = "math"
|
|
1207
|
+
}
|
|
1208
|
+
)
|
|
1209
|
+
{
|
|
1210
|
+
uniform token info:id = "UsdTransform2d"
|
|
1211
|
+
float2 inputs:in.connect = ${j}
|
|
1212
|
+
float2 inputs:scale = ${I1(g)}
|
|
1213
|
+
float2 inputs:translation = ${I1(y)}
|
|
1214
|
+
float inputs:rotation = ${(_/Math.PI*180).toFixed(Ee)}
|
|
1215
|
+
float2 outputs:result
|
|
1216
|
+
}
|
|
1217
|
+
`:""}
|
|
1218
|
+
def Shader "${l}_${e}"
|
|
1219
|
+
{
|
|
1220
|
+
uniform token info:id = "UsdUVTexture"
|
|
1221
|
+
asset inputs:file = @textures/${c}.${m?"png":"jpg"}@
|
|
1222
|
+
token inputs:sourceColorSpace = "${o.colorSpace==="srgb"?"sRGB":"raw"}"
|
|
1223
|
+
float2 inputs:st.connect = ${k?L:j}
|
|
1224
|
+
${V?`
|
|
1225
|
+
float4 inputs:scale = (${r?r.r+", "+r.g+", "+r.b:"1, 1, 1"}, ${a})
|
|
1226
|
+
`:""}
|
|
1227
|
+
${W?`
|
|
1228
|
+
float4 inputs:scale = (${X}, ${X}, ${X}, 1)
|
|
1229
|
+
float4 inputs:bias = (${R}, ${R}, ${$}, 0)
|
|
1230
|
+
`:""}
|
|
1231
|
+
token inputs:wrapS = "${f[o.wrapS]}"
|
|
1232
|
+
token inputs:wrapT = "${f[o.wrapT]}"
|
|
1233
|
+
float outputs:r
|
|
1234
|
+
float outputs:g
|
|
1235
|
+
float outputs:b
|
|
1236
|
+
float3 outputs:rgb
|
|
1237
|
+
${n.transparent||n.alphaTest>0?"float outputs:a":""}
|
|
1238
|
+
}`}function VA(o,e,t=!1){const i=Ap(o);if(o.colorWrite===!1||o.userData?.isShadowCatcherMaterial||o.userData?.isLightBlendMaterial){const d=o.userData.isLightBlendMaterial||o.userData.isShadowCatcherMaterial?"ND_realitykit_shadowreceiver_surfaceshader":"ND_realitykit_occlusion_surfaceshader";return`
|
|
1239
|
+
|
|
1240
|
+
def Material "${i}" ${o.name?`(
|
|
1241
|
+
displayName = "${o.name}"
|
|
1242
|
+
)`:""}
|
|
1243
|
+
{
|
|
1244
|
+
token outputs:mtlx:surface.connect = ${si}/${i}/Occlusion.outputs:out>
|
|
1245
|
+
|
|
1246
|
+
def Shader "Occlusion"
|
|
1247
|
+
{
|
|
1248
|
+
uniform token info:id = "${d}"
|
|
1249
|
+
token outputs:out
|
|
1250
|
+
}
|
|
1251
|
+
}`}const n=" ",s=[],r=[],a=new Set;if(o.isMeshPhysicalNodeMaterial===!0)return PA(o,i,e);let l=o.transparent||o.alphaTest?o.opacity:1,c=!1,h=!1;if(o instanceof Vb&&o.transmission!==void 0&&(l*=1-o.transmission*(1-o.roughness*.5)),o.map?(s.push(`${n}color3f inputs:diffuseColor.connect = ${si}/${i}/${dn(o.map)}_diffuse.outputs:rgb>`),o instanceof Ce&&o.transparent&&o.alphaTest==0&&t?(s.push(`${n}float inputs:opacity.connect = ${si}/${i}/${dn(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${1e-10}`),h=!0):o.transparent?(s.push(`${n}float inputs:opacity.connect = ${si}/${i}/${dn(o.map)}_diffuse.outputs:a>`),c=!0):o.alphaTest>0&&(s.push(`${n}float inputs:opacity.connect = ${si}/${i}/${dn(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0),r.push(Vs(o.map,"diffuse",t,e,o,a,o.color,l))):s.push(`${n}color3f inputs:diffuseColor = ${A1(o.color)}`),o.alphaHash&&t&&(h?console.warn("Opacity threshold for "+o.name+" was already connected. Skipping alphaHash opacity threshold."):(s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),h=!0)),o.aoMap&&(s.push(`${n}float inputs:occlusion.connect = ${si}/${i}/${dn(o.aoMap)}_occlusion.outputs:r>`),r.push(Vs(o.aoMap,"occlusion",t,e,o,a))),o.alphaMap?(s.push(`${n}float inputs:opacity.connect = ${si}/${i}/${dn(o.alphaMap)}_opacity.outputs:r>`),s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),c=!0,h=!0,r.push(Vs(o.alphaMap,"opacity",t,e,o,a,new oe(1,1,1),l))):(c?console.warn("Opacity for "+o.name+" was already connected. Skipping default opacity."):(s.push(`${n}float inputs:opacity = ${l}`),c=!0),o.alphaTest>0&&(h?console.warn("Opacity threshold for "+o.name+" was already connected. Skipping default opacity threshold."):(s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0))),o instanceof yt){if(o.emissiveMap){s.push(`${n}color3f inputs:emissiveColor.connect = ${si}/${i}/${dn(o.emissiveMap)}_emissive.outputs:rgb>`);const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),r.push(Vs(o.emissiveMap,"emissive",t,e,o,a,d))}else if(o.emissive?.getHex()>0){const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),s.push(`${n}color3f inputs:emissiveColor = ${A1(d)}`)}o.normalMap&&(s.push(`${n}normal3f inputs:normal.connect = ${si}/${i}/${dn(o.normalMap)}_normal.outputs:rgb>`),r.push(Vs(o.normalMap,"normal",t,e,o,a))),o.roughnessMap&&o.roughness===1?(s.push(`${n}float inputs:roughness.connect = ${si}/${i}/${dn(o.roughnessMap)}_roughness.outputs:g>`),r.push(Vs(o.roughnessMap,"roughness",t,e,o,a))):s.push(`${n}float inputs:roughness = ${o.roughness!==void 0?o.roughness:1}`),o.metalnessMap&&o.metalness===1?(s.push(`${n}float inputs:metallic.connect = ${si}/${i}/${dn(o.metalnessMap)}_metallic.outputs:b>`),r.push(Vs(o.metalnessMap,"metallic",t,e,o,a))):s.push(`${n}float inputs:metallic = ${o.metalness!==void 0?o.metalness:0}`)}return o instanceof Vb&&(s.push(`${n}float inputs:clearcoat = ${o.clearcoat}`),s.push(`${n}float inputs:clearcoatRoughness = ${o.clearcoatRoughness}`),s.push(`${n}float inputs:ior = ${o.ior}`),!o.transparent&&!(o.alphaTest>0)&&o.transmissionMap&&(s.push(`${n}float inputs:opacity.connect = ${si}/${i}/${dn(o.transmissionMap)}_transmission.outputs:r>`),r.push(Vs(o.transmissionMap,"transmission",t,e,o,a)))),a.size>2?console.warn("USDZExporter: Material "+o.name+" uses more than 2 UV channels. Currently, only UV0 and UV1 are supported."):a.size===2&&(!a.has(0)||!a.has(1))&&console.warn("USDZExporter: Material "+o.name+" uses UV channels other than 0 and 1. Currently, only UV0 and UV1 are supported."),`
|
|
1252
|
+
|
|
1253
|
+
def Material "${i}" ${o.name?`(
|
|
1254
|
+
displayName = "${g1(o.name)}"
|
|
1255
|
+
)`:""}
|
|
1256
|
+
{
|
|
1257
|
+
token outputs:surface.connect = ${si}/${i}/PreviewSurface.outputs:surface>
|
|
1258
|
+
|
|
1259
|
+
def Shader "PreviewSurface"
|
|
1260
|
+
{
|
|
1261
|
+
uniform token info:id = "UsdPreviewSurface"
|
|
1262
|
+
${s.join(`
|
|
1263
|
+
`)}
|
|
1264
|
+
int inputs:useSpecularWorkflow = ${o instanceof Ce?"1":"0"}
|
|
1265
|
+
token outputs:surface
|
|
1266
|
+
}
|
|
1267
|
+
${r.length>0?`
|
|
1268
|
+
${a.has(0)?`
|
|
1269
|
+
def Shader "uvReader_st"
|
|
1270
|
+
{
|
|
1271
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1272
|
+
string inputs:varname = "st"
|
|
1273
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1274
|
+
float2 outputs:result
|
|
1275
|
+
}
|
|
1276
|
+
`:""}
|
|
1277
|
+
${a.has(1)?`
|
|
1278
|
+
def Shader "uvReader_st1"
|
|
1279
|
+
{
|
|
1280
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1281
|
+
string inputs:varname = "st1"
|
|
1282
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1283
|
+
float2 outputs:result
|
|
1284
|
+
}
|
|
1285
|
+
`:""}
|
|
1286
|
+
${r.join(`
|
|
1287
|
+
`)}`:""}
|
|
1288
|
+
}`}function A1(o){return`(${o.r}, ${o.g}, ${o.b})`}function I1(o){return`(${o.x}, ${o.y})`}const Gy=[1023,33777,33778,33779,35842,35843,37496,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,36492];w("debugusdz");class Ut{static global_id=0;id;trigger;action;exclusive=!1;makeExclusive(e){return this.exclusive=e,this}constructor(e,t,i){this.id="Behavior_"+Vi(e)+"_"+Ut.global_id++,this.trigger=t,this.action=i}writeTo(e,t,i){if(!this.trigger||!this.action)return;i.beginBlock(`def Preliminary_Behavior "${this.id}"`);let n="";if(Array.isArray(this.trigger)){n="[";for(let s=0;s<this.trigger.length;s++){const r=this.trigger[s];n+="<"+r.id+">",s+1<this.trigger.length&&(n+=", ")}n+="]"}else n=`<${this.trigger.id}>`;if(i.appendLine(`rel triggers = ${n}`),i.appendLine(`rel actions = <${this.action.id}>`),i.appendLine(`uniform bool exclusive = ${this.exclusive?1:0}`),i.appendLine(),Array.isArray(this.trigger))for(const s of this.trigger)s.writeTo(t,i),i.appendLine();else this.trigger.writeTo(t,i);i.appendLine(),this.action.writeTo(t,i),i.closeBlock()}}const Il=new Set;function qy(o,e){let t="";if(Array.isArray(o)){Il.clear();let i="[ ";for(let n=0;n<o.length;n++){let s=o[n];if(!s){console.warn("Invalid target object in behavior",o+". Is the object exported?");continue}if(typeof s=="string"){if(Il.has(s))continue;i+=s,Il.add(s)}else if(typeof s=="object"){if(s.isObject3D&&(s=e.findById(s.uuid),!s)){console.warn("Invalid target object in behavior",o+". Is the object exported?");continue}const r=s.getPath?.call(s);if(Il.has(r))continue;i+=r,Il.add(r)}n+1<o.length&&(i+=", ")}i+=" ]",t=i,Il.clear()}else if(typeof o=="object"){const i=o;if(i.isObject3D&&(o=e.findById(i.uuid)),!o)throw console.error("Invalid target object in behavior, the target object is likely missing from USDZ export. Is the object exported?",i),new Error(`Invalid target object in behavior, the target object is likely missing from USDZ export. Please report a bug. uuid: ${i.uuid}.`);t=o.getPath?.call(o)}return t}class pr{static global_id=0;id;targetId;tokenId;type;distance;constructor(e,t){e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+pr.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=qy(this.targetId,e)),t.appendLine("rel affectedObjects = "+this.targetId)),this.tokenId&&t.appendLine(`token info:id = "${this.tokenId}"`),this.type&&t.appendLine(`token type = "${this.type}"`),typeof this.distance=="number"&&t.appendLine(`double distance = ${this.distance}`),t.closeBlock()}}function L1(o,e={direct:!0,indirect:!0}){const t=ct.createEmpty();t.name="InputTarget_"+t.name,t.displayName=void 0,t.type="RealityKitComponent",t.onSerialize=i=>{i.appendLine("bool allowsDirectInput = "+(e.direct?1:0)),i.appendLine("bool allowsIndirectInput = "+(e.indirect?1:0)),i.appendLine('uniform token info:id = "RealityKit.InputTarget"')},o.add(t)}class qt{static __sceneStartTrigger;static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new pr(void 0,"SceneStart");return e.tokenId="SceneTransition",e.type="enter",this.__sceneStartTrigger=e,e}static tapTrigger(e,t={direct:!0,indirect:!0}){const i=new pr(e);if(Array.isArray(e)&&e.length>1)for(const n of e)n instanceof ct&&L1(n,t);else e instanceof ct&&L1(e,t);return i.tokenId="TapGesture",i}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const i=new pr(e);return i.tokenId="ProximityToCamera",i.distance=t,i}}class sa{static global_id=0;static getId(){return this.global_id++}id;actions;loops=0;performCount=1;type="serial";multiplePerformOperation=void 0;constructor(e,t){this.id=e,this.actions=t}addAction(e){return this.actions.push(e),this}makeParallel(){return this.type="parallel",this}makeSequence(){return this.type="serial",this}makeLooping(){return this.loops=1,this.performCount=0,this}makeRepeat(e){return this.performCount=e,this}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),t.beginArray("rel actions");for(const i of this.actions){if(!i)continue;const n=i===this.actions[this.actions.length-1];t.appendLine("<"+i.id+">"+(n?"":", "))}t.closeArray(),t.appendLine(),t.appendLine('token info:id = "Group"'),t.appendLine(`bool loops = ${this.loops}`),t.appendLine(`int performCount = ${this.loops>0?0:Math.max(0,this.performCount)}`),t.appendLine(`token type = "${this.type}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),t.appendLine();for(const i of this.actions)i&&(i.writeTo(e,t),t.appendLine());t.closeBlock()}}class Ri{static global_id=0;id;tokenId;affectedObjects;easeType;motionType=void 0;duration;moveDistance;style;type;front;up;start;animationSpeed;reversed;pingPong;xFormTarget;audio;gain;auralMode;multiplePerformOperation;velocity;comment;animationName;clone(){const e=new Ri,t=e.id;return Object.assign(e,this),e.id=t,e}constructor(e,t){e&&(this.affectedObjects=e),t?this.id=t:this.id="Action",this.id+="_"+Ri.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),this.comment&&t.appendLine(`# ${this.comment}`),this.affectedObjects&&(typeof this.affectedObjects!="string"&&(this.affectedObjects=qy(this.affectedObjects,e)),t.appendLine("rel affectedObjects = "+this.affectedObjects)),typeof this.duration=="number"&&(typeof this.animationSpeed=="number"&&this.animationSpeed!==1?t.appendLine(`double duration = ${this.duration/this.animationSpeed} `):t.appendLine(`double duration = ${this.duration} `)),this.easeType&&t.appendLine(`token easeType = "${this.easeType}"`),this.tokenId&&t.appendLine(`token info:id = "${this.tokenId}"`),this.tokenId==="ChangeScene"&&t.appendLine("rel scene = </StageRoot/Scenes/Scene>"),this.motionType!==void 0&&t.appendLine(`token motionType = "${this.motionType}"`),typeof this.moveDistance=="number"&&t.appendLine(`double moveDistance = ${this.moveDistance} `),this.style&&t.appendLine(`token style = "${this.style}"`),this.type&&t.appendLine(`token type = "${this.type}"`),this.front&&t.appendLine(`vector3d front = (${this.front.x}, ${this.front.y}, ${this.front.z})`),this.up&&t.appendLine(`vector3d upVector = (${this.up.x}, ${this.up.y}, ${this.up.z})`),typeof this.start=="number"&&t.appendLine(`double start = ${this.start} `),typeof this.animationSpeed=="number"&&t.appendLine(`double animationSpeed = ${this.animationSpeed.toFixed(2)} `),typeof this.reversed=="boolean"&&t.appendLine(`bool reversed = ${this.reversed}`),typeof this.pingPong=="boolean"&&t.appendLine(`bool reverses = ${this.pingPong}`),this.xFormTarget&&(typeof this.xFormTarget!="string"&&(this.xFormTarget=qy(this.xFormTarget,e)),t.appendLine(`rel xformTarget = ${this.xFormTarget}`)),typeof this.audio=="string"&&t.appendLine(`asset audio = @${this.audio}@`),typeof this.gain=="number"&&t.appendLine(`double gain = ${this.gain}`),typeof this.auralMode=="string"&&t.appendLine(`token auralMode = "${this.auralMode}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),typeof this.velocity=="object"&&t.appendLine(`vector3d velocity = (${this.velocity.x}, ${this.velocity.y}, ${this.velocity.z})`),t.closeBlock()}}class Sn{x=0;y=0;z=0;constructor(e,t,i){this.x=e,this.y=t,this.z=i}static get up(){return new Sn(0,1,0)}static get right(){return new Sn(1,0,0)}static get forward(){return new Sn(0,0,1)}static get back(){return new Sn(0,0,-1)}static get zero(){return new Sn(0,0,0)}}class fe{static sequence(...e){return new sa("Group_"+sa.getId(),e).makeSequence()}static parallel(...e){return new sa("Group_"+sa.getId(),e).makeParallel()}static fadeAction(e,t,i){const n=new Ri(e);return n.tokenId="Visibility",n.type=i?"show":"hide",n.duration=t,n.style="basic",n.motionType="none",n.moveDistance=0,n.easeType="none",n}static startAnimationAction(e,t,i=!1,n=!1){const s=new Ri(e);s.tokenId="StartAnimation";const r=t.start,a=t.duration,l=t.speed,c=t.clipName;if(s.comment=`Animation: ${c}, start=${r*60}, length=${a*60}, end=${(r+a)*60}`,s.animationName=c,s.start=r,s.duration=a,s.animationSpeed=l,s.reversed=i,s.pingPong=n,s.multiplePerformOperation="allow",i&&(s.start-=a),n){s.pingPong=!1;const h=s.clone();return h.reversed=!i,h.start=s.start,h.reversed&&(h.start-=a),fe.sequence(s,h)}return s}static waitAction(e){const t=new Ri;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,i,n){const s=new Ri(e);return s.tokenId="LookAtCamera",s.duration=t===void 0?9999999999999:t,s.front=i??Sn.forward,s.up=n??Sn.up,s}static emphasize(e,t,i="bounce",n=1,s="basic"){const r=new Ri(e);return r.tokenId="Emphasize",r.duration=t,r.style=s??"basic",r.motionType=i,r.moveDistance=n,r}static transformAction(e,t,i,n,s="inout"){const r=new Ri(e);return r.tokenId="Transform",r.duration=i,r.duration=Math.max(1e-6,i),r.type=n,r.easeType=i>0?s:"none",Array.isArray(t)&&console.error("Transform target must not be an array",t),r.xFormTarget=t,r}static playAudioAction(e,t,i="play",n=1,s="spatial"){const r=new Ri(e);return r.tokenId="Audio",r.type=i,r.audio=t,r.gain=n,r.auralMode=s,r.multiplePerformOperation="allow",r}static impulseAction(e,t){const i=new Ri(e);return i.tokenId="Impulse",i.velocity=t,i}}class $A{get id(){return this.object.uuid}object;model;constructor(e){this.object=e}apply(e){if(!this.model&&(this.model=e.findById(this.object.uuid),!this.model)){console.error("could not find model with id "+this.object.uuid);return}this.onApply(e)}}class Xy extends $A{constructor(e,t,i,n){super(e),this.matrix=t,this.material=i,this.geometry=n}matrix;material;geometry;onApply(e){const t=this.model;if(!t)return;t.parent?.isDynamic||ct.createEmptyParent(t);const i=t.clone();this.matrix&&i.setMatrix(this.matrix),this.material&&(i.material=this.material),this.geometry&&(i.geometry=this.geometry),t.parent?.add(i)}_enableAction;_disableAction;enable(){return this._enableAction?this._enableAction:(this._enableAction=fe.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=fe.fadeAction(this.object,0,!1),this._disableAction)}}class D1{actions;sortedActions;constructor(e){this.actions=[...e]}organize(){this.sortedActions={};for(const e of this.actions){const t=e.id;this.sortedActions[t]||(this.sortedActions[t]=[]),this.sortedActions[t].push(e)}}getActions(e){return this.sortedActions||this.organize(),this.sortedActions[e.uuid]}}const fo=w("debugusdzanimation"),Qy=w("debugusdzanimationserialization");class br{_start;get start(){return this._start===void 0&&(this._start=this.ext.getStartTimeByClip(this.clip)),this._start}get duration(){return this.clip?.duration??Ve.restPoseClipDuration}get nearestAnimatedRoot(){return this._nearestAnimatedRoot}get clipName(){return this.clip?.name??"rest"}ext;root;_nearestAnimatedRoot=void 0;clip;speed;constructor(e,t,i){this.ext=e,this.root=t,this.clip=i,this._nearestAnimatedRoot=this.getNearestAnimatedRoot()}static isDescendantOf(e,t){let i=t;if(!i||!e)return!1;for(;i;){if(!i)return!1;if(i===e)return!0;i=i.parent}return!1}getNearestAnimatedRoot(){let e;try{for(const t of this.clip?.tracks??[]){const i=La.parseTrackName(t.name);let n=La.findNode(this.root,i.nodeName);if(n)if(!e)e=n;else{if(n===e||br.isDescendantOf(e,n))continue;if(!br.isDescendantOf(n,e)){for(;!br.isDescendantOf(n,e)&&n.parent;)n=n.parent;br.isDescendantOf(n,e)||console.error("USDZExporter: Animation clip targets multiple roots that are not parent/child. Please report a bug",this.root,this.clip,e,n)}e=n}}}catch(t){console.error("USDZExporter: Exception when trying to find nearest animated root. Please report a bug",t),e=void 0}return e}}class Ve{clip;pos;rot;scale;root;target;duration=0;useRootMotion=!1;static frameRate=60;static animationDurationPadding=6/60;static restPoseClipDuration=6/60;constructor(e,t,i){if(this.root=e,this.target=t,this.clip=i,i?this.duration=i.duration:this.duration=Ve.restPoseClipDuration,i&&i.tracks){const s=Math.max(...i.tracks.map(r=>r.times[r.times.length-1]));s!==this.duration&&(console.warn("USDZExporter: Animation clip duration does not match the maximum time value in the tracks.",i,s,this.duration),this.duration=s)}const n=x.getComponent(e,wt);n&&(this.useRootMotion=n.applyRootMotion)}addTrack(e){if(!this.clip){console.error("This is a rest clip but you're trying to add tracks to it \u2013 this is likely a bug");return}e.name.endsWith("position")?this.pos=e:e.name.endsWith("quaternion")?this.rot=e:e.name.endsWith("scale")?this.scale=e:(e.name.endsWith("activeSelf")?console.warn("[USDZ] Animation of enabled/disabled state is not supported for USDZ export and will NOT be exported: "+e.name+" on "+(this.root?.name??this.target.name)+". Animate scale 0/1 instead."):console.warn("[USDZ] Animation track type not supported for USDZ export and will NOT be exported: "+e.name+" on "+(this.root?.name??this.target.name)+". Only .position, .rotation, .scale are supported."),A()&&be("[USDZ] Some animations can't be exported. See console for details."))}getFrames(){return this.clip?Math.max(this.pos?.times?.length??0,this.rot?.times?.length??0,this.scale?.times?.length??0):2}getDuration(){return this.duration}getSortedTimesArray(e=!0,t=!0,i=!0){if(!this.clip)return[0,this.duration];const n=this.pos?.times,s=this.rot?.times,r=this.scale?.times,a=[];if(e&&n)for(const l of n)a.push(l);if(t&&s)for(const l of s)a.push(l);if(i&&r)for(const l of r)a.push(l);return a.includes(0)||a.push(0),a.sort((l,c)=>l-c),[...new Set(a)]}*getValues(e,t=!0,i=!0,n=!0){const s=new b,r=new N,a=new b(1,1,1),l=this.target,c=t?this.pos?.createInterpolant():void 0,h=i?this.rot?.createInterpolant():void 0,d=n?this.scale?.createInterpolant():void 0;c||s.set(l.position.x,l.position.y,l.position.z),h||r.set(l.quaternion.x,l.quaternion.y,l.quaternion.z,l.quaternion.w),d||a.set(l.scale.x,l.scale.y,l.scale.z),c&&c.valueSize!==3&&(c.valueSize=3),h&&h.valueSize!==4&&(h.valueSize=4),d&&d.valueSize!==3&&(d.valueSize=3);const p=0;for(let m=0-p;m<e.length+p;m++){let f=0,g=0;if(m<0?(f=e[0],g=f-Ve.animationDurationPadding/2+1/60):m>=e.length?(f=e[e.length-1],g=f+Ve.animationDurationPadding/2-1/60):(f=e[m],g=f),c){const y=c.evaluate(f);s.set(y[0],y[1],y[2])}if(h){const y=h.evaluate(f);r.set(y[0],y[1],y[2],y[3])}if(d){const y=d.evaluate(f);a.set(y[0],y[1],y[2])}if(this.useRootMotion&&l===this.root){const y=new J;y.compose(s,r,a),y.multiply(l.matrix),y.decompose(s,r,a)}yield{time:g,translation:s,rotation:r,scale:a,index:m}}}}class Dp{get extensionName(){return"animation"}get animationData(){return this.dict}get registeredClips(){return this.clipToStartTime.keys()}get animatedRoots(){return this.rootTargetMap.keys()}get holdClipMap(){return this.clipToHoldClip}dict=new Map;rootTargetMap=new Map;rootAndClipToRegisteredAnimationMap=new Map;rootToRegisteredClip=new Map;lastClipEndTime=0;clipToStartTime=new Map;clipToHoldClip=new Map;serializers=[];injectRestPoses=!1;injectImplicitBehaviours=!1;constructor(e){this.injectRestPoses=e,this.injectImplicitBehaviours=e}getStartTimeCode(){return!this.injectRestPoses||this.rootAndClipToRegisteredAnimationMap.size===0?0:(Ve.restPoseClipDuration+Ve.animationDurationPadding)*60}getEndTimeCode(){let e=0;for(const[t,i]of this.rootAndClipToRegisteredAnimationMap){const n=i.start+i.duration;n>e&&(e=n)}return e*60}getClipCount(e){return this.rootToRegisteredClip.get(e)?.length??0??0}getStartTimeByClip(e){return e?this.clipToStartTime.has(e)?this.clipToStartTime.get(e):(console.error("USDZExporter: Missing start time for clip \u2013 please report a bug.",e),0):0}registerAnimation(e,t){if(!e)return null;this.rootTargetMap.has(e)||this.rootTargetMap.set(e,[]);const i=e.uuid+(t?.uuid??"-rest");if(this.rootAndClipToRegisteredAnimationMap.has(i))return this.rootAndClipToRegisteredAnimationMap.get(i);fo&&console.log("registerAnimation",e,t);const n=this.injectRestPoses?1:0,s=(this.rootToRegisteredClip.get(e)?.length??0)+n,r=this.rootTargetMap.get(e),a=new Set(r);if(t&&t.tracks)for(const c of t.tracks){const h=La.parseTrackName(c.name),d=La.findNode(e,h.nodeName);if(!d){console.warn("no object found for track",c.name,"using "+e.name+" instead");continue}this.dict.has(d)||this.dict.set(d,[]);const p=this.dict.get(d);if(!p){console.warn("no transform data found for target ",d,"at slot "+s+", this is likely a bug");continue}a.delete(d),this.injectRestPoses&&!p[0]&&(console.log("Injecting rest pose",d,t,"at slot",s),p[0]=new Ve(null,d,null));let m=p[s];m||(m=new Ve(e,d,t),p[s]=m),m.addTrack(c),r?.includes(d)||r?.push(d)}fo&&console.log("Unregistered nodes for this clip",a,"clip",t,"at slot",s,"for root",e,"targets",r);for(const c of a){const h=this.dict.get(c);if(!h)continue;if(this.injectRestPoses&&!h[0]){console.warn("Adding rest pose for ",c,t,"at slot",s,"This is likely a bug, should have been added earlier.");const p=new Ve(null,c,null);h[0]=p}let d=h[s];d||(fo&&console.log("Adding padding clip for ",c,t,"at slot",s),d=new Ve(e,c,t),h[s]=d)}const l=new br(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(i,l),fo&&console.log({root:e,clip:t,info:l}),t){const c=this.rootToRegisteredClip.get(e);if(c?c.push(t):this.rootToRegisteredClip.set(e,[t]),!this.clipToStartTime.get(t)){this.lastClipEndTime==null&&(this.lastClipEndTime=Ve.restPoseClipDuration);let h=this.lastClipEndTime+Ve.animationDurationPadding,d=h+t.duration;const p=Math.round(h*60)/60,m=Math.round(d*60)/60;Math.abs(p-h)<.01&&(h=p),Math.abs(m-d)<.01&&(d=m),h=Math.ceil(h),d=h+t.duration,this.clipToStartTime.set(t,h),this.lastClipEndTime=d}}return l}onAfterHierarchy(e){fo&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){fo&&console.log("Animation data",{dict:this.dict,rootTargetMap:this.rootTargetMap,rootToRegisteredClip:this.rootToRegisteredClip});for(const t of this.rootTargetMap.keys()){const i=this.rootTargetMap.get(t);if(!i)continue;let n;const s=[];for(const r of i){const a=this.dict.get(r);if(!a){console.error("No data found for target on USDZ export \u2013 please report a bug!",r);continue}n===void 0&&(n=a?.length),n!==a?.length&&console.error("Different array lengths for targets \u2013 please report a bug!",a);for(let l=0;l<a.length;l++){let c=a[l];if(!c){const d=l-(this.injectRestPoses?1:0);a[l]=new Ve(null,r,this.rootToRegisteredClip.get(t)[d]),c=a[l]}const h=c.getDuration();if(s[l]===void 0)s[l]=h;else if(s[l]!==h){console.error("Error during UDSZ export: Encountered different animation durations for animated targets. Please report a bug!",{datas:a,target:r}),s[l]=h;continue}}}}for(const t of this.serializers){const i=t.model?.parent,n=i?.isDynamic===!0;Qy&&console.log(n,t.model?.parent),n&&t.registerCallback(i)}}onExportObject(e,t,i){x.foreachComponent(e,s=>{const r=s;typeof r.createAnimation=="function"&&r.createAnimation(this,t,i)},!1);const n=new HA(e,this);this.serializers.push(n),n.registerCallback(t)}}class HA{model=void 0;object;animationData;ext;callback;constructor(e,t){this.object=e,this.animationData=t.animationData,this.ext=t}registerCallback(e){this.model&&this.callback&&this.model.removeEventListener("serialize",this.callback),this.callback||(this.callback=this.onSerialize.bind(this)),Qy&&console.log("REPARENT",e),this.model=e,this.callback&&this.model.addEventListener("serialize",this.callback)}skinnedMeshExport(e,t,i){const n=this.model,s=this.animationData;if(n&&n.skinnedMesh){let r=function(R){const $=[];for(const[q,he]of R){let re=`${q} : [`;const ge=[];for(const te of he)ge.push(`(${ce(te.x)}, ${ce(te.y)}, ${ce(te.z)})`);re=re.concat(ge.join(", ")),re=re.concat("],"),$.push(re)}return $},a=function(R){const $=[];for(const[q,he]of R){let re=`${q} : [`;const ge=[];for(const te of he)ge.push(`(${ce(te.w)}, ${ce(te.x)}, ${ce(te.y)}, ${ce(te.z)})`);re=re.concat(ge.join(", ")),re=re.concat("],"),$.push(re)}return $},l=function(R){let $,q=!0;const he=new Map;for(const[ge,te]of R){$===void 0&&($=te.length),$!==te.length&&(q=!1);let $e=0;for(const hi of te)$e++,hi||(he.has(ge)||he.set(ge,[]),he.get(ge).push($e))}fo&&console.log("Bone count: ",R.size,"TransformData entries per bone: ",$,"Undefined bone entries: ",he),console.assert(q,"All bones should have the same number of TransformData entries",R),console.assert(he.size===0,"All TransformData entries should be set",he);const re=[];for(const[ge,te]of R)for(let $e=0;$e<te.length;$e++){const hi=te[$e],Td=i.getStartTimeByClip(hi.clip);re.length<=$e&&re.push({pos:[],rot:[],scale:[],timeOffset:Td});const ws=re[$e];ws.pos.push(...hi.getSortedTimesArray(!0,!1,!1)),ws.rot.push(...hi.getSortedTimesArray(!1,!0,!1)),ws.scale.push(...hi.getSortedTimesArray(!1,!1,!0))}for(const ge of re)ge.pos.sort((te,$e)=>te-$e),ge.rot.sort((te,$e)=>te-$e),ge.scale.sort((te,$e)=>te-$e),ge.pos=[...new Set(ge.pos)],ge.rot=[...new Set(ge.rot)],ge.scale=[...new Set(ge.scale)];return re},c=function(R,$,q){const he=new Map,re=new Map,ge=new Map,te=$.length;for(const $e of q){const hi=R.get($e);let Td;hi?console.assert(hi.length===te,"We should have the same number of TransformData entries for each bone",hi,$):Td=new Ve(null,$e,null);for(let ws=0;ws<te;ws++){const Bm=hi?hi[ws]:Td,Ia=$[ws];for(const{time:yc,translation:bc}of Bm.getValues(Ia.pos,!0,!1,!1)){const Cn=(yc+Ia.timeOffset)*60;he.has(Cn)||he.set(Cn,new Array),he.get(Cn).push(bc.clone())}for(const{time:yc,rotation:bc}of Bm.getValues(Ia.rot,!1,!0,!1)){const Cn=(yc+Ia.timeOffset)*60;re.has(Cn)||re.set(Cn,new Array),re.get(Cn).push(bc.clone())}for(const{time:yc,scale:bc}of Bm.getValues(Ia.scale,!1,!1,!0)){const Cn=(yc+Ia.timeOffset)*60;ge.has(Cn)||ge.set(Cn,new Array),ge.get(Cn).push(bc.clone())}}}return{position:he.size==0?void 0:he,quaternion:re.size==0?void 0:re,scale:ge.size==0?void 0:ge}},h=function(R){const $=[];for(const q of R)$.push(`(${ce(q.x)}, ${ce(q.y)}, ${ce(q.z)})`);return $.join(", ")},d=function(R){const $=[];for(const q of R)$.push(`(${ce(q.w)}, ${ce(q.x)}, ${ce(q.y)}, ${ce(q.z)})`);return $.join(", ")},p=function(R){const $=new Map;if(fo){const q=new Array;for(const[he,re]of s)q.push(he.uuid+": "+re.length+" "+re.map(ge=>ge.clip?.uuid.substring(0,6)).join(" "));console.log(`getPerBoneTransformData
|
|
1289
|
+
`+q.join(`
|
|
1290
|
+
`))}for(const q of R){const he=s.get(q);he&&$.set(q,he)}return $},m=function(R){const $=p(R),q=l($);return c($,q,R)};const f=n.skinnedMesh.skeleton,g=new Array,y=[],_=[];for(const R of f.bones){y.push(R),_.push(R.uuid);const $=f.boneInverses[f.bones.indexOf(R)];g.push({bone:R,inverse:$})}let v=1e4;for(;_.length<f.bones.length&&v-- >0;)for(const R of y){const $=R.children;for(const q of $)if(_.indexOf(q.uuid)===-1&&f.bones.indexOf(q)!==-1){y.push(q),_.push(q.uuid);const he=f.boneInverses[f.bones.indexOf(q)];g.push({bone:q,inverse:he})}}v<=0&&console.error("Failed to sort bones in skinned mesh",n.skinnedMesh,f.bones,_);for(const R of y1(f.bones))g.push({bone:R,inverse:R.matrixWorld.clone().invert()});const C=g[0].bone.parent;C||console.error("No bone parent found for skinned mesh during USDZ export",n.skinnedMesh),g.sort((R,$)=>Al(R.bone,C)>Al($.bone,C)?1:-1);const O=t.quickLookCompatible,k=[],j=[],L=[],V=[];for(const{bone:R}of g){if(O){const $=R.scale;$.x==0&&($.x=1e-5),$.y==0&&($.y=1e-5),$.z==0&&($.z=1e-5),k.push(new J().compose(R.position,R.quaternion,R.scale))}else k.push(R.matrix.clone());j.push(R.position),L.push(R.quaternion),V.push(R.scale)}const W=g.map(R=>'"'+Al(R.bone,C)+'"').join(", "),G=g.map(R=>E1(R.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${G}]`),e.appendLine(`uniform token[] joints = [${W}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${k.map(R=>E1(R)).join(", ")}]`);const X=m(g.map(R=>R.bone));if(fo){let R=1e7,$=0;for(const q of X.position?.keys()??[])R=Math.min(R,q),$=Math.max($,q);console.log("Time samples",R,$,X)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${W}]`),e.appendLine(`quatf[] rotations = [${d(L)}]`),X&&X.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const R=a(X.quaternion);for(const $ of R)e.appendLine($);e.closeBlock()}if(e.appendLine(`half3[] scales = [${h(V)}]`),X&&X.scale){e.beginBlock("half3[] scales.timeSamples = {","");const R=r(X.scale);for(const $ of R)e.appendLine($);e.closeBlock()}if(e.appendLine(`float3[] translations = [${h(j)}]`),X&&X.position){e.beginBlock("float3[] translations.timeSamples = {","");const R=r(X.position);for(const $ of R)e.appendLine($);e.closeBlock()}e.closeBlock(),e.closeBlock()}}onSerialize(e,t){if(!this.model)return;const i=this.animationData.get(this.object);if(i)for(let h=0;h<i.length;h++)i[h]===void 0&&(i[h]=new Ve(null,this.object,null));const n=this.ext;this.skinnedMeshExport(e,t,n);const s=this.object,r=this.model,a=this.animationData.get(s);if(!a||s.isSkinnedMesh)return;Qy&&console.log("SERIALIZE",this.model.name,this.object.type,a);const l=Intl.NumberFormat("en-US",{maximumFractionDigits:3,minimumFractionDigits:0,useGrouping:!1});function c(h,d){if(h.some(p=>p&&{position:p.pos,rotation:p.rot,scale:p.scale}[d])){switch(d){case"position":r.needsTranslate=!0,e.beginBlock("double3 xformOp:translate.timeSamples = {","");break;case"rotation":r.needsOrient=!0,e.beginBlock("quatf xformOp:orient.timeSamples = {","");break;case"scale":r.needsScale=!0,e.beginBlock("double3 xformOp:scale.timeSamples = {","");break}for(let p=0;p<h.length;p++){const m=h[p];if(!m)continue;const f=n.getStartTimeByClip(m.clip),g=m.getSortedTimesArray(d==="position",d==="rotation",d==="scale");if(!g||g.length===0){console.error("got an animated object but no time values?",s,m);continue}const y=!m.clip,_=d==="position"&&(m.pos||y),v=d==="rotation"&&(m.rot||y),C=d==="scale"&&(m.scale||y);if(_||v||C){const O=m.clip?.name??"rest",k=m.getDuration();fo&&console.log("Write .timeSamples:",O,f,k,h),e.appendLine("# "+O+": start="+l.format(f*Ve.frameRate)+", length="+l.format(k*Ve.frameRate)+", frames="+m.getFrames())}if(_)for(const{time:O,translation:k}of m.getValues(g,!0,!1,!1)){const j=`${l.format((f+O)*Ve.frameRate)}: (${ce(k.x)}, ${ce(k.y)}, ${ce(k.z)}),`;e.appendLine(j)}if(v)for(const{time:O,rotation:k}of m.getValues(g,!1,!0,!1)){const j=`${l.format((f+O)*Ve.frameRate)}: (${ce(k.w)}, ${ce(k.x)}, ${ce(k.y)}, ${ce(k.z)}),`;e.appendLine(j)}if(C)for(const{time:O,scale:k}of m.getValues(g,!1,!1,!0)){const j=`${l.format((f+O)*Ve.frameRate)}: (${ce(k.x)}, ${ce(k.y)}, ${ce(k.z)}),`;e.appendLine(j)}}e.closeBlock()}}c(a,"position"),c(a,"rotation"),c(a,"scale")}}const GA=w("debugusdz");class ka{static getName(e){const t=e.split(".").pop();let i=e.split(".").slice(0,-1).join(".").split("/").pop()?.replace(".","_");return i||(i="Audio_"+Math.random().toString(36).substring(2,15)),Vi(i)+"."+t}get extensionName(){return"Audio"}files=new Array;onExportObject(e,t,i){const n=x.getComponents(e,Ni);if(n.length)for(const s of n){if(!s.clip||typeof s.clip!="string"||!s.playOnAwake)continue;const r=s.clip.split("/").pop()||"Audio",a=ka.getName(s.clip),l=Vi(a);if(!this.files.some(c=>c.path===s.clip)){this.files.push({path:s.clip,name:a});const c=a.toLowerCase();i.quickLookCompatible&&!c.endsWith(".mp3")&&!c.endsWith(".wav")&&!c.endsWith(".m4a")&&console.error("Audio file "+s.clip+" from "+s.name+" is not an MP3 or WAV file. QuickLook may not support playing it.")}i.quickLookCompatible||t.addEventListener("serialize",(c,h)=>{c.appendLine(),c.beginBlock(`def SpatialAudio "${l}"`,"(",!1),c.appendLine(`displayName = "${r}"`),c.closeBlock(")"),c.beginBlock(),c.appendLine(`uniform asset filePath = @audio/${a}@`),c.appendLine(`uniform token auralMode = "${s.spatialBlend>0?"spatial":"nonSpatial"}"`),c.appendLine(`uniform token playbackMode = "${s.loop?"loopFromStage":"onceFromStart"}"`),c.appendLine(`uniform float gain = ${s.volume}`),c.closeBlock()})}}async onAfterSerialize(e){for(const t of this.files){const i="audio/"+t.name;if(e.files[i]){GA&&console.warn("Audio file with name "+i+" already exists in the context. Skipping.");continue}const n=await(await(await fetch(t.path)).blob()).arrayBuffer(),s=new Uint8Array(n);e.files[i]=s}}}var qA=Object.defineProperty,Fe=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&qA(e,t,n),n};const j1=w("debugusdzbehaviours");class ra extends E{object;target;duration=1;relativeMotion=!1;coroutine=null;targetPos=new b;targetRot=new N;targetScale=new b;onEnable(){this.context.accessibility.updateElement(this,{role:"button",label:"Move "+(this.object?.name||"object")+" to "+(this.target?.name||"target")+" on click",hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){const t=this.object?.getComponentsInChildren(Je);if(t)for(const i of t)i.resetVelocities(),i.resetForcesAndTorques();e.use(),this.coroutine&&this.stopCoroutine(this.coroutine),this.relativeMotion?this.coroutine=this.startCoroutine(this.moveRelative()):this.coroutine=this.startCoroutine(this.moveToTarget())}*moveToTarget(){if(!this.target||!this.object)return;const e=ee(this.object).clone(),t=ee(this.target).clone(),i=_e(this.object).clone(),n=_e(this.target).clone(),s=Ge(this.object).clone(),r=Ge(this.target).clone(),a=e.distanceTo(t),l=i.angleTo(n),c=s.distanceTo(r);if(a<.01&&l<.01&&c<.01){bt(this.object,t),kn(this.object,n),Va(this.object,r),this.coroutine=null;return}let h=0,d=0;for(;h<1;)h+=this.context.time.deltaTime/this.duration,h>1&&(h=1),d=h<.5?4*h*h*h:1-Math.pow(-2*h+2,3)/2,this.targetPos.lerpVectors(e,t,d),this.targetRot.slerpQuaternions(i,n,d),this.targetScale.lerpVectors(s,r,d),bt(this.object,this.targetPos),kn(this.object,this.targetRot),Va(this.object,this.targetScale),yield;this.coroutine=null}*moveRelative(){if(!this.target||!this.object)return;const e=this.object.position.clone(),t=this.object.quaternion.clone(),i=this.object.scale.clone(),n=this.target.position.clone(),s=this.target.quaternion.clone(),r=this.target.scale.clone();n.applyQuaternion(this.object.quaternion),this.targetPos.copy(this.object.position).add(n),this.targetRot.copy(this.object.quaternion).multiply(s),this.targetScale.copy(this.object.scale).multiply(r);let a=0,l=0;for(;a<1;)a+=this.context.time.deltaTime/this.duration,a>1&&(a=1),l=a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,this.object.position.lerpVectors(e,this.targetPos,l),this.object.quaternion.slerpQuaternions(t,this.targetRot,l),this.object.scale.lerpVectors(i,this.targetScale,l),yield;this.coroutine=null}beforeCreateDocument(e){if(this.target&&this.object&&this.gameObject){const t=new Ut("Move to "+this.target?.name,qt.tapTrigger(this.gameObject),fe.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(t)}}}Fe([u(M)],ra.prototype,"object"),Fe([u(M)],ra.prototype,"target"),Fe([u()],ra.prototype,"duration"),Fe([u()],ra.prototype,"relativeMotion");const jp=class ai extends E{materialToSwitch;variantMaterial;fadeDuration=0;start(){this._objectsWithThisMaterial=this.objectsWithThisMaterial,A()&&this._objectsWithThisMaterial.length<=0&&console.warn('ChangeMaterialOnClick: No objects found with material "'+this.materialToSwitch?.name+'"')}onEnable(){this.context.accessibility.updateElement(this,{role:"button",label:"Change material to "+(this.variantMaterial?.name||"unknown material"),hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this)}onPointerEnter(e){this.context.input.setCursor("pointer")}onPointerExit(e){this.context.input.unsetCursor("pointer")}onPointerClick(e){if(e.use(),!!this.variantMaterial)for(let t=0;t<this.objectsWithThisMaterial.length;t++){const i=this.objectsWithThisMaterial[t];i.material=this.variantMaterial}}_objectsWithThisMaterial=null;get objectsWithThisMaterial(){return this._objectsWithThisMaterial!=null?this._objectsWithThisMaterial:(this._objectsWithThisMaterial=[],this.variantMaterial&&this.materialToSwitch&&this.context.scene.traverse(e=>{if(e instanceof H)if(Array.isArray(e.material)){for(const t of e.material)if(t===this.materialToSwitch){this.objectsWithThisMaterial.push(e);break}}else e.material===this.materialToSwitch?this.objectsWithThisMaterial.push(e):Rv(e.material,this.materialToSwitch)&&this.objectsWithThisMaterial.push(e)}),this._objectsWithThisMaterial)}selfModel;targetModels;static _materialTriggersPerId={};static _startHiddenBehaviour=null;static _parallelStartHiddenActions=[];async beforeCreateDocument(e,t){this.targetModels=[],ai._materialTriggersPerId={},ai.variantSwitchIndex=0,this.materialToSwitch&&await He.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await He.assignTextureLOD(this.variantMaterial,0)}createBehaviours(e,t,i){this.objectsWithThisMaterial.find(n=>n.uuid===t.uuid)&&this.targetModels.push(t),this.gameObject.uuid===t.uuid&&(this.selfModel=t,this.materialToSwitch&&(ai._materialTriggersPerId[this.materialToSwitch.uuid]||(ai._materialTriggersPerId[this.materialToSwitch.uuid]=[]),ai._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(e,t){if(!this.materialToSwitch)return;const i=ai._materialTriggersPerId[this.materialToSwitch.uuid];if(i){const n={};for(const s of i){const r=s.createVariants();r&&r.length>0&&(n[s.selfModel.uuid]=r)}for(const s of i){const r=[];for(const a in n)a!==s.selfModel.uuid&&r.push(...n[a]);s.createAndAttachBehaviors(e,n[s.selfModel.uuid],r)}}delete ai._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(e,t,i){const n=[],s=Math.max(0,this.fadeDuration);n.push(fe.fadeAction([...this.targetModels,...i],s,!1)),n.push(fe.fadeAction(t,s,!0)),e.addBehavior(new Ut("Select_"+this.selfModel.name,qt.tapTrigger(this.selfModel),fe.parallel(...n))),ai._parallelStartHiddenActions.push(...t),ai._startHiddenBehaviour||(ai._startHiddenBehaviour=new Ut("StartHidden_"+this.selfModel.name,qt.sceneStartTrigger(),fe.fadeAction(ai._parallelStartHiddenActions,s,!1)),e.addBehavior(ai._startHiddenBehaviour))}static getMaterialName(e){return Vi(e.name||"Material")+"_"+e.id}static variantSwitchIndex=0;createVariants(){if(!this.variantMaterial)return null;const e=[];for(const t of this.targetModels){const i=t.clone();i.name+="_Variant_"+ai.variantSwitchIndex+++"_"+ai.getMaterialName(this.variantMaterial),i.displayName=i.displayName+": Variant with material "+this.variantMaterial.name,i.material=this.variantMaterial,i.geometry=t.geometry,i.transform=t.transform,(!t.parent||!t.parent.isEmpty())&&ct.createEmptyParent(t),t.parent&&t.parent.add(i),e.push(i)}return e}};Fe([u(we)],jp.prototype,"materialToSwitch"),Fe([u(we)],jp.prototype,"variantMaterial"),Fe([u()],jp.prototype,"fadeDuration");let Yy=jp;const Ch=class We extends E{target;toggleOnClick=!1;targetState=!0;hideSelf=!0;onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),!this.toggleOnClick&&this.hideSelf&&(this.gameObject.visible=!1),this.target&&(this.target.visible=this.toggleOnClick?!this.target.visible:this.targetState)}selfModel;selfModelClone;targetModel;toggleModel;createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.selfModel=t,this.selfModelClone=t.clone())}stateBeforeCreatingDocument=!1;targetStateBeforeCreatingDocument=!1;static clonedToggleIndex=0;static wasVisible=Symbol("usdz_SetActiveOnClick_wasVisible");static toggleClone=Symbol("clone for toggling");static reverseToggleClone=Symbol("clone for reverse toggling");beforeCreateDocument(){this.target&&(this.gameObject[We.wasVisible]===void 0&&(this.gameObject[We.wasVisible]=this.gameObject.activeSelf),this.target[We.wasVisible]===void 0&&(this.target[We.wasVisible]=this.target.activeSelf),this.stateBeforeCreatingDocument=this.gameObject[We.wasVisible],this.targetStateBeforeCreatingDocument=this.target[We.wasVisible],this.gameObject.visible=!0,this.target.visible=!0)}afterCreateDocument(e,t){if(!this.target)return;this.targetModel=t.document.findById(this.target.uuid);const i=this.selfModel;if(this.selfModel&&this.targetModel){let n=this.selfModel,s=this.targetState;if(this.toggleOnClick)if(s=!this.targetStateBeforeCreatingDocument,!this.selfModelClone.geometry)(!this.selfModel.parent||this.selfModel.parent.isEmpty())&&zy.createEmptyParent(this.selfModel),this.toggleModel=this.selfModel.deepClone(),this.toggleModel.name+="_toggle",this.selfModel.parent.add(this.toggleModel);else{if(!this.gameObject[We.toggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new J),l.name+="_toggle"+We.clonedToggleIndex++,i.add(l),this.gameObject[We.toggleClone]=l,console.warn("USDZExport: Toggle "+this.gameObject.name+" doesn't have geometry. It will be deep cloned and nested behaviours will likely not work.")}const a=this.gameObject[We.toggleClone];if(!this.gameObject[We.reverseToggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new J),l.name+="_toggleReverse"+We.clonedToggleIndex++,i.add(l),this.gameObject[We.reverseToggleClone]=l}this.toggleModel=this.gameObject[We.reverseToggleClone],(!this.toggleModel.geometry||!a.geometry)&&console.error("triggers without childs and without geometry won't work!",this,i.geometry),n=a,i.geometry=null,i.material=null}if(this.toggleModel){if(this.toggleOnClick){const a=[];a.push(fe.fadeAction(n,0,!1)),a.push(fe.fadeAction(this.toggleModel,0,!0)),a.push(fe.fadeAction(this.targetModel,0,s)),e.addBehavior(new Ut("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),qt.tapTrigger(n),fe.parallel(...a)));const l=[];l.push(fe.fadeAction(this.toggleModel,0,!1)),l.push(fe.fadeAction(n,0,!0)),l.push(fe.fadeAction(this.targetModel,0,!s)),e.addBehavior(new Ut("Toggle_"+n.name+"_ToggleTo"+(s?"Off":"On"),qt.tapTrigger(this.toggleModel),fe.parallel(...l)))}}else{const a=[];this.hideSelf&&a.push(fe.fadeAction(n,0,!1)),a.push(fe.fadeAction(this.targetModel,0,s)),e.addBehavior(new Ut("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),qt.tapTrigger(n),a.length>1?fe.parallel(...a):a[0]))}const r=new Array;this.targetStateBeforeCreatingDocument||r.push(this.targetModel),this.stateBeforeCreatingDocument||r.push(i),this.toggleModel&&r.push(this.toggleModel),wn.add(r,e)}}afterSerialize(e,t){this.gameObject[We.wasVisible]!==void 0&&(this.gameObject.visible=this.gameObject[We.wasVisible],delete this.gameObject[We.wasVisible]),this.target&&this.target[We.wasVisible]!==void 0&&(this.target.visible=this.target[We.wasVisible],delete this.target[We.wasVisible]),delete this.gameObject[We.toggleClone],delete this.gameObject[We.reverseToggleClone]}};Fe([u(M)],Ch.prototype,"target"),Fe([u()],Ch.prototype,"toggleOnClick"),Fe([u()],Ch.prototype,"targetState"),Fe([u()],Ch.prototype,"hideSelf");let Zy=Ch;class wn extends E{static _fadeBehaviour;static _fadeObjects=[];static add(e,t){const i=Array.isArray(e)?e:[e];for(const n of i)wn._fadeObjects.includes(n)||(console.log("adding hide on start",n),wn._fadeObjects.push(n));wn._fadeBehaviour===void 0&&(wn._fadeBehaviour=new Ut("HideOnStart",qt.sceneStartTrigger(),fe.fadeAction(wn._fadeObjects,0,!1)),t.addBehavior(wn._fadeBehaviour))}start(){x.setActive(this.gameObject,!1)}createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.wasVisible||wn.add(t,e))}wasVisible=!1;beforeCreateDocument(){this.wasVisible=x.isActiveSelf(this.gameObject)}}class Ll extends E{target;duration=.5;motionType="bounce";onEnable(){this.context.accessibility.updateElement(this,{role:"button",label:"Emphasize "+this.target?.name+" on click",hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this)}beforeCreateDocument(){}createBehaviours(e,t,i){if(this.target&&t.uuid===this.gameObject.uuid){const n=new Ut("emphasize "+this.name,qt.tapTrigger(this.gameObject),fe.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(n)}}afterCreateDocument(e,t){}}Fe([u()],Ll.prototype,"target"),Fe([u()],Ll.prototype,"duration"),Fe([u()],Ll.prototype,"motionType");class $s extends E{target;clip="";toggleOnClick=!1;trigger="tap";ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(Ni);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}onEnable(){this.context.accessibility.updateElement(this,{role:"button",label:"Play audio: "+(this.clip||this.target?.clip||"unknown clip"),hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),!(!this.target?.clip&&!this.clip)&&(this.ensureAudioSource(),this.target&&(this.target.isPlaying&&this.toggleOnClick?this.target.stop():(!this.toggleOnClick&&this.target.isPlaying&&this.target.stop(),this.clip?this.target.play(this.clip):this.target.play())))}createBehaviours(e,t,i){if(!(!this.target&&!this.clip)&&t.uuid===this.gameObject.uuid){const n=this.clip?this.clip:this.target?this.target.clip:void 0;if(!n||typeof n!="string")return;const s=this.target?this.target.gameObject:this.gameObject;ka.getName(n);const r=this.target?this.target.volume:1,a=this.target&&this.target.spatialBlend==0?"nonSpatial":"spatial";let l=!1;this.gameObject.traverse(p=>{p instanceof H&&p.visible&&(l=!0)}),l=!0;const c=e.addAudioClip(n);let h=fe.playAudioAction(s,c,"play",r,a);this.target&&this.target.loop&&(h=fe.sequence(h).makeLooping());const d=this.name?"_"+this.name:"";if(l&&this.trigger==="tap"){this.toggleOnClick&&(h.multiplePerformOperation="stop");const p=new Ut("playAudio"+d,qt.tapTrigger(t),h);e.addBehavior(p)}if(this.target&&this.target.playOnAwake&&this.target.enabled)if(l&&this.trigger==="tap")console.warn("USDZExport: Audio sources that are played on tap can't also auto-play at scene start due to a QuickLook bug.");else{const p=new Ut("playAudioOnStart"+d,qt.sceneStartTrigger(),h);e.addBehavior(p)}}}}Fe([u(Ni)],$s.prototype,"target"),Fe([u(URL)],$s.prototype,"clip"),Fe([u()],$s.prototype,"toggleOnClick");const Ky=class Po extends E{animator;stateName;trigger="tap";animation;get target(){return this.animator?.gameObject||this.animation?.gameObject}onEnable(){this.context.accessibility.updateElement(this,{role:"button",label:"Plays animation "+(this.stateName||"")+" on "+(this.target?this.target.name:""),hidden:!1})}onDisable(){this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this)}onPointerEnter(){this.context.input.setCursor("pointer"),this.context.accessibility.hover(this,"Click to play animation "+(this.stateName||"")+" on "+(this.target?this.target.name:""))}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),this.target&&this.stateName&&(this.context.accessibility.focus(this),this.animator?.play(this.stateName,0,0,.1))}selfModel;stateAnimationModel;animationSequence=new Array;animationLoopAfterSequence=new Array;randomOffsetNormalized=0;createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.selfModel=t)}static animationActions=[];static rootsWithExclusivePlayback=new Set;afterSerialize(){if(Po.rootsWithExclusivePlayback.size>1){const e='Multiple root objects targeted by more than one animation. To work around QuickLook bug FB13410767, animations will be set as "exclusive" and activating them will stop other animations being marked as exclusive.';A()&&be(e),console.warn(e,...Po.rootsWithExclusivePlayback)}Po.animationActions=[],Po.rootsWithExclusivePlayback=new Set}afterCreateDocument(e,t){if(this.animationSequence===void 0&&this.animationLoopAfterSequence===void 0||!this.stateAnimationModel||!this.target)return;const i=t.document,n=t.extensions.find(a=>a instanceof Dp);if(!n)return;const s=n.getClipCount(this.target)>1;s&&(A()&&console.warn("Setting exclusive playback for "+this.target.name+"@"+this.stateName+" because it has "+n.getClipCount(this.target)+" animations. This works around QuickLook bug FB13410767."),Po.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";i.traverse(a=>{if(a.uuid===this.target?.uuid){const l=Po.getActionForSequences(i,a,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),c=new Ut(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+this.target?.name,this.trigger=="tap"?qt.tapTrigger(this.selfModel):qt.sceneStartTrigger(),l);s&&c.makeExclusive(!0),e.addBehavior(c)}})}static getActionForSequences(e,t,i,n,s){const r=(l,c)=>{let h=Po.animationActions.find(d=>d.affectedObjects==l&&d.start==c.start&&d.duration==c.duration&&d.animationSpeed==c.speed);return h||(h=fe.startAnimationAction(l,c),Po.animationActions.push(h)),h},a=fe.sequence();if(i&&i.length>0)for(const l of i)a.addAction(r(t,l));if(n&&n.length>0){const l=a.actions.length==0?a:fe.sequence();for(const c of n)l.addAction(r(t,c));l.makeLooping(),a!==l&&a.addAction(l)}return s&&s>0&&a.actions.unshift(fe.waitAction(s)),a}static getAndRegisterAnimationSequences(e,t,i){if(!t)return;const n=t.getComponent(wt),s=t.getComponent(Vt);if(!n&&!s)return;if(n&&!i)throw new Error("PlayAnimationOnClick: No stateName specified for animator "+n.name+" on "+t.name);let r=[],a=[];if(s){const f=e.registerAnimation(t,s.clip);f&&(s.loop?a.push(f):r.push(f));let g=0;if(s.minMaxOffsetNormalized){const y=s.minMaxOffsetNormalized.x,_=s.minMaxOffsetNormalized.y;g=(s.clip?.duration||1)*(y+Math.random()*(_-y))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:g}}const l=n?.runtimeAnimatorController;let c=l?.findState(i),h=[],d=[];if(l&&c){const f=new Array;f.push(c);let g=!1;for(;f.length<100;){if(!c||c===null||!c.transitions||c.transitions.length===0){c.motion?.isLooping&&(g=!0);break}const y=c.transitions.find(v=>v.conditions.length===0),_=y?l.getState(y.destinationState,0):null;if(_&&f.includes(_)){c=_,g=!0;break}else if(y){if(c=_,!c)break;f.push(c)}else{g=c.motion?.isLooping??!1;break}}if(g&&c){const y=f.indexOf(c);h=f.slice(0,y),d=f.slice(y),j1&&console.log("found loop from "+i,"states until loop",h,"states looping",d)}else h=f,d=[],j1&&console.log("found no loop from "+i,"states",h);if(!d.length){const y=h[h.length-1],_=y.motion?.clip;if(_){let v;if(e.holdClipMap.has(_))v=e.holdClipMap.get(_);else{const C=y.name+"_hold";v=_.clone(),v.duration=1,v.name=C;const O=_.duration;v.tracks=_.tracks.map(k=>{const j=k.clone();j.times=new Float32Array([0,O]);const L=k.values.length,V=k.getValueSize(),W=k.values.slice(L-V,L);return j.values=new Float32Array(2*V),j.values.set(W,0),j.values.set(W,V),j}),v.name=C,e.holdClipMap.set(_,v)}if(v){const C={name:v.name,motion:{clip:v,isLooping:!1,name:v.name},speed:1,transitions:[],behaviours:[],hash:y.hash+1};d.push(C)}}}}if(h.length===1&&(!h[0].motion?.clip||h[0].motion?.clip.tracks?.length===0)){r=new Array;const f=e.registerAnimation(t,null);f&&r.push(f);return}if(h=h.filter(f=>f.motion?.clip&&f.motion?.clip.tracks?.length>0),d=d.filter(f=>f.motion?.clip&&f.motion?.clip.tracks?.length>0),h.length===0&&d.length===0){console.warn("No clips found for state "+i+" on "+n?.name+", can't export animation data");return}const p=(f,g)=>{if(!t)return;const y=e.registerAnimation(t,f.motion.clip??null);y?(y.speed=f.speed,g.push(y)):console.warn("Couldn't register animation for state "+f.name+" on "+n?.name)};if(h.length>0){r=new Array;for(const f of h)p(f,r)}if(d.length>0){a=new Array;for(const f of d)p(f,a)}let m=0;if(n&&l&&n.minMaxOffsetNormalized){const f=n.minMaxOffsetNormalized.x,g=n.minMaxOffsetNormalized.y;m=((h.length?h[0]:d.length?d[0]:null)?.motion.clip?.duration||1)*(f+Math.random()*(g-f))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:m}}createAnimation(e,t,i){if(!this.target||!this.animator&&!this.animation)return;const n=Po.getAndRegisterAnimationSequences(e,this.target,this.stateName);n&&(this.animationSequence=n.animationSequence,this.animationLoopAfterSequence=n.animationLoopAfterSequence,this.randomOffsetNormalized=n.randomTimeOffset,this.stateAnimationModel=t)}};Fe([u(wt)],Ky.prototype,"animator"),Fe([u()],Ky.prototype,"stateName");let Ph=Ky;class Dl extends E{getType(){}target;getDuration(){}}Fe([u(M)],Dl.prototype,"target");class Oh extends E{target}Fe([u(Dl)],Oh.prototype,"target");class kh extends Dl{type=1;duration=1;getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}Fe([u()],kh.prototype,"type"),Fe([u()],kh.prototype,"duration");class Jy extends Oh{}let Bp;function XA(o){Bp=o}function QA(){if(!Bp)return null;const o=Bp.find();return o?{handler:o,created:!1}:{handler:Bp.create(),created:!0}}const YA=100,ZA=200,KA=300;class mr{static _instance;static create(){return new mr}static getOrCreate(){return this._instance||(this._instance=this.create()),this._instance}get isSecureConnection(){return window.location.protocol==="https:"}get quicklookButton(){return this._quicklookButton}_quicklookButton;get arButton(){return this._arButton}_arButton;get vrButton(){return this._vrButton}_vrButton;get sendToQuestButton(){return this._sendToQuestButton}_sendToQuestButton;get qrButton(){return _n.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=I.supportsQuickLookAR();let i="View in AR";I.isVisionOS()?i="View in AR":(t||I.isiOS())&&(i="Open in Quicklook"),e.innerText=i,e.prepend(vt("view_in_ar")),zc.setElementPriority(e,ZA);let n=!1,s=null;return e.addEventListener("click",()=>{const r=QA();r&&(s=r.handler,n=r.created),n&&s&&(s.objectToExport=z.Current.scene),s?(e.classList.add("this-mode-is-requested"),s.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(a=>{e.classList.remove("this-mode-is-requested"),console.error(a)})):console.warn("No USDZExporter component found in the scene")}),this.hideElementDuringXRSession(e),e}createARButton(e){if(this._arButton)return this._arButton;const t="immersive-ar",i=document.createElement("button");this._arButton=i,i.classList.add("webxr-button"),i.dataset.needle="webxr-ar-button",i.title="Click to start an AR session";const n=()=>{i.innerText="Enter AR",i.prepend(vt("view_in_ar"))};n();let s;return i.addEventListener("click",()=>{Z.start(t,e),I.isiOS()&&!I.isVisionOS()&&setTimeout(()=>{i.innerHTML="Tap again",i.prepend(vt("view_in_ar")),clearTimeout(s),s=setTimeout(n,4e3)},500)}),zc.setElementPriority(i,KA),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),I.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>this.updateSessionSupported(i,t)),i}createVRButton(e){if(this._vrButton)return this._vrButton;const t="immersive-vr",i=document.createElement("button");return this._vrButton=i,i.classList.add("webxr-button"),i.dataset.needle="webxr-vr-button",i.innerText="Enter VR",i.prepend(vt("panorama_photosphere")),i.title="Click to start a VR session",i.addEventListener("click",()=>Z.start(t,e)),zc.setElementPriority(i,YA),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),I.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>this.updateSessionSupported(i,t)),i}createSendToQuestButton(){if(this._sendToQuestButton)return this._sendToQuestButton;const e="https://oculus.com/open_url/?url=",t=document.createElement("button");return this._sendToQuestButton=t,t.dataset.needle="webxr-sendtoquest-button",t.innerText="Open on Quest",t.prepend(vt("share_windows")),t.title="Click to send this page to the Oculus Browser on your Quest",t.addEventListener("click",()=>{const i=encodeURIComponent(window.location.href),n=e+i;window.open(n)==null&&ke("This page doesn't allow popups. Please paste "+n+" into your browser.")}),this.listenToXRSessionState(t),this.hideElementDuringXRSession(t),I.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>{navigator.xr?.isSessionSupported("immersive-vr")?t.style.display="none":t.style.display=""}),t}createQRCode(){return _n.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!(t==="immersive-ar"&&I.isiOS()&&!I.isVisionOS())){if(!("xr"in navigator)){e.style.display="none";return}Z.isSessionSupported(t).then(i=>{e.style.display=i?"":"none",A()&&!i&&console.log('[WebXR] "'+t+'" is not supported on this device. Make sure your server runs using HTTPS and you have a device connected that supports '+t)})}}hideElementDuringXRSession(e){Su(t=>{e["previous-display"]=e.style.display,e.style.setProperty("display","none","important")}),pf(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}listenToXRSessionState(e,t){t&&(Z.onSessionRequestStart(i=>{i.mode===t?e.classList.add("this-mode-is-requested"):(e["was-disabled"]=e.disabled,e.disabled=!0,e.classList.add("other-mode-is-requested"))}),Z.onSessionRequestEnd(i=>{e.classList.remove("this-mode-is-requested"),e.classList.remove("other-mode-is-requested"),e.disabled=e["was-disabled"]}))}}var JA=Object.defineProperty,e2=Object.getOwnPropertyDescriptor,Pt=(o,e,t,i)=>{for(var n=i>1?void 0:i?e2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&JA(e,t,n),n};const Mh=w("debugspriterenderer"),t2=w("wireframe");class Ea{static cache={};static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&Ea.cache[e.guid])return Mh&&console.log("Take cached geometry for sprite",e.guid),Ea.cache[e.guid];const t=new Ji;e.__cached_geometry=t;const i=new Float32Array(e.triangles.length*3),n=new Float32Array(e.triangles.length*2);for(let s=0;s<e.triangles.length;s+=1){const r=e.triangles[s];i[s*3]=-e.vertices[r].x,i[s*3+1]=e.vertices[r].y,i[s*3+2]=0;const a=e.uv[r];n[s*2]=a.x,n[s*2+1]=1-a.y}return t.setAttribute("position",new tt(i,3)),t.setAttribute("uv",new tt(n,2)),e.guid&&(this.cache[e.guid]=t),Mh&&console.log("Built sprite geometry",e,t),t}}class i2{x;y}function B1(o){o&&(o.colorSpace!=Io&&(o.colorSpace=Io,o.needsUpdate=!0),o.minFilter==Ud&&o.magFilter==Ud&&(o.anisotropy=1,o.needsUpdate=!0))}let ts=class{constructor(o){o&&(this.texture=o,this.triangles=[0,1,2,0,2,3],this.uv=[{x:0,y:0},{x:1,y:0},{x:1,y:1},{x:0,y:1}],this.vertices=[{x:-.5,y:-.5},{x:.5,y:-.5},{x:.5,y:.5},{x:-.5,y:.5}])}guid;texture;triangles;uv;vertices;__cached_geometry;get mesh(){return this._mesh||(this._mesh=new H(Ea.getOrCreateGeometry(this),this.material)),this._mesh}_mesh;get material(){return this._material||(this.texture&&B1(this.texture),this._material=new Ce({map:this.texture,color:16777215,side:Ii,transparent:!0})),this._material}_material;getGeometry(){return Ea.getOrCreateGeometry(this)}};Pt([u()],ts.prototype,"guid",2),Pt([u(Se)],ts.prototype,"texture",2),Pt([qe()],ts.prototype,"triangles",2),Pt([qe()],ts.prototype,"uv",2),Pt([qe()],ts.prototype,"vertices",2);const e0=Symbol("spriteOwner");class jl{sprites;constructor(){this.sprites=[]}}Pt([u(ts)],jl.prototype,"sprites",2);const t0=class Ob{static create(){const e=new Ob;return e.spriteSheet=new jl,e}constructor(){}clone(){const e=new Ob;return e.index=this.index,e.spriteSheet=this.spriteSheet,e}set sprite(e){e&&(this.spriteSheet?((this.index===null||this.index===void 0)&&(this.index=0),this.spriteSheet.sprites[this.index]=e):(this.spriteSheet=new jl,this.spriteSheet.sprites=[e],this.index=0))}get sprite(){if(this.spriteSheet)return this.spriteSheet.sprites[this.index]}spriteSheet;index=0;update(e){if(!this.spriteSheet)return;const t=this.index;if(t<0||t>=this.spriteSheet.sprites.length)return;const i=this.spriteSheet.sprites[t],n=i?.texture;if(n&&(B1(n),!i.__hasLoadedProgressive)){i.__hasLoadedProgressive=!0;const s=n;He.assignTextureLOD(n,0).then(r=>{r instanceof Se&&(i.texture=r,e?.map===s&&(e.map=r,e.needsUpdate=!0))})}}};Pt([u(jl)],t0.prototype,"spriteSheet",2),Pt([u()],t0.prototype,"index",2);let Bl=t0;class Si extends E{drawMode=0;size={x:1,y:1};color;sharedMaterial;transparent=!0;cutoutThreshold=0;castShadows=!1;renderOrder=0;toneMapped=!0;set texture(e){if(!this._spriteSheet)return;const t=this._spriteSheet.spriteSheet?.sprites[this.spriteIndex];t&&(t.texture=e,this.updateSprite())}addSprite(e,t=!1){if(this._spriteSheet||(this._spriteSheet=Bl.create()),!this._spriteSheet.spriteSheet)return-1;this._spriteSheet.spriteSheet?.sprites.push(e);const i=this._spriteSheet.spriteSheet?.sprites.length-1;return t&&(this.spriteIndex=i),i}get sprite(){return this._spriteSheet}set sprite(e){if(e!==this._spriteSheet)if(typeof e=="number"){const t=Math.round(e);Mh&&console.log("[SpriteSheet] Set index to "+t+" (was "+this.spriteIndex+")",e),this.spriteIndex=t}else e instanceof ts?(this._spriteSheet||(this._spriteSheet=Bl.create()),this._spriteSheet.sprite!=e&&(this._spriteSheet.sprite=e),this.updateSprite()):e!=this._spriteSheet&&(this._spriteSheet=e,this.updateSprite())}set spriteIndex(e){this._spriteSheet&&(this._spriteSheet.index=e,this.updateSprite())}get spriteIndex(){return this._spriteSheet?.index??0}get spriteFrames(){return this._spriteSheet?.spriteSheet?.sprites.length??0}_spriteSheet;_currentSprite;awake(){this._currentSprite=void 0,this._spriteSheet?this._spriteSheet=this._spriteSheet.clone():this._spriteSheet=Bl.create(),Mh&&console.log("Awake",this.name,this,this.sprite)}start(){this._currentSprite?this.gameObject&&this.gameObject.add(this._currentSprite):this.updateSprite()}updateSprite(e=!1){if(!this.__didAwake&&!e)return!1;const t=this._spriteSheet;if(!t?.spriteSheet?.sprites)return console.warn("SpriteRenderer has no data or spritesheet assigned..."),!1;const i=t.spriteSheet.sprites[this.spriteIndex];if(!i)return Mh&&console.warn("Sprite not found",this.spriteIndex,t.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=Ea.getOrCreateGeometry(i),this._currentSprite.material.map=i.texture;else{const n=new Ce({color:16777215,side:Ii});if(t2&&(n.wireframe=!0),this.color&&(n.color||(n.color=new oe),n.color.copy(this.color),n.opacity=this.color.alpha),n.transparent=!0,n.toneMapped=this.toneMapped,n.depthWrite=!1,i.texture&&!n.wireframe){let s=i.texture;s[e0]!==void 0&&s[e0]!==this&&this.spriteFrames>1&&(s=i.texture=s.clone()),s[e0]=this,n.map=s}this.sharedMaterial=n,this._currentSprite=new H(Ea.getOrCreateGeometry(i),n),this._currentSprite.renderOrder=Math.round(this.renderOrder),He.assignTextureLOD(n,0)}return this._currentSprite.parent!==this.gameObject&&(this.drawMode===2&&this._currentSprite.scale.set(this.size.x,this.size.y,1),this.gameObject&&this.gameObject.add(this._currentSprite)),this._currentSprite&&this._currentSprite.layers.set(this.layer),this.sharedMaterial&&(this.sharedMaterial.alphaTest=this.cutoutThreshold,this.sharedMaterial.transparent=this.transparent),this._currentSprite.castShadow=this.castShadows,t?.update(this.sharedMaterial),!0}}Pt([u()],Si.prototype,"drawMode",2),Pt([u(i2)],Si.prototype,"size",2),Pt([u(se)],Si.prototype,"color",2),Pt([u(we)],Si.prototype,"sharedMaterial",2),Pt([u()],Si.prototype,"transparent",2),Pt([u()],Si.prototype,"cutoutThreshold",2),Pt([u()],Si.prototype,"castShadows",2),Pt([u()],Si.prototype,"renderOrder",2),Pt([u()],Si.prototype,"toneMapped",2),Pt([u(Bl)],Si.prototype,"sprite",1);const F1=w("debugwebxr"),n2=new J().makeRotationY(Math.PI);class xn extends E{static _eventListeners={};static onPlaced(e){const t="placed";return this._eventListeners[t]||(this._eventListeners[t]=[]),this._eventListeners[t].push(e),()=>{const i=this._eventListeners[t].indexOf(e);i>=0&&this._eventListeners[t].splice(i,1)}}static _hasPlaced=!1;static get hasPlaced(){return this._hasPlaced}get arScale(){return this._arScale}set arScale(e){this._arScale=Math.max(1e-6,e),this.onSetScale()}_arScale=1;invertForward=!1;customReticle;arTouchTransform=!0;autoPlace=!1;autoCenter=!1;useXRAnchor=!1;_isPlacing=!0;_startOffset=new J;_createdPlacementObject=null;_reparentedComponents=[];_placementScene=new Ti;_reticle=[];_hits=[];_placementStartTime=-1;_rigPlacementMatrix;_anchor=null;userInput;onEnable(){this.customReticle?.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){F1&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,xn._hasPlaced=!1,this.gameObject.updateMatrixWorld(),this._startOffset.copy(this.gameObject.matrixWorld);const t=new M;this._createdPlacementObject=t,t.name="AR Session Root",this._placementScene.name="AR Placement Scene",this._placementScene.children.length=0;for(let i=this.context.scene.children.length-1;i>=0;i--){const n=this.context.scene.children[i];this._placementScene.add(n)}if(this.context.scene.add(t),this.autoCenter){const i=ui(this._placementScene.children),n=i.getCenter(new b),s=i.getSize(new b),r=new J;r.makeTranslation(n.x,n.y-s.y*.5,n.z),this._startOffset.multiply(r)}this._reparentedComponents.length=0,this._reparentedComponents.push({comp:this,originalObject:this.gameObject}),x.addComponent(t,this);for(const i of this._reticle)Ui(i);this._reticle.length=0,this._isPlacing=!0,this.context.input.addEventListener("pointerup",this.onPlaceScene,{queue:yi.Early})}onLeaveXR(){this.context.input.removeEventListener("pointerup",this.onPlaceScene,{queue:yi.Early}),this.onRevertSceneChanges(),this._anchor=null,xn._hasPlaced=!1,this._rigPlacementMatrix=void 0}onUpdateXR(e){if(e.xr.isTrackingImages){for(const t of this._reticle)t.visible=!1;return}if(this._isPlacing){const t=e.xr.rig?.gameObject;t&&t.parent!==this.context.scene&&this.context.scene.add(t);let i=!1;if(e.xr.isPassThrough&&e.xr.controllers.length>0&&!this.autoPlace)for(const n of e.xr.controllers){const s=n.getHitTest();s&&(i=!0,this.updateReticleAndHits(e.xr,n.index,s,e.xr.rigScale))}if(!i){const n=e.xr.getHitTest();n&&this.updateReticleAndHits(e.xr,0,n,e.xr.rigScale)}}else{if(this._anchor&&e.xr.referenceSpace){const t=e.xr.frame.getPose(this._anchor.anchorSpace,e.xr.referenceSpace);if(t&&this.context.time.frame%20===0){const i=e.xr.convertSpace(t.transform),n=this._reticle[0];n&&(n.position.copy(i.position),n.quaternion.copy(i.quaternion),this.onApplyPose(n))}}if(this.arTouchTransform?(this.userInput||(this.userInput=new jm(this.context)),this.userInput?.enable()):this.userInput?.disable(),this.arTouchTransform&&this.userInput?.hasChanged){if(e.xr.rig){const t=e.xr.rig.gameObject;this.userInput.applyMatrixTo(t.matrix,!0),t.matrix.decompose(t.position,t.quaternion,t.scale),this.userInput.factor=t.scale.x}this.userInput.reset()}}}updateReticleAndHits(e,t,i,n){this._hits[t]=i.hit;let s=this._reticle[t];if(!s){if(this.customReticle)if(this.customReticle.asset)s=Nr(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else s=new H(new cP(.07,.09,32).rotateX(-Math.PI/2),new Ce({side:Ii,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),s.name="AR Placement Reticle";if(F1){const r=new Li(1);r.position.y+=.01,s.add(r)}this._reticle[t]=s,s.matrixAutoUpdate=!1,s.visible=!1}if(s.lastPos=s.lastPos||i.position.clone(),s.lastQuat=s.lastQuat||i.quaternion.clone(),s.position.copy(s.lastPos.lerp(i.position,this.context.time.deltaTime/.1)),s.lastPos.copy(s.position),s.quaternion.copy(s.lastQuat.slerp(i.quaternion,this.context.time.deltaTime/.05)),s.lastQuat.copy(s.quaternion),s.scale.set(n,n,n),this.customReticle&&this.applyViewBasedTransform(s),s.updateMatrix(),s.visible=!0,s.parent!==this.context.scene&&this.context.scene.add(s),this._placementStartTime<0&&(this._placementStartTime=this.context.time.realtimeSinceStartup),this.autoPlace)if(this.upVec.set(0,1,0).applyQuaternion(s.quaternion),this.upVec.dot(F(0,1,0))>.9){let r=s["autoplace:timer"]||0;r>=1?(s.visible=!1,this.onPlaceScene(null)):(r+=this.context.time.deltaTime,s["autoplace:timer"]=r)}else s["autoplace:timer"]=0}onPlaceScene=e=>{if(this._isPlacing==!1||e?.used)return;let t=this._reticle[0];if(!t){console.warn("No reticle to place...");return}if(!t.visible&&!this.autoPlace){console.warn("Reticle is not visible (can not place)");return}if(Z.active?.isTrackingImages){console.warn("Scene Placement is disabled while images are being tracked");return}let i=this._hits[0];if(e&&e.origin instanceof vf){const n=this._reticle[e.origin.index];n&&(t=n,i=this._hits[e.origin.index])}if(e&&(e.stopImmediatePropagation(),e.stopPropagation(),e.use()),this._isPlacing=!1,this.context.input.removeEventListener("pointerup",this.onPlaceScene),this.onRevertSceneChanges(),t.position.copy(t.lastPos),t.quaternion.copy(t.lastQuat),this.onApplyPose(t),xn._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(Z.active,i),this.context.xr)for(const n of this.context.xr.controllers)n.cancelHitTestSource()};onSetScale(){if(!xn._hasPlaced)return;const e=Z.active?.rig?.gameObject;if(e){const t=Z.active?.rigScale||1,i=1/this._arScale*t,n=new J().makeScale(i,i,i).invert();e.matrix.premultiply(n),e.matrix.decompose(e.position,e.quaternion,e.scale)}}onRevertSceneChanges(){for(const e of this._reticle)e&&(e.visible=!1,e?.removeFromParent());this._reticle.length=0;for(let e=this._placementScene.children.length-1;e>=0;e--){const t=this._placementScene.children[e];this.context.scene.add(t)}this._createdPlacementObject?.removeFromParent();for(const e of this._reparentedComponents)x.addComponent(e.originalObject,e.comp)}async onCreateAnchor(e,t){if(t.createAnchor===void 0){console.warn("Hit does not support creating an anchor",t),A()&&be("Hit does not support creating an anchor");return}else{const i=await t.createAnchor(e.viewerPose.transform);e.running&&i&&(this._anchor=i)}}upVec=new b(0,1,0);lookPoint=new b;worldUpVec=new b(0,1,0);applyViewBasedTransform(e){const t=this.context.mainCamera,i=e,n=t.worldPosition,s=i.worldPosition;this.upVec.set(0,1,0).applyQuaternion(e.quaternion);const r=t.worldPosition;r&&e.position.clone().sub(r).angleTo(this.upVec)<Math.PI/2&&this.upVec.negate();const a=this.upVec.angleTo(this.worldUpVec)*180/Math.PI,l=30;a>l&&a<180-l||a<-l&&a>-180+l?(this.lookPoint.copy(e.position).add(this.upVec),this.lookPoint.y=e.position.y,e.lookAt(this.lookPoint)):(n.y=s.y,e.lookAt(n))}onApplyPose(e){const t=Z.active?.rig?.gameObject;if(!t){console.warn("No rig object to place");return}const i=t.parent||this.context.scene;this._rigPlacementMatrix?this._rigPlacementMatrix?.decompose(t.position,t.quaternion,t.scale):this._rigPlacementMatrix=t.matrix.clone(),this.applyViewBasedTransform(e),e.updateMatrix(),this.context.scene.add(e),e.attach(t),e.removeFromParent(),t.scale.set(this.arScale,this.arScale,this.arScale),t.position.multiplyScalar(this.arScale),t.updateMatrix(),this.invertForward&&t.matrix.premultiply(n2),t.matrix.premultiply(this._startOffset),t.matrix.decompose(t.position,t.quaternion,t.scale),i.add(t)}}class jm{static up=new b(0,1,0);static zero=new b(0,0,0);static one=new b(1,1,1);oneFingerDrag=!0;twoFingerRotate=!0;twoFingerScale=!0;factor=1;context;offset;plane;_scale=1;_hasChanged=!1;get scale(){return this._scale}constructor(e){this.context=e,this.offset=new J,this.plane=new wr,this.plane.setFromNormalAndCoplanarPoint(jm.up,jm.zero)}_enabled=!1;reset(){this._scale=1,this.offset.identity(),this._hasChanged=!0}get hasChanged(){return this._hasChanged}applyMatrixTo(e,t){this._hasChanged=!1,t?(this.offset.invert(),e.premultiply(this.offset)):e.multiply(this.offset)}currentlyUsedPointerIds=new Set;currentlyUnusedPointerIds=new Set;get isActive(){return this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.size>0}enable(){this._enabled||(this._enabled=!0,this.context.input.addEventListener("pointerdown",this.onPointerDownEarly,{queue:yi.Early}),this.context.input.addEventListener("pointerdown",this.onPointerDownLate,{queue:yi.Late}),this.context.input.addEventListener("pointerup",this.onPointerUpEarly,{queue:yi.Early}),window.addEventListener("touchstart",this.touchStart,{passive:!1}),window.addEventListener("touchmove",this.touchMove,{passive:!1}),window.addEventListener("touchend",this.touchEnd,{passive:!1}))}disable(){this._enabled&&(this._enabled=!1,this.context.input.removeEventListener("pointerdown",this.onPointerDownEarly,{queue:yi.Early}),this.context.input.removeEventListener("pointerdown",this.onPointerDownLate,{queue:yi.Late}),this.context.input.removeEventListener("pointerup",this.onPointerUpEarly,{queue:yi.Early}),window.removeEventListener("touchstart",this.touchStart),window.removeEventListener("touchmove",this.touchMove),window.removeEventListener("touchend",this.touchEnd))}onPointerDownEarly=e=>{this.isActive&&e.stopPropagation()};onPointerDownLate=e=>{e.used?this.currentlyUsedPointerIds.add(e.pointerId):this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.add(e.pointerId)};onPointerUpEarly=e=>{this.currentlyUsedPointerIds.delete(e.pointerId),this.currentlyUnusedPointerIds.delete(e.pointerId)};prev=new Map;_didMultitouch=!1;touchStart=e=>{if(!e.defaultPrevented)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=I.isAndroidDevice()&&i.clientY<window.innerHeight*.1;this.prev.has(i.identifier)||this.prev.set(i.identifier,{ignore:n,x:0,z:0,screenx:0,screeny:0});const s=this.prev.get(i.identifier);if(s){const r=this.getPositionOnPlane(i.clientX,i.clientY);s.x=r.x,s.z=r.z,s.screenx=i.clientX,s.screeny=i.clientY}}};touchEnd=e=>{e.touches.length<=0&&(this._didMultitouch=!1);for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t];this.prev.delete(i.identifier)}};touchMove=e=>{if(!e.defaultPrevented&&this.isActive){if(e.touches.length===1){if(this._didMultitouch)return;const t=e.touches[0],i=this.prev.get(t.identifier);if(!i||i.ignore)return;const n=this.getPositionOnPlane(t.clientX,t.clientY),s=n.x-i.x,r=n.z-i.z;if(s===0&&r===0)return;this.oneFingerDrag&&this.addMovement(s,r),i.x=n.x,i.z=n.z,i.screenx=t.clientX,i.screeny=t.clientY;return}else if(e.touches.length===2){this._didMultitouch=!0;const t=e.touches[0],i=e.touches[1],n=this.prev.get(t.identifier),s=this.prev.get(i.identifier);if(!n||!s)return;if(this.twoFingerRotate){const r=Math.atan2(t.clientY-i.clientY,t.clientX-i.clientX),a=Math.atan2(n.screeny-s.screeny,n.screenx-s.screenx),l=r-a;Math.abs(l)>.001&&this.addRotation(l)}if(this.twoFingerScale){const r=t.clientX-i.clientX,a=t.clientY-i.clientY,l=Math.sqrt(r*r+a*a),c=n.screenx-s.screenx,h=n.screeny-s.screeny,d=Math.sqrt(c*c+h*h),p=l-d;Math.abs(p)>2&&this.addScale(p)}n.screenx=t.clientX,n.screeny=t.clientY,s.screenx=i.clientX,s.screeny=i.clientY}}};_raycaster=new Nd;_intersection=new b;_screenPos=new b;getPositionOnPlane(e,t){const i=this.context.mainCamera;return this._screenPos.x=e/window.innerWidth*2-1,this._screenPos.y=-(t/window.innerHeight)*2+1,this._screenPos.z=1,this._screenPos.unproject(i),this._raycaster.set(i.position,this._screenPos.sub(i.position)),this._raycaster.ray.intersectPlane(this.plane,this._intersection),this._intersection}addMovement(e,t){e/=this._scale,t/=this._scale,e*=this.factor,t*=this.factor,this.offset.elements[12]+=e,this.offset.elements[14]+=t,(e!==0||t!==0)&&(this._hasChanged=!0)}_tempMatrix=new J;addScale(e){e/=window.innerWidth,e*=-1,this._scale*=1+e,this._tempMatrix.makeScale(1-e,1-e,1-e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}addRotation(e){e*=-1,this._tempMatrix.makeRotationY(e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}}var o2=Object.defineProperty,Fp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&o2(e,t,n),n};const Xt=w("debugplayersync"),Up=class tC extends E{static async setupFrom(e,t){let i;if(typeof e=="string"){if(i=ne.getOrCreateFromUrl(e),!i.asset){const r=await i.loadAssetAsync();r&&x.getOrAddComponent(r,Ci)}}else{const r=t?.guid??e.guid??e.name??e.uuid;e.guid||(e.guid=r),i=new ne({asset:e}),x.getOrAddComponent(e,Ci)}const n=new tC;n._internalInit(t),n.asset=i;const s=new M;return s.guid=t?.guid??(typeof e=="string"?e:e.guid||e.name||e.uuid),x.addComponent(s,n),n}autoSync=!0;asset;onPlayerSpawned;_localInstance;_unsubSyncInstantiate;constructor(){super(),this.onPlayerSpawned=new ae}awake(){this.watchTabVisible()}onEnable(){this.context.connection.beginListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.destroyInstance),this._unsubSyncInstantiate=Pv((e,t)=>{const i=this.asset?.asset?.guid;!i||t.originalGuid!==i||x.getComponentsInChildren(e,Ci)?.length&&(Xt&&console.log("PlayerSync: remote player spawned",e.name),this.onPlayerSpawned?.invoke(e))}),this.context.connection.isInRoom&&this.onJoinedRoom()}onDisable(){this.context.connection.stopListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.destroyInstance),this._unsubSyncInstantiate?.()}onJoinedRoom=()=>{Xt&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()};async getInstance(){if(this._localInstance)return this._localInstance;if(Xt&&console.log("PlayerSync.createInstance",this.asset?.url),!this.asset?.asset&&!this.asset?.url)return console.error('PlayerSync: can not create an instance because "asset" is not set and or has no URL!'),null;this.gameObject.guid||console.warn("PlayerSync: gameObject has no guid! This might cause issues with syncing the player state."),this._localInstance=this.asset?.instantiateSynced({parent:this.gameObject,deleteOnDisconnect:!0},!0);const e=await this._localInstance;if(e){const t=x.getComponentsInChildren(e,Ci);if(Xt&&console.log(`PlayerSync.createInstance: found ${t?.length} PlayerState components. Owner: ${this.context.connection.connectionId}`),t?.length){for(const i of t)i.owner=this.context.connection.connectionId;this.onPlayerSpawned?.invoke(e)}else this._localInstance=void 0,console.error("<strong>Failed finding PlayerState on "+this.asset?.url+"</strong>: please make sure the asset has a PlayerState component!"),x.destroySynced(e)}else this._localInstance=void 0,console.warn("PlayerSync: failed instantiating asset!");return this._localInstance}destroyInstance=()=>{this._localInstance?.then(e=>{Xt&&console.log("PlayerSync.destroyInstance",e),Ac(e,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0};watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=Ci.all.length-1;t>=0;t--){const i=Ci.all[t];(!i.owner||!this.context.connection.userIsInRoom(i.owner))&&i.doDestroy()}})}};Fp([u()],Up.prototype,"autoSync"),Fp([u(ne)],Up.prototype,"asset"),Fp([u(ae)],Up.prototype,"onPlayerSpawned");let i0=Up;var U1=(o=>(o.OwnerChanged="ownerChanged",o))(U1||{});const n0=class Bt extends E{static _all=[];static get all(){return Bt._all}static _local=[];static get local(){return Bt._local}static getFor(e){if(e instanceof M)return x.getComponentInParent(e,Bt);if(e instanceof E)return x.getComponentInParent(e.gameObject,Bt)}static isLocalPlayer(e){return Bt.getFor(e)?.isLocalPlayer??!1}static _callbacks={};static addEventListener(e,t){return this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t),t}static removeEventListener(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i>=0&&this._callbacks[e].splice(i,1)}static dispatchEvent(e,t){if(this._callbacks[e])for(const i of this._callbacks[e])i(t)}onOwnerChangeEvent=new ae;onFirstOwnerChangeEvent=new ae;hasOwner=!1;owner;dontDestroy=!1;get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(e,t){Xt&&console.log(`PlayerSync.onOwnerChange: ${t} \u2192 ${e} (me: ${this.context.connection.connectionId})`);const i=Bt._local.indexOf(this);i>=0&&Bt._local.splice(i,1);const n={playerState:this,oldValue:t,newValue:e};if(this.hasOwner||(this.hasOwner=!0,this.onFirstOwnerChangeEvent?.invoke(n)),this.onOwnerChangeEvent?.invoke(n),this.owner===this.context.connection.connectionId){Bt._local.push(this);const r=new CustomEvent("local-owner-changed",{detail:n});this.dispatchEvent(r)}const s=new CustomEvent("owner-changed",{detail:n});this.dispatchEvent(s),Bt.dispatchEvent("ownerChanged",s)}awake(){Bt.all.push(this),Xt&&console.log("Registered new PlayerState",this.guid,Bt.all.length-1,Bt.all),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeftRoom)}async start(){Xt&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await Bo(300),this.context.connection.userIsInRoom(this.owner)==!1&&(Xt&&console.log(`PlayerSync.start \u2192 doDestroy "${this.name}" because user "${this.owner}" is not in room anymore...`,"Currently in room:",...this.context.connection.usersInRoom()),this.doDestroy())):this.owner||(Xt&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?Xt&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(Xt&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):Xt&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){Xt&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),Ac(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(Xt&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeftRoom),Bt.all.splice(Bt.all.indexOf(this),1),this.isLocalPlayer){const e=Bt._local.indexOf(this);e>=0&&Bt._local.splice(e,1)}}onUserLeftRoom=e=>{if(e.userId===this.owner){Xt&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}}};Fp([sy(n0.prototype.onOwnerChange)],n0.prototype,"owner");let Ci=n0;var s2=Object.defineProperty,Fl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&s2(e,t,n),n};class yo extends E{position="bottom";showNeedleLogo=!1;showSpatialMenu;createFullscreenButton;createMuteButton;createQRCodeButton;onEnable(){this.applyOptions()}applyOptions(){this.context.menu.setPosition(this.position),this.context.menu.showNeedleLogo(this.showNeedleLogo),this.createFullscreenButton===!0&&this.context.menu.showFullscreenOption(!0),this.createMuteButton===!0&&this.context.menu.showAudioPlaybackOption(!0),this.showSpatialMenu===!0&&this.context.menu.showSpatialMenu(this.showSpatialMenu),this.createQRCodeButton===!0&&(I.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}Fl([u()],yo.prototype,"position"),Fl([u()],yo.prototype,"showNeedleLogo"),Fl([u()],yo.prototype,"showSpatialMenu"),Fl([u()],yo.prototype,"createFullscreenButton"),Fl([u()],yo.prototype,"createMuteButton"),Fl([u()],yo.prototype,"createQRCodeButton");var r2=Object.defineProperty,o0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&r2(e,t,n),n};const Eh=w("debugwebxr"),z1=new N().setFromAxisAngle(new b(0,1,0),Math.PI);class Hs extends E{head;leftHand;rightHand;_leftHandMeshes;_rightHandMeshes;_syncTransforms;async onEnterXR(e){if(!this.activeAndEnabled)return;Eh&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=Ci.getFor(this);if(t?.owner){const i=this.gameObject.addComponent(Le);i.avatar=this.gameObject,i.connectionId=t.owner,this.context.players.setPlayerView(t.owner,this.head?.asset,No.Headset)}else this.context.connection.isConnected?console.error("No player state found for avatar",this):t&&!this.context.connection.isConnected&&(t.dontDestroy=!0)}onLeaveXR(e){const t=this.gameObject.getComponent(Le);t&&t.destroy()}onUpdateXR(e){if(!this.activeAndEnabled)return;const t=Ci.isLocalPlayer(this);if(!t)return;const i=e.xr;if(i.rig&&i.rig.gameObject!==this.gameObject.parent&&(this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),this.gameObject.scale.set(1,1,1),i.rig.gameObject.add(this.gameObject)),this._syncTransforms&&t)for(const l of this._syncTransforms)l.fastMode=!0,l.isOwned()||l.requestOwnership();if(this.head&&this.context.mainCamera){const l=this.head.asset;if(l.position.copy(this.context.mainCamera.position),l.position.x*=-1,l.position.z*=-1,l.quaternion.copy(this.context.mainCamera.quaternion),l.quaternion.x*=-1,this.context.time.frameCount%10===0&&this.head.asset){const c=x.getComponentsInChildren(this.head.asset,cn);for(const h of c)h.enabled=!1,h.gameObject.visible=!1}}const n=e.xr.leftController,s=this.leftHand?.asset;n&&s?(s.position.copy(n.gripPosition),s.quaternion.copy(n.gripQuaternion),s.quaternion.multiply(z1),s.visible=n.isTracking,this.updateHandVisibility(n,s,this._leftHandMeshes)):s&&s.visible&&(s.visible=!1);const r=e.xr.rightController,a=this.rightHand?.asset;r&&a?(a.position.copy(r.gripPosition),a.quaternion.copy(r.gripQuaternion),a.quaternion.multiply(z1),a.visible=r.isTracking,this.updateHandVisibility(r,a,this._rightHandMeshes)):a&&a.visible&&(a.visible=!1)}onBeforeRender(){this.context.xr&&this.context.time.frame%10===0&&this.updateRemoteAvatarVisibility()}updateHandVisibility(e,t,i){if(i){const n=e.model&&e.model.visible&&e.model!==t;i.forEach(s=>{Yo(s,!n)})}}updateRemoteAvatarVisibility(){if(this.context.connection.isConnected){const e=Ci.getFor(this);if(e&&e.isLocalPlayer==!1){const t=Z.getXRSync(this.context);if(t&&t.hasState(e.owner)){this.tryFindAvatarObjectsIfMissing();const i=this.leftHand?.asset;i&&(i.visible=t?.isTracking(e.owner,"left")??!1);const n=this.rightHand?.asset;n&&(n.visible=t?.isTracking(e.owner,"right")??!1)}if(this.head?.asset){const i=x.getComponentsInChildren(this.head.asset,cn);for(const n of i)n.enabled=!1,n.gameObject.visible=!0}}}}tryFindAvatarObjectsIfMissing(){if(!this.head||!this.leftHand||!this.rightHand){const e={head:this.head,leftHand:this.leftHand,rightHand:this.rightHand};Mw.tryFindAvatarObjects(this.gameObject,this.sourceId||"",e),e.head&&(this.head=e.head),e.leftHand&&(this.leftHand=e.leftHand),e.rightHand&&(this.rightHand=e.rightHand)}}async prepareAvatar(){if(this.tryFindAvatarObjectsIfMissing(),this.head)this.head instanceof M&&(this.head=new ne("",this.sourceId,this.head));else{const e=new M;e.name="Head";const t=Rs.createPrimitive(Za.Cube);e.add(t),this.gameObject.add(e),this.head=new ne("",this.sourceId,e),Eh&&console.log("Create head",e)}if(this.rightHand)this.rightHand instanceof M&&(this.rightHand=new ne("",this.sourceId,this.rightHand));else{const e=new M;e.name="Right Hand",this.gameObject.add(e),this.rightHand=new ne("",this.sourceId,e),Eh&&console.log("Create right hand",e)}if(this.leftHand)this.leftHand instanceof M&&(this.leftHand=new ne("",this.sourceId,this.leftHand));else{const e=new M;e.name="Left Hand",this.gameObject.add(e),this.leftHand=new ne("",this.sourceId,e),Eh&&console.log("Create left hand",e)}await this.loadAvatarObjects(this.head,this.leftHand,this.rightHand),this._leftHandMeshes=[],this.leftHand.asset?.traverse(e=>{e?.isMesh&&this._leftHandMeshes.push(e)}),this._rightHandMeshes=[],this.rightHand.asset?.traverse(e=>{e?.isMesh&&this._rightHandMeshes.push(e)}),Ci.isLocalPlayer(this.gameObject)&&(this._syncTransforms=x.getComponentsInChildren(this.gameObject,Ln))}async loadAvatarObjects(e,t,i){const n=e.loadAssetAsync(),s=t.loadAssetAsync(),r=i.loadAssetAsync(),a=new Array;n&&a.push(n),s&&a.push(s),r&&a.push(r);const l=await hg(a);Eh&&console.log("Avatar loaded results:",l)}}o0([u(ne)],Hs.prototype,"head"),o0([u(ne)],Hs.prototype,"leftHand"),o0([u(ne)],Hs.prototype,"rightHand");const a2=w("debugdecoders");let s0=null;function N1(){if(!s0){const o=Qm(null);s0={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return s0}function W1(o){o!==void 0&&typeof o=="string"&&CP(o)}function V1(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=N1();a2&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function $1(o){o!==void 0&&typeof o=="string"&&SP(o)}function r0(o,e){const t=N1();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),PP(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),OP(o,{progressive:!0}),o}var l2=Object.defineProperty,zp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&l2(e,t,n),n};const Gs=w("debugwebxr"),qs=new Array;class is extends E{createControllerModel=!0;createHandModel=!0;customLeftHand;customRightHand;static factory=new jP;supportsXR(e){return e==="immersive-vr"||e==="immersive-ar"}_models=new Array;async onXRControllerAdded(e){if(!(e.xr.isVR||e.xr.isPassThrough))return;console.debug("XR Controller Added",e.controller.side,e.controller.index);const{controller:t}=e;if(this.createControllerModel||this.createHandModel){if(t.hand){if(this.createHandModel){const i=await this.loadHandModel(this,t);if(!i||!t.connected||!t.isHand){i?.handObject&&hl(i.handObject,!1),i?.handObject?.destroy();return}this._models.push({controller:t,model:i.handObject,handmesh:i.handmesh}),this._models.sort((n,s)=>n.controller.index-s.controller.index),this.scene.add(i.handObject),t.model=i.handObject}}else if(this.createControllerModel){const i=await t.getModelUrl();if(i){const n=await this.loadModel(t,i);if(!n||!t.connected||t.isHand)return;this._models.push({controller:t,model:n}),this._models.sort((s,r)=>s.controller.index-r.controller.index),this.scene.add(n),n.traverse(s=>{s.layers.set(2),s.matrixAutoUpdate=!1,s.updateMatrix()}),t.model=n}else t.targetRayMode!=="transient-pointer"&&console.warn("XRControllerModel: no model found for "+t.side)}}}onXRControllerRemoved(e){console.debug("XR Controller Removed",e.controller.side,e.controller.index);const t=this._models.findIndex(n=>n.controller===e.controller),i=this._models[t];i&&(this._models.splice(t,1),i.model&&(hl(i.model,!1),i.model.destroy(),i.model=void 0))}onBeforeXR(e,t){this.createHandModel&&(this.customLeftHand||this.customRightHand)&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("hand-tracking")||t.optionalFeatures.push("hand-tracking"))}onLeaveXR(e){for(const t of this._models)t&&(t.model&&(hl(t.model,!1),t.model.destroy(),t.model=void 0),t.controller.model===t.model&&(t.controller.model=null));this._models.length=0}onBeforeRender(){if(Z.active&&(Gs&&(qs[0]=Date.now()),this.updateRendering(Z.active),Gs)){const e=Date.now()-qs[0];qs.push(e),qs.length>=30&&(qs[0]=0,qs.reduce((t,i)=>t+i,0)/qs.length,qs.length=0)}}updateRendering(e){for(let t=0;t<this._models.length;t++){const i=this._models[t];if(!i)continue;const n=i.controller;if(!n.connected){Gs&&console.warn("XRControllerModel.onUpdateXR: controller is not connected anymore",n.side,n.hand);continue}if(i.model&&!i.handmesh)i.model.matrixAutoUpdate=!1,i.model.matrix.copy(n.gripMatrix),i.model.visible=n.isTracking,e.rig?.gameObject.add(i.model);else if(n.inputSource.hand&&i.handmesh){const s=e.referenceSpace,r=this.context.renderer.xr.getHand(n.index);if(s&&e.frame.getJointPose){for(const a of n.inputSource.hand.values()){const l=r.joints[a.jointName];if(l){const c=n.getHandJointPose(a);if(c){const h=c.transform.position,d=c.transform.orientation;l.position.copy(h),l.quaternion.copy(d),l.matrixAutoUpdate=!1}l.visible=c!=null}}i.model&&(i.model.visible=n.isTracking,i.model.visible&&i.model.parent!==e.rig?.gameObject&&e.rig?.gameObject.add(i.model)),i.model?.visible&&(i.handmesh?.updateMesh(),i.model.matrixAutoUpdate=!1,i.model.matrix.identity(),i.model.applyMatrix4(al))}}}}async loadModel(e,t){if(!e.connected)return console.warn("XRControllerModel.onXRControllerAdded: controller is not connected anymore",e.side),null;const i=await ne.getOrCreate("",t).instantiate();return hl(i),Z.active?.isPassThrough&&i.traverseVisible(n=>{this.makeOccluder(n)}),i}async loadHandModel(e,t){const i=this.context,n=i.renderer.xr.getHand(t.index);n||(Gs?B.DrawLabel(t.rayWorldPosition,"No hand found for index "+t.index,.05,5):console.warn("No hand found for index "+t.index));const s=new Do;r0(s,i),await wp(s,i,this.sourceId??"",this.sourceId??"");const r=My(s);let a="";const l=t.side==="left"?this.customLeftHand:this.customRightHand;l?(a=l.url.split(".").slice(0,-1).join("."),s.setPath("")):(a=t.inputSource.handedness==="left"?"left":"right",s.setPath("https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/"));const c=new M;hl(c);const h=new BP(c,n,s.path,a,s,d=>{const p=r?.gltf;p?.scene.children?.length===0&&(p.scene.children[0]=d),r?.gltf&&Mn().createBuiltinComponents(e.context,e.sourceId||a,r.gltf,null,r),d.traverse(m=>{m.layers.set(2),Z.active?.isPassThrough&&!l&&this.makeOccluder(m),m instanceof H&&He.assignMeshLOD(m,0)}),t.connected||(Gs&&B.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),d.removeFromParent())});if(Gs&&c.add(new Li(.5)),t.inputSource.hand){Gs&&console.log(t.inputSource.hand);for(const d of t.inputSource.hand.values())if(n.joints[d.jointName]===void 0){const p=new Mo;p.matrixAutoUpdate=!1,p.visible=!0,n.joints[d.jointName]=p,n.add(p)}}else Gs&&B.DrawLabel(t.rayWorldPosition,"No inputSource.hand found for index "+t.index,.05,5);return{handObject:c,handmesh:h}}makeOccluder(e){if(e instanceof H){let t=e.material;t instanceof we&&(t=e.material=t.clone(),t.depthWrite=!0,t.depthTest=!0,t.colorWrite=!1,e.receiveShadow=!1,e.renderOrder=-100)}}}zp([u()],is.prototype,"createControllerModel"),zp([u()],is.prototype,"createHandModel"),zp([u(ne)],is.prototype,"customLeftHand"),zp([u(ne)],is.prototype,"customRightHand");class Np extends E{}var c2=Object.defineProperty,Xs=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&c2(e,t,n),n};const a0=w("debugwebxr");class $i extends E{movementSpeed=1.5;rotationStep=30;useTeleport=!0;usePinchToTeleport=!0;useTeleportTarget=!1;useTeleportFade=!1;showRays=!0;showHits=!0;isXRMovementHandler=!0;xrSessionMode="immersive-vr";_didApplyRotation=!1;_didTeleport=!1;onUpdateXR(e){const t=e.xr.rig;if(!t?.gameObject||e.xr.isPassThrough)return;const i=e.xr.leftController,n=e.xr.rightController;i&&this.onHandleMovement(i,t.gameObject),n&&(this.onHandleRotation(n,t.gameObject),this.useTeleport&&this.onHandleTeleport(n,t.gameObject))}onLeaveXR(e){for(const t of this._lines)t.removeFromParent();for(const t of this._hitDiscs)t?.removeFromParent()}onBeforeRender(){this.context.xr?.running&&(this.showRays&&this.renderRays(this.context.xr),this.showHits&&this.renderHits(this.context.xr))}onHandleMovement(e,t){const i=e.getStick("xr-standard-thumbstick");if(i.x!=0||i.y!=0){const n=F(i.x,0,i.y);n.multiplyScalar(this.context.time.deltaTimeUnscaled*this.movementSpeed);const s=Ge(t);n.multiplyScalar(s.x),n.applyQuaternion(e.xr.poseOrientation),n.y=0,n.applyQuaternion(t.worldQuaternion),A()&&Number.isNaN(n.x)&&console.error("Stick movement resulted in NaN",{stick:i,vec:n}),t.position.add(n),t.updateWorldMatrix(!1,!1);for(const r of t.children)r.updateWorldMatrix(!1,!1)}}onHandleRotation(e,t){if(e._isMxInk)return;const i=e.getStick("xr-standard-thumbstick").x;if(this._didApplyRotation)Math.abs(i)<.3&&(this._didApplyRotation=!1);else if(Math.abs(i)>.5){this._didApplyRotation=!0;const n=i>0?1:-1,s=ee(this.context.mainCamera).clone();t.rotateY(n*D.toRadians(this.rotationStep));const r=ee(this.context.mainCamera).clone().sub(s);r.y=0,t.position.sub(r)}}_teleportBuffer=new Array;onHandleTeleport(e,t){let i=0;if(e.hand&&this.usePinchToTeleport&&e.isTeleportGesture){const n=e.getPointerId("primary");if(n!=null&&this.context.input.getIsPointerIdInUse(n))return;const s=e.getGesture("pinch");s&&(i=s.value)}else i=e.getStick("xr-standard-thumbstick")?.y;if(this._didTeleport)i>=0&&i<.4?this._didTeleport=!1:i<0&&i>-.4&&(this._didTeleport=!1);else if(i>.8){this._didTeleport=!0;const n=this.context.physics.raycastFromRay(e.ray)[0];if(n&&n.object instanceof Fa){const r=n.normal?.dot(F(0,1,0));if(r!==void 0&&r<.4)return}let s=n?.point;if(!s&&!this.useTeleportTarget){this._plane||(this._plane=new wr(new b(0,1,0),0));const r=t.worldPosition;this._plane.setFromNormalAndCoplanarPoint(new b(0,1,0),r);const a=e.ray;s=r.clone(),this._plane.intersectLine(new hP(a.origin,F(a.direction).multiplyScalar(1e4).add(a.origin)),s),s.distanceTo(r)>t.scale.x*10&&(s=null)}if(s){if(this.useTeleportTarget&&!x.getComponentInParent(n.object,Np))return;const r=s.clone();if(a0&&B.DrawSphere(s,.025,16711680,5),this.context.mainCamera?.position){const a=this.context.xr?.getUserOffsetInRig();a&&(a.y=0,r.sub(a),a0&&B.DrawWireSphere(a.add(r),.025,65280,5))}this._teleportBuffer.push(t.matrix.clone()),this._teleportBuffer.length>10&&this._teleportBuffer.shift(),this.useTeleportFade?e.xr.fadeTransition()?.then(()=>{t.worldPosition=r}):t.worldPosition=r}}else if(i<-.8&&(this._didTeleport=!0,this._teleportBuffer.length>0)){const n=this._teleportBuffer.pop();n&&n.decompose(t.position,t.quaternion,t.scale)}}_plane=null;_lines=[];_hitDiscs=[];_hitDistances=[];_lastHitDistances=[];renderRays(e){for(let t=0;t<this._lines.length;t++){const i=this._lines[t];i&&(i.visible=!1)}for(let t=0;t<e.controllers.length;t++){const i=e.controllers[t];let n=this._lines[t];if(!i.connected||!i.isTracking||!i.ray||i.targetRayMode==="transient-pointer"||!i.hasSelectEvent){n&&(n.visible=!1);continue}n||(n=this.createRayLineObject(),n.scale.z=.5,this._lines[t]=n),i.updateRayWorldPosition(),i.updateRayWorldQuaternion();const s=i.rayWorldPosition,r=i.rayWorldQuaternion;n.position.copy(s),n.quaternion.copy(r);const a=e.rigScale,l=this.usePinchToTeleport&&i.isTeleportGesture,c=this._lastHitDistances[t],h=this._hitDistances[t]!=null,d=c??a;n.scale.set(a,a,d),n.visible=!0,n.layers.disableAll(),n.layers.enable(2);let p=n.material.opacity;l?p=1:this.showHits&&d<e.rigScale*.5?p=0:i.getButton("primary")?.pressed?p=.5:p=h?.2:.1,n.material.opacity=D.lerp(n.material.opacity,p,this.context.time.deltaTimeUnscaled/.1),n.parent!==this.context.scene&&this.context.scene.add(n)}}renderHits(e){for(const t of this._hitDiscs){if(!t)continue;const i=t.controller;if(!i||!i.connected||!i.isTracking){t.visible=!1;continue}}for(let t=0;t<e.controllers.length;t++){const i=e.controllers[t];if(!i.connected||!i.isTracking||!i.ray||!i.hasSelectEvent)continue;let n=this._hitDiscs[t],s=!0;const r=i.getPointerId("primary");r!=null&&this.context.input.getIsPointerIdInUse(r)&&(n&&(n.visible=!1),this._hitDistances[t]=null,this._lastHitDistances[t]=0,s=!1);const a=this.context.time.smoothedFps>=59?1:10;if((this.context.time.frame+i.index)%a!==0&&(s=!1),!s){const h=this._hitDiscs[t];h&&h.visible&&h.hit&&this.updateHitPointerPosition(i,h,h.hit.distance);continue}const l=this.context.physics.raycastFromRay(i.ray,{testObject:this.hitPointRaycastFilter,precise:!1});let c=l.find(h=>this.usePinchToTeleport&&i.isTeleportGesture?!0:this.isObjectWithInteractiveComponent(h.object));if(c||(c=l[0]),n&&(n.controller=i,n.hit=c),this._hitDistances[t]=c?.distance||null,c){this._lastHitDistances[t]=c.distance;const h=e.rigScale??1;a0&&(B.DrawWireSphere(c.point,.025*h,16711680),B.DrawLabel(F(0,.2,0).add(c.point),c.object.name,.02,0)),n||(n=this.createHitPointObject(),this._hitDiscs[t]=n),n.hit=c,n.visible=c.distance>h*.05;let d=.01*(h+c.distance);const p=i.getButton("primary")?.pressed;p&&(d*=1.1),n.scale.set(d,d,d),n.layers.set(2);let m=n.material.opacity;if(p?m=1:m=c.distance<.15*h?.2:.6,n.material.opacity=D.lerp(n.material.opacity,m,this.context.time.deltaTimeUnscaled/.1),n.visible){if(c.normal){this.updateHitPointerPosition(i,n,c.distance);const f=c.normal.applyQuaternion(_e(c.object));n.quaternion.setFromUnitVectors(h2,f)}else this.updateHitPointerPosition(i,n,c.distance);n.parent!==this.context.scene&&this.context.scene.add(n)}}else this._hitDiscs[t]&&(this._hitDiscs[t].visible=!1)}}isObjectWithInteractiveComponent(e,t=0){return Yu(e)||e.isUI===!0?!0:e.isScene?!1:e.parent?this.isObjectWithInteractiveComponent(e.parent,t+1):!1}updateHitPointerPosition(e,t,i){const n=F(e.rayWorldPosition);n.add(F(0,0,i-.01).applyQuaternion(e.rayWorldQuaternion)),t.position.lerp(n,this.context.time.deltaTimeUnscaled/.05)}hitPointRaycastFilter=e=>e.type==="SkinnedMesh"?"continue in children":!0;createHitPointObject(){const e=new H(new Id(.3,6,6),new Ce({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:Ii}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new FP;e.layers.disableAll(),e.layers.enable(2);const t=new UP;e.geometry=t;const i=new Float32Array(9);i.set([0,0,.02,0,0,.4,0,0,1]),t.setPositions(i);const n=new Float32Array(9);n.set([1,1,1,.1,.1,.1,0,0,0]),t.setColors(n);const s=new zP({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:$b,dashed:!1});return e.material=s,e}}Xs([u()],$i.prototype,"movementSpeed"),Xs([u()],$i.prototype,"rotationStep"),Xs([u()],$i.prototype,"useTeleport"),Xs([u()],$i.prototype,"usePinchToTeleport"),Xs([u()],$i.prototype,"useTeleportTarget"),Xs([u()],$i.prototype,"useTeleportFade"),Xs([u()],$i.prototype,"showRays"),Xs([u()],$i.prototype,"showHits");const h2=new b(0,1,0);var d2=Object.defineProperty,Ot=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&d2(e,t,n),n};const Rh=w("debugwebxr"),u2=w("debugusdz"),ut=class cc extends E{createVRButton=!0;createARButton=!0;createSendToQuestButton=!0;createQRCode=!0;useDefaultControls=!0;showControllerModels=!0;showHandModels=!0;usePlacementReticle=!0;customARPlacementReticle;usePlacementAdjustment=!0;arScale=1;useXRAnchor=!1;autoPlace=!1;autoCenter=!1;useQuicklookExport=!1;useDepthSensing=!1;useSpatialGrab=!0;defaultAvatar;_playerSync;_createdComponentsInSession=[];_usdzExporter;static activeWebXRComponent=null;awake(){Z.getXRSync(this.context)}onEnable(){window.location.protocol!=="https:"&&be('<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API" target="_blank">WebXR</a> only works on secure connections (https).'),navigator.xr?.isSessionSupported("immersive-ar").catch(()=>!1).then(e=>{const t=I.isVisionOS()&&!e;(this.useQuicklookExport||t)&&(x.findObjectOfType(_o)||(Rh&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=x.addComponent(this.gameObject,_o),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0))}),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(Rh&&console.warn("WebXR: No default avatar set, using static default avatar"),this.defaultAvatar=new ne("https://cdn.needle.tools/static/avatars/DefaultAvatar.glb")),this.defaultAvatar&&(this._playerSync=this.gameObject.getOrAddComponent(i0),this._playerSync.autoSync=!1),this._playerSync&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,this._playerSync.onPlayerSpawned?.removeEventListener(this.onAvatarSpawned),this._playerSync.onPlayerSpawned?.addEventListener(this.onAvatarSpawned))}onDisable(){this._usdzExporter?.destroy(),this.removeButtons()}async handleOfferSession(){return this.createVRButton&&await Z.isVRSupported()&&this.createVRButton?Z.offerSession("immersive-vr","default",this.context):this.createARButton&&await Z.isARSupported()&&this.createARButton?Z.offerSession("immersive-ar","default",this.context):!1}get session(){return Z.active??null}get sessionMode(){return Z.activeMode??null}get arSessionRoot(){return this._activeWebARSessionRoot}async enterVR(e){return Z.start("immersive-vr",e,this.context)}async enterAR(e){return Z.start("immersive-ar",e,this.context)}exitXR(){Z.stop()}_exitXRMenuButton;_previousXRState=0;_spatialGrabRaycaster;_activeWebARSessionRoot=null;get isActiveWebXR(){return!cc.activeWebXRComponent||cc.activeWebXRComponent===this}onBeforeXR(e,t){if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${cc.activeWebXRComponent?.name}). This is ignored: ${this.name}`);return}if(this.activeAndEnabled===!1||this.destroyed){console.debug("[WebXR] onBeforeXR called on disabled or destroyed component");return}cc.activeWebXRComponent=this,e=="immersive-ar"&&this.useDepthSensing&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("depth-sensing"))}async onEnterXR(e){if(!this.isActiveWebXR)return;Rh&&console.log("WebXR onEnterXR"),this._previousXRState=li.Global.Mask;const t=e.xr.isVR;if(li.Global.Set(t?ho.VR:ho.AR),e.xr.isAR){let i=x.findObjectOfType(xn,this.context,!1);if(!i)if(this.usePlacementReticle){const n=new M;for(const s of this.context.scene.children)n.add(s);this.context.scene.add(n),i=x.addComponent(n,xn),this._createdComponentsInSession.push(i)}else(Rh||A())&&console.warn("WebXR: No WebARSessionRoot found in scene and usePlacementReticle is disabled in WebXR component.");this._activeWebARSessionRoot=i,i&&(i.customReticle=this.customARPlacementReticle,i.arScale=this.arScale,i.arTouchTransform=this.usePlacementAdjustment,i.autoPlace=this.autoPlace,i.autoCenter=this.autoCenter,i.useXRAnchor=this.useXRAnchor)}this.useDefaultControls&&this.setDefaultMovementEnabled(!0),(this.showControllerModels||this.showHandModels)&&this.setDefaultControllerRenderingEnabled(!0),this.useSpatialGrab&&(this._spatialGrabRaycaster=x.findObjectOfType(Oa)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(Oa))),this.createLocalAvatar(e.xr),e.xr.isScreenBasedAR||(this._exitXRMenuButton=this.context.menu.appendChild({label:"Quit XR",onClick:()=>this.exitXR(),icon:"exit_to_app",priority:2e4}))}onUpdateXR(e){this.isActiveWebXR&&this._spatialGrabRaycaster&&(this._spatialGrabRaycaster.enabled=this.useSpatialGrab)}onLeaveXR(e){if(this._exitXRMenuButton?.remove(),!!this.isActiveWebXR){li.Global.Set(this._previousXRState),this._playerSync?.destroyInstance();for(const t of this._createdComponentsInSession)t.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),wc(1).then(()=>cc.activeWebXRComponent=null)}}setDefaultMovementEnabled(e){let t=this.gameObject.getComponent($i);return!t&&e&&(t=this.gameObject.addComponent($i),this._createdComponentsInSession.push(t)),t&&(t.enabled=e),t}setDefaultControllerRenderingEnabled(e){let t=this.gameObject.getComponent(is);return!t&&e&&(t=this.gameObject.addComponent(is),this._createdComponentsInSession.push(t),t.createControllerModel=this.showControllerModels,t.createHandModel==this.showHandModels),t&&(t.enabled=e),t}async createLocalAvatar(e){this._playerSync&&e.running&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,await this._playerSync.getInstance())}onAvatarSpawned=e=>{Rh&&console.log("WebXR.onAvatarSpawned",e);let t=x.getComponentInChildren(e,Hs);t??=x.addComponent(e,Hs)};getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=mr.getOrCreate()),this._buttonFactory}_buttonFactory;handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((I.isiOS()&&I.isSafari()||u2)&&this.useQuicklookExport){const e=x.findObjectOfType(_o);if(!e||e&&e.allowCreateQuicklookButton){const t=this.getButtonsFactory().createQuicklookButton();this.addButton(t)}}if(this.createARButton){const e=this.getButtonsFactory().createARButton();this.addButton(e)}if(this.createVRButton){const e=this.getButtonsFactory().createVRButton();this.addButton(e)}}if(this.createSendToQuestButton&&!I.isQuest()&&Z.isVRSupported().then(e=>{if(!e){const t=this.getButtonsFactory().createSendToQuestButton();this.addButton(t)}}),this.createQRCode){const e=pl(yo);if(e&&e.createQRCodeButton===!1)A()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!I.isMobileDevice()){const t=_n.getOrCreate().createQRCode();this.addButton(t)}}}_buttons=[];addButton(e){this._buttons.push(e),this.context.menu.appendChild(e)}removeButtons(){for(const e of this._buttons)e.remove();this._buttons.length=0}};Ot([u()],ut.prototype,"createVRButton"),Ot([u()],ut.prototype,"createARButton"),Ot([u()],ut.prototype,"createSendToQuestButton"),Ot([u()],ut.prototype,"createQRCode"),Ot([u()],ut.prototype,"useDefaultControls"),Ot([u()],ut.prototype,"showControllerModels"),Ot([u()],ut.prototype,"showHandModels"),Ot([u()],ut.prototype,"usePlacementReticle"),Ot([u(ne)],ut.prototype,"customARPlacementReticle"),Ot([u()],ut.prototype,"usePlacementAdjustment"),Ot([u()],ut.prototype,"arScale"),Ot([u()],ut.prototype,"useXRAnchor"),Ot([u()],ut.prototype,"autoPlace"),Ot([u()],ut.prototype,"autoCenter"),Ot([u()],ut.prototype,"useQuicklookExport"),Ot([u()],ut.prototype,"useDepthSensing"),Ot([u()],ut.prototype,"useSpatialGrab"),Ot([u(ne)],ut.prototype,"defaultAvatar");let Wp=ut;const Vp=w("debugusdzbehaviours");class l0{get extensionName(){return"Behaviour"}behaviours=[];addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+ka.getName(e);return this.audioClips.push({clipUrl:e,filesKey:t}),t}behaviourComponents=[];behaviourComponentsCopy=[];audioClips=[];audioClipsCopy=[];targetUuids=new Set;getAllTargetUuids(){return this.targetUuids}onBeforeBuildDocument(e){if(!e.root)return Promise.resolve();const t=[];return e.root.traverse(i=>{x.foreachComponent(i,n=>{const s=n;if(typeof s.createBehaviours=="function"||typeof s.beforeCreateDocument=="function"||typeof s.afterCreateDocument=="function"||typeof s.afterSerialize=="function"){this.behaviourComponents.push(s);const r=s.beforeCreateDocument?.call(s,this,e);r instanceof Promise&&t.push(r)}},!1)}),Vp&&console.log("onBeforeBuildDocument: all components",this.behaviourComponents),Promise.all(t)}onExportObject(e,t,i){for(const n of this.behaviourComponents)n.createBehaviours?.call(n,this,t,i)}onAfterBuildDocument(e){for(const d of this.behaviourComponents)typeof d.afterCreateDocument=="function"&&d.afterCreateDocument(this,e);this.behaviourComponentsCopy=this.behaviourComponents.slice(),this.behaviourComponents.length=0,this.audioClipsCopy=this.audioClips.slice(),this.audioClips.length=0;const t=new Set,i=new Set,n=new Set,s=new Set,r=Vp;let a=`graph LR
|
|
1291
|
+
`,l="";function c(d){if(d instanceof sa){r&&(a+=`subgraph Group_${d.id}
|
|
1292
|
+
`);for(const p of d.actions)r&&(a+=`${d.id}[${d.id}] -- ${d.type},loops:${d.loops} --> ${p.id}[${p.id}]
|
|
1293
|
+
`),c(p);r&&(a+=`end
|
|
1294
|
+
`)}else if(d instanceof Ri){d.tokenId==="StartAnimation"&&s.add(d);let p=d.tokenId;d.type!==void 0&&(p+=":"+d.type);const m=d.affectedObjects;if(m)if(Array.isArray(m))for(const g of m)i.add(g),r&&(l+=`${d.id}[${d.id}
|
|
1295
|
+
${p}] -- ${p} --> ${g.uuid}(("${g.displayName||g.name||g.uuid}"))
|
|
1296
|
+
`);else typeof m=="object"?(i.add(m),r&&(l+=`${d.id}[${d.id}
|
|
1297
|
+
${p}] -- ${p} --> ${m.uuid}(("${m.displayName||m.name||m.uuid}"))
|
|
1298
|
+
`)):typeof m=="string"&&i.add({uuid:m});const f=d.xFormTarget;f&&(typeof f=="object"?(i.add(f),r&&(l+=`${d.id}[${d.id}
|
|
1299
|
+
${p}] -- ${p} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
|
|
1300
|
+
`)):typeof f=="string"&&i.add({uuid:f}))}}function h(d,p){if(Array.isArray(d))for(const m of d)h(m,p);else if(d instanceof pr){let m=d.tokenId;d.type!==void 0&&(m+=":"+d.type),typeof d.targetId=="object"&&(t.add(d.targetId),r&&(l+=`${d.targetId.uuid}(("${d.targetId.displayName}")) --> ${d.id}[${d.id}
|
|
1301
|
+
${m}]
|
|
1302
|
+
`)),r&&(a+=`${d.id}((${d.id})) -- ${m} --> ${p.id}[${p.tokenId||p.id}]
|
|
1303
|
+
`)}}for(const d of this.behaviours)r&&(a+=`subgraph ${d.id}
|
|
1304
|
+
`),c(d.action),h(d.trigger,d.action),r&&(a+=`end
|
|
1305
|
+
`);r&&(a+=`
|
|
1306
|
+
`+l),r&&(console.log("All USDZ behaviours",this.behaviours),this.behaviours.length&&(console.warn("The Mermaid graph can be pasted into https://massive-mermaid.glitch.me/ or https://mermaid.live/edit. It should be in your clipboard already!"),console.log(a),navigator.clipboard.writeText(a)));{let d=`gantt
|
|
1307
|
+
title Animations
|
|
1308
|
+
dateFormat X
|
|
1309
|
+
axisFormat %s
|
|
1310
|
+
`;const p=Array.from(s),m=new Set;for(const _ of p)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const v of _.affectedObjects)m.add(v);else m.add(_.affectedObjects);r&&(d+=`section ${_.animationName} (${_.id})
|
|
1311
|
+
`,d+=`${_.id} : ${_.start}, ${_.duration}s
|
|
1312
|
+
`)}r&&s.size&&console.log(d);const f=new Set;for(const _ of m){_.getPath||console.error("USDZExporter: Animation target object has no getPath method. This is likely a bug",_);let v=_.getPath();v.startsWith("<")&&(v=v.substring(1)),v.endsWith(">")&&(v=v.substring(0,v.length-1)),f.add({path:v,obj:_})}const g=Array.from(f).sort((_,v)=>_.path.length-v.path.length),y=new Array;for(let _=0;_<g.length;_++)for(let v=_+1;v<g.length;v++)if(g[v].path.startsWith(g[_].path)){const C=g[v],O=g[_];y.push({child:C.obj.displayName+" ("+C.path+")",parent:O.obj.displayName+" ("+O.path+")"})}y.length&&console.warn("USDZExporter: There are overlapping PlayAnimation actions. This can lead to undefined runtime behaviour when playing multiple animations. Please restructure the hierarchy so that animations don't overlap.",{overlappingTargets:y,playAnimationActions:s})}for(const d of new Set([...t,...i]))if(Array.isArray(d))for(const p of d)n.add(p.uuid);else n.add(d.uuid);Vp&&console.log("All Behavior trigger sources and action targets",t,i,n),this.targetUuids=new Set(n)}onAfterHierarchy(e,t){if(this.behaviours?.length){t.beginBlock('def Scope "Behaviors"');for(const i of this.behaviours)i.writeTo(this,e.document,t);t.closeBlock()}}async onAfterSerialize(e){Vp&&console.log("onAfterSerialize behaviours",this.behaviourComponentsCopy);for(const t of this.behaviourComponentsCopy)typeof t.afterSerialize=="function"&&(t.afterSerialize.constructor.name==="AsyncFunction"?await t.afterSerialize(this,e):t.afterSerialize(this,e));for(const{clipUrl:t,filesKey:i}of this.audioClipsCopy){if(e.files[i])return;const n=await(await(await fetch(t)).blob()).arrayBuffer(),s=new Uint8Array(n);e.files[i]=s}this.behaviourComponentsCopy.length=0,this.audioClipsCopy.length=0}}class c0{get extensionName(){return"Physics"}onExportObject(e,t,i){const n=x.getComponents(e,Je).filter(l=>l.enabled),s=x.getComponents(e,hn).filter(l=>l.enabled&&!l.isTrigger);let r=n.length>0?n[0]:null;const a=s.length>0?s[0]:null;a&&!r&&(r=new Je,r.isKinematic=!0),r&&t.addEventListener("serialize",(l,c)=>{if(r){if(l.appendLine(),l.beginBlock('def RealityKitComponent "RigidBody"',"{",!0),r.useGravity||l.appendLine("bool gravityEnabled = 0"),l.appendLine('uniform token info:id = "RealityKit.RigidBody"'),r.isKinematic&&l.appendLine('token motionType = "Kinematic"'),l.beginBlock('def RealityKitStruct "massFrame"',"{",!0),l.appendLine(`float m_mass = ${r.mass}`),l.beginBlock('def RealityKitStruct "m_pose"',"{",!0),l.appendLine(`float3 position = (${r.centerOfMass.x}, ${r.centerOfMass.y}, ${r.centerOfMass.z})`),l.closeBlock("}"),l.closeBlock("}"),s.length>0){const h=s[0];l.beginBlock('def RealityKitStruct "material"',"{",!0);const d=h.sharedMaterial;d&&d.dynamicFriction!==void 0&&l.appendLine(`double dynamicFriction = ${h.sharedMaterial?.dynamicFriction}`),d&&d.bounciness!==void 0&&l.appendLine(`double restitution = ${h.sharedMaterial?.bounciness}`),d&&d.staticFriction!==void 0&&l.appendLine(`double staticFriction = ${h.sharedMaterial?.staticFriction}`),l.closeBlock("}")}l.closeBlock("}")}}),a&&(t.addEventListener("serialize",(l,c)=>{l.beginBlock('def RealityKitComponent "Collider"',"{",!0),l.appendLine("uint group = 1"),l.appendLine('uniform token info:id = "RealityKit.Collider"'),l.appendLine("uint mask = 4294967295");const h=a.isTrigger?"Trigger":"Default";if(l.appendLine(`token type = "${h}"`),l.beginBlock('def RealityKitStruct "Shape"',"{",!0),a instanceof wl){const d=a;l.appendLine('token shapeType = "Sphere"'),l.appendLine(`float radius = ${d.radius}`)}else if(a instanceof dp){const d=a;l.appendLine('token shapeType = "Box"'),l.appendLine(`float3 extent = (${d.size.x}, ${d.size.y}, ${d.size.z})`)}else if(a instanceof qo){const d=a;l.appendLine('token shapeType = "Capsule"'),l.appendLine(`float radius = ${d.radius}`),l.appendLine(`float height = ${d.height}`)}else if(a instanceof Us&&a.sharedMesh?.geometry){const d=a.sharedMesh.geometry;d.boundingBox||d.computeBoundingBox();const p=a.sharedMesh.geometry.boundingBox;p&&(l.appendLine('token shapeType = "Box"'),l.appendLine(`float3 extent = (${p.max.x-p.min.x}, ${p.max.y-p.min.y}, ${p.max.z-p.min.z})`),console.log("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. MeshCollider will be exported as Box",a))}else console.warn("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. Ignoring collider:",a);l.beginBlock('def RealityKitStruct "pose"',"{",!0),l.closeBlock("}"),l.closeBlock("}"),l.closeBlock("}")}),s.length>1&&console.log("WARNING: Multiple colliders detected. visionOS / iOS can only support objects with a single collider, only exporting the first collider: ",a))}}const p2=w("debugshadowcomponents");o_.prototype.interactable={get(){return this.interactive},set(o){this.interactable=o}};class bn extends E{isRoot(){return this.Root?.gameObject===this.gameObject}get canvas(){const e=this.Root;return e?.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){ci.markUIDirty(this.context)}get shadowComponent(){return this._shadowComponent}set shadowComponent(e){this._shadowComponent=e}_shadowComponent=null;_controlsChildLayout=!0;get controlsChildLayout(){return this._controlsChildLayout}set controlsChildLayout(e){this._controlsChildLayout=e,this.shadowComponent&&(this.shadowComponent.autoLayout=e)}_root=void 0;get Root(){return this._root===void 0&&(this._root=x.getComponentInParent(this.gameObject,Th)),this._root}_parentComponent=void 0;__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this.shadowComponent=null,this._root=void 0,this._parentComponent=void 0,this}onEnable(){super.onEnable()}addShadowComponent(e,t){if(!e)return;this.removeShadowComponent();const i=this.isRoot()?this.gameObject:this.gameObject.parent;if(this._parentComponent=x.getComponentInParent(i,bn),!this._parentComponent){console.warn(`Component "${this.name}" doesn't have a UI parent anywhere. Do you have an UI element outside a Canvas? UI components must be a child of a Canvas component`,this);return}e.name=this.name+" ("+(this.constructor.name??"UI")+")",e.autoLayout=this._parentComponent.controlsChildLayout,e[Fi]=this,this.setShadowComponentOwner(e);let n=!1;if(this.Root?.gameObject===this.gameObject)this.gameObject.add(e);else{const s=this._parentComponent.shadowComponent;s&&(s?.add(e),n=!0)}this.shadowComponent=e,t&&t.shadowComponent&&this.shadowComponent&&t.shadowComponent.add(this.shadowComponent),Ic&&e.add(new Li(.5)),this.onAfterAddedToScene(),n&&oO(),p2&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Fi]===void 0||e[Fi]===this)&&(e[Fi]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,i){if(e&&e[Fi]===t){i(e);for(const n of e.children)this.traverseOwnedShadowComponents(n,t,i)}}removeShadowComponent(){this.shadowComponent&&this.shadowComponent.removeFromParent()}onAfterAddedToScene(){}setInteractable(e){this.shadowComponent&&(this.shadowComponent.interactable=e)}}class Th extends bn{awake(){super.awake()}}var m2=Object.defineProperty,g2=Object.getOwnPropertyDescriptor,Ah=(o,e,t,i)=>{for(var n=i>1?void 0:i?g2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&m2(e,t,n),n};const h0=w("debugui"),d0=w("debuguilayout");class H1{width;height}class G1{x;y;width;height}const Un=new b,Ih=new J,$p=new N,Ul=class iC extends bn{get parent(){return this._parentRectTransform}get translation(){return this.gameObject.position}get rotation(){return this.gameObject.quaternion}get scale(){return this.gameObject.scale}_anchoredPosition;get anchoredPosition(){return this._anchoredPosition||(this._anchoredPosition=new K),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}sizeDelta=new K(100,100);pivot=new K(.5,.5);anchorMin=new K(0,0);anchorMax=new K(1,1);minWidth;minHeight;get width(){let e=this.sizeDelta.x;if(this.anchorMin.x!==this.anchorMax.x&&this._parentRectTransform){const t=this._parentRectTransform.width,i=this.anchorMax.x-this.anchorMin.x;e=t*i,e+=this.sizeDelta.x}return this.minWidth!==void 0&&e<this.minWidth?this.minWidth:e}get height(){let e=this.sizeDelta.y;if(this.anchorMin.y!==this.anchorMax.y&&this._parentRectTransform){const t=this._parentRectTransform.height,i=this.anchorMax.y-this.anchorMin.y;e=t*i,e+=this.sizeDelta.y}return this.minHeight!==void 0&&e<this.minHeight?this.minHeight:e}lastMatrix;rectBlock;_transformNeedsUpdate=!1;_initialPosition;_parentRectTransform;_lastUpdateFrame=-1;awake(){super.awake(),this._lastUpdateFrame=-1,this._parentRectTransform=void 0,this.rectBlock=new M,this.rectBlock.name=this.name,this.lastMatrix=new J,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new K),gl(this,"_anchoredPosition",()=>{this.markDirty()}),gl(this,"sizeDelta",()=>{this.markDirty()}),gl(this,"pivot",()=>{this.markDirty()}),gl(this,"anchorMin",()=>{this.markDirty()}),gl(this,"anchorMax",()=>{this.markDirty()})}onEnable(){super.onEnable(),this.rectBlock||(this.rectBlock=new M),this.lastMatrix||(this.lastMatrix=new J),this._lastAnchoring||(this._lastAnchoring=new K),this._initialPosition||(this._initialPosition=new b),this._anchoredPosition||(this._anchoredPosition=new K),this.addShadowComponent(this.rectBlock),this._transformNeedsUpdate=!0,this.canvas?.registerTransform(this)}onDisable(){super.onDisable(),this.removeShadowComponent(),this.canvas?.unregisterTransform(this)}onParentRectTransformChanged(e){this._transformNeedsUpdate||this.onApplyTransform(d0?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(d0&&console.warn("RectTransform markDirty()",this.name),this._transformNeedsUpdate=!0,this._lastUpdateFrame=-1)}updateTransform(){(this._transformNeedsUpdate||!this.lastMatrix.equals(this.gameObject.matrix))&&this.canUpdate()&&this.onApplyTransform(this._transformNeedsUpdate?"Marked dirty":"Matrix changed")}canUpdate(){return this._transformNeedsUpdate&&this.activeAndEnabled&&this._lastUpdateFrame!==this.context.time.frame}onApplyTransform(e){if(this.context.time.frameCount===this._lastUpdateFrame)return;this._lastUpdateFrame=this.context.time.frameCount;const t=this.shadowComponent;if(!t)return;this.gameObject.parent?this._parentRectTransform=x.getComponentInParent(this.gameObject.parent,iC):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,d0&&console.warn("RectTransform \u2192 ApplyTransform",this.name+" because "+e),this.isRoot()?this.Root.screenspace||(t.rotation.y=Math.PI):(t.matrix.identity(),t.matrixAutoUpdate=!1,Un.set(0,0,0),this.applyPivot(Un),t.matrix.setPosition(Un.x,Un.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&($p.copy(this.gameObject.quaternion),$p.x*=-1,$p.z*=-1,Ih.makeRotationFromQuaternion($p),t.matrix.premultiply(Ih)),Un.set(0,0,0),this.applyAnchoring(Un),this.canvas?.screenspace?Un.z+=.1:Un.z+=.01,Ih.identity(),Ih.setPosition(Un.x,Un.y,Un.z),t.matrix.premultiply(Ih),t.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const i=!0;for(const n of jf(this.gameObject,bn,i,1)){if(n===this||!n.activeAndEnabled)continue;const s=n;s.onParentRectTransformChanged&&s.onParentRectTransformChanged(this)}}_lastAnchoring;applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new K);const t=this._lastAnchoring.sub(this._anchoredPosition);this.gameObject.position.x+=t.x,this.gameObject.position.y+=t.y,this._lastAnchoring.copy(this._anchoredPosition),e.x+=this._initialPosition.x-this.gameObject.position.x,e.y+=this._initialPosition.y-this.gameObject.position.y,e.z+=this._initialPosition.z-this.gameObject.position.z;const i=this._parentRectTransform;if(i){let n=0;const s=1-this.anchorMax.y-this.anchorMin.y;n-=i.height*.5*s,e.y+=n;let r=0;const a=1-this.anchorMax.x-this.anchorMin.x;r-=i.width*.5*a,e.x+=r}}applyPivot(e){if(this.pivot&&!this.isRoot()){const t=this.pivot.x-.5;e.x-=t*this.sizeDelta.x*this.gameObject.scale.x;const i=this.pivot.y-.5;e.y-=i*this.sizeDelta.y*this.gameObject.scale.y}}getBasicOptions(){const e={width:this.sizeDelta.x,height:this.sizeDelta.y,offset:0,backgroundOpacity:0,borderWidth:0,borderRadius:0,borderOpacity:0,letterSpacing:-.03};return this.ensureValidSize(e),e}ensureValidSize(e,t=1e-4){return e.width<=0&&(e.width=t),e.height<=0&&(e.height=1e-4),e}_createdBlocks=[];_createdTextBlocks=[];createNewBlock(e){e={...this.getBasicOptions(),...e},h0&&console.log(this.name,e);const t=new o_(e);return this._createdBlocks.push(t),t}createNewText(e){h0&&console.log(e),e={...this.getBasicOptions(),...e},h0&&console.log(this.name,e);const t=new n_(e);return this._createdTextBlocks.push(t),t}};Ah([u(K)],Ul.prototype,"anchoredPosition",1),Ah([u(K)],Ul.prototype,"sizeDelta",2),Ah([u(K)],Ul.prototype,"pivot",2),Ah([u(K)],Ul.prototype,"anchorMin",2),Ah([u(K)],Ul.prototype,"anchorMax",2);let zn=Ul;var f2=Object.defineProperty,q1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&f2(e,t,n),n};class zl extends E{effectColor;effectDistance}q1([u(se)],zl.prototype,"effectColor"),q1([u(K)],zl.prototype,"effectDistance");var y2=Object.defineProperty,b2=Object.getOwnPropertyDescriptor,X1=(o,e,t,i)=>{for(var n=i>1?void 0:i?b2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&y2(e,t,n),n};const aa={backgroundColor:new oe(1,1,1),backgroundOpacity:1,borderColor:new oe(1,1,1),borderOpacity:1},u0=class Sd extends bn{get isGraphic(){return!0}get color(){return this._color||(this._color=new se(1,1,1,1)),this._color}set color(e){(!this._color||this._color.r!==e.r||this._color.g!==e.g||this._color.b!==e.b||("alpha"in e?this._color.alpha!==e.alpha:this._color.alpha!==1))&&(this._color||(this._color=new se(1,1,1,1)),this._color.copy(e),this.onColorChanged())}_color=null;_alphaFactor=1;setAlphaFactor(e){this._alphaFactor=e,this.onColorChanged()}get alphaFactor(){return this._alphaFactor}sRGBColor=new oe(1,0,1);onColorChanged(){if(this.uiObject){this.sRGBColor.copy(this._color),this.sRGBColor.convertLinearToSRGB(),aa.backgroundColor=this.sRGBColor,aa.backgroundOpacity=this._color.alpha;const e=this.uiObject._simpleState__activeStates?.[0];if(e){const t=this.uiObject._simpleState__states?.[e];t&&("backgroundColor"in t&&(aa.backgroundColor=t.backgroundColor),"backgroundOpacity"in t&&(aa.backgroundOpacity=t.backgroundOpacity))}aa.backgroundOpacity*=this._alphaFactor,this.applyEffects(aa,this._alphaFactor),this.uiObject.set(aa),this.markDirty()}}get m_Color(){return this._color}raycastTarget=!0;uiObject=null;_rect=null;_stateManager=null;get rectTransform(){if(this._rect||(this._rect=x.getComponent(this.gameObject,zn)),!this._rect)throw new Error("Not Supported: Make sure to add a RectTransform component before adding a UI Graphic component.");return this._rect}onParentRectTransformChanged(){this.uiObject?.set({width:this.rectTransform.width,height:this.rectTransform.height}),this.markDirty()}__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this._rect=null,this.uiObject=null,this._stateManager=null,this._color&&(this._color=this._color.clone()),this}setState(e){this.makePanel(),this.uiObject&&(this.uiObject.setState(e),this?.markDirty())}setupState(e){this.makePanel(),this.uiObject&&(this._stateManager||(this._stateManager=new sO(this.uiObject)),this.uiObject.setupState(e.state,e.attributes))}setOptions(e){this.makePanel(),this.uiObject&&this.uiObject.set(e)}awake(){super.awake(),this.makePanel(),gl(this,"_color",()=>RR(this,this.onColorChanged))}onEnable(){super.onEnable(),this.uiObject&&(this.rectTransform.shadowComponent?.add(this.uiObject),this.addShadowComponent(this.uiObject,this.rectTransform))}onDisable(){super.onDisable(),this.uiObject&&this.removeShadowComponent()}_currentlyCreatingPanel=!1;makePanel(){if(this.uiObject||this._currentlyCreatingPanel)return;this._currentlyCreatingPanel=!0;const e={backgroundColor:this.color,backgroundOpacity:this.color.alpha,offset:.015};this.onBeforeCreate(e),this.applyEffects(e),this.onCreate(e),this.controlsChildLayout=!1,this._currentlyCreatingPanel=!1,this.onAfterCreated(),this.onColorChanged()}onBeforeCreate(e){}onCreate(e){this.uiObject=this.rectTransform.createNewBlock(e),this.uiObject.name=this.name}onAfterCreated(){}applyEffects(e,t=1){const i=this.gameObject?.getComponent(zl);i&&(i.effectDistance&&(e.borderWidth=Math.max(Math.abs(i.effectDistance.x),Math.abs(i.effectDistance.y))),i.effectColor&&(e.borderColor=i.effectColor,e.borderOpacity=i.effectColor.alpha*t))}static textureCache=new Map;async setTexture(e){if(this.setOptions({backgroundOpacity:0}),e){if(Sd.textureCache.has(e))e=Sd.textureCache.get(e);else if(!e.isRenderTargetTexture){const t=e.clone();t.colorSpace=To,Sd.textureCache.set(e,t),e=t}this.setOptions({backgroundImage:e,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),He.assignTextureLOD(e,0).then(t=>{t instanceof Se&&(e&&Sd.textureCache.set(e,t),this.setOptions({backgroundImage:t}),this.markDirty())})}else this.setOptions({backgroundImage:void 0,borderRadius:0,backgroundOpacity:this.color.alpha});this.markDirty()}onAfterAddedToScene(){super.onAfterAddedToScene(),this.shadowComponent&&(this.shadowComponent.offset=this.shadowComponent.position.z)}};X1([u(se)],u0.prototype,"color",1),X1([u()],u0.prototype,"raycastTarget",2);let Lh=u0;class Dh extends Lh{_flippedObject=!1;onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var _2=Object.defineProperty,v2=Object.getOwnPropertyDescriptor,ns=(o,e,t,i)=>{for(var n=v2(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&_2(e,t,n),n};const Qs=w("debugtext");var it=(o=>(o[o.UpperLeft=0]="UpperLeft",o[o.UpperCenter=1]="UpperCenter",o[o.UpperRight=2]="UpperRight",o[o.MiddleLeft=3]="MiddleLeft",o[o.MiddleCenter=4]="MiddleCenter",o[o.MiddleRight=5]="MiddleRight",o[o.LowerLeft=6]="LowerLeft",o[o.LowerCenter=7]="LowerCenter",o[o.LowerRight=8]="LowerRight",o))(it||{}),Q1=(o=>(o[o.Truncate=0]="Truncate",o[o.Overflow=1]="Overflow",o))(Q1||{}),Y1=(o=>(o[o.Wrap=0]="Wrap",o[o.Overflow=1]="Overflow",o))(Y1||{}),p0=(o=>(o[o.Normal=0]="Normal",o[o.Bold=1]="Bold",o[o.Italic=2]="Italic",o[o.BoldAndItalic=3]="BoldAndItalic",o))(p0||{});class Qt extends Lh{set alignment(e){e!==this._alignment&&(this._alignment=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get alignment(){return this._alignment}_alignment=0;set verticalOverflow(e){e!==this._verticalOverflow&&(this._verticalOverflow=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get verticalOverflow(){return this._verticalOverflow}_verticalOverflow=0;set horizontalOverflow(e){e!==this._horizontalOverflow&&(this._horizontalOverflow=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get horizontalOverflow(){return this._horizontalOverflow}_horizontalOverflow=0;set lineSpacing(e){e!==this._lineSpacing&&(this._lineSpacing=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get lineSpacing(){return this._lineSpacing}_lineSpacing=1;set fontStyle(e){e!==this._fontStyle&&(this._fontStyle=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get fontStyle(){return this._fontStyle}_fontStyle=0;set font(e){e!==this._font&&(this._font=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get font(){return this._font}_font="https://cdn.needle.tools/static/fonts/msdf/arial/arial";set supportRichText(e){e!==this._supportRichText&&(this._supportRichText=e,this.uiObject?.set(this.getTextOpts()),this.markDirty())}get supportRichText(){return this._supportRichText}_supportRichText=!1;setAlphaFactor(e){super.setAlphaFactor(e),this.uiObject?.set({fontOpacity:this.color.alpha*this.alphaFactor}),this.markDirty()}get text(){return this._text}set text(e){e!==this._text&&(this._text=e,this.feedText(this.text,this.supportRichText),this.markDirty(),this.context.accessibility.updateElement(this,{label:this.text}))}_text="";set_text(e){this.text=e}get fontSize(){return this._fontSize}set fontSize(e){this._fontSize=e,this.uiObject?.set({fontSize:e})}_fontSize=12;sRGBTextColor=new oe(1,0,1);onColorChanged(){this.sRGBTextColor.copy(this.color),this.sRGBTextColor.convertLinearToSRGB(),this.uiObject?.set({color:this.sRGBTextColor,fontOpacity:this.color.alpha})}onParentRectTransformChanged(){super.onParentRectTransformChanged(),this.uiObject&&this.updateOverflow()}onBeforeCanvasRender(e){this.updateOverflow()}updateOverflow(){const e=this.uiObject?._overflow;e&&(e._needsUpdate=!0)}onCreate(e){Qs&&console.log(this),delete e.backgroundOpacity,delete e.backgroundColor,Qs&&(e.backgroundColor=16750848,e.backgroundOpacity=.5),e={...e,...this.getTextOpts()},this.getAlignment(e),Qs&&(e.backgroundColor=Math.random()*16777215,e.backgroundOpacity=.1);const t=this.rectTransform;this.uiObject=t.createNewText(e),this.feedText(this.text,this.supportRichText)}onAfterAddedToScene(){super.onAfterAddedToScene(),this.handleTextRenderOnTop()}_textMeshUi=null;getTextOpts(){const e=this.fontSize,t={color:this.color,fontOpacity:this.color.alpha,fontSize:e,fontKerning:"normal"};return this.horizontalOverflow==1&&(t.whiteSpace="pre"),this.verticalOverflow==0&&(this.context.renderer.localClippingEnabled=!0,t.overflow="hidden"),this.horizontalOverflow==1&&this.verticalOverflow==0,t.lineHeight=this.lineSpacing,this.setFont(t,this.fontStyle),t}onEnable(){super.onEnable(),this.context.accessibility.updateElement(this,{role:"text",label:this.text,hidden:!1}),this._didHandleTextRenderOnTop=!1,this.uiObject&&this.uiObject.addAfterUpdate(()=>{this.setShadowComponentOwner(this.uiObject),this.markDirty()}),setTimeout(()=>this.markDirty(),10),this.canvas?.registerEventReceiver(this)}onDisable(){super.onDisable(),this.canvas?.unregisterEventReceiver(this),this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){super.onDestroy(),this.context.accessibility.removeElement(this)}getAlignment(e){switch(e.flexDirection="column",this.alignment){case 0:case 3:case 6:e.textAlign="left";break;case 1:case 4:case 7:e.textAlign="center";break;case 2:case 5:case 8:e.textAlign="right";break}switch(this.alignment){default:case 0:case 1:case 2:e.alignItems="start";break;case 3:case 4:case 5:e.alignItems="center";break;case 6:case 7:case 8:e.alignItems="end";break}return e}feedText(e,t){if(Qs&&console.log("feedText",this.uiObject,e,t),!!this.uiObject)if(this._textMeshUi||(this._textMeshUi=[]),this.uiObject.children.length=0,!t||e.length===0)this.uiObject.textContent=e;else{let i=this.getNextTag(e);if(i){if(i.startIndex>0){for(let r=this.uiObject.children.length-1;r>=0;r--){const a=this.uiObject.children[r];a.isUI&&(this.uiObject.remove(a),a.clear())}const s=new tg({textContent:e.substring(0,i.startIndex),color:"inherit"});this.uiObject.add(s)}}else{this.uiObject.textContent="",this.setOptions({textContent:e});return}const n=[];for(;i;){const s=this.getNextTag(e,i.endIndex),r={fontFamily:this.uiObject?.get("fontFamily"),color:"inherit",textContent:""};if(s){r.textContent=this.getText(e,i,s),this.handleTag(i,r,n);const a=new tg(r);this.uiObject?.add(a)}else{r.textContent=e.substring(i.endIndex),this.handleTag(i,r,n);const a=new tg(r);this.uiObject?.add(a)}i=s}}}_didHandleTextRenderOnTop=!1;handleTextRenderOnTop(){this._didHandleTextRenderOnTop||(this._didHandleTextRenderOnTop=!0,this.startCoroutine(this.renderOnTopCoroutine()))}*renderOnTopCoroutine(){if(!this.canvas)return;const e=[],t=this.canvas,i={renderOnTop:t.renderOnTop,depthWrite:t.depthWrite,doubleSided:t.doubleSided};for(;;){let n=!1;if(this._textMeshUi)for(let s=0;s<this._textMeshUi.length;s++){if(e[s]===!0)continue;n=!0;const r=this._textMeshUi[s];r.textContent&&(Ku(r,i),e[s]=!0)}if(!n)break;yield}}handleTag(e,t,i){if(!e.isEndTag){if(e.type.includes("color")){const n=new m0(e,{color:t.color});if(i.push(n),e.type.length>6){const s=parseInt("0x"+e.type.substring(7));t.color=s}else t.color=new oe(1,1,1)}else if(e.type=="b"){this.setFont(t,1);const n=new m0(e,{fontWeight:700});i.push(n)}else if(e.type=="i"){this.setFont(t,2);const n=new m0(e,{fontStyle:"italic"});i.push(n)}}}getText(e,t,i){return e.substring(t.endIndex,i.startIndex)}getNextTag(e,t=0){const i=e.indexOf("<",t),n=e.indexOf(">",i);if(i>=0&&n>=0){const s=e.substring(i+1,n);return{type:s,startIndex:i,endIndex:n+1,isEndTag:s.startsWith("/")}}return null}setFont(e,t){if(!this.font){Qs&&console.warn("No font set for Text component, skipping font setup");return}const i=this.font,n=this.getFamilyNameWithCorrectSuffix(i,t);Qs&&console.log("Selected font family:"+n,this.font);let s=s_.getFontFamily(n);switch(s||(s=s_.addFontFamily(n)),e.fontFamily=s,t){default:case 0:e.fontWeight=400,e.fontStyle="normal";break;case 1:e.fontWeight=700,e.fontStyle="normal";break;case 2:e.fontWeight=400,e.fontStyle="italic";break;case 3:e.fontStyle="italic",e.fontWeight=400}let r=s.getVariant(e.fontWeight,e.fontStyle);if(!r){let a=n;a?.endsWith("-msdf.json")||(a+="-msdf.json");let l=n;l?.endsWith(".png")||(l+=".png"),r=s.addVariant(e.fontWeight,e.fontStyle,a,l),r?.addEventListener("ready",()=>{this.markDirty()})}}getFamilyNameWithCorrectSuffix(e,t){const i=e.startsWith("https:")||e.startsWith("http:"),n=e.lastIndexOf("-");if(n<0)return e;const s=e.substring(n+1)?.toLowerCase();if(w2.includes(s))return Qs&&console.warn("Unsupported font style: "+s),e;const r=e.lastIndexOf("/");let a=e;r>=0&&(a=a.substring(r+1));const l=a[0]===a[0].toUpperCase(),c=e.substring(0,n>r?n:e.length);if(Qs&&console.log("Select font: ",e,p0[t],a,l,c),i&&!(e.endsWith("-msdf.json")||e.endsWith(".png")))return c;switch(t){case 0:return l?c+"-Regular":c+"-regular";case 1:return l?c+"-Bold":c+"-bold";case 2:return l?c+"-Italic":c+"-italic";case 3:return l?c+"-BoldItalic":c+"-bolditalic";default:return e}}}ns([u()],Qt.prototype,"alignment"),ns([u()],Qt.prototype,"verticalOverflow"),ns([u()],Qt.prototype,"horizontalOverflow"),ns([u()],Qt.prototype,"lineSpacing"),ns([u()],Qt.prototype,"fontStyle"),ns([u(URL)],Qt.prototype,"font"),ns([u()],Qt.prototype,"supportRichText"),ns([u()],Qt.prototype,"text"),ns([u()],Qt.prototype,"fontSize");class m0{tag;previousValues;constructor(e,t){this.tag=e,this.previousValues=t}}const w2=["medium","mediumitalic","black","blackitalic","thin","thinitalic","extrabold","light","lightitalic","semibold"];class Nl{static global_id=0;static getId(){return this.global_id++}id;content="";font=[];pointSize=144;width;height;depth;wrapMode;horizontalAlignment;verticalAlignment;material;setDepth(e){return this.depth=e,this}setPointSize(e){return this.pointSize=e,this}setHorizontalAlignment(e){return this.horizontalAlignment=e,this}setVerticalAlignment(e){return this.verticalAlignment=e,this}constructor(e){this.id=e}writeTo(e,t){t.beginBlock(`def Preliminary_Text "${this.id}"`,"(",!1),t.appendLine('prepend apiSchemas = ["MaterialBindingAPI"]'),t.closeBlock(")"),t.beginBlock(),this.content&&t.appendLine(`string content = "${this.content}"`),(!this.font||this.font.length<=0)&&(this.font||=[],this.font?.push("sans-serif"));const i=this.font.map(n=>`"${n}"`).join(", ");t.appendLine(`string[] font = [ ${i} ]`),t.appendLine(`double pointSize = ${this.pointSize}`),typeof this.width=="number"&&t.appendLine(`double width = ${this.width}`),typeof this.height=="number"&&t.appendLine(`double height = ${this.height}`),typeof this.depth=="number"&&t.appendLine(`double depth = ${this.depth}`),this.wrapMode&&t.appendLine(`token wrapMode = "${this.wrapMode}"`),this.horizontalAlignment&&t.appendLine(`token horizontalAlignment = "${this.horizontalAlignment}"`),this.verticalAlignment&&t.appendLine(`token verticalAlignment = "${this.verticalAlignment}"`),this.material!==void 0&&t.appendLine(`rel material:binding = </StageRoot/Materials/${Ap(this.material)}>`),t.closeBlock()}}class g0{static singleLine(e,t,i){const n=new Nl("text_"+Nl.getId());return n.content=e,t&&(n.pointSize=t),i&&(n.depth=i),n}static multiLine(e,t,i,n,s,r){const a=new Nl("text_"+Nl.getId());return a.content=e,a.width=t,a.height=i,a.horizontalAlignment=n,a.verticalAlignment=s,r!==void 0&&(a.wrapMode=r),a}}const x2=new J().makeRotationY(Math.PI),S2=new J().makeScale(-1,1,-1);class Hp{get extensionName(){return"text"}exportText(e,t,i){const n=x.getComponent(e,Qt);if(!n)return;const s=x.getComponent(e,zn);let r=100,a=100;s&&(r=s.width,a=s.height);const l=x2.clone();s&&l.premultiply(S2),t.setMatrix(l);const c=n.color.clone();t.material=new yt({color:c,emissive:c}),t.addEventListener("serialize",(h,d)=>{let p=n.text;p=p.replace(/\r/g,""),p=p.replace(/\n/g,"\\n");const m=g0.multiLine(p,r,a,"center","bottom","flowing");this.setTextAlignment(m,n.alignment),this.setOverflow(m,n),t.material&&(m.material=t.material),m.pointSize=this.convertToTextSize(n.fontSize),m.depth=.001,m.writeTo(void 0,h)})}convertToTextSize(e){return 1/.0502*144*e}setOverflow(e,t){t.horizontalOverflow?e.wrapMode="singleLine":e.wrapMode="flowing"}setTextAlignment(e,t){switch(t){case it.LowerLeft:case it.MiddleLeft:case it.UpperLeft:e.horizontalAlignment="left";break;case it.LowerCenter:case it.MiddleCenter:case it.UpperCenter:e.horizontalAlignment="center";break;case it.LowerRight:case it.MiddleRight:case it.UpperRight:e.horizontalAlignment="right";break}switch(t){case it.LowerLeft:case it.LowerCenter:case it.LowerRight:e.verticalAlignment="bottom";break;case it.MiddleLeft:case it.MiddleCenter:case it.MiddleRight:e.verticalAlignment="middle";break;case it.UpperLeft:case it.UpperCenter:case it.UpperRight:e.verticalAlignment="top";break}}}var C2=Object.defineProperty,nt=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&C2(e,t,n),n};const Z1=w("debuguilayout");class la{left=0;right=0;top=0;bottom=0;get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}nt([u()],la.prototype,"left"),nt([u()],la.prototype,"right"),nt([u()],la.prototype,"top"),nt([u()],la.prototype,"bottom");class Hi extends E{_rectTransform=null;get rectTransform(){return this._rectTransform}onParentRectTransformChanged(e){this._needsUpdate=!0}_needsUpdate=!1;get isDirty(){return this._needsUpdate}get isLayoutGroup(){return!0}updateLayout(){this._rectTransform&&(Z1&&console.warn("Layout Update",this.context.time.frame,this.name),this._needsUpdate=!1,this.onCalculateLayout(this._rectTransform))}childAlignment=0;reverseArrangement=!1;spacing=0;padding;minWidth=0;minHeight=0;flexibleHeight=0;flexibleWidth=0;preferredHeight=0;preferredWidth=0;start(){this._needsUpdate=!0}onEnable(){Z1&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(zn);const e=this.gameObject.getComponentInParent(Wl);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(Wl);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}nt([u()],Hi.prototype,"childAlignment"),nt([u()],Hi.prototype,"reverseArrangement"),nt([u()],Hi.prototype,"spacing"),nt([u(la)],Hi.prototype,"padding"),nt([u()],Hi.prototype,"minWidth"),nt([u()],Hi.prototype,"minHeight"),nt([u()],Hi.prototype,"flexibleHeight"),nt([u()],Hi.prototype,"flexibleWidth"),nt([u()],Hi.prototype,"preferredHeight"),nt([u()],Hi.prototype,"preferredWidth");class Ys extends Hi{childControlHeight=!0;childControlWidth=!0;childForceExpandHeight=!1;childForceExpandWidth=!1;childScaleHeight=!1;childScaleWidth=!1;onCalculateLayout(e){const t=this.primaryAxis,i=e.width;let n=i;const s=e.height;let r=s;n-=this.padding.horizontal,r-=this.padding.vertical,t==="x"?this.padding.horizontal:this.padding.vertical;const a=t==="x",l=a?"y":"x",c=a?this.childControlWidth:this.childControlHeight,h=a?this.childControlHeight:this.childControlWidth,d=a?this.childForceExpandWidth:this.childForceExpandHeight,p=a?this.childForceExpandHeight:this.childForceExpandWidth,m=a?r:n,f=a?i:s,g=.5*(a?this.childAlignment%3:Math.floor(this.childAlignment/3));let y=0;a?y+=this.padding.left:y+=this.padding.top;let _=0,v=0;for(let L=0;L<this.gameObject.children.length;L++){const V=this.gameObject.children[L],W=x.getComponent(V,zn);W?.activeAndEnabled&&(v+=1,a?_+=W.width:_+=W.height)}let C=0;const O=this.spacing*(v-1);if(d||c){let L=0;a?L=n-=O:L=r-=O,v>0&&(C=L/v)}let k=0;k+=this.padding.left,k-=this.padding.right,g!==0&&(y=f-_,y*=g,y-=O*g,a?(y-=this.padding.right*g,y+=this.padding.left*(1-g),y<this.padding.left&&(y=this.padding.left)):(y-=this.padding.bottom*g,y+=this.padding.top*(1-g),y<this.padding.top&&(y=this.padding.top)));let j=1;for(let L=0;L<this.gameObject.children.length;L++){const V=this.gameObject.children[L],W=x.getComponent(V,zn);if(W?.activeAndEnabled){W.pivot?.set(.5,.5),W.anchorMin.set(0,1),W.anchorMax.set(0,1);const G=i*.5+k*.5;W.anchoredPosition.x!==G&&(W.anchoredPosition.x=G);const X=s*-.5;W.anchoredPosition.y!==X&&(W.anchoredPosition.y=X),p&&h&&W.sizeDelta[l]!==m&&(W.sizeDelta[l]=m),d&&c&&W.sizeDelta[t]!==C&&(W.sizeDelta[t]=C);const R=a?W.width:W.height,$=R*.5;if(y+=$,d){const he=C*j-C*.5;he>y&&(y=he-C*.5+R+this.padding.left,y-=$)}let q=y;t==="y"&&(q=-q),W.anchoredPosition[t]!==q&&(W.anchoredPosition[t]=q),y+=$,y+=this.spacing,j+=1}}}}nt([u()],Ys.prototype,"childControlHeight"),nt([u()],Ys.prototype,"childControlWidth"),nt([u()],Ys.prototype,"childForceExpandHeight"),nt([u()],Ys.prototype,"childForceExpandWidth"),nt([u()],Ys.prototype,"childScaleHeight"),nt([u()],Ys.prototype,"childScaleWidth");class f0 extends Ys{get primaryAxis(){return"y"}}class y0 extends Ys{get primaryAxis(){return"x"}}class b0 extends Hi{onCalculateLayout(){}}var P2=Object.defineProperty,O2=Object.getOwnPropertyDescriptor,bo=(o,e,t,i)=>{for(var n=i>1?void 0:i?O2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&P2(e,t,n),n},K1=(o=>(o[o.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",o[o.ScreenSpaceCamera=1]="ScreenSpaceCamera",o[o.WorldSpace=2]="WorldSpace",o[o.Undefined=-1]="Undefined",o))(K1||{});const _0=w("debuguilayout"),un=class nC extends Th{get isCanvas(){return!0}get screenspace(){return this.renderMode!==2}set renderOnTop(e){e!==this._renderOnTop&&(this._renderOnTop=e,this.onRenderSettingsChanged())}get renderOnTop(){return this._renderOnTop!==void 0?this._renderOnTop:!!(this.screenspace&&this._renderMode===0)}_renderOnTop;set depthWrite(e){this._depthWrite!==e&&(this._depthWrite=e,this.onRenderSettingsChanged())}get depthWrite(){return this._depthWrite}_depthWrite=!1;set doubleSided(e){this._doubleSided!==e&&(this._doubleSided=e,this.onRenderSettingsChanged())}get doubleSided(){return this._doubleSided}_doubleSided=!0;set castShadows(e){this._castShadows!==e&&(this._castShadows=e,this.onRenderSettingsChanged())}get castShadows(){return this._castShadows}_castShadows=!1;set receiveShadows(e){this._receiveShadows!==e&&(this._receiveShadows=e,this.onRenderSettingsChanged())}get receiveShadows(){return this._receiveShadows}_receiveShadows=!1;get renderMode(){return this._renderMode}set renderMode(e){this._renderMode!==e&&(this._renderMode=e,this.onRenderSettingsChanged())}_renderMode=2;_rootCanvas;set rootCanvas(e){this._rootCanvas instanceof nC||(this._rootCanvas=e)}get rootCanvas(){return this._rootCanvas}_scaleFactor=1;get scaleFactor(){return this._scaleFactor}set scaleFactor(e){this._scaleFactor=e}worldCamera;planeDistance=100;awake(){this.shadowComponent=this.gameObject,this.previousParent=this.gameObject.parent,_0&&console.log("Canvas.Awake()",this.previousParent?.name+"/"+this.gameObject.name),super.awake()}start(){this.applyRenderSettings()}onEnable(){super.onEnable(),this._updateRenderSettingsRoutine=void 0,this._lastMatrixWorld=new J,this.applyRenderSettings(),document.addEventListener("resize",this._boundRenderSettingsChanged),this.context.pre_render_callbacks.push(this.onBeforeRenderRoutine),this.context.post_render_callbacks.push(this.onAfterRenderRoutine)}onDisable(){super.onDisable(),document.removeEventListener("resize",this._boundRenderSettingsChanged);const e=this.context.pre_render_callbacks.indexOf(this.onBeforeRenderRoutine);e!==-1&&this.context.pre_render_callbacks.splice(e,1);const t=this.context.post_render_callbacks.indexOf(this.onAfterRenderRoutine);t!==-1&&this.context.post_render_callbacks.splice(t,1)}_boundRenderSettingsChanged=this.onRenderSettingsChanged.bind(this);previousParent=null;_lastMatrixWorld=null;_rectTransforms=[];registerTransform(e){this._rectTransforms.push(e)}unregisterTransform(e){const t=this._rectTransforms.indexOf(e);t!==-1&&this._rectTransforms.splice(t,1)}_layoutGroups=new Map;registerLayoutGroup(e){const t=e.gameObject;this._layoutGroups.set(t,e)}unregisterLayoutGroup(e){const t=e.gameObject;this._layoutGroups.delete(t)}_receivers=[];registerEventReceiver(e){this._receivers.push(e)}unregisterEventReceiver(e){const t=this._receivers.indexOf(e);t!==-1&&this._receivers.splice(t,1)}async onEnterXR(e){this.screenspace?(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!1):(this.gameObject.visible=!1,await wc(1).then(()=>{this.gameObject.visible=!0}))}onLeaveXR(e){this.screenspace&&(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!0)}onBeforeRenderRoutine=()=>{if(this.previousParent=this.gameObject.parent,(this.context.xr?.isVR||this.context.xr?.isPassThrough)&&this.screenspace){this.gameObject.visible=!1,this.gameObject.removeFromParent();return}this.renderOnTop||this.screenspace?this.gameObject.removeFromParent():(this.onUpdateRenderMode(),this.handleLayoutUpdates(),this.shadowComponent?.updateMatrixWorld(!0),this.shadowComponent?.updateWorldMatrix(!0,!0),this.invokeBeforeRenderEvents(),ci.ensureUpdateMeshUI(r_,this.context))};onAfterRenderRoutine=()=>{if((this.context.xr?.isVR||this.context.xr?.isPassThrough)&&this.screenspace){this.previousParent?.add(this.gameObject);return}if((this.screenspace||this.renderOnTop)&&this.previousParent&&this.context.mainCamera){this.screenspace?this.context.mainCamera?.add(this.gameObject):this.previousParent.add(this.gameObject);const e=this.context.renderer.autoClear,t=this.context.renderer.autoClearColor;this.context.renderer.autoClear=!1,this.context.renderer.autoClearColor=!1,this.context.renderer.clearDepth(),this.onUpdateRenderMode(!0),this.handleLayoutUpdates(),this.shadowComponent?.updateMatrixWorld(!0),this.invokeBeforeRenderEvents(),ci.ensureUpdateMeshUI(r_,this.context,!0),this.context.renderer.render(this.gameObject,this.context.mainCamera),this.context.renderer.autoClear=e,this.context.renderer.autoClearColor=t,this.previousParent.add(this.gameObject)}this._lastMatrixWorld?.copy(this.gameObject.matrixWorld)};invokeBeforeRenderEvents(){for(const e of this._receivers)e.onBeforeCanvasRender?.(this)}handleLayoutUpdates(){this._lastMatrixWorld===null&&(this._lastMatrixWorld=new J);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);_0&&e&&console.log("Canvas Layout changed",this.context.time.frameCount,this.name);for(const t of this._rectTransforms){e&&t.markDirty();let i=this._layoutGroups.get(t.gameObject);t.isDirty&&!i&&(i=t.gameObject.getComponentInParent(Hi)),(t.isDirty||i?.isDirty)&&(_0&&console.log("CANVAS UPDATE ### "+t.name+" ##################################### "+this.context.time.frame),i?.updateLayout(),t.updateTransform())}}applyRenderSettings(){this.onRenderSettingsChanged()}_updateRenderSettingsRoutine;onRenderSettingsChanged(){this._updateRenderSettingsRoutine||(this._updateRenderSettingsRoutine=this.startCoroutine(this._updateRenderSettingsDelayed(),xe.OnBeforeRender))}*_updateRenderSettingsDelayed(){if(yield,this._updateRenderSettingsRoutine=void 0,this.shadowComponent){this.onUpdateRenderMode(),Ku(this.shadowComponent,this);for(const e of x.getComponentsInChildren(this.gameObject,bn))Ku(e.shadowComponent,this)}}_activeRenderMode=-1;_lastWidth=-1;_lastHeight=-1;onUpdateRenderMode(e=!1){if(!e&&this._renderMode===this._activeRenderMode&&this._lastWidth===this.context.domWidth&&this._lastHeight===this.context.domHeight)return;this._activeRenderMode=this._renderMode;let t=this.context.mainCameraComponent,i=10;switch(t&&t.nearClipPlane>0&&t.farClipPlane>0&&(i=D.lerp(t.nearClipPlane,t.farClipPlane,.01)),this._renderMode===1&&(this.worldCamera&&(t=this.worldCamera),this.planeDistance>0&&(i=this.planeDistance)),this._renderMode){case 0:case 1:if(this._lastWidth=this.context.domWidth,this._lastHeight=this.context.domHeight,!t)return;const n=i+.01;this.gameObject.position.x=0,this.gameObject.position.y=0,this.gameObject.position.z=-n,this.gameObject.quaternion.identity();const s=this.gameObject.getComponent(zn);let r=!1;s.sizeDelta.x!==this.context.domWidth&&(r=!0),s.sizeDelta.y!==this.context.domHeight&&(r=!0);const a=t.fieldOfView*Math.PI/180,l=2*Math.tan(a/2)*Math.abs(n);this.gameObject.scale.x=l/this.context.domHeight,this.gameObject.scale.y=l/this.context.domHeight,this.gameObject.scale.z=.01,r&&(s.sizeDelta.x=this.context.domWidth,s.sizeDelta.y=this.context.domHeight,s?.markDirty());break;case 2:this._lastWidth=-1,this._lastHeight=-1;break}}};bo([u()],un.prototype,"renderOnTop",1),bo([u()],un.prototype,"depthWrite",1),bo([u()],un.prototype,"doubleSided",1),bo([u()],un.prototype,"castShadows",1),bo([u()],un.prototype,"receiveShadows",1),bo([u()],un.prototype,"renderMode",1),bo([u(un)],un.prototype,"rootCanvas",1),bo([u()],un.prototype,"scaleFactor",1),bo([u(wi)],un.prototype,"worldCamera",2),bo([u()],un.prototype,"planeDistance",2);let Wl=un;var k2=Object.defineProperty,M2=Object.getOwnPropertyDescriptor,v0=(o,e,t,i)=>{for(var n=i>1?void 0:i?M2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&k2(e,t,n),n};class Zs extends E{get alpha(){return this._alpha}set alpha(e){e!==this._alpha&&(this._alpha=e,this.markDirty())}get isCanvasGroup(){return!0}_alpha=1;interactable=!0;blocksRaycasts=!0;_isDirty=!1;markDirty(){this._isDirty||(this._isDirty=!0,this.startCoroutine(this.applyChangesDelayed(),xe.OnBeforeRender))}*applyChangesDelayed(){this._isDirty=!1,this.applyChangesNow()}_buffer=[];applyChangesNow(){this._buffer.length=0;for(const e of x.getComponentsInChildren(this.gameObject,bn,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}v0([u()],Zs.prototype,"alpha",1),v0([u()],Zs.prototype,"interactable",2),v0([u()],Zs.prototype,"blocksRaycasts",2);class w0{get extensionName(){return"tmui"}onExportObject(e,t,i){const n=x.getComponent(e,Wl);if(n&&n.enabled&&n.renderMode===K1.WorldSpace){const s=new Hp,r=x.getComponent(e,zn),a=x.getComponent(e,Zs),l=new Array;if(r){if(!x.isActiveSelf(e)){const d=x.isActiveSelf(e);x.setActive(e,!0),r.onEnable(),r.updateTransform(),l.push(()=>{r.onDisable(),x.setActive(e,d)})}e.traverse(d=>{if(!x.isActiveInHierarchy(d)){const p=x.isActiveSelf(d);x.setActive(d,!0);const m=x.getComponent(d,bn);m&&(m.onEnable(),l.push(()=>{m.onDisable()}));const f=x.getComponent(d,zn);f&&(f.onEnable(),f.updateTransform(),f.onApplyTransform(),l.push(()=>{f.onDisable()}));const g=x.getComponent(d,Qt);g&&(g.onEnable(),l.push(()=>{g.onDisable()})),l.push(()=>{x.setActive(d,p)})}}),r.width,r.height;const c=ct.createEmpty(),h=r.shadowComponent;if(t.add(c),h){const d=h.matrix;c.setMatrix(d);const p=new Map,m=new Map;p.set(h,c),m.set(h,a?a.alpha:1),h.traverse(f=>{if(f===h)return;const g=ct.createEmpty();g.setMatrix(f.matrix);const y=f.parent,_=!!y&&typeof y.textContent=="string"&&y.textContent.length>0;let v=m.get(y)||1;const C=x.getComponent(f,Zs);if(C&&(v*=C.alpha),f instanceof H&&_){const k=f[Fi];k?s.exportText(k.gameObject,g,i):console.error("Error when exporting UI: shadow component owner not found. This is likely a bug.",f)}if(f instanceof H&&!_){const k=f.geometry.clone();k.scale(1,1,-1),this.flipWindingOrder(k),g.geometry=k;const j=new oe,L=f.material.opacity;j.copy(f.material.color),g.material=new Ce({color:j,opacity:L*v,map:f.material.map,transparent:!0})}p.set(f,g),m.set(f,v);const O=p.get(y);if(!O){console.error("Error when exporting UI: shadow component parent not found!",f,f.parent);return}O.add(g)})}}for(const c of l)c()}}flipWindingOrder(e){const t=e.index.array;for(let i=0,n=t.length/3;i<n;i++){const s=t[i*3];t[i*3]=t[i*3+2],t[i*3+2]=s}e.index.needsUpdate=!0}}const jh=w("debugusdz");function E2(o,e){const t=[],i=x.getComponentsInChildren(o,wt),n=x.getComponentsInChildren(o,Vt),s=new Array,r=new Array;if(e.injectImplicitBehaviours)for(const a of i){if(!a||!a.runtimeAnimatorController||!a.enabled)continue;const l=a.runtimeAnimatorController.activeState;if(!l||!l.motion||!l.motion.clip||l.motion.clip.tracks?.length<1||s.includes(a))continue;const c=new Ph;c.animator=a,c.stateName=l.name,c.trigger="start",c.name="PlayAnimationOnClick_implicitAtStart_"+c.stateName;const h=new M;x.addComponent(h,c),r.push(h),s.push(a),o.add(h)}else for(const a of i){if(!a||!a.runtimeAnimatorController||!a.enabled)continue;jh&&console.log(a);const l=[];for(const c of a.runtimeAnimatorController.enumerateActions()){jh&&console.log(c);const h=c.getClip();l.includes(h)||l.push(h)}t.push({root:a.gameObject,clips:l})}if(e.injectImplicitBehaviours)for(const a of n){if(!a||!a.clip||!a.enabled||!a.playAutomatically||s.includes(a))continue;const l=new Ph;l.animation=a,l.stateName=a.clip.name,l.trigger="start",l.name="PlayAnimationOnClick_implicitAtStart_"+l.stateName;const c=new M;x.addComponent(c,l),r.push(c),s.push(a),o.add(c)}else for(const a of n){jh&&console.log(a);const l=[];for(const c of a.animations)l.includes(c)||l.push(c);t.push({root:a.gameObject,clips:l})}jh&&t?.length>0&&console.log("USDZ Animation Clips without behaviours",t);for(const a of t)for(const l of a.clips)e.registerAnimation(a.root,l);return r}function R2(o,e){const t=x.getComponentsInChildren(o,Ni),i=x.getComponentsInChildren(o,$s),n=new Array,s=new Array;jh&&console.log({audioSources:t,playAudioOnClicks:i});for(const r of i){if(!r.target)continue;const a=t.indexOf(r.target);a>-1&&t.splice(a,1)}for(const r of t){if(!r||!r.clip||r.volume<=0||n.includes(r))continue;const a=new $s;a.target=r,a.name="PlayAudioOnClick_implicitAtStart_",a.trigger="start";const l=new M;x.addComponent(l,a),console.log("implicit PlayAudioOnStart",l,a),s.push(l),n.push(r),o.add(l)}return s}function T2(o){return new Ut("DisableAtStart",qt.sceneStartTrigger(),fe.fadeAction(o,0,!1))}function J1(o,e){const t=o.domElement.shadowRoot.querySelector("link[rel='ar']");if(t)return t;const i=document.createElement("div");i.classList.add("menu"),i.classList.add("quicklook-menu"),i.style.display="none",i.style.visibility="hidden";const n=document.createElement("button");n.id="open-in-ar",e?(n.innerText="View in AR",n.title="View this scene in AR. The scene will be exported to USDZ and opened with Apple's QuickLook."):(n.innerText="View in AR",n.title="Download this scene for AR. Open the downloaded USDZ file to view it in AR using Apple's QuickLook."),i.appendChild(n);const s=document.createElement("a");s.id="needle-usdz-link",s.style.display="none",s.rel="ar",s.href="",s.target="_blank",i.appendChild(s);const r=document.createElement("img");return r.id="button",s.appendChild(r),o.domElement.shadowRoot.appendChild(i),s}var A2=Object.defineProperty,At=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&A2(e,t,n),n};const It=w("debugusdz"),I2=w("debugusdzpruning");class ca{callToAction;checkoutTitle;checkoutSubtitle;callToActionURL}At([u()],ca.prototype,"callToAction"),At([u()],ca.prototype,"checkoutTitle"),At([u()],ca.prototype,"checkoutSubtitle"),At([u()],ca.prototype,"callToActionURL");const Pi=class Pa extends E{static beforeExport=new ae;static afterExport=new ae;static beforeLODExport=new ae;objectToExport=void 0;autoExportAnimations=!0;autoExportAudioSources=!0;exportFileName=void 0;customUsdzFile=void 0;customBranding;anchoringType="plane";maxTextureSize=2048;planeAnchoringAlignment="horizontal";interactive=!0;physics=!0;allowCreateQuicklookButton=!0;quickLookCompatible=!0;extensions=[];link;button;start(){It&&(console.log("USDZExporter",this),console.log("Debug USDZ Mode. Press 'T' to export"),window.addEventListener("keydown",e=>{e.key==="t"&&this.exportAndOpen()})),this.objectToExport||(this.objectToExport=this.gameObject),!this.objectToExport?.children?.length&&!this.objectToExport?.isMesh&&(this.objectToExport=this.context.scene)}onEnable(){const e=I.supportsQuickLookAR(),t=I.isiOS()||I.isiPad();!this.button&&(It||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=J1(this.context,e),this.link.addEventListener("message",this.lastCallback)),It&&ke("USDZ Exporter enabled: "+this.name),document.getElementById("open-in-ar")?.addEventListener("click",this.onClickedOpenInARElement),Wc.registerExporter(this)}onDisable(){this.button?.remove(),this.link?.removeEventListener("message",this.lastCallback),It&&ke("USDZ Exporter disabled: "+this.name),document.getElementById("open-in-ar")?.removeEventListener("click",this.onClickedOpenInARElement),Wc.unregisterExporter(this)}onClickedOpenInARElement=e=>{e.preventDefault(),this.exportAndOpen()};async exportAsync(){return this.exportAndOpen()}async exportAndOpen(){let e=this.exportFileName??this.objectToExport?.name??this.name;if(e+="-"+m1(),eo()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=J1(this.context,I.supportsQuickLookAR())),this.customUsdzFile)return It&&console.log("Exporting custom usdz",this.customUsdzFile),this.openInQuickLook(this.customUsdzFile,e),null;if(!this.objectToExport)return console.warn("No object to export",this),null;Pa.beforeExport.invoke({exporter:this});const t=await this.export(this.objectToExport).finally(()=>{Pa.afterExport.invoke({exporter:this})});return t?(It&&console.log("USDZ generation done. Downloading as "+e),this.openInQuickLook(t,e),t):(console.error("USDZ generation failed. Please report a bug",this),null)}async export(e){if(!e)return console.warn("No object to export"),null;const t=this._currentExportTasks.get(e);if(t)return t;const i=this.internalExport(e);return i instanceof Promise?(this._currentExportTasks.set(e,i),i.then(n=>(this._currentExportTasks.delete(e),n)).catch(n=>(this._currentExportTasks.delete(e),console.error("Error during USDZ export \u2013 please report a bug!",n),null))):i}_currentExportTasks=new Map;_previousTimeScale=1;async internalExport(e){le.start("export-usdz",{onProgress:O=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:O}}))}}),le.report("export-usdz",{message:"Starting export",totalSteps:40,currentStep:0}),le.report("export-usdz",{message:"Load progressive textures",autoStep:5}),le.start("export-usdz-textures","export-usdz");const t=x.getComponentsInChildren(e,Si);for(const O of t)O&&O.enabled&&O.updateSprite(!0);const i=x.getComponentsInChildren(e,oi),n=new Array;let s=0;for(const O of i){for(const k of O.sharedMeshes)if(k){let j=0;const L={exporter:this,type:"mesh",object:O.gameObject,mesh:k};if(Pa.beforeLODExport.invoke(L),L.overrideLevel!==void 0)if(L.overrideLevel===-1){It&&console.warn("Skipping LOD export for mesh due to overrideLevel -1",O.gameObject,k);continue}else L.overrideLevel>=0&&(j=L.overrideLevel,It&&console.log("Overriding LOD level for mesh export to level "+j+" "+k.name));const V=He.assignMeshLOD(k,j);V instanceof Promise&&n.push(new Promise((W,G)=>{V.then(()=>{s++,le.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:s,totalSteps:n.length}),W()}).catch(X=>G(X))}))}for(const k of O.sharedMaterials)if(k){let j=0;const L={exporter:this,type:"texture",object:O.gameObject,material:k};if(Pa.beforeLODExport.invoke(L),L.overrideLevel!==void 0)if(L.overrideLevel===-1){It&&console.warn("Skipping LOD assignment due to overrideLevel -1",O.gameObject,k);continue}else L.overrideLevel>=0&&(j=L.overrideLevel,It&&console.log("Overriding LOD level for texture export to level "+j+" "+k.name));const V=He.assignTextureLOD(k,j);V instanceof Promise&&n.push(new Promise((W,G)=>{V.then(()=>{s++,le.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:s,totalSteps:n.length}),W()}).catch(X=>G(X))}))}}It&&ke("Progressive Loading: "+n.length),await Promise.all(n),It&&ke("Progressive Loading: done"),le.end("export-usdz-textures");const r=li.Global.Mask;li.Global.Set(ho.AR);const a=new v1,l=new Dp(this.quickLookCompatible);let c;const h=[];this.interactive&&(h.push(new l0),h.push(new ka),globalThis.NEEDLE_USE_RAPIER&&x.getComponentsInChildren(e,Je).length>0&&(this.physics?(c=new c0,h.push(c)):A()&&console.warn("USDZExporter: Physics export is disabled, but there are active Rigidbody components in the scene. They will not be exported.")),h.push(new Hp),h.push(new w0));const d=[l,...h,...this.extensions],p={self:this,exporter:a,extensions:d,object:e};le.report("export-usdz","Invoking before-export"),this.dispatchEvent(new CustomEvent("before-export",{detail:p})),this.applyWebARSessionRoot(),this._previousTimeScale=this.context.time.timeScale,this.context.time.timeScale=0,le.report("export-usdz","auto export animations and audio sources");const m=new Array;this.autoExportAnimations&&m.push(...E2(e,l)),d.find(O=>O.extensionName==="Audio")&&this.autoExportAudioSources&&m.push(...R2(e)),a.debug=It,a.pruneUnusedNodes=!I2;const f=Ma.instance.objs.map(O=>O.batchedMesh);a.keepObject=O=>{let k=!0;const j=x.getComponent(O,oi);return j&&!j.enabled&&(k=!1),k&&f.includes(O)&&(k=!1),k&&x.getComponentInParent(O,_h)&&(k=!1),k&&x.getComponentInParent(O,so)&&(k=!1),It&&!k&&console.log("USDZExporter: Discarding object",O),k},a.beforeWritingDocument=()=>{if(A()&&l&&c){const O=l.animatedRoots;for(const k of O){const j=x.getComponentsInChildren(k,Je).filter(V=>V.enabled),L=x.getComponents(k,hn).filter(V=>V.enabled&&!V.isTrigger);(j.length>0||L.length>0)&&console.error("An animated object has physics components in its child hierarchy. This can lead to undefined behaviour due to a bug in Apple's QuickLook (FB15925487). Remove the physics components from child objects or verify that you get the expected results.",k)}}};const g=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(O=>{O.visible||g.push(O)});const y=d.find(O=>O.extensionName==="Behaviour");this.interactive&&y&&g.length>0&&y.addBehavior(T2(g));let _=!0;this.quickLookCompatible&&!this.interactive&&(_=!1),this.anchoringType!=="plane"&&this.anchoringType!=="none"&&this.anchoringType!=="image"&&this.anchoringType!=="face"&&(this.anchoringType="plane"),this.planeAnchoringAlignment!=="horizontal"&&this.planeAnchoringAlignment!=="vertical"&&this.planeAnchoringAlignment!=="any"&&(this.planeAnchoringAlignment="horizontal"),le.report("export-usdz","Invoking exporter.parse");const v=await a.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:d,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:_}),C=new Blob([v],{type:"model/vnd.usdz+zip"});this.revertWebARSessionRoot(),this.context.time.timeScale=this._previousTimeScale,le.report("export-usdz","Invoking after-export"),this.dispatchEvent(new CustomEvent("after-export",{detail:p}));for(const O of m)x.destroy(O);return li.Global.Set(r),le.end("export-usdz"),C}openInQuickLook(e,t){const i=e instanceof Blob?URL.createObjectURL(e):e,n=this.buildQuicklookOverlay();It&&console.log("QuickLook Overlay",n);const s=n.callToAction?encodeURIComponent(n.callToAction):"",r=n.checkoutTitle?encodeURIComponent(n.checkoutTitle):"",a=n.checkoutSubtitle?encodeURIComponent(n.checkoutSubtitle):"";this.link.href=i+`#callToAction=${s}&checkoutTitle=${r}&checkoutSubtitle=${a}&callToActionURL=${n.callToActionURL}`,this.lastCallback||(this.lastCallback=this.quicklookCallback.bind(this),this.link.addEventListener("message",this.lastCallback)),this.link.download=t+".usdz",this.link.click()}download(e,t){Pa.save(e,t)}static save(e,t){const i=document.createElement("a");i.style.display="none",document.body.appendChild(i),typeof e=="string"?i.href=e:i.href=URL.createObjectURL(e),i.download=t,i.click(),i.remove()}lastCallback;quicklookCallback(e){if(e?.data=="_apple_ar_quicklook_button_tapped"){It&&be("Quicklook closed via call to action button");var t=new CustomEvent("quicklook-button-tapped",{detail:this});if(this.dispatchEvent(t),!t.defaultPrevented){const i=new URLSearchParams(this.link.href);if(i){const n=i.get("callToActionURL");It&&ke("Quicklook url: "+n),n&&(eo()?globalThis.open(n,"_blank"):console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing",n))}}}}buildQuicklookOverlay(){const e={};return this.customBranding&&Object.assign(e,this.customBranding),eo()||(console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing"),e.callToAction="Close",e.checkoutTitle="\u{1F335} Made with Needle",e.checkoutSubtitle="_"),(e.callToAction?.length||e.checkoutTitle?.length||e.checkoutSubtitle?.length)&&(e.callToAction?.length||(e.callToAction="\0"),e.checkoutTitle?.length||(e.checkoutTitle="\0"),e.checkoutSubtitle?.length||(e.checkoutSubtitle="\0")),this.dispatchEvent(new CustomEvent("quicklook-overlay",{detail:e})),e}static invertForwardMatrix=new J().makeRotationY(Math.PI);static invertForwardQuaternion=new N().setFromEuler(new ht(0,Math.PI,0));_rootSessionRootWasAppliedTo=null;_rootPositionBeforeExport=new b;_rootRotationBeforeExport=new N;_rootScaleBeforeExport=new b;getARScaleAndTarget(){if(!this.objectToExport)return{scale:1,_invertForward:!1,target:this.gameObject,sessionRoot:null};const e=x.findObjectOfType(Wp);let t=x.getComponentInParent(this.objectToExport,xn);t||(t=x.getComponentInChildren(this.objectToExport,xn));let i=1,n=!1;const s=this.objectToExport;return e?i=e.arScale:t&&(i=t.arScale,n=t.invertForward),{scale:1/i,_invertForward:n,target:s,sessionRoot:t?.gameObject??null}}applyWebARSessionRoot(){if(!this.objectToExport)return;const{scale:e,_invertForward:t,target:i,sessionRoot:n}=this.getARScaleAndTarget(),s=n?.matrixWorld.clone().invert();this._rootSessionRootWasAppliedTo=i,this._rootPositionBeforeExport.copy(i.position),this._rootRotationBeforeExport.copy(i.quaternion),this._rootScaleBeforeExport.copy(i.scale),i.scale.multiplyScalar(e),t&&i.quaternion.multiply(Pa.invertForwardQuaternion),i.updateMatrix(),i.updateMatrixWorld(!0),n&&s&&i.matrix.premultiply(s)}revertWebARSessionRoot(){if(!this.objectToExport||!this._rootSessionRootWasAppliedTo)return;const e=this._rootSessionRootWasAppliedTo;e.position.copy(this._rootPositionBeforeExport),e.quaternion.copy(this._rootRotationBeforeExport),e.scale.copy(this._rootScaleBeforeExport),e.updateMatrix(),e.updateMatrixWorld(!0),this._rootSessionRootWasAppliedTo=null}createQuicklookButton(){const e=mr.getOrCreate().createQuicklookButton();return e.parentNode||this.context.menu.appendChild(e),e}};At([u(M)],Pi.prototype,"objectToExport"),At([u()],Pi.prototype,"autoExportAnimations"),At([u()],Pi.prototype,"autoExportAudioSources"),At([u()],Pi.prototype,"exportFileName"),At([u(URL)],Pi.prototype,"customUsdzFile"),At([u(ca)],Pi.prototype,"customBranding"),At([u()],Pi.prototype,"anchoringType"),At([u()],Pi.prototype,"maxTextureSize"),At([u()],Pi.prototype,"planeAnchoringAlignment"),At([u()],Pi.prototype,"interactive"),At([u()],Pi.prototype,"physics"),At([u()],Pi.prototype,"allowCreateQuicklookButton"),At([u()],Pi.prototype,"quickLookCompatible");let _o=Pi;XA({find:()=>pl(_o),create:()=>new _o});var L2=Object.defineProperty,D2=Object.getOwnPropertyDescriptor,x0=(o,e,t,i)=>{for(var n=D2(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&L2(e,t,n),n};class Vl extends E{get fog(){return this._fog||(this._fog=new Db(0,0,50)),this._fog}get mode(){return 1}set near(e){this.fog.near=e}get near(){return this.fog.near}set far(e){this.fog.far=e}get far(){return this.fog.far}set color(e){this.fog.color.copy(e)}get color(){return this.fog.color}_fog;onEnable(){this.scene.fog=this.fog}onDisable(){this.scene.fog===this._fog&&(this.scene.fog=null)}}x0([u()],Vl.prototype,"near"),x0([u()],Vl.prototype,"far"),x0([u(oe)],Vl.prototype,"color");var j2=Object.defineProperty,S0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&j2(e,t,n),n};class ha extends E{objectBounds=!1;color;isGizmo=!0;_gizmoObject=null;_boxHelper=null;onEnable(){this.isGizmo&&!Ic||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new dP(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=kf(this.color??16776960))),this.objectBounds?(this.scene.add(this._gizmoObject),this._boxHelper=this._gizmoObject,this.startCoroutine(this.syncObjectBounds(),xe.OnBeforeRender)):this.gameObject.add(this._gizmoObject))}onDisable(){this._gizmoObject&&this.gameObject.remove(this._gizmoObject)}*syncObjectBounds(){for(;this._boxHelper;)this._boxHelper?.update(),yield}}S0([u()],ha.prototype,"objectBounds"),S0([u(oe)],ha.prototype,"color"),S0([u()],ha.prototype,"isGizmo");var B2=Object.defineProperty,C0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&B2(e,t,n),n};class $l extends E{isGizmo=!1;color0;color1;gridHelper;size;divisions;offset;onEnable(){if(this.isGizmo&&!Ic)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new Rb(e,t,this.color0??new oe(.4,.4,.4),this.color1??new oe(.6,.6,.6)),this.offset!==void 0&&(this.gridHelper.position.y+=this.offset)),this.gridHelper&&this.gameObject.add(this.gridHelper)}onDisable(){this.gridHelper&&(this.gameObject.remove(this.gridHelper),this.gridHelper=null)}}C0([u()],$l.prototype,"isGizmo"),C0([u(oe)],$l.prototype,"color0"),C0([u(oe)],$l.prototype,"color1");var F2=Object.defineProperty,P0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&F2(e,t,n),n};class O0 extends E{connectedBody;get rigidBody(){return this._rigidBody}_rigidBody=null;onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(Je)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}P0([u(Je)],O0.prototype,"connectedBody");class k0 extends O0{createJoint(e,t){this.context.physics.engine?.addFixedJoint(e,t)}}class Bh extends O0{anchor;axis;createJoint(e,t){this.axis&&this.anchor&&this.context.physics.engine?.addHingeJoint(e,t,this.anchor,this.axis)}}P0([u(b)],Bh.prototype,"anchor"),P0([u(b)],Bh.prototype,"axis");var U2=Object.defineProperty,z2=Object.getOwnPropertyDescriptor,Gi=(o,e,t,i)=>{for(var n=i>1?void 0:i?z2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&U2(e,t,n),n};function Hl(o){return o*Math.PI/180}const eS=300,Ks=w("debuglights");class Lt extends E{type=0;get range(){return this._range}set range(e){this._range=e,this.light&&(this.light.type==="SpotLight"||this.light.type==="PointLight")&&"distance"in this.light&&(this.light.distance=e)}_range=1;get spotAngle(){return this._spotAngle}set spotAngle(e){this._spotAngle=e,this.light&&this.light.type==="SpotLight"&&"angle"in this.light&&(this.light.angle=Hl(e/2))}_spotAngle=30;get innerSpotAngle(){return this._innerSpotAngle}set innerSpotAngle(e){if(this._innerSpotAngle=e,this.light&&this.light.type==="SpotLight"&&"penumbra"in this.light){const t=this.spotAngle,i=1-Hl(e/2)/Hl(t/2);this.light.penumbra=i}}_innerSpotAngle=10;set color(e){this._color=e,this.light!==void 0&&(this.light.color=e)}get color(){return this.light?this.light.color:this._color}_color=new oe(16777215);set shadowNearPlane(e){if(e!==this._shadowNearPlane&&(this._shadowNearPlane=e,this.light?.shadow?.camera!==void 0)){const t=this.light.shadow.camera;t.near=e}}get shadowNearPlane(){return this._shadowNearPlane}_shadowNearPlane=.1;set shadowBias(e){e!==this._shadowBias&&(this._shadowBias=e,this.light?.shadow?.bias!==void 0&&(this.light.shadow.bias=e,this.light.shadow.needsUpdate=!0))}get shadowBias(){return this._shadowBias}_shadowBias=0;set shadowNormalBias(e){e!==this._shadowNormalBias&&(this._shadowNormalBias=e,this.light?.shadow?.normalBias!==void 0&&(this.light.shadow.normalBias=e,this.light.shadow.needsUpdate=!0))}get shadowNormalBias(){return this._shadowNormalBias}_shadowNormalBias=0;_overrideShadowBiasSettings=!1;set shadows(e){this._shadows=e,this.light&&(this.light.castShadow=e!==0,this.updateShadowSoftHard())}get shadows(){return this._shadows}_shadows=1;lightmapBakeType=4;set intensity(e){this._intensity=e,this.light&&(this.light.intensity=e),Ks&&console.log("Set light intensity to "+this._intensity,e,this)}get intensity(){return this._intensity}_intensity=-1;get shadowDistance(){const e=this.light;return e?.shadow?e.shadow.camera.far:-1}set shadowDistance(e){this._shadowDistance=e;const t=this.light;if(t?.shadow){const i=t.shadow.camera;i.far=e,i.updateProjectionMatrix()}}_shadowDistance;shadowWidth;shadowHeight;get shadowResolution(){const e=this.light;return e?.shadow?e.shadow.mapSize.x:-1}set shadowResolution(e){if(e===this._shadowResolution)return;this._shadowResolution=e;const t=this.light;t?.shadow&&(t.shadow.mapSize.set(e,e),t.shadow.needsUpdate=!0)}_shadowResolution=void 0;get isBaked(){return this.lightmapBakeType===2}get selfIsLight(){if(this.gameObject.isLight===!0)return!0;switch(this.gameObject.type){case"SpotLight":case"PointLight":case"DirectionalLight":return!0}return!1}light=void 0;getWorldPosition(e){return this.light?this.type===1?this.light.getWorldPosition(e).multiplyScalar(1):this.light.getWorldPosition(e):e}awake(){this.color=new oe(this.color??16777215),Ks&&console.log(this.name,this)}onEnable(){Ks&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Ks&&console.log("Set light intensity to "+this.light.intensity,this.name),this.selfIsLight||this.light.parent!==this.gameObject&&this.gameObject.add(this.light)),this.type===1&&this.startCoroutine(this.updateMainLightRoutine(),xe.LateUpdate))}onDisable(){Ks&&console.log("DISABLE LIGHT",this.name),this.light&&(this.selfIsLight?this.light.intensity=0:this.light.visible=!1)}createLight(){const e=this.selfIsLight;if(e&&!this.light)this.light=this.gameObject,this.light.name=this.name,this._intensity=this.light.intensity,this.type===1&&this.setDirectionalLight(this.light);else if(!this.light)switch(this.type){case 1:const t=new Um(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-eS*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),Pr(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Ks){const r=new pP(this.light,.2,this.color);this.context.scene.add(r)}break;case 0:const i=new uP(this.color,this.intensity*Math.PI,this.range,Hl(this.spotAngle/2),1-Hl(this.innerSpotAngle/2)/Hl(this.spotAngle/2),2);i.position.set(0,0,0),i.rotation.set(0,0,0),this.light=i;const n=i.target;i.add(n),n.position.set(0,0,this.range),n.rotation.set(0,0,0);break;case 2:const s=new zm(this.color,this.intensity*Math.PI,this.range);this.light=s;break}if(this.light){if(this._intensity>=0?this.light.intensity=this._intensity:this._intensity=this.light.intensity,this.shadows!==0?this.light.castShadow=!0:this.light.castShadow=!1,this.light.shadow){this._shadowResolution!==void 0&&this._shadowResolution>4?(this.light.shadow.mapSize.width=this._shadowResolution,this.light.shadow.mapSize.height=this._shadowResolution):(this.light.shadow.mapSize.width=2048,this.light.shadow.mapSize.height=2048),Ks&&console.log("Override shadow bias?",this._overrideShadowBiasSettings,this.shadowBias,this.shadowNormalBias),this.light.shadow.bias=this.shadowBias,this.light.shadow.normalBias=this.shadowNormalBias,this.updateShadowSoftHard();const t=this.light.shadow.camera;if(t.near=this.shadowNearPlane,this._shadowDistance!==void 0&&typeof this._shadowDistance=="number"?t.far=this._shadowDistance:t.far=eS*Math.abs(this.gameObject.scale.z),this.gameObject.scale.set(1,1,1),this.shadowWidth!==void 0)t.left=-this.shadowWidth/2,t.right=this.shadowWidth/2;else{const i=this.gameObject.scale.x;t.left*=i,t.right*=i}if(this.shadowHeight!==void 0)t.top=this.shadowHeight/2,t.bottom=-this.shadowHeight/2;else{const i=this.gameObject.scale.y;t.top*=i,t.bottom*=i}this.light.shadow.needsUpdate=!0,Ks&&this.context.scene.add(new mP(t))}this.isBaked?this.light.removeFromParent():e||this.gameObject.add(this.light)}}*updateMainLightRoutine(){for(;;){this.type===1&&((!this.context.mainLight||this.intensity>this.context.mainLight.intensity)&&(this.context.mainLight=this),yield);break}}static allowChangingRendererShadowMapType=!0;updateShadowSoftHard(){this.light&&this.light.shadow&&(this.shadows===2||(this.light.shadow.radius=1,this.light.shadow.blurSamples=1))}onEnterXR(e){this.applyXRScale(e.xr.rigScale)}onUpdateXR(e){this.applyXRScale(e.xr.rigScale)}onLeaveXR(e){this.applyXRScale(1)}applyXRScale(e){this.light&&(this.light.intensity=this._intensity/e,"distance"in this.light&&(this.light.distance=this._range/e))}setDirectionalLight(e){e.add(e.target),e.target.position.set(0,0,-1)}}Gi([u()],Lt.prototype,"type",2),Gi([u()],Lt.prototype,"range",1),Gi([u()],Lt.prototype,"spotAngle",1),Gi([u()],Lt.prototype,"innerSpotAngle",1),Gi([u(oe)],Lt.prototype,"color",1),Gi([u()],Lt.prototype,"shadowNearPlane",1),Gi([u()],Lt.prototype,"shadowBias",1),Gi([u()],Lt.prototype,"shadowNormalBias",1),Gi([u()],Lt.prototype,"shadows",1),Gi([u()],Lt.prototype,"lightmapBakeType",2),Gi([u()],Lt.prototype,"intensity",1),Gi([u()],Lt.prototype,"shadowDistance",1),Gi([u()],Lt.prototype,"shadowResolution",1),new b(0,0,0);var N2=Object.defineProperty,Gp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&N2(e,t,n),n};const M0=w("debuglods"),W2=w("nolods");class Gl{screenRelativeTransitionHeight;distance;renderers}Gp([u()],Gl.prototype,"screenRelativeTransitionHeight"),Gp([u()],Gl.prototype,"distance"),Gp([u(oi)],Gl.prototype,"renderers");class V2{model;get renderers(){return this.model.renderers}constructor(e){this.model=e}}class qp extends E{lodModels=[];_lods=[];_settings=[];_lodsHandler;start(){if(M0&&console.log("LODGROUP",this.name,this.lodModels,this),!W2&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const i of this.lodModels){const n=new V2(i);this._lods.push(n);for(const s of n.renderers)e.includes(s)||e.push(s)}this._lodsHandler=new Array;for(let i=0;i<e.length;i++){const n=new gP;this._lodsHandler.push(n),this.gameObject.add(n)}const t=new M;t.name="Cull "+this.name;for(let i=0;i<e.length;i++){const n=e[i],s=this._lodsHandler[i],r=n.gameObject;M0&&console.log(i,r.name);for(const a of this._lods){const l=a.model.distance;let c=null;if(a.renderers.includes(n)?c=r:c=t,c.type==="Group"){console.warn(`LODGroup ${this.name}: Group or MultiMaterial object's are not supported as LOD object: ${c.name}`);continue}M0&&console.log("LEVEL",c.name,l),s.autoUpdate=!1,this.onAddLodLevel(s,c,a.model.distance)}}}}onAfterRender(){if(!this.gameObject||!this._lodsHandler)return;const e=this.context.mainCamera;if(e)for(const t of this._lodsHandler){t.update(e);const i=t.getCurrentLevel(),n=t.levels[i];t.layers.mask=n.object.layers.mask}}onAddLodLevel(e,t,i){if(t===this.gameObject){console.warn("LODGroup component must be on parent object and not mesh directly at the moment",t.name,t);return}e.addLevel(t,i*this._distanceFactor,.01);const n={lod:e,levelIndex:e.levels.length-1,distance:i};this._settings.push(n)}_distanceFactor=1;distanceFactor(e){if(e!==this._distanceFactor){this._distanceFactor=e;for(const t of this._settings){const i=t.lod.levels[t.levelIndex];i.distance=t.distance*e}}}}Gp([u(Gl)],qp.prototype,"lodModels");var $2=Object.defineProperty,E0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&$2(e,t,n),n};const Xp=w("debugnestedgltf");class ql extends E{filePath;loaded=new ae;loadAssetInParent=!0;_isLoadingOrDoneLoading=!1;listenToProgress(e){this.filePath?.beginListenDownload(e)}preload(){return this.filePath?.preload()||null}async start(){if(this._isLoadingOrDoneLoading)return;Xp&&console.log(this,this.guid);const e=this.gameObject.parent;if(e&&this.filePath){this._isLoadingOrDoneLoading=!0;const t=new qn;t.idProvider=new kt(this.hash(this.guid)),t.parent=this.loadAssetInParent!==!1?e:this.gameObject,this.gameObject.updateMatrix();const i=this.gameObject.matrix;Xp&&console.log("Load nested:",this.filePath?.url??this.filePath,this.gameObject.position);const n=await this.filePath?.instantiate?.call(this.filePath,t);Xp&&console.log("Nested loaded:",this.filePath?.url??this.filePath,n),n&&this.loadAssetInParent!==!1&&(n.matrixAutoUpdate=!1,n.matrix.identity(),n.applyMatrix4(i),n.matrixAutoUpdate=!0,n.layers.disableAll(),n.layers.set(this.layer),this.loaded.invoke({component:this,instance:n,asset:this.filePath})),Xp&&console.log("Nested loading done:",this.filePath?.url??this.filePath,n)}}onDestroy(){this.filePath?.unload()}hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}E0([u(ne)],ql.prototype,"filePath"),E0([u(ae)],ql.prototype,"loaded"),E0([u()],ql.prototype,"loadAssetInParent");var H2=Object.defineProperty,R0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&H2(e,t,n),n};const G2=w("debugnet"),Qp=class kb extends E{url=null;urlParameterName=null;localhost=null;awake(){G2&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?kb.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const i=w(this.urlParameterName);i&&typeof i=="string"&&(e=i)}if(!e)return null;const t=new RegExp("(((https?)|(?<socket_prefix>wss?))://)?(www.)?(?<url>.+)","gm").exec(e);return t?.groups?t?.groups.socket_prefix?e:"wss://"+t?.groups.url:null}static GetUrl(e,t){let i=e;const n=kb.IsLocalNetwork()&&t;if(n&&(i=t),e?.startsWith("/")){const s=n?i:window.location.origin;s?.endsWith("/")&&e.startsWith("/")&&(e=e.substring(1)),i=s+e}return i}static IsLocalNetwork(e=window.location.hostname){return Di(e)}};R0([u()],Qp.prototype,"url"),R0([u()],Qp.prototype,"urlParameterName"),R0([u()],Qp.prototype,"localhost");let T0=Qp;var q2=Object.defineProperty,Yp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&q2(e,t,n),n};class da extends E{referenceSpace;from;affectPosition=!1;affectRotation=!1;alignLookDirection=!1;levelLookDirection=!1;levelPosition=!1;positionOffset=new b(0,0,0);rotationOffset=new b(0,0,0);offset=new b(0,0,0);update(){if(!this.from)return;var e=ee(this.from),t=_e(this.from);this.offset.copy(this.positionOffset);const i=this.offset.length();if(this.referenceSpace&&this.offset.transformDirection(this.referenceSpace.matrixWorld).multiplyScalar(i),e.add(this.offset),this.levelPosition&&this.referenceSpace){const a=new wr(this.gameObject.up,0),l=ee(this.referenceSpace);a.setFromNormalAndCoplanarPoint(this.gameObject.up,l);const c=new b(0,0,0);a.projectPoint(e,c),e.copy(c)}this.affectPosition&&bt(this.gameObject,e);const n=new ht(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),s=new N().setFromEuler(n);this.affectRotation&&kn(this.gameObject,t.multiply(s));const r=new b;this.from.getWorldDirection(r).multiplyScalar(50),this.levelLookDirection&&(r.y=0),this.alignLookDirection&&this.gameObject.lookAt(r)}}Yp([u(x)],da.prototype,"referenceSpace"),Yp([u(x)],da.prototype,"from"),Yp([u(b)],da.prototype,"positionOffset"),Yp([u(b)],da.prototype,"rotationOffset");var X2=Object.defineProperty,Js=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&X2(e,t,n),n};class Oi{time=0;value=0;inTangent=1/0;inWeight;outTangent=1/0;outWeight;weightedMode;constructor(e=0,t=0){this.time=e,this.value=t}}Js([u()],Oi.prototype,"time"),Js([u()],Oi.prototype,"value"),Js([u()],Oi.prototype,"inTangent"),Js([u()],Oi.prototype,"inWeight"),Js([u()],Oi.prototype,"outTangent"),Js([u()],Oi.prototype,"outWeight"),Js([u()],Oi.prototype,"weightedMode");const tS=class Cd{static linearFromTo(e,t,i){const n=new Cd,s=new Oi;s.time=0,s.value=e;const r=new Oi;return r.time=i,r.value=t,n.keys.push(s,r),n}static constant(e){const t=new Cd,i=new Oi;return i.time=0,i.value=e,t.keys.push(i),t}keys=[];clone(){const e=new Cd;return e.keys=this.keys?.map(t=>{const i=new Oi;return i.time=t.time,i.value=t.value,i.inTangent=t.inTangent,i.inWeight=t.inWeight,i.outTangent=t.outTangent,i.outWeight=t.outWeight,i.weightedMode=t.weightedMode,i})||[],e}get duration(){return!this.keys||this.keys.length==0?0:this.keys[this.keys.length-1].time}evaluate(e){if(!this.keys||this.keys.length==0)return 0;if(this.keys.length===1)return this.keys[0].value;if(this.keys[0].time>=e)return this.keys[0].value;for(let t=0;t<this.keys.length;t++){const i=this.keys[t];if(i.time<=e)if(t+1<this.keys.length){const n=this.keys[t+1];if(n.time<e)continue;return!isFinite(i.outTangent)||!isFinite(n.inTangent)?i.value:Cd.interpolateValue(e,i,n)}else return i.value}return this.keys[this.keys.length-1].value}static interpolateValue(e,t,i){const n=t.time,s=t.value,r=t.outTangent,a=i.time,l=i.value,c=i.inTangent,h=a-n,d=h*h,p=d*h,m=((r+c)*h-2*(l-s))/p,f=(3*(l-s)-(c+2*r)*h)/d,g=r,y=s,_=e-n,v=_*_,C=v*_;return m*C+f*v+g*_+y}};Js([u(Oi)],tS.prototype,"keys");let Fh=tS;var Q2=Object.defineProperty,S=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&Q2(e,t,n),n};const Zp=w("debugparticles");var os=(o=>(o[o.Billboard=0]="Billboard",o[o.Stretch=1]="Stretch",o[o.HorizontalBillboard=2]="HorizontalBillboard",o[o.VerticalBillboard=3]="VerticalBillboard",o[o.Mesh=4]="Mesh",o))(os||{});class ua{alphaKeys=[];colorKeys=[];get duration(){return 1}evaluate(e,t){let i,n=0,s=null,r=0;for(let a=0;a<this.alphaKeys.length;a++){const l=this.alphaKeys[a];(l.time<e||!i)&&(i=l,n=a)}for(let a=0;a<this.colorKeys.length;a++){const l=this.colorKeys[a];(l.time<e||!s)&&(s=l,r=a)}if(s)if(r+1<this.colorKeys.length){const a=this.colorKeys[r+1],l=D.remap(e,s.time,a.time,0,1);t.r=D.lerp(s.color.r,a.color.r,l),t.g=D.lerp(s.color.g,a.color.g,l),t.b=D.lerp(s.color.b,a.color.b,l)}else t.r=s.color.r,t.g=s.color.g,t.b=s.color.b;if(i)if(n+1<this.alphaKeys.length){const a=this.alphaKeys[n+1],l=D.remap(e,i.time,a.time,0,1);t.alpha=D.lerp(i.alpha,a.alpha,l)}else t.alpha=i.alpha;return t}}S([u()],ua.prototype,"alphaKeys"),S([u()],ua.prototype,"colorKeys");var Uh=(o=>(o[o.Local=0]="Local",o[o.World=1]="World",o[o.Custom=2]="Custom",o))(Uh||{}),Kp=(o=>(o[o.Sphere=0]="Sphere",o[o.SphereShell=1]="SphereShell",o[o.Hemisphere=2]="Hemisphere",o[o.HemisphereShell=3]="HemisphereShell",o[o.Cone=4]="Cone",o[o.Box=5]="Box",o[o.Mesh=6]="Mesh",o[o.ConeShell=7]="ConeShell",o[o.ConeVolume=8]="ConeVolume",o[o.ConeVolumeShell=9]="ConeVolumeShell",o[o.Circle=10]="Circle",o[o.CircleEdge=11]="CircleEdge",o[o.SingleSidedEdge=12]="SingleSidedEdge",o[o.MeshRenderer=13]="MeshRenderer",o[o.SkinnedMeshRenderer=14]="SkinnedMeshRenderer",o[o.BoxShell=15]="BoxShell",o[o.BoxEdge=16]="BoxEdge",o[o.Donut=17]="Donut",o[o.Rectangle=18]="Rectangle",o[o.Sprite=19]="Sprite",o[o.SpriteRenderer=20]="SpriteRenderer",o))(Kp||{});const ss=class Pd{static constant(e){const t=new Pd;return t.setConstant(e),t}static betweenTwoConstants(e,t){const i=new Pd;return i.setMinMaxConstant(e,t),i}static curve(e,t=1){const i=new Pd;return i.setCurve(e,t),i}setConstant(e){this.mode=0,this.constant=e}setMinMaxConstant(e,t){this.mode=3,this.constantMin=e,this.constantMax=t}setCurve(e,t=1){this.mode=1,this.curve=e,this.curveMultiplier=t}mode="Constant";constant;constantMin;constantMax;curve;curveMin;curveMax;curveMultiplier;clone(){const e=new Pd;return e.mode=this.mode,e.constant=this.constant,e.constantMin=this.constantMin,e.constantMax=this.constantMax,e.curve=this.curve?.clone(),e.curveMin=this.curveMin?.clone(),e.curveMax=this.curveMax?.clone(),e.curveMultiplier=this.curveMultiplier,e}evaluate(e,t){const i=t===void 0?Math.random():t;switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return e=D.clamp01(e),this.curve.evaluate(e)*this.curveMultiplier;case 2:case"TwoCurves":const n=e*this.curveMin.duration,s=e*this.curveMax.duration;return D.lerp(this.curveMin.evaluate(n),this.curveMax.evaluate(s),i%1)*this.curveMultiplier;case 3:case"TwoConstants":return D.lerp(this.constantMin,this.constantMax,i%1);default:this.curveMax.evaluate(e)*this.curveMultiplier;break}return 0}getMax(){switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return this.getMaxFromCurve(this.curve)*this.curveMultiplier;case 2:case"TwoCurves":return Math.max(this.getMaxFromCurve(this.curveMin),this.getMaxFromCurve(this.curveMax))*this.curveMultiplier;case 3:case"TwoConstants":return Math.max(this.constantMin,this.constantMax);default:return 0}}getMaxFromCurve(e){if(!e)return 0;let t=Number.MIN_VALUE;for(let i=0;i<e.keys.length;i++){const n=e.keys[i];n.value>t&&(t=n.value)}return t}};S([u()],ss.prototype,"mode"),S([u()],ss.prototype,"constant"),S([u()],ss.prototype,"constantMin"),S([u()],ss.prototype,"constantMax"),S([u(Fh)],ss.prototype,"curve"),S([u(Fh)],ss.prototype,"curveMin"),S([u(Fh)],ss.prototype,"curveMax"),S([u()],ss.prototype,"curveMultiplier");let Y=ss;const er=class Ft{static constant(e){const t=new Ft;return t.constant(e),t}static betweenTwoColors(e,t){const i=new Ft;return i.betweenTwoColors(e,t),i}constant(e){return this.mode=0,this.color=e,this}betweenTwoColors(e,t){return this.mode=2,this.colorMin=e,this.colorMax=t,this}mode=0;color;colorMin;colorMax;gradient;gradientMin;gradientMax;static _temp=new se(0,0,0,1);static _temp2=new se(0,0,0,1);evaluate(e,t){const i=t===void 0?Math.random():t;switch(this.mode){case 0:case"Color":return this.color;case 1:case"Gradient":return this.gradient.evaluate(e,Ft._temp),Ft._temp;case 2:case"TwoColors":return Ft._temp.lerpColors(this.colorMin,this.colorMax,i);case 3:case"TwoGradients":return this.gradientMin.evaluate(e,Ft._temp),this.gradientMax.evaluate(e,Ft._temp2),Ft._temp.lerp(Ft._temp2,i);case 4:case"RandomColor":const n=Math.random();return this.gradientMin.evaluate(e,Ft._temp),this.gradientMax.evaluate(e,Ft._temp2),Ft._temp.lerp(Ft._temp2,n)}return Ft._temp.set(16777215),Ft._temp.alpha=1,Ft._temp}};S([u()],er.prototype,"mode"),S([u(se)],er.prototype,"color"),S([u(se)],er.prototype,"colorMin"),S([u(se)],er.prototype,"colorMax"),S([u(ua)],er.prototype,"gradient"),S([u(ua)],er.prototype,"gradientMin"),S([u(ua)],er.prototype,"gradientMax");let pa=er;var A0=(o=>(o[o.Hierarchy=0]="Hierarchy",o[o.Local=1]="Local",o[o.Shape=2]="Shape",o))(A0||{});class Yt{cullingMode;duration;emitterVelocityMode;flipRotation;gravityModifier;gravityModifierMultiplier;loop;maxParticles;playOnAwake;prewarm;ringBufferLoopRange;ringBufferMode;scalingMode;simulationSpace;simulationSpeed;startColor;startDelay;startDelayMultiplier;startLifetime;startLifetimeMultiplier;startRotation;startRotationMultiplier;startRotation3D;startRotationX;startRotationXMultiplier;startRotationY;startRotationYMultiplier;startRotationZ;startRotationZMultiplier;startSize;startSize3D;startSizeMultiplier;startSizeX;startSizeXMultiplier;startSizeY;startSizeYMultiplier;startSizeZ;startSizeZMultiplier;startSpeed;startSpeedMultiplier;stopAction;useUnscaledTime}S([u(Y)],Yt.prototype,"gravityModifier"),S([u(pa)],Yt.prototype,"startColor"),S([u(Y)],Yt.prototype,"startDelay"),S([u(Y)],Yt.prototype,"startLifetime"),S([u(Y)],Yt.prototype,"startRotation"),S([u(Y)],Yt.prototype,"startRotationX"),S([u(Y)],Yt.prototype,"startRotationY"),S([u(Y)],Yt.prototype,"startRotationZ"),S([u(Y)],Yt.prototype,"startSize"),S([u(Y)],Yt.prototype,"startSizeX"),S([u(Y)],Yt.prototype,"startSizeY"),S([u(Y)],Yt.prototype,"startSizeZ"),S([u(Y)],Yt.prototype,"startSpeed");class Jp{cycleCount;maxCount;minCount;probability;repeatInterval;time;count;_performed=0;reset(){this._performed=0}run(e){if(e<=this.time)return 0;let t=0;if(this.cycleCount===0||this._performed<this.cycleCount){const i=this.time+this.repeatInterval*this._performed;if(e>=i&&(this._performed+=1,Math.random()<this.probability))switch(this.count.mode){case 0:t=this.count.constant;break;case 3:t=D.lerp(this.count.constantMin,this.count.constantMax,Math.random());break;case 1:t=this.count.curve.evaluate(Math.random());break;case 2:const n=Math.random();t=D.lerp(this.count.curveMin.evaluate(n),this.count.curveMax.evaluate(n),Math.random());break}}return t}}class rs{enabled;get burstCount(){return this.bursts?.length??0}bursts;rateOverTime;rateOverTimeMultiplier;rateOverDistance;rateOverDistanceMultiplier;system;reset(){this.bursts?.forEach(e=>e.reset())}getBurst(){let e=0;if(this.burstCount>0)for(let t=0;t<this.burstCount;t++){const i=this.bursts[t];this.system.main.loop&&i.time>=this.system.time&&i.reset(),e+=Math.round(i.run(this.system.time))}return e}}S([u()],rs.prototype,"enabled"),S([u()],rs.prototype,"bursts"),S([u(Y)],rs.prototype,"rateOverTime"),S([u()],rs.prototype,"rateOverTimeMultiplier"),S([u(Y)],rs.prototype,"rateOverDistance"),S([u()],rs.prototype,"rateOverDistanceMultiplier");class em{enabled;color}S([u(pa)],em.prototype,"color");class ma{enabled;separateAxes;size;sizeMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;_time=0;_temp=new b;evaluate(e,t,i){if(t||(t=this._temp),!this.enabled)return t.x=t.y=t.z=1,t;if(this.separateAxes)t.x=this.x.evaluate(e,i)*this.xMultiplier,t.y=this.y.evaluate(e,i)*this.yMultiplier,t.z=this.z.evaluate(e,i)*this.zMultiplier;else{const n=this.size.evaluate(e,i)*this.sizeMultiplier;t.x=n}return t}}S([u(Y)],ma.prototype,"size"),S([u(Y)],ma.prototype,"x"),S([u(Y)],ma.prototype,"y"),S([u(Y)],ma.prototype,"z");const ot=class Od{get type(){return Kp[this.shapeType]}initialize(e){this.onInitialize(e),e.position.x=this._vector.x,e.position.y=this._vector.y,e.position.z=this._vector.z}toJSON(){return this}clone(){return new Od}shapeType=5;enabled=!0;alignToDirection=!1;angle=0;arc=360;arcSpread;arcSpeedMultiplier;arcMode;boxThickness;position;rotation;_rotation=new ht;scale;radius;radiusThickness;sphericalDirectionAmount;randomDirectionAmount;randomPositionAmount;meshShapeType;meshRenderer;_meshObj;_meshGeometry;setMesh(e){this.meshRenderer=e,e?(this._meshObj=e.sharedMeshes[Math.floor(Math.random()*e.sharedMeshes.length)],this._meshGeometry=this._meshObj.geometry):(this._meshObj=void 0,this._meshGeometry=void 0)}system;_space;_worldSpaceMatrix=new J;_worldSpaceMatrixInverse=new J;constructor(){Zp&&console.log(this)}update(e,t){}onUpdate(e,t,i,n){this.system=e,this._space=i,i===1&&(this._worldSpaceMatrix.copy(n.matrixWorld),this._worldSpaceMatrix.elements[0]=1,this._worldSpaceMatrix.elements[5]=1,this._worldSpaceMatrix.elements[10]=1,this._worldSpaceMatrixInverse.copy(this._worldSpaceMatrix).invert())}applyRotation(e){const t=this.rotation.x!==0||this.rotation.y!==0||this.rotation.z!==0;return t&&(this._rotation.x=D.toRadians(this.rotation.x),this._rotation.y=D.toRadians(this.rotation.y),this._rotation.z=D.toRadians(this.rotation.z),this._rotation.order="ZYX",e.applyEuler(this._rotation)),t}_vector=new b(0,0,0);_temp=new b(0,0,0);_triangle=new fP;onInitialize(e){this._vector.set(0,0,0),e.mesh=void 0,e.mesh_geometry=void 0;const t=this._temp.copy(this.position),i=this._space===1;i&&t.applyQuaternion(this.system.worldQuaternion);let n=this.radius;if(i&&(n*=this.system.worldScale.x),this.enabled){switch(this.shapeType){case 5:Zp&&B.DrawWireBox(this.position,this.scale,14540253,1),this._vector.x=Math.random()*this.scale.x-this.scale.x/2,this._vector.y=Math.random()*this.scale.y-this.scale.y/2,this._vector.z=Math.random()*this.scale.z-this.scale.z/2,this._vector.add(t);break;case 4:this.randomConePoint(this.position,this.angle,n,this.radiusThickness,this.arc,this.arcMode,this._vector);break;case 0:this.randomSpherePoint(this.position,n,this.radiusThickness,this.arc,this._vector);break;case 10:this.randomCirclePoint(this.position,n,this.radiusThickness,this.arc,this._vector);break;case 13:const s=this.meshRenderer;s?.destroyed==!1&&this.setMesh(s);const r=e.mesh=this._meshObj,a=e.mesh_geometry=this._meshGeometry;if(r&&a)switch(this.meshShapeType){case 0:{const l=a.getAttribute("position"),c=Math.floor(Math.random()*l.count);this._vector.fromBufferAttribute(l,c),this._vector.applyMatrix4(r.matrixWorld),e.mesh_normal=c}break;case 1:break;case 2:{const l=a.index;if(l){let c=Math.random(),h=Math.random();c+h>1&&(c=1-c,h=1-h);const d=Math.floor(Math.random()*(l.count/3));let p=d*3,m=d*3+1,f=d*3+2;p=l.getX(p),m=l.getX(m),f=l.getX(f);const g=a.getAttribute("position");this._triangle.a.fromBufferAttribute(g,p),this._triangle.b.fromBufferAttribute(g,m),this._triangle.c.fromBufferAttribute(g,f),this._vector.set(0,0,0).addScaledVector(this._triangle.a,c).addScaledVector(this._triangle.b,h).addScaledVector(this._triangle.c,1-(c+h)),this._vector.applyMatrix4(r.matrixWorld),e.mesh_normal=d}}break}break;default:this._vector.set(0,0,0),A()&&!globalThis.__particlesystem_shapetype_unsupported&&(console.warn("ParticleSystem ShapeType is not supported:",Kp[this.shapeType]),globalThis.__particlesystem_shapetype_unsupported=!0);break}this.randomizePosition(this._vector,this.randomPositionAmount)}this.applyRotation(this._vector),i&&(this._vector.applyQuaternion(this.system.worldQuaternion),this._vector.add(this.system.worldPos)),Zp&&B.DrawSphere(this._vector,.03,16711680,.5,!0)}_dir=new b;getDirection(e,t){if(!this.enabled)return this._dir.set(0,0,1),this._dir;switch(this.shapeType){case 5:this._dir.set(0,0,1);break;case 4:this._dir.set(0,0,1);break;case 10:case 0:const i=t.x,n=t.y,s=t.z;this._dir.set(i,n,s),this.system?.worldspace?this._dir.sub(this.system.worldPos):this._dir.sub(this.position);break;case 13:const r=e.mesh,a=e.mesh_geometry;if(r&&a)switch(this.meshShapeType){case 0:{const l=a.getAttribute("normal"),c=e.mesh_normal;this._dir.fromBufferAttribute(l,c)}break;case 1:break;case 2:{const l=a.index;if(l){const c=e.mesh_normal,h=l.getX(c*3),d=l.getX(c*3+1),p=l.getX(c*3+2),m=a.getAttribute("position"),f=F(),g=F(),y=F();f.fromBufferAttribute(m,h),g.fromBufferAttribute(m,d),y.fromBufferAttribute(m,p),f.sub(g),y.sub(g),f.cross(y),this._dir.copy(f).multiplyScalar(-1);const _=_e(r);this._dir.applyQuaternion(_)}}break}break;default:this._dir.set(0,0,1);break}return this._space===1&&this._dir.applyQuaternion(this.system.worldQuaternion),this.applyRotation(this._dir),this._dir.normalize(),this.spherizeDirection(this._dir,this.sphericalDirectionAmount),this.randomizeDirection(this._dir,this.randomDirectionAmount),Zp&&(B.DrawSphere(t,.01,8925952,.5,!0),B.DrawDirection(t,this._dir,8925952,.5,!0)),this._dir}static _randomQuat=new N;static _tempVec=new b;randomizePosition(e,t){if(t<=0)return;const i=Od._tempVec;i.set(Math.random()*2-1,Math.random()*2-1,Math.random()*2-1),i.x*=t*this.scale.x,i.y*=t*this.scale.y,i.z*=t*this.scale.z,e.add(i)}randomizeDirection(e,t){if(t===0)return;const i=Od._randomQuat,n=Od._tempVec;n.set(Math.random()-.5,Math.random()-.5,Math.random()-.5).normalize(),i.setFromAxisAngle(n,t*Math.random()*Math.PI),e.applyQuaternion(i)}spherizeDirection(e,t){if(t===0)return;const i=Math.random()*Math.PI*2,n=Math.acos(1-Math.random()*2),s=Math.sin(n)*Math.cos(i),r=Math.sin(n)*Math.sin(i),a=Math.cos(n),l=new b(s,r,a);e.lerp(l,t)}randomSpherePoint(e,t,i,n,s){const r=Math.random(),a=Math.random(),l=2*Math.PI*r*(n/360),c=Math.acos(2*a-1),h=D.lerp(1,1-Math.pow(1-Math.random(),Math.PI),i)*t,d=e.x+this.scale.x*(-h*Math.sin(c)*Math.cos(l)),p=e.y+this.scale.y*(h*Math.sin(c)*Math.sin(l)),m=e.z+this.scale.z*(h*Math.cos(c));s.x=d,s.y=p,s.z=m}randomCirclePoint(e,t,i,n,s){const r=Math.random(),a=2*Math.PI*r*(n/360),l=D.lerp(1,1-Math.pow(1-Math.random(),Math.PI),i)*t,c=e.x+this.scale.x*l*Math.cos(a),h=e.y+this.scale.y*l*Math.sin(a),d=e.z;s.x=c,s.y=h,s.z=d}_loopTime=0;_loopDirection=1;randomConePoint(e,t,i,n,s,r,a){let l=0,c=0;switch(r){case 0:l=Math.random(),c=Math.random();break;case 2:this._loopTime>1&&(this._loopDirection=-1),this._loopTime<0&&(this._loopDirection=1);case 1:l=.5,c=Math.random(),this._loopTime+=this.system.deltaTime*this._loopDirection;break}let h=2*Math.PI*l*(s/360);switch(r){case 2:case 1:h+=Math.PI+.5,h+=this._loopTime*Math.PI*2,h%=D.toRadians(s);break}const d=Math.acos(2*c-1),p=D.lerp(1,1-Math.pow(1-Math.random(),Math.PI),n)*i,m=e.x+-p*Math.sin(d)*Math.cos(h),f=e.y+p*Math.sin(d)*Math.sin(h),g=e.z;a.x=m*this.scale.x,a.y=f*this.scale.y,a.z=g*this.scale.z}};S([u()],ot.prototype,"shapeType"),S([u()],ot.prototype,"enabled"),S([u()],ot.prototype,"alignToDirection"),S([u()],ot.prototype,"angle"),S([u()],ot.prototype,"arc"),S([u()],ot.prototype,"arcSpread"),S([u()],ot.prototype,"arcSpeedMultiplier"),S([u()],ot.prototype,"arcMode"),S([u(b)],ot.prototype,"boxThickness"),S([u(b)],ot.prototype,"position"),S([u(b)],ot.prototype,"rotation"),S([u(b)],ot.prototype,"scale"),S([u()],ot.prototype,"radius"),S([u()],ot.prototype,"radiusThickness"),S([u()],ot.prototype,"sphericalDirectionAmount"),S([u()],ot.prototype,"randomDirectionAmount"),S([u()],ot.prototype,"randomPositionAmount"),S([u()],ot.prototype,"meshShapeType"),S([u(xh)],ot.prototype,"meshRenderer");let I0=ot;class ve{damping;enabled;frequency;octaveCount;octaveMultiplier;octaveScale;positionAmount;quality;remap;remapEnabled;remapMultiplier;remapX;remapXMultiplier;remapY;remapYMultiplier;remapZ;remapZMultiplier;scrollSpeedMultiplier;separateAxes;strengthMultiplier;strengthX;strengthXMultiplier;strengthY;strengthYMultiplier;strengthZ;strengthZMultiplier;_noise;_time=0;update(e){this._time+=e.time.deltaTime*this.scrollSpeedMultiplier}_temp=new b;apply(e,t,i,n,s,r){if(!this.enabled)return;this._noise||(this._noise=YP(()=>0));const a=this._temp.set(t.x,t.y,t.z).multiplyScalar(this.frequency),l=this._noise(a.x,a.y,a.z,this._time),c=this._noise(a.x,a.y,a.z,this._time+1e3*this.frequency),h=this._noise(a.x,a.y,a.z,this._time+2e3*this.frequency);this._temp.set(l,c,h).normalize();const d=s/r;let p=this.positionAmount.evaluate(d);this.separateAxes?(this._temp.x*=p*this.strengthXMultiplier,this._temp.y*=p*this.strengthYMultiplier,this._temp.z*=p*this.strengthZMultiplier):(this.strengthX&&(p*=this.strengthX.evaluate(d)*1.5),this._temp.multiplyScalar(p)),i.x+=this._temp.x,i.y+=this._temp.y,i.z+=this._temp.z}}S([u()],ve.prototype,"damping"),S([u()],ve.prototype,"enabled"),S([u()],ve.prototype,"frequency"),S([u()],ve.prototype,"octaveCount"),S([u()],ve.prototype,"octaveMultiplier"),S([u()],ve.prototype,"octaveScale"),S([u(Y)],ve.prototype,"positionAmount"),S([u()],ve.prototype,"quality"),S([u(Y)],ve.prototype,"remap"),S([u()],ve.prototype,"remapEnabled"),S([u()],ve.prototype,"remapMultiplier"),S([u(Y)],ve.prototype,"remapX"),S([u()],ve.prototype,"remapXMultiplier"),S([u(Y)],ve.prototype,"remapY"),S([u()],ve.prototype,"remapYMultiplier"),S([u(Y)],ve.prototype,"remapZ"),S([u()],ve.prototype,"remapZMultiplier"),S([u()],ve.prototype,"scrollSpeedMultiplier"),S([u()],ve.prototype,"separateAxes"),S([u()],ve.prototype,"strengthMultiplier"),S([u(Y)],ve.prototype,"strengthX"),S([u()],ve.prototype,"strengthXMultiplier"),S([u(Y)],ve.prototype,"strengthY"),S([u()],ve.prototype,"strengthYMultiplier"),S([u(Y)],ve.prototype,"strengthZ"),S([u()],ve.prototype,"strengthZMultiplier");class Ue{enabled;attachRibbonToTransform=!1;colorOverLifetime;colorOverTrail;dieWithParticles=!0;inheritParticleColor=!0;lifetime;lifetimeMultiplier;minVertexDistance=.2;mode=0;ratio=1;ribbonCount=1;shadowBias=0;sizeAffectsLifetime=!1;sizeAffectsWidth=!1;splitSubEmitterRibbons=!1;textureMode=0;widthOverTrail;widthOverTrailMultiplier;worldSpace=!1;getWidth(e,t,i,n){const s=this.widthOverTrail.evaluate(i,n);return e*=s,e}getColor(e,t,i){const n=this.colorOverTrail.evaluate(i),s=this.colorOverLifetime.evaluate(t);e.x*=n.r*s.r,e.y*=n.g*s.g,e.z*=n.b*s.b,"alpha"in n&&"alpha"in s&&(e.w*=n.alpha*s.alpha)}}S([u()],Ue.prototype,"enabled"),S([u()],Ue.prototype,"attachRibbonToTransform"),S([u(pa)],Ue.prototype,"colorOverLifetime"),S([u(pa)],Ue.prototype,"colorOverTrail"),S([u()],Ue.prototype,"dieWithParticles"),S([u()],Ue.prototype,"inheritParticleColor"),S([u(Y)],Ue.prototype,"lifetime"),S([u()],Ue.prototype,"lifetimeMultiplier"),S([u()],Ue.prototype,"minVertexDistance"),S([u()],Ue.prototype,"mode"),S([u()],Ue.prototype,"ratio"),S([u()],Ue.prototype,"ribbonCount"),S([u()],Ue.prototype,"shadowBias"),S([u()],Ue.prototype,"sizeAffectsLifetime"),S([u()],Ue.prototype,"sizeAffectsWidth"),S([u()],Ue.prototype,"splitSubEmitterRibbons"),S([u()],Ue.prototype,"textureMode"),S([u(Y)],Ue.prototype,"widthOverTrail"),S([u()],Ue.prototype,"widthOverTrailMultiplier"),S([u()],Ue.prototype,"worldSpace");class Xe{enabled;space=0;orbitalX;orbitalY;orbitalZ;orbitalXMultiplier;orbitalYMultiplier;orbitalZMultiplier;orbitalOffsetX;orbitalOffsetY;orbitalOffsetZ;speedModifier;speedModifierMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;_system;update(e){this._system=e}_temp=new b;_temp2=new b;_temp3=new b;_hasOrbital=!1;_index=0;_orbitalMatrix=new J;init(e){this._index==0&&(e.debug=!0),this._index+=1,e.orbitx=this.orbitalX.evaluate(Math.random()),e.orbity=this.orbitalY.evaluate(Math.random()),e.orbitz=this.orbitalZ.evaluate(Math.random()),this._hasOrbital=e.orbitx!=0||e.orbity!=0||e.orbitz!=0}apply(e,t,i,n,s,r,a){if(!this.enabled)return;const l=r/a,c=this.speedModifier.evaluate(l)*this.speedModifierMultiplier,h=this.x.evaluate(l),d=this.y.evaluate(l),p=this.z.evaluate(l);if(this._temp.set(-h,d,p),this._system&&this._system.main.simulationSpace===1&&this._temp.applyQuaternion(this._system.worldQuaternion),this._hasOrbital&&this._system?.worldPos){const m=this._temp2.set(i.x,i.y,i.z),f=this.orbitalXMultiplier,g=this.orbitalYMultiplier,y=this.orbitalZMultiplier,_=c*Math.PI*2*10,v=Math.cos(_*f),C=Math.sin(_*f),O=Math.cos(_*g),k=Math.sin(_*g),j=Math.cos(_*y),L=Math.sin(_*y),V=m.x*(O*j)+m.y*(O*L)+m.z*-k,W=m.x*(C*k*j-v*L)+m.y*(C*k*L+v*j)+m.z*(C*O),G=m.x*(v*k*j+C*L)+m.y*(v*k*L-C*j)+m.z*(v*O),X=this._temp3.set(m.x-V,m.y-W,m.z-G);X.normalize(),X.multiplyScalar(.2/s*Math.max(this.orbitalXMultiplier,this.orbitalYMultiplier,this.orbitalZMultiplier)),n.x+=X.x,n.y+=X.y,n.z+=X.z}n.x+=this._temp.x,n.y+=this._temp.y,n.z+=this._temp.z,n.x*=c,n.y*=c,n.z*=c}}S([u()],Xe.prototype,"enabled"),S([u()],Xe.prototype,"space"),S([u(Y)],Xe.prototype,"orbitalX"),S([u(Y)],Xe.prototype,"orbitalY"),S([u(Y)],Xe.prototype,"orbitalZ"),S([u()],Xe.prototype,"orbitalXMultiplier"),S([u()],Xe.prototype,"orbitalYMultiplier"),S([u()],Xe.prototype,"orbitalZMultiplier"),S([u()],Xe.prototype,"orbitalOffsetX"),S([u()],Xe.prototype,"orbitalOffsetY"),S([u()],Xe.prototype,"orbitalOffsetZ"),S([u(Y)],Xe.prototype,"speedModifier"),S([u()],Xe.prototype,"speedModifierMultiplier"),S([u(Y)],Xe.prototype,"x"),S([u()],Xe.prototype,"xMultiplier"),S([u(Y)],Xe.prototype,"y"),S([u()],Xe.prototype,"yMultiplier"),S([u(Y)],Xe.prototype,"z"),S([u()],Xe.prototype,"zMultiplier");class Zt{animation;enabled;cycleCount;frameOverTime;frameOverTimeMultiplier;numTilesX;numTilesY;startFrame;startFrameMultiplier;rowMode;rowIndex;spriteCount;timeMode;sampleOnceAtStart(){if(this.timeMode===0)switch(this.frameOverTime.mode){case 0:case 3:case 2:case 1:return!0}return!1}getStartIndex(){return this.sampleOnceAtStart()?Math.random()*(this.numTilesX*this.numTilesY):0}evaluate(e){if(!this.sampleOnceAtStart())return this.getIndex(e)}getIndex(e){const t=this.numTilesX*this.numTilesY;e=e*this.cycleCount;let i=this.frameOverTime.evaluate(e%1);return i*=this.frameOverTimeMultiplier,i*=t,i=i%t,i=Math.floor(i),i}}S([u()],Zt.prototype,"animation"),S([u()],Zt.prototype,"enabled"),S([u()],Zt.prototype,"cycleCount"),S([u(Y)],Zt.prototype,"frameOverTime"),S([u()],Zt.prototype,"frameOverTimeMultiplier"),S([u()],Zt.prototype,"numTilesX"),S([u()],Zt.prototype,"numTilesY"),S([u(Y)],Zt.prototype,"startFrame"),S([u()],Zt.prototype,"startFrameMultiplier"),S([u()],Zt.prototype,"rowMode"),S([u()],Zt.prototype,"rowIndex"),S([u()],Zt.prototype,"spriteCount"),S([u()],Zt.prototype,"timeMode");class Nn{enabled;separateAxes;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t){return this.enabled?this.separateAxes?0:this.z.evaluate(e,t)*-1:0}}S([u()],Nn.prototype,"enabled"),S([u()],Nn.prototype,"separateAxes"),S([u(Y)],Nn.prototype,"x"),S([u()],Nn.prototype,"xMultiplier"),S([u(Y)],Nn.prototype,"y"),S([u()],Nn.prototype,"yMultiplier"),S([u(Y)],Nn.prototype,"z"),S([u()],Nn.prototype,"zMultiplier");class pn{enabled;range;separateAxes;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t){if(!this.enabled)return 0;if(!this.separateAxes){const i=D.lerp(this.range.x,this.range.y,t);return this.z.evaluate(i)*-1}return 0}}S([u()],pn.prototype,"enabled"),S([u()],pn.prototype,"range"),S([u()],pn.prototype,"separateAxes"),S([u(Y)],pn.prototype,"x"),S([u()],pn.prototype,"xMultiplier"),S([u(Y)],pn.prototype,"y"),S([u()],pn.prototype,"yMultiplier"),S([u(Y)],pn.prototype,"z"),S([u()],pn.prototype,"zMultiplier");class pt{enabled;dampen;drag;dragMultiplier;limit;limitMultiplier;separateAxes;limitX;limitXMultiplier;limitY;limitYMultiplier;limitZ;limitZMultiplier;multiplyDragByParticleSize=!1;multiplyDragByParticleVelocity=!1;space;_temp=new b;_temp2=new b;apply(e,t,i,n,s,r,a){if(this.enabled){const l=this.limit.evaluate(s)*this.limitMultiplier;if(t.length()>l){this._temp.copy(t).normalize().multiplyScalar(l);const c=this.dampen*.5;t.x=D.lerp(t.x,this._temp.x,c),t.y=D.lerp(t.y,this._temp.y,c),t.z=D.lerp(t.z,this._temp.z,c),i.x=D.lerp(i.x,this._temp.x,c),i.y=D.lerp(i.y,this._temp.y,c),i.z=D.lerp(i.z,this._temp.z,c)}}}}S([u()],pt.prototype,"enabled"),S([u()],pt.prototype,"dampen"),S([u(Y)],pt.prototype,"drag"),S([u()],pt.prototype,"dragMultiplier"),S([u(Y)],pt.prototype,"limit"),S([u()],pt.prototype,"limitMultiplier"),S([u()],pt.prototype,"separateAxes"),S([u(Y)],pt.prototype,"limitX"),S([u()],pt.prototype,"limitXMultiplier"),S([u(Y)],pt.prototype,"limitY"),S([u()],pt.prototype,"limitYMultiplier"),S([u(Y)],pt.prototype,"limitZ"),S([u()],pt.prototype,"limitZMultiplier"),S([u()],pt.prototype,"multiplyDragByParticleSize"),S([u()],pt.prototype,"multiplyDragByParticleVelocity"),S([u()],pt.prototype,"space");const zh=class oC{enabled;curve;curveMultiplier;mode;clone(){const e=new oC;return e.enabled=this.enabled,e.curve=this.curve?.clone(),e.curveMultiplier=this.curveMultiplier,e.mode=this.mode,e}system;get _lastWorldPosition(){return this.system._iv_lastWorldPosition||(this.system._iv_lastWorldPosition=new b),this.system._iv_lastWorldPosition}get _velocity(){return this.system._iv_velocity||(this.system._iv_velocity=new b),this.system._iv_velocity}_temp=new b;_firstUpdate=!0;awake(e){this.system=e,this.reset()}reset(){this._firstUpdate=!0}update(e){this.enabled&&this.system.worldspace!==!1&&(this._firstUpdate?(this._firstUpdate=!1,this._velocity.set(0,0,0),this._lastWorldPosition.copy(this.system.worldPos)):this._lastWorldPosition&&(this._velocity.copy(this.system.worldPos).sub(this._lastWorldPosition).multiplyScalar(1/this.system.deltaTime),this._lastWorldPosition.copy(this.system.worldPos)))}applyInitial(e){if(this.enabled&&this.system.worldspace!==!1&&this.mode===0){const t=this.curve.evaluate(Math.random(),Math.random());this._temp.copy(this._velocity).multiplyScalar(t),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}_frames=0;applyCurrent(e,t,i){if(this.enabled&&this.system&&this.system.worldspace!==!1&&this.mode===1){const n=this.curve.evaluate(t,i);this._temp.copy(this._velocity).multiplyScalar(n),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}};S([u()],zh.prototype,"enabled"),S([u(Y)],zh.prototype,"curve"),S([u()],zh.prototype,"curveMultiplier"),S([u()],zh.prototype,"mode");let L0=zh;class ki{enabled;range;separateAxes;size;sizeMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t,i,n){const s=e.length(),r=D.remap(s,this.range.x,this.range.y,0,1),a=this.size.evaluate(r,i);return n.x*=a,n.y*=a,n.z*=a,n}}S([u()],ki.prototype,"enabled"),S([u(K)],ki.prototype,"range"),S([u()],ki.prototype,"separateAxes"),S([u(Y)],ki.prototype,"size"),S([u()],ki.prototype,"sizeMultiplier"),S([u(Y)],ki.prototype,"x"),S([u()],ki.prototype,"xMultiplier"),S([u(Y)],ki.prototype,"y"),S([u()],ki.prototype,"yMultiplier"),S([u(Y)],ki.prototype,"z"),S([u()],ki.prototype,"zMultiplier");class Xl{enabled;range;color;evaluate(e,t,i){const n=e.length(),s=D.remap(n,this.range.x,this.range.y,0,1),r=this.color.evaluate(s,t);i.x*=r.r,i.y*=r.g,i.z*=r.b,"alpha"in r&&(i.w*=r.alpha)}}S([u()],Xl.prototype,"enabled"),S([u(K)],Xl.prototype,"range"),S([u(pa)],Xl.prototype,"color"),new b(1,1,1),new b(0,0,1);class D0{constructor(e,t,i,n){this.system=e,this.particleSystem=t,this.subSystem=i,this.subParticleSystem=n,this.subParticleSystem&&this.subParticleSystem&&(this.subParticleSystem.onlyUsedByOther=!0);const s=1e3;this._circularBuffer=new ji(()=>new eg,s)}type="NeedleParticleSubEmitter";emitterType;emitterProbability;q_=new N;v_=new b;v2_=new b;_emitterMatrix=new eg;_circularBuffer;clone(){throw new Error("Method not implemented.")}initialize(e){e.emissionState={burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0},this._emitterMatrix.copy(this.subSystem.matrixWorld).invert().premultiply(this.system.matrixWorld),this._emitterMatrix.setPosition(0,0,0),this.emitterType===j0.Birth&&this.run(e)}update(e,t){this.run(e)}frameUpdate(e){}toJSON(){}reset(){}run(e){if(this.subSystem.currentParticles>=this.subSystem.main.maxParticles||!this.subParticleSystem||!e.emissionState||this.emitterProbability&&Math.random()>this.emitterProbability)return;const t=this.system.deltaTime;if(this.emitterType===j0.Death){let n=e.life;if(e[Ql]!==void 0&&(n=e[Ql]),!(e.age+t*1.2>=n))return;const s=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=s}const i=new eg;i.set(1,0,0,e.position.x,0,1,0,e.position.y,0,0,1,e.position.z,0,0,0,1),this.particleSystem.worldSpace||i.multiplyMatrices(this._emitterMatrix,i),this.subParticleSystem.emit(t,e.emissionState,i)}}var Y2=Object.defineProperty,ze=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&Y2(e,t,n),n};const tr=w("debugparticles"),Z2=w("noprogressive"),K2=w("debugprogressive");var j0=(o=>(o[o.Birth=0]="Birth",o[o.Collision=1]="Collision",o[o.Death=2]="Death",o[o.Trigger=3]="Trigger",o[o.Manual=4]="Manual",o))(j0||{});class mn extends E{renderMode;particleMaterial;trailMaterial;particleMesh;maxParticleSize;minParticleSize;velocityScale;cameraVelocityScale;lengthScale;start(){if(this.maxParticleSize!==.5&&this.minParticleSize!==0&&A()){const e=`ParticleSystem "${this.name}" has non-default min/max particle size. This may not render correctly. Please set min size to 0 and the max size to 0.5 and use the "StartSize" setting instead`;console.warn(e)}}get transparent(){return this.particleMaterial?.transparent??!1}getMaterial(e=!1){let t=e===!0&&this.trailMaterial?this.trailMaterial:this.particleMaterial;if(t){if(t.type==="MeshStandardMaterial"){tr&&console.debug("ParticleSystemRenderer.getMaterial: MeshStandardMaterial detected, converting to MeshBasicMaterial. See https://github.com/Alchemist0823/three.quarks/issues/101"),"map"in t&&t.map&&(t.map.colorSpace=To,t.map.premultiplyAlpha=!1);const i=new Ce;i.copy(t),e?this.trailMaterial=i:this.particleMaterial=i}t.map&&(t.map.colorSpace=To,t.map.premultiplyAlpha=!1),e&&t.side===Cs&&(t=t.clone(),t.side=Wd,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!Z2&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,K2&&console.log("Load material LOD",t.name),He.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof H&&(t=this.particleMesh.geometry),t===null)){t=new Pn(1,1);const i=t.attributes.uv;for(let n=0;n<i.count;n++)i.setX(n,1-i.getX(n))}return new H(t,this.getMaterial())}}ze([u()],mn.prototype,"renderMode"),ze([u(we)],mn.prototype,"particleMaterial"),ze([u(we)],mn.prototype,"trailMaterial"),ze([u()],mn.prototype,"maxParticleSize"),ze([u()],mn.prototype,"minParticleSize"),ze([u()],mn.prototype,"velocityScale"),ze([u()],mn.prototype,"cameraVelocityScale"),ze([u()],mn.prototype,"lengthScale");class tm{_curve;_factor;constructor(e,t=1){this._curve=e,this._factor=t}type="function";startGen(e){}genValue(e,t){return this._curve.evaluate(t,Math.random())*this._factor}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}}class B0{type="value";toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}startGen(e){}system;constructor(e){this.system=e}}class J2 extends B0{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class eI extends B0{_lastPosition=new b;_lastDistance=0;update(){const e=ee(this.system.gameObject);this._lastDistance=this._lastPosition.distanceTo(e),this._lastPosition.copy(e)}genValue(){if(!this.system.isPlaying||!this.system.emission.enabled||this.system.currentParticles>=this.system.maxParticles)return 0;let e=this.system.emission.rateOverTime.evaluate(this.system.time/this.system.duration,Math.random());if(this.system.deltaTime>0){const n=this.system.emission.rateOverDistance.evaluate(this.system.time/this.system.duration,Math.random());let s=this._lastDistance/this.system.deltaTime*n;Number.isFinite(s)||(s=0),e+=s}const t=this.system.emission.getBurst();t>0&&(e+=t/this.system.deltaTime);const i=this.system.maxParticles-this.system.currentParticles;return D.clamp(e,0,i/this.system.deltaTime)}}class tI extends B0{genValue(){return this.system.isPlaying,0}}class ir{system;get context(){return this.system.context}constructor(e){this.type=Object.getPrototypeOf(this).constructor.name||"ParticleSystemBaseBehaviour",e&&(this.system=e)}type;initialize(e){}update(e,t){}frameUpdate(e){}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}reset(){}}class iI extends ir{type="NeedleTextureSheet";update(e,t){const i=this.system.textureSheetAnimation;if(i.enabled){const n=e.age/e.life,s=i.evaluate(n);s!==void 0&&(e.uvTile=s)}}}const iS=Symbol("particleRotation");class nI extends ir{type="NeedleRotation";initialize(e){e[iS]=Math.random()}update(e,t){if(e.rotation===void 0)return;const i=e.age/e.life;if(typeof e.rotation=="number"&&(this.system.rotationOverLifetime.enabled?e.rotation+=this.system.rotationOverLifetime.evaluate(i,e[iS])*t:this.system.renderer.renderMode===os.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const n=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(i,n)*t}}}const nS=Symbol("sizeLerpFactor"),oI=new b;class sI extends ir{type="NeedleSize";_minSize=0;_maxSize=1;initialize(e){e[nS]=Math.random(),this._minSize=this.system.renderer.minParticleSize,this._maxSize=this.system.renderer.maxParticleSize}update(e,t){const i=e.age/e.life;let n=1;this.system.sizeOverLifetime.enabled&&(n*=this.system.sizeOverLifetime.evaluate(i,void 0,e[nS]).x);let s=1;this.system.renderer.renderMode!==os.Mesh&&(s=this.system.worldScale.x/this.system.cameraScale);const r=F(e.startSize).multiplyScalar(n*s);if(e.size.set(r.x,r.y,r.z),this.system.localspace){const a=lS(this.system,oI);e.size.x*=a.x,e.size.y*=a.y,e.size.z*=a.z}}}const Ql=Symbol("particleLife"),F0=Symbol("trailLifetime"),oS=Symbol("trailStartLength"),U0=Symbol("trailWidthRandom");class rI extends ir{type="NeedleTrail";initialize(e){e instanceof i_&&(e[Ql]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[F0]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[F0]),e[oS]=e.length,e[U0]=Math.random())}update(e){if(this.system.trails?.enabled&&e instanceof i_){const t=e,i=e.age/e[Ql],n=e.previous.values(),s=e.previous.length;for(let r=0;r<s;r++){const a=n.next().value,l=1-r/(s-1),c=e.size;if(c.x<=0&&!this.system.trails.sizeAffectsWidth){const h=20*this.system.trails.widthOverTrail.evaluate(.5,t[U0]);c.x=h,c.y=h,c.z=h}a.size=this.system.trails.getWidth(c.x,i,l,t[U0]),a.color.copy(e.color),this.system.trails.getColor(a.color,i,l)}if(e.age>e[Ql]){e.velocity.set(0,0,0);const r=(e.age-e[Ql])/e[F0];t.length=D.lerp(e[oS],0,r)}}}}const im=Symbol("startVelocity"),sS=Symbol("gravityModifier"),z0=Symbol("gravitySpeed"),nm=Symbol("velocity lerp factor"),N0=new b;class aI extends ir{type="NeedleVelocity";_gravityDirection=new b;initialize(e){const t=this.system.main.simulationSpeed;e.startSpeed=this.system.main.startSpeed.evaluate(Math.random(),Math.random());const i=this.system.shape.getDirection(e,e.position);e.velocity.x=i.x*e.startSpeed,e.velocity.y=i.y*e.startSpeed,e.velocity.z=i.z*e.startSpeed,this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyInitial(e.velocity),e[im]?e[im].copy(e.velocity):e[im]=e.velocity.clone();const n=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[sS]=n*t,e[z0]=n*t*.5,e[nm]=Math.random(),this.system.velocityOverLifetime?.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===Uh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){const i=e[im],n=e[sS];if(n!==0){const d=n*e[z0];N0.copy(this._gravityDirection).multiplyScalar(d),e[z0]+=t*.05,i.add(N0)}e.velocity.copy(i);const s=e.age/e.life;this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,s,e[nm]);const r=this.system.noise;r.enabled&&r.apply(0,e.position,e.velocity,t,e.age,e.life);const a=this.system.sizeBySpeed;a?.enabled&&(e.size=a.evaluate(e.velocity,s,e[nm],e.size));const l=this.system.colorBySpeed;l?.enabled&&l.evaluate(e.velocity,e[nm],e.color);const c=this.system.velocityOverLifetime;c.enabled&&c.apply(e,0,e.position,e.velocity,t,e.age,e.life);const h=this.system.limitVelocityOverLifetime;if(h.enabled&&h.apply(e.position,i,e.velocity,e.size,s,t,1),this.system.worldspace){const d=this.system.worldScale;e.velocity.x*=d.x,e.velocity.y*=d.y,e.velocity.z*=d.z}}}const rS=Symbol("colorLerpFactor"),aS=new se(1,1,1,1),ga=new se(1,1,1,1);class lI extends ir{type="NeedleColor";initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;ga.copy(this.system.main.startColor.evaluate(Math.random())),t?.color&&(aS.copy(t.color),ga.multiply(aS)),ga.convertLinearToSRGB(),e.startColor.set(ga.r,ga.g,ga.b,ga.alpha),e.color.copy(e.startColor),e[rS]=Math.random()}update(e,t){if(e.age===0&&this._init(e),this.system.colorOverLifetime.enabled){const i=e.age/e.life,n=this.system.colorOverLifetime.color.evaluate(i,e[rS]);e.color.set(n.r,n.g,n.b,"alpha"in n?n.alpha:1).multiply(e.startColor)}else e.color.copy(e.startColor)}}class cI{system;emission;get anim(){return this.system.textureSheetAnimation}constructor(e){this.system=e,this.emission=new eI(this.system)}get prewarm(){return!1}get material(){return this.system.renderer.getMaterial(this.system.trails.enabled)}get layers(){return this.system.gameObject.layers}update(){this.emission.update()}autoDestroy;get looping(){return this.system.main.loop}get duration(){return this.system.duration}get shape(){return this.system.shape}get startLife(){return new tm(this.system.main.startLifetime)}get startSpeed(){return new tm(this.system.main.startSpeed)}get startRotation(){return new tm(this.system.main.startRotation)}get startSize(){return new tm(this.system.main.startSize)}startLength;get startColor(){return new JP(new eO(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new tI(this.system)}emissionBursts;onlyUsedByOther;behaviors=[];get instancingGeometry(){return this.system.renderer.getMesh(this.system.renderer.renderMode).geometry}get renderMode(){if(this.system.trails.enabled===!0)return jo.Trail;switch(this.system.renderer.renderMode){case os.Billboard:return jo.BillBoard;case os.Stretch:return jo.StretchedBillBoard;case os.HorizontalBillboard:return jo.HorizontalBillBoard;case os.VerticalBillboard:return jo.VerticalBillBoard;case os.Mesh:return jo.Mesh}return jo.BillBoard}rendererEmitterSettings={startLength:new tO(220),followLocalOrigin:!1};get speedFactor(){let e=this.system.main.simulationSpeed;return this.system.renderer?.renderMode===os.Stretch&&(e*=this.system.renderer.velocityScale??1),e}flatWhiteTexture;clonedTexture={original:void 0,clone:void 0};get texture(){const e=this.material;if(e&&e.map){const t=e.map;if(this.clonedTexture.original!==t||!this.clonedTexture.clone){const i=t.clone();i.premultiplyAlpha=!1,i.colorSpace=To,this.clonedTexture.original=t,this.clonedTexture.clone=i}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=hf(new se(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new J2(this.system)}get uTileCount(){return this.anim.enabled?this.anim?.numTilesX:void 0}get vTileCount(){return this.anim.enabled?this.anim?.numTilesY:void 0}get renderOrder(){return 1}get blending(){return this.system.renderer.particleMaterial?.blending??yP}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===Uh.World}}class hI{burstParticleIndex=0;burstParticleCount=0;isBursting=!1;travelDistance=0;previousWorldPos;burstIndex=0;burstWaveIndex=0;time=0;waitEmiting=0}const Kt=class Rm extends E{play(e=!1){e&&x.foreachComponent(this.gameObject,t=>{t instanceof Rm&&t!==this&&t.play(!1)},!0),this._isPlaying=!0,this._particleSystem&&(this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1),this.emission?.reset()}pause(e=!0){e&&x.foreachComponent(this.gameObject,t=>{t instanceof Rm&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&x.foreachComponent(this.gameObject,i=>{i instanceof Rm&&i!==this&&i.stop(!1,t)},!0),this._isPlaying=!1,this._time=0,t&&this.reset()}reset(){this._time=0,this._particleSystem&&(this._particleSystem.particleNum=0,this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1,this.emission?.reset())}_state;emit(e){if(this._particleSystem){this.onUpdate(),e=Math.min(e,this.maxParticles-this.currentParticles),this._state||(this._state=new hI),this._state.waitEmiting=e,this._state.time=0;const t=this._particleSystem.emitEnded;this._particleSystem.emitEnded=!1,this._particleSystem.emit(this.deltaTime,this._state,this._particleSystem.emitter.matrixWorld),this._particleSystem.emitEnded=t}}get playOnAwake(){return this.main.playOnAwake}set playOnAwake(e){this.main.playOnAwake=e}colorOverLifetime;main;emission;sizeOverLifetime;shape;noise;trails;velocityOverLifetime;limitVelocityOverLifetime;inheritVelocity;colorBySpeed;textureSheetAnimation;rotationOverLifetime;rotationBySpeed;sizeBySpeed;get renderer(){return this._renderer}get isPlaying(){return this._isPlaying}get currentParticles(){return this._particleSystem?.particleNum??0}get maxParticles(){return this.main.maxParticles}get time(){return this._time}get duration(){return this.main.duration}get deltaTime(){return this.context.time.deltaTime*this.main.simulationSpeed}get scale(){return this.gameObject.scale.x}get cameraScale(){return this._cameraScale}_cameraScale=1;get container(){return this._container}get worldspace(){return this.main.simulationSpace===Uh.World}get localspace(){return this.main.simulationSpace===Uh.Local}__worldQuaternion=new N;get worldQuaternion(){return this.__worldQuaternion}_worldQuaternionInverted=new N;get worldQuaternionInverted(){return this._worldQuaternionInverted}_worldScale=new b;get worldScale(){return this._worldScale}_worldPositionFrame=-1;_worldPos=new b;get worldPos(){return this._worldPositionFrame!==this.context.time.frame&&(this._worldPositionFrame=this.context.time.frame,ee(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof ir&&(e.system=this),tr&&console.debug("Add custom ParticleSystem Behaviour",e),this._particleSystem.addBehavior(e),!0):!1}removeBehaviour(e){if(!this._particleSystem)return!1;const t=this._particleSystem.behaviors,i=t.indexOf(e);return i!==-1&&((A()||tr)&&console.debug("Remove custom ParticleSystem Behaviour",i,e),t.splice(i,1)),!0}removeAllBehaviours(){return this._particleSystem?(this._particleSystem.behaviors.length=0,!0):!1}get behaviours(){return this._particleSystem?this._particleSystem.behaviors:null}get particleSystem(){return this._particleSystem??null}_renderer;_batchSystem;_particleSystem;_interface;_container;_time=0;_isPlaying=!0;_isUsedAsSubsystem=!1;_didPreWarm=!1;set bursts(e){for(let t=0;t<e.length;t++){const i=e[t];if(!(i instanceof Jp)){const n=new Jp;Ya(n,i),e[t]=n}}this._bursts=e}_bursts;set subEmitterSystems(e){for(let t=0;t<e.length;t++){const i=e[t];if(!(i instanceof om)){const n=new om;Ya(n,i),e[t]=n}}tr&&e.length>0&&console.log("SubEmitters: ",e,this),this._subEmitterSystems=e}_subEmitterSystems;onAfterDeserialize(e){if(this._subEmitterSystems&&Array.isArray(this._subEmitterSystems))for(const t of this._subEmitterSystems)t._deserialize(this.context,this.gameObject)}awake(){if(this._worldPositionFrame=-1,this._renderer=this.gameObject.getComponent(mn),!this.main)throw new Error("Not Supported: ParticleSystem needs a serialized MainModule. Creating new particle systems at runtime is currently not supported.");this._container=new M,this._container.matrixAutoUpdate=!1,this.context.scene.add(this._container),this._batchSystem=new ZP,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new cI(this),this._particleSystem=new KP(this._interface),this._particleSystem.addBehavior(new sI(this)),this._particleSystem.addBehavior(new lI(this)),this._particleSystem.addBehavior(new iI(this)),this._particleSystem.addBehavior(new nI(this)),this._particleSystem.addBehavior(new aI(this)),this._particleSystem.addBehavior(new rI(this)),this._batchSystem.addSystem(this._particleSystem);const e=this._particleSystem.emitter;this.context.scene.add(e),this.inheritVelocity.system&&this.inheritVelocity.system!==this&&(this.inheritVelocity=this.inheritVelocity.clone()),this.inheritVelocity.awake(this),tr&&(console.log(this),this.gameObject.add(new Li(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof H&&this._interface.renderMode==jo.Mesh&&He.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==jo.Mesh&&(this.particleSystem.instancingGeometry=e)})}onDestroy(){this._container?.removeFromParent(),this._batchSystem?.removeFromParent(),this._particleSystem?.emitter.removeFromParent(),this._particleSystem?.dispose()}onEnable(){this.main&&(this.inheritVelocity&&(this.inheritVelocity.system=this),this._batchSystem&&(this._batchSystem.visible=!0),this.playOnAwake&&this.play(),this._isPlaying=this.playOnAwake)}onDisable(){this._batchSystem&&(this._batchSystem.visible=!1)}onBeforeRender(){this.main&&(this._didPreWarm===!1&&this.main?.prewarm===!0&&(this._didPreWarm=!0,this.preWarm()),this.onUpdate(),this.onSimulate(this.deltaTime))}preWarm(){if(!this.emission?.enabled||this.emission.rateOverTime.getMax()<=0)return;const e=1/60,t=this.main.duration,i=this.main.startLifetime.getMax(),n=Math.min(Math.max(t,i)/Math.max(.01,this.main.simulationSpeed),1e3),s=Math.ceil(n/e),r=Date.now();tr&&console.log(`Particles ${this.name} - Prewarm for ${s} frames (${n} sec). Duration: ${t}, Lifetime: ${i}`);for(let a=0;a<s&&!(this.currentParticles>=this.maxParticles);a++){const l=Date.now()-r;if(l>2e3){console.warn(`Particles ${this.name} - Prewarm took too long. Aborting: ${l}`);break}this.onUpdate(),this.onSimulate(e)}}_lastBatchesCount=-1;onSimulate(e){if(this._batchSystem){let t=this.context.time.frameCount%60===0;this._lastBatchesCount!==this._batchSystem.batches.length&&(this._lastBatchesCount=this._batchSystem.batches.length,t=!0),t&&this.updateLayers(),this._batchSystem.update(e)}this._time+=e,this._time>this.duration&&(this._time=0)}updateLayers(){if(this._batchSystem)for(let e=0;e<this._batchSystem.batches.length;e++){const t=this._batchSystem.batches[e];t.layers.disableAll();const i=this.layer;t.layers.mask=1<<i}}onUpdate(){if(this._bursts&&(this.emission.bursts=this._bursts,delete this._bursts),!this._isPlaying)return;const e=this.context.mainCamera;if(e){const n=Ge(e);this._cameraScale=n.x}const t=!this.worldspace,i=this.gameObject;if(_e(i,this.__worldQuaternion),this._worldQuaternionInverted.copy(this.__worldQuaternion).invert(),Ge(this.gameObject,this._worldScale),t&&this._container&&this.gameObject?.parent){const n=lS(this,N0);this._container.matrix.makeScale(n.x,n.y,n.z),this._container.matrix.makeRotationFromQuaternion(this.__worldQuaternion),this._container.matrix.setPosition(this.worldPos),this._container.matrix.scale(this.gameObject.scale)}this.emission.system=this,this._interface.update(),this.shape.onUpdate(this,this.context,this.main.simulationSpace,this.gameObject),this.noise.update(this.context),this.inheritVelocity?.update(this.context),this.velocityOverLifetime.update(this)}addSubParticleSystems(){if(this._subEmitterSystems&&this._particleSystem)for(const e of this._subEmitterSystems){e.particleSystem&&(e.particleSystem.__internalAwake?e.particleSystem.__internalAwake():A()&&console.warn("SubParticleSystem serialization issue(?)",e.particleSystem,e));const t=e.particleSystem?._particleSystem;if(t){e.particleSystem._isUsedAsSubsystem=!0;const i=new D0(this,this._particleSystem,e.particleSystem,t);i.emitterType=e.type,i.emitterProbability=e.emitProbability,this._particleSystem.addBehavior(i)}else tr&&console.warn("Could not add SubParticleSystem",e,this)}}};ze([u(em)],Kt.prototype,"colorOverLifetime"),ze([u(Yt)],Kt.prototype,"main"),ze([u(rs)],Kt.prototype,"emission"),ze([u(ma)],Kt.prototype,"sizeOverLifetime"),ze([u(I0)],Kt.prototype,"shape"),ze([u(ve)],Kt.prototype,"noise"),ze([u(Ue)],Kt.prototype,"trails"),ze([u(Xe)],Kt.prototype,"velocityOverLifetime"),ze([u(pt)],Kt.prototype,"limitVelocityOverLifetime"),ze([u(L0)],Kt.prototype,"inheritVelocity"),ze([u(Xl)],Kt.prototype,"colorBySpeed"),ze([u(Zt)],Kt.prototype,"textureSheetAnimation"),ze([u(Nn)],Kt.prototype,"rotationOverLifetime"),ze([u(pn)],Kt.prototype,"rotationBySpeed"),ze([u(ki)],Kt.prototype,"sizeBySpeed");let Nh=Kt;class om{particleSystem;emitProbability=1;properties;type;_deserialize(e,t){const i=this.particleSystem;if(i instanceof Nh)return;let n="";i&&typeof i.guid=="string"&&(n=i.guid,this.particleSystem=x.findByGuid(n,t)),tr&&!(this.particleSystem instanceof Nh)&&console.warn("Could not find particle system for sub emitter",n,t,this)}}function lS(o,e){if(e.set(1,1,1),o.gameObject.parent&&o.localspace)switch(o.main.scalingMode){case A0.Local:e=Ge(o.gameObject.parent,e),e.x=1/e.x,e.y=1/e.y,e.z=1/e.z;break;default:if(!o.unsupported_scaling_mode){o.unsupported_scaling_mode=!0;const t="ParticleSystem scale mode "+A0[o.main.scalingMode]+" is not supported";A()&&be(t),console.warn(t,o.name,o)}e=Ge(o.gameObject,e);break}return e}var dI=Object.defineProperty,W0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&dI(e,t,n),n};class Yl extends E{strength=1;radius=2;targets=[];update(){const e=this.gameObject.worldPosition,t=-this.strength*this.context.time.deltaTime;this.targets?.forEach(i=>{if(!i)return;const n=i.gameObject.worldPosition.sub(e),s=n.length();if(s>this.radius)return;let r=t;s>1?r/=s*s:r/=Math.max(.05,s),i.applyImpulse(n.multiplyScalar(r))})}}W0([u()],Yl.prototype,"strength"),W0([u()],Yl.prototype,"radius"),W0([u(Je)],Yl.prototype,"targets");class pc extends E{_didAssignPlayerColor=!1;onEnable(){this.context.connection.beginListen(ie.JoinedRoom,this.tryAssignColor),this._didAssignPlayerColor||this.startCoroutine(this.waitForConnection())}onDisable(){this.context.connection.stopListen(ie.JoinedRoom,this.tryAssignColor)}*waitForConnection(){for(;!this.destroyed&&this.activeAndEnabled&&(yield tf(.2),!this.tryAssignColor()););}tryAssignColor=()=>{const e=x.getComponentInParent(this.gameObject,Ci);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=x.getComponentInParent(this.gameObject,Le);return t?.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1};assignUserColor(e){const t=pc.hashCode(e),i=pc.colorFromHashCode(t);if(this.gameObject.type==="Mesh"){const n=this.gameObject;this.assignColor(i,e,n)}else if(this.gameObject.children)for(const n of this.gameObject.children){const s=n;s.material&&s.material.color&&this.assignColor(i,e,s)}}assignColor(e,t,i){let n=i.material;n&&(n._playerMaterial!==t&&(n=n.clone(),n._playerMaterial=t,i.material=n),n.color=e)}static hashCode(e){var t=0,i,n;if(e.length===0)return t;for(i=0;i<e.length;i++)n=e.charCodeAt(i),t=(t<<5)-t+n,t|=0;return t}static colorFromHashCode(e){const t=(e&16711680)>>16,i=(e&65280)>>8,n=e&255;return new oe(t/255,i/255,n/255)}}var uI=Object.defineProperty,pI=Object.getOwnPropertyDescriptor,cS=(o,e,t,i)=>{for(var n=pI(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&uI(e,t,n),n};const mI=w("debugpost");class U{isVolumeParameter=!0;constructor(e){e!==void 0&&this.initialize(e)}_isInitialized=!1;get isInitialized(){return this._isInitialized}initialize(e){e!==void 0&&(this._value=e,this._defaultValue=e,this._valueRaw=e,this._isInitialized=!0)}get overrideState(){return this._active}set overrideState(e){if(this._active===e)return;this._active=e;const t=e?this._valueRaw:this._defaultValue;this.processValue(t,!0)}_active=!0;get value(){return this._valueRaw}set value(e){this.isInitialized||this.initialize(e),this.processValue(e,!1)}_value;_valueRaw;set defaultValue(e){this._defaultValue=e}_defaultValue=void 0;__init(){this.processValue(this._valueRaw,!0)}valueProcessor;onValueChanged;processValue(e,t){if(e==null||!t&&this.testIfValueChanged(e)===!1)return;const i=this._value;mI&&typeof i=="number"&&typeof e=="number"&&(i?.toFixed(4),e?.toFixed(4)),!this._active&&this._defaultValue!==void 0?(this._value=this._defaultValue,e=this._defaultValue,this._valueRaw=e):(this._valueRaw=e,this._active&&this.valueProcessor&&(e=this.valueProcessor(e)),this._value=e),this.onValueChanged&&this.onValueChanged(e,i,this)}testIfValueChanged(e){return this._valueRaw!==e}}cS([u()],U.prototype,"overrideState"),cS([u()],U.prototype,"value");class gI extends en{constructor(){super([U])}onSerialize(e,t){}onDeserialize(e,t){const i=t.target,n=t.path;let s;if(i&&n&&(s=i[n]),(typeof s!="object"||typeof s=="object"&&s.isVolumeParameter!==!0)&&(s=new U),typeof e=="object"&&"value"in e){const r=e.value;s.initialize(r),s.overrideState=e.overrideState}else s.value=e;return s}}new gI;var fI=Object.defineProperty,yI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&fI(e,t,n),n};const V0=w("debugpost");class st extends E{get isPostProcessingEffect(){return!0}order=void 0;constructor(e=void 0){if(super(),e)for(const t of Object.keys(e)){const i=e[t],n=this[t];n instanceof U?n.initialize(i):n!==void 0&&(this[t]=i)}}active=!0;onEnable(){super.onEnable(),V0&&console.warn("Enable",this.constructor.name+(this.__internalDidAwakeAndStart?"":" (awake)")),this.active=!0,this.context.postprocessing.addEffect(this)}onDisable(){super.onDisable(),V0&&console.warn("Disable",this.constructor.name),this.context.postprocessing.removeEffect(this),this.active=!1}init(){}_result;_postprocessingContext=null;get postprocessingContext(){return this._postprocessingContext}apply(e){return this._postprocessingContext=e,this._result||(this.initParameters(),this._result=this.onCreateEffect?.call(this)),this._result&&this.initParameters(),this._result}unapply(){}dispose(){V0&&console.warn("DISPOSE",this),this._result&&(Array.isArray(this._result)?this._result.forEach(e=>e.dispose()):this._result.dispose()),this._result=void 0}initParameters(){const e=Object.keys(this);for(const t of e){const i=this[t];i instanceof U&&i.__init()}}onEditorModification(e){const t=e.propertyName;if(this[t]instanceof U){const i=e.value;return this[t].value=i,!0}}}yI([u()],st.prototype,"active");var bI=Object.defineProperty,_I=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&bI(e,t,n),n};const vI=w("debugpost"),$0={};function gn(o,e){$0[o]=e}function wI(o){return o.__type in $0?$0[o.__type]:(vI&&o.__type&&console.warn("Unknown postprocessing type",o.__type,o),st)}class sm{components=[];__init(e){this.components?.forEach(t=>{t.gameObject===void 0&&e.gameObject.addComponent(t),t.init()})}addEffect(e){this.components.push(e)}removeEffect(e){const t=this.components.indexOf(e);t>=0&&this.components.splice(t,1)}}_I([qe([o=>wI(o),st])],sm.prototype,"components");var xI=Object.defineProperty,SI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&xI(e,t,n),n};const CI=w("debugpost");class Wh extends st{get typeName(){return"Antialiasing"}preset=new U(2);onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.SMAAEffect({preset:this.preset?.value??T.POSTPROCESSING.MODULE.SMAAPreset.HIGH,edgeDetectionMode:T.POSTPROCESSING.MODULE.EdgeDetectionMode.LUMA});return this.preset.onValueChanged=t=>{CI&&console.log("Antialiasing preset changed to",t),e.applyPreset(t)},e}}SI([u(U)],Wh.prototype,"preset"),gn("Antialiasing",Wh);var PI=Object.defineProperty,H0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&PI(e,t,n),n};const rm=class sC extends st{static useSelectiveBloom=!1;get typeName(){return"Bloom"}threshold=new U(.9);intensity=new U(1);scatter=new U(.7);selectiveBloom;init(){this.threshold.valueProcessor=e=>e,this.intensity.valueProcessor=e=>e,this.scatter.valueProcessor=e=>e}onCreateEffect(){let e;if(this.selectiveBloom==null&&(this.selectiveBloom=sC.useSelectiveBloom),this.selectiveBloom){const t=e=new T.POSTPROCESSING.MODULE.SelectiveBloomEffect(this.context.scene,this.context.mainCamera,{blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});t.inverted=!0}else e=new T.POSTPROCESSING.MODULE.BloomEffect({blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});return this.intensity.onValueChanged=t=>{e.intensity=t},this.threshold.onValueChanged=t=>{e.luminanceMaterial.threshold=Math.pow(t,2.2)},this.scatter.onValueChanged=t=>{e.luminancePass.enabled=!0,e.luminanceMaterial.smoothing=t,e.mipmapBlurPass&&(e.mipmapBlurPass.radius=Lo.lerp(.1,.9,t))},e}};H0([u(U)],rm.prototype,"threshold"),H0([u(U)],rm.prototype,"intensity"),H0([u(U)],rm.prototype,"scatter");let am=rm;gn("Bloom",am);var OI=Object.defineProperty,kI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&OI(e,t,n),n};class Vh extends st{get typeName(){return"ChromaticAberration"}intensity=new U(0);onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new K(0,0),e.radialModulation=!0,e.modulationOffset=.15,this.intensity.valueProcessor=t=>t*.02,this.intensity.onValueChanged=t=>{e.offset.x=-t,e.offset.y=t},e}}kI([u(U)],Vh.prototype,"intensity"),gn("ChromaticAberration",Vh);var $h=(o=>(o[o.None=0]="None",o[o.Neutral=1]="Neutral",o[o.ACES=2]="ACES",o[o.AgX=3]="AgX",o[o.KhronosNeutral=4]="KhronosNeutral",o))($h||{});const hS=new Map;function G0(o){switch(o){case 0:return qm;case 1:return Gm;case 2:return Bd;case 3:return jd;case 4:return ja;default:return hS.has(o)||(hS.set(o,!0),console.warn("[Postprocessing] Unknown tone mapping mode",o)),ja}}function MI(o){switch(o){case qm:return 0;case Bd:return 2;case jd:return 3;case ja:return 1;case Gm:return 1;default:return 0}}function lm(o){switch(o){case qm:return T.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case Bd:return T.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case jd:return T.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case ja:return T.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case Gm:return T.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return T.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}var EI=Object.defineProperty,dS=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&EI(e,t,n),n};const q0=w("debugpost");class nr extends st{get typeName(){return"ToneMapping"}mode=new U(void 0);exposure=new U(1);setMode(e){const t=$h[e];return t===void 0?(console.error("[PostProcessing] Invalid ToneMapping mode",e),this):(this.mode.value=t,this)}get isToneMapping(){return!0}get threeToneMapping(){return this.mode.isInitialized&&this.mode.overrideState?G0(this.mode.value):this.context.renderer.toneMapping}get toneMappingExposure(){return this.exposure.overrideState&&this.exposure.value!==void 0?Math.max(0,this.exposure.value):this.context.renderer.toneMappingExposure}_tonemappingEffect=null;onCreateEffect(){if(this.mode.isInitialized==!1){const i=MI(this.context.renderer.toneMapping);q0&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+i),this.mode.initialize(i)}this._tonemappingEffect?.dispose();const e=G0(this.mode.value),t=this._tonemappingEffect=new T.POSTPROCESSING.MODULE.ToneMappingEffect({mode:lm(e)});return this.mode.onValueChanged=i=>{if(typeof i=="string")i=dw(i),t.mode=lm(i);else{const n=G0(i);t.mode=lm(n)}t.name="ToneMapping ("+$h[i]+")",q0&&console.log("[PostProcessing] ToneMapping mode changed to",$h[i],e,t.mode)},q0&&console.log("[PostProcessing] Use ToneMapping",$h[this.mode.value],e,t.mode,"renderer.tonemapping: "+this.context.renderer.toneMapping),t}}dS([u(U)],nr.prototype,"mode"),dS([u(U)],nr.prototype,"exposure"),gn("Tonemapping",nr);var RI=Object.defineProperty,cm=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&RI(e,t,n),n};class or extends st{get typeName(){return"ColorAdjustments"}remap=!0;postExposure=new U(1);contrast=new U(0);hueShift=new U(0);saturation=new U(0);init(){this.postExposure.valueProcessor=e=>(this.remap&&(e=Math.pow(2,e)),e),this.contrast.valueProcessor=e=>{if(!this.remap)return e;let t=1;return e>0?t=200:e<0&&(t=100),e/t},this.contrast.defaultValue=0,this.hueShift.valueProcessor=e=>this.remap?Math.PI*e/180:e,this.hueShift.defaultValue=0,this.saturation.valueProcessor=e=>this.remap?e<0?e/100:e/(100*Math.PI):e,this.saturation.defaultValue=0}onCreateEffect(){const e=[];let t=this.postprocessingContext?.components.find(s=>s instanceof nr);t||(t=new nr,this.postprocessingContext?.components.push(t)),this.postExposure.onValueChanged=s=>{this.postExposure.overrideState&&t?t.exposure.value=s:console.warn("[PostProcessing] PostExposure is set to override but no ToneMappingEffect found in the postprocessing stack. Please add a ToneMappingEffect to your postprocessing stack to use PostExposure.")};const i=new T.POSTPROCESSING.MODULE.BrightnessContrastEffect;this.contrast.onValueChanged=s=>i.contrast=s;const n=new T.POSTPROCESSING.MODULE.HueSaturationEffect;return this.hueShift.onValueChanged=s=>n.hue=s,this.saturation.onValueChanged=s=>n.saturation=s,e.push(i),e.push(n),e}}cm([u(U)],or.prototype,"postExposure"),cm([u(U)],or.prototype,"contrast"),cm([u(U)],or.prototype,"hueShift"),cm([u(U)],or.prototype,"saturation"),gn("ColorAdjustments",or);var TI=Object.defineProperty,fa=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&TI(e,t,n),n};const AI=w("debugpost");class Wn extends st{get typeName(){return"DepthOfField"}mode;focusDistance=new U(1);focalLength=new U(.2);aperture=new U(20);gaussianMaxRadius=new U;resolutionScale=new U(1/window.devicePixelRatio);bokehScale=new U;init(){this.focalLength.valueProcessor=t=>{const i=t/300;return D.lerp(2,.01,i)};const e=20;this.aperture.valueProcessor=t=>{const i=1-t/32;return D.lerp(1,e,i)}}onCreateEffect(){if(this.mode===0){AI&&console.warn("DepthOfField: Mode is set to Off");return}const e=new T.POSTPROCESSING.MODULE.DepthOfFieldEffect(this.context.mainCamera,{worldFocusRange:.2,focalLength:1,bokehScale:20,resolutionScale:this.resolutionScale.value});return this.focusDistance.onValueChanged=t=>{e.cocMaterial.worldFocusDistance=t},this.focalLength.onValueChanged=t=>e.cocMaterial.worldFocusRange=t,this.aperture.onValueChanged=t=>e.bokehScale=t,this.resolutionScale&&(this.resolutionScale.onValueChanged=t=>e.resolution.scale=t),[e]}unapply(){}}fa([u()],Wn.prototype,"mode"),fa([u(U)],Wn.prototype,"focusDistance"),fa([u(U)],Wn.prototype,"focalLength"),fa([u(U)],Wn.prototype,"aperture"),fa([u(U)],Wn.prototype,"gaussianMaxRadius"),fa([u(U)],Wn.prototype,"resolutionScale"),fa([u(U)],Wn.prototype,"bokehScale"),gn("DepthOfField",Wn);class Hh extends st{effect;constructor(e){super(),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var II=Object.defineProperty,LI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&II(e,t,n),n};class Gh extends st{get typeName(){return"PixelationEffect"}granularity=new U(10);onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.PixelationEffect;return this.granularity.onValueChanged=t=>{e.granularity=t},e}}LI([u(U)],Gh.prototype,"granularity"),gn("PixelationEffect",Gh);var DI=Object.defineProperty,qh=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&DI(e,t,n),n};class as extends st{get typeName(){return"ScreenSpaceAmbientOcclusion"}intensity=new U(2);falloff=new U(1);samples=new U(9);color=new U(new oe(0,0,0));luminanceInfluence=new U(.7);onBeforeRender(){if(this._ssao&&this.context.mainCamera instanceof de){const e=this.context.mainCamera.far-this.context.mainCamera.near;this._ssao.ssaoMaterial.worldDistanceFalloff=e*.01,this._ssao.ssaoMaterial.worldDistanceThreshold=this.context.mainCamera.far}}_ssao;onCreateEffect(){const e=this.context.mainCamera,t=new T.POSTPROCESSING.MODULE.NormalPass(this.context.scene,e),i=new T.POSTPROCESSING.MODULE.DepthDownsamplingPass({normalBuffer:t.texture,resolutionScale:.5}),n=this._ssao=new T.POSTPROCESSING.MODULE.SSAOEffect(e,t.texture,{normalDepthBuffer:i.texture,worldDistanceThreshold:1,worldDistanceFalloff:1,worldProximityThreshold:.1,worldProximityFalloff:2,intensity:1,blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.MULTIPLY,luminanceInfluence:.5});this.intensity.onValueChanged=r=>{n.intensity=r},this.falloff.onValueChanged=r=>{n.ssaoMaterial.radius=r*.1},this.samples.onValueChanged=r=>{n.ssaoMaterial.samples=r},this.color.onValueChanged=r=>{n.color||(n.color=new oe),n.color.copy(r)},this.luminanceInfluence.onValueChanged=r=>{n.luminanceInfluence=r};const s=new Array;return s.push(t),s.push(i),s.push(n),s}}qh([u(U)],as.prototype,"intensity"),qh([u(U)],as.prototype,"falloff"),qh([u(U)],as.prototype,"samples"),qh([u(U)],as.prototype,"color"),qh([u(U)],as.prototype,"luminanceInfluence"),gn("ScreenSpaceAmbientOcclusion",as);var jI=Object.defineProperty,ya=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jI(e,t,n),n};const BI=w("debugN8AO");var X0=(o=>(o[o.Performance=0]="Performance",o[o.Low=1]="Low",o[o.Medium=2]="Medium",o[o.High=3]="High",o[o.Ultra=4]="Ultra",o))(X0||{});class Vn extends st{get typeName(){return"ScreenSpaceAmbientOcclusionN8"}get pass(){return this._ssao}gammaCorrection=!0;aoRadius=new U(1);falloff=new U(1);intensity=new U(1);color=new U(new oe(0,0,0));screenspaceRadius=!1;quality=2;_ssao;onValidate(){this._ssao&&(this._ssao.setQualityMode(X0[this.quality]),this._ssao.configuration.gammaCorrection=this.gammaCorrection,this._ssao.configuration.screenSpaceRadius=this.screenspaceRadius)}onCreateEffect(){const e=this.context.mainCamera,t=this.context.domWidth,i=this.context.domHeight,n=this._ssao=new T.POSTPROCESSING_AO.MODULE.N8AOPostPass(this.context.scene,e,t,i);n.name="SSAO_N8";const s=X0[this.quality];if(n.setQualityMode(s),n.configuration.transparencyAware=!1,n.configuration.halfRes=window.devicePixelRatio>1,n.effectCompositerQuad?.material){const a=n.effectCompositerQuad.material;a.fragmentShader=a.fragmentShader.replace(`if (depth == 1.0) {
|
|
1313
|
+
texel = vec4(0.0, 0.0, 0.0, 1.0);`,`if (depth == 1.0) {
|
|
1314
|
+
gl_FragColor = sceneTexel;
|
|
1315
|
+
return;`),a.needsUpdate=!0}const r=new Qn(t,i);return n.configuration.beautyRenderTarget=r,n.configuration.autoRenderBeauty=!1,n.configuration.gammaCorrection=this.gammaCorrection,n.configuration.screenSpaceRadius=this.screenspaceRadius,BI&&(n.enableDebugMode(),console.log(n),setInterval(()=>{console.log("SSAO",n.lastTime)},1e3),setInterval(()=>{console.log("SSAO",n.enabled,{ssao:n,autoRenderBeauty:n.configuration.autoRenderBeauty})},4e3)),this.intensity.onValueChanged=a=>{n.configuration.intensity=a},this.falloff.onValueChanged=a=>{n.configuration.distanceFalloff=a},this.aoRadius.onValueChanged=a=>{n.configuration.aoRadius=a},this.color.onValueChanged=a=>{n.color||(n.color=new oe),n.configuration.color.copy(a)},n}}ya([Et(),u()],Vn.prototype,"gammaCorrection"),ya([u(U)],Vn.prototype,"aoRadius"),ya([u(U)],Vn.prototype,"falloff"),ya([u(U)],Vn.prototype,"intensity"),ya([u(U)],Vn.prototype,"color"),ya([Et(),u()],Vn.prototype,"screenspaceRadius"),ya([Et(),u()],Vn.prototype,"quality"),gn("ScreenSpaceAmbientOcclusionN8",Vn);const hm=w("debugpost"),mt={AT_START:-1e4,NormalPass:0,DepthDownsamplingPass:10,SSAO:20,SMAA:30,TiltShift:40,DepthOfField:50,ChromaticAberration:60,Bloom:70,Vignette:80,Pixelation:90,ToneMapping:100,HueSaturation:110,BrightnessContrast:120,Sharpening:130,AT_END:1e4};let rt=null;function FI(o){if(hm==="verbose"&&console.debug("Before ordering effects",[...o]),!rt){rt=new Map,rt.set(T.POSTPROCESSING.MODULE.NormalPass,mt.NormalPass),rt.set(T.POSTPROCESSING.MODULE.DepthDownsamplingPass,mt.DepthDownsamplingPass),rt.set(T.POSTPROCESSING.MODULE.SMAAEffect,mt.SMAA),rt.set(T.POSTPROCESSING.MODULE.SSAOEffect,mt.SSAO);const e=T.POSTPROCESSING_AO.MAYBEMODULE;e&&(rt.set(e.N8AOPostPass,mt.SSAO),rt.set(e.N8AOPass,mt.SSAO)),rt.set(T.POSTPROCESSING.MODULE.TiltShiftEffect,mt.TiltShift),rt.set(T.POSTPROCESSING.MODULE.DepthOfFieldEffect,mt.DepthOfField),rt.set(T.POSTPROCESSING.MODULE.ChromaticAberrationEffect,mt.ChromaticAberration),rt.set(T.POSTPROCESSING.MODULE.BloomEffect,mt.Bloom),rt.set(T.POSTPROCESSING.MODULE.SelectiveBloomEffect,mt.Bloom),rt.set(T.POSTPROCESSING.MODULE.VignetteEffect,mt.Vignette),rt.set(T.POSTPROCESSING.MODULE.PixelationEffect,mt.Pixelation),rt.set(T.POSTPROCESSING.MODULE.ToneMappingEffect,mt.ToneMapping),rt.set(T.POSTPROCESSING.MODULE.HueSaturationEffect,mt.HueSaturation),rt.set(T.POSTPROCESSING.MODULE.BrightnessContrastEffect,mt.BrightnessContrast)}o.sort((e,t)=>{const i=typeof e.priority=="number"?e.priority:rt.get(e.effect.constructor)??Number.NEGATIVE_INFINITY,n=typeof t.priority=="number"?t.priority:rt.get(t.effect.constructor)??Number.NEGATIVE_INFINITY;return i===Number.NEGATIVE_INFINITY?(hm&&console.warn("Unknown effect found: ",e.constructor.name,e),1):n===Number.NEGATIVE_INFINITY?(hm&&console.warn("Unknown effect found: ",t.constructor.name,t),-1):i-n}),hm==="verbose"&&console.debug("After ordering effects",[...o])}var UI=Object.defineProperty,zI=Object.getOwnPropertyDescriptor,uS=(o,e,t,i)=>{for(var n=zI(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&UI(e,t,n),n};class Xh extends st{get typeName(){return"Sharpening"}order=mt.Sharpening;_effect;onCreateEffect(){return this._effect??=new(NI()),this.effect}get effect(){return this._effect}set amount(e){this._amount=e,this._effect&&(this._effect.uniforms.get("amount").value=e)}get amount(){return this._effect?this._effect.uniforms.get("amount").value:this._amount}_amount=1;set radius(e){this._radius=e,this._effect&&(this._effect.uniforms.get("radius").value=e)}get radius(){return this._effect?this._effect.uniforms.get("radius").value:this._radius}_radius=1}uS([u()],Xh.prototype,"amount"),uS([u()],Xh.prototype,"radius");function NI(){const o=`
|
|
1316
|
+
void mainSupport() {
|
|
1317
|
+
vUv = uv;
|
|
1318
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
1319
|
+
}
|
|
1320
|
+
`,e=`
|
|
1321
|
+
uniform sampler2D tDiffuse;
|
|
1322
|
+
uniform float amount;
|
|
1323
|
+
uniform float radius;
|
|
1324
|
+
|
|
1325
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
1326
|
+
float tx = 1.0 / resolution.x;
|
|
1327
|
+
float ty = 1.0 / resolution.y;
|
|
1328
|
+
vec2 texelSize = vec2(tx, ty);
|
|
1329
|
+
|
|
1330
|
+
vec4 blurred = vec4(0.0);
|
|
1331
|
+
float total = 0.0;
|
|
1332
|
+
|
|
1333
|
+
for (float x = -radius; x <= radius; x++) {
|
|
1334
|
+
for (float y = -radius; y <= radius; y++) {
|
|
1335
|
+
vec2 offset = vec2(x, y) * texelSize;
|
|
1336
|
+
vec4 diffuse = texture2D(tDiffuse, uv + offset);
|
|
1337
|
+
float weight = exp(-length(offset) * amount);
|
|
1338
|
+
blurred += diffuse * weight;
|
|
1339
|
+
total += weight;
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
if (total > 0.0) {
|
|
1344
|
+
blurred /= total;
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
// Calculate the sharpened color using inputColor
|
|
1348
|
+
vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
|
|
1349
|
+
// Keep original alpha
|
|
1350
|
+
sharp.a = inputColor.a;
|
|
1351
|
+
|
|
1352
|
+
// Ensure the sharp color does not go below 0 or above 1
|
|
1353
|
+
// This means: sharpening must happen AFTER tonemapping.
|
|
1354
|
+
sharp = clamp(sharp, 0.0, 1.0);
|
|
1355
|
+
|
|
1356
|
+
outputColor = sharp;
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
`;class t extends T.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:o,blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new Ki(1)],["radius",new Ki(1)]]),attributes:rO.CONVOLUTION})}}return t}var WI=Object.defineProperty,Zl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&WI(e,t,n),n};class vo extends st{get typeName(){return"TiltShiftEffect"}offset=new U(0);rotation=new U(0);focusArea=new U(.4);feather=new U(.3);kernelSize=new U(2);resolutionScale=new U(1/window.devicePixelRatio);init(){this.offset.defaultValue=0,this.rotation.defaultValue=0,this.focusArea.defaultValue=.4,this.feather.defaultValue=.3,this.kernelSize.defaultValue=T.POSTPROCESSING.MODULE.KernelSize.MEDIUM,this.resolutionScale.defaultValue=1/window.devicePixelRatio}onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.TiltShiftEffect({kernelSize:T.POSTPROCESSING.MODULE.KernelSize.VERY_LARGE,offset:this.offset.value,rotation:this.rotation.value,focusArea:this.focusArea.value,feather:this.feather.value});return this.offset.onValueChanged=t=>e.offset=t,this.rotation.onValueChanged=t=>e.rotation=t,this.focusArea.onValueChanged=t=>e.focusArea=t,this.feather.onValueChanged=t=>e.feather=t,this.kernelSize.onValueChanged=t=>e.blurPass.kernelSize=t,this.resolutionScale.onValueChanged=t=>e.resolution.scale=t/window.devicePixelRatio,e}}Zl([u(U)],vo.prototype,"offset"),Zl([u(U)],vo.prototype,"rotation"),Zl([u(U)],vo.prototype,"focusArea"),Zl([u(U)],vo.prototype,"feather"),Zl([u(U)],vo.prototype,"kernelSize"),Zl([u(U)],vo.prototype,"resolutionScale"),gn("TiltShiftEffect",vo);var VI=Object.defineProperty,Q0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&VI(e,t,n),n};class ba extends st{get typeName(){return"Vignette"}color=new U({r:0,g:0,b:0,a:1});intensity=new U(0);center=new U({x:.5,y:.5});init(){this.color.defaultValue={r:0,g:0,b:0,a:1},this.intensity.defaultValue=0,this.center.defaultValue={x:.5,y:.5}}onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.VignetteEffect;return this.intensity.onValueChanged=t=>{e.offset=t,this.updateDarkness(e)},this.color.onValueChanged=t=>{this.updateDarkness(e)},e}updateDarkness(e){const t=this.intensity.value;e.darkness=t}}Q0([u(U)],ba.prototype,"color"),Q0([u(U)],ba.prototype,"intensity"),Q0([u(U)],ba.prototype,"center"),gn("Vignette",ba);var $I=Object.defineProperty,Y0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&$I(e,t,n),n};const HI=w("debugpost");class Kl extends E{get isPostProcessingManager(){return!0}get effects(){return this._activeEffects}get dirty(){return this._isDirty}set dirty(e){this._isDirty=e}sharedProfile;multisampling="auto";adaptiveResolution=!0;addEffect(e){let t=e;return t instanceof st||(t=new Hh(t),typeof e.order=="number"&&(t.order=e.order)),t.gameObject===void 0&&this.gameObject.addComponent(t),this._effects.includes(t)||(this._effects.push(t),this._activeEffects.includes(t)||this._activeEffects.push(t),this.context.postprocessing.addEffect(t),this._isDirty=!0),e}removeEffect(e){let t=-1,i;if(e instanceof st?(t=this._effects.indexOf(e),t!==-1&&(i=this._effects[t])):(t=this._effects.findIndex(n=>n instanceof Hh&&n.effect===e),t!==-1&&(i=this._effects[t])),t!==-1&&i)return this._effects.splice(t,1),this.context.postprocessing.removeEffect(i),this._isDirty=!0,e;if(e instanceof st){const n=this.sharedProfile?.components?.indexOf(e);n!==void 0&&n!==-1&&(this.sharedProfile?.components?.splice(n,1),this.context.postprocessing.removeEffect(e),this._isDirty=!0)}return e}_activeEffects=[];_effects=[];markDirty(){this._isDirty=!0}awake(){HI&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",e=>{e.key==="p"&&(this.enabled=!this.enabled,ke("Toggle PostProcessing "+this.name+": Enabled="+this.enabled),this.markDirty())})),this.sharedProfile?.__init(this)}_isDirty=!1;onEnable(){this._isDirty=!0,this.pushEffectsToCore(),this.syncConfigToCore()}onDisable(){this.removeEffectsFromCore(),this._isDirty=!1}onBeforeRender(){this._isDirty&&(this.removeEffectsFromCore(),this.pushEffectsToCore(),this._isDirty=!1),this.syncConfigToCore(),this.context.postprocessing.handler&&this._applyPostQueue()}onDestroy(){this.removeEffectsFromCore()}pushEffectsToCore(){if(this._activeEffects.length=0,this.sharedProfile?.components){const t=this.sharedProfile.components;for(const i of t)i.active&&i.enabled&&!this._activeEffects.includes(i)&&this._activeEffects.push(i)}for(const t of this._effects)t.active&&t.enabled&&!this._activeEffects.includes(t)&&this._activeEffects.push(t);const e=this.context.postprocessing;for(const t of this._activeEffects)e.addEffect(t)}removeEffectsFromCore(){const e=this.context.postprocessing;for(const t of this._activeEffects)e.removeEffect(t);this._activeEffects.length=0}syncConfigToCore(){const e=this.context.postprocessing;e.multisampling=this.multisampling,e.adaptiveResolution=this.adaptiveResolution}_applyPostQueue(){if(this._modificationQueue){for(const e of this._modificationQueue.values())this.onEditorModification(e);this._modificationQueue.clear()}}onEditorModification(e){if(e.propertyName.startsWith("postprocessing.")){if(!this.context.postprocessing.handler)return this._modificationQueue||(this._modificationQueue=new Map),this._modificationQueue.set(e.propertyName,e),!0;if(!this._activeEffects?.length)return;const t=e.propertyName.split(".");if(t.length===3||t.length===4){const i=t[1],n=t[2];for(const s of this._activeEffects)if(s.typeName?.toLowerCase()===i.toLowerCase()){if(n==="active"){s.active=e.value,this.scheduleRecreate();return}if(!dm.has(i)){const r=new Array;dm.set(i,r);const a=Object.keys(s);for(const l of a)s[l]instanceof U&&r.push(l)}if(dm.has(i)){const r=n.toLowerCase(),a=dm.get(i);for(const l of a)if(l.toLowerCase()===r){const c=s[l];c instanceof U&&(t.length===4&&t[3]==="active"?(c.overrideState=e.value,this.scheduleRecreate()):c&&c.value!==void 0&&(c.value=e.value));return}}console.warn("Unknown modification",n);return}}return!0}return!1}_modificationQueue;_recreateId=-1;scheduleRecreate(){const e=++this._recreateId;setTimeout(()=>{e===this._recreateId&&(this.onDisable(),this.onEnable())},200)}}Y0([qe(sm)],Kl.prototype,"sharedProfile"),Y0([qe()],Kl.prototype,"multisampling"),Y0([qe()],Kl.prototype,"adaptiveResolution");const dm=new Map;function GI(){return new Promise((o,e)=>{const t=()=>{t!=null&&(document.removeEventListener("pointerdown",t),document.removeEventListener("click",t),document.removeEventListener("dragstart",t),document.removeEventListener("touchstart",t),o())};document.addEventListener("pointerdown",t),document.addEventListener("click",t),document.addEventListener("dragstart",t),document.addEventListener("touchstart",t)})}async function qI(o){await GI(),o()}var XI=Object.defineProperty,QI=Object.getOwnPropertyDescriptor,qi=(o,e,t,i)=>{for(var n=i>1?void 0:i?QI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&XI(e,t,n),n};const at=w("debugvideo");var pS=(o=>(o[o.None=0]="None",o[o.AdjustHeight=1]="AdjustHeight",o[o.AdjustWidth=2]="AdjustWidth",o))(pS||{}),mS=(o=>(o[o.VideoClip=0]="VideoClip",o[o.Url=1]="Url",o))(mS||{}),gS=(o=>(o[o.CameraFarPlane=0]="CameraFarPlane",o[o.CameraNearPlane=1]="CameraNearPlane",o[o.RenderTexture=2]="RenderTexture",o[o.MaterialOverride=3]="MaterialOverride",o))(gS||{});class gt extends E{playOnAwake=!0;aspectMode=0;clip=null;source=1;get url(){return this._url}set url(e){const t=this._url!==e;this.__didAwake?t&&this.setClipURL(e??""):this._url=e}_url=null;renderMode=3;targetMaterialProperty;targetMaterialRenderer;targetTexture;time=0;_playbackSpeed=1;get playbackSpeed(){return this._videoElement?.playbackRate??this._playbackSpeed}set playbackSpeed(e){this._playbackSpeed=e,this._videoElement&&(this._videoElement.playbackRate=e)}_isLooping=!1;get isLooping(){return this._videoElement?.loop??this._isLooping}set isLooping(e){this._isLooping=e,this._videoElement&&(this._videoElement.loop=e)}get currentTime(){return this._videoElement?.currentTime??this.time}set currentTime(e){this._videoElement?this._videoElement.currentTime=e:this.time=e}get isPlaying(){const e=this._videoElement;return!!(e&&(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>e.HAVE_CURRENT_DATA||e.srcObject&&e.srcObject.active))}get crossOrigin(){return this._videoElement?.crossOrigin??this._crossOrigin}set crossOrigin(e){this._crossOrigin=e,this._videoElement&&(e!==null?this._videoElement.setAttribute("crossorigin",e):this._videoElement.removeAttribute("crossorigin"))}get videoMaterial(){return!this._videoMaterial&&!this.create(!1)?null:this._videoMaterial}get videoTexture(){return!this._videoTexture&&!this.create(!1)?null:this._videoTexture}get videoElement(){return!this._videoElement&&!this.create(!1)?null:this._videoElement}requestPictureInPicture(){return this._videoElement?this._videoElement.requestPictureInPicture():null}get muted(){return this._videoElement?.muted??this._muted}set muted(e){this._muted=e,this._videoElement&&(this._videoElement.muted=e)}_muted=!1;get currentVideo(){return this.clip}set audioOutputMode(e){e!==this._audioOutputMode&&(e===1&&A()&&console.warn("VideoAudioOutputMode.AudioSource is not yet implemented"),this._audioOutputMode=e,this.updateVideoElementSettings())}get audioOutputMode(){return this._audioOutputMode}_audioOutputMode=2;playInBackground=!0;_crossOrigin="anonymous";_videoElement=null;_videoTexture=null;_videoMaterial=null;_isPlaying=!1;wasPlaying=!1;preloadVideo(){at&&console.log("Video Preload: "+this.name,this.clip),this.create(!1)}preload(){this.preloadVideo()}setVideo(e){this.clip=e,this.source=0,this._videoElement?(this._videoElement.srcObject=e,this._isPlaying&&this.play(),this.updateAspect()):this.create(this.playOnAwake)}setClipURL(e){this._url!==e&&(this._url=e,this.source=1,at&&console.log("set url",e),this._videoElement?e.endsWith(".m3u8")||e.includes(".m3u")?this.ensureM3UCanBePlayed():(this._videoElement.src=e,this._isPlaying&&(this.stop(),this.play())):this.create(this.playOnAwake))}onEnable(){at&&console.log("VideoPlayer.onEnable",mS[this.source],this.clip,this.url,this),window.addEventListener("visibilitychange",this.visibilityChanged),this.playOnAwake===!0?this.create(!0):this.preloadVideo(),this.screenspace?this._overlay?.start():this._overlay?.stop()}onDisable(){window.removeEventListener("visibilitychange",this.visibilityChanged),this._overlay?.stop(),this.pause()}visibilityChanged=e=>{switch(document.visibilityState){case"hidden":this.playInBackground||(this.wasPlaying=this._isPlaying,this.pause());break;case"visible":this.wasPlaying&&!this._isPlaying&&this.play();break}};onDestroy(){this._videoElement&&(this.videoElement?.remove(),this._videoElement=null),this._videoTexture&&(this._videoTexture.dispose(),this._videoTexture=null)}_receivedInput=!1;constructor(){super(),qI(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],w("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}_playErrors=0;play(){if(this._videoElement||this.create(!1),!this._videoElement){at&&console.warn("Can not play: no video element found",this);return}if(!(this._isPlaying&&!this._videoElement?.ended&&!this._videoElement?.paused)){if(this._isPlaying=!0,this._receivedInput||(this._videoElement.muted=!0),this.handleBeginPlaying(!1),this.shouldUseM3U){this.ensureM3UCanBePlayed();return}at&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(e=>{this._playErrors++<10?console.error(e):this._playErrors===10&&console.error("Multiple errors playing video, further errors will be suppressed. Use 'debugvideo' param to see all errors."),at&&console.error("Error playing video",e,"CODE="+e.code,this.videoElement?.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),at&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),at&&console.log("STOP",this))}pause(){this.time=this._videoElement?.currentTime??0,this._isPlaying=!1,this._videoElement?.pause(),at&&console.log("PAUSE",this,this.currentTime)}create(e){let t;switch(this.source){case 0:t=this.clip;break;case 1:t=this.url,!t?.length&&typeof this.clip=="string"&&(t=this.clip);break}return t?(this._videoElement||(at&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(at&&console.log("Set Video src",t),this._videoElement.src=t):(at&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new bP(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=Io,e&&this.handleBeginPlaying(e),at&&console.log("Video: handle playing done...",t,e),!0):(at&&console.warn("No video source set",this),!1)}updateAspect(){this.aspectMode!==0&&this.startCoroutine(this.updateAspectImpl())}_overlay=null;get screenspace(){return this._overlay?.enabled??!1}set screenspace(e){if(e){if(!this._videoTexture)return;this._overlay||(this._overlay=new YI(this.context)),this._overlay.add(this._videoTexture)}else this._overlay?.remove(this._videoTexture);this._overlay&&(this._overlay.enabled=e)}_targetObjects;createVideoElement(){const e=document.createElement("video");return this._crossOrigin&&e.setAttribute("crossorigin",this._crossOrigin),at&&console.log("created video element",e),e}handleBeginPlaying(e){if(!this.activeAndEnabled||!this._videoElement)return;this._targetObjects.length=0;let t=this.gameObject;switch(this.renderMode){case 3:t=this.targetMaterialRenderer?.gameObject,t||(t=x.getComponent(this.gameObject,oi)?.gameObject);break;case 2:console.error("VideoPlayer renderTexture not implemented yet. Please use material override instead");return}if(!t){console.error("Missing target for video material renderer",this.name,gS[this.renderMode],this);return}const i=t.material;if(i){this._targetObjects.push(t),i!==this._videoMaterial&&(this._videoMaterial=i.clone(),t.material=this._videoMaterial);const n="map",s=this._videoMaterial;if(!this.targetMaterialProperty)at&&s[n]===void 0&&console.warn(`The target material does not have a '${n}' property, video might not render correctly.`),s[n]=this._videoTexture;else switch(this.targetMaterialProperty){default:at&&s[this.targetMaterialProperty]===void 0&&console.warn(`The target material does not have a '${this.targetMaterialProperty}' property, video might not render correctly.`),s[n]=this._videoTexture;break}}else{console.warn("Can not play video, no material found, this might be a multimaterial case which is not supported yet");return}this.updateVideoElementSettings(),this.updateVideoElementStyles(),e&&(this.shouldUseM3U&&this.ensureM3UCanBePlayed(),this.play())}updateVideoElementSettings(){if(!this._videoElement)return;this._videoElement.loop=this._isLooping,this._videoElement.currentTime=this.currentTime,this._videoElement.playbackRate=this._playbackSpeed,this._videoElement.playsInline=!0;let e=!this._receivedInput||this.audioOutputMode===0;!e&&this._muted&&(e=!0),this._videoElement.muted=e,this.playOnAwake&&(this._videoElement.autoplay=!0)}updateVideoElementStyles(){this._videoElement&&(this._videoElement.style.userSelect="none",this._videoElement.style.visibility="hidden",this._videoElement.style.display="none",this.updateAspect())}_updateAspectRoutineId=-1;*updateAspectImpl(){const e=++this._updateAspectRoutineId,t=void 0,i=this.clip;for(;e===this._updateAspectRoutineId&&this.aspectMode!==0&&this.clip&&i===this.clip&&this._isPlaying;){if(!i||typeof i=="string")return;let n;for(const s of i.getVideoTracks()){const r=s.getSettings();if(r&&r.width&&r.height){n=r.width/r.height;break}else n=this.context.renderer.domElement.clientWidth/this.context.renderer.domElement.clientHeight}if(n===void 0){for(let s=0;s<10;s++)yield;if(!this.isPlaying)break;continue}if(t===n){yield;continue}for(const s of this._targetObjects){let r=1;if(s.parent){const a=Ge(s.parent);r=a.x/a.y}switch(this.aspectMode){case 1:s.scale.y=1/n*s.scale.x*r;break;case 2:s.scale.x=n*s.scale.y*r;break}}for(let s=0;s<3;s++)yield}}get shouldUseM3U(){return this.url!=null&&(this.url.endsWith(".m3u8")||this.url.endsWith(".m3u"))&&this.source===1}ensureM3UCanBePlayed(){if(!this.shouldUseM3U)return;let e=document.head.querySelector("script[data-hls_library]");e?globalThis.Hls?this.onHlsAvailable():e.addEventListener("load",this.onHlsAvailable):(at&&console.log("HLS: load script"),e=document.createElement("script"),e.dataset.hls_library="hls.js",e.src="https://cdn.jsdelivr.net/npm/hls.js@1",e.addEventListener("load",this.onHlsAvailable),document.head.append(e))}_hls;onHlsAvailable=()=>{at&&console.log("HLS: available",this.clip),!(!this.shouldUseM3U||!this.url)&&(this._hls||(this._hls=new Hls),this.videoElement.autoplay=!0,this._hls.loadSource(this.url),this._hls.attachMedia(this.videoElement),this._videoElement?.play(),at&&console.log("HLS: loaded",this.clip))}}qi([u()],gt.prototype,"playOnAwake",2),qi([u()],gt.prototype,"aspectMode",2),qi([u(URL)],gt.prototype,"clip",2),qi([u()],gt.prototype,"source",2),qi([u(URL)],gt.prototype,"url",1),qi([u()],gt.prototype,"renderMode",2),qi([u()],gt.prototype,"targetMaterialProperty",2),qi([u(oi)],gt.prototype,"targetMaterialRenderer",2),qi([u(Se)],gt.prototype,"targetTexture",2),qi([u()],gt.prototype,"time",2),qi([u()],gt.prototype,"playbackSpeed",1),qi([u()],gt.prototype,"isLooping",1),qi([u()],gt.prototype,"audioOutputMode",1);class YI{context;constructor(e){this.context=e,this._input=new ZI(this)}get enabled(){return this._isInScreenspaceMode}set enabled(e){e?this.start():this.stop()}add(e){this._videos.indexOf(e)===-1&&this._videos.push(e)}remove(e){if(!e)return;const t=this._videos.indexOf(e);t>=0&&this._videos.splice(t,1)}start(){if(this._isInScreenspaceMode||this._videos.length<0)return;const e=this._videos[this._videos.length-1];if(!e)return;if(this._isInScreenspaceMode=!0,!this._screenspaceModeQuad){if(this._screenspaceModeQuad=Rs.createPrimitive(Za.Quad,{material:new KI(e)}),!this._screenspaceModeQuad)return;this._screenspaceModeQuad.geometry.scale(2,2,2)}const t=this._screenspaceModeQuad;this.context.scene.add(t),this.updateScreenspaceMaterialUniforms();const i=t.material;i?.reset(),this._input?.enable(i)}stop(){this._isInScreenspaceMode=!1,this._screenspaceModeQuad&&(this._input?.disable(),this._screenspaceModeQuad.removeFromParent())}updateScreenspaceMaterialUniforms(){const e=this._screenspaceModeQuad?.material;e&&(e.screenAspect=this.context.domElement.clientWidth/this.context.domElement.clientHeight)}_videos=[];_screenspaceModeQuad;_isInScreenspaceMode=!1;_input}class ZI{_onResizeScreenFn;_onKeyUpFn;_onMouseWheelFn;context;overlay;constructor(e){this.overlay=e,this.context=e.context}_material;enable(e){this._material=e,window.addEventListener("resize",this._onResizeScreenFn=()=>{this.overlay.updateScreenspaceMaterialUniforms()}),window.addEventListener("keyup",this._onKeyUpFn=n=>{n.key==="Escape"&&this.overlay.stop()}),window.addEventListener("wheel",this._onMouseWheelFn=n=>{this.overlay.enabled&&(e.zoom+=n.deltaY*5e-4,n.preventDefault())},{passive:!1});const t=new K;window.addEventListener("mousemove",n=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const s=new K(n.movementX,n.movementY);s.x/=this.context.domElement.clientWidth,s.y/=this.context.domElement.clientHeight,t.set(s.x,s.y),t.multiplyScalar(e.zoom/-this.context.time.deltaTime*.01),e.offset=e.offset.add(t)}}),window.addEventListener("pointermove",n=>{this.overlay.enabled&&this.context.input.getPointerPressed(0)&&this.context.input.getTouchesPressedCount()===1&&(t.set(n.movementX,n.movementY),t.multiplyScalar(e.zoom*-this.context.time.deltaTime*.05),e.offset=e.offset.add(t))});let i=0;window.addEventListener("touchstart",n=>{if(n.touches.length<2){this.context.time.time-i<.3&&this.overlay.stop(),i=this.context.time.time;return}this._isPinching=!0,this._lastPinch=0}),window.addEventListener("touchmove",n=>{if(!this._isPinching||!this._material)return;const s=n.touches[0],r=n.touches[1],a=s.clientX-r.clientX,l=s.clientY-r.clientY,c=Math.sqrt(a*a+l*l);if(this._lastPinch!==0){const h=c-this._lastPinch;this._material.zoom-=h*.004}this._lastPinch=c}),window.addEventListener("touchend",()=>{this._isPinching=!1})}_isPinching=!1;_lastPinch=0;disable(){this._onResizeScreenFn&&(window.removeEventListener("resize",this._onResizeScreenFn),this._onResizeScreenFn=void 0),this._onKeyUpFn&&(window.removeEventListener("keyup",this._onKeyUpFn),this._onKeyUpFn=void 0),this._onMouseWheelFn&&(window.removeEventListener("wheel",this._onMouseWheelFn),this._onMouseWheelFn=void 0)}}class KI extends Xn{set screenAspect(e){this.uniforms.screenAspect.value=e,this.needsUpdate=!0}set offset(e){const t=this.uniforms.offsetScale.value;t.x=e.x,t.y=e.y,this.uniforms.offsetScale.value=t,this.needsUpdate=!0}_offset=new K;get offset(){const e=this.uniforms.offsetScale.value;return this._offset.set(e.x,e.y),this._offset}set zoom(e){const t=this.uniforms.offsetScale.value;e<.001&&(e=.001),t.z=e,this.needsUpdate=!0}get zoom(){return this.uniforms.offsetScale.value.z}reset(){this.offset=this.offset.set(0,0),this.zoom=1,this.needsUpdate=!0}constructor(e){super(),this.uniforms={map:{value:e},screenAspect:{value:1},offsetScale:{value:new ye(0,0,1,1)}},this.vertexShader=`
|
|
1360
|
+
uniform sampler2D map;
|
|
1361
|
+
uniform float screenAspect;
|
|
1362
|
+
uniform vec4 offsetScale;
|
|
1363
|
+
varying vec2 vUv;
|
|
1364
|
+
|
|
1365
|
+
void main() {
|
|
1366
|
+
|
|
1367
|
+
gl_Position = vec4( position , 1.0 );
|
|
1368
|
+
vUv = uv;
|
|
1369
|
+
vUv.y = 1. - vUv.y;
|
|
1370
|
+
|
|
1371
|
+
// fit into screen
|
|
1372
|
+
ivec2 res = textureSize(map, 0);
|
|
1373
|
+
float videoAspect = float(res.x) / float(res.y);
|
|
1374
|
+
float aspect = videoAspect / screenAspect;
|
|
1375
|
+
if(aspect >= 1.0)
|
|
1376
|
+
{
|
|
1377
|
+
vUv.y = vUv.y * aspect;
|
|
1378
|
+
float offset = (1. - aspect) * .5;
|
|
1379
|
+
vUv.y = vUv.y + offset;
|
|
1380
|
+
}
|
|
1381
|
+
else
|
|
1382
|
+
{
|
|
1383
|
+
vUv.x = vUv.x / aspect;
|
|
1384
|
+
float offset = (1. - 1. / aspect) * .5;
|
|
1385
|
+
vUv.x = vUv.x + offset;
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
vUv.x -= .5;
|
|
1389
|
+
vUv.y -= .5;
|
|
1390
|
+
|
|
1391
|
+
vUv.x *= offsetScale.z;
|
|
1392
|
+
vUv.y *= offsetScale.z;
|
|
1393
|
+
vUv.x += offsetScale.x;
|
|
1394
|
+
vUv.y += offsetScale.y;
|
|
1395
|
+
|
|
1396
|
+
vUv.x += .5;
|
|
1397
|
+
vUv.y += .5;
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
`,this.fragmentShader=`
|
|
1401
|
+
uniform sampler2D map;
|
|
1402
|
+
varying vec2 vUv;
|
|
1403
|
+
void main() {
|
|
1404
|
+
if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
|
|
1405
|
+
gl_FragColor = vec4(0., 0., 0., 1.);
|
|
1406
|
+
else
|
|
1407
|
+
{
|
|
1408
|
+
vec4 texcolor = texture2D(map, vUv);
|
|
1409
|
+
gl_FragColor = texcolor;
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
`}}var JI=Object.defineProperty,eL=Object.getOwnPropertyDescriptor,Qh=(o,e,t,i)=>{for(var n=i>1?void 0:i?eL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&JI(e,t,n),n};const Dt=w("debugscreensharing");var fS=(o=>(o[o.Screen=0]="Screen",o[o.Camera=1]="Camera",o[o.Canvas=2]="Canvas",o[o.Microphone=3]="Microphone",o))(fS||{});class sr extends E{allowStartOnClick=!0;onPointerEnter(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.setCursor("pointer")}onPointerExit(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.unsetCursor("pointer")}onPointerClick(e){if(this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&!(e&&e.pointerId!==0)){if(this.isReceiving&&this.videoPlayer?.isPlaying){this.videoPlayer&&(this.videoPlayer.screenspace=!this.videoPlayer.screenspace);return}if(this.isSending){this.close();return}this.share()}}autoConnect=!1;set videoPlayer(e){this._videoPlayer&&(this.isSending||this.isReceiving)&&this._videoPlayer.stop(),this._videoPlayer=e,this._videoPlayer&&this._currentStream&&(this.isSending||this.isReceiving)&&this._videoPlayer.setVideo(this._currentStream)}get videoPlayer(){return this._videoPlayer}_videoPlayer;_audioSource;get screenspace(){return this.videoPlayer?.screenspace??!1}set screenspace(e){this.videoPlayer&&(this.videoPlayer.screenspace=e)}device="Screen";deviceName;deviceFilter;get currentScream(){return this._currentStream}get currentMode(){return this._currentMode}get isSending(){return this._currentStream?.active&&this._currentMode===1}get isReceiving(){if(this._currentMode===2){if(!this._currentStream||this._currentStream.active===!1)return!1;const e=this._currentStream.getTracks();for(const t of e)if(t.readyState==="live")return!0}return!1}get requiresVideoPlayer(){return this.device!=="Microphone"}_net;_requestOpen=!1;_currentStream=null;_currentMode=0;awake(){typeof this.device=="number"&&(this.device=fS[this.device]),Dt&&console.log("Screensharing",this.name,this),Ni.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new Md(this)}onEnable(){this._net?.enable(),this._net?.addEventListener(co.StreamReceived,this.onReceiveStream),this._net?.addEventListener(co.StreamEnded,this.onCallEnded),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.autoConnect&&Bo(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){this._net?.removeEventListener(co.StreamReceived,this.onReceiveStream),this._net?.removeEventListener(co.StreamEnded,this.onCallEnded),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this._net?.disable(),this.close()}onJoinedRoom=async()=>{await Bo(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()};_ensureVideoPlayer(){const e=new gt;e.aspectMode=pS.AdjustWidth,x.addComponent(this.gameObject,e),this._videoPlayer=e}_activeShareRequest=null;async share(e){return this._activeShareRequest?this._activeShareRequest:(this._activeShareRequest=this.internalShare(e),this._activeShareRequest.then(()=>this._activeShareRequest=null))}async internalShare(e){if(this.context.connection.isInRoom===!1){console.warn("Can not start screensharing: requires network connection"),A()&&be("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");return}if(e?.device&&(this.device=e.device),!this.videoPlayer&&this.requiresVideoPlayer&&(this._videoPlayer||(this._videoPlayer=x.getComponent(this.gameObject,gt)??void 0),this.videoPlayer||this._ensureVideoPlayer(),!this.videoPlayer)){console.warn("Can not share video without a videoPlayer assigned");return}this._requestOpen=!0;try{const t=e?.constraints??{echoCancellation:!0,autoGainControl:!1},i={video:t,audio:t},n=i.video;switch(n!==void 0&&typeof n!="boolean"&&(n.width||(n.width={max:1920}),n.height||(n.height={max:1920}),n.aspectRatio||(n.aspectRatio={ideal:1.7777777778}),n.frameRate||(n.frameRate={ideal:24}),n.facingMode||(n.facingMode={ideal:"user"})),this.device){case"Camera":this.tryShareUserCamera(i,e);break;case"Screen":{if(!navigator.mediaDevices.getDisplayMedia){console.error("No getDisplayMedia support");return}const r=await navigator.mediaDevices.getDisplayMedia(i);this._requestOpen?this.setStream(r,1):Bn(r)}break;case"Canvas":const s=this.context.renderer.domElement.captureStream(0);this.setStream(s,1);break;case"Microphone":{if(!navigator.mediaDevices.getUserMedia){console.error("No getDisplayMedia support");return}i.video=!1;const r=await navigator.mediaDevices.getUserMedia(i);this._requestOpen?this.setStream(r,1):Bn(r)}break;default:console.error("Can not start screen sharing: Unknown device type",this.device)}}catch(t){if(t.name==="NotAllowedError"){console.log("Selection cancelled"),this._requestOpen=!1;return}console.error("Error opening video",t)}}close(){this._requestOpen=!1,this._currentStream&&(Dt&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),this._net?.stopSendingStream(this._currentStream),Bn(this._currentStream),this._currentMode=0,this._currentStream=null)}setStream(e,t){if(e===this._currentStream||(this.close(),!e))return;this._currentStream=e,this._requestOpen=!0,this._currentMode=t;const i=this.device!=="Microphone",n=t===1;i?(this._videoPlayer||this._ensureVideoPlayer(),this._videoPlayer?this._videoPlayer.setVideo(e):console.error("No video player assigned for video stream")):(this._audioSource||(this._audioSource=new Ni,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),n||(Dt&&console.log("PLAY",e.getAudioTracks()),this._audioSource.volume=1,this._audioSource?.play(e))),n&&this._net?.startSendingStream(e),n&&(this._videoPlayer&&(this._videoPlayer.muted=!0),this._audioSource?.stop());for(const s of e.getTracks())s.addEventListener("ended",()=>{Dt&&console.log("Track ended",s),this.close()}),Dt&&s.kind==="video"&&console.log(n?"Video \u2192":"Video \u2190",s.getSettings())}onReceiveStream=e=>{e.stream?.active===!0&&this.setStream(e.stream,2)};onCallEnded=e=>{Dt&&console.log("CALL ENDED",this.isReceiving,this?.screenspace),this.isReceiving&&(this.screenspace=!1)};async tryShareUserCamera(e,t){const i=(await navigator.mediaDevices.enumerateDevices()).filter(s=>s.kind==="videoinput");Dt&&console.log(`Request camera. These are your kind:videoinput devices:
|
|
1413
|
+
`,i);let n=!1;for(const s of i)try{if(!this._requestOpen){Dt&&console.log("Camera selection cancelled");break}if(s.kind!=="videoinput"){Dt&&console.log("Skipping non-video device",s);continue}const r=s.deviceId;if(t?.deviceId!=null||t?.deviceFilter!=null){if(t?.deviceId!==void 0&&r!==t.deviceId){Dt&&console.log("Skipping device due to options.deviceId: "+s.label+"; "+s.deviceId);continue}if(t?.deviceFilter&&t.deviceFilter(s)===!1){Dt&&console.log("Skipping device due to options.deviceFilter: "+s.label+"; "+s.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(s)===!1){Dt&&console.log("Skipping device due to ScreenShare.deviceFilter: "+s.label+"; "+s.deviceId);continue}else Dt&&console.log("Selected device by filter",s);else if(this.deviceName){const l=s.label.toLowerCase(),c=this.deviceName.toLowerCase(),h=l.includes(c),d=s.deviceId===this.deviceName;if(!h&&!d){Dt&&console.log("Skipping device due to ScreenShare.deviceName: "+s.label+"; "+s.deviceId);continue}else Dt&&console.log("Selected device by name",s)}e.video!==!1&&((typeof e.video>"u"||typeof e.video=="boolean")&&(e.video={}),e.video.deviceId=r),n=!0;const a=await navigator.mediaDevices.getUserMedia(e).catch(l=>(console.error("Failed to get user media",l),null));if(a===null)continue;this._requestOpen?(this.setStream(a,1),Dt&&console.log("Selected camera",s)):(Bn(a),Dt&&console.log("Camera selection cancelled"));break}catch(r){if(r.message==="Failed to allocate videosource"||r.message==="Could not start video source"){be("Failed to start video: Try another camera (Code "+r.code+")"),console.warn(r);continue}else console.error("Failed to get user media",r.message,r.code,r)}!n&&A()&&(be("No camera found for sharing. Please connect a camera (see console for more information)"),console.warn("No camera found for sharing. Please connect a camera",i,this.deviceName,"Using deviceFilter? "+this.deviceFilter!=null,"Using options? "+t!=null,"Using deviceName? "+this.deviceName!=null,"Using options.deviceId? "+t?.deviceId!=null,"Using options.deviceFilter? "+t?.deviceFilter!=null))}}Qh([u()],sr.prototype,"allowStartOnClick",2),Qh([u()],sr.prototype,"autoConnect",2),Qh([u(gt)],sr.prototype,"videoPlayer",1),Qh([u()],sr.prototype,"device",2),Qh([u()],sr.prototype,"deviceName",2);var tL=Object.defineProperty,Jl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tL(e,t,n),n};const iL=w("debugseethrough");let nL=0;class ls extends E{referencePoint=null;fadeDuration=.05;minAlpha=0;useAlphaHash=!0;set needsUpdate(e){this._needsUpdate=e}get needsUpdate(){return this._needsUpdate}overrideAlpha=-1;autoUpdate=!0;_referencePointVector=new b;_referencePointDir=new b;_distance=0;_renderer=null;_needsUpdate=!0;_id=nL++;onEnable(){this._needsUpdate=!0,this._renderer=null}update(){if(this._needsUpdate?(this._needsUpdate=!1,this._renderer=this.gameObject.getComponentsInChildren(oi),this.updateDirection()):this.autoUpdate&&(this.context.time.frame+this._id)%20===0&&this.updateDirection(),!this.autoUpdate||!this.referencePoint)return;const e=this._referencePointDir.dot(this.context.mainCamera.worldForward)>.2;if(iL&&this.referencePoint){const t=this.gameObject.worldPosition;B.DrawArrow(F(t),t.sub(this._referencePointDir),e?16711680:65280),B.DrawWireSphere(this.referencePoint.worldPosition,.05,255)}e?this.updateAlpha(this.minAlpha,this.fadeDuration):this.updateAlpha(1,this.fadeDuration)}updateDirection(){this.referencePoint??=this.context.scene,this._referencePointVector.copy(this.gameObject.worldPosition.sub(this.referencePoint.worldPosition)),this._distance=this._referencePointVector.length(),this._referencePointDir.copy(this._referencePointVector).multiply(F(1,.5,1)).normalize()}updateAlpha(e,t=this.fadeDuration){this.overrideAlpha!==void 0&&this.overrideAlpha!==-1&&(e=this.overrideAlpha),this._renderer?.forEach(i=>{e<.9?i.gameObject.raycastAllowed=!1:i.gameObject.raycastAllowed=!0;const n=i.sharedMaterials;if(!n)return;const s=ys.get(i.gameObject),r=s.getOverride("opacity")?.value??n[0].opacity??1;let a=D.lerp(r,e,t<=0?1:this.context.time.deltaTime/t);a>=.99?a=1:a<=.01&&(a=0),s.setOverride("alphaHash",this.useAlphaHash),s.setOverride("opacity",a),s.setOverride("transparent",a>=.99999?!1:!this.useAlphaHash)})}}Jl([u(M)],ls.prototype,"referencePoint"),Jl([u()],ls.prototype,"fadeDuration"),Jl([u()],ls.prototype,"minAlpha"),Jl([u()],ls.prototype,"useAlphaHash"),Jl([u()],ls.prototype,"overrideAlpha"),Jl([u()],ls.prototype,"autoUpdate");var oL=Object.defineProperty,yS=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&oL(e,t,n),n};class Yh extends E{mode=0;shadowColor=new se(0,0,0,1);targetMesh;start(){if(this.gameObject instanceof H)this.gameObject instanceof H&&this.gameObject.material&&(this.gameObject.material=this.gameObject.material.clone(),this.targetMesh=this.gameObject,this.targetMesh.receiveShadow=!0);else{const e=Rs.createPrimitive(Za.Quad,{name:"ShadowCatcher",material:new yt({color:10066329,roughness:1,metalness:0,transparent:!0})});e.receiveShadow=!0,e.geometry.rotateX(-Math.PI/2),this.gameObject.add(e),this.targetMesh=e}if(!this.targetMesh){console.warn("ShadowCatcher: no mesh to apply shadow catching to. Groups are currently not supported.");return}switch(this.targetMesh.layers.set(2),this.mode){case 0:this.applyShadowMaterial();break;case 1:this.applyLightBlendMaterial();break;case 2:this.applyOccluderMaterial();break}}applyLightBlendMaterial(){if(!this.targetMesh)return;const e=this.targetMesh.material;e.blending=$b,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
|
|
1414
|
+
// diffuse-only lighting with overdrive to somewhat compensate
|
|
1415
|
+
// for the loss of indirect lighting and to make it more visible.
|
|
1416
|
+
vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
|
|
1417
|
+
float max = max(direct.r, max(direct.g, direct.b));
|
|
1418
|
+
|
|
1419
|
+
// early out - we're simply returning direct lighting and some alpha based on it so it can
|
|
1420
|
+
// be blended onto the scene.
|
|
1421
|
+
gl_FragColor = vec4(direct, max);
|
|
1422
|
+
return;
|
|
1423
|
+
`)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new Eb;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),this.targetMesh.material=e,e.userData.isShadowCatcherMaterial=!0}else{const e=this.targetMesh.material;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),e.userData.isShadowCatcherMaterial=!0}}applyOccluderMaterial(){if(this.targetMesh){let e=this.targetMesh.material;if(!e){const t=new Ce;this.targetMesh.material=t,e=t}e.depthWrite=!0,e.stencilWrite=!0,e.colorWrite=!1,this.gameObject.renderOrder=-100}}applyMaterialOptions(e){e&&(e.depthWrite=!1,e.stencilWrite=!1)}}yS([u()],Yh.prototype,"mode"),yS([u(se)],Yh.prototype,"shadowColor");var sL=Object.defineProperty,um=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&sL(e,t,n),n};const Zh=class rC extends E{target=null;followFactor=.1;rotateFactor=.1;positionAxes=ml.All;flipForward=!1;static _invertForward=new N().setFromAxisAngle(new b(0,1,0),Math.PI);_firstUpdate=!0;onBeforeRender(){this.updateNow(!1)}updateNow(e){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const t=ee(this.target),i=this._firstUpdate||e?1:D.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&ml.X&&(n.x=D.lerp(n.x,t.x,i)),this.positionAxes&ml.Y&&(n.y=D.lerp(n.y,t.y,i)),this.positionAxes&ml.Z&&(n.z=D.lerp(n.z,t.z,i)),this.worldPosition=n}if(this.rotateFactor>0){const t=_e(this.target);this.flipForward&&t.premultiply(rC._invertForward);const i=this._firstUpdate||e?1:D.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(t,i)}this._firstUpdate=!1}}};um([u(M)],Zh.prototype,"target"),um([u()],Zh.prototype,"followFactor"),um([u()],Zh.prototype,"rotateFactor"),um([u()],Zh.prototype,"positionAxes");let pm=Zh;var rL=Object.defineProperty,Kh=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&rL(e,t,n),n};const Jh=w("debugspatialtrigger"),bS=new xs,_S=new xs;function aL(o,e){return bS.mask=o,_S.mask=e,bS.test(_S)}class wo extends E{triggerMask=0;onEnter;onStay;onExit;start(){Jh&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of mm.triggers)aL(e.triggerMask,this.triggerMask)&&e.test(this.gameObject)&&this.currentIntersected.push(e);for(let e=this.lastIntersected.length-1;e>=0;e--){const t=this.lastIntersected[e];this.currentIntersected.indexOf(t)<0&&(this.onExitTrigger(t),this.lastIntersected.splice(e,1))}for(const e of this.currentIntersected)this.lastIntersected.indexOf(e)<0&&this.onEnterTrigger(e),this.onStayTrigger(e);this.lastIntersected.length=0,this.lastIntersected.push(...this.currentIntersected)}currentIntersected=[];lastIntersected=[];onEnterTrigger(e){Jh&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){Jh&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}Kh([u()],wo.prototype,"triggerMask"),Kh([u(ae)],wo.prototype,"onEnter"),Kh([u(ae)],wo.prototype,"onStay"),Kh([u(ae)],wo.prototype,"onExit");const vS=class Tm extends E{static triggers=[];triggerMask;boxHelper;start(){Jh&&console.log(this.name,this.triggerMask,this)}onEnable(){Tm.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,zt),this.boxHelper?.showHelper(null,Jh))}onDisable(){Tm.triggers.splice(Tm.triggers.indexOf(this),1)}test(e){return this.boxHelper?this.boxHelper.isInBox(e)??!1:!1}raiseOnEnterEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof wo&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof wo&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof wo&&t.onExitTrigger(this)},!1)}};Kh([u()],vS.prototype,"triggerMask");let mm=vS;var lL=Object.defineProperty,cL=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&lL(e,t,n),n};const Xi=w("debugspectator");class gm extends E{cam=null;useKeys=!0;_mode=0;get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){return this._handler?.currentTarget!==void 0}isSpectatingUser(e){return this.target?.userId===e}isFollowedBy(e){return this.followers?.includes(e)}get followers(){return this._networking.followers}stopSpectating(){if(this.context.isInXR){this.followSelf();return}this.target=void 0}get localId(){return this.context.connection.connectionId??"local"}set target(e){if(this._handler){const t=this._handler.currentTarget?.userId,i=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&i?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,t)):this._handler.currentTarget!==e&&(this._handler.set(e),x.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,t))}}get target(){return this._handler?.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){return this.isSpectating&&this.target?.currentObject===this.context.players.getPlayerView(this.localId)?.currentObject}orbit=null;_handler;eventSub_WebXRRequestStartEvent=null;eventSub_WebXRStartEvent=null;eventSub_WebXREndEvent=null;_debug;_networking;awake(){if(this._debug=new uL(this.context,this),this._networking=new gL(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,wi),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new hL(this.context,this.cam,this)),this.orbit=x.getComponent(this.context.mainCamera,me)}onDestroy(){this.stopSpectating(),this._handler?.destroy(),this._networking?.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return I.isDesktop()&&!I.isMobileDevice()&&!t}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(Xi&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){this.context.removeCamera(this.cam),x.setActive(this.gameObject,!1),this._handler?.set(void 0),this._handler?.disable(),this.isSpectatingSelf&&this.stopSpectating(),this.orbit&&(this.orbit.enabled=!0)}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,No.Headset),this.target=this.context.players.getPlayerView(this.localId)),Xi&&console.log("Follow self",this.target)}onAfterRender(){if(!this.cam)return;const e=this.context.renderer,t=e.xr.enabled;if(!e.xr.isPresenting&&!this._handler?.currentTarget)return;this._handler?.update(this._mode);const i=e.getRenderTarget();let n=null;const s=e.state;if(!i||i.isXRRenderTarget===!0){if(!e.state.bindFramebuffer||!s.bindXRFramebuffer)return;n=e._framebuffer,s.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const r=this.context.mainCameraComponent;if(r){const c=r.backgroundColor;c&&e.setClearColor(c,c.alpha),this.cam.backgroundColor=c,this.cam.clearFlags=r.clearFlags,this.cam.nearClipPlane=r.nearClipPlane,this.cam.farClipPlane=r.farClipPlane}else e.setClearColor(new oe(1,1,1));e.setRenderTarget(null),e.xr.enabled=!1;const a=this.cam?.threeCamera;this.context.updateAspect(a);const l=e.xr.isPresenting;e.xr.isPresenting=!1,e.setSize(this.context.domWidth,this.context.domHeight),e.render(this.context.scene,a),e.xr.isPresenting=l,e.xr.enabled=t,i?e.setRenderTarget(i):s.bindXRFramebuffer&&s.bindXRFramebuffer(n),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of Le.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=ho.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?ho.FirstPerson:ho.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const s of n)s.UpdateVisible(i)}}resetAvatarFlags(){for(const e of Le.instances)if(e.avatar&&"flags"in e.avatar){const t=e.avatar.flags;if(!t)continue;for(const i of t)"isLocalAvatar"in e.avatar&&e.avatar?.isLocalAvatar?i.UpdateVisible(ho.FirstPerson):i.UpdateVisible(ho.ThirdPerson)}}}cL([u()],gm.prototype,"useKeys");class hL{context;cam;spectator;follow;target;view;currentObject;get currentTarget(){return this.view}constructor(e,t,i){this.context=e,this.cam=t,this.spectator=i}set(e){const t=e?.currentObject;if(!t){this.spectator.stopSpectating();return}t!==this.currentObject&&(this.currentObject=t,this.view=e,this.follow||(this.follow=x.addComponent(this.cam.gameObject,pm)),this.target||(this.target=new M),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,Xi&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){Xi&&console.log("STOP FOLLOW",this.currentObject),this.view=void 0,this.currentObject=void 0,this.context.removeCamera(this.cam),this.follow&&(this.follow.enabled=!1)}destroy(){this.target?.removeFromParent(),this.follow&&x.destroy(this.follow)}update(e){if(this.currentTarget?.isConnected===!1||this.currentTarget?.removed===!0){Xi&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(Xi&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const t=this.context.mainCamera;if(t){const n=this.cam.threeCamera;(n.near!==t.near||n.far!==t.far)&&(n.near=t.near,n.far=t.far,n.updateProjectionMatrix())}const i=this.follow?.target;if(!(!i||!this.follow)){switch(e){case 0:this.view?.viewDevice!==No.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),i.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,i.position.set(0,.5,1.5);break}this.follow.flipForward=!1,this.view?.viewDevice!==No.Browser?i.quaternion.copy(dL):i.quaternion.identity()}}}const dL=new N().setFromAxisAngle(new b(0,1,0),Math.PI);class uL{context;spectator;constructor(e,t){this.context=e,this.spectator=t,console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode."),this.context.domElement.addEventListener("keydown",n=>{!this.spectator.useKeys||n.key==="Escape"&&this.spectator.stopSpectating()});let i=0;this.context.input.addEventListener(Ae.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(Ae.PointerUp,n=>{const s=this.context.time.time-i;s>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&s<.3&&this.trySelectObject()})}trySelectObject(){const e=new Ts;e.setMask(16777215);const t=this.context.physics.raycast(e);if(Xi&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,s=Ci.getFor(n);let r=s?.owner;if(r||(r=x.getComponentInParent(n,Le)?.connectionId),r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,Xi&&console.log("spectate",r,s);break}}}}class pL{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class mL{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class gL{followers=[];context;spectator;_followerEventMethod;_requestFollowMethod;_joinedRoomMethod;constructor(e,t){this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(ie.JoinedRoom,this._joinedRoomMethod),this.context.domElement.addEventListener("keydown",e=>{this.spectator.useKeys&&(e.key==="f"?this.onRequestFollowMe():e.key==="Escape"&&this.onRequestFollowMe(!0))})}destroy(){this.context.connection.stopListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.stopListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.stopListen(ie.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(Xi&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const i=e?.userId===void 0,n=i?t:e?.userId,s=new pL(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",s)}}onRequestFollowMe(e=!1){if(Xi&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,i=new mL(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){w("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(Xi&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const n=this.followers.indexOf(i);n!==-1&&(this.followers.splice(n,1),this.removeDisconnectedFollowers(),console.log(i,"unfollows you",this.followers.length))}else this.followers.includes(i)||(this.followers.push(i),this.removeDisconnectedFollowers(),console.log(i,"follows you",this.followers.length))}removeDisconnectedFollowers(){for(let e=this.followers.length-1;e>=0;e--){const t=this.followers[e];this.context.connection.userIsInRoom(t)===!1&&this.followers.splice(e,1)}}_lastRequestFollowUser;onRequestFollowEvent(e){if(this._lastRequestFollowUser=e,e.userId===this.context.connection.connectionId)this.spectator.stopSpectating();else if(e.userId===void 0)this.spectator.stopSpectating();else{const t=this.context.players.getPlayerView(e.userId);if(t)this.spectator.target=t;else return Xi&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}_enforceFollowInterval;enforceFollow(){this._enforceFollowInterval||(this._enforceFollowInterval=setInterval(()=>{this._lastRequestFollowUser===void 0||this._lastRequestFollowUser.userId&&this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)?(clearInterval(this._enforceFollowInterval),this._enforceFollowInterval=void 0):(Xi&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}var fL=Object.defineProperty,yL=Object.getOwnPropertyDescriptor,ec=(o,e,t,i)=>{for(var n=i>1?void 0:i?yL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&fL(e,t,n),n};const wS=w("debugsplines");class xo{position=new b;rotation=new N;tangentIn=new b;tangentOut=new b}ec([qe(b)],xo.prototype,"position",2),ec([qe(N)],xo.prototype,"rotation",2),ec([qe(b)],xo.prototype,"tangentIn",2),ec([qe(b)],xo.prototype,"tangentOut",2);class _a extends E{addKnot(e){if(e instanceof xo)this.spline.push(e),this._isDirty=!0;else{const t=new xo;t.position.copy(e.position),this.spline.push(t),this._isDirty=!0}return this}removeKnot(e){if(typeof e=="number")this.spline.splice(e,1),this._isDirty=!0;else{const t=this.spline.indexOf(e);t!==-1&&(this.spline.splice(t,1),this._isDirty=!0)}return this}getPointAt(e,t){if(!this.curve)return new b;const i=this.curve.getPointAt(D.clamp01(e),t),n=this.gameObject.matrixWorld??void 0;return n&&i.applyMatrix4(n),i}markDirty(){this._isDirty=!0}getTangentAt(e,t){if(!this.curve)return t??new b;const i=this.gameObject.worldQuaternion;return this.curve.getTangentAt(D.clamp01(e),t).applyQuaternion(i)}set closed(e){this._closed=e,this._isDirty=!0}get closed(){return this._closed}_closed=!1;spline=[];set debug(e){e&&!this._builtCurve&&this.buildCurve(),this._debugLine&&(this._debugLine.visible=e)}get curve(){return this._curve}get isDirty(){return this._isDirty}_isDirty=!1;_curve=null;_builtCurve=!1;_debugLine=null;awake(){wS&&(console.log(`[Spline] ${this.name}`,this),this.buildCurve())}update(){this._isDirty&&this.buildCurve(!0),this._debugLine&&this._debugLine.parent!==this.gameObject&&this.gameObject.add(this._debugLine)}buildCurve(e=!1){if(!(this._builtCurve&&!e)){if(this._builtCurve=!0,!this.spline){console.error("[Spline] Can not build curve, no spline data",this.name);return}this._isDirty=!1,this._curve=bL(this.spline,this.closed),this.buildDebugCurve()}}buildDebugCurve(){if(wS&&this.spline&&this._curve){this._debugLine?.removeFromParent(),this._debugLine=null;const e=new zd({color:6684927}),t=this.spline.length*10,i=this._curve.getPoints(t),n=new Ji().setFromPoints(i);this._debugLine=new Ba(n,e),this.gameObject?.add(this._debugLine)}}}ec([qe()],_a.prototype,"closed",1),ec([qe(xo)],_a.prototype,"spline",2);function bL(o,e){const t=o.map(s=>new b(-s.position.x,s.position.y,s.position.z));t.length===1&&t.push(t[0]);const i=o.reduce((s,r)=>s+Math.abs(r.tangentOut.x)+Math.abs(r.tangentOut.y)+Math.abs(r.tangentOut.z),0)/o.length,n=D.clamp(D.remap(i,0,.3,0,.5),0,1);return new _P(t,e,"catmullrom",n)}var _L=Object.defineProperty,vL=Object.getOwnPropertyDescriptor,rr=(o,e,t,i)=>{for(var n=i>1?void 0:i?vL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&_L(e,t,n),n};class fn extends E{spline=null;object=void 0;useLookAt=!0;lookAt=null;clamp=!1;get position01(){return this._position01}set position01(e){this._position01=e,this._needsUpdate=!0}reset(){this._position01=0}autoRun=!0;duration=10;pullStrength=1;_position01=0;_needsUpdate=!1;start(){this.object===void 0&&(this.object=this.gameObject),this.updateFromPosition()}onEnable(){window.addEventListener("pointerdown",this.onUserInput,{passive:!0}),this.context.domElement.addEventListener("wheel",this.onUserInput,{passive:!0})}onDisable(){window.removeEventListener("pointerdown",this.onUserInput),this.context.domElement.removeEventListener("wheel",this.onUserInput)}onUserInput=()=>{this.object?.contains(this.context.mainCamera)&&(this._needsUpdate=!1,this._performedUpdates+=999)};update(){this.autoRun&&(this._needsUpdate=!0,this._position01+=this.context.time.deltaTime/this.duration),this._needsUpdate&&(this._needsUpdate=!1,this.updateFromPosition())}updateFromPosition(){if(!this.spline||!this.spline.curve||!this.object)return;this.clamp?this._position01=D.clamp01(this._position01):this._position01=this._position01%1;const e=this._position01>=1?1:this._position01%1,t=this.spline.getPointAt(e);if(this.pullStrength>=1)this.object.worldPosition=t;else if(this._position01!==this._lastPosition01&&(this._performedUpdates=0),this._requiredUpdates=Math.round(100/this.pullStrength),this._performedUpdates<this._requiredUpdates){const i=this.object.worldPosition;this._performedUpdates++;const n=D.clamp01(this.pullStrength),s=this.object.worldPosition=i.lerp(t,n*(this.context.time.deltaTime/.3));this._lastPositionVector.copy(s),this._needsUpdate=!0}if(this.useLookAt)if(this.lookAt)this.object.lookAt(this.lookAt.worldPosition);else{const i=this.spline.getTangentAt(e);this.object.lookAt(t.add(i))}this._lastPosition01=this._position01}_lastPosition01=0;_requiredUpdates=0;_performedUpdates=0;_lastPositionVector=new b}rr([qe(_a)],fn.prototype,"spline",2),rr([qe(M)],fn.prototype,"object",2),rr([qe()],fn.prototype,"useLookAt",2),rr([qe(M)],fn.prototype,"lookAt",2),rr([qe()],fn.prototype,"clamp",2),rr([qe()],fn.prototype,"position01",1),rr([qe()],fn.prototype,"autoRun",2),rr([qe()],fn.prototype,"duration",2);class Oo{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new Oo).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+t_),(t||new Oo).__init(e.readInt32(e.position())+e.position(),e)}userId(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}guid(e){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__string(this.bb_pos+t,e):null}dontSave(){const e=this.bb.__offset(this.bb_pos,8);return e?!!this.bb.readInt8(this.bb_pos+e):!1}pos(e){const t=this.bb.__offset(this.bb_pos,10);return t?(e||new qr).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new qr).__init(this.bb_pos+t,this.bb):null}static startSyncedCameraModel(e){e.startObject(5)}static addUserId(e,t){e.addFieldOffset(0,t,0)}static addGuid(e,t){e.addFieldOffset(1,t,0)}static addDontSave(e,t){e.addFieldInt8(2,+t,0)}static addPos(e,t){e.addFieldStruct(3,t,0)}static addRot(e,t){e.addFieldStruct(4,t,0)}static endSyncedCameraModel(e){return e.endObject()}static finishSyncedCameraModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedCameraModelBuffer(e,t){e.finish(t,void 0,!0)}}var wL=Object.defineProperty,xL=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wL(e,t,n),n};const fm="SCAM";af(fm,Oo.getRootAsSyncedCameraModel);const Qi=new Jm;class SL{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Qi.clear();const i=Qi.createString(this.guid),n=Qi.createString(this.userId);Oo.startSyncedCameraModel(Qi),Oo.addGuid(Qi,i),Oo.addUserId(Qi,n);const s=ee(e),r=Kd(e);Oo.addPos(Qi,qr.createVec3(Qi,s.x,s.y,s.z)),Oo.addRot(Qi,qr.createVec3(Qi,r.x,r.y,r.z));const a=Oo.endSyncedCameraModel(Qi);Qi.finish(a,fm),t.sendBinary(Qi.asUint8Array())}}}const xS=class Mb extends E{static instances=[];getCameraObject(e){const t=this.userToCamMap[e];return t?this.remoteCams[t].obj:null}cameraPrefab=null;_lastWorldPosition;_lastWorldQuaternion;_model=null;_needsUpdate=!0;_lastUpdateTime=0;remoteCams={};userToCamMap={};_camTimeoutInSeconds=10;_receiveCallback=null;async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(fm,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(fm,this._receiveCallback)}update(){for(const n in this.remoteCams){const s=this.remoteCams[n],r=this.context.time.realtimeSinceStartup-s.lastUpdate;if(!s||r>this._camTimeoutInSeconds){A()&&console.log("Remote cam timeout",n),s?.obj&&x.destroy(s.obj),delete this.remoteCams[n],s&&delete this.userToCamMap[s.userId],Mb.instances.push(s),this.context.players.removePlayerView(s.userId,No.Browser);continue}}if(this.context.isInXR)return;const e=this.context.mainCamera;if(e===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new SL(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=ee(e),i=_e(e);(t.distanceTo(this._lastWorldPosition)>.001||i.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(t),this._lastWorldQuaternion.copy(i),!((!this._needsUpdate||this.context.time.frameCount%2!==0)&&!(this.context.time.realtimeSinceStartup-this._lastUpdateTime>this._camTimeoutInSeconds*.5))&&(this._lastUpdateTime=this.context.time.realtimeSinceStartup,this._needsUpdate=!1,this._model.send(e,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,e,No.Browser))}onReceivedRemoteCameraInfoBin(e){const t=e.guid();if(!t)return;const i=e.userId();if(!i||!this.context.connection.userIsInRoom(i)||!this.cameraPrefab)return;let n=this.remoteCams[t];if(!n)if("isObject3D"in this.cameraPrefab){const l=new qn;l.context=this.context;const c=x.instantiate(this.cameraPrefab,l);n=this.remoteCams[t]={obj:c,lastUpdate:this.context.time.realtimeSinceStartup,userId:i},n.obj.visible=!0,this.gameObject.add(c),this.userToCamMap[i]=t,Mb.instances.push(n);const h=x.getOrAddComponent(c,Le);h.connectionId=i,h.avatar=c}else return;const s=n.obj;this.context.players.setPlayerView(i,s,No.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,vn.markDirty(s);const r=e.pos();r&&Pr(s,r.x(),r.y(),r.z());const a=e.rot();a&&Sc(s,a.x(),a.y(),a.z())}};xL([u([M,ne])],xS.prototype,"cameraPrefab");let Z0=xS;var CL=Object.defineProperty,PL=Object.getOwnPropertyDescriptor,ar=(o,e,t,i)=>{for(var n=i>1?void 0:i?PL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&CL(e,t,n),n};const K0="view",J0=w("debugsyncedroom");class $n extends E{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){return w(K0)||w(this.urlParameterName)}_lastJoinedRoom;set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}_roomPrefix="";awake(){this.joinRandomRoom===void 0&&this.roomName?.length<=0&&(this.joinRandomRoom=!0),J0&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}_hasConnectedBefore=!1;onEnable(){if(this.createJoinButton){const e=this.createRoomButton();this.context.menu.appendChild(e)}this.createViewOnlyButton&&this.onEnableViewOnlyButton(),this._hasConnectedBefore&&this._connectToRoom()}start(){this._hasConnectedBefore||this._connectToRoom()}_connectToRoom(){this._hasConnectedBefore=!0;const e=w(K0);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}this.tryJoinRoom()}onDisable(){this._roomButton?.remove(),this.onDisableViewOnlyButton(),this.roomName&&this.roomName.length>0&&this.context.connection.leaveRoom(this.roomName)}onDestroy(){this.destroyRoomButton()}tryJoinRandomRoom(){this.setRandomRoomUrlParameter(),this.tryJoinRoom()}tryJoinRoom(e=0){e===void 0&&(e=0);let t=!1;if(this.urlParameterName?.length>0){const i=w(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=m_(i.toString());this.roomName=n}else if(this.joinRandomRoom&&(console.debug("No room name found in url, generating random one"),this.setRandomRoomUrlParameter(),e<1))return this.tryJoinRoom(e+1)}else this.joinRandomRoom&&(this.roomName===null||this.roomName===void 0||this.roomName.length<=0)&&(this.roomName=this.generateRoomName());return this.requireRoomParameter&&!t?((J0||A())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
|
|
1424
|
+
To allow joining a room without a query parameter you can set "requireRoomParameter" to false.`),!1):(this.context.connection.isConnected||this.context.connection.connect(),this._lastJoinedRoom=this.roomName,this._roomPrefix&&(this.roomName=this._roomPrefix+this.roomName),this.roomName.length<=0?(console.warn(`[SyncedRoom] Room name is not set so we can not join a networked room.
|
|
1425
|
+
Please choose one of the following options to fix this:
|
|
1426
|
+
A) Set a room name in the SyncedRoom component
|
|
1427
|
+
B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
|
|
1428
|
+
C) Set "joinRandomRoom" to true`),!1):(J0&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}_lastPingTime=0;_lastRoomTime=-1;_userWantsToBeInARoom=!1;update(){this.context.connection.isConnected&&(this.context.time.time-this._lastPingTime>3&&(this._lastPingTime=this.context.time.time,this.context.connection.sendPing()),this.context.connection.isInRoom&&(this._lastRoomTime=this.context.time.time)),this._lastRoomTime>0&&this.context.time.time-this._lastRoomTime>.3&&(this._lastRoomTime=-1,this.autoRejoin?this._userWantsToBeInARoom&&(console.log("Disconnected from networking backend - attempt reconnecting now"),this.tryJoinRoom()):A()&&console.warn("You are not connected to a room anymore (possibly because the tab was inactive for too long and the server kicked you?)"))}getViewOnlyUrl(){if(this.context.connection.isConnected&&this.context.connection.currentRoomViewId){const e=window.location.search,t=new URLSearchParams(e);return t.has(this.urlParameterName)&&t.delete(this.urlParameterName),t.set(K0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=_c(),t=this.generateRoomName();w(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),sg(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}_roomButton;_roomButtonIconJoin;_roomButtonIconLeave;createRoomButton(){if(this._roomButton)return this._roomButton;const e=document.createElement("button");return this._roomButton=e,e.classList.add("create-room-button"),e.setAttribute("priority","90"),e.onclick=()=>{if(this.context.connection.isInRoom)this.urlParameterName&&Ua(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=w(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Ua(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=vt("group"),this._roomButtonIconLeave=vt("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(ie.LeftRoom,this.updateRoomButtonState),e}updateRoomButtonState=()=>{this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",this._roomButtonIconJoin?.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",this._roomButtonIconLeave?.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))};destroyRoomButton(){this.context.connection.stopListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(ie.LeftRoom,this.updateRoomButtonState)}_viewOnlyButton;onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(ie.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),this._viewOnlyButton?.remove()}onCreateViewOnlyButton=()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{const t=this.getViewOnlyUrl();t?.length?navigator.canShare({url:t})?navigator.share({url:t})?.catch(i=>{console.warn(i)}):(navigator.clipboard.writeText(t),ke("View only URL copied to clipboard")):be("Could not create view only URL")},e.title="Copy the view only URL: A page accessed by the view only URL can not be modified by visiting users.",e.textContent="Share View URL",e.prepend(vt("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)}}ar([u()],$n.prototype,"roomName",2),ar([u()],$n.prototype,"urlParameterName",2),ar([u()],$n.prototype,"joinRandomRoom",2),ar([u()],$n.prototype,"requireRoomParameter",2),ar([u()],$n.prototype,"autoRejoin",2),ar([u()],$n.prototype,"createJoinButton",2),ar([u()],$n.prototype,"createViewOnlyButton",2),ar([u()],$n.prototype,"roomPrefix",1);function OL(){const o=w("testwindowcount")||0;o&&o>0&&kL(o)}function kL(o){if(w("testwindow"))return null;const e=new URL(window.location.href);og(e.searchParams,yT,1),og(e.searchParams,"testwindow",1);const t=e.toString(),i=[];window.onbeforeunload=()=>{for(const l of i)l.close()};const n=.05,s=128;let r=0,a=0;for(let l=0;l<o;l++){r*s+s*.01>=window.innerWidth&&(a+=1,r=0);const c=r*(s*(1+n))+window.screenLeft,h=a*(s*(1+n))+window.screenTop+90+60*a;r+=1;const d=window.open(t,"test window "+l,`popup=yes width=${s} height=${s} top=${h} left=${c}`);if(!d){console.warn("Failed to open window");continue}i.push(d),d.onload=()=>{d.onbeforeunload=()=>{for(let p=0;p<i.length;p++){const m=i[p];m!==d&&m.close()}i.length=0}}}return i}class eb extends E{awake(){OL()}}class tb extends E{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(nh,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new ML(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}builder=null;models=null;update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new Jm(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=xx(this.context.connection.connectionId,this);this.context.connection.sendBinary(i)}}else if(this.models)for(let e=0;e<this.models.length;e++){const t=this.models[e];t.dontSave=!0,t.update(this,null),this.context.connection.send("TestSimulateUserData-"+e,t)}}}}class ML{guid;fast=!1;position;rotation;velocity=void 0;dontSave;isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}constructor(e,t){this.guid=e,this.position={x:0,y:0,z:0},this.rotation={x:0,y:0,z:0,w:0},this.update(t,null)}static temp=new b;update(e,t){const i=e.worldPosition;this.position.x=i.x,this.position.y=i.y,this.position.z=i.z;const n=e.worldQuaternion;if(this.rotation.x=n.x,this.rotation.y=n.y,this.rotation.z=n.z,this.rotation.w=n.w,this.fast=!1,t){const s=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=s.x,this.velocity.y=s.y,this.velocity.z=s.z}}}var EL=Object.defineProperty,ym=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&EL(e,t,n),n};class va extends E{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!Ic)&&this.context.mainCamera&&(this._control||(this._control=new NP(this.context.mainCamera,this.context.renderer.domElement),this._control.enabled=!0,this._control.getRaycaster().layers.set(2),this._control.size=1,("_root"in this._control?this._control._root:this._control).traverse(e=>{const t=e;if(t.layers.set(2),t){const i=t.material;i&&(i.opacity=.3)}}),this.orbit=x.getComponentInParent(this.context.mainCamera,me)??void 0),this._control)){const e=this._control.getHelper();this.context.scene.add(e),this._control.attach(this.gameObject),this._control?.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){this._control?.getHelper()?.removeFromParent(),this._control?.removeEventListener("dragging-changed",this.onControlChangedEvent),window.removeEventListener("keydown",this.windowKeyDownListener),window.removeEventListener("keyup",this.windowKeyUpListener)}enableSnapping(){this._control&&(this._control.setTranslationSnap(this.translationSnap),this._control.setRotationSnap(Lo.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}onControlChangedEvent=e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const i=this.gameObject.getComponentInParent(Ln);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(Ln);i&&(i.fastMode=!1)}};windowKeyDownListener=e=>{if(this.enabled&&this._control)switch(e.keyCode){case 81:this._control.setSpace(this._control.space==="local"?"world":"local");break;case 16:this.enableSnapping();break;case 87:this._control.setMode("translate");break;case 69:this._control.setMode("rotate");break;case 82:this._control.setMode("scale");break;case 187:case 107:this._control.setSize(this._control.size+.1);break;case 189:case 109:this._control.setSize(Math.max(this._control.size-.1,.1));break;case 88:this._control.showX=!this._control.showX;break;case 89:this._control.showY=!this._control.showY;break;case 90:this._control.showZ=!this._control.showZ;break;case 32:this._control.enabled=!this._control.enabled;break}};windowKeyUpListener=e=>{this.enabled&&e.keyCode===16&&this.disableSnapping()}}ym([u()],va.prototype,"isGizmo"),ym([u()],va.prototype,"translationSnap"),ym([u()],va.prototype,"rotationSnapAngle"),ym([u()],va.prototype,"scaleSnap");var RL=Object.defineProperty,TL=Object.getOwnPropertyDescriptor,bm=(o,e,t,i)=>{for(var n=i>1?void 0:i?TL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&RL(e,t,n),n};class ib{texture=null;rect}bm([u(Se)],ib.prototype,"texture",2);let tc=class extends Dh{set image(o){this.sprite||(this.sprite=new ib),this.sprite.texture=o,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(o){this._sprite!==o&&(this._sprite=o,this.onAfterCreated())}_sprite;pixelsPerUnitMultiplier=1;isBuiltinSprite(){const o=this.sprite;switch(o?.texture?.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!o?.texture?.name?.length&&o?.texture?.image?.width===32&&o?.texture?.image?.height===32}onBeforeCreate(o){super.onBeforeCreate(o),this.isBuiltinSprite()&&(o.borderRadius=5/this.pixelsPerUnitMultiplier,this.sprite?.texture?.name==="Knob"&&(o.borderRadius=999))}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture(this.sprite?.texture))}};bm([u(ib)],tc.prototype,"sprite",1),bm([u()],tc.prototype,"pixelsPerUnitMultiplier",2);class _m extends Dh{get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}_mainTexture;onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}bm([u(Se)],_m.prototype,"mainTexture",1);var AL=Object.defineProperty,IL=Object.getOwnPropertyDescriptor,Yi=(o,e,t,i)=>{for(var n=i>1?void 0:i?IL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&AL(e,t,n),n};const wa=w("debugbutton");class lr{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}Yi([u()],lr.prototype,"colorMultiplier",2),Yi([u(se)],lr.prototype,"disabledColor",2),Yi([u()],lr.prototype,"fadeDuration",2),Yi([u(se)],lr.prototype,"highlightedColor",2),Yi([u(se)],lr.prototype,"normalColor",2),Yi([u(se)],lr.prototype,"pressedColor",2),Yi([u(se)],lr.prototype,"selectedColor",2);class LL{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class cs extends E{click(){this.onClick?.invoke()}onClick=new ae;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),wa&&console.warn("Button Enter",t,this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&this._image?.setState("hovered"),t&&this.context.input.setCursor("pointer"))}onPointerExit(){this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),wa&&console.log("Button Exit",this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this._isHovered>0||(this._isHovered=0,this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState("normal"),this.context.input.unsetCursor("pointer")))}onPointerDown(e){wa&&console.log("Button Down",this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&this._image?.setState("pressed"))}onPointerUp(e){wa&&console.warn("Button Up",this.animationTriggers?.highlightedTrigger,this.animator,this._isHovered),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this._isHovered?this.animationTriggers.highlightedTrigger:this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState(this._isHovered?"hovered":"normal"))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===yu.Mouse)&&(wa&&(console.warn("Button Click",this.onClick),ke("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),this.context.accessibility.focus(this),wa))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),B.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}colors;transition;animationTriggers;animator;set interactable(e){this._interactable=e,this._image&&(this._image.setInteractable(e),e?this._image.setState("normal"):this._image.setState("disabled"))}get interactable(){return this._interactable}_interactable=!0;set_interactable(e){this.interactable=e}awake(){super.awake(),wa&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent(sh)||this.gameObject.addComponent(Zu)}onEnable(){super.onEnable(),this.context.accessibility.updateElement(this,{role:"button",label:this.gameObject.name+" button",hidden:!1})}onDisable(){super.onDisable(),this.context.accessibility.updateElement(this,{hidden:!0})}onDestroy(){this.context.accessibility.removeElement(this),this._isHovered&&this.context.input.unsetCursor("pointer")}_requestedAnimatorTrigger;*setAnimatorTriggerAtEndOfFrame(e){this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&this.animator?.setTrigger(e)}_isInit=!1;_image;init(){this._isInit||(this._isInit=!0,this._image=x.getComponent(this.gameObject,tc),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){e.setInteractable(this.interactable);const t=this.getFinalColor(e.color,this.colors?.normalColor),i={state:"normal",attributes:{backgroundColor:t,backgroundOpacity:t.alpha}};e.setupState(i);const n=this.getFinalColor(e.color,this.colors?.highlightedColor),s={state:"hovered",attributes:{backgroundColor:n,backgroundOpacity:n.alpha}};e.setupState(s);const r=this.getFinalColor(e.color,this.colors?.pressedColor),a={state:"pressed",attributes:{backgroundColor:r,backgroundOpacity:r.alpha}};e.setupState(a);const l=this.getFinalColor(e.color,this.colors?.selectedColor),c={state:"selected",attributes:{backgroundColor:l,backgroundOpacity:l.alpha}};e.setupState(c);const h=this.getFinalColor(e.color,this.colors?.disabledColor),d={state:"disabled",attributes:{backgroundColor:h,backgroundOpacity:h.alpha}};e.setupState(d)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}Yi([u(ae)],cs.prototype,"onClick",2),Yi([u(lr)],cs.prototype,"colors",2),Yi([u()],cs.prototype,"transition",2),Yi([u(LL)],cs.prototype,"animationTriggers",2),Yi([u(wt)],cs.prototype,"animator",2),Yi([u()],cs.prototype,"interactable",1);var DL=Object.defineProperty,vm=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&DL(e,t,n),n};const cr=w("debuginputfield"),ed=class Q extends E{get text(){return this.textComponent?.text??""}set text(e){this.textComponent&&(this.textComponent.text=e,this.placeholder&&(e.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return Q.active===this}textComponent;placeholder;onValueChanged;onEndEdit;static active=null;static activeTime=-1;static htmlField=null;static htmlFieldFocused=!1;inputEventFn;_iosEventFn;start(){cr&&console.log(this.name,this)}onEnable(){Q.htmlField||(Q.htmlField=document.createElement("input"),Q.htmlField.style.width="0px",Q.htmlField.style.height="0px",Q.htmlField.style.padding="0px",Q.htmlField.style.border="none",Q.htmlField.style.overflow="hidden",Q.htmlField.style.caretColor="transparent",Q.htmlField.style.outline="none",Q.htmlField.classList.add("ar"),Q.htmlField.onfocus=()=>Q.htmlFieldFocused=!0,Q.htmlField.onblur=()=>Q.htmlFieldFocused=!1,document.body.append(Q.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),Q.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&this.textComponent?.text.length&&x.setActive(this.placeholder.gameObject,!1),I.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){Q.htmlField?.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){Q.active===this&&Q.htmlField?(Q.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&x.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(e){e.event.pointerType==="mouse"&&e.button===0&&this.context.input.setCursor("text")}onPointerExit(e){this.context.input.unsetCursor("text")}onPointerClick(e){cr&&console.log("CLICK",e,Q.active),Q.activeTime=this.context.time.time,Q.active!==this&&this.startCoroutine(this.activeLoop(),xe.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();Q.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-Q.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){if(Q.active!==this&&(cr&&console.log("Select",this.name,this,Q.htmlField,this.context.isInXR,this.context.arOverlayElement,this.textComponent?.text,Q.htmlField?.value),Q.active?.onDeselected(),Q.active=this,this.placeholder&&x.setActive(this.placeholder.gameObject,!1),Q.htmlField)){if(Q.htmlField.value=this.textComponent?.text||"",cr&&console.log("set input field value",Q.htmlField.value),this.context.isInXR){const e=this.context.arOverlayElement;e&&e.append(Q.htmlField)}this.selectInputField()}}onDeselected(){Q.active===this&&(Q.active=null,cr&&console.log("Deselect",this.name,this),Q.htmlField&&(Q.htmlField.blur(),document.body.append(Q.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&x.setActive(this.placeholder.gameObject,!0),Q.htmlField&&this.onEndEdit?.invoke(Q.htmlField.value))}update(){Q.active===this&&this.textComponent?.markDirty()}onInput(e){if(Q.active===this){if(cr&&console.log(e.code,e,Q.htmlField?.value,this.textComponent?.text),e.code==="Escape"||e.code==="Enter"){this.onDeselected();return}Q.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&x.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){if(this.textComponent&&Q.htmlField){const e=this.textComponent.text,t=Q.htmlField.value,i=this.textComponent.text!==Q.htmlField.value;this.textComponent.text=Q.htmlField.value,i&&(cr&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){Q.htmlField&&(cr&&console.log("Focus Inputfield",Q.htmlFieldFocused,Q.htmlField),Q.htmlField.setSelectionRange(Q.htmlField.value.length,Q.htmlField.value.length),I.isiOS()?(Q.htmlField.style.display="block",Q.htmlField.focus({preventScroll:!0})):setTimeout(()=>Q.htmlField?.focus(),1))}processInputOniOS(){const e=this.context.physics.raycast();if(!e.length)return;const t=e[0].object,i=Yf(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};vm([u(Qt)],ed.prototype,"textComponent"),vm([u(Qt)],ed.prototype,"placeholder"),vm([u(ae)],ed.prototype,"onValueChanged"),vm([u(ae)],ed.prototype,"onEndEdit");let nb=ed;var jL=Object.defineProperty,SS=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jL(e,t,n),n};class td extends E{id=null;keepAspect=!1;_object=null;onEnable(){if(this._object){this.gameObject.add(this._object);return}if(!this.id||!this.context.mainCamera)return;const e=document.getElementById(this.id);if(!e){console.warn('Could not find element with id "'+this.id+'"');return}e.style.display="block",e.style.visibility="hidden";const t=new WP;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new VP(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=Kd(this.gameObject).clone();Sc(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new Nt;r.setFromObject(t),this.setWorldRotation(s.x,s.y,s.z);const a=r.max.x-r.min.x,l=r.max.y-r.min.y;if(this.keepAspect){const h=a/l;a>l?i.scale.set(1/a,1/l/h,1):i.scale.set(1/a*h,1/l,1)}else i.scale.set(1/a,1/l,1);const c=this.gameObject.scale;i.scale.multiply(c)},1)}onDisable(){this._object?.removeFromParent()}}SS([u()],td.prototype,"id"),SS([u()],td.prototype,"keepAspect");var BL=Object.defineProperty,wm=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&BL(e,t,n),n};const id=class aC extends E{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new N().setFromAxisAngle(new b(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera,A()&&!this.__did_warn&&(this.__did_warn=!0,console.debug(`[LookAt] No target set on ${this.name}, using main camera as target.`))),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),xc(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(aC.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=ct.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new J().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new J().makeRotationZ(-Math.PI/2*a)))}const s=new Ut("lookat "+this.name,qt.sceneStartTrigger(),fe.lookAtCameraAction(n,void 0,this.invertForward?Sn.back:Sn.forward,this.keepUpDirection?Sn.up:Sn.zero));e.addBehavior(s)}}};wm([u(M)],id.prototype,"target"),wm([u()],id.prototype,"invertForward"),wm([u()],id.prototype,"keepUpDirection"),wm([u()],id.prototype,"copyTargetRotation");let ob=id;var FL=Object.defineProperty,sb=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&FL(e,t,n),n};class ic extends E{url;mode=0;clickable=!0;async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),this.mode){case 0:I.isSafari(),globalThis.open(e,"_blank");break;case 1:I.isSafari()&&I.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:I.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(an)||this.gameObject.addComponent(an)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){this.clickable&&!e.used&&this.url?.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(A()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}sb([u()],ic.prototype,"url"),sb([u()],ic.prototype,"mode"),sb([u()],ic.prototype,"clickable"),au(o=>{const e=o.domElement.getAttribute("clickthrough");if(t(e)){const i=o.scene.addComponent(xm);ag(o.domElement,"clickthrough",()=>{const n=o.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class xm extends E{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._previousPointerEvents=this.context.domElement.style.pointerEvents}onDisable(){this.context.input.removeEventListener("pointerdown",this.onPointerEvent),this.context.input.removeEventListener("pointermove",this.onPointerEvent),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchend",this.onTouchEnd),this.context.domElement.style.pointerEvents=this._previousPointerEvents}onPointerEnter(){}onPointerEvent=e=>{e.pointerId>0||(e.intersections?.length<=0?this.context.domElement.style.pointerEvents="none":this.context.domElement.style.pointerEvents="all")};_touchDidHitAnything=!1;onTouchStart=e=>{const t=e.touches[0];if(!t)return;const i=t.clientX/window.innerWidth*2-1,n=-(t.clientY/window.innerHeight)*2+1;this.context.physics.raycast({screenPoint:new K(i,n)}).length>0&&(this._touchDidHitAnything=!0)};onTouchEnd=e=>{const t=this._touchDidHitAnything;this._touchDidHitAnything=!1,setTimeout(()=>{t&&(this.context.domElement.style.pointerEvents="all")},100)}}var UL=Object.defineProperty,Sm=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&UL(e,t,n),n};const zL=w("debugcursor");class xa extends E{static NAME="CursorFollow";damping=0;useFullPage=!0;keepDistance=!0;snapToSurface=!1;_distance=-1;updateDistance(e=!1){!e&&this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}awake(){this._distance=-1}onEnable(){this._distance=-1,window.addEventListener("pointermove",this._onPointerMove)}onDisable(){window.removeEventListener("pointermove",this._onPointerMove)}_ndc_x=0;_ndc_y=0;_onPointerMove=e=>{if(!this.useFullPage)return;const t=e.clientX,i=e.clientY,n=this.context.domX,s=this.context.domY,r=this.context.domWidth,a=this.context.domHeight;this._ndc_x=(t-n)/r*2-1,this._ndc_y=-(i-s)/a*2+1};lateUpdate(){this.updateDistance();const e=this.useFullPage?this._ndc_x:this.context.input.mousePositionRC.x,t=this.useFullPage?this._ndc_y:this.context.input.mousePositionRC.y,i=this.context.mainCamera,n=i.worldPosition,s=F(e,t,1).unproject(i);s.sub(n).normalize();const r=F(s).multiplyScalar(this._distance).add(n);let a=r;if(this.damping>0){const l=this.gameObject.worldPosition;l.lerp(r,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=l,a=l}else this.gameObject.worldPosition=r;if(this.snapToSurface){rb.origin=a,rb.direction=s.multiplyScalar(-1);const l=this.context.physics.raycastFromRay(rb);if(l?.length){const c=l[0];this.damping>0?this.gameObject.worldPosition=a.lerp(c.point,this.context.time.deltaTime/this.damping):this.gameObject.worldPosition=c.point,zL&&B.DrawLine(c.point,c.normal.add(c.point),65280)}}}}Sm([u()],xa.prototype,"damping"),Sm([u()],xa.prototype,"useFullPage"),Sm([u()],xa.prototype,"keepDistance"),Sm([u()],xa.prototype,"snapToSurface");const rb=new Eo;var NL=Object.defineProperty,WL=Object.getOwnPropertyDescriptor,nc=(o,e,t,i)=>{for(var n=i>1?void 0:i?WL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&NL(e,t,n),n};let So=class extends E{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=mi.emptyClip()),(!this.hovered||!(this.hovered instanceof Ai))&&(this.hovered=mi.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Vt),this.animation.playAutomatically=!1,this.playIdle()}onEnable(){this.animation&&(this.animation.enabled=!0),this.playIdle()}onDisable(){this.animation&&(this.animation.enabled=!1),this.playIdle()}onPointerEnter(){this.playHover()}onPointerExit(){this.playIdle()}playIdle(){this.idle&&this.animation?.play(this.idle,{exclusive:!0,fadeDuration:.1,loop:!0})}playHover(){this.hovered&&this.animation?.play(this.hovered,{exclusive:!0,fadeDuration:.1,loop:!1,clampWhenFinished:!0})}};nc([u()],So.prototype,"type",2),nc([u()],So.prototype,"duration",2),nc([u()],So.prototype,"scaleFactor",2),nc([u(Ai)],So.prototype,"hovered",2),nc([u(Ai)],So.prototype,"idle",2),So=nc([Rg],So);var VL=Object.defineProperty,oc=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&VL(e,t,n),n};const nd=w("debugscroll");class hs extends E{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new ae;get currentValue(){return this._current_value}_current_value=0;_target_value=0;_appliedValue=-1;_needsUpdate=!1;_firstUpdate=!1;awake(){this._firstUpdate=!0}onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this._appliedValue=-1,this._needsUpdate=!0}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){if(this.updateCurrentScrollValue(),this._target_value>=0&&(this.damping>0&&!this._firstUpdate?(this._current_value=D.lerp(this._current_value,this._target_value,this.context.time.deltaTime/this.damping),Math.abs(this._current_value-this._target_value)<.001&&(this._current_value=this._target_value)):this._current_value=this._target_value),this._needsUpdate||this._current_value!==this._appliedValue){this._appliedValue=this._current_value,this._needsUpdate=!1;let e=!1;if(this.changed.listenerCount>0){const t={type:"change",value:this._current_value,component:this,preventDefault:()=>{t.defaultPrevented=!0},defaultPrevented:!1};this.changed.invoke(t),e=t.defaultPrevented}if(!e){const t=this.invert?1-this._current_value:this._current_value;Array.isArray(this.target)?this.target.forEach(i=>i&&this.applyScroll(i,t)):this.target&&this.applyScroll(this.target,t),nd&&this.context.time.frame%30===0&&console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} \u2014 ${(this._target_value*100).toFixed(0)}%, targets [${Array.isArray(this.target)?this.target.length:1}]`)}this._firstUpdate=!1}}_lastSelectorValue=null;_lastSelectorElement=null;updateCurrentScrollValue=()=>{switch(this.mode){case"window":if(this.htmlSelector?.length){if(this.htmlSelector!==this._lastSelectorValue&&(this._lastSelectorElement=document.querySelector(this.htmlSelector),this._lastSelectorValue=this.htmlSelector),this._lastSelectorElement){const e=this._lastSelectorElement.getBoundingClientRect();this._target_value=-e.top/(e.height-window.innerHeight);break}}else if(!(window.document.body.scrollHeight<=window.innerHeight)){const e=window.document.body.scrollHeight-window.innerHeight;this._target_value=window.scrollY/(e||1)}break}(isNaN(this._target_value)||!isFinite(this._target_value))&&(this._target_value=-1)};applyScroll(e,t){if(e)if(e instanceof yl)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof wt)e.setFloat("scroll",t);else if(e instanceof Vt)e.time=t*e.duration;else if(e instanceof Ni){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof fn)e.position01=t;else if(e instanceof Lt)e.intensity=t;else if(e instanceof M){const i=e;i["needle:scrollbounds"]===void 0&&(i["needle:scrollbounds"]=ui(e)||null);const n=i["needle:scrollbounds"];n&&(e.position.y=-n.min.y-t*(n.max.y-n.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}handleTimelineTarget(e,t){const i=e.duration;let n=CS.get(e);if(!n){n=[],CS.set(e,n);let l=0;for(const c of e.foreachMarker("ScrollMarker")){const h=l++;if(c.element===void 0||c.needsUpdate===!0||c.element&&!c.element?.parentNode){c.needsUpdate=!1;try{if(c.element=PS(h),nd&&console.debug(`ScrollMarker #${h} (${c.time.toFixed(2)}) found`,c.element),!c.element){(nd||A())&&console.warn(`No HTML element found for ScrollMarker: ${c.name} (index ${h})`);continue}}catch(d){c.element=null,console.error("ScrollMarker selector is not valid: "+c.name+`
|
|
1429
|
+
`,d)}}c.element&&n.push(c)}n.length<=0&&document.querySelectorAll("[data-timeline-marker]").forEach(c=>{const h=c.getAttribute("data-timeline-marker"),d=parseFloat(h||"NaN");isNaN(d)?(A()||nd)&&console.warn('[ScrollFollow] data-timeline-marker attribute is not a valid number. Supported are numbers only (e.g. <div data-timeline-marker="0.5">)'):n.push({time:d,element:c})});for(const c of n)c.element&&(c.timeline=new ViewTimeline({subject:c.element,axis:"block"}))}Co.length=0;let s=0;const r=1/60;let a=0;for(let l=0;l<n.length;l++){const c=n[l];if(!c.element)continue;const h=n[l+1],d=h?h.time-r:i;a+=1;const p=c.timeline;if(p){const m=$L(p),f=1-Math.abs(m-.5)*2,g=`marker${l}`;if(m>0&&m<=1){const y=c.time+(d-c.time)*m;Co.push({name:g,time:y,weight:f}),s+=f}else l===0&&m<=0?(Co.push({name:g,time:0,weight:1}),s+=1):l===n.length-1&&m>=1&&(Co.push({name:g,time:i,weight:1}),s+=1)}}if(Co.length<=0&&a<=0)e.time=t*i;else if(Co.length>0){let l=Co[0].time;if(Co.length>1)for(const c of Co){const h=c.weight/Math.max(1e-5,s),d=Math.abs(c.time-l);l+=d*h}this.damping<=0||this._firstUpdate?e.time=l:e.time=D.lerp(e.time,l,this.context.time.deltaTime/this.damping),Math.abs(e.time-l)>.001&&(this._needsUpdate=!0),nd&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,Co.map(c=>`[${c.name} ${(c.weight*100).toFixed(0)}%]`).join(", "))}}}oc([u([E,M])],hs.prototype,"target"),oc([u()],hs.prototype,"damping"),oc([u()],hs.prototype,"invert"),oc([u()],hs.prototype,"htmlSelector"),oc([u()],hs.prototype,"mode"),oc([u(ae)],hs.prototype,"changed");const CS=new WeakMap,Co=[],ab=new Array;let lb=!0;function PS(o){return lb?(lb=!1,ab.length=0,document.querySelectorAll("[data-timeline-marker]").forEach((e,t)=>{ab[t]=e}),lb=!1,PS(o)):ab[o]||null}function $L(o){if(!o.source)return 0;const e=o.currentTime,t=o.duration;let i=1;return(t.unit==="seconds"||t.unit==="percent")&&(i=t.value),e.unit==="seconds"?e.value/i:e.value/100}var OS=Object.defineProperty,HL=Object.getOwnPropertyDescriptor,GL=(o,e,t)=>e in o?OS(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,Cm=(o,e,t,i)=>{for(var n=i>1?void 0:i?HL(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&OS(e,t,n),n},cb=(o,e,t)=>GL(o,typeof e!="symbol"?e+"":e,t);const hr=w("debugviewbox"),qL=new se(.5,.5,.5,.5);let lt=class extends E{referenceFieldOfView=-1;get mode(){return this._mode}set mode(o){o!==this._mode&&(this._mode=o,o==="once"&&(this._applyCount=0),(hr||this.debug)&&console.debug("[ViewBox] Set mode:",o))}_mode="continuous";debug=!1;onEnable(){(hr||this.debug||A())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),lt.instances.push(this),this._applyCount=0,this.removeUpdateCallback(),this.context.pre_render_callbacks.push(this.internalUpdate)}onDisable(){(hr||this.debug)&&console.debug("[ViewBox] Disabled");const o=lt.instances.indexOf(this);o!==-1&<.instances.splice(o,1),this._projectedBoxElement?.remove(),this.removeUpdateCallback()}removeUpdateCallback(){const o=this.context.pre_render_callbacks.indexOf(this.internalUpdate);o!==-1&&this.context.pre_render_callbacks.splice(o,1)}_applyCount=0;internalUpdate=()=>{if(this.context.isInXR||this.destroyed||!this.activeAndEnabled)return;if(lt.instances[lt.instances.length-1]!==this){(hr||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,qL);return}(hr||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const o=this.context.mainCamera;if(!o||!(o instanceof de))return;if((this.referenceFieldOfView===void 0||this.referenceFieldOfView===-1)&&(this.referenceFieldOfView=o.fov,console.debug("[ViewBox] No referenceFieldOfView set, using camera fov:",this.referenceFieldOfView)),this.referenceFieldOfView===void 0||this.referenceFieldOfView<=0){(hr||this.debug)&&console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:",this.referenceFieldOfView);return}if(this._applyCount>=1&&this.mode==="once")return;this._applyCount++;const e=this.context.domWidth,t=this.context.domHeight;let i=e,n=t,s=1,r=1;const a=this.context.focusRectSize;a&&(i=a.width,n=a.height,s=e/i,r=t/n),lt._tempProjectionMatrix.copy(o.projectionMatrix),lt._tempProjectionMatrixInverse.copy(o.projectionMatrixInverse);const l=o.view,c=o.zoom,h=o.aspect,d=o.fov;o.view=null,o.zoom=1,o.fov=this.referenceFieldOfView,o.updateProjectionMatrix();const p=this.gameObject.worldPosition,m=this.gameObject.worldScale,f=o.worldPosition,g=f.distanceTo(p),y=Math.max(m.x,m.y,m.z),_=F(f).sub(p);if(g<y){(this.debug||hr)&&console.warn("[ViewBox] Moving camera out of bounds",g,"<",y);const X=F(_);X.y*=1e-8,X.normalize();const R=y-g,$=f.add(X.multiplyScalar(R));o.worldPosition=$.lerp(f,1-this.context.time.deltaTime)}const v=F(p);o.worldToLocal(v),o.lookAt(p),o.updateMatrixWorld();const C=this.referenceFieldOfView*Math.PI/180,O=2*Math.tan(C/2)*g,k=O*o.aspect,j=this.projectBoxIntoCamera(o,1),L=j.maxX-j.minX,V=j.maxY-j.minY,W=this.fit(L*o.aspect,V,k/s,O/r)/(O*.5),G=F(p);G.project(o),this.context.focusRectSettings.offsetX=G.x,this.context.focusRectSettings.offsetY=G.y,this.context.focusRectSettings.zoom=W,this.context.focusRect||this.context.setCameraFocusRect(this.context.domElement),o.view=l,o.zoom=c,o.aspect=h,o.fov=d,o.projectionMatrix.copy(lt._tempProjectionMatrix),o.projectionMatrixInverse.copy(lt._tempProjectionMatrixInverse)};fit(o,e,t,i){const n=t/o,s=i/e;return Math.min(n,s)}projectBoxIntoCamera(o,e){const t=.5*e,i=[F(-t,-t,-t),F(t,-t,-t),F(-t,t,-t),F(t,t,-t),F(-t,-t,t),F(t,-t,t),F(-t,t,t),F(t,t,t)];let n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l=0;l<i.length;l++){const c=i[l];c.applyMatrix4(this.gameObject.matrixWorld),c.project(o),c.x<n&&(n=c.x),c.x>s&&(s=c.x),c.y<r&&(r=c.y),c.y>a&&(a=c.y)}return hr&&(this._projectedBoxElement||(this._projectedBoxElement=document.createElement("div")),this._projectedBoxElement.parentElement!==this.context.domElement&&this.context.domElement.appendChild(this._projectedBoxElement),this._projectedBoxElement.style.position="fixed",this._projectedBoxElement.style.outline="2px dashed rgba(255,0,0,.5)",this._projectedBoxElement.style.left=(n*.5+.5)*this.context.domWidth+"px",this._projectedBoxElement.style.top=(-a*.5+.5)*this.context.domHeight+"px",this._projectedBoxElement.style.width=(s-n)*.5*this.context.domWidth+"px",this._projectedBoxElement.style.height=(a-r)*.5*this.context.domHeight+"px",this._projectedBoxElement.style.pointerEvents="none",this._projectedBoxElement.style.zIndex="1000"),{minX:n,maxX:s,minY:r,maxY:a}}_projectedBoxElement=null};cb(lt,"instances",[]),cb(lt,"_tempProjectionMatrix",new J),cb(lt,"_tempProjectionMatrixInverse",new J),Cm([u()],lt.prototype,"referenceFieldOfView",2),Cm([u()],lt.prototype,"mode",1),Cm([u()],lt.prototype,"debug",2),lt=Cm([Rg],lt);var XL=Object.defineProperty,sc=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&XL(e,t,n),n};class ds extends E{get activeAndEnabled(){return!0}side="none";controller=!0;hands=!1;controlVisibility=!0;useGripSpace=!1;resetTransformAfterXRSession=!0;_startPosition=new b;_startRotation=new N;_startScale=new b;onEnterXR(e){this._startPosition.copy(this.gameObject.position),this._startRotation.copy(this.gameObject.quaternion),this._startScale.copy(this.gameObject.scale)}onUpdateXR(e){if(!this.enabled)return;const t=e.xr.getController(this.side);if(t){if(t.hand&&!this.hands){this.controlVisibility&&(this.gameObject.visible=!1);return}else if(!this.controller){this.controlVisibility&&(this.gameObject.visible=!1);return}this.controlVisibility&&(this.gameObject.visible=!0),this.useGripSpace||t.targetRayMode==="transient-pointer"?(this.gameObject.worldPosition=t.gripWorldPosition,this.gameObject.worldQuaternion=t.gripWorldQuaternion,this.gameObject.worldScale=F(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale)):(this.gameObject.worldPosition=t.rayWorldPosition,this.gameObject.worldQuaternion=t.rayWorldQuaternion,this.gameObject.worldScale=F(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale))}}onLeaveXR(e){this.resetTransformAfterXRSession&&(this.gameObject.position.copy(this._startPosition),this.gameObject.quaternion.copy(this._startRotation),this.gameObject.scale.copy(this._startScale))}}sc([u()],ds.prototype,"side"),sc([u()],ds.prototype,"controller"),sc([u()],ds.prototype,"hands"),sc([u()],ds.prototype,"controlVisibility"),sc([u()],ds.prototype,"useGripSpace"),sc([u()],ds.prototype,"resetTransformAfterXRSession");function kS(o,e){const t=o.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const i=t.session.enabledFeatures;if(i&&!i.some(s=>s==="camera-access"))return console.error(`No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene.
|
|
1430
|
+
|
|
1431
|
+
Example to request camera-access in global scope:
|
|
1432
|
+
NeedleXRSession.onSessionRequestStart(evt => {
|
|
1433
|
+
evt.init.optionalFeatures = evt.init.optionalFeatures || [];
|
|
1434
|
+
evt.init.optionalFeatures.push('camera-access');
|
|
1435
|
+
});
|
|
1436
|
+
`),A()&&Oc("No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene"),!1;const n=t.getViewerPose(o.xr.getReferenceSpace());if(n)for(const s of n.views)if("camera"in s&&s.camera){let r=o.xr.getBinding();if(r||(r=new XRWebGLBinding(t.session,o.getContext())),r){let a=null;if("getCameraImage"in r){QL(o,e);const l=o.properties.get(e);if(l)return a=r.getCameraImage(s.camera),l.__webglTexture=a,!0;console.warn("No texture properties found for target texture")}}else console.error(s.camera,o.xr)}else console.error("NO CAMERA IN VIEW");else console.error(o.xr.getReferenceSpace(),t);return!1}const MS=new WeakMap;function QL(o,e){const t=MS.get(e)||new WeakSet;if(t.has(o))return;t.add(o),MS.set(e,t),console.debug("Initialize texture for camera feed");const i=new Ce,n=new Pn,s=new Ti;s.add(new H(n,i));const r=new de;i.map=e,o.render(s,r)}function YL(o,e,t,i="image/webp",n){return hb({context:o,width:e,height:t,mimeType:i,camera:n})}function hb(o){o||(o={});const{transparent:e=!1}=o;let{mimeType:t,context:i,width:n,height:s,camera:r}=o;if(!i&&(i=pe.Current,!i))return console.error("Can not save screenshot: No needle-engine context found or provided."),null;if(!r&&(r=i.mainCamera,!r))return console.error("No camera found"),null;const a=i.renderer,l=a.xr.enabled&&a.xr.isPresenting;if(l&&i.currentFrameEvent!=xe.EarlyUpdate)return console.warn("Screenshot: defer to access XR frame"),new Promise(j=>{Uo(L=>{const V=hb(o);j(V)},xe.EarlyUpdate,{once:!0})});const c=a.domElement,h=c.width,d=c.height;n||(n=h),s||(s=d);const p=n,m=s;let f=window.devicePixelRatio||1,g=1;i.devicePixelRatio==="auto"||i.devicePixelRatio==="manual"?g=1:g=i.devicePixelRatio/window.devicePixelRatio,f*=g,n/=f,s/=f,n=Math.floor(n),s=Math.floor(s),a.xr.isPresenting&&a.xr.getFrame();const y=a.xr.enabled;a.xr.enabled=!1,a.xr.isPresenting=!1,c.style.width=`${n}px`,c.style.height=`${s}px`;const _=a.getRenderTarget(),v=a.getClearColor(new oe),C=a.getClearAlpha(),O=i.scene.background,k="aspect"in r?r.aspect:null;try{const j=o.render_events!==!1,L=new Array;j&&(ul(i.scene,oi,L),L.forEach(R=>{if(R?.onBeforeRender(),R.isInstancingActive&&R.instances)for(let $=0;$<R.instances?.length;$++){const q=R.instances[$];Yo(q.object,!0)}})),e&&(i.scene.background=null,a.setClearColor(0,0)),o.background&&(i.scene.background=null,a.setClearColor(o.background),o.background instanceof se&&a.setClearAlpha(o.background.a)),e&&a.setClearAlpha(0),a.setSize(n,s,!1),"cam"in r&&(r=r.threeCamera),r instanceof de&&(r.aspect=n/s,r.updateProjectionMatrix());const V="type"in o&&o.type==="texture";let W=null;V&&(W=new Qn(n,s,{wrapS:Hb,wrapT:Hb,format:1023}),a.setRenderTarget(W));let G=c;if(l?(W&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),G=sd.compositeWithCameraImage({width:p,height:m,scene:i.scene,camera:r,renderer:a})):i.renderNow(r||null),r instanceof de&&k!=null&&(r.aspect=k,r.updateProjectionMatrix()),j&&L.forEach(R=>R.onAfterRender()),!t&&"download_filename"in o&&o.download_filename)switch(o.download_filename.split(".").pop()?.toLowerCase()){case"png":t="image/png";break;case"jpg":case"jpeg":t="image/jpeg";break;case"webp":t="image/webp";break}if(e&&o.trim===!0){const R=ZL(G);R&&(G=R)}if("type"in o){if(o.type==="texture")return W?(o.target&&(o.target.image=W?.texture.image,o.target.needsUpdate=!0),W.texture.offset.set(0,-1),W.texture.needsUpdate=!0,W.texture):(console.error("No target texture found"),null);if(o.type==="blob")return new Promise((R,$)=>{G.toBlob(q=>{R(q)},t)});if(o.type==="share")return new Promise((R,$)=>{G.toBlob(q=>{if(q&&"share"in navigator){let he="file_type"in o&&o.file_type||t;t||(he="image/png");const re=he?.split("/")[1]||"png",ge=new File([q],"filename"in o?o.filename||`screenshot.${re}`:`screenshot.${re}`,{type:he});return navigator.share({title:"title"in o?o.title:void 0,text:"text"in o?o.text:void 0,url:"url"in o?o.url:void 0,files:[ge]}).catch(te=>{console.warn("User cancelled share",te.message)}).finally(()=>{R({blob:q,shared:!0})})}return{blob:q,shared:!1}},t)})}const X=G.toDataURL(t);if("download_filename"in o&&o.download_filename){let R=o.download_filename;if(I.isMobileDevice()&&typeof window<"u"){const $=R+"_screenshots",q=R.split("."),he=q.pop()?.toLowerCase();let re=0;localStorage.getItem($)&&(re=parseInt(sessionStorage.getItem($)||"0")),re>0&&(R=`${q.join()}-${re}.${he}`),re+=1,sessionStorage.setItem($,re.toString())}ES(X,R)}return X}finally{a.setRenderTarget(_),i.scene.background=O,a.setSize(h,d,!1),a.setClearColor(v,C),k!=null&&r instanceof de&&(r.aspect=k,r.updateProjectionMatrix()),a.xr.enabled=y,a.xr.isPresenting=l,l||i.updateSize(!0)}return null}function ZL(o){if(!("document"in globalThis))return null;const e=document.createElement("canvas");e.width=o.width,e.height=o.height;const t=e.getContext("2d");if(!t)return null;t.drawImage(o,0,0);const i=e.width,n=e.height,s=t.getImageData(0,0,i,n).data;let r=n,a=i,l=0,c=0;for(let f=0;f<n;f++)for(let g=0;g<i;g++){const y=(f*i+g)*4;s[y+3]!==0&&(g<a&&(a=g),g>c&&(c=g),f<r&&(r=f),f>l&&(l=f))}const h=c-a+1,d=l-r+1,p=document.createElement("canvas"),m=p.getContext("2d");return m?(p.width=h,p.height=d,m.drawImage(e,a,r,h,d,0,0,h,d),p):null}let od=null;function ES(o,e){if(o){if(!o.startsWith("data:image")){console.error("Can not save image: Data url is not an image",o);return}od||(od=document.createElement("a")),od.href=o,od.download=e,od.click()}}var sd;(o=>{let e=null,t=null,i=null,n=null,s=null;function r(c){const{renderer:h,width:d,height:p}=c,m=h.xr.enabled,f=h.getRenderTarget(),g=h.autoClear,y=d,_=p,v=d/p;(!i||i.width!==y||i.height!==_)&&(i??=new Qn(y,_,{colorSpace:Io}),i.width=y,i.height=_,i.samples=4,i.texture.repeat.y=-1,i.texture.offset.y=1),(!s||s.width!==y||s.height!==_)&&(s=document.createElement("canvas"),s.width=y,s.height=_,s.style.position="fixed",s.style.top="0px",s.style.right="0px",s.style.width="300px",s.style.height=`${300/v}px`,s.style.zIndex="1000",s.style.pointerEvents="none",s.style.opacity="1.0",s.style.willChange="contents"),e||(e=l({defines:{DECODE_VIDEO_TEXTURE:!0}})),t||(t=l()),n||(n=new Se),h.xr.updateCamera(c.camera),h.xr.enabled=!1,h.autoClear=!1,h.clear(),h.setSize(y,_),h.setRenderTarget(i),kS(c.renderer,n)||console.error("Could not update texture from XR frame");const C=x.findObjectOfType(rd);return C?C.setTexture(n):(e.setTexture(n),h.render(e,c.camera)),h.clearDepth(),h.setSize(y,_),h.render(c.scene,c.camera),h.setRenderTarget(null),t.setTexture(i.texture),h.render(t,c.camera),s.getContext("2d",{alpha:!1}).drawImage(h.domElement,0,0,s.width,s.height),h.setRenderTarget(f),h.xr.enabled=m,h.autoClear=g,s}o.compositeWithCameraImage=r;const a=`
|
|
1437
|
+
uniform sampler2D t2D;
|
|
1438
|
+
varying vec2 vUv;
|
|
1439
|
+
|
|
1440
|
+
void main() {
|
|
1441
|
+
|
|
1442
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1443
|
+
|
|
1444
|
+
#ifdef DECODE_VIDEO_TEXTURE
|
|
1445
|
+
|
|
1446
|
+
// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
|
|
1447
|
+
texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
|
|
1448
|
+
|
|
1449
|
+
#endif
|
|
1450
|
+
|
|
1451
|
+
gl_FragColor = texColor;
|
|
1452
|
+
#include <tonemapping_fragment>
|
|
1453
|
+
#include <colorspace_fragment>
|
|
1454
|
+
}
|
|
1455
|
+
`;function l(c){const h=c?.material||new Xn({name:"BackgroundMaterial",uniforms:Gb.clone($d.background.uniforms),vertexShader:$d.background.vertexShader,fragmentShader:a,defines:c?.defines,side:Cs,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(h,"map",{get:function(){return this.threeTexture}});const d=new H(new Pn(2,2),h);return Yd(d,!1),d.geometry.deleteAttribute("normal"),d.renderOrder=-1e6,d.setTexture=function(p){h.uniforms.t2D.value=p},d}o.makeFullscreenPlane=l})(sd||(sd={}));var KL=Object.defineProperty,JL=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&KL(e,t,n),n};const RS=w("debugarcamera");class rd extends E{onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),RS&&console.warn("Requesting camera-access"))}onEnterXR(e){e.xr.mode==="immersive-ar"&&(this.backgroundPlane&&(this.context.scene.add(this.backgroundPlane),this.backgroundPlane.visible=!1),this.backgroundPlane&&this.context.scene.add(this.backgroundPlane),this.context.pre_render_callbacks.push(this.preRender))}onLeaveXR(e){this.backgroundPlane&&this.backgroundPlane.removeFromParent();const t=this.context.pre_render_callbacks.indexOf(this.preRender);t>=0&&this.context.pre_render_callbacks.splice(t,1)}backgroundTint=new se(1,1,1,1);get background(){return this.backgroundPlane}backgroundPlane;threeTexture;forceTextureInitialization=function(){const e=new Ce,t=new Pn,i=new Ti;i.add(new H(t,e));const n=new de;return function(s,r){e.map=r,s.render(i,n),RS&&console.warn("Force texture initialization")}}();preRender=()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new Se,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=sd.makeFullscreenPlane({material:new Xn({name:"BackgroundMaterial",uniforms:{...Gb.clone($d.background.uniforms),tint:{value:new ye(e.r,e.g,e.b,e.a)}},vertexShader:$d.background.vertexShader,fragmentShader:eD,side:Ii,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof Xn&&this.backgroundPlane.material.uniforms.tint.value.set(this.backgroundTint.r,this.backgroundTint.g,this.backgroundTint.b,this.backgroundTint.a),this.updateFromFrame()}};onBeforeRender(e){this.updateFromFrame()}updateFromFrame(){this.threeTexture&&this.context.xr?.mode==="immersive-ar"&&(kS(this.context.renderer,this.threeTexture),this.setTexture(this.threeTexture))}setTexture(e){this.backgroundPlane&&(this.threeTexture=e,this.backgroundPlane.setTexture(this.threeTexture),this.backgroundPlane.visible=!0)}}JL([u(se)],rd.prototype,"backgroundTint");const eD=`
|
|
1456
|
+
uniform sampler2D t2D;
|
|
1457
|
+
uniform vec4 tint;
|
|
1458
|
+
|
|
1459
|
+
varying vec2 vUv;
|
|
1460
|
+
|
|
1461
|
+
void main() {
|
|
1462
|
+
|
|
1463
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1464
|
+
texColor.w = 1.0;
|
|
1465
|
+
|
|
1466
|
+
// inline sRGB decode
|
|
1467
|
+
texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
|
|
1468
|
+
|
|
1469
|
+
gl_FragColor = texColor * tint;
|
|
1470
|
+
|
|
1471
|
+
#include <tonemapping_fragment>
|
|
1472
|
+
#include <colorspace_fragment>
|
|
1473
|
+
}
|
|
1474
|
+
`;var tD=Object.defineProperty,dr=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tD(e,t,n),n};const ad=w("debugimagetracking");class mc{get url(){return this._trackedImage.image??""}get widthInMeters(){return this._trackedImage.widthInMeters??void 0}get bitmap(){return this._bitmap}get model(){return this._trackedImage}measuredSize;state;getPosition(e){return this.ensureTransformData(),e.copy(this._position),e}getQuaternion(e){return this.ensureTransformData(),e.copy(this._rotation),e}applyToObject(e,t=void 0){this.ensureTransformData();const i=e.position.distanceToSquared(this._position)/.05+e.quaternion.angleTo(this._rotation)/.05;t&&(t*=Math.max(1,i)),t===void 0||t>=1?(e.position.copy(this._position),e.quaternion.copy(this._rotation)):(t=Math.max(0,Math.min(1,t)),e.position.lerp(this._position,t),e.quaternion.slerp(this._rotation,t))}static _positionBuffer=new ji(()=>new b,20);static _rotationBuffer=new ji(()=>new N,20);_position;_rotation;ensureTransformData(){if(!this._position){this._position=mc._positionBuffer.get(),this._rotation=mc._rotationBuffer.get();const e=this._pose.transform,t=Z.active.convertSpace(e);this._position.copy(t?.position),this._rotation.copy(t?.quaternion)}}_trackingComponent;_trackedImage;_bitmap;_pose;constructor(e,t,i,n,s,r){this._trackingComponent=e,this._trackedImage=t,this._bitmap=i,this.measuredSize=n,this.state=s,this._pose=r}}class us{constructor(e){this.image=e.url,this.widthInMeters=e.widthInMeters,e.object instanceof M?this.object=new ne({asset:e.object}):this.object=e.object,e.createObjectInstance!==void 0&&(this.createObjectInstance=e.createObjectInstance),e.imageDoesNotMove!==void 0&&(this.imageDoesNotMove=e.imageDoesNotMove),e.hideWhenTrackingIsLost!==void 0&&(this.hideWhenTrackingIsLost=e.hideWhenTrackingIsLost)}image;widthInMeters=.25;object;createObjectInstance=!1;imageDoesNotMove=!1;hideWhenTrackingIsLost=!0;getNameFromUrl(){if(this.image){const e=this.image.split("/");return e[e.length-1]}return null}}dr([u(URL)],us.prototype,"image"),dr([u()],us.prototype,"widthInMeters"),dr([u(ne)],us.prototype,"object"),dr([u()],us.prototype,"createObjectInstance"),dr([u()],us.prototype,"imageDoesNotMove"),dr([u()],us.prototype,"hideWhenTrackingIsLost");class iD{constructor(e,t){this.exporter=e,this.component=t,ad&&console.log(this),this.exporter.anchoringType="image"}isImageTrackingExtension=!0;get extensionName(){return"image-tracking"}shouldExport=!0;filename=null;imageModel=null;onBeforeBuildDocument(e){const t=this.exporter.extensions.filter(i=>{const n=i;return n.isImageTrackingExtension&&n.component.activeAndEnabled&&n.component.trackedImages?.length>0}).indexOf(this);this.shouldExport=t===0,this.shouldExport&&this.component.trackedImages?.length>1&&(ad||A())&&(be("USDZ: Only one tracked image is supported."),console.warn("USDZ: Only one tracked image is supported. Will choose the first one in the trackedImages list"))}onAfterHierarchy(e,t){if(!this.shouldExport)return;const i=I.getiOSVersion(),n=(i?parseInt(i.split(".")[0]):18)>=18?1:100;t.beginBlock('def Preliminary_ReferenceImage "AnchoringReferenceImage"'),t.appendLine("uniform asset image = @image_tracking/"+this.filename+"@"),t.appendLine("uniform double physicalWidth = "+(this.imageModel.widthInMeters*n).toFixed(8)),t.closeBlock()}async onAfterSerialize(e){if(!this.shouldExport)return;const t=this.imageModel,i=cd.get(t.image),n=await(await(await O1(i)).convertToBlob({type:"image/png"})).arrayBuffer();e.files["image_tracking/"+this.filename]=new Uint8Array(n)}onExportObject(e,t,i){if(!this.shouldExport)return;const n=this.component;if(!n||!n.trackedImages?.length||!n.activeAndEnabled)return;const s=n.trackedImages[0];if(s.object?.asset===e){this.imageModel=s,this.filename=s.getNameFromUrl()||"marker.png";const{scale:r,target:a}=this.exporter.getARScaleAndTarget();let l=e;const c=new J;if(e!==a)for(;l&&l.parent&&l.parent!==a;)l=l.parent,c.premultiply(l.matrix);const h=c.clone().invert();t.setMatrix(h.scale(new b(r,r,r)))}}}class ld extends E{setPrimaryImage(e){const t=this.trackedImages.indexOf(e);if(t>=0){const i=this.trackedImages[0];i!==e&&(this.trackedImages[0]=e,this.trackedImages[t]=i)}else console.warn(`[WebXRImageTracking] Can not set primary: image not found in 'trackedImages' array ${e.image}`)}addImage(e,t=!1){this.trackedImages.includes(e)||(this.trackedImages.push(e),TS(e.image)),t&&this.setPrimaryImage(e)}trackedImages=[];smooth=!0;trackedImageIndexMap=new Map;get supported(){return this._supported}_supported=!0;awake(){if(ad&&console.log(this),!!this.trackedImages)for(const e of this.trackedImages)e.image&&TS(e.image)}onEnable(){_o.beforeExport.addEventListener(this.onBeforeUSDZExport)}onDisable(){_o.beforeExport.removeEventListener(this.onBeforeUSDZExport)}onBeforeUSDZExport=e=>{this.activeAndEnabled&&this.trackedImages?.length&&e.exporter.extensions.push(new iD(e.exporter,this))};onBeforeXR(e,t){if(this.trackedImages){t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("image-tracking")||t.optionalFeatures.push("image-tracking"),t.trackedImages||(t.trackedImages=[]);for(const i of this.trackedImages)if(i.image?.length&&i.widthInMeters>0){const n=cd.get(i.image);n&&(this.trackedImageIndexMap.set(t.trackedImages.length,i),t.trackedImages.push({image:n,widthInMeters:i.widthInMeters}))}}}onEnterXR(e){if(this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;i.userData||(i.userData={});const n={visible:i.visible,parent:i.parent,matrix:i.matrix.clone()};i.userData["image-tracking"]=n}}for(const t of this.imageToObjectMap.values())t.frames=0}onLeaveXR(e){if(!this.supported&&I.isAndroidDevice()&&be(this.webXRIncubationsWarning),this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;if(i.userData){const n=i.userData["image-tracking"];n&&(i.visible=n.visible,n.parent?.add(i),i.matrix.copy(n.matrix),i.matrix.decompose(i.position,i.quaternion,i.scale)),delete i.userData["image-tracking"]}}}}imageToObjectMap=new Map;currentImages=[];webXRIncubationsWarning=`Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a target="_blank" href="#" onclick="() => console.log('I')">chrome://flags/#webxr-incubations</a> flag.`;onUpdateXR(e){this.currentImages.length=0;const t=e.xr.frame;if(!t)return;if("getImageTrackingResults"in t){if(e.xr.session.enabledFeatures?.includes("image-tracking")===!1)return;if(t.session&&typeof t.getImageTrackingResults=="function"){const n=t.getImageTrackingResults();if(n.length>0){const s=this.context.renderer.xr.getReferenceSpace();if(s){for(const r of n){const a=r.trackingState,l=r.index,c=this.trackedImageIndexMap.get(l);if(c){const h=t.getPose(r.imageSpace,s),d=new mc(this,c,r.image,r.measuredSize,a,h);this.currentImages.push(d)}else ad&&console.warn("No tracked image for index",l)}if(this.currentImages.length>0)try{this.dispatchEvent(new CustomEvent("image-tracking",{detail:this.currentImages})),this.onImageTrackingUpdate(this.currentImages)}catch(r){console.error(r)}}}}}else{this.didPrintWarning||(this.didPrintWarning=!0,console.log(this.webXRIncubationsWarning)),this._supported=!1,be(this.webXRIncubationsWarning);return}const i=1e3;for(const[n,s]of this.imageToObjectMap){if(!s.object||!n||n.hideWhenTrackingIsLost===!1)continue;let r=!1;for(const a of this.currentImages)if(a.model===n){const l=Date.now()-s.lastTrackingTime;if(ad&&ke(n.image+", State: "+a.state+(n.imageDoesNotMove?" (static)":"")+(l<=i?" (hysteresis)":"")),n.imageDoesNotMove||a.state==="tracked"||l<=i){r=!0;break}}r||x.setActive(s.object,!1)}}onImageTrackingUpdate=e=>{const t=Z.active;if(t)for(const i of e){const n=i.model,s=i.state==="tracked";if(!n.object)continue;let r=this.imageToObjectMap.get(n);if(r===void 0)r={object:null,frames:0,lastTrackingTime:Date.now()},this.imageToObjectMap.set(n,r),n.object.loadAssetAsync().then(a=>{if(n.createObjectInstance&&a&&(a=x.instantiate(a)),a){r.object=a;for(const l of a.getComponentsInChildren(oi))l.setInstancingEnabled(!1);t.rig?(t.rig.gameObject.add(a),i.applyToObject(a),a.activeSelf||x.setActive(a,!0)):console.warn("XRImageTracking: missing XRRig")}});else{if(r.frames++,s&&(r.lastTrackingTime=Date.now()),n.imageDoesNotMove&&r.frames>10||!r.object)continue;t.rig&&(t.rig.gameObject.add(r.object),i.applyToObject(r.object,this.smooth?this.context.time.deltaTimeUnscaled*3:void 0),r.object.activeSelf||x.setActive(r.object,!0))}}}}dr([u(us)],ld.prototype,"trackedImages"),dr([u()],ld.prototype,"smooth");const cd=new Map,Pm=new Map;async function TS(o){if(cd.has(o))return Pm.has(o)?Pm.get(o):Promise.resolve(!0);const e=new Promise(t=>{cd.set(o,null);const i=document.createElement("img");i.src=o,i.addEventListener("load",async()=>{const n=await createImageBitmap(i);cd.set(o,n),t(!0)})});return Pm.set(o,e),e.finally(()=>{Pm.delete(o)}),e}var nD=Object.defineProperty,rc=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&nD(e,t,n),n};const Sa=w("debugplanetracking");class ps extends E{dataTemplate;occluder=!0;initiateRoomCaptureIfNoData=!0;usePlaneData=!0;useMeshData=!0;runInVR=!0;get trackedPlanes(){return this._allPlanes.values()}get trackedMeshes(){return this._allMeshes.values()}onBeforeXR(e,t){e==="immersive-vr"&&!this.runInVR||(t.optionalFeatures=t.optionalFeatures||[],this.usePlaneData&&!t.optionalFeatures.includes("plane-detection")&&t.optionalFeatures.push("plane-detection"),this.useMeshData&&!t.optionalFeatures.includes("mesh-detection")&&t.optionalFeatures.push("mesh-detection"))}onEnterXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onLeaveXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onUpdateXR(e){if(!this.runInVR&&e.xr.isVR)return;const t=e.xr.rig;if(!t){console.warn("No XR rig found, cannot parent tracked planes to it");return}const i=e.xr.frame;if(!this.context.renderer.xr.getReferenceSpace())return;const n=i.detectedPlanes,s=i.detectedMeshes,r=n!==void 0&&n.size>0,a=s!==void 0&&s.size>0;if(this.initiateRoomCaptureIfNoData&&(!r&&!a&&this.firstTimeNoPlanesDetected<-10&&(this.firstTimeNoPlanesDetected=Date.now()),(r||a)&&(this.firstTimeNoPlanesDetected=-1),this.firstTimeNoPlanesDetected>0&&Date.now()-this.firstTimeNoPlanesDetected>2500&&"initiateRoomCapture"in i.session&&(i.session.initiateRoomCapture(),this.firstTimeNoPlanesDetected=-1)),n!==void 0&&this.processFrameData(e.xr,t.gameObject,i,n,this._allPlanes),s!==void 0&&this.processFrameData(e.xr,t.gameObject,i,s,this._allMeshes),Sa){const l=this.context.mainCameraComponent.gameObject.worldPosition;for(const c of this._allPlanes.values())!c.mesh||!c.mesh.visible||(this.bounds.makeEmpty(),c.mesh.traverse(h=>{h instanceof H&&this.bounds.expandByObject(h)}),this.bounds.getCenter(this.center),this.labelOffset.copy(l).sub(this.center).normalize().multiplyScalar(.1),B.DrawLabel(this.center.add(this.labelOffset),(c.xrData.semanticLabel||"plane").toUpperCase()+`
|
|
1475
|
+
`+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new Nt;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),Sa&&console.log("Plane no longer tracked, id="+i.id),i.mesh&&(i.mesh.removeFromParent(),i.mesh.traverse(s=>{const r=s.userData.normalsHelper;r?(r.dispose(),r.removeFromParent()):Sa&&console.warn("No normals helper found for mesh",i.mesh)}),Ui(i.mesh,!0,!0));const n=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:i}});this.dispatchEvent(n)}_dataId=1;_allPlanes=new Map;_allMeshes=new Map;firstTimeNoPlanesDetected=-100;makeOccluder=(e,t,i=!1)=>{if(t){if(t instanceof Array){for(const n of t)this.makeOccluder(e,n,i);return}!i&&!t.name.toLowerCase().includes("occlu")||(t.colorWrite=!1,t.depthTest=!0,t.depthWrite=!0,t.transparent=!1,t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=.1,e.renderOrder=-1e3)}};processFrameData(e,t,i,n,s){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const a of s.keys())n.has(a)||this.removeData(a,s);for(const a of n){const l="planeSpace"in a?a.planeSpace:"meshSpace"in a?a.meshSpace:void 0;if(!l)continue;const c=i.getPose(l,r);let h;if(s.has(a)){const d=s.get(a);if(h=d.mesh,d.timestamp<a.lastChangedTime){if(d.timestamp=a.lastChangedTime,d.mesh){const m=this.createGeometry(a);if(d.mesh instanceof H)d.mesh.geometry.dispose(),d.mesh.geometry=m,this.makeOccluder(d.mesh,d.mesh.material);else if(d.mesh instanceof Mo)for(const f of d.mesh.children)f instanceof H&&(f.geometry.dispose(),f.geometry=m,this.makeOccluder(f,f.material));if(d.collider){const f=d.mesh;d.collider.sharedMesh=f,d.collider.convex=this.checkIfContextShouldBeConvex(f,d.xrData),d.collider.onDisable(),d.collider.onEnable()}Sa&&(console.log("Plane updated, id="+d.id,d),d.mesh.traverse(f=>{if(!(f instanceof H))return;const g=f.userData.normalsHelper;g&&g.update()}))}const p=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:d}});this.dispatchEvent(p)}}else{if(!this.dataTemplate){const d=new H;Sa?d.material=new vP:this.occluder?(d.material=new Ce,this.makeOccluder(d,d.material,!0)):d.material=new Ce({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new ne("","",d)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const d=x.instantiate(this.dataTemplate.asset);if(d.name="xr-tracked-plane",h=d,Og(d,!1),d instanceof H)Me(d.geometry),d.geometry=this.createGeometry(a),this.makeOccluder(d,d.material,this.occluder&&!this.dataTemplate);else if(d instanceof Mo)for(const f of d.children)f instanceof H&&(Me(f.geometry),f.geometry=this.createGeometry(a),this.makeOccluder(f,f.material,this.occluder&&!this.dataTemplate));const p=d.getComponent(Us);if(p){const f=d;p.sharedMesh=f,p.convex=this.checkIfContextShouldBeConvex(f,a),p.onDisable(),p.onEnable()}d.matrixAutoUpdate=!1,d.matrixWorldNeedsUpdate=!0,t.add(d);const m={id:this._dataId++,xrData:a,timestamp:a.lastChangedTime,mesh:d,collider:p};s.set(a,m),Sa&&console.log("New plane detected, id="+m.id,m,{hasCollider:!!p,isGroup:d instanceof Mo});try{const f=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:m}});this.dispatchEvent(f)}catch(f){console.error(f)}}}h&&(c?(h.visible=!0,h.matrix.fromArray(c.transform.matrix),h.matrix.premultiply(this._flipForwardMatrix)):h.visible=!1,Sa&&h.traverse(d=>{if(d instanceof H)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new $P(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new J().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new Nt;i.expandByObject(e);const n=new b;i.getSize(n);let s=!0;return n.x>2&&n.y>2&&n.z>1.5&&(s=!1),s&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(s=!0),s}return!0}createGeometry(e){return"polygon"in e?this.createPlaneGeometry(e.polygon):"vertices"in e&&"indices"in e?this.createMeshGeometry(e.vertices,e.indices):new Ji}_verticesCache=new Map;createMeshGeometry(e,t){const i=e.toString()+"_"+t.toString();if(this._verticesCache.has(i))return this._verticesCache.get(i);const n=new Ji;n.setIndex(new tt(t,1)),n.setAttribute("position",new tt(e,3));const s=Array();for(let r=0;r<e.length;r+=3)s.push(e[r],e[r+2]);return n.setAttribute("uv",new tt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new Ji,i=[],n=[];e.forEach(p=>{i.push(p.x,p.y,p.z),n.push(p.x,p.z)});const s=new b(i[0],i[1],i[2]),r=new b(i[3],i[4],i[5]),a=new b(i[6],i[7],i[8]),l=new b,c=new b;l.subVectors(r,s),c.subVectors(a,s),l.cross(c),l.normalize();const h=[];for(let p=0;p<i.length/3;p++)h.push(l.x,l.y,l.z);const d=[];for(let p=2;p<e.length;++p)d.push(0,p-1,p);return t.setAttribute("position",new tt(new Float32Array(i),3)),t.setAttribute("uv",new tt(new Float32Array(n),2)),t.setAttribute("normal",new tt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}rc([u(ne)],ps.prototype,"dataTemplate"),rc([u()],ps.prototype,"occluder"),rc([u()],ps.prototype,"initiateRoomCaptureIfNoData"),rc([u()],ps.prototype,"usePlaneData"),rc([u()],ps.prototype,"useMeshData"),rc([u()],ps.prototype,"runInVR");var oD=Object.defineProperty,sD=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&oD(e,t,n),n};const AS=w("debugwebxr");class Om extends E{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Z.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(AS){const e=new M;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(ha);t&&(t.isGizmo=!1);const i=new Li(.5);this.gameObject.add(i)}}isXRRig(){return!0}supportsXR(e){return!0}_startScale;onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),AS&&console.log("WebXR: add Rig",this.name,this.priority)}onLeaveXR(e){e.xr.removeRig(this),this._startScale&&this.gameObject&&this.gameObject.scale.copy(this._startScale)}}sD([u()],Om.prototype,"priority");class rD extends E{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}function aD(){P.add("AlignmentConstraint",gh),P.add("Animation",Vt),P.add("Animator",wt),P.add("AudioListener",Go),P.add("AudioSource",Ni),P.add("Avatar_Brain_LookAt",fh),P.add("Avatar_MouthShapes",yh),P.add("Avatar_MustacheShake",ly),P.add("AvatarBlink_Simple",Zr),P.add("AvatarEyeLook_Rotation",hy),P.add("AxesHelper",vl),P.add("BasicIKConstraint",uy),P.add("BoxHelperComponent",zt),P.add("Camera",wi),P.add("CharacterController",Kr),P.add("CharacterControllerInput",Qo),P.add("SphereCollider",wl),P.add("BoxCollider",dp),P.add("MeshCollider",Us),P.add("CapsuleCollider",qo),P.add("ContactShadows",_h),P.add("LogStats",gy),P.add("DeleteBox",yr),P.add("Deletable",yy),P.add("DeviceFlag",up),P.add("DragControls",ta),P.add("DropListener",Jo),P.add("Duplicatable",Iy),P.add("EventListEvent",Hu),P.add("EventTrigger",Pp),P.add("GltfExportBox",By),P.add("GltfExport",Uy),P.add("VariantAction",Xy),P.add("ChangeTransformOnClick",ra),P.add("ChangeMaterialOnClick",Yy),P.add("SetActiveOnClick",Zy),P.add("HideOnStart",wn),P.add("EmphasizeOnClick",Ll),P.add("PlayAudioOnClick",$s),P.add("PlayAnimationOnClick",Ph),P.add("PreliminaryAction",Dl),P.add("PreliminaryTrigger",Oh),P.add("VisibilityAction",kh),P.add("TapGestureTrigger",Jy),P.add("USDZExporter",_o),P.add("Fog",Vl),P.add("BoxGizmo",ha),P.add("GridHelper",$l),P.add("GroundProjectedEnv",so),P.add("UsageMarker",vh),P.add("Interactable",fy),P.add("FixedJoint",k0),P.add("HingeJoint",Bh),P.add("Light",Lt),P.add("LODGroup",qp),P.add("LookAtConstraint",Gr),P.add("NeedleMenu",yo),P.add("NestedGltf",ql),P.add("Networking",T0),P.add("OffsetConstraint",da),P.add("CameraTargetReachedEvent",ah),P.add("OrbitControls",me),P.add("ParticleSystemRenderer",mn),P.add("ParticleSystem",Nh),P.add("Attractor",Yl),P.add("PlayerColor",pc),P.add("Antialiasing",Wh),P.add("BloomEffect",am),P.add("ChromaticAberration",Vh),P.add("ColorAdjustments",or),P.add("DepthOfField",Wn),P.add("EffectWrapper",Hh),P.add("PixelationEffect",Gh),P.add("ScreenSpaceAmbientOcclusion",as),P.add("ScreenSpaceAmbientOcclusionN8",Vn),P.add("SharpeningEffect",Xh),P.add("TiltShiftEffect",vo),P.add("ToneMappingEffect",nr),P.add("Vignette",ba),P.add("Volume",Kl),P.add("ReflectionProbe",Zo),P.add("Renderer",oi),P.add("MeshRenderer",xh),P.add("SkinnedMeshRenderer",Ty),P.add("Rigidbody",Je),P.add("SceneSwitcher",et),P.add("ScreenCapture",sr),P.add("SeeThrough",ls),P.add("ShadowCatcher",Yh),P.add("RemoteSkybox",lp),P.add("SmoothFollow",pm),P.add("SpatialTriggerReceiver",wo),P.add("SpatialTrigger",mm),P.add("SpectatorCamera",gm),P.add("SplineContainer",_a),P.add("SplineWalker",fn),P.add("SpriteRenderer",Si),P.add("SyncedCamera",Z0),P.add("SyncedRoom",$n),P.add("SyncedTransform",Ln),P.add("TestRunner",eb),P.add("TestSimulateUserData",tb),P.add("PlayableDirector",yl),P.add("SignalReceiver",ch),P.add("AnimationTrackHandler",hh),P.add("AudioTrackHandler",_s),P.add("MarkerTrackHandler",ip),P.add("SignalTrackHandler",dh),P.add("ControlTrackHandler",np),P.add("TransformGizmo",va),P.add("BaseUIComponent",bn),P.add("UIRootComponent",Th),P.add("Button",cs),P.add("Canvas",Wl),P.add("CanvasGroup",Zs),P.add("EventSystem",ci),P.add("Graphic",Lh),P.add("MaskableGraphic",Dh),P.add("Image",tc),P.add("RawImage",_m),P.add("InputField",nb),P.add("VerticalLayoutGroup",f0),P.add("HorizontalLayoutGroup",y0),P.add("GridLayoutGroup",b0),P.add("Outline",zl),P.add("ObjectRaycaster",an),P.add("GraphicRaycaster",Zu),P.add("SpatialGrabRaycaster",Oa),P.add("RectTransform",zn),P.add("SpatialHtml",td),P.add("Text",Qt),P.add("EnvironmentScene",op),P.add("LookAt",ob),P.add("OpenURL",ic),P.add("VideoPlayer",gt),P.add("Voip",Fn),P.add("ClickThrough",xm),P.add("CursorFollow",xa),P.add("HoverAnimation",So),P.add("ScrollFollow",hs),P.add("ViewBox",lt),P.add("Avatar",Hs),P.add("XRControllerFollow",ds),P.add("XRControllerModel",is),P.add("XRControllerMovement",$i),P.add("TeleportTarget",Np),P.add("WebARCameraBackground",rd),P.add("WebARSessionRoot",xn),P.add("WebXR",Wp),P.add("AvatarMarker",Le),P.add("WebXRImageTracking",ld),P.add("WebXRPlaneTracking",ps),P.add("XRRig",Om),P.add("XRFlag",cn),P.add("PlayerSync",i0),P.add("PlayerState",Ci),P.add("PresentationMode",rD)}function lD(){Gn.registerWaitForInteraction(()=>{const o=wP.getContext();o.addEventListener("statechange",()=>{setTimeout(()=>{const e=o.state;(e==="suspended"||e==="interrupted")&&o.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}const hd=_t,cD=w("debugtypestore");cD&&console.log(P);function hD(o,e){const t=Lv(o,e);return t!==void 0?t:null}const dD=new cM,db=Symbol("deserialize-queue");async function uD(o,e,t,i=null,n){if(!t){console.debug("Can not create component instances: gltf is null");return}const s=[];let r=i;typeof r=="number"&&(r=new kt(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new Yg(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=dD;let c=o[db];if(c||(c=o[db]=[]),t.scenes)for(const h of t.scenes)await mb(l,h,c,s,0);if(t.children)for(const h of t.children)await mb(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[db];if(h){for(const d of h)pD(d,l);h.length=0}if(r){const d={},p=[];pb(t,r,d,p);for(const m of t.scenes)pb(m,r,d,p);for(const m of p)m.resolveGuids(d)}})}const ub=Symbol("original-component-name"),ac=new Map;function pb(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&(ac.has(s)||(hd&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),ac.set(s,new kt(s))));const r=s&&ac.get(s)||e;if(o.guid=r.generateUUID(),n&&n!=="invalid"&&(t[n]=o.guid),o&&o.userData&&o.userData.components)for(const a of o.userData.components){if(a===null)continue;const l=a.guid;l?ac.has(l)||(hd&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[ub]),ac.set(l,new kt(l))):hd&&console.warn("Can not create IdProvider: component "+a[ub]+" has no guid",a.guid);const c=ac.get(l)||e,h=a.guid;a.guid=c.generateUUID(),h&&h!=="invalid"&&(t[h]=a.guid),a.resolveGuids&&i.push(a)}if(o.children)for(const a of o.children)pb(a,e,t,i)}const dd=[];async function mb(o,e,t,i,n){if(!e)return;const s=e.userData;if(s){const r=s.builtin_components;if(r&&r.length>0)for(const a of r)try{if(a===null)continue;let l=P.get(a.name);if(l||(l=await P.getAsync(a.name)),l){const c=new l;c.sourceId=o.gltfId,Ya(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[Ec]=a.guid),c[ub]=a.name,Wr(e,c,!1),t.push({instance:c,compData:a,obj:e}),c.isCamera&&o.context&&o.context.mainCamera===null&&c.tag==="MainCamera"&&o.context.setCurrentCamera(c),o.context?.physics?.engine?.isInitialized===!1&&(c.isCollider||c.isRigidbody)&&o.context?.physics.engine?.initialize()}else hd&&console.debug("unknown component: "+a.name),dd.includes(a.name)||dd.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await mb(o,r,t,i,n+1);if(dd.length>0&&n===0){const r=dd.join(", ");console.warn(`Unknown components in scene: ${r}`),dd.length=0,Di()&&ke(`<strong>Unknown components in scene</strong>:
|
|
1476
|
+
|
|
1477
|
+
${r}
|
|
1478
|
+
|
|
1479
|
+
This could mean you forgot to add a npmdef to your ExportInfo
|
|
1480
|
+
<a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,{type:Bi.Warn})}}function pD(o,e){const{instance:t,compData:i,obj:n}=o;e.object=n,e.target=t,gu(t,i,e),hd&&console.debug("add "+i.name,i,t)}class mD{createBuiltinComponents(e,t,i,n,s){return uD(e,t,i,n,s)}writeBuiltinComponentData(e,t){return hD(e,t)}parseSync(e,t,i,n){return DS(e,t,i,n)}loadSync(e,t,i,n,s){return gb(e,t,i,n,s)}}function gD(){dv(mD)}const IS=w("printGltf")||w("printgltf"),fD=w("debugfileformat");async function LS(o,e,t){const i=await qx(o,{useExtension:!0})||"unknown";fD&&console.debug(`Determined file type: '${i}' for url '${o}'`,{registeredModelLoaderCallbacks:Sl});for(const n of Sl){const{callback:s}=n,r=s({context:e,url:o,mimetype:i});if(r instanceof Promise&&await r,r)return console.debug(`Using custom loader (${n.name||"unnamed"}) for ${i} at '${o}'`),r}switch(i){case"unsupported":return null;default:case"unknown":{console.warn(`Unknown file type (${i}). Needle Engine will fallback to the GLTFLoader - To support more model formats please create a Needle loader plugin.
|
|
1481
|
+
Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,o);const n=new Do;return await wp(n,e,o,t),n}case"model/fbx":case"model/vnd.autodesk.fbx":return new Jb;case"model/obj":return new Zm;case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usda+zip":return console.warn(i.toUpperCase()+" files are not supported."),null;case"model/gltf+json":case"model/gltf-binary":case"model/vrm":{const n=new Do;return await wp(n,e,o,t),n}case"application/materialx+xml":return new tA}}function yD(o,e){return gb(e?.context||z.Current,o,o,e?.seed||null,e?.onprogress)}async function DS(o,e,t,i){typeof t!="string"&&(console.warn("Parse gltf binary without path, this might lead to errors in resolving extensions. Please provide the source path of the gltf/glb file",t,typeof t),t=""),IS&&console.log("Parse glTF",t);const n=await LS(t,o,t);if(!n)return;const{componentsExtension:s}=jS(n,o);if(n instanceof Zm){typeof e!="string"&&(e=new TextDecoder().decode(e));const r=n.parse(e);return await ud(n,o,t,r,i,s)}if(!(n instanceof Do)){if(!("parse"in n)||typeof n.parse!="function"){console.error("Loader does not support parse");return}const r=n.parse(e,t);return await ud(n,o,t,r,i,s)}return new Promise((r,a)=>{try{let l=t.split("?")[0].trimEnd();const c=l.split("/");c.length>0&&c[c.length-1]!==""&&c.pop(),l=c.join("/"),l.endsWith("/")||(l+="/"),n.resourcePath=l,n.parse(e,"",async h=>{const d=await ud(n,o,t,h,i,s);r(d)},h=>{console.error('Loading asset at "'+t+`" failed
|
|
1482
|
+
`,h),r(void 0)})}catch(l){console.error(l),a(l)}})}async function gb(o,e,t,i,n){_D(e);const s=await LS(e,o,t);if(!s)return;const{componentsExtension:r}=jS(s,o);if(!(s instanceof Do)){const a=await s.loadAsync(e,n);return await ud(s,o,e,a,i,r)}return new Promise((a,l)=>{try{s.load(e,async c=>{const h=await ud(s,o,t,c,i,r);a(h)},c=>{n?.call(s,c)},c=>{console.error('Loading asset at "'+e+`" failed
|
|
1483
|
+
`,c),a(void 0)})}catch(c){console.error(c),l(c)}})}function jS(o,e){const t=My(o);return o instanceof Do&&r0(o,e),{componentsExtension:t}}async function ud(o,e,t,i,n,s){if(IS&&console.warn("Loaded",t,i),i==null)return console.error(`Loaded model is null '${t}' - please make sure the loader is registered correctly`),{scene:new M,animations:[],scenes:[]};if(typeof i!="object")return console.error(`Loaded model is not an object '${t}' - please make sure the loader is registered correctly`),{scene:new M,animations:[],scenes:[]};if(i instanceof M)i={scene:i,animations:i.animations,scenes:[i]};else if(i instanceof Ji){const r=new yt({color:new oe(14540253)}),a=new H(i,r);i={scene:a,animations:[],scenes:[a]}}else Array.isArray(i.scenes)===!1&&console.error(`[Needle Engine] The loaded model object does not have a scenes property '${t}' - please make sure the loader is registered correctly and three.js is not imported multiple times.`);return t.includes("?")&&(t=t.split("?")[0]),vD(o,i),sv(i)&&(o1(t,i,e),await Mn().createBuiltinComponents(e,t,i,n,s||void 0)),await bD(i.scene,e,e.mainCamera),i}async function bD(o,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(o,t,e.scene).catch(i=>{console.warn(i.message)}):zE(o,e)}catch(i){console.warn(i?.message||i)}}function _D(o){if(new URL(o,window.location.href).href.startsWith("file://")){const e=`Hi - it looks like you are trying to load a local file which will not work. You need to use a webserver to serve your files.
|
|
1484
|
+
Please refer to the documentation on <a href="https://fwd.needle.tools/needle-engine/docs/local-server">https://docs.needle.tools</a> or ask for help in our <a href="https://discord.needle.tools">discord community</a>`;ke(e),console.warn(e)}}function vD(o,e){if("scenes"in e){for(const t of e.scenes)if(t&&!t.animations?.length)for(const i of e.animations)t.animations.includes(i)||t.animations.push(i)}if(o instanceof Jb||o instanceof Zm){let t=e;t instanceof M||(t=e.scene||e.scenes.find(i=>i)),t.traverse(i=>{const n=i;n?.isMesh&&kg(n,n.material)})}}let BS=!1;function wD(){BS||(BS=!0,Object.defineProperty(de.prototype,"fov",{get:function(){return this._fov},set:function(o){const e=o!==this._fov;this._fov=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(de.prototype,"near",{get:function(){return this._near},set:function(o){const e=o!==this._near;this._near=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(de.prototype,"far",{get:function(){return this._far},set:function(o){const e=o!==this._far;this._far=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}))}let FS=!1;function xD(){FS||(FS=!0,b.prototype.slerp=function(o,e){return M_(this,o,e)},Af(b))}const fb=A();class US extends HTMLElement{static observedAttributes=["ar","vr","quicklook","qrcode"];constructor(){super(),this.removeEventListener("click",this.#a),this.addEventListener("click",this.#a)}attributeChangedCallback(e,t,i){this.#l()}#t;#n;#o;#e;#i;#r;#s;#l(){if(this.#e?.remove(),this.getAttribute("ar")!=null)this.#i??=new mr,this.#e=this.#i.createARButton(),this.setAttribute("aria-label","Enter augmented reality mode");else if(this.getAttribute("vr")!=null)this.#i??=new mr,this.#e=this.#i.createVRButton(),this.setAttribute("aria-label","Enter virtual reality mode");else if(this.getAttribute("quicklook")!=null)this.#i??=new mr,this.#e=this.#i.createQuicklookButton(),this.setAttribute("aria-label","View in AR with Apple Quick Look");else if(this.getAttribute("qrcode")!=null)this.#r??=new _n,this.#e=this.#r.createQRCode({anchorElement:this}),this.setAttribute("aria-label","Share application with QR code");else{fb?console.warn("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute."):console.debug("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute."),this.setAttribute("aria-label","Needle Button with no specified type");return}this.#t??=this.attachShadow({mode:"open"}),this.#n??=document.createElement("slot"),this.#o??=document.createElement("style"),this.#o.innerHTML=`
|
|
1485
|
+
button {
|
|
1486
|
+
all: unset;
|
|
1487
|
+
}
|
|
1488
|
+
`,this.getAttribute("unstyled")!=null||(this.#o.innerHTML+=`
|
|
1489
|
+
:host {
|
|
1490
|
+
display: inline-flex;
|
|
1491
|
+
align-items: center;
|
|
1492
|
+
justify-content: center;
|
|
1493
|
+
width: fit-content;
|
|
1494
|
+
|
|
1495
|
+
padding: 0.4rem .5rem;
|
|
1496
|
+
border-radius: 100vw;
|
|
1497
|
+
|
|
1498
|
+
background: rgba(245, 245, 245, .8);
|
|
1499
|
+
backdrop-filter: blur(10px);
|
|
1500
|
+
|
|
1501
|
+
cursor: pointer;
|
|
1502
|
+
color: black;
|
|
1503
|
+
outline: rgba(0,0,0,.05) 1px solid;
|
|
1504
|
+
|
|
1505
|
+
transition: all .2s;
|
|
1506
|
+
}
|
|
1507
|
+
:host(:hover) {
|
|
1508
|
+
background: rgba(255, 255, 255, 1);
|
|
1509
|
+
transition: background .2s;
|
|
1510
|
+
}
|
|
1511
|
+
slot {
|
|
1512
|
+
display: flex;
|
|
1513
|
+
align-items: center;
|
|
1514
|
+
justify-content: center;
|
|
1515
|
+
gap: .5rem;
|
|
1516
|
+
}
|
|
1517
|
+
`),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#o),Uc(bf,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#c()),this.#s.observe(this.#e,{attributes:!0}),fb&&console.log("Needle Button updated",this)}#c(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#a=e=>{fb&&console.log("Needle Button clicked",{defaultPrevented:e.defaultPrevented,hasButton:!!this.#e}),!e.defaultPrevented&&this.#e&&this.#e.click()}}const pd=w("debugoverlay"),zS="ar",SD="quit-ar";class CD{get ARContainer(){return this.arContainer}arContainer=null;currentSession=null;_createdAROnlyElements=[];_reparentedObjects=[];contentElement=null;originalDomOverlayParent=null;requestEndAR=()=>{this.onRequestedEndAR()};onBegin(e,t,i){if(this.currentSession=i,this.arContainer=t,I.isMozillaXR()||I.isNeedleAppClip()){const n=e.domElement.children;for(let s=0;s<n?.length;s++){const r=n[s];if(!r||r===this.arContainer)return;this._reparentedObjects.push({el:r,previousParent:r.parentElement}),this.arContainer?.appendChild(r)}t?(this.originalDomOverlayParent=t.parentNode,this.originalDomOverlayParent&&(console.log("Reparent DOM Overlay to body",t,t.style.display),t.style.display="",t.style.visibility="",document.body.appendChild(t))):console.warn("WebXRViewer: No DOM Overlay found")}this.ensureQuitARButton(this.arContainer)}onEnd(e){for(const t of this._createdAROnlyElements)t.remove&&t.remove();for(const t of this._reparentedObjects){const i=t.el;t.previousParent?.appendChild(i)}this._reparentedObjects.length=0,I.isMozillaXR()&&setTimeout(()=>{const t=e.renderer.domElement;t&&e.domElement.shadowRoot?.prepend(t);const i=document.querySelectorAll("*");for(var n=0;n<i.length;n++){const s=i[n];s&&s._displayChanged!==void 0&&s._displayWas!==void 0&&(s.style.display=s._displayWas)}},10)}createOverlayContainer(e){if(this.contentElement)return this.contentElement;pd&&console.log("Setup overlay container");const t=e.shadowRoot.querySelector(".content");this.contentElement=t;const i=e.shadowRoot.querySelector(".overlay-content");return i&&t.appendChild(i),pd&&!I.isMobileDevice()&&this.ensureQuitARButton(t),t}onRequestedEndAR(){this.currentSession&&(this.currentSession.end(),this.currentSession=null)}ensureQuitARButton(e){const t=document.createElement("slot");if(t.style.display="contents",t.style.padding="10px",t.setAttribute("name","quit-ar"),this.appendElement(t,e),this._createdAROnlyElements.push(t),t.style.pointerEvents="auto",I.isNeedleAppClip()){globalThis.NEEDLE_ENGINE_APPCLIP_DISABLE_MENU=!0;const a=document.querySelector('meta[name="viewport"]');a&&!a.getAttribute("content")?.includes("viewport-fit=")&&a.setAttribute("content",a.getAttribute("content")+",viewport-fit=cover")}const i=document.querySelector(`.${SD}`);if(i){i.addEventListener("click",this.requestEndAR),pd&&i.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),pd&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const n=document.createElement("div");n.style.cssText=`
|
|
1518
|
+
position: fixed;
|
|
1519
|
+
top: 0;
|
|
1520
|
+
right: 0;
|
|
1521
|
+
z-index: 600;
|
|
1522
|
+
pointer-events: all;
|
|
1523
|
+
padding-top: env(safe-area-inset-top, 0px);
|
|
1524
|
+
padding-right: calc(env(safe-area-inset-right, 0px) + 10px);
|
|
1525
|
+
`,this.appendElement(n,t);var s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("quit-ar-button"),s.setAttribute("width","40px"),s.setAttribute("height","40px"),s.style.cssText=`
|
|
1526
|
+
background: rgba(255, 255, 255, .4);
|
|
1527
|
+
-webkit-backdrop-filter: blur(8px);
|
|
1528
|
+
backdrop-filter: blur(8px);
|
|
1529
|
+
border-radius: 50%;
|
|
1530
|
+
box-shadow: 0 0 5px rgba(0,0,0,.3);
|
|
1531
|
+
outline: 1px solid rgba(255, 255, 255, .6);
|
|
1532
|
+
display: flex;
|
|
1533
|
+
justify-content: center;
|
|
1534
|
+
align-items: center;
|
|
1535
|
+
`,n.appendChild(s);var r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("d","M 12,12 L 28,28 M 28,12 12,28"),r.setAttribute("stroke","#000000"),r.setAttribute("stroke-width","2px"),r.style.cssText=`
|
|
1536
|
+
/**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
|
|
1537
|
+
`,s.appendChild(r),pd&&console.log("Created fallback close button",s,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const Ca=w("debugloading"),md=w("debugloadingrendering");w("debuglicense");class PD{className;additionalClasses}let gd=0,NS;function yb(o){Ca&&console.log(o.progress.loaded.toFixed(0)+"/"+o.progress.total.toFixed(0),o);const e=o.count,t=o.progress.total;t===0||t===void 0?(NS!==o.name&&(gd=0),NS=o.name,gd+=(1-gd)*.001,Ca&&be("Loading "+o.name+" did not report total size")):gd=o.progress.loaded/t;const i=o.index/e+gd/e;return D.clamp01(i)}class Rd{static LoadingContainerClassName="loading";loadingProgress=0;_element;_progress=0;_allowCustomLoadingElement=!0;_loadingElement;_loadingTextContainer=null;_loadingBar=null;_loadingBarFinishedColor=null;_messageContainer=null;_loadingElementOptions;constructor(e,t){this._element=e,this._loadingElementOptions=t}async onLoadingBegin(e){const t=this._element.shadowRoot||this._element;if(Ca&&console.warn("Begin Loading"),!this._loadingElement){for(let i=0;i<t.children.length;i++){const n=t.children[i];if(n.classList.contains(Rd.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){Ca&&console.warn("Remove custom loading container"),t.removeChild(n);continue}this._loadingElement=this.createLoadingElement(n)}}this._loadingElement||(this._loadingElement=this.createLoadingElement())}this._progress=0,this.loadingProgress=0,this._loadingElement.style.display="flex",t.appendChild(this._loadingElement),this.smoothProgressLoop(),this.setMessage(e??"")}onLoadingUpdate(e,t){if(!this._loadingElement?.parentNode)return;let i=0;typeof e=="number"?i=e:("index"in e&&(i=yb(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=i,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){Ca&&console.warn("Finished Loading"),md||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}_progressLoop;smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;md&&(e=1/500,typeof md=="number"&&(e*=md)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!md&&(e=.9),this._progress=D.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){if(this._loadingElement){Ca&&console.log("Hiding loading element");const e=this._loadingElement;e.animate([{opacity:1},{opacity:0}],{duration:200,easing:"ease-in-out"}).addEventListener("finish",()=>{e.style.display="none",e.remove()})}this._progressLoop&&clearInterval(this._progressLoop),this._progressLoop=null}updateDisplay(){const e=this._progress,t=(e*100).toFixed(0)+"%";this._loadingBar&&(this._loadingBar.style.width=e*100+"%",e>=1&&this._loadingBarFinishedColor&&(this._loadingBar.style.background=this._loadingBarFinishedColor)),this._loadingTextContainer&&(this._loadingTextContainer.textContent=t)}createLoadingElement(e){Ca&&!e&&console.log("Creating loading element"),this._loadingElement=e||document.createElement("div");let t=this._element.getAttribute("loading-style");(!t||t==="auto")&&(window.matchMedia("(prefers-color-scheme: dark)").matches?t="dark":t="light");const i=eo();if(!e){this._loadingElement.style.position="absolute",this._loadingElement.style.width="100%",this._loadingElement.style.height="100%",this._loadingElement.style.left="0",this._loadingElement.style.top="0",this._loadingElement.style.overflow="hidden";const f=this._element.getAttribute("loading-background");f?this._loadingElement.style.background=f:this._loadingElement.style.backgroundColor="transparent",this._loadingElement.style.display="flex",this._loadingElement.style.alignItems="center",this._loadingElement.style.justifyContent="center",this._loadingElement.style.zIndex="0",this._loadingElement.style.flexDirection="column",this._loadingElement.style.pointerEvents="none",this._loadingElement.style.color="white",this._loadingElement.style.fontFamily='system-ui, Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',this._loadingElement.style.fontSize="1rem",t==="light"?this._loadingElement.style.color="rgba(0,0,0,.6)":this._loadingElement.style.color="rgba(255,255,255,.3)"}const n=this._loadingElementOptions?.className??Rd.LoadingContainerClassName;if(this._loadingElement.classList.add(n),this._loadingElementOptions?.additionalClasses)for(const f of this._loadingElementOptions.additionalClasses)this._loadingElement.classList.add(f);const s=document.createElement("div");s.style.cssText=`
|
|
1538
|
+
position: relative;
|
|
1539
|
+
display: flex;
|
|
1540
|
+
flex-direction: column;
|
|
1541
|
+
align-items: center;
|
|
1542
|
+
justify-content: center;
|
|
1543
|
+
width: 100%;
|
|
1544
|
+
height: 100%;
|
|
1545
|
+
pointer-events: none;
|
|
1546
|
+
`,this._loadingElement.appendChild(s);const r=this._element.getAttribute("poster");if(r!==null&&r!=="0"){const f=document.createElement("div"),g=r?.length?"0px":"50px";f.style.cssText=`
|
|
1547
|
+
position: absolute;
|
|
1548
|
+
left: 0;
|
|
1549
|
+
top: 0;
|
|
1550
|
+
bottom: 0;
|
|
1551
|
+
right: 0;
|
|
1552
|
+
z-index: -1;
|
|
1553
|
+
overflow: hidden;
|
|
1554
|
+
|
|
1555
|
+
margin: -${g};
|
|
1556
|
+
background: url('${r?.length?r:"/include/poster.webp"}') center center no-repeat;
|
|
1557
|
+
background-size: cover;
|
|
1558
|
+
filter: blur(${g});
|
|
1559
|
+
`,this._loadingElement.appendChild(f)}const a=document.createElement("img"),l="80%",c="15%",h=".2s";if(a.style.userSelect="none",a.style.objectFit="contain",a.style.transform="translateY(30px)",a.style.opacity="0.0000001",a.style.transition=`transform 1s ease-out ${h}, opacity .3s ease-in-out ${h}`,a.src=ol,i&&this._element){const f=this._element.getAttribute("logo-src");f&&(a.src=f,setTimeout(()=>{a.style.opacity="1",a.style.transform="translateY(0px)"},1))}a.style.width=`${l}`,a.style.height=`min(1000px, max(${c}, 50px))`,s.appendChild(a);const d=document.createElement("div");d.style.cssText=`
|
|
1560
|
+
display: flex;
|
|
1561
|
+
flex-direction: column;
|
|
1562
|
+
align-items: center;
|
|
1563
|
+
justify-content: center;
|
|
1564
|
+
width: 100%;
|
|
1565
|
+
opacity: 0;
|
|
1566
|
+
transition: opacity 1s ease-in-out 4s;
|
|
1567
|
+
`,setTimeout(()=>{d.style.opacity="1"},1),this._loadingElement.appendChild(d);const p=document.createElement("div"),m=100;return p.style.display="flex",p.style.width=m+"%",p.style.height="5px",p.style.position="absolute",p.style.left="0",p.style.top="0px",p.style.opacity="0",p.style.transition="opacity 1s ease-in-out",p.style.backgroundColor="rgba(240,240,240,.5)",setTimeout(()=>{p.style.opacity="1"},1),this._loadingElement.appendChild(p),this._loadingBar=document.createElement("div"),p.appendChild(this._loadingBar),this._loadingBar.style.backgroundAttachment="fixed",this._loadingBar.style.background="#c4c4c4ab",this._loadingBarFinishedColor="#ddddddab",this._loadingBar.style.width="0%",this._loadingBar.style.height="100%",this._loadingElement}}const Re=w("debugwebcomponent"),WS="vr",VS="desktop",OD=[zS,WS,VS],fd="ar-session-active",yd="desktop-session-active",kD=["src","hash","camera-controls","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","public-key","version","tone-mapping","tone-mapping-exposure","background-blurriness","background-color","environment-intensity","focus-rect","loadstart","progress","loadfinished"];class bb extends HTMLElement{static get observedAttributes(){return kD}get loadingProgress01(){return this._loadingProgress01}get loadingFinished(){return this.loadingProgress01>.999}get cameraControls(){const e=this.getAttribute("camera-controls");return e==null?null:!(e===null||e==="False"||e==="false"||e==="0"||e==="none")}set cameraControls(e){e===null?this.removeAttribute("camera-controls"):this.setAttribute("camera-controls",e?"true":"false")}getContext(){return new Promise((e,t)=>{if(this._context&&this.loadingFinished)e(this._context);else{const i=()=>{this.removeEventListener("loadfinished",i),this._context&&this.loadingFinished&&e(this._context)};this.addEventListener("loadfinished",i)}})}get context(){return this._context}_context;_overlay_ar;_loadingProgress01=0;_loadingView;_previousSrc=null;_didFullyLoad=!1;_didInitialize=!1;constructor(){super(),this.attachShadow({mode:"open",delegatesFocus:!0});const e=document.createElement("template");e.innerHTML=`<style>
|
|
1568
|
+
:host {
|
|
1569
|
+
position: absolute;
|
|
1570
|
+
display: block;
|
|
1571
|
+
width: max(600px, 100%);
|
|
1572
|
+
height: max(300px, 100%);
|
|
1573
|
+
touch-action: none;
|
|
1574
|
+
|
|
1575
|
+
-webkit-tap-highlight-color: transparent;
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1578
|
+
@media (max-width: 600px) {
|
|
1579
|
+
:host {
|
|
1580
|
+
width: 100%;
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
@media (max-height: 300px) {
|
|
1584
|
+
:host {
|
|
1585
|
+
height: 100%;
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
:host > div.canvas-wrapper {
|
|
1590
|
+
width: 100%;
|
|
1591
|
+
height: 100%;
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
:host canvas {
|
|
1595
|
+
position: absolute;
|
|
1596
|
+
user-select: none;
|
|
1597
|
+
-webkit-user-select: none;
|
|
1598
|
+
|
|
1599
|
+
/** allow touch panning but no pinch zoom **/
|
|
1600
|
+
/** but this doesnt work yet:
|
|
1601
|
+
* touch-action: pan-x, pan-y;
|
|
1602
|
+
**/
|
|
1603
|
+
|
|
1604
|
+
-webkit-touch-callout: none;
|
|
1605
|
+
-webkit-user-drag: none;
|
|
1606
|
+
-webkit-user-modify: none;
|
|
1607
|
+
|
|
1608
|
+
left: 0;
|
|
1609
|
+
top: 0;
|
|
1610
|
+
}
|
|
1611
|
+
:host .content {
|
|
1612
|
+
position: absolute;
|
|
1613
|
+
top: 0;
|
|
1614
|
+
width: 100%;
|
|
1615
|
+
height: 100%;
|
|
1616
|
+
visibility: visible;
|
|
1617
|
+
z-index: 500; /* < must be less than the webxr buttons element */
|
|
1618
|
+
pointer-events: none;
|
|
1619
|
+
}
|
|
1620
|
+
:host .overlay-content {
|
|
1621
|
+
position: absolute;
|
|
1622
|
+
user-select: auto;
|
|
1623
|
+
pointer-events: all;
|
|
1624
|
+
}
|
|
1625
|
+
:host slot[name="quit-ar"]:hover {
|
|
1626
|
+
cursor: pointer;
|
|
1627
|
+
}
|
|
1628
|
+
:host .quit-ar-button {
|
|
1629
|
+
position: absolute;
|
|
1630
|
+
/** top: env(titlebar-area-y); this doesnt work **/
|
|
1631
|
+
top: 60px; /** camera access needs a bit more space **/
|
|
1632
|
+
right: 20px;
|
|
1633
|
+
z-index: 9999;
|
|
1634
|
+
}
|
|
1635
|
+
</style>
|
|
1636
|
+
<div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
|
|
1637
|
+
<canvas data-needle-engine-version=${gi}></canvas>
|
|
1638
|
+
</div>
|
|
1639
|
+
<div class="content">
|
|
1640
|
+
<slot class="overlay-content" style="display: contents;"></slot>
|
|
1641
|
+
</div>
|
|
1642
|
+
`,this.shadowRoot.appendChild(e.content.cloneNode(!0)),Uc(bw,{element:this.shadowRoot}),this.addEventListener("ready",this.onReady),this.addEventListener("error",this.onError)}ensureInitialized(){this._didInitialize||(this._didInitialize=!0,this.initializeDom())}initializeDom(){_w(),this.setAttribute("role","application"),this.setAttribute("aria-label","Needle Engine 3D scene")}connectedCallback(){if(Re&&console.log("<needle-engine> connected"),this.ensureInitialized(),this.setPublicKey(),this.setVersion(),(this.getAttribute("tabindex")===null||this.getAttribute("tabindex")===void 0)&&this.setAttribute("tabindex","0"),this._overlay_ar=new CD,this.getOrCreateContext(),this.addEventListener("xr-session-started",this.onXRSessionStarted),this.onSetupDesktop(),!this.getAttribute("src")){const t=globalThis["needle:codegen_files"];Re&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(Re&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}Re&&console.log("src",this.getAttribute("src"));const e=this._loadId;setTimeout(()=>{this.isConnected!==!1&&e===this._loadId&&this.onLoad()},1)}disconnectedCallback(){this.removeEventListener("xr-session-started",this.onXRSessionStarted),this._didFullyLoad=!1;const e=this.getAttribute("keep-alive"),t=e==null||e?.length>0&&e!=="true"&&e!=="1";Re&&console.warn('<needle-engine> disconnected, keep-alive: "'+e+'"',typeof e,"Dispose=",t),t?(Re&&console.warn("<needle-engine> dispose"),this._context?.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):Re&&console.warn("<needle-engine> is not disposed because keep-alive is set")}connectedMoveCallback(){}attributeChangedCallback(e,t,i){switch(Re&&console.log("attributeChangedCallback",e,t,i),e){case"src":Re&&console.warn(`<needle-engine src>
|
|
1643
|
+
changed from "`,t,'" to "',i,'"'),this.onLoad();break;case"hash":this._context&&(this._context.hash=i);break;case"loadstart":case"progress":case"loadfinished":typeof i=="string"&&i.length>0&&(Re&&console.log(e+" attribute changed",i),this.registerEventFromAttribute(e,i));break;case"dracoDecoderPath":Re&&console.log("dracoDecoderPath",i),W1(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(Re&&console.log("dracoDecoderType",i),V1(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":Re&&console.log("ktx2DecoderPath",i),$1(i);break;case"tonemapping":case"tone-mapping":case"tone-mapping-exposure":case"background-blurriness":case"background-color":case"environment-intensity":{this.applyAttributes();break}case"public-key":{i!=Os&&this.setPublicKey();break}case"version":{i!=gi&&this.setVersion();break}case"focus-rect":{const n=this.getAttribute("focus-rect");if(n){const s=this.getOrCreateContext();if(n===null)s.setCameraFocusRect(null);else if(typeof n=="string"&&n.length>0){const r=document.querySelector(n);r||console.warn(`No element found for focus-rect selector: ${n}`),s.setCameraFocusRect(r instanceof HTMLElement?r:null)}else n instanceof HTMLElement?s.setCameraFocusRect(n):console.warn("Invalid focus-rect value. Expected a CSS selector string or an HTMLElement.",n)}}break}}get toneMapping(){return this.getAttribute("tonemapping")||this.getAttribute("tone-mapping")}_loadId=0;_abortController=null;_lastSourceFiles=null;_createContextPromise=null;getOrCreateContext(){return this._context||(Re&&console.warn("Create new context"),this._context=new z({domElement:this})),this._context}async onLoad(){if(!this.isConnected)return;const e=this.getOrCreateContext(),t=this.getSourceFiles();if(!this.checkIfSourceHasChanged(t,this._lastSourceFiles))return;this._abortController&&(Re&&console.warn("Abort previous loading process"),this._abortController.abort(),this._abortController=null),this._lastSourceFiles=t;const i=++this._loadId;if((t==null||t.length<=0)&&(Re&&console.warn("Clear scene",t),e.clear(),i!==this._loadId))return;const n=this.getAttribute("alias");this.classList.add("loading");const s=to();this.ensureLoadStartIsRegistered();let r=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:e,alias:n},cancelable:!0}));if(s){const g=this.getAttribute("hide-loading-overlay");g!=null&&g!=="0"&&(r=!1)}r===!1&&!s&&(A()||(r=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),A()&&be('You need a <a target="_blank" href="https://needle.tools/pricing">commercial license</a> to override the default loading view. This will not work in production.')),!this._loadingView&&r&&(this._loadingView=new Rd(this)),r&&(this._didFullyLoad!==!0?this._loadingView?.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===i&&this._loadingView.onLoadingBegin("begin load")},300)),Re&&console.warn(`--------------
|
|
1644
|
+
Needle Engine: Begin loading `+i+`
|
|
1645
|
+
`,t),this.onBeforeBeginLoading();const a=[],l={context:this._context,name:"",progress:{},index:0,count:t.length,totalProgress01:this._loadingProgress01},c=new CustomEvent("progress",{detail:l}),h=new Array,d=new AbortController;this._abortController=d;const p={files:t,abortSignal:d.signal,onLoadingProgress:g=>{if(Re&&console.debug("Loading progress: ",g),d.signal.aborted)return;const y=g.index;!h[y]&&g.name&&(h[y]=MD(g.name)),g.name=h[y],r&&this._loadingView?.onLoadingUpdate(g),l.name=g.name,l.progress=g.progress,this._loadingProgress01=yb(g),l.totalProgress01=this._loadingProgress01,this.dispatchEvent(c)},onLoadingFinished:(g,y,_)=>{Re&&console.debug(`Finished loading "${y}" (aborted? ${d.signal.aborted})`),!d.signal.aborted&&_&&a.push({src:y,file:_})}};ED(this);const m=this.getAttribute("hash");m!=null&&(e.hash=m),e.alias=n,this._createContextPromise=e.create(p);const f=await this._createContextPromise;if(this.applyAttributes(),Re&&console.warn(`--------------
|
|
1646
|
+
Needle Engine: finished loading `+i+`
|
|
1647
|
+
`,t,`Aborted? ${d.signal.aborted}`),d.signal.aborted){console.log("Loading finished but aborted...");return}if(this._loadId!==i){console.log("Load id changed during loading process");return}this._loadingProgress01=1,r&&f&&this._loadingView?.onLoadingUpdate(1,"creating scene"),this._didFullyLoad=!0,this.classList.remove("loading"),this.classList.add("loading-finished"),this.dispatchEvent(new CustomEvent("loadfinished",{detail:{context:this._context,src:n,loadedFiles:a}}))}applyAttributes(){const e=this.getOrCreateContext();if(e.renderer){const s=dw(this.toneMapping);s!==void 0&&(e.renderer.toneMapping=s);const r=this.getAttribute("tone-mapping-exposure");if(r!=null){const a=parseFloat(r);isNaN(a)||(e.renderer.toneMappingExposure=a)}}const t=this.getAttribute("background-blurriness");if(t!=null){const s=parseFloat(t);isNaN(s)||(e.scene.backgroundBlurriness=s)}const i=this.getAttribute("environment-intensity");if(i!=null){const s=parseFloat(i);isNaN(s)||(e.scene.environmentIntensity=s)}const n=this.getAttribute("background-color");if(e.renderer)if(typeof n=="string"&&n.length>0){const s=se.fromColorRepresentation(n);Re&&console.debug("<needle-engine> background-color changed, str:",n,"\u2192",s),e.renderer.setClearColor(s,s.alpha),e.scene.background=null}else this.getAttribute("background-image")&&this.setAttribute("background-image",this.getAttribute("background-image"))}onXRSessionStarted=()=>{const e=this.getOrCreateContext(),t=e.xrSessionMode;t==="immersive-ar"?this.onEnterAR(e.xrSession):t==="immersive-vr"&&this.onEnterVR(e.xrSession),e.xrSession?.addEventListener("end",()=>{this.dispatchEvent(new CustomEvent("xr-session-ended",{detail:{session:e.xrSession,context:this._context,sessionMode:t}})),t==="immersive-ar"?this.onExitAR(e.xrSession):t==="immersive-vr"&&this.onExitVR(e.xrSession)})};onReady=()=>this._loadingView?.onLoadingFinished();onError=()=>this._loadingView?.setMessage("Loading failed!");getSourceFiles(){const e=this.getAttribute("src");if(!e)return[];let t;Array.isArray(e)?t=e:e.startsWith("[")&&e.endsWith("]")?t=JSON.parse(e):e.includes(",")?t=e.split(","):t=[e];for(let i=t.length-1;i>=0;i--){const n=t[i];(n==="null"||n==="undefined"||n?.length<=0)&&t.splice(i,1)}return t}checkIfSourceHasChanged(e,t){if(e?.length!==t?.length||e==null&&t!==null||e!==null&&t==null)return!0;if(e!==null&&t!==null){for(let i=0;i<e?.length;i++)if(e[i]!==t[i])return!0}return!1}_previouslyRegisteredMap=new Map;ensureLoadStartIsRegistered(){const e=this.getAttribute("loadstart");e&&this.registerEventFromAttribute("loadstart",e)}registerEventFromAttribute(e,t){const i=this._previouslyRegisteredMap.get(e);if(i&&(this._previouslyRegisteredMap.delete(e),this.removeEventListener(e,i)),typeof t=="string"&&t.length>0)try{const n=(0,eval)(t);typeof n=="function"&&(this._previouslyRegisteredMap.set(e,n),this.addEventListener(e,s=>n?.call(globalThis,this.getOrCreateContext(),s)))}catch(n){console.error("Error registering event "+e+'="'+t+`" failed with the following error:
|
|
1648
|
+
`,n)}}setPublicKey(){Os&&Os.length>0&&this.setAttribute("public-key",Os)}setVersion(){gi.length>0&&this.setAttribute("version",gi)}getAROverlayContainer(){return this._overlay_ar.createOverlayContainer(this)}getVROverlayContainer(){for(let e=0;e<this.children.length;e++){const t=this.children[e];if(t.classList.contains("vr"))return t}return null}onEnterAR(e){const t=this.getOrCreateContext();this.onSetupAR();const i=this.getAROverlayContainer();this._overlay_ar.onBegin(t,i,e),this.dispatchEvent(new CustomEvent("enter-ar",{detail:{session:e,context:t,htmlContainer:this._overlay_ar?.ARContainer}}))}onExitAR(e){const t=this.getOrCreateContext();this._overlay_ar.onEnd(t),this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-ar",{detail:{session:e,context:t,htmlContainer:this._overlay_ar?.ARContainer}}))}onEnterVR(e){const t=this.getOrCreateContext();this.onSetupVR(),this.dispatchEvent(new CustomEvent("enter-vr",{detail:{session:e,context:t}}))}onExitVR(e){const t=this.getOrCreateContext();this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-vr",{detail:{session:e,context:t}}))}onSetupAR(){this.classList.add(fd),this.classList.remove(yd);const e=this.getAROverlayContainer();Re&&console.warn("onSetupAR:",e),e&&(e.classList.add(fd),e.classList.remove(yd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,zS))}onSetupVR(){this.classList.remove(fd),this.classList.remove(yd),this.foreachHtmlElement(e=>this.setupElementsForMode(e,WS))}onSetupDesktop(){this.classList.remove(fd),this.classList.add(yd);const e=this.getAROverlayContainer();e&&(e.classList.remove(fd),e.classList.add(yd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,VS))}setupElementsForMode(e,t,i=null){if(!(e===this._context?.renderer?.domElement||e.id==="VRButton"||e.id==="ARButton"))if(e.classList.contains(t))e.style.visibility="visible",e.style.display==="none"&&(e.style.display="block");else for(const n of OD)e.classList.contains(n)&&(e.style.visibility="hidden",e.style.display="none")}foreachHtmlElement(e){for(let t=0;t<this.children.length;t++){const i=this.children[t];i.style&&e(i)}}onBeforeBeginLoading(){const e=this.getAttribute("dracoDecoderPath");e&&(Re&&console.log("using custom draco decoder path",e),W1(e));const t=this.getAttribute("dracoDecoderType");t&&(Re&&console.log("using custom draco decoder type",t),V1(t));const i=this.getAttribute("ktx2DecoderPath");i&&(Re&&console.log("using custom ktx2 decoder path",i),$1(i))}setAttribute(e,t){super.setAttribute(e,typeof t=="string"?t:String(t))}getAttribute(e){return super.getAttribute(e)}addEventListener(e,t,i){return super.addEventListener(e,t,i)}}function MD(o){if(o.startsWith("blob:"))return"blob";const e=o.split("/");let t=e[e.length-1];const i=t.indexOf("?");i>0&&(t=t.substring(0,i));const n=t.indexOf("=");n>0&&(t=t.substring(n));const s=t.split(".").pop(),r=s?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(s.toLowerCase()):-1;if(s&&r>=0&&(t=t.substring(0,t.length-s.length-1)),t=decodeURIComponent(t),t.length>3){let a="",l=!1;const c=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let h=0;h<t.length;h++){let d=t[h];(d==="_"||d==="-")&&(d=" "),!(d===" "&&a.length<=0||c.includes(d)||(a.length===0&&(d=d.toUpperCase()),l&&d===" "))&&(l&&(d=d.toUpperCase()),l=!1,a+=d,d===" "&&(l=!0))}return A()&&t!==a&&console.debug('Generated display name: "'+t+'" \u2192 "'+a+'"'),a.trim()}return t}function ED(o){au(e=>{const t=o.getAttribute("loading-blur");if(t!==null&&t!=="0"&&e.domElement===o){const i=e.lodsManager.manager?.awaitLoading({frames:5,signal:AbortSignal.timeout(1e4),maxPromisesPerObject:1}).catch(r=>{});let n="20px";t.endsWith("px")&&(n=t);const s=170;if(e.scene.background===null){const r=o,a=e.renderer.domElement,l=a.style.filter,c=a.style.overflow;a.style.filter+=`blur(${n})`,r.style.overflow="hidden",i?.then(()=>{const h=a.animate([{filter:"blur(0px)"}],{duration:s,easing:"ease-in"});h.onfinish=()=>{a.style.filter=l,r.style.overflow=c}})}else{const r=document.createElement("div");e.domElement.prepend(r),r.style.cssText="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; pointer-events: none",r.style.backdropFilter=`blur(${n})`,i?.then(()=>{const a=r.animate([{backdropFilter:"blur(0px)",opacity:0}],{duration:s,easing:"ease-in"});a.onfinish=()=>{r.remove()}})}}},{once:!0})}const RD=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:bb},Symbol.toStringTag,{value:"Module"}));function TD(){typeof window>"u"||(window.customElements.get("needle-engine")||window.customElements.define("needle-engine",bb),window.customElements.get("needle-button")||window.customElements.define("needle-button",US),window.customElements.get("needle-logo-element")||window.customElements.define("needle-logo-element",Dm),window.customElements.get("needle-menu")||window.customElements.define("needle-menu",Ed))}function AD(){if(Z.isARSupported(),I.isiOS()){if(A()){const t=Date.now().toString();Ua("debug_appclip",t),ke("iOS appclip debug: "+t)}const o=new URL("https://appclip.apple.com/id?p=tools.needle.launch-app.Clip");o.searchParams.set("url",location.href);const e=o.toString();fetch(e,{method:"HEAD",mode:"no-cors"}).catch(()=>{});try{if(!window.top?.document.querySelector('meta[name="apple-itunes-app"]')){const t=document.createElement("meta");t.name="apple-itunes-app",t.content="app-id=6757205152, app-clip-bundle-id=tools.needle.launch-app.Clip, app-clip-display=card",window.top?.document.head.appendChild(t)}}catch(t){console.warn(`Error adding apple-itunes-app meta tag for appclip support
|
|
1649
|
+
`,t)}try{const t=window.top||window,i=t.document.createElement("link");i.rel="preconnect",i.href=o.toString(),t.document.head.appendChild(i)}catch(t){console.warn(`Error adding preconnect link for appclip.apple.com
|
|
1650
|
+
`,t)}}}let $S=!1;function ID(){$S||($S=!0,TD(),xA(),hw(),RT(),wD(),IE(),xD(),aD(),gD(),setTimeout(lD,1e3),QR(),GR(),lT(),KR(),AD())}const Ne=w("debugphysics"),_b=w("debugcolliderplacement"),vb=w("debugcollisions"),LD=w("showcolliders"),km=w("debugraycasts"),Mi=Symbol("needle component"),jt=Symbol("physics body"),HS=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,Ne&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),pe.registerCallback(ue.ContextCreationStart,o=>{Ne&&console.log("Register rapier physics backend"),o.context.physics.engine=new gc(o.context)});class gc{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if(Ne&&console.log("REMOVE BODY",e?.name,e[jt]),!e)return;this.validate();const t=e[jt];if(e[jt]=null,t&&this.world){const i=this.objects.findIndex(n=>n===e);if(i>=0){const n=this.bodies[i];if(this.bodies.splice(i,1),this.objects.splice(i,1),n instanceof T.RAPIER_PHYSICS.MODULE.Collider){const s=n;this.world?.removeCollider(s,!0);const r=s.parent();r&&r.numColliders()<=0&&(r[Mi]||this.world?.removeRigidBody(r))}else n instanceof T.RAPIER_PHYSICS.MODULE.RigidBody&&(n.numColliders()<=0?this.world?.removeRigidBody(n):A()&&(n.did_log_removing||setTimeout(()=>{n.numColliders()>0&&(n.did_log_removing=!0,console.warn("RapierPhysics: removing rigidbody with colliders from the physics world is not possible right now, please remove the colliders first"))},1)))}}}setColliderEnabled(e,t){const i=e[jt];return i?(i.setEnabled(t),Ne&&console.log("SET COLLIDER ENABLED",e.name,t),!0):!1}updateBody(e,t,i){if(this.validate(),!!this.enabled&&!(e.destroyed||!e.gameObject)&&!(!t&&!i))if(e.isCollider===!0)console.warn("TODO: implement updating collider position");else{const n=e,s=n[jt];s&&this.syncPhysicsBody(n.gameObject,s,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[jt];i&&(this.internalUpdateColliderProperties(t,i),t.sharedMaterial&&this.updatePhysicsMaterial(t))}else{const t=e,i=this.internal_getRigidbody(t);i&&this.internalUpdateRigidbodyProperties(t,i)}}addForce(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.addForce(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply force (does your object with the Rigidbody have a collider?)")}addImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}getLinearVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.linvel():null}getAngularVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.angvel():null}resetForces(e,t){this.validate(),this.internal_getRigidbody(e)?.resetForces(t)}resetTorques(e,t){this.validate(),this.internal_getRigidbody(e)?.resetTorques(t)}applyImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}wakeup(e){this.validate();const t=this.internal_getRigidbody(e);t?t.wakeUp():this._isInitialized&&console.warn("Rigidbody doesn't exist: can not wake up (does your object with the Rigidbody have a collider?)")}isSleeping(e){return this.validate(),this.internal_getRigidbody(e)?.isSleeping()}setAngularVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setAngvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set angular velocity (does your object with the Rigidbody have a collider?)")}setLinearVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setLinvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set linear velocity (does your object with the Rigidbody have a collider?)")}context;_initializePromise;_isInitialized=!1;constructor(e){this.context=e}get isInitialized(){return this._isInitialized}async initialize(){return this._initializePromise||(this._initializePromise=this.internalInitialization()),this._initializePromise}async internalInitialization(){return w("__nophysics")?(console.warn("Physics are disabled"),!1):(Ne&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,T.RAPIER_PHYSICS.MAYBEMODULE==null&&(Ne&&console.trace("Loading rapier physics engine"),await(await T.RAPIER_PHYSICS.load()).init()),Ne&&console.log("Physics engine initialized, creating world..."),this._world=new T.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new T.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,Ne&&console.log("Physics world created"),!0))}validate(){this._isInitialized||Ne&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new ji(()=>new b,10);raycast(e,t,i){if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let n=i?.maxDistance,s=i?.solid;n===void 0&&(n=1/0),s===void 0&&(s=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||km)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRay(r,n,s,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const c=l[Mi];return i?.filterPredicate?i.filterPredicate(c):i?.useIgnoreRaycastLayer!==!1?!c?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),c=this.raycastVectorsBuffer.get();return c.set(l.x,l.y,l.z),{point:c,collider:a.collider[Mi]}}return null}raycastAndGetNormal(e,t,i){if(!this._isInitialized)return null;let n=i?.maxDistance,s=i?.solid;n===void 0&&(n=1/0),s===void 0&&(s=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||km)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRayAndGetNormal(r,n,s,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const c=l[Mi];return i?.filterPredicate?i.filterPredicate(c):i?.useIgnoreRaycastLayer!==!1?!c?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),c=a.normal,h=this.raycastVectorsBuffer.get(),d=this.raycastVectorsBuffer.get();return h.set(l.x,l.y,l.z),d.set(c.x,c.y,c.z),{point:h,normal:d,collider:a.collider[Mi]}}return null}getPhysicsRay(e,t,i){const n=this.context?.mainCamera;if(t===void 0){const a=this.context?.input.getPointerPosition(0);if(a)t=a;else return null}if(t.z===void 0){if(!n)return console.error("Can not perform raycast from 2d point - no main camera found"),null;const a=this.raycastVectorsBuffer.get();a.x=t.x,a.y=t.y,a.z=0,(a.x>1||a.y>1||a.y<-1||a.x<-1)&&(Ne&&console.warn("Converting screenspace to raycast space",a),this.context?.input.convertScreenspaceToRaycastSpace(a)),a.unproject(n),t=a}const s=t;e.origin.x=s.x,e.origin.y=s.y,e.origin.z=s.z;const r=this.raycastVectorsBuffer.get();if(i)r.set(i.x,i.y,i.z);else{if(!n)return console.error("Can not perform raycast - no camera found"),null;r.set(e.origin.x,e.origin.y,e.origin.z);const a=ee(n);r.sub(a)}return r.normalize(),e.dir.x=r.x,e.dir.y=r.y,e.dir.z=r.z,e}rapierSphere=null;rapierBox=null;rapierColliderArray=[];rapierIdentityRotation={x:0,y:0,z:0,w:1};rapierForwardVector={x:0,y:0,z:1};sphereOverlap(e,t){return this.rapierSphere??=new T.RAPIER_PHYSICS.MODULE.Ball(t),this.rapierSphere.radius=t,(this.debugRenderRaycasts||km)&&B.DrawWireSphere(e,t,3359999,1),this.shapeOverlap(e,this.rapierIdentityRotation,this.rapierSphere)}boxOverlap(e,t,i=null){return i===null&&(i=this.rapierIdentityRotation),this.rapierBox??=new T.RAPIER_PHYSICS.MODULE.Cuboid(1,1,1),this.rapierBox.halfExtents.x=t.x*.5,this.rapierBox.halfExtents.y=t.y*.5,this.rapierBox.halfExtents.z=t.z*.5,(this.debugRenderRaycasts||km)&&B.DrawWireBox(e,t,3359999,1,!0,i),this.shapeOverlap(e,i,this.rapierBox)}shapeOverlap(e,t,i){return this.rapierColliderArray.length=0,this._isInitialized?this.world?(this.world.intersectionsWithShape(e,t,i,n=>{const s=n[Mi],r=new lv(s.gameObject,s);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[Mi].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}enabled=!1;get world(){return this._world}_tempPosition=new b;_tempQuaternion=new N;_tempScale=new b;_tempMatrix=new J;static _didLoadPhysicsEngine=!1;_isUpdatingPhysicsWorld=!1;get isUpdating(){return this._isUpdatingPhysicsWorld}_world;_hasCreatedWorld=!1;eventQueue;collisionHandler;objects=[];bodies=[];_meshCache=new Map;_gravity={x:0,y:-9.81,z:0};get gravity(){return this.world?.gravity??this._gravity}set gravity(e){this.world?this.world.gravity=e:this._gravity=e}clearCaches(){this._meshCache.clear(),this.eventQueue?.raw&&this.eventQueue?.free(),this.world?.bodies&&this.world?.free()}async addBoxCollider(e,t){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){Ne&&console.warn("Physics are disabled");return}const i=e.gameObject,n=Ge(i,this._tempPosition).multiply(t);n.multiplyScalar(.5),n.x<0&&(n.x=Math.abs(n.x)),n.y<0&&(n.y=Math.abs(n.y)),n.z<0&&(n.z=Math.abs(n.z));const s=1e-7;n.x<s&&(n.x=s),n.y<s&&(n.y=s),n.z<s&&(n.z=s);const r=T.RAPIER_PHYSICS.MODULE.ColliderDesc.cuboid(n.x,n.y,n.z);this.createCollider(e,r)}async addSphereCollider(e){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){Ne&&console.warn("Physics are disabled");return}const t=T.RAPIER_PHYSICS.MODULE.ColliderDesc.ball(.5);this.createCollider(e,t),this.updateProperties(e)}async addCapsuleCollider(e,t,i){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){Ne&&console.warn("Physics are disabled");return}const n=e.gameObject.worldScale;n.x=Math.abs(n.x),n.y=Math.abs(n.y);const s=i*n.x;t=Math.max(t,s);const r=D.clamp(t*.5*n.y-i*n.x,0,Number.MAX_SAFE_INTEGER),a=T.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(r,s);this.createCollider(e,a)}async addMeshCollider(e,t,i,n){let s=t.geometry;if(!s){Ne&&console.warn("Missing mesh geometry",t.name);return}s.index?.array?.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),s=HP(s));let r=null;const a=s.getAttribute("position");if(a instanceof jb){const d=a.count;r=new Float32Array(d*3);for(let p=0;p<d;p++){const m=a.getX(p),f=a.getY(p),g=a.getZ(p);r[p*3]=m,r[p*3+1]=f,r[p*3+2]=g}}else r=a.array;if(await this.initialize(),!this.enabled){Ne&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const l=s.index?.array,c=e.gameObject.worldScale.clone();if(n&&c.multiply(n),Math.abs(c.x-1)>1e-4||Math.abs(c.y-1)>1e-4||Math.abs(c.z-1)>1e-4){const d=`${s.uuid}_${c.x}_${c.y}_${c.z}_${i}`;if(this._meshCache.has(d))Ne&&console.warn("Use cached mesh collider"),r=this._meshCache.get(d);else{(Ne||A())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${c.x}, ${c.y}, ${c.z})`);const p=new Float32Array(r.length);for(let m=0;m<r.length;m+=3)p[m]=r[m]*c.x,p[m+1]=r[m+1]*c.y,p[m+2]=r[m+2]*c.z;r=p,this._meshCache.set(d,p)}}const h=i?T.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(r):T.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(r,l);h&&this.createCollider(e,h)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,i=e[jt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case xt.Average:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&i.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case xt.Average:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[jt]:null}getComponent(e){return e?e[Mi]:null}createCollider(e,t){if(!this.world)throw new Error("Physics world not initialized");const i=this._tempMatrix;let n;e.attachedRigidbody?n=this.getRigidbody(e,this._tempMatrix):(Ne&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(_e(e.gameObject)),i.setPosition(ee(e.gameObject))),i.decompose(this._tempPosition,this._tempQuaternion,this._tempScale),this.tryApplyCenter(e,this._tempPosition),t.setTranslation(this._tempPosition.x,this._tempPosition.y,this._tempPosition.z),t.setRotation(this._tempQuaternion),t.setSensor(e.isTrigger);const s=e.sharedMaterial;if(s){if(s.bounciness!==void 0&&t.setRestitution(s.bounciness),s.bounceCombine!==void 0)switch(s.bounceCombine){case xt.Average:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(s.dynamicFriction!==void 0&&t.setFriction(s.dynamicFriction),s.frictionCombine!==void 0)switch(s.frictionCombine){case xt.Average:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case xt.Maximum:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case xt.Minimum:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case xt.Multiply:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}e.attachedRigidbody?.autoMass===!1&&(t.setDensity(1e-6),t.setMass(1e-6));try{const r=this.world.createCollider(t,n);return r[Mi]=e,e[jt]=r,r.setActiveEvents(T.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),r.setActiveCollisionTypes(T.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(r),this.updateColliderCollisionGroups(e),Ne&&console.log("Created collider",e.name,r),r}catch(r){return console.error('Error creating collider "'+e.name+`"
|
|
1651
|
+
Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[jt],i=e.membership;let n=0;if(i==null)n=65535;else for(let a=0;a<i.length;a++){const l=i[a];l>31?console.error(`Rapier only supports 32 layers, layer ${l} is not supported`):n|=1<<Math.floor(l)}const s=e.filter;let r=0;if(s==null)r=65535;else for(let a=0;a<s.length;a++){const l=s[a];l>31?console.error(`Rapier only supports 32 layers, layer ${l} is not supported`):r|=1<<Math.floor(l)}t.setCollisionGroups(n<<16|r)}getRigidbody(e,t){if(!this.world)throw new Error("Physics world not initialized");let i=null;if(e.attachedRigidbody){const n=e.attachedRigidbody;if(i=n[jt],!i){const s=n.isKinematic&&!_b;Ne&&console.log("Create rigidbody",s);const r=s?T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),a=ee(e.attachedRigidbody.gameObject);r.setTranslation(a.x,a.y,a.z),r.setRotation(_e(e.attachedRigidbody.gameObject)),r.centerOfMass=new T.RAPIER_PHYSICS.MODULE.Vector3(n.centerOfMass.x,n.centerOfMass.y,n.centerOfMass.z),i=this.world.createRigidBody(r),this.bodies.push(i),this.objects.push(n)}i[Mi]=n,n[jt]=i,this.internalUpdateRigidbodyProperties(n,i),this.getRigidbodyRelativeMatrix(e.gameObject,n.gameObject,t),e[HS]=i}else{const n=T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),s=ee(e.gameObject);n.setTranslation(s.x,s.y,s.z),n.setRotation(_e(e.gameObject)),i=this.world.createRigidBody(n),t.identity(),i[Mi]=null}return i}internal_getRigidbody(e){return e.isCollider===!0?e[HS]:e[jt]}internalUpdateColliderProperties(e,t){const i=t.shape;let n=!1;switch(i.type){case T.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const p=i,m=e,f=e.gameObject,g=Ge(f,this._tempPosition),y=Math.abs(m.radius*g.x);n=p.radius!==y,p.radius=y,n&&t.setShape(p);break}case T.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const s=i,r=e,a=e.gameObject,l=Ge(a,this._tempPosition),c=Math.abs(r.size.x*.5*l.x),h=Math.abs(r.size.y*.5*l.y),d=Math.abs(r.size.z*.5*l.z);n=s.halfExtents.x!==c||s.halfExtents.y!==h||s.halfExtents.z!==d,s.halfExtents.x=c,s.halfExtents.y=h,s.halfExtents.z=d,n&&t.setShape(s);break}if(n){const s=e.attachedRigidbody;s?.autoMass&&this.getBody(s)?.recomputeMassPropertiesFromColliders()}this.updateColliderCollisionGroups(e),e.isTrigger!==t.isSensor()&&t.setSensor(e.isTrigger)}internalUpdateRigidbodyProperties(e,t){if(t.enableCcd(e.collisionDetectionMode!==Qu.Discrete),t.setLinearDamping(e.drag),t.setAngularDamping(e.angularDrag),t.setGravityScale(e.useGravity?e.gravityScale:0,!0),e.dominanceGroup<=127&&e.dominanceGroup>=-127?t.setDominanceGroup(Math.floor(e.dominanceGroup)):t.setDominanceGroup(0),e.autoMass){t.setAdditionalMass(0,!1);for(let i=0;i<t.numColliders();i++)t.collider(i).setDensity(1);t.recomputeMassPropertiesFromColliders()}else{t.setAdditionalMass(e.mass,!1);for(let i=0;i<t.numColliders();i++)t.collider(i).setDensity(1e-7);t.recomputeMassPropertiesFromColliders()}t.setEnabledRotations(!e.lockRotationX,!e.lockRotationY,!e.lockRotationZ,!1),t.setEnabledTranslations(!e.lockPositionX,!e.lockPositionY,!e.lockPositionZ,!1),e.isKinematic?t.setBodyType(T.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(T.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}lines;disabledLines;step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new T.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else if(e!==void 0){const t=D.lerp(this.world.timestep,e,.8);this.world.timestep=t}try{this.world.step(this.eventQueue)}catch(t){console.warn("Error running physics step",{timestep:this.world.timestep},t)}this._isUpdatingPhysicsWorld=!1}}postStep(){this.world&&this.enabled&&(this._isUpdatingPhysicsWorld=!0,this.syncObjects(),this._isUpdatingPhysicsWorld=!1,this.eventQueue&&!this.collisionHandler&&(this.collisionHandler=new DD(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){if(Ne||_b||LD||this.debugRenderColliders===!0){if(!this.lines){const n=new zd({color:7855479,fog:!1}),s=new Ji;this.lines=new Nm(s,n),this.lines.layers.disableAll(),this.lines.layers.enable(2)}if(!this.disabledLines){const n=new zd({color:14514039,fog:!1}),s=new Ji;this.disabledLines=new Nm(s,n),this.disabledLines.layers.disableAll(),this.disabledLines.layers.enable(2)}this.lines.parent!==this.context?.scene&&this.context?.scene.add(this.lines),this.disabledLines.parent!==this.context?.scene&&this.context?.scene.add(this.disabledLines);const t=e.debugRender(void 0,n=>n.isEnabled());this.lines.geometry.setAttribute("position",new tt(t.vertices,3)),this.lines.geometry.setAttribute("color",new tt(t.colors,4));const i=e.debugRender(void 0,n=>!n.isEnabled());this.disabledLines.geometry.setAttribute("position",new tt(i.vertices,3)),this.disabledLines.geometry.setAttribute("color",new tt(i.colors,4)),this.disabledLines.visible=i.vertices.length>0,(this.context.time.frame%30===0||this.lines.geometry.boundingSphere?.radius===0)&&(this.lines.geometry.computeBoundingSphere(),this.disabledLines.geometry.computeBoundingSphere())}else this.lines&&this.context?.scene.remove(this.lines),this.disabledLines&&this.context?.scene.remove(this.disabledLines)}syncObjects(){if(!_b)for(let e=0;e<this.bodies.length;e++){const t=this.objects[e],i=this.bodies[e],n=t;if(n?.isCollider===!0&&!n.attachedRigidbody){const l=i.parent();l?this.syncPhysicsBody(t.gameObject,l,!0,!0):this.syncPhysicsBody(t.gameObject,i,!0,!0);continue}const s=i.translation(),r=i.rotation();if(Number.isNaN(s.x)||Number.isNaN(r.x)){!n.__COLLIDER_NAN&&A()&&(console.warn("Collider has NaN values",n.name,n.gameObject,i),n.__COLLIDER_NAN=!0);continue}const a=t.center;if(a&&a.isVector3){this._tempQuaternion.set(r.x,r.y,r.z,r.w);const l=this._tempPosition.copy(a).applyQuaternion(this._tempQuaternion),c=Ge(t.gameObject);l.multiply(c),s.x-=l.x,s.y-=l.y,s.z-=l.z}Pr(t.gameObject,s.x,s.y,s.z),Sg(t.gameObject,r.x,r.y,r.z,r.w)}}syncPhysicsBody(e,t,i,n){if(t instanceof T.RAPIER_PHYSICS.MODULE.RigidBody){const s=ee(e,this._tempPosition),r=_e(e,this._tempQuaternion);switch(t.bodyType()){case T.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case T.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case T.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicVelocityBased:i&&t.setNextKinematicTranslation(s),n&&t.setNextKinematicRotation(r);break;default:i&&t.setTranslation(s,!1),n&&t.setRotation(r,!1);break}}else if(t instanceof T.RAPIER_PHYSICS.MODULE.Collider){e.matrixWorldNeedsUpdate&&e.updateWorldMatrix(!0,!1),e.matrixWorld.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const s=this._tempPosition,r=this._tempQuaternion,a=t[Mi];if(this.tryApplyCenter(a,s),i){const l=t.translation();(l.x!==s.x||l.y!==s.y||l.z!==s.z)&&t.setTranslation(s)}if(n){const l=t.rotation();(l.x!==r.x||l.y!==r.y||l.z!==r.z||l.w!==r.w)&&t.setRotation(r)}}}_tempCenterPos=new b;_tempCenterVec=new b;_tempCenterQuaternion=new N;tryApplyCenter(e,t){const i=e.center;i&&e.gameObject&&(i.x!==0||i.y!==0||i.z!==0)&&(this._tempCenterPos.x=i.x,this._tempCenterPos.y=i.y,this._tempCenterPos.z=i.z,Ge(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(_e(e.gameObject,this._tempCenterQuaternion),this._tempCenterPos.applyQuaternion(this._tempCenterQuaternion)),t.x+=this._tempCenterPos.x,t.y+=this._tempCenterPos.y,t.z+=this._tempCenterPos.z)}static _matricesBuffer=[];getRigidbodyRelativeMatrix(e,t,i,n){if(n===void 0&&(n=gc._matricesBuffer,n.length=0),e===t){const s=Ge(e,this._tempPosition);i.makeScale(s.x,s.y,s.z);for(let r=n.length-1;r>=0;r--)i.multiply(n[r]);return i}return n.push(e.matrix),e.parent&&this.getRigidbodyRelativeMatrix(e.parent,t,i,n),i}static centerConnectionPos={x:0,y:0,z:0};static centerConnectionRot={x:0,y:0,z:0,w:1};addFixedJoint(e,t){if(!this.world){console.error("Physics world not initialized");return}const i=e[jt],n=t[jt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const s=T.RAPIER_PHYSICS.MODULE.JointData.fixed(gc.centerConnectionPos,gc.centerConnectionRot,this._tempPosition,this._tempQuaternion),r=this.world.createImpulseJoint(s,i,n,!0);Ne&&console.log("ADD FIXED JOINT",r)}addHingeJoint(e,t,i,n){if(!this.world){console.error("Physics world not initialized");return}const s=e[jt],r=t[jt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const a=T.RAPIER_PHYSICS.MODULE.JointData.revolute(i,this._tempPosition,n),l=this.world.createImpulseJoint(a,s,r,!0);Ne&&console.log("ADD HINGE JOINT",l)}calculateJointRelativeMatrices(e,t,i){e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);const n=e.matrixWorld,s=t.matrixWorld;n.elements[0]=1,n.elements[5]=1,n.elements[10]=1,s.elements[0]=1,s.elements[5]=1,s.elements[10]=1,i.copy(s).premultiply(n.invert()).invert()}}class DD{world;eventQueue;constructor(e,t){this.world=e,this.eventQueue=t}activeCollisions=[];activeCollisionsStay=[];activeTriggers=[];handleCollisionEvents(){this.eventQueue&&this.world&&this.eventQueue.drainCollisionEvents((e,t,i)=>{const n=this.world.getCollider(e),s=this.world.getCollider(t);if(!n||!s)return;const r=n[Mi],a=s[Mi];vb&&console.log("EVT",r.name,a.name,i,n,s),r&&a&&(i?(this.onCollisionStarted(r,n,a,s),this.onCollisionStarted(a,s,r,n)):(this.onCollisionEnded(r,a),this.onCollisionEnded(a,r)))})}update(){this.onHandleCollisionStay()}onCollisionStarted(e,t,i,n){let s=null;if(e.isTrigger||i.isTrigger)zr(e.gameObject,r=>{r.onTriggerEnter&&!r.destroyed&&r.onTriggerEnter(i),this.activeTriggers.push({collider:e,component:r,otherCollider:i})});else{const r=e.gameObject;this.world.contactPair(t,n,(a,l)=>{zr(r,c=>{if(c.destroyed)return;const h=c.onCollisionEnter||c.onCollisionStay||c.onCollisionExit;if(h||vb){if(!s){const d=[],p=a.normal();i instanceof Us&&i.convex&&(p.x=-p.x,p.y=-p.y,p.z=-p.z);for(let m=0;m<a.numSolverContacts();m++){const f=a.solverContactPoint(m),g=a.contactImpulse(m);if(f){const y=a.contactDist(m),_=a.solverContactFriction(m),v=a.solverContactTangentVelocity(m),C=new rv(f,y,p,g,_,v);d.push(C),vb&&B.DrawDirection(f,p,16711680,3,!0)}}s=new av(r,i,d)}if(h){const d={collider:e,component:c,collision:s};this.activeCollisions.push(d),c.onCollisionStay&&this.activeCollisionsStay.push(d),c.onCollisionEnter?.call(c,s)}}})})}}onHandleCollisionStay(){for(const e of this.activeCollisionsStay){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onCollisionStay){if(e.collision.collider.destroyed)continue;const i=e.collision;t.onCollisionStay(i)}}for(const e of this.activeTriggers){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onTriggerStay){const i=e.otherCollider;if(i.destroyed)continue;t.onTriggerStay(i)}}}onCollisionEnded(e,t){if(!(e.destroyed||t.destroyed)){for(let i=0;i<this.activeCollisions.length;i++){const n=this.activeCollisions[i],s=n.collider;if(s.destroyed||n.collision.collider.destroyed){this.activeCollisions.splice(i,1),i--;continue}if(s===e&&n.collision.collider===t){const r=n.component;if(this.activeCollisions.splice(i,1),i--,r.activeAndEnabled&&r.onCollisionExit){const a=n.collision;r.onCollisionExit(a)}}}for(let i=0;i<this.activeCollisionsStay.length;i++){const n=this.activeCollisionsStay[i],s=n.collider;if(s.destroyed||n.collision.collider.destroyed){this.activeCollisionsStay.splice(i,1),i--;continue}if(s===e&&n.collision.collider===t){const r=n.component;if(this.activeCollisionsStay.splice(i,1),i--,r.activeAndEnabled&&r.onCollisionExit){const a=n.collision;r.onCollisionExit(a)}}}for(let i=0;i<this.activeTriggers.length;i++){const n=this.activeTriggers[i],s=n.collider;if(s.destroyed||n.otherCollider.destroyed){this.activeTriggers.splice(i,1),i--;continue}if(s===e&&n.otherCollider===t){const r=n.component;if(this.activeTriggers.splice(i,1),i--,r.activeAndEnabled&&r.onTriggerExit){const a=n.otherCollider;r.onTriggerExit(a)}}}}}}let wb=0;function GS(o){o?wb++:wb--}function jD(){return wb>0}const BD={binary:!0,animations:!0};async function FD(o){if(!o.context)throw new Error("No context provided to exportAsGLTF");o.scene||(o.scene=o.context.scene);const e={...BD,...o},{context:t}=e,i=new Zb;i.register(a=>new h1(a)),i.register(a=>new vA(a)),i.register(a=>new u1(a)),Ey(i,e.context);const n={binary:e.binary,animations:zD(t,e.scene,[])},s=new UD;console.debug("Exporting GLTF",n),s.onBeforeExport(e),GS(!0);const r=await i.parseAsync(e.scene,n).catch(a=>(console.error(a),null));if(GS(!1),s.onAfterExport(e),!r)throw new Error("Failed to export GLTF");if(e.downloadAs!=null){let a=null;if(r instanceof ArrayBuffer?a=new Blob([r],{type:"application/octet-stream"}):console.error("Can not download GLTF as a blob",r),a){const l=URL.createObjectURL(a),c=document.createElement("a");c.href=l;let h=e.downloadAs;!h.endsWith(".glb")&&!h.endsWith(".gltf")&&(h+=e.binary?".glb":".gltf"),c.download=h,c.click()}}return r}const qS=Symbol("needle:weight");class UD{_undo=[];onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const i=mi.tryGetActionsFromMixer(t);if(i)for(let n=0;n<i.length;n++){const s=i[n];s[qS]=s.weight,s.weight=0,this._undo.push(()=>{s.weight=s[qS]})}t.update(0)}),e.context.scene.traverse(t=>{if(!jy(t)){const i=t.parent;i&&(t.removeFromParent(),this._undo.push(()=>i.add(t)))}})}onAfterExport(e){this._undo.forEach(t=>t()),this._undo.length=0}}function zD(o,e,t){o.animations.mixers.forEach(n=>{const s=mi.tryGetActionsFromMixer(n);if(s)for(let r=0;r<s.length;r++){const a=s[r].getClip();t.push(a)}}),Array.isArray(e)||(e=[e]);for(const n of e)mi.tryGetAnimationClipsFromObjectHierarchy(n,t);const i=new Set(t);return Array.from(i)}const bd=w("debugavatar");class xb{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(s=>s.layers.set(2))}}class XS{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const s=new qn;i=x.instantiate(za(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(bd&&console.log("[Custom Avatar] valid config",t,bd?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,bd?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(bd&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let s=null;if(n.ok){const r=await n.blob();r&&(s=await r.arrayBuffer())}return s?(await Mn().parseSync(e,s,null,0))?.scene??null:null}const i=new Do;return r0(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await Mn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{bd&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const s=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const a=new b;new Nt().setFromObject(n).getSize(a);const l=Math.max(a.x,a.y,a.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+l+" meters! Should be < 0.3m"),l>.3&&n.scale.multiplyScalar(1/l*.3)}return new xb(t,n,s,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const s of t){if(!n)break;i.indexOf(s)===-1&&(n=!1)}if(n)return e;if(e.children)for(const s of e.children){const r=this.findAvatarPart(s,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class QS{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const Ei=w("debugpost"),Sb=Symbol("needle:postprocessing-handler"),_d=Symbol("needle:previous-autoclear-state"),vd=Symbol("needle:previous-tone-mapping");class fc{_composer=null;_lastVolumeComponents;_effects=[];getEffectIsActive(e){return e?this._isActive&&this._effects.some(t=>t.effect===e):!1}get isActive(){return this._isActive}get composer(){return this._composer}_isActive=!1;context;constructor(e){this.context=e}apply(e){return this._isActive=!0,this.onApply(this.context,e)}unapply(e=!0){if(Ei&&console.log("Unapplying postprocessing effects"),this._isActive=!1,this._lastVolumeComponents){for(const i of this._lastVolumeComponents)i.unapply();this._lastVolumeComponents.length=0}const t=this.context;t[Sb]===this&&(delete t[Sb],typeof t.renderer[_d]=="boolean"&&(t.renderer.autoClear=t.renderer[_d]),typeof t.renderer[vd]=="number"&&(t.renderer.toneMapping=t.renderer[vd])),this._composer?.removeAllPasses(),e&&this._composer?.dispose(),t.composer===this._composer&&(t.composer=null),this._adaptiveDPR_OverrideActive&&(this._adaptiveDPR_OverrideActive=!1,t.devicePixelRatio="auto"),this.handleDevicePixelRatio()}dispose(){this.unapply(!0);for(const e of this._effects)e.effect.dispose();this._effects.length=0,this._composer=null}async onApply(e,t){if(!t)return;await Promise.all([T.POSTPROCESSING.load(),T.POSTPROCESSING_AO.load()]),e[Sb]=this,Ei&&console.log("Apply Postprocessing Effects",t),this._lastVolumeComponents=[...t],this._effects.length=0;const i={handler:this,components:this._lastVolumeComponents};for(let n=0;n<this._lastVolumeComponents.length;n++){const s=this._lastVolumeComponents[n];if(s.context=e,s.apply){if(s.active){let r=function(c,h){return h?(h instanceof T.POSTPROCESSING.MODULE.Effect||h instanceof T.POSTPROCESSING.MODULE.Pass||console.warn(`PostprocessingEffect ${c} created neither Effect nor Pass - this might be caused by a bundler error or false import. Below you find some possible solutions:
|
|
1652
|
+
- If you create custom effect try creating it like this: 'new NEEDLE_ENGINE_MODULES.POSTPROCESSING.MODULE.Effect(...)' instead of 'new Effect(...)'`),!0):!1};if(!e.mainCameraComponent){console.error("No camera in scene found or available yet - can not create postprocessing effects");return}const a=s.apply(i);if(!a)continue;const l=s.typeName||s.constructor.name;if(Array.isArray(a))for(const c of a)r(l,c)&&this._effects.push({effect:c,typeName:s.typeName,priority:s.order});else{if(!r(l,a))continue;this._effects.push({effect:a,typeName:s.typeName,priority:s.order})}}}else s.active&&be("Volume component is not a VolumeComponent: "+s.__type)}this.applyEffects(e)}_anyPassHasDepth=!1;_anyPassHasNormal=!1;_hasSmaaEffect=!1;get anyPassHasDepth(){return this._anyPassHasDepth}get anyPassHasNormal(){return this._anyPassHasNormal}get hasSmaaEffect(){return this._hasSmaaEffect}_customInputBuffer=null;_customInputBufferId=0;_multisampling=0;set multisampling(e){this._multisampling=e}get multisampling(){return this._multisampling}static _dprStep=.2;static _dprMinDelay=2;_adaptiveDPR_Enabled=!1;_adaptiveDPR_LastChangeTime=0;_adaptiveDPR_LastDecreaseTime=0;_adaptiveDPR_OverrideActive=!1;set adaptivePixelRatio(e){this._adaptiveDPR_Enabled=e,!e&&this._adaptiveDPR_OverrideActive&&(this._adaptiveDPR_OverrideActive=!1,this.context.devicePixelRatio="auto")}get adaptivePixelRatio(){return this._adaptiveDPR_Enabled}updateAdaptivePixelRatio(){if(!this._adaptiveDPR_Enabled||!this._isActive)return;if(!this._adaptiveDPR_OverrideActive&&this.context.devicePixelRatio!=="auto"){Ei&&console.debug(`[PostProcessing] Adaptive DPR skipped: devicePixelRatio is "${this.context.devicePixelRatio}", not "auto"`);return}const e=this.context.time,t=e.realtimeSinceStartup,i=t-this._adaptiveDPR_LastChangeTime;if(t<3||i<fc._dprMinDelay)return;const n=Math.min(2,window.devicePixelRatio),s=this.context.renderer.getPixelRatio(),r=fc._dprStep,a=1;if(e.smoothedFps<=50&&s>a){const l=Math.max(a,Math.round((s-r)*10)/10);l<s&&(this._adaptiveDPR_LastChangeTime=t,this._adaptiveDPR_LastDecreaseTime=t,!this._adaptiveDPR_OverrideActive&&(Ei||A())&&console.log(`[PostProcessing] Adaptively reducing pixel ratio for better performance (${s.toFixed(1)} \u2192 ${l}). Set context.devicePixelRatio to a fixed number to disable.`),this._adaptiveDPR_OverrideActive=!0,this.context.devicePixelRatio=l,Ei&&console.debug(`[PostProcessing] Reduced pixel ratio from ${s.toFixed(1)} to ${l}`))}else if(e.smoothedFps>=59&&i>1&&t-this._adaptiveDPR_LastDecreaseTime>10&&s<n){const l=Math.min(n,Math.round((s+r)*10)/10);l>s?(this._adaptiveDPR_LastChangeTime=t,this.context.devicePixelRatio=l,Ei&&console.debug(`[PostProcessing] Increased pixel ratio from ${s.toFixed(1)} to ${l}`)):this._adaptiveDPR_OverrideActive&&(this._adaptiveDPR_OverrideActive=!1,this._adaptiveDPR_LastChangeTime=t,this.context.devicePixelRatio="auto",Ei&&console.debug("[PostProcessing] Restored pixel ratio to auto"))}}applyEffects(e){if(this._anyPassHasDepth=!1,this._anyPassHasNormal=!1,this._hasSmaaEffect=!1,this._effects.length<=0)return;const t=e.mainCameraComponent,i=e.renderer,n=e.scene,s=t.threeCamera;if(typeof i[_d]=="boolean"&&(i.autoClear=i[_d]),i[_d]=i.autoClear,typeof i[vd]=="number"&&(i.toneMapping=i[vd]),i[vd]=i.toneMapping,i.toneMapping!=Fd&&!this._effects.find(d=>d instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect)){const d=new T.POSTPROCESSING.MODULE.ToneMappingEffect;d.name=`ToneMapping (${i.toneMapping})`,d.mode=lm(i.toneMapping),this._effects.push({typeName:"ToneMapping",effect:d,priority:mt.ToneMapping})}this._composer||(this._composer=new T.POSTPROCESSING.MODULE.EffectComposer(i,{frameBufferType:Xm,stencilBuffer:!0})),e.composer&&e.composer!==this._composer&&console.warn("There's already an active EffectComposer in your scene: replacing it with a new one. This might cause unexpected behaviour. Make sure to only use one PostprocessingManager/Volume in your scene."),e.composer=this._composer;const r=e.composer;r.setMainCamera(s),r.setRenderer(i),r.setMainScene(n),r.autoRenderToScreen=!0,r.multisampling=0;for(const d of r.passes)d.dispose();r.removeAllPasses();const a=new T.POSTPROCESSING.MODULE.RenderPass(n,s);a.name="RenderPass",a.mainScene=n,r.addPass(a);const l=a.render;this._customInputBuffer?.dispose(),this._customInputBuffer=null,a.render=(d,p,m,f,g)=>{if(p){if(this._multisampling<=0){l.call(a,d,p,m,f,g);return}p.samples=0,m&&(m.samples=0),(!this._customInputBuffer||this._customInputBuffer.width!==p.width||this._customInputBuffer.height!==p.height||this._customInputBuffer.samples!==this._multisampling||this._customInputBuffer.texture.format!==p.texture.format||this._customInputBuffer.texture.type!==Xm)&&(this._customInputBuffer?.dispose(),this._customInputBuffer=new Qn(p.width,p.height,{format:p.texture.format,type:Xm,depthBuffer:p.depthBuffer,depthTexture:p.depthTexture?new Lb(p.width,p.height):void 0,stencilBuffer:p.stencilBuffer,samples:Math.max(0,this._multisampling),minFilter:p.texture.minFilter??Vd,magFilter:p.texture.magFilter??Vd,generateMipmaps:p.texture.generateMipmaps}),this._customInputBufferId++,this._customInputBuffer.texture.name=`CustomInputBuffer-${this._customInputBufferId}`,this._customInputBuffer.depthTexture&&p.depthTexture&&(this._customInputBuffer.depthTexture.format=p.depthTexture.format,this._customInputBuffer.depthTexture.type=p.depthTexture.type),Ei&&console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`)),l.call(a,d,this._customInputBuffer,m,f,g),d.setRenderTarget(p),gr.blit(this._customInputBuffer.texture,p,{renderer:d,depthTexture:this._customInputBuffer.depthTexture,depthWrite:!0,depthTest:!0})}};try{FI(this._effects);let d=!1,p=null;for(let g=this._effects.length-1;g>=0;g--){const y=this._effects[g].effect;if(y instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect){if(d){Ei&&console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${y.name} and ${p?.name}. Only the last one added will be used.`),this._effects.splice(g,1);continue}p=y,d=!0}}const m=[];let f=!1;for(let g=0;g<this._effects.length;g++){const y=this._effects[g].effect;if(y instanceof T.POSTPROCESSING.MODULE.SMAAEffect?this._hasSmaaEffect=!0:y instanceof T.POSTPROCESSING.MODULE.NormalPass&&(this._anyPassHasNormal=!0),!(y instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect&&p!==y))if(y instanceof T.POSTPROCESSING.MODULE.Effect){const _=y.getAttributes(),v=T.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;_&v&&(Ei&&console.log("[PostProcessing] Convolution effect: "+y.name),f&&(Ei&&console.log("[PostProcessing] \u2192 Merging effects ["+m.map(C=>C.name).join(", ")+"]"),this.createPassForMergeableEffects(m,r,s,n)),f=!0),m.push(y)}else y instanceof T.POSTPROCESSING.MODULE.Pass?(f=!1,this.createPassForMergeableEffects(m,r,s,n),y.renderToScreen=!1,r.addPass(y)):(f=!1,this.createPassForMergeableEffects(m,r,s,n),r.addPass(y))}this.createPassForMergeableEffects(m,r,s,n)}catch(d){console.error("Error while applying postprocessing effects",d),r.passes.forEach(p=>p.dispose()),r.removeAllPasses()}let c=!1;for(let d=r.passes.length-1;d>=0;d--){const p=r.passes[d];let m=!1,f=!1;p.enabled&&(c||(m=!0,f=!0),c=!0),p.renderToScreen=f,p?.configuration!==void 0?p.configuration.gammaCorrection=m:"autosetGamma"in p&&(p.autosetGamma=m),this._anyPassHasDepth||=p.needsDepthTexture}const h=r.depthTexture;h&&(h.source=new xP({width:0,height:0}),h.needsUpdate=!0),this.handleDevicePixelRatio(),Ei&&console.log("[PostProcessing] Passes \u2192",[...r.passes],`
|
|
1653
|
+
---------------------------------
|
|
1654
|
+
\u2022 `+r.passes.map(d=>d.name||d.constructor.name+"*").join(`
|
|
1655
|
+
\u2022 `)+`
|
|
1656
|
+
`),Ei&&this._onCreateEffectsDebug(this._composer,s)}createPassForMergeableEffects(e,t,i,n){if(e.length>0){const s=new T.POSTPROCESSING.MODULE.EffectPass(i,...e);s.name=e.map(r=>r.name).join(", "),s.mainScene=n,s.enabled=!0,s.renderToScreen=!1,t.addPass(s),e.length=0}}handleDevicePixelRatio(){typeof this.context.devicePixelRatio=="number"&&this.context.requestSizeUpdate()}_menuEntry=null;_passIndices=null;_onCreateEffectsDebug(e,t){if(Ei==="passes"){const i=new T.POSTPROCESSING.MODULE.DepthEffect({blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.NORMAL,inverted:!0});i.name="Depth Effect";const n=new T.POSTPROCESSING.MODULE.EffectPass(t,i);if(n.name="Depth Effect Pass",n.enabled=!1,e.passes.push(n),this._passIndices!==null){const r=[e.passes[0]];this._passIndices.length>0&&r.push(...this._passIndices.filter(a=>a!==0).map(a=>e.passes[a]).filter(a=>a)),r.length>0&&console.log("[PostProcessing] Passes (selected) \u2192",r),e.passes.length=0;for(const a of r)a.enabled=!0,a.renderToScreen=!1,e.addPass(a)}const s=this.context.menu;if(s&&this._passIndices===null){this._menuEntry&&this._menuEntry.remove();const r=document.createElement("select");r.multiple=!0;const a=document.createElement("option");a.innerText="Final Output",a.value="-1",r.appendChild(a);for(const l of e.passes){const c=document.createElement("option");c.innerText=l.name,c.value=`${e.passes.indexOf(l)}`,c.title=l.name,r.appendChild(c)}s.appendChild(r),this._menuEntry=r,r.addEventListener("change",()=>{const l=Array.from(r.selectedOptions).map(c=>parseInt(c.value));l.length===1&&l[0]===-1?this._passIndices=null:this._passIndices=l,this.applyEffects(this.context)})}}}}const ND=Object.freeze(Object.defineProperty({__proto__:null,PostProcessingHandler:fc},Symbol.toStringTag,{value:"Module"}));class YS{}const WD=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:fe,ActionCollection:D1,ActionModel:Ri,AlignmentConstraint:gh,Animation:Vt,AnimationCurve:Fh,AnimationExtension:Dp,AnimationTrackHandler:hh,Animator:wt,AnimatorController:Zi,Antialiasing:Wh,Attractor:Yl,AudioExtension:ka,AudioListener:Go,AudioSource:Ni,AudioTrackHandler:_s,Avatar:Hs,AvatarBlink_Simple:Zr,AvatarEyeLook_Rotation:hy,AvatarLoader:XS,AvatarMarker:Le,AvatarModel:xb,Avatar_Brain_LookAt:fh,Avatar_MouthShapes:yh,Avatar_MustacheShake:ly,Avatar_POI:Yr,AxesHelper:vl,BaseUIComponent:bn,BasicIKConstraint:uy,BehaviorExtension:l0,BehaviorModel:Ut,BloomEffect:am,BoxCollider:dp,BoxGizmo:ha,BoxHelperComponent:zt,Button:cs,CallInfo:Ho,Camera:wi,CameraTargetReachedEvent:ah,Canvas:Wl,CanvasGroup:Zs,CapsuleCollider:qo,ChangeMaterialOnClick:Yy,ChangeTransformOnClick:ra,CharacterController:Kr,CharacterControllerInput:Qo,ChromaticAberration:Vh,ClickThrough:xm,ColorAdjustments:or,ColorBySpeedModule:Xl,ColorOverLifetimeModule:em,ContactShadows:_h,ControlTrackHandler:np,CursorFollow:xa,CustomBranding:ca,Deletable:yy,DeleteBox:yr,DepthOfField:Wn,DeviceFlag:up,DocumentExtension:QS,DragControls:ta,DropListener:Jo,Duplicatable:Iy,EffectWrapper:Hh,EmissionModule:rs,EmphasizeOnClick:Ll,EnvironmentScene:op,EventList:ae,EventListEvent:Hu,EventSystem:ci,EventTrigger:Pp,FieldWithDefault:c1,FixedJoint:k0,Fog:Vl,GltfExport:Uy,GltfExportBox:By,Gradient:ua,Graphic:Lh,GraphicRaycaster:Zu,GridHelper:$l,GridLayoutGroup:b0,GroundProjectedEnv:so,GroupActionModel:sa,HideOnStart:wn,HingeJoint:Bh,HorizontalLayoutGroup:y0,get HoverAnimation(){return So},Image:tc,InheritVelocityModule:L0,InputField:nb,InstanceHandle:Aa,InstancingHandler:Ma,Interactable:fy,Keyframe:Oi,LODGroup:qp,LODModel:Gl,Light:Lt,LimitVelocityOverLifetimeModule:pt,LogStats:gy,LookAt:ob,LookAtConstraint:Gr,MainModule:Yt,MarkerTrackHandler:ip,MaskableGraphic:Dh,MeshCollider:Us,MeshRenderer:xh,MinMaxCurve:Y,MinMaxGradient:pa,NeedleMenu:yo,NestedGltf:ql,Networking:T0,NoiseModule:ve,ObjectRaycaster:an,OffsetConstraint:da,OpenURL:ic,OrbitControls:me,Outline:zl,Padding:la,ParticleBurst:Jp,ParticleSubEmitter:D0,ParticleSystem:Nh,ParticleSystemRenderer:mn,PhysicsExtension:c0,PixelationEffect:Gh,PlayAnimationOnClick:Ph,PlayAudioOnClick:$s,PlayableDirector:yl,PlayerColor:pc,PointerEventData:kd,PostProcessingHandler:fc,PreliminaryAction:Dl,PreliminaryTrigger:Oh,RawImage:_m,Rect:G1,RectTransform:zn,ReflectionProbe:Zo,RegisteredAnimationInfo:br,RemoteSkybox:lp,Renderer:oi,RendererLightmap:Ry,Rigidbody:Je,RotationBySpeedModule:pn,RotationOverLifetimeModule:Nn,SceneSwitcher:et,ScreenCapture:sr,ScreenSpaceAmbientOcclusion:as,ScreenSpaceAmbientOcclusionN8:Vn,ScrollFollow:hs,SeeThrough:ls,SetActiveOnClick:Zy,ShadowCatcher:Yh,ShapeModule:I0,SharpeningEffect:Xh,SignalAsset:tp,SignalReceiver:ch,SignalReceiverEvent:lh,SignalTrackHandler:dh,Size:H1,SizeBySpeedModule:ki,SizeOverLifetimeModule:ma,SkinnedMeshRenderer:Ty,SmoothFollow:pm,SpatialGrabRaycaster:Oa,SpatialHtml:td,SpatialTrigger:mm,SpatialTriggerReceiver:wo,SpectatorCamera:gm,SphereCollider:wl,SplineContainer:_a,SplineData:xo,SplineWalker:fn,Sprite:ts,SpriteData:Bl,SpriteRenderer:Si,SpriteSheet:jl,SubEmitterSystem:om,SyncedCamera:Z0,SyncedRoom:$n,SyncedTransform:Ln,TapGestureTrigger:Jy,TeleportTarget:Np,TestRunner:eb,TestSimulateUserData:tb,Text:Qt,TextBuilder:g0,TextExtension:Hp,TextureSheetAnimationModule:Zt,TiltShiftEffect:vo,ToneMappingEffect:nr,TrailModule:Ue,TransformData:Ve,TransformGizmo:va,TriggerBuilder:qt,TriggerModel:pr,UIRaycastUtils:Qf,UIRootComponent:Th,USDZExporter:_o,USDZText:Nl,USDZUIExtension:w0,UsageMarker:vh,VariantAction:Xy,VelocityOverLifetimeModule:Xe,VerticalLayoutGroup:f0,VideoPlayer:gt,get ViewBox(){return lt},Vignette:ba,VisibilityAction:kh,Voip:Fn,Volume:Kl,VolumeParameter:U,VolumeProfile:sm,WebARCameraBackground:rd,WebARSessionRoot:xn,WebXR:Wp,WebXRImageTracking:ld,WebXRImageTrackingModel:us,WebXRPlaneTracking:ps,WebXRTrackedImage:mc,XRControllerFollow:ds,XRControllerModel:is,XRControllerMovement:$i,XRFlag:cn,XRRig:Om,XRState:li,__Ignore:YS},Symbol.toStringTag,{value:"Module"}));var Cb;(o=>{function e(t,i=!1,n=.75){const s=new _a,r=1-D.clamp(n,0,1);return t.forEach((a,l)=>{const c=new b;l<t.length-1?c.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&c.subVectors(t[0],a).normalize().multiplyScalar(r);const h=new xo;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(Cb||(Cb={}));class VD extends iO{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-DiCnZlf3.js",import.meta.url).toString()}';`],{type:"text/javascript"})),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,s)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=c=>{s(new Error(`[GenerateMeshBVHWorker] ${c.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=c=>{const{data:h}=c;if(h.error)s(new Error(h.error)),e.onmessage=null;else if(h.serialized){const{serialized:d,position:p}=h,m=nO.deserialize(d,t,{setIndex:!1}),f=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,d.index)if(t.index)t.index.array=d.index;else{const g=new tt(d.index,1,!1);t.setIndex(g)}f.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new Nt)),i.onProgress&&i.onProgress(h.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(h.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(c=>c.buffer).filter(c=>typeof SharedArrayBuffer>"u"||!(c instanceof SharedArrayBuffer)))})}}const $D=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:VD},Symbol.toStringTag,{value:"Module"}));export{Lg as $componentName,zk as $physicsKey,fe as ActionBuilder,D1 as ActionCollection,Ri as ActionModel,Bv as Addressables,gh as AlignmentConstraint,tl as AmbientMode,Vt as Animation,Fh as AnimationCurve,Dp as AnimationExtension,hh as AnimationTrackHandler,mi as AnimationUtils,wt as Animator,_i as AnimatorConditionMode,Zi as AnimatorController,mx as AnimatorControllerBuilder,Hr as AnimatorControllerParameterType,th as AnimatorStateInfo,Wh as Antialiasing,Gn as Application,Lw as AssetDatabase,ne as AssetReference,Yl as Attractor,ka as AudioExtension,Go as AudioListener,Ni as AudioSource,_s as AudioTrackHandler,Hs as Avatar,Zr as AvatarBlink_Simple,hy as AvatarEyeLook_Rotation,XS as AvatarLoader,Le as AvatarMarker,xb as AvatarModel,fh as Avatar_Brain_LookAt,yh as Avatar_MouthShapes,ly as Avatar_MustacheShake,Yr as Avatar_POI,ml as Axes,vl as AxesHelper,Mc as BUILD_TIME,bn as BaseUIComponent,uy as BasicIKConstraint,l0 as BehaviorExtension,Ut as BehaviorModel,Tr as BlobStorage,am as BloomEffect,dp as BoxCollider,ha as BoxGizmo,zt as BoxHelperComponent,cs as Button,_n as ButtonsFactory,Dx as CallDirection,Ho as CallInfo,wi as Camera,ah as CameraTargetReachedEvent,Wl as Canvas,Zs as CanvasGroup,qo as CapsuleCollider,Yy as ChangeMaterialOnClick,ra as ChangeTransformOnClick,Kr as CharacterController,Qo as CharacterControllerInput,Vh as ChromaticAberration,ji as CircularBuffer,Xr as ClearFlags,xm as ClickThrough,ao as ClipExtrapolation,hn as Collider,av as Collision,Qu as CollisionDetectionMode,or as ColorAdjustments,Xl as ColorBySpeedModule,em as ColorOverLifetimeModule,YE as Component,E as Component$1,iu as ComponentLifecycleEvents,WD as Components,Kv as ConnectionEvents,rv as ContactPoint,_h as ContactShadows,z as Context,rE as ContextArgs,ue as ContextEvent,pe as ContextRegistry,np as ControlTrackHandler,xa as CursorFollow,ca as CustomBranding,Te as CustomShader,xu as DefaultReflectionMode,yy as Deletable,yr as DeleteBox,Wn as DepthOfField,up as DeviceFlag,I as DeviceUtilities,QS as DocumentExtension,ta as DragControls,_y as DragMode,Jo as DropListener,Iy as Duplicatable,Hh as EffectWrapper,rs as EmissionModule,Ll as EmphasizeOnClick,Rd as EngineLoadingView,op as EnvironmentScene,ae as EventList,Hu as EventListEvent,ci as EventSystem,Pp as EventTrigger,c1 as FieldWithDefault,Ta as FileReference,Uv as FileReferenceSerializer,BT as FileSpawnModel,Hx as File_Event,k0 as FixedJoint,Vl as Fog,p0 as FontStyle,xe as FrameEvent,Ha as GENERATOR,x as GameObject,B as Gizmos,Uy as GltfExport,By as GltfExportBox,ua as Gradient,Lh as Graphic,Zu as GraphicRaycaster,gr as Graphics,$l as GridHelper,b0 as GridLayoutGroup,so as GroundProjectedEnv,sa as GroupActionModel,su as HideFlags,wn as HideOnStart,Bh as HingeJoint,y0 as HorizontalLayoutGroup,Y1 as HorizontalWrapMode,Jk as HostData,So as HoverAnimation,tc as Image,Ra as ImageReference,Fv as ImageReferenceSerializer,L0 as InheritVelocityModule,Vv as Input,yi as InputEventQueue,Ae as InputEvents,nb as InputField,Aa as InstanceHandle,Ma as InstancingHandler,vn as InstancingUtil,xv as InstantiateEvent,kt as InstantiateIdProvider,qn as InstantiateOptions,fy as Interactable,sd as InternalScreenshotUtils,RM as JoinedRoomResponse,xM as KeyEventArgs,Oi as Keyframe,qp as LODGroup,Gl as LODModel,TM as LeftRoomResponse,Lt as Light,rw as LightData,pt as LimitVelocityOverLifetimeModule,PD as LoadingElementOptions,gy as LogStats,Bi as LogType,ob as LookAt,Gr as LookAtConstraint,T as MODULES,Yt as MainModule,ip as MarkerTrackHandler,ey as MarkerType,Dh as MaskableGraphic,ys as MaterialPropertyBlock,_p as MaterialX,D as Mathf,Us as MeshCollider,xh as MeshRenderer,Y as MinMaxCurve,pa as MinMaxGradient,Tg as NEEDLE_ENGINE_FEATURE_FLAGS,Dc as NEKeyboardEvent,zo as NEPointerEvent,US as NeedleButtonElement,wy as NeedleEngineModelLoader,bb as NeedleEngineWebComponent,yo as NeedleMenu,ou as NeedlePatchesKey,vf as NeedleXRController,Z as NeedleXRSession,Cw as NeedleXRSync,Mw as NeedleXRUtils,ql as NestedGltf,ew as NetworkConnection,co as NetworkedStreamEvents,Md as NetworkedStreams,T0 as Networking,Cv as NewInstanceModel,ve as NoiseModule,an as ObjectRaycaster,Rs as ObjectUtils,da as OffsetConstraint,Xd as OneEuroFilter,yg as OneEuroFilterXYZ,ic as OpenURL,me as OrbitControls,zl as Outline,Jv as OwnershipEvent,cf as OwnershipModel,Os as PUBLIC_KEY,la as Padding,Jp as ParticleBurst,D0 as ParticleSubEmitter,Nh as ParticleSystem,ir as ParticleSystemBaseBehaviour,mn as ParticleSystemRenderer,Kp as ParticleSystemShapeType,vs as PeerHandle,Yv as PeerNetworking,dc as Physics,c0 as PhysicsExtension,xt as PhysicsMaterialCombine,Gh as PixelationEffect,Ph as PlayAnimationOnClick,$s as PlayAudioOnClick,yl as PlayableDirector,pc as PlayerColor,Ci as PlayerState,U1 as PlayerStateEvent,i0 as PlayerSync,tw as PlayerView,iw as PlayerViewManager,kd as PointerEventData,yu as PointerType,uw as PostProcessing,st as PostProcessingEffect,mt as PostProcessingEffectOrder,fc as PostProcessingHandler,Xa as Prefabs,Dl as PreliminaryAction,Oh as PreliminaryTrigger,Ns as PreviewHelper,Za as PrimitiveType,le as Progress,hg as PromiseAllWithErrors,cg as PromiseErrorResult,se as RGBAColor,gc as RapierPhysics,_m as RawImage,Ts as RaycastOptions,G1 as Rect,zn as RectTransform,Zo as ReflectionProbe,br as RegisteredAnimationInfo,lp as RemoteSkybox,ko as RenderTexture,bx as RenderTextureSerializer,oi as Renderer,sw as RendererData,Ry as RendererLightmap,Je as Rigidbody,Ke as RigidbodyConstraints,ie as RoomEvents,pn as RotationBySpeedModule,Nn as RotationOverLifetimeModule,bp as SceneLightSettings,et as SceneSwitcher,sr as ScreenCapture,as as ScreenSpaceAmbientOcclusion,Vn as ScreenSpaceAmbientOcclusionN8,hs as ScrollFollow,ls as SeeThrough,Rn as SendQueue,Yg as SerializationContext,Zy as SetActiveOnClick,Yh as ShadowCatcher,I0 as ShapeModule,lv as ShapeOverlapResult,Xh as SharpeningEffect,tp as SignalAsset,ch as SignalReceiver,lh as SignalReceiverEvent,dh as SignalTrackHandler,H1 as Size,ki as SizeBySpeedModule,ma as SizeOverLifetimeModule,Ty as SkinnedMeshRenderer,pm as SmoothFollow,Oa as SpatialGrabRaycaster,td as SpatialHtml,mm as SpatialTrigger,wo as SpatialTriggerReceiver,gm as SpectatorCamera,wl as SphereCollider,Ef as SphereIntersection,_a as SplineContainer,xo as SplineData,Cb as SplineUtils,fn as SplineWalker,ts as Sprite,Bl as SpriteData,Si as SpriteRenderer,jl as SpriteSheet,tR as StateMachineBehaviour,ay as StreamEndedEvent,Lx as StreamReceivedEvent,om as SubEmitterSystem,Z0 as SyncedCamera,$n as SyncedRoom,Ln as SyncedTransform,Jy as TapGestureTrigger,Np as TeleportTarget,eb as TestRunner,tb as TestSimulateUserData,Qt as Text,it as TextAnchor,g0 as TextBuilder,Hp as TextExtension,Zt as TextureSheetAnimationModule,vo as TiltShiftEffect,lw as Time,nr as ToneMappingEffect,fl as TrackHandler,Wi as TrackType,Ue as TrailModule,Ve as TransformData,va as TransformGizmo,qt as TriggerBuilder,pr as TriggerModel,P as TypeStore,Qf as UIRaycastUtils,Th as UIRootComponent,zy as USDDocument,ct as USDObject,b1 as USDWriter,v1 as USDZExporter,_o as USDZExporter$1,Nl as USDZText,w0 as USDZUIExtension,_x as UriSerializer,vh as UsageMarker,AM as UserJoinedOrLeftRoomModel,gi as VERSION,Xy as VariantAction,Xe as VelocityOverLifetimeModule,f0 as VerticalLayoutGroup,Q1 as VerticalWrapMode,gt as VideoPlayer,lt as ViewBox,No as ViewDevice,ba as Vignette,kh as VisibilityAction,Fn as Voip,Kl as Volume,U as VolumeParameter,sm as VolumeProfile,bM as WaitForFrames,zv as WaitForPromise,tf as WaitForSeconds,fs as Watch,rd as WebARCameraBackground,xn as WebARSessionRoot,Wp as WebXR,mr as WebXRButtonFactory,ld as WebXRImageTracking,us as WebXRImageTrackingModel,ps as WebXRPlaneTracking,mc as WebXRTrackedImage,ds as XRControllerFollow,is as XRControllerModel,$i as XRControllerMovement,cn as XRFlag,Om as XRRig,li as XRState,ho as XRStateFlag,YS as __Ignore,kE as __internalNotifyObjectDestroyed,Kn as activeInHierarchyFieldName,ag as addAttributeChangeCallback,oo as addComponent,aA as addCustomExtensionPlugin,Wr as addNewComponent,nu as addPatch,Lu as apply,QE as applyHMRChanges,Vw as applyPrototypeExtensions,Sv as beginListenDestroy,kv as beginListenInstantiate,rf as binaryIdentifierCasts,sE as build_scene_functions,Rr as builtinComponentKeyName,yb as calculateProgress01,LO as clearMessages,cR as colorSerializer,Rv as compareAssociation,Gu as componentSerializer,U_ as copyTexture,px as createMotion,bi as debugNet,el as debugOwner,P1 as decompressGpuTexture,vc as deepClone,Bo as delay,wc as delayForFrames,gu as deserializeObject,Ui as destroy,ox as destroyComponentInstance,Gx as determineMimeTypeFromExtension,Me as disposeObjectResources,Bn as disposeStream,Ec as editorGuidKeyName,$a as enableSpatialConsole,dR as euler,gR as eventListSerializer,FD as exportAsGLTF,If as findByGuid,pl as findObjectOfType,ax as findObjectsOfType,Rf as findResourceUsers,vx as fitCamera,N_ as fitObjectIntoVolume,zr as foreachComponent,jf as foreachComponentEnumerator,JO as forward,fw as generateQRCode,Ov as generateSeed,ui as getBoundingBox,O_ as getCameraController,Vr as getComponent,Zc as getComponentInChildren,Kc as getComponentInParent,dl as getComponents,ul as getComponentsInChildren,Wu as getComponentsInParent,m1 as getFormattedDate,vt as getIconElement,gf as getIconTexture,Mn as getLoader,Yc as getOrAddComponent,w as getParam,ik as getParentHierarchyPath,uO as getPath,OM as getPeerOptions,Xv as getPeerjsInstance,EE as getResourceUserCount,R_ as getTempColor,di as getTempQuaternion,F as getTempVector,_c as getUrlParams,z_ as getVisibleInCustomShadowRendering,L_ as getWorldDirection,Cg as getWorldEuler,ee as getWorldPosition,_e as getWorldQuaternion,Kd as getWorldRotation,Ge as getWorldScale,to as hasCommercialLicense,Rc as hasIndieLicense,Yu as hasPointerEventComponent,eo as hasProLicense,G_ as hideDebugConsole,O1 as imageToCanvas,ID as initEngine,Nr as instantiate,o1 as invokeLoadedImportPluginHooks,mw as invokeXRSessionEnd,pw as invokeXRSessionStart,Hw as isActiveInHierarchy,cl as isActiveSelf,bO as isAndroidDevice,F_ as isAnimationAction,Dg as isComponent,lO as isDebugMode,mO as isDesktop,Ur as isDestroyed,A as isDevEnvironment,OE as isDisposed,jD as isExporting,sv as isGLTFModel,l_ as isHostedOnGlitch,Gf as isHotReloadEnabled,qE as isHotReloading,fO as isIPad,yw as isIconElement,Di as isLocalNetwork,vO as isMacOS,gO as isMobileDevice,_O as isMozillaXR,SO as isQuest,jw as isResourceTrackingEnabled,xO as isSafari,ju as isUsingInstancing,wO as isiOS,yO as isiPad,yD as loadAsset,ry as loadPMREM,gb as loadSync,Jd as logHierarchy,HO as lookAtInverse,xc as lookAtObject,GO as lookAtScreenPoint,hO as makeId,p_ as makeIdFromRandomWords,Vi as makeNameSafe,Gw as markAsInstancedRendered,CO as microphonePermissionsGranted,aO as nameof,c_ as nameofFactory,yx as objectSerializer,VM as offXRSessionEnd,WM as offXRSessionStart,$k as onAfterRender,Vk as onBeforeRender,Nk as onClear,Wk as onDestroy,Fg as onInitialized,au as onStart,Kk as onSyncDestroy,Pv as onSyncInstantiate,fv as onUpdate,pf as onXRSessionEnd,Su as onXRSessionStart,DS as parseSync,W_ as placeOnSurface,kg as postprocessFBXMaterials,SR as prefix,h_ as pushState,dO as randomNumber,af as registerBinaryType,ku as registerComponent,My as registerComponentExtension,gn as registerCustomEffectType,Ey as registerExportExtensions,wp as registerExtensions,lx as registerHotReloadType,dv as registerLoader,Mv as registerPrefabProvider,Af as registerPrototypeExtensions,Rg as registerType,g_ as relativePathPrefix,lg as removeAttributeChangeCallback,Hf as removeComponent,lA as removeCustomImportExtensionType,Bk as removePatch,Fo as resolveUrl,m_ as sanitizeString,ES as saveImage,YL as screenshot,hb as screenshot2,$g as sendDestroyed,u as serializable,Lv as serializeObject,qe as serializeable,qc as setActive,__ as setAllowBalloonMessages,RO as setAllowOverlayMessages,Yd as setAutoFitEnabled,bg as setCameraController,Xw as setDestroyed,UO as setDevEnvironment,Fw as setDisposable,hl as setDontDestroy,og as setOrAddParamsToUrl,cO as setParam,Ua as setParamWithoutReload,kM as setPeerOptions,PE as setResourceTrackingEnabled,sg as setState,Og as setVisibleInCustomShadowRendering,Pg as setWorldEuler,bt as setWorldPosition,Pr as setWorldPositionXYZ,kn as setWorldQuaternion,Sg as setWorldQuaternionXYZW,B_ as setWorldRotation,Sc as setWorldRotationXYZ,Va as setWorldScale,Oc as showBalloonError,ke as showBalloonMessage,be as showBalloonWarning,Mg as showDebugConsole,M_ as slerp,Ac as syncDestroy,sy as syncField,Hg as syncInstantiate,nk as textureToCanvas,f_ as toSourceId,Gv as tryCastBinary,Xx as tryDetermineMimetypeFromBinary,qx as tryDetermineMimetypeFromURL,za as tryFindObject,qv as tryGetGuid,cx as unregisterHotReloadType,tM as unregisterPrefabProvider,rg as unwatchWrite,k_ as useForAutoFit,Et as validate,Gd as watchWrite};
|