@needle-tools/engine 4.12.0-next.de80571 → 4.12.0-next.e42c144
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 +1 -1
- package/components.needle.json +1 -1
- package/dist/generateMeshBVH.worker-iyfPIK6R.js +21 -0
- package/dist/{gltf-progressive-DZrY8VT6.min.js → gltf-progressive-BmSygnAC.min.js} +2 -2
- package/dist/{gltf-progressive-DgYz5BYa.js → gltf-progressive-DnLBuGK5.js} +24 -24
- package/dist/{gltf-progressive-DWcmTMCh.umd.cjs → gltf-progressive-Rs-ojtXy.umd.cjs} +1 -1
- package/dist/{loader.worker-Dip-PthR.js → loader.worker-DWzfDpAl.js} +4 -4
- package/dist/needle-engine.bundle-CW5U4a3u.umd.cjs +1647 -0
- package/dist/needle-engine.bundle-HNQiYV9e.min.js +1647 -0
- package/dist/{needle-engine.bundle-CbrIHiN8.js → needle-engine.bundle-qrrKb_xn.js} +8886 -8598
- package/dist/needle-engine.d.ts +108 -43
- package/dist/needle-engine.js +48 -48
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-DYDtB188.min.js → postprocessing-B5ksn9-G.min.js} +54 -54
- package/dist/{postprocessing-CMgoN5t5.umd.cjs → postprocessing-DZtb9Nnn.umd.cjs} +81 -81
- package/dist/{postprocessing-BTW9pD_s.js → postprocessing-__7s9wON.js} +450 -441
- package/dist/{three-DfMvBzXi.js → three-BCCkyCA5.js} +1 -7
- package/dist/{three-qj71I7J3.umd.cjs → three-Bf2NBxAw.umd.cjs} +2 -2
- package/dist/{three-B7CT31Bt.min.js → three-W7zWTcfP.min.js} +1 -1
- package/dist/{three-examples-CsW4_6LI.umd.cjs → three-examples-Dho7cuu4.umd.cjs} +4 -4
- package/dist/{three-examples-D1P7eEhn.min.js → three-examples-MsJjauyk.min.js} +10 -10
- package/dist/{three-examples-D1SK93ek.js → three-examples-y2GeYlze.js} +2 -20
- package/dist/{three-mesh-ui-C_uSB5dD.js → three-mesh-ui-3nSSizT4.js} +1 -1
- package/dist/{three-mesh-ui-LQ44s0AL.min.js → three-mesh-ui-CIez6qJQ.min.js} +1 -1
- package/dist/{three-mesh-ui-DpATDXwU.umd.cjs → three-mesh-ui-zsOOA5Pq.umd.cjs} +1 -1
- package/dist/{vendor-D0zoswDa.js → vendor-DMZcbVO1.js} +3707 -3527
- package/dist/vendor-sURMCFSI.min.js +1116 -0
- package/dist/{vendor-UCpFAwt1.umd.cjs → vendor-tyBvnMF-.umd.cjs} +39 -39
- package/lib/engine/codegen/register_types.js +0 -2
- package/lib/engine/codegen/register_types.js.map +1 -1
- package/lib/engine/debug/debug_console.js +403 -1
- package/lib/engine/debug/debug_console.js.map +1 -1
- package/lib/engine/engine_components.js +3 -3
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_context.js +2 -0
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_input.d.ts +5 -0
- package/lib/engine/engine_input.js +6 -0
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_license.d.ts +18 -0
- package/lib/engine/engine_license.js +115 -18
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_networking.js +5 -5
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/engine_physics_rapier.js +1 -1
- package/lib/engine/engine_physics_rapier.js.map +1 -1
- package/lib/engine/engine_serialization_builtin_serializer.js +1 -1
- package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
- package/lib/engine/engine_utils.d.ts +4 -1
- package/lib/engine/engine_utils.js +28 -4
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/extensions/extensions.d.ts +29 -7
- package/lib/engine/extensions/extensions.js.map +1 -1
- package/lib/engine/webcomponents/WebXRButtons.js +13 -5
- package/lib/engine/webcomponents/WebXRButtons.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -5
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +4 -0
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.js +1 -1
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.d.ts +1 -1
- package/lib/engine/xr/NeedleXRSession.js +101 -22
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine/xr/TempXRContext.js +12 -2
- package/lib/engine/xr/TempXRContext.js.map +1 -1
- package/lib/engine/xr/usdz.js +6 -2
- package/lib/engine/xr/usdz.js.map +1 -1
- package/lib/engine-components/AlignmentConstraint.d.ts +1 -1
- package/lib/engine-components/AlignmentConstraint.js +1 -1
- package/lib/engine-components/Animation.d.ts +1 -1
- package/lib/engine-components/Animation.js +1 -1
- package/lib/engine-components/Animator.d.ts +1 -1
- package/lib/engine-components/Animator.js +1 -1
- package/lib/engine-components/AudioListener.d.ts +1 -1
- package/lib/engine-components/AudioListener.js +1 -1
- package/lib/engine-components/AudioSource.d.ts +1 -1
- package/lib/engine-components/AudioSource.js +1 -1
- package/lib/engine-components/Camera.d.ts +1 -1
- package/lib/engine-components/Camera.js +5 -2
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/CharacterController.d.ts +6 -2
- package/lib/engine-components/CharacterController.js +6 -2
- package/lib/engine-components/CharacterController.js.map +1 -1
- package/lib/engine-components/Collider.d.ts +1 -1
- package/lib/engine-components/Collider.js.map +1 -1
- package/lib/engine-components/Component.d.ts +2 -1
- package/lib/engine-components/Component.js +3 -2
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/DragControls.js +4 -1
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/Joints.d.ts +14 -0
- package/lib/engine-components/Joints.js +14 -0
- package/lib/engine-components/Joints.js.map +1 -1
- package/lib/engine-components/LookAtConstraint.d.ts +1 -1
- package/lib/engine-components/LookAtConstraint.js +1 -1
- package/lib/engine-components/OrbitControls.d.ts +1 -1
- package/lib/engine-components/OrbitControls.js +1 -1
- package/lib/engine-components/Renderer.d.ts +6 -0
- package/lib/engine-components/Renderer.js +6 -0
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/RendererInstancing.js +5 -3
- package/lib/engine-components/RendererInstancing.js.map +1 -1
- package/lib/engine-components/SceneSwitcher.js +18 -14
- package/lib/engine-components/SceneSwitcher.js.map +1 -1
- package/lib/engine-components/SpectatorCamera.js +15 -7
- package/lib/engine-components/SpectatorCamera.js.map +1 -1
- package/lib/engine-components/SpriteRenderer.d.ts +2 -1
- package/lib/engine-components/SpriteRenderer.js +2 -1
- package/lib/engine-components/SpriteRenderer.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/codegen/components.d.ts +0 -1
- package/lib/engine-components/codegen/components.js +0 -1
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/timeline/SignalAsset.d.ts +1 -1
- package/lib/engine-components/timeline/SignalAsset.js +1 -1
- package/lib/engine-components/ui/Raycaster.d.ts +3 -2
- package/lib/engine-components/ui/Raycaster.js +3 -2
- package/lib/engine-components/ui/Raycaster.js.map +1 -1
- package/lib/engine-components/ui/RectTransform.d.ts +6 -0
- package/lib/engine-components/ui/RectTransform.js +6 -0
- package/lib/engine-components/ui/RectTransform.js.map +1 -1
- package/lib/engine-components/utils/LookAt.d.ts +2 -1
- package/lib/engine-components/utils/LookAt.js +2 -1
- package/lib/engine-components/utils/LookAt.js.map +1 -1
- package/lib/engine-components/web/CursorFollow.d.ts +1 -1
- package/lib/engine-components/web/CursorFollow.js +1 -1
- package/lib/engine-components/web/HoverAnimation.d.ts +1 -1
- package/lib/engine-components/web/HoverAnimation.js +1 -1
- package/lib/engine-components/web/ViewBox.d.ts +1 -1
- package/lib/engine-components/web/ViewBox.js +1 -1
- package/lib/engine-components/webxr/Avatar.js +2 -0
- package/lib/engine-components/webxr/Avatar.js.map +1 -1
- package/lib/engine-components/webxr/WebXR.js +18 -12
- package/lib/engine-components/webxr/WebXR.js.map +1 -1
- package/package.json +3 -3
- package/plugins/vite/poster-client.js +8 -1
- package/src/engine/codegen/register_types.ts +0 -2
- package/src/engine/debug/debug_console.ts +449 -1
- package/src/engine/engine_components.ts +4 -4
- package/src/engine/engine_context.ts +2 -0
- package/src/engine/engine_input.ts +7 -0
- package/src/engine/engine_license.ts +128 -17
- package/src/engine/engine_networking.ts +5 -5
- package/src/engine/engine_physics.ts +3 -3
- package/src/engine/engine_physics_rapier.ts +1 -1
- package/src/engine/engine_serialization_builtin_serializer.ts +1 -1
- package/src/engine/engine_utils.ts +23 -4
- package/src/engine/extensions/extensions.ts +30 -6
- package/src/engine/webcomponents/WebXRButtons.ts +15 -5
- package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -5
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +6 -0
- package/src/engine/webcomponents/needle-engine.ts +2 -2
- package/src/engine/xr/NeedleXRSession.ts +114 -24
- package/src/engine/xr/TempXRContext.ts +12 -2
- package/src/engine/xr/usdz.ts +6 -1
- package/src/engine-components/AlignmentConstraint.ts +1 -1
- package/src/engine-components/Animation.ts +1 -1
- package/src/engine-components/Animator.ts +1 -1
- package/src/engine-components/AudioListener.ts +1 -1
- package/src/engine-components/AudioSource.ts +1 -1
- package/src/engine-components/Camera.ts +5 -2
- package/src/engine-components/CharacterController.ts +6 -2
- package/src/engine-components/Collider.ts +1 -1
- package/src/engine-components/Component.ts +5 -4
- package/src/engine-components/DragControls.ts +5 -1
- package/src/engine-components/Joints.ts +14 -0
- package/src/engine-components/LookAtConstraint.ts +1 -1
- package/src/engine-components/OrbitControls.ts +1 -1
- package/src/engine-components/Renderer.ts +6 -0
- package/src/engine-components/RendererInstancing.ts +6 -3
- package/src/engine-components/SceneSwitcher.ts +17 -17
- package/src/engine-components/SpectatorCamera.ts +21 -10
- package/src/engine-components/SpriteRenderer.ts +2 -1
- package/src/engine-components/api.ts +2 -1
- package/src/engine-components/codegen/components.ts +0 -1
- package/src/engine-components/timeline/SignalAsset.ts +1 -1
- package/src/engine-components/ui/Raycaster.ts +3 -2
- package/src/engine-components/ui/RectTransform.ts +6 -0
- package/src/engine-components/utils/LookAt.ts +2 -1
- package/src/engine-components/web/CursorFollow.ts +1 -1
- package/src/engine-components/web/HoverAnimation.ts +1 -1
- package/src/engine-components/web/ViewBox.ts +1 -1
- package/src/engine-components/webxr/Avatar.ts +4 -0
- package/src/engine-components/webxr/WebXR.ts +19 -11
- package/dist/generateMeshBVH.worker-mO20N_b8.js +0 -21
- package/dist/needle-engine.bundle-BGixCtrn.umd.cjs +0 -1647
- package/dist/needle-engine.bundle-S3PalR7r.min.js +0 -1647
- package/dist/vendor-BKGa4GE0.min.js +0 -1116
|
@@ -0,0 +1,1647 @@
|
|
|
1
|
+
import{Vector2 as ee,Vector3 as b,Vector4 as me,Quaternion as N,PlaneGeometry as zn,WebGLRenderer as hr,PerspectiveCamera as ae,OrthographicCamera as _d,Scene as Si,Mesh as H,Texture as Le,Uniform$1 as Wi,Color as oe,ShaderMaterial as Nn,Box3 as Ci,ShadowMaterial as ib,Euler as st,MeshStandardMaterial as mt,Box3Helper as TS,GridHelper as gm,Object3D as k,Material as we,Matrix3 as nb,Matrix4 as K,Layers as ps,Ray as vo,MathUtils as wo,AxesHelper as Pi,MeshBasicMaterial as Se,DoubleSide as Oi,BufferGeometry as fn,Group as xo,CylinderGeometry as ob,SphereGeometry as vd,BoxGeometry as ka,SpriteMaterial as AS,Sprite as IS,Shape as LS,ExtrudeGeometry as DS,Fog as sb,DirectionalLight as fm,PointLight as ym,EdgesGeometry as jS,LineSegments as rb,LineBasicMaterial as bm,Line as Ma,BufferAttribute as gt,Raycaster as wd,Sphere as xd,ArrayCamera as BS,Plane as dr,SkinnedMesh as ms,InterleavedBufferAttribute as ab,Skeleton as FS,Bone as US,WebGLCubeRenderTarget as zS,CubeCamera as NS,AnimationClip as ki,FileLoader as _m,TextureLoader as tc,PropertyBinding as Ra,KeyframeTrack as VS,LinearSRGBColorSpace as So,ShaderChunk as Xt,UniformsLib as WS,DataTexture as vm,RGBAFormat as Sd,EquirectangularReflectionMapping as Vn,SRGBColorSpace as Co,Clock as $S,NeutralToneMapping as Ea,AgXToneMapping as Cd,ACESFilmicToneMapping as Pd,NoToneMapping as Od,PCFSoftShadowMap$1 as HS,BasicNodeLibrary as GS,WebGLRenderTarget as Wn,DepthTexture as lb,NearestFilter as kd,LoopRepeat as qS,LoopOnce as wm,AnimationMixer as xm,CompressedTexture as XS,FrontSide as gs,Camera as QS,Frustum as cb,AudioListener as YS,PositionalAudio as ZS,AudioLoader as Sm,EventDispatcher as Cm,BackSide as Md,MeshDepthMaterial as KS,CustomBlending as JS,MaxEquation as eC,AlwaysStencilFunc as tC,GreaterEqualStencilFunc as iC,NotEqualStencilFunc as nC,GreaterStencilFunc as oC,LessEqualStencilFunc as sC,EqualStencilFunc as rC,LessStencilFunc as aC,NeverStencilFunc as hb,InvertStencilOp as lC,DecrementWrapStencilOp as cC,IncrementWrapStencilOp as hC,DecrementStencilOp as dC,IncrementStencilOp as uC,ReplaceStencilOp as pC,ZeroStencilOp as mC,KeepStencilOp as gC,CubeTexture as db,AmbientLight as fC,HemisphereLight as yC,RawShaderMaterial as ub,GLSL3 as bC,AlwaysDepth as _C,GreaterEqualDepth as vC,GreaterDepth as wC,LessEqualDepth as xC,LessDepth as SC,NotEqualDepth as CC,EqualDepth as PC,BatchedMesh as pb,MeshPhysicalMaterial as Pm,LinearFilter as Rd,UnsignedByteType as OC,RingGeometry as kC,Line3 as MC,AdditiveBlending as mb,BoxHelper as RC,SpotLight as EC,DirectionalLightHelper as TC,CameraHelper as AC,LOD as IC,Triangle as LC,NormalBlending as DC,ReinhardToneMapping as Om,LinearToneMapping as km,HalfFloatType as Mm,VideoTexture as jC,CubeUVReflectionMapping as gb,CompressedCubeTexture as BC,EquirectangularRefractionMapping as FC,CatmullRomCurve3 as UC,VectorKeyframeTrack as zC,QuaternionKeyframeTrack as NC,Audio as VC,ShaderLib as Ed,UniformsUtils as fb,MirroredRepeatWrapping as yb,MeshNormalMaterial as WC,AudioContext as $C,PMREMGenerator$1 as HC}from"./three-W7zWTcfP.min.js";import{createLoaders as Rm,getRaycastMesh as bb,LODsManager as ur,NEEDLE_progressive as We,addDracoAndKTX2Loaders as GC,configureLoader as qC,setKTX2TranscoderLocation as XC,setDracoDecoderLocation as QC}from"./gltf-progressive-BmSygnAC.min.js";import{GroundedSkybox as Ta,Font as YC,TextGeometry as ZC,FontLoader as KC,GLTFLoader as Po,TransformControlsGizmo as _b,EXRLoader as Em,RGBELoader as vb,Stats as JC,nodeFrame as wb,OrbitControls as xb,PositionalAudioHelper as eP,HorizontalBlurShader as tP,VerticalBlurShader as iP,GLTFExporter as Sb,strToU8 as Cb,zipSync as nP,XRControllerModelFactory as oP,XRHandMeshModel as sP,Line2 as rP,LineGeometry as aP,LineMaterial as lP,TransformControls as cP,InteractiveGroup as hP,HTMLMesh as dP,VertexNormalsHelper as uP,OBJLoader as Tm,FBXLoader as Pb,mergeVertices as pP}from"./three-examples-MsJjauyk.min.js";import{fetchProfile as mP,MotionController as gP,$70d766613f57b014$export$2e2bcd8739ae039 as Ob,ByteBuffer as fP,v5 as kb,md5 as Mb,SIZE_PREFIX_LENGTH as Rb,Builder as Am,createNoise4D as yP,Matrix4 as Im,BatchedParticleRenderer as bP,ParticleSystem as _P,RenderMode as Oo,ConstantColor as vP,Vector4 as wP,ConstantValue as xP,TrailParticle as Eb,WorkerBase as SP,MeshBVH as CP}from"./vendor-sURMCFSI.min.js";import{__webpack_exports__default as Ce,__webpack_exports__Text as Tb,__webpack_exports__Block as Ab,__webpack_exports__update as PP,SimpleStateBehavior as OP,__webpack_exports__Inline as Lm,__webpack_exports__FontLibrary as Ib,ThreeMeshUI as Lb}from"./three-mesh-ui-CIez6qJQ.min.js";import{EffectAttribute as kP}from"./postprocessing-B5ksn9-G.min.js";const Dm=new Map;function $i(o=globalThis.location?.hostname){if(Dm.has(o))return Dm.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return Dm.set(o,e),e===!0}function Db(){return window.location.hostname.includes("glitch.me")}const jb=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&&(jb&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(jb&&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 Bb=()=>o=>o;function MP(o){return Bb()(o)}function RP(){return!!v("debug")}class Mi{_factory;_cache=[];_maxSize;_index=0;constructor(e,t){this._factory=e,this._maxSize=t}get(){const e=this._index%this._maxSize;return this._index++,this._cache.length<=e&&(this._cache[e]=this._factory()),this._cache[e]}}let pr=!1;const jm=new Array;typeof window<"u"&&setTimeout(()=>{if(pr){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of jm){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=pr===!0?"":` (containing "${pr}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof pr=="string"&&!s.toLowerCase().includes(pr.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function ic(){return new URLSearchParams(globalThis.location?.search)}function v(o){pr&&!jm.includes(o)&&jm.push(o);const e=ic();if(e.has(o)){const t=e.get(o);if(t){const i=Number(t);return isNaN(i)?t:i}else return!0}return!1}pr=v("help");function EP(o,e){const t=ic();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function nc(o,e,t=!0){const i=ic();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?Fb(o,i):Fm(o,i)}function Bm(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function Fb(o,e,t){window.history.pushState(t,o,"?"+e.toString())}function Fm(o,e,t){window.history.replaceState(t,o,"?"+e.toString())}function TP(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 AP(o,e){return Math.floor(Math.random()*(e-o+1))+o}const Ub=["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"],zb=["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 Nb(){const o=Ub[Math.floor(Math.random()*Ub.length)],e=zb[Math.floor(Math.random()*zb.length)];return o+"_"+e}function Vb(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function Aa(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=Aa(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=Aa(o,s,t,i);if(r)return r}}}function oc(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]=oc(n,e)}return t}return o}function ko(o){return new Promise((e,t)=>{setTimeout(e,o)})}function sc(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 Td=v("debugresolveurl"),Wb="rel:";function IP(o,e){return fs(o,e)}function fs(o,e){if(e===void 0)return Td&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return Td&&console.warn("getPath: uri is absolute, returning uri",e),e;if(o===void 0)return Td&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(Wb)&&(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 Td&&console.log("source:",o,`changed uri
|
|
4
|
+
from`,e,`
|
|
5
|
+
to `,n,`
|
|
6
|
+
basePath: `+i),n}return e}function $b(o){if(o)return o=o.trim(),o=o.split("?")[0]?.split("#")[0],o}class LP{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 ls{_watches=[];constructor(e,t){if(Array.isArray(t))for(const i of t)this._watches.push(new ls(e,i));else this._watches.push(new LP(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 Ia=Symbol("needle:watches");function Ad(o,e){if(!o[Ia])if(o instanceof ee)o[Ia]=new ls(o,["x","y"]);else if(o instanceof b)o[Ia]=new ls(o,["x","y","z"]);else if(o instanceof me||o instanceof N)o[Ia]=new ls(o,["x","y","z","w"]);else return!1;return o[Ia].subscribeWrite(e),!0}function Um(o,e){if(!o)return;const t=o[Ia];t&&t.unsubscribeWrite(e)}var L;(o=>{let e;function t(){if(e!==void 0)return e;const te=window.navigator.userAgent,Ve=/Windows|MacOS|Mac OS/.test(te),ai=/Windows NT/.test(te)&&/Edg/.test(te)&&!/Win64/.test(te);return e=Ve&&!ai&&!M()}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(M()||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 w;const P=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function M(){return w!==void 0?w:w=P.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}o.isiOS=M;let O;function j(){return O!==void 0||(O=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),O}o.isSafari=j;let I;function W(){return I!==void 0?I:I=navigator.userAgent.includes("OculusBrowser")}o.isQuest=W;let V;function G(){return V!==void 0||(V=document.createElement("a").relList.supports("ar")),V}o.supportsQuickLookAR=G;async function X(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(te){return console.error("Error querying `microphone` permissions.",te),!1}}o.microphonePermissionsGranted=X;let E;function $(){if(E!==void 0)return E;const te=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(te&&(E=te[1].replace("_",".")),!E){const Ve=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);Ve&&(E=Ve[1])}return E||(E=null),E}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})(L||(L={}));function DP(){return L.isDesktop()}function jP(){return L.isMobileDevice()}function BP(){return L.isiPad()}function FP(){return L.isiPad()}function UP(){return L.isAndroidDevice()}function zP(){return L.isMozillaXR()}function NP(){return L.isMacOS()}function VP(){return L.isiOS()}function WP(){return L.isSafari()}function $P(){return L.isQuest()}async function HP(){return L.microphonePermissionsGranted()}const ys=new WeakMap;function zm(o,e,t){if(!ys.get(o)){const n=new MutationObserver(s=>{GP(o,s)});ys.set(o,{observer:n,attributeChangedListeners:new Map}),n.observe(o,{attributes:!0})}const i=ys.get(o).attributeChangedListeners;return i.has(e)||i.set(e,[]),i.get(e).push(t),()=>{Nm(o,e,t)}}function Nm(o,e,t){if(!ys.get(o))return;const i=ys.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),ys.get(o)?.observer.disconnect(),ys.delete(o)))}function GP(o,e){const t=ys.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 Vm{reason;constructor(e){this.reason=e}}async function Wm(o){const e=await Promise.allSettled(o).catch(n=>[new Vm(n.message)]);let t=!1;const i=e.map(n=>"value"in n?n.value:(t=!0,new Vm(n.reason)));return{anyFailed:t,results:i}}const qP=v("debugdebug");let $m=!1;(v("noerrors")||v("nooverlaymessages"))&&($m=!0);const Hm="needle_engine_global_error_container";var Ri=(o=>(o[o.Log=0]="Log",o[o.Warn=1]="Warn",o[o.Error=2]="Error",o))(Ri||{});function Hb(){return Xb}const Gm=new Array;function XP(o){Gm.push(o)}let qm=!1;function QP(...o){if(!qm){qm=!0;try{for(let e=0;e<Gm.length;e++)Gm[e](...o)}catch(e){console.error(e)}qm=!1}}const Gb=console.error,YP=function(...o){Gb.apply(console,o),JP(o),mr(2,o),KP(...o)};function qb(o){$m=!o,o?console.error=YP:console.error=Gb}function ZP(o){return qb(o)}let Xb=0;function KP(...o){Xb+=1,QP(...o)}function JP(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")}}function mr(o,e,t,i){if($m)return;const n=pe.Current?.domElement??document.querySelector("needle-engine");if(n){if(Array.isArray(e)){let s="";for(let r=0;r<e.length;r++){let a=e[r];a instanceof Error&&(a=a.message),typeof a!="object"&&(r>0&&(s+=" "),s+=a)}e=s}!e||e.length<=0||eO(o,n,e)}}const rc=new Map;function eO(o,e,t){if(t==null)return;const i=nO(e);if(i.childElementCount>=20){const a=i.lastElementChild;Yb(a)}t.length>400&&(t=t.substring(0,400)+"...");const n=t;if(rc.has(n))return;const s=oO(o,t);i.prepend(s);const r=()=>{rc.delete(n),Yb(s)};rc.set(n,r),setTimeout(r,1e4)}function tO(){qP&&console.log("Clearing messages");for(const o of rc.values())o?.call(o);rc.clear()}const iO=`
|
|
7
|
+
|
|
8
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
9
|
+
|
|
10
|
+
div[data-needle_engine_debug_overlay] {
|
|
11
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
12
|
+
font-weight: 400;
|
|
13
|
+
font-size: 16px;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
div[data-needle_engine_debug_overlay] strong {
|
|
17
|
+
font-weight: 700;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
div[data-needle_engine_debug_overlay] a {
|
|
21
|
+
color: white;
|
|
22
|
+
text-decoration: none;
|
|
23
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
div[data-needle_engine_debug_overlay] a:hover {
|
|
27
|
+
text-decoration: none;
|
|
28
|
+
border: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
div[data-needle_engine_debug_overlay] .log strong {
|
|
32
|
+
color: rgba(200,200,200,.9);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
div[data-needle_engine_debug_overlay] .warn strong {
|
|
36
|
+
color: rgba(255,255,230, 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
div[data-needle_engine_debug_overlay] .error strong {
|
|
40
|
+
color: rgba(255,100,120, 1);
|
|
41
|
+
}
|
|
42
|
+
`;function nO(o){globalThis[Hm]||(globalThis[Hm]=new Map);const e=globalThis[Hm];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=`
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 0;
|
|
45
|
+
right: 5px;
|
|
46
|
+
padding-top: 0px;
|
|
47
|
+
max-width: 70%;
|
|
48
|
+
max-height: calc(100% - 5px);
|
|
49
|
+
z-index: 100000;
|
|
50
|
+
pointer-events: scroll;
|
|
51
|
+
display: flex;
|
|
52
|
+
align-items: end;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
color: white;
|
|
55
|
+
overflow: auto;
|
|
56
|
+
word-break: break-word;
|
|
57
|
+
`,o.shadowRoot?o.shadowRoot.appendChild(t):o.appendChild(t);const i=document.createElement("style");return i.innerHTML=iO,t.appendChild(i),t}}const Qb=Symbol("logtype"),Id=new Map;function Yb(o){o.remove();const e=o[Qb],t=Id.get(e)??[];t.push(o),Id.set(e,t)}function oO(o,e){if(Id.has(o)){const i=Id.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[Qb]=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}class sO{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 rO){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 rO=["x","y","z","w"],D=new sO;class Zb{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 Ld{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 Zb(this.alpha(this.minCutOff)),this.dx=new Zb(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 Xm{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new Ld(e,t,i,n),this.y=new Ld(e,t,i,n),this.z=new Ld(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 Dd="needle:cameraController";function Kb(o){return o[Dd]}function Qm(o,e,t){t?o[Dd]=e:o[Dd]===e&&(o[Dd]=null)}const Ym="needle:autofit";function Jb(o){return o[Ym]===void 0?!0:o[Ym]!==!1}function jd(o,e){o[Ym]=e}let yn;const aO={x:0,y:0,width:0,height:0},lO=v("debugfocusrect");function cO(o,e,t,i,n){o instanceof Element&&(lO&&o instanceof HTMLElement&&(o.style.outline="2px dashed rgba(255, 150, 0, .8)"),o=o.getBoundingClientRect()),yn=n.domElement.getBoundingClientRect();const s=aO;s.x=o.x,s.y=o.y,s.width=o.width,s.height=o.height,s.x-=yn.x,s.y-=yn.y;const r=yn.width,a=yn.height,l=i.view,c=e.zoom;let h=l?.offsetX||0,d=l?.offsetY||0,p=yn.width,m=yn.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=yn.width*.5,_=yn.height*.5,w=f-y,P=g-_;h-=w/c,d-=P/c,e.offsetX!==void 0&&(h+=e.offsetX*(yn.width*.5)),e.offsetY!==void 0&&(d-=e.offsetY*(yn.height*.5));const M=l?.offsetX||h,O=l?.offsetY||d;h=D.lerp(M,h,t),d=D.lerp(O,d,t);const j=l?.width||r,I=l?.height||a;p=D.lerp(j,p,t),m=D.lerp(I,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 hO(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 Zm=new N,e_=new N().setFromAxisAngle(new b(0,1,0),Math.PI);function dO(o,e){o.lookAt(e),o.quaternion.multiply(e_)}function ac(o,e,t=!0,i=!1){if(o===e)return;Zm.copy(o.quaternion);const n=J(e),s=J(o);if(i){if(bn(o,_e(e)),t){const r=s.y,a=s.sub(s_(o));a.y=r,o.lookAt(a),o.quaternion.multiply(e_)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Zm);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Zm)}function uO(o,e,t,i=1){if(t){const n=B(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 pO=new Mi(()=>new b,100);function B(o,e,t){const i=pO.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 mO=new Mi(()=>new oe,30);function t_(o){const e=mO.get();return o?e.copy(o):e.set(0,0,0),e}const gO=new Mi(()=>new N,100);function li(o,e,t,i){const n=gO.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 Km=new Mi(()=>new b,100),i_=Symbol("lastMatrixWorldUpdateKey");function J(o,e=null,t=!0){const i=e??Km.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[i_]!==Date.now()&&(o[i_]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function ft(o,e){if(!o)return o;const t=Km.get();return e!==t&&t.copy(e),(o?.parent??o).worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function gr(o,e,t,i){const n=Km.get();return n.set(e,t,i),ft(o,n),o}const Bd=new Mi(()=>new N,100),fr=new N,Jm=new N;function _e(o,e=null){if(!o)return Bd.get().identity();const t=e??Bd.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function bn(o,e){if(!o)return;e!==fr&&fr.copy(e);const t=fr;o?.parent?.getWorldQuaternion(Jm),Jm.invert();const i=Jm.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function eg(o,e,t,i,n){fr.set(e,t,i,n),bn(o,fr)}const fO=new Mi(()=>new b,100),yO=new b;function Ge(o,e=null){return e||(e=fO.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function La(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=yO;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const bO=new b,n_=new N;function _O(o){return _e(o,n_),bO.set(0,0,1).applyQuaternion(n_)}const vO=new Mi(()=>new b,100),o_=new N;function s_(o,e){return e||(e=vO.get().set(0,0,1)),_e(o,o_),e.applyQuaternion(o_)}const r_=new st,a_=new st,wO=new b;function tg(o){const e=Bd.get();return o.getWorldQuaternion(e),a_.setFromQuaternion(e),a_}function ig(o,e){const t=Bd.get();bn(o,t.setFromEuler(e))}function Fd(o){const e=tg(o),t=wO;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 l_(o,e){lc(o,e.x,e.y,e.z,!0)}function lc(o,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),r_.set(e,t,i),fr.setFromEuler(r_),bn(o,fr)}function Ud(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 xO(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 c_(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 dm extends Nn{static vertex=`
|
|
58
|
+
varying vec2 vUv;
|
|
59
|
+
void main(){
|
|
60
|
+
vUv = uv;
|
|
61
|
+
gl_Position = vec4(position.xy, 0., 1.0);
|
|
62
|
+
}`;constructor(){super({vertexShader:dm.vertex,uniforms:{map:new Wi(null),flipY:new Wi(!0),writeDepth:new Wi(!1),depthTexture:new Wi(null)},fragmentShader:`
|
|
63
|
+
uniform sampler2D map;
|
|
64
|
+
uniform bool flipY;
|
|
65
|
+
uniform bool writeDepth;
|
|
66
|
+
uniform sampler2D depthTexture;
|
|
67
|
+
|
|
68
|
+
varying vec2 vUv;
|
|
69
|
+
|
|
70
|
+
void main(){
|
|
71
|
+
vec2 uv = vUv;
|
|
72
|
+
if (flipY) uv.y = 1.0 - uv.y;
|
|
73
|
+
gl_FragColor = texture2D(map, uv);
|
|
74
|
+
|
|
75
|
+
if (writeDepth) {
|
|
76
|
+
float depth = texture2D(depthTexture, uv).r;
|
|
77
|
+
gl_FragDepth = depth;
|
|
78
|
+
|
|
79
|
+
// float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
|
|
80
|
+
// gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
|
|
81
|
+
}
|
|
82
|
+
}`})}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 rr{static planeGeometry=new zn(2,2,1,1);static renderer=new hr({antialias:!1,alpha:!0});static perspectiveCam=new ae;static orthographicCam=new _d;static scene=new Si;static blitMaterial=new dm;static mesh=new H(rr.planeGeometry,rr.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=dm.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 Le(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 Wi(!0),s.uniforms.depthTexture.value=a):(s.uniforms.writeDepth=new Wi(!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(),m=p.getParameter(p.DEPTH_TEST),f=p.getParameter(p.DEPTH_WRITEMASK),g=p.getParameter(p.DEPTH_FUNC);l?n.getContext().enable(n.getContext().DEPTH_TEST):n.getContext().disable(n.getContext().DEPTH_TEST),n.state.buffers.depth.setMask(c),n.setClearColor(new oe(0,0,0),0),n.pixelRatio!==window.devicePixelRatio&&n.xr.isPresenting===!1&&n.setPixelRatio(window.devicePixelRatio),n.setRenderTarget(t),n.clear(),n.render(this.scene,this.perspectiveCam),n.setRenderTarget(d);const y=n.state.buffers.depth;y.setTest(m),y.setMask(f),y.setFunc(g)}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=h_(e));const i=e.image;if(CO(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 h_(o){return rr.copyTexture(o)}function SO(o,e=!1){return rr.textureToCanvas(o,e)}function CO(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 PO(o){const e=o.type;return e==="Mesh"||e==="SkinnedMesh"}function ng(o,e){e?o["needle:rendercustomshadow"]=!0:o["needle:rendercustomshadow"]=!1}function d_(o){return!!(o&&(o["needle:rendercustomshadow"]===!0||o["needle:rendercustomshadow"]==null))}function Qt(o,e=void 0,t=void 0,i=void 0){const n=i||new Ci;n.makeEmpty();const s=[];function r(l){let c=!0;if(l.visible&&Jb(l)!==!1&&!(l.type==="TransformControlsGizmo"||l.type==="TransformControlsPlane")){if(l instanceof TS&&(c=!1),l instanceof gm&&(c=!1),l instanceof Ta&&(c=!1),l.isGizmo===!0&&(c=!1),l.material instanceof ib&&(c=!1),PO(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 u_(o,e,t){const i=Qt([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&&La(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),ft(o,J(o).add(m))}return{boundsBefore:i,scale:l}}function p_(o,e){const t=Qt([o]),i=new b;t.getCenter(i),i.y=t.min.y;const n=e.clone().sub(i),s=J(o);return ft(o,s.add(n)),{offset:n,bounds:t}}function og(o,e,t,i){if(Array.isArray(e)){let r=!0;for(let a=0;a<e.length;a++)og(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 mt;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 zd=!1;XP((...o)=>{A()&&pe.Current?.isInXR&&(Da(!0),m_("error",...o))});function Da(o){if(o){if(zd)return;zd=!0,kO()}else{if(!zd)return;zd=!1,MO()}}const cc={log:void 0,warn:void 0,error:void 0};class OO{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 k;userForwardViewPoint=new b;oneEuroFilter=new Xm(90,.8);_lastElementRemoveTime=0;onBeforeRender=()=>{const e=this.context?.mainCamera;if(this.context&&e instanceof ae){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),ac(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 Ce.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}),Ce.update()}ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png")?.addEventListener("ready",()=>{Ce.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 Ce.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 k&&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&&Ce.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 Ce.Block(t),this.root}}let yr=null;function kO(){yr||(yr=new OO),yr.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,m_(o,...arguments)}finally{e=!1}}}}function MO(){yr?.onDisable();for(const o in cc)console[o]=cc[o]}const hc=new Map;function m_(o,...e){try{switch(hc.clear(),o){case"log":yr?.addLog("log",t());break;case"warn":yr?.addLog("warn",t());break;case"error":yr?.addLog("error",t());break}}catch(s){console.error("Error in spatial console",s)}finally{hc.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 ee)return`(${i(s.x)}, ${i(s.y)})`;if(s instanceof b)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)})`;if(s instanceof me)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 Le)return s.name;if(s instanceof nb)return`[${s.elements.join(", ")}]`;if(s instanceof K)return`[${s.elements.join(", ")}]`;if(s instanceof ps)return s.mask.toString();if(typeof s=="object"){if(hc.has(s))return"*";let a=`{
|
|
83
|
+
`;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(hc.has(p)){c+="";continue}hc.set(p,!0),c+=d+":"+i(p,r+1),h<l.length-1&&(c+=", "),c.length>=60&&(c+=`
|
|
84
|
+
`,c+=n(r),a+=c,c="")}return a+=c,a+=`
|
|
85
|
+
}`,a}return s}function n(s){let r="";for(let a=0;a<s;a++)r+=" ";return r}}const RO=v("nodevlogs");function Ee(o,e=Ri.Log){mr(e,o)}function be(o){Ee(o,Ri.Warn)}function dc(o){Ee(o,Ri.Error)}let sg,rg;function A(){if(RO)return!1;if(sg!==void 0)return sg;if(rg!==void 0)return rg;let o=$i();return o||(o=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),rg=o,o}function EO(o){sg=o}let ci,br=null,$n=null,uc=!1,g_=null;const f_="terminal",TO=v("console");TO&&ag();const AO=Symbol("consoleParent");function ag(){if(ci){ci.showSwitch();return}BO()}function y_(){ci&&(ci.hide(),ci.hideSwitch())}function IO(){g_||(g_=setInterval(LO,500))}let b_=0;function LO(){const o=Hb(),e=o!==b_;b_=o,e&&DO()}function DO(){ag(),$n&&($n.setAttribute("error","true"),$n.innerText="\u{1F92C}")}function jO(){$n&&($n.removeAttribute("error"),$n.innerText=f_)}function BO(o=!1){if(ci!==void 0||uc)return;uc=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),uc=!1,ci=null;return}uc=!1,IO(),ci=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&ci.addPlugin(FO()),ci.addPlugin(VO()),ci.addPlugin(WO()),br=ek(),br&&(br[AO]=br.parentElement,br.style.position="absolute",br.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),ci.setSwitchPosition(20,30),$n=JO(),$n){$n.innerText=f_,$n.addEventListener("click",jO);const i=document.createElement("style"),n=40;i.innerHTML=`
|
|
86
|
+
#__vconsole .vc-switch {
|
|
87
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
88
|
+
border-radius: 50%;
|
|
89
|
+
width: ${n}px;
|
|
90
|
+
height: ${n}px;
|
|
91
|
+
padding: 0;
|
|
92
|
+
line-height: ${n}px;
|
|
93
|
+
font-size: ${n*.4}px;
|
|
94
|
+
text-align: center;
|
|
95
|
+
background: #ffffff5c;
|
|
96
|
+
backdrop-filter: blur(16px);
|
|
97
|
+
-webkit-backdrop-filter: blur(16px);
|
|
98
|
+
user-select: none;
|
|
99
|
+
pointer-events: auto;
|
|
100
|
+
transition: transform .2s ease-in-out;
|
|
101
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
102
|
+
|
|
103
|
+
font-family: 'Material Symbols Outlined';
|
|
104
|
+
color: black;
|
|
105
|
+
font-size: 2.3em;
|
|
106
|
+
font-weight: 100;
|
|
107
|
+
}
|
|
108
|
+
#__vconsole .vc-switch:hover {
|
|
109
|
+
cursor: pointer;
|
|
110
|
+
transform: scale(1.1);
|
|
111
|
+
transition: transform .1s ease-in-out, background .1s linear;
|
|
112
|
+
background: rgba(245, 245, 245, .8);
|
|
113
|
+
outline: rgba(0, 0, 0, .05) 1px solid;
|
|
114
|
+
}
|
|
115
|
+
#__vconsole .vc-switch[error] {
|
|
116
|
+
background: rgba(255,0,0,.2);
|
|
117
|
+
animation: vconsole-notify 1s ease-in-out;
|
|
118
|
+
line-height: 35px;
|
|
119
|
+
}
|
|
120
|
+
@keyframes vconsole-notify {
|
|
121
|
+
from {
|
|
122
|
+
transform: scale(1, 1);
|
|
123
|
+
}
|
|
124
|
+
10% {
|
|
125
|
+
transform: scale(1.3, 1.3);
|
|
126
|
+
}
|
|
127
|
+
70% {
|
|
128
|
+
transform: scale(1.4, 1.4);
|
|
129
|
+
}
|
|
130
|
+
to {
|
|
131
|
+
transform: scale(1, 1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
#__vconsole .vc-panel {
|
|
135
|
+
font-family: monospace;
|
|
136
|
+
font-size: 11px;
|
|
137
|
+
}
|
|
138
|
+
#__vconsole .vc-plugin-box.vc-actived {
|
|
139
|
+
height: 100%;
|
|
140
|
+
}
|
|
141
|
+
#__vconsole .vc-mask {
|
|
142
|
+
overflow: hidden;
|
|
143
|
+
}
|
|
144
|
+
`,br?.prepend(i),o===!0&&Hb()<=0&&y_(),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.":"")),uc=!1,ci=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function FO(){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"),ci?.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 lg="padding: 10px; font-family: monospace;",__="margin-bottom: 10px;",_r="margin-bottom: 10px; margin-top: 15px;",UO="width: 100%; border-collapse: collapse; border: 1px solid rgba(0,0,0,0.1); table-layout: fixed;",v_="border: 1px solid rgba(0,0,0,0.1); padding: 5px;",zO=v_,NO=v_+" word-break: break-all;";function Hn(o,e=!1){e&&o.sort((i,n)=>(n.value?1:0)-(i.value?1:0));let t=`<table style='${UO}'>`;t+="<tbody>";for(const i of o){const n=typeof i.value=="boolean"?i.value?"\u2705":"\u274C":i.value;t+=`<tr><td style='${zO}'>${i.label}</td><td style='${NO}'>${n}</td></tr>`}return t+="</tbody></table>",t}function w_(){try{if(document.createElement("canvas").getContext("webgl2"))return"\u2705"}catch{}return"\u274C"}function VO(){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='${lg}'>`;const i=KO();t+=`<h3 style='${__}'>Device: ${i}</h3>`,t+=Hn([{label:"\u{1F4BB} Desktop",value:L.isDesktop()},{label:"\u{1F4F1} Mobile Device",value:L.isMobileDevice()},{label:"\u{1F34E} iOS",value:L.isiOS()},{label:"\u{1F4F1} iPad",value:L.isiPad()},{label:"\u{1F916} Android",value:L.isAndroidDevice()},{label:"\u{1F98A} Mozilla XR",value:L.isMozillaXR()},{label:"\u{1F335} Needle App Clip",value:L.isNeedleAppClip()},{label:"\u{1F34F} macOS",value:L.isMacOS()},{label:"\u{1F453} VisionOS",value:L.isVisionOS()},{label:"\u{1F9ED} Safari",value:L.isSafari()},{label:"\u{1F576}\uFE0F Meta Quest",value:L.isQuest()},{label:"\u{1F517} QuickLook AR Support",value:L.supportsQuickLookAR()}],!0);const n=[],s=L.getiOSVersion();s&&n.push({label:"\u{1F34E} iOS Version",value:s});const r=L.getChromeVersion();r&&n.push({label:"\u{1F310} Chrome Version",value:r});const a=L.getSafariVersion();a&&n.push({label:"\u{1F9ED} Safari Version",value:a}),n.length>0&&(t+=Hn(n,!1)),t+="</div>",t+=`<div style='${lg} margin-top: 20px;'>`,t+=`<h3 style='${__}'>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:w_()}];t+=Hn(l,!1),t+="</div>",e(t)}),o}function WO(){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='${lg}'>`;const i=$O();i.length>0&&(t+=`<h3 style='${_r}'>General GPU Info</h3>`,t+=Hn(i,!1));const n=GO();n.length>0&&(t+=`<h3 style='${_r}'>WebGL</h3>`,t+=Hn(n,!1));const s=qO();s.length>0&&(t+=`<h3 style='${_r}'>WebGL 2 Features</h3>`,t+=Hn(s,!1));const r=XO();r.length>0&&(t+=`<h3 style='${_r}'>WebGL Limits</h3>`,t+=Hn(r,!1));const a=QO();a.length>0&&(t+=`<h3 style='${_r}'>Texture Formats</h3>`,t+=Hn(a,!1));const l=await YO();if(l.length>0&&(t+=`<h3 style='${_r}'>WebGPU</h3>`,t+=Hn(l,!1)),L.isSafari()){const c=ZO();c.length>0&&(t+=`<h3 style='${_r}'>Safari GPU Info</h3>`,t+=Hn(c,!1))}t+="</div>",e(t)}),o}function $O(){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=L.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=x_();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=HO(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 HO(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 GO(){const o=[],e=x_();return e&&(o.push({label:"\u{1F4CA} WebGL Version",value:e.version}),o.push({label:"\u{1F3AE} WebGL 2 Available",value:w_()})),o}function qO(){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 XO(){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 QO(){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 YO(){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 x_(){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 ZO(){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 KO(){return L.isQuest()?"Meta Quest":L.isVisionOS()?"Vision Pro":L.isiOS()?L.isiPad()?"iPad":"iPhone/iPod":L.isAndroidDevice()?"Android Device":L.isMozillaXR()?"Mozilla XR Browser":L.isNeedleAppClip()?"Needle App Clip":L.isMacOS()?"Mac":L.isDesktop()?"Desktop PC":"Unknown Device"}function JO(){return document.querySelector("#__vconsole .vc-switch")||null}function ek(){return document.querySelector("#__vconsole")||null}const S_=v("debugdefines");bs('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),bs('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),bs('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),bs('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),bs('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.12.0-beta.2";'),bs('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),bs('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Jan 22 2026 17:54:07 GMT+0000 (Coordinated Universal Time)";'),bs('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const _n="4.12.0-beta.2",Nd="undefined",cg="Thu Jan 22 2026 17:54:07 GMT+0000 (Coordinated Universal Time)";S_&&console.log(`Engine version: ${_n} (generator: ${Nd})
|
|
145
|
+
Project built at ${cg}`);const ja=NEEDLE_PUBLIC_KEY,Mo="needle_isActiveInHierarchy",vr="builtin_components",pc="needle_editor_guid";function bs(o){try{(0,eval)(o)}catch(e){S_&&console.error(e)}}let C_,P_=null;function vn(){return C_}function hg(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}P_!==o&&(P_=o,C_=new o)}function tk(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.")}}const Ei=Symbol("shadowDomOwner"),ik=v("debugpatch");function Vd(o,e,t,i){const n=ik===e;if(!t&&!i)return;const s=e+"___needle";ok(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]=k_(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]=k_(l,o,e);else{const c=this[s];M_(o,e,this,c,l),this[s]=l,R_(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function nk(o,e,t){const i=ug(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 O_=Symbol("Needle:Patches:WrappedFunction");function k_(o,e,t){if(o[O_])return o;const i=function(...n){M_(e,t,this,...n);const s=o.apply(this,n);return R_(e,t,this,s,...n),s};return i[O_]=!0,i}const Wd="Needle:Patches";function dg(){return globalThis[Wd]||(globalThis[Wd]=new WeakMap),globalThis[Wd]}function ug(o,e){const t=dg().get(o);return t?t.get(e):null}function ok(o,e,t,i){let n=dg().get(o);n||(n=new Map,dg().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function M_(o,e,t,...i){if(!t)return;const n=ug(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function R_(o,e,t,i,...n){if(!t)return;const s=ug(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}const Ba=[];function $d(o){Ba.indexOf(o)===-1&&Ba.push(o)}function sk(o){const e=Ba.indexOf(o);e!==-1&&Ba.splice(e,1)}const Fa=[];function pg(o){Fa.indexOf(o)===-1&&Fa.push(o)}function rk(o){const e=Fa.indexOf(o);e!==-1&&Fa.splice(e,1)}function E_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<Ba.length;e++)Ba[e](o)}function T_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<Fa.length;e++)Fa[e](o)}const rt=v("debuginput");var Hd=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(Hd||{}),Te=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Te||{});class Ro extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new vo(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(),rt&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class mc extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class ak{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var hi=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(hi||{});class A_{_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 mc){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 Ro){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,rt&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,rt&&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 ee];_pointerPositionsLastFrame=[new ee];_pointerPositionsDelta=[new ee];_pointerPositionsRC=[new ee];_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":rt&&Ee("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":rt&&Ee("Create Pointer move"),this.onMove(e);break;case"pointerup":rt&&Ee("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&&L.isMozillaXR()?!0:(rt&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(rt&&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 mc("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 mc("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 mc("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;e.target instanceof HTMLElement&&e.target.setPointerCapture(e.pointerId);const t=this.getPointerId(e);rt&&Ee(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Ro("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 Ro("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||(rt&&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 Ro("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,rt&&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 Ro("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 Ro("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 Ro("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 K;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new k,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||B(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 rt&&!s&&console.log("Not in rect",t,i,n),s}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,rt?e:""),rt&&console.log(e.pointerType,"DOWN",t),!!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 ee);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)){rt&&console.log(e.pointerType,"UP",t,"was not down");return}rt&&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]){rt&&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;rt&&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 ee);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new ee);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new ee);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 ee);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):(rt&&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 Ua=new K().makeRotationY(Math.PI),Hi=new N().setFromAxisAngle(new b(0,1,0),Math.PI),lk=v("debugwebxr");class ck{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new k,this.gameObject.name="Implicit XR Rig",lk){const e=Mg(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Eo=v("debugwebxr"),Gd=v("debugcustomgesture"),hk="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",dk="generic-trigger",uk=new N().setFromEuler(new st(wo.degToRad(0),wo.degToRad(-90),wo.degToRad(-90))),pk=new b(.04,-.04,0);class mg{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 K;_gripPosition=new b;_gripQuaternion=new N;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new N;_rayMatrix=new K;_rayPosition=new b;_rayQuaternion=new N;get gripPosition(){return B(this._gripPosition)}get gripQuaternion(){return li(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return B(this._linearVelocity).applyQuaternion(Hi)}get rayPosition(){return B(this._rayPosition)}get rayQuaternion(){return li(this._rayQuaternion)}get gripWorldPosition(){return B(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return li(this._gripWorldQuaternion)}_gripWorldQuaternion=new N;get rayWorldPosition(){return B(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 li(this._rayWorldQuaternion)}_rayWorldQuaternion=new N;get pinchPosition(){return B(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(Hi),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(B(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=B(0,1,0).applyQuaternion(e.quaternion),i=B(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 Pi(.15);_debugGripAxesHelper=new Pi(.07);_debugRayAxesHelper=new Pi(.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 k,this._object.name=`NeedleXRController_${i}`,Eo&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new k,this._raySpaceObject=new k,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 vo,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(){F.DrawSphere(this.rayWorldPosition,.003),F.DrawDirection(this.rayWorldPosition,B(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(`
|
|
146
|
+
`);let i=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
|
|
147
|
+
C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(i+=`
|
|
148
|
+
Pinch: ${this.getGesture("pinch")?.value.toFixed(3)}`),i+=`
|
|
149
|
+
`+t,i+=`
|
|
150
|
+
`+(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+=`
|
|
151
|
+
[axes `+n.axes.length+"]: "+n.axes.map(r=>r.toPrecision(1)).join(","),i+=`
|
|
152
|
+
`+s}if(this._layout){i+=`
|
|
153
|
+
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+=`
|
|
154
|
+
${n}: ${this._layout.components[n]?.type} [${a}] (${s.x.toPrecision(2)},${s.y.toPrecision(2)})`}}F.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(Ua),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,B(1,1,1)),s=B(h.position),r=li(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=B(d.position),n=li(d.orientation),this._gripMatrix.fromArray(d.matrix).premultiply(Ua),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,B(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(Hi)}h||(this._object.position.copy(this._rayPosition),this._object.quaternion.copy(this._rayQuaternion).multiply(Hi));const m=a.get("middle-finger-metacarpal"),f=m&&this.getHandJointPose(m,e);f&&(this._gripMatrix.fromArray(f.transform.matrix).premultiply(Ua),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,B(1,1,1)),i=B().copy(f.transform.position),n=li().copy(f.transform.orientation),n.multiply(uk),i.add(B(pk).applyQuaternion(n)))}else this.inputSource.gripSpace&&this.targetRayMode==="transient-pointer"&&i&&n?(this._object.position.copy(i),this._object.quaternion.copy(n).multiply(Hi)):s&&r&&(this._object.position.copy(s),this._object.quaternion.copy(r).multiply(Hi));Eo&&(s&&r&&(this._raySpaceObject?.position.copy(s),this._raySpaceObject?.quaternion.copy(r).multiply(Hi)),i&&n&&(this._gripSpaceObject?.position.copy(i),this._gripSpaceObject?.quaternion.copy(n).multiply(Hi)));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(Hi),c&&this._gripWorldQuaternion.premultiply(c)),this.updateRayWorldPosition(),this.updateRayWorldQuaternion()}onDisconnected(){this._connected=!1,Eo&&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 L_(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 L_(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=mP(this.inputSource,hk,dk);this.getMotionController=e.then(t=>{if(!this.connected)return null;this._motioncontroller=new gP(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),!Gd&&(Eo&&F.DrawDirection(this.rayWorldPosition,B(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Te.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSelectEnd=e=>{this.emitPointerUpEvent&&(Gd||this.inputSource===e.inputSource&&this.emitPointerEvent(Te.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&&(Eo&&F.DrawDirection(this.rayWorldPosition,B(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Te.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)))};onSequeezeEnd=e=>{this.emitPointerUpEvent&&this.inputSource===e.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Te.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 I_;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"),(Eo||Gd)&&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 I_,a=(.02+.01)*1.5;r.value=1-(n-.02)/a;const l=n<.02-.01,c=n>.02+.01;l&&!r.pressed?(Gd&&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),Eo&&F.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){Eo&&e!==Te.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,Eo&&e!=="pointermove"&&console.warn("Pointer event",e,t,i,{...this.pointerInit}),this.xr.context.input.createInputEvent(new Ro(e,s,this.pointerInit)),z.Current=a}}}class I_{isDown=!1;isUp=!1;pressed=!1;value=0}class L_{index;name;touched=!1;pressed=!1;value=0;isDown=!1;isUp=!1;constructor(e,t){this.index=e,this.name=t}}var gg=(o=>(o.Visible="application-visible",o.Hidden="application-hidden",o.MuteChanged="application-mutechanged",o))(gg||{});let gc=!1;const wr=[];function xr(){if(gc)return;A()&&console.debug("[Needle Engine] User input registered: Media playback is now allowed."),gc=!0;const o=[...wr];wr.length=0,o.forEach(e=>e())}document.addEventListener("mousedown",xr),document.addEventListener("pointerup",xr),document.addEventListener("click",xr),document.addEventListener("dragstart",xr),document.addEventListener("touchend",xr),document.addEventListener("keydown",xr),typeof window<"u"&&"userActivation"in navigator&&navigator.userActivation?.isActive&&(A()&&console.debug("[Needle Engine] User input already active: Media playback is now allowed."),wr.length=0,gc=!0);class Bn extends EventTarget{static get userInteractionRegistered(){return gc}static registerWaitForAllowAudio=Bn.registerWaitForInteraction;static registerWaitForInteraction(e){if(e!==null){if(gc){e();return}wr.indexOf(e)===-1&&wr.push(e)}}static unregisterWaitForInteraction(e){const t=wr.indexOf(e);t!==-1&&wr.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}}}const za=new Map,Na=new Map;let D_=0;function To(o,e,t){if(za.has(e)||za.set(e,new Array),za.get(e).push({method:o,options:{once:!1,...t}}),D_<30){const i=Na.get(e);i&&i?.length>100&&(D_+=1,console.warn(`You have ${i.length} methods registered for Event ${e}.
|
|
155
|
+
|
|
156
|
+
This might be a performance issue!
|
|
157
|
+
Consider unregistering the methods when they are not needed anymore!
|
|
158
|
+
|
|
159
|
+
To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
|
|
160
|
+
|
|
161
|
+
or by using the once option like onStart(()=>{}, { once:true }).
|
|
162
|
+
|
|
163
|
+
See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function _s(o,e){const t=Na.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=za.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Gn(o,e){e===ue.ContextCreated&&fg.delete(o),j_(o,e)}function j_(o,e){e===xe.Start&&za.get(ue.ContextCreated)&&j_(o,ue.ContextCreated);const t=e===xe.Start||e===ue.ContextCreated,i=Na.get(e);i&&i.length>0&&F_(o,i,t);const n=za.get(e);if(n&&n.length>0){const s=[...n];n.length=0,F_(o,s,t),s.length>0&&(Na.has(e)||Na.set(e,new Array),Na.get(e).push(...s))}}const qd=new Array,B_={context:null};function F_(o,e,t){qd.length=0;for(let n=0;n<e.length;n++)qd.push(e[n]);let i=fg.get(o);for(let n=0;n<qd.length;n++){const s=qd[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{B_.context=o,s.method?.call(B_,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,fg.set(o,i)),i.add(s))}}const fg=new WeakMap,yg={};function bg(o,e){yg[o]=e}function U_(o){const e=o.getBufferIdentifier(),t=yg[e];return t(o)}function z_(o){return typeof o.guid=="function"?o.guid():null}let _g;function mk(){return _g}function gk(o){_g=o}function N_(o,e){return e||(e={}),e={..._g,...e},o?new Ob(o,e):new Ob(e)}async function V_(){const o=await import("./vendor-sURMCFSI.min.js").then(e=>e.bundler);return console.log(o),o.default===void 0?o:o.default}class W_{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 V_(),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 yk(i)})}async trySetupClient(e){const t=await V_();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 fk{_peer;constructor(e){this._peer=e}}class yk extends fk{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)}}}}var wn=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(wn||{});const $_="https://urls.needle.tools/default-networking-backend/index";let Gi="wss://networking.needle.tools/socket";const di=!!v("debugnet"),fc=!!(di||v("debugowner")),Xd=v("debugnetbin");var H_=(o=>(o.ConnectionInfo="connection-start-info",o))(H_||{}),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 bk{room;viewId;allowEditing;inRoom}class _k{room}class vk{userId}var G_=(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))(G_||{});class vg{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;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||(fc&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let i=0;const n=()=>{if(i++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):n()},100)};n()})}requestOwnership(){return fc&&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)}onGainedOwnership(e){e.guid===this.guid&&(this._isOwned=!0,this.connection.connectionId===e.owner?(fc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(fc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class q_{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new W_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return di}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(),di&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},wn.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=wn.Queued){if(t===null&&(t={}),i===wn.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){Xd&&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,wn.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&di&&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!==Gi)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?Gi=t:Db()&&(Gi="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){this._ws?.close(),this._ws=void 0,Gi=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(Gi===void 0&&(console.log("Fetch default backend url: "+$_),Gi=await(await fetch($_)).text()),Gi===void 0){n(!1);return}console.debug(`Connecting to networking backend on
|
|
164
|
+
`+Gi);const s=await import("./vendor-sURMCFSI.min.js").then(c=>c.index),r=s.default?.WebsocketBuilder??s.WebsocketBuilder,a=s.default?.ExponentialBackoff??s.ExponentialBackoff,l=new r(Gi).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,A()||di?console.log(`Connected to networking backend
|
|
165
|
+
`+Gi):console.debug("Connected to networking backend",Gi),n(!0),this.onSendQueued(wn.OnConnection)}).onClose(c=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let h="Websocket connection closed...";Gi?.includes("/socket")||(h+=' Do you perhaps mean to connect to "/socket"?'),console.error(h)}).onError(c=>{console.error("Websocket connection failed..."),n(!1)}).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){di&&i==="pong"?console.log("<<",i):A()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){Xd&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new fP(i),s=n.getBufferIdentifier(),r=this._listenersBinary[s],a=U_(n),l=z_(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(di&&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)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(di&&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),(Xd||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}
|
|
166
|
+
${a.href}`)}this.onSendQueued(wn.OnRoomJoin);break;case"left-room":const n=e;n.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(Xd||A())&&console.debug("Left Needle Engine Room: "+n.room));break;case"user-joined-room":if(e.data){const r=e.data;this._currentInRoom.push(r.userId),di&&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&&(di&&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":di&&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),di&&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=wn.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));di&&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 yc=v("debugwebxr");class wg{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=>{yc&&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||(yc&&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),yc&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class X_{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)||(yc&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new wg(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new wg(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)||(yc&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new wg(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 Q_{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new Se({color:0,transparent:!0,depthTest:!1,fog:!1,side:Oi}),this._fadeToColorQuad=new H(new zn(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}var Sr=(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))(Sr||{});class Cr{static createText(e,t){let i=null;const n=t?.font||xk(t?.familyFamily||null);n instanceof YC?i=this.#t(e,n,t):i==null&&(i=new fn);const s=t?.color||16777215,r=new H(i,t?.material??new mt({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 ZC(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 Se({colorWrite:!1,depthWrite:!0,side:Oi});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 zn(1,1,1,1),r=t?.material??new mt({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 ka(1,1,1),r=t?.material??new mt({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=wk(1,1,1,.1,2),r=t?.material??new mt({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 vd(.5,16,16),r=t?.material??new mt({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 ob(.5,.5,1,32),r=t?.material??new mt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cylinder"}break;case"ShaderBall":i=new xo,i.name="ShaderBall",Sk(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const t=new AS({color:16777215});e?.texture&&"map"in t&&(t.map=e.texture);const i=new IS(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 wk(o,e,t,i,n){const s=new LS,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 DS(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 ee(h[p]/o,h[p+1]/e));return d},generateSideWallUV:(c,h,d,p,m,f)=>{const g=[];return g.push(new ee(h[d]/o,h[d+1]/e)),g.push(new ee(h[p]/o,h[p+1]/e)),g.push(new ee(h[m]/o,h[m+1]/e)),g.push(new ee(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 Qd=new Map;function xk(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://raw.githubusercontent.com/mrdoob/three.js/master/examples/fonts/helvetiker_regular.typeface.json";break}if(Qd.has(e)){const n=Qd.get(e);if(n)return n}const t=new KC,i=new Promise((n,s)=>{t.load(e,r=>{Qd.set(e,r),n(r)},void 0,s)});return Qd.set(e,i),i}let xg=!1,Sg=null;function Sk(o,e){if(Sg===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new Po,n=Rm(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),xg=!0,Sg=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),Z_())).finally(()=>{xg=!1})}if(xg){const t=Z_();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&Y_(i,e),o.add(t)}Sg.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(),Y_(n,e)),o.add(i)})}function Y_(o,e){if(e?.color||e?.material||e?.texture){const t=e?.material??o.material?.clone()??new mt;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 Z_(){return new xo().add(Cr.createPrimitive("Sphere",{material:new Se({transparent:!0,opacity:.1})}))}class ql{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 ql(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 ko(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}_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 hr({alpha:!0,antialias:!0}),this._renderer.outputColorSpace="srgb",this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._renderer.setPixelRatio(Math.min(2,window.devicePixelRatio)),this._renderer.setSize(window.innerWidth,window.innerHeight),this._camera=new ae,this._scene=new Si,this._scene.fog=new sb(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;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)};async onBeforeHandoff(){await ko(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new oe(0),this._scene.add(new gm(5,10,1118481,1118481));const e=new fm(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new fm(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new ym(16777215,1,100,1);i.position.set(0,2,0),i.castShadow=!1,i.distance=200,this._scene.add(i);const n=50;for(let s=0;s<100;s++){const r=new mt({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new oe(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=D.random(0,1)>.5?Sr.Sphere:Sr.Cube,l=Cr.createPrimitive(a,{material:r});l.position.x=D.random(-n,n),l.position.y=D.random(-2,n),l.position.z=D.random(-n,n),l.rotation.x=D.random(0,Math.PI*2),l.rotation.y=D.random(0,Math.PI*2),l.rotation.z=D.random(0,Math.PI*2),l.scale.multiplyScalar(.5+Math.random()*10);const c=l.position.distanceTo(this._camera.position)-l.scale.x;c<1&&l.position.multiplyScalar(1+1/c),this._objects.push(l),this._scene.add(l)}}update(e,t){const i=e*4e-4;for(let n=0;n<this._objects.length;n++){const s=this._objects[n];s.position.y+=Math.sin(i+n*.5)*.005,s.rotateY(.002)}}}var bc;(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})(bc||(bc={}));const qe=v("debugwebxr"),K_=v("stats");let Cg=0;function Ck(o){let e=null;const t=o;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=o,e}Pk();async function Pk(){let o="immersive-vr";try{if(L.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(v("debugasap")){let e=globalThis["needle:XRSession"];if(e instanceof Promise){delete globalThis["needle:XRSession"],pe.addContextCreatedCallback(async t=>{if(!e)return;Da(!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(J_()&&(await ql.start(e||o,i||Z.getDefaultSessionInit(o)).catch(s=>console.warn("[NeedleXRSession:granted] TemporaryXRContext start failed:",s)),await Mk(),n=await ql.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 Ok(o,e){sessionStorage.setItem("needle_xr_session_mode",o),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function kk(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const Pg=new Set;pe.registerCallback(ue.ContextCreationStart,async o=>{Pg.add(o.context)}),pe.registerCallback(ue.ContextCreated,async o=>{Pg.delete(o.context);const e=o.context?.domElement.getAttribute("autostart")||null;Rk(e)});function J_(){return Pg.size>0}function Mk(){return new Promise(o=>{const e=Date.now(),t=setInterval(()=>{(!J_()||Date.now()-e>6e4)&&(clearInterval(t),o())},100)})}L.isDesktop()&&A()&&window.addEventListener("keydown",o=>{(o.key==="x"||o.key==="Escape")&&Z.active&&Z.stop()});function Rk(o){o&&o?.toLowerCase()==="ar"&&Bn.registerWaitForInteraction(()=>{Z.start("ar")})}const Yd=Symbol("initial-fov");class Z{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new X_(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.xrSystem?.isSessionSupported(e).catch(t=>(qe&&console.error(t),!1))??Promise.resolve(!1)}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 L.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return L.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(L.isiOS()){const r=await this.isARSupported().catch(()=>!1);if(L.isVisionOS()&&!r&&(e==="ar"||e==="immersive-ar")&&(e="quicklook"),e==="quicklook")return Dr.sendEvent(z.Current,"xr",{action:"quicklook_export",source:"NeedleXRSession.start"}),bc.exportAndOpen(),null;if(!r&&(e==="immersive-ar"||e==="ar")){const a=new URL("https://appclip.apple.com/id?p=tools.needle.launch-app.Clip");a.searchParams.set("url",location.href);const l=a.toString();Dr.sendEvent(z.Current,"xr",{action:"app_clip_launch",source:"NeedleXRSession.start",url:l});const c=window.top||window;try{console.debug("iOS device detected - opening Needle App Clip for AR experience",{mode:e,init:t,url:a}),c.location.href=l}catch(h){console.warn("Error navigating to AppClip "+l+`
|
|
167
|
+
`,h),window!==window.top?window.open(l,"_blank"):window.location.href=l}return null}}if(e==="quicklook")return console.warn("QuickLook mode is only supported on iOS devices"),null;if(e=="ar"&&(e="immersive-ar"),A()&&v("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await ql.start(e,t||Z.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(qe||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(t||(t={}),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=Ck(i.domElement);a&&!L.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 ql.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;qe?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);for(const r of this._sessionRequestStartListeners)r({mode:e,init:t});qe&&Ee("Requesting "+e+" session ("+Date.now()+")"),Dr.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)")});this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const r of this._sessionRequestEndListeners)r({mode:e,init:t,newSession:s||null});return s?this.setSession(e,s,t,i):(console.warn("XR Session request was rejected"),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),qe?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?(qe&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):qe&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{qe&&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()&&L.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&&Tr(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 B(0,0,0);const t=B(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(li(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(Tr(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)}qe&&(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=B(i.transform.position),s=li(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(Ua),r?.parent){n.applyMatrix4(r.parent.matrixWorld),s.multiply(Hi);const a=_e(r.parent);a.premultiply(Hi),s.premultiply(a)}return{hit:e,position:n,quaternion:s}}return null}convertSpace(e){const t=B(e.position);t.applyMatrix4(Ua);const i=li(e.orientation);return i.premultiply(Hi),{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){Ok(e,n.init),this.session=t,this.mode=e,this.context=i,(qe||v("console"))&&Da(!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,To(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=J(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 ae&&(this.context.mainCamera[Yd]=this.context.mainCamera.fov)),this._defaultRig=new ck,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):qe&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}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 mg(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(s,r)=>{if(s.inputSource===e){qe&&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"),kk(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,_s(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()}),T_({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&&ft(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&bn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&La(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof ae&&this.context.mainCamera[Yd]&&(this.context.mainCamera.fov=this.context.mainCamera[Yd],this.context.mainCamera[Yd]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),Da(!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&&(qe&&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=Qt(this.context.scene.children);if(s){const r=s.getSize(B());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(B());l.y=a.position.y,a.lookAt(l)}}}E_({session:this}),xr();for(const s of Z._xrStartListeners)s(i);const n=[...this._xr_scripts];qe&&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)}qe&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(Da(!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(qe)for(const e of this.controllers)e.onRenderDebug();if((qe||K_)&&this.rig&&(Cg++,Cg>=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()}`,qe||K_)for(const s of this.controllers)n+=`
|
|
168
|
+
${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;Cg=0,F.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof ae&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),L.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:(qe&&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){qe&&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 k().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 ae&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,qe&&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 ae&&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 Q_),this._transition}fadeTransition(){return this._transition||(this._transition=new Q_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof ae&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const Og=v("debugwebxr");class ev{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(Og&&console.log("FOUND AVATAR HEAD",e.name),i.head=new ne("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(Og&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new ne("",t,e)),!i.rightHand&&n.includes("right")&&(Og&&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 jt=new b,tv=new b,iv=new N,Ek=v("debuggizmos"),xn=8947848,kg=32;class F{constructor(){}static enabled=!0;static isGizmo(e){return e[Rg]!==void 0}static setVisible(e){for(const t of qi.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,s,r,a){if(!F.enabled)return null;s||(s=xn);const l=Z.active?.rigScale??1,c=qi.getTextLabel(n,t,i*l,s,r);return a instanceof k&&a.add(c),c.position.x=e.x,c.position.y=e.y,c.position.z=e.z,c}static DrawRay(e,t,i=xn,n=0,s=!0){if(!F.enabled)return;const r=qi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),jt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+jt.x,e.y+jt.y,e.z+jt.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,Sn(r.material,i)}static DrawDirection(e,t,i=xn,n=0,s=!0,r=1){if(!F.enabled)return;const a=qi.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(jt.set(0,0,-r),iv.set(t.x,t.y,t.z,t.w),jt.applyQuaternion(iv)):(jt.set(t.x,t.y,t.z),jt.multiplyScalar(r)),l.setXYZ(1,e.x+jt.x,e.y+jt.y,e.z+jt.z),l.needsUpdate=!0,a.material.depthTest=s,a.material.depthWrite=!1,Sn(a.material,i)}static DrawLine(e,t,i=xn,n=0,s=!0){if(!F.enabled)return;const r=qi.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,Sn(r.material,i)}static DrawCircle(e,t,i,n=xn,s=0,r=!0){if(!F.enabled)return;const a=qi.getCircle(s);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,jt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,Sn(a.material,n)}static DrawWireSphere(e,t,i=xn,n=0,s=!0){if(!F.enabled)return;const r=qi.getSphere(t,n,!0);gr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,Sn(r.material,i)}static DrawSphere(e,t,i=xn,n=0,s=!0){if(!F.enabled)return;const r=qi.getSphere(t,n,!1);gr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,Sn(r.material,i)}static DrawWireBox(e,t,i=xn,n=0,s=!0,r=void 0){if(!F.enabled)return;const a=qi.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,Sn(a.material,i)}static DrawWireBox3(e,t=xn,i=0,n=!0){if(!F.enabled)return;const s=qi.getBox(i);s.position.copy(e.getCenter(jt)),s.scale.copy(e.getSize(jt)),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1,Sn(s.material,t)}static _up=new b(0,1,0);static DrawArrow(e,t,i=xn,n=0,s=!0,r=!1){if(!F.enabled)return;const a=qi.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),jt.set(t.x,t.y,t.z).sub(tv.set(e.x,e.y,e.z)).normalize());const l=jt.set(t.x,t.y,t.z).sub(tv.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.depthTest=s,a.material.wireframe=r,Sn(a.material,i),this.DrawLine(e,t,i,n,s)}static DrawWireMesh(e){const t=qi.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,Sn(t.material,e.color??xn)}}const Tk=new ka(1,1,1);function Mg(o=null){const e=new oe(o??14540253),t=new jS(Tk);return new rb(t,new bm({color:e}))}function Sn(o,e){if(Array.isArray(o)){for(const i of o)Sn(i,e);return}const t=e instanceof se?e.a:1;o.color.set(e),o.opacity=t,o.transparent=t<1}const Rg=Symbol("GizmoCache");class qi{static familyName="needle-gizmos";static ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{Ce.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),Ek&&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 Tb(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 ka(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 Ma;let i=t.geometry.getAttribute("position");i||(i=new gt(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 Ma;let i=t.geometry.getAttribute("position");if(!i){i=new gt(new Float32Array(kg*3),3),t.geometry.setAttribute("position",i);const n=B(0,1,0),s=B(0,0,1),r=B(s);r.cross(n).normalize();const a=B(r),l=Math.PI*2/(kg-1);for(let c=0;c<kg+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 vd(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 ob(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 Se),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[Rg]=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,Ce.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof Ce.MeshUIBaseElement){if(Tr(n))continue;const s=e.isInVR,r=!1,a=!s;ac(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(),Tr(r)!=!0&&r[Rg].push(r))}}}const Yt=v("debugphysics"),Ak=v("debugworker"),nv=new ps;class vs{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 ee),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){nv.set(e),this.layerMask=nv}setMask(e){this.layerMask||(this.layerMask=new ps);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Eg{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class Xl{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 wd;defaultRaycastOptions=new vs;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new ps;sphere=new xd;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){Yt&&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 Yt&&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 BS&&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 ps?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Yt&&console.time("raycast"),s.length=0,Xl._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))),Xl._raycasting--,Yt&&(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||F.isGizmo(s)||n.lineThreshold!==void 0&&n.lineThreshold<0&&s instanceof Ma)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&&ov(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 Ta&&(d=!1),h==="lod"){const p=bb(s);p&&(a.geometry=p)}if(!d&&Lk(a,e,i)||(n.useAcceleratedRaycast!==!1?Kd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,Yt&&i.length!=c){const p=i[i.length-1];F.DrawWireSphere(p.point,.1,7798784,1,!1),F.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new Ci;intersectSphere(e,t,i,n,s,r,a,l){let c=e&&e.isMesh&&e.layers.test(n)&&!F.isGizmo(e);c&&=e.visible,c&&=!(e instanceof Ma),c&&=!(e instanceof Ta);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&&ov(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=s.length;if(Kd.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=J(e),g=f.distanceTo(m.center),y=new Eg(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 ov(o){return!(o.index&&o.index.array.length<3)}const Pr=new xd,Zd=new dr,Ik=new nb;function Lk(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 Ta){Zd.setFromNormalAndCoplanarPoint(B(0,1,0),B(0,-l.position.y,0)),Zd.applyMatrix4(l.matrixWorld,Ik);const d=s.ray.intersectPlane(Zd,B());if(d){Pr.copy(c),Pr.applyMatrix4(l.matrixWorld);const p=B(d).sub(s.ray.origin).length(),m=Pr.radius*.5;p<m&&r.push({distance:p,point:d,object:l,normal:Zd.normal.clone()})}return}Pr.copy(c),Pr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(Pr,B());if(h){const d=B(h).sub(s.ray.origin),p=d.length();if(p>Pr.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 Kd;(o=>{let e=0;function t(w,P,M,O,j){if(!P.geometry||!P.geometry.hasAttribute("position"))return!1;const I=P.geometry;if(P?.isSkinnedMesh){const W=P,V=W.bvhNeedsUpdate;if(!W.staticGenerator)l(),r&&(W.staticGenerator=new r(P),W.staticGenerator.applyWorldTransforms=!1,W.staticGeometry=W.staticGenerator.generate(),I.boundsTree=a?.call(W.staticGeometry),W.staticGeometryLastUpdate=performance.now()+Math.random()*200,W.bvhNeedsUpdate=!0);else if(I.boundsTree&&(W.autoUpdateMeshBvhInterval!==void 0&&W.autoUpdateMeshBvhInterval>=0||V===!0)){const G=performance.now(),X=G-W.staticGeometryLastUpdate,E=W.autoUpdateMeshBvhInterval??100;(V||X>E)&&(Yt&&console.warn(`Physics: updating skinned mesh bvh for ${P.name} after ${X.toFixed(2)}ms`),W.bvhNeedsUpdate=!1,W.staticGeometryLastUpdate=G,W.staticGenerator?.generate(W.staticGeometry),I.boundsTree.refit())}}else if(!I.boundsTree){h||_();let W=!0;if((O.xr||I[f]===!1||I.getAttribute("position")?.isInterleavedBufferAttribute||I.index&&I.index?.isInterleavedBufferAttribute||e>10)&&(W=!1),W&&p){if(I[m]===void 0){let V=null;if(y.length>0){const G=y.shift();G&&!G.running&&(V=G)}if(!V&&g.length<3)try{Ak&&console.warn("[GenerateMeshBVHWorker] Creating worker with import.meta.url:",import.meta.url),V=new p,g.push(V)}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(V!=null&&!V.running){const G=P.name;Yt&&console.log("<<<< worker start",G,V),I[m]="queued",performance.mark("bvh.create.start");const X=I.clone();try{V.generate(X).then(E=>{I[m]="done",I.boundsTree=E}).catch(E=>{I[m]="failed - "+E?.message,I[f]=!1,Yt&&console.error("Failed to generate mesh bvh on worker",E)}).finally(()=>{Yt&&console.log(">>>>> worker done",G,{hasBoundsTre:I.boundsTree!=null}),y.push(V),X.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(E){console.error("Failed to generate mesh bvh on worker",E)}}else Yt&&console.warn("No worker available")}}else(!d||!W)&&(l(),s&&(performance.mark("bvh.create.start"),I.boundsTree=new s(I),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(w instanceof wd){const W=w,V=P.raycast;if(I.boundsTree)l(),n&&(P.acceleratedRaycast||(P.acceleratedRaycast=n.bind(P),Yt&&console.debug(`Physics: bind acceleratedRaycast fn to "${P.name}"`)),P.raycast=P.acceleratedRaycast);else if(Yt&&console.warn("No bounds tree found for mesh",P.name,{workerTask:I[m],hasAcceleratedRaycast:n!=null}),j.allowSlowRaycastFallback===!1&&(I.getAttribute("position")?.array?.length??0)>2e3)return Yt&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const G=W.firstHitOnly;return W.firstHitOnly=!1,W.intersectObject(P,!1,M),W.firstHitOnly=G,P.raycast=V,!0}else if(w instanceof xd){const W=I.boundsTree;if(W){const V=w;if(c.copy(P.matrixWorld).invert(),V.applyMatrix4(c),W.intersectsSphere(V)){const G=J(P),X=G.distanceTo(V.center),E=new Eg(P,X,G);M.push(E)}}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-sURMCFSI.min.js").then(w=>w.index$1).then(w=>{n=w.acceleratedRaycast,s=w.MeshBVH,r=w.StaticGeometryGenerator,a=w.computeBoundsTree}).catch(w=>{(Yt||A())&&console.error("Failed to load BVH library...",w.message)}))}const c=new K;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(()=>FL).then(w=>{p=w.GenerateMeshBVHWorker}).catch(w=>{Yt||A()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",w)}).finally(()=>{d=!1})}})(Kd||(Kd={}));const sv=Symbol("gltf-loader-internal-usage-tracker"),Dk=v("debugusers");class Ql{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return Ql._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(){Ql._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[sv]=e._loadingId),r)),s},null}afterRoot(e){Ql._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[sv],t instanceof k&&(t.parent||t instanceof H&&setTimeout(()=>{Dk&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class rv{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:
|
|
169
|
+
`+i.src),e.preventDefault())}})}}const Jd=v("trackresources");function av(){return Jd==="dispose"}let Or=!0;Jd===0&&(Or=!1);function jk(o){Or=o}function lv(){return Or}const cv=Symbol("disposable");function hv(o,e){o&&(o[cv]=e,kr&&console.warn("Set disposable",e,o))}const dv=Symbol("disposed");function Bk(o){return o[dv]===!0}function Pe(o){if(o){if(o[cv]===!1){kr&&console.warn("Object is marked as not disposable",o);return}if(typeof o=="object"&&(o[dv]=!0),o instanceof Si)Pe(o.environment),Pe(o.background),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial);else if(o instanceof ms)Pe(o.geometry),Pe(o.material),Pe(o.skeleton),Pe(o.bindMatrix),Pe(o.bindMatrixInverse),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof H)Pe(o.geometry),Pe(o.material),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof k)o.visible=!1;else if(o instanceof fn){Va(o);for(const e of Object.keys(o.attributes)){const t=o.attributes[e];Pe(t)}}else if(o instanceof gt||o instanceof ab)kr&&console.warn("BufferAttribute dispose not supported",o.count);else if(o instanceof Array)for(const e of o)e instanceof we&&Pe(e);else if(o instanceof we){Va(o);for(const t of Object.keys(o)){const i=o[t];i instanceof Le&&Pe(i)}const e=o.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof Le?Pe(i):i instanceof Wi&&Pe(i.value)}}else o instanceof Le?(Va(o),Va(o.source),o.source?.data instanceof ImageBitmap&&Va(o.source.data)):o instanceof FS?(Va(o.boneTexture),o.boneTexture=null):o instanceof US||!(o instanceof k)&&kr&&console.warn("Unknown object type",o)}}function Va(o){o&&((kr||av()||Jd)&&console.warn("\u{1F9E8} FREE",o),o instanceof ImageBitmap||"dispose"in o&&typeof o.dispose=="function"&&o.dispose())}function Fk(o){}const Uk=new Set;function Tg(o,e,t=null,i){if(i||(i=Uk,i.clear()),!o)return i;const n=o[_c];if(n)for(const s of n)i.has(s)||t?.call(null,s)!==!1&&(i.add(s),e&&Tg(s,!0,t,i));return i}function zk(o){return o[vc]}const kr=v("debugresourceusers")||v("debugmemory"),_c=Symbol("needle-resource-users"),vc=Symbol("needle-resource-users-count");function Zt(o,e){Vd(o,e,function(t,i){Or&&!Xl.raycasting&&(eu(_c,this,t,!1),eu(_c,this,i,!0))})}Or&&(Zt(H.prototype,"material"),Zt(H.prototype,"geometry"),Zt(we.prototype,"map"),Zt(we.prototype,"bumpMap"),Zt(we.prototype,"alphaMap"),Zt(we.prototype,"normalMap"),Zt(we.prototype,"displacementMap"),Zt(we.prototype,"roughnessMap"),Zt(we.prototype,"metalnessMap"),Zt(we.prototype,"emissiveMap"),Zt(we.prototype,"specularMap"),Zt(we.prototype,"envMap"),Zt(we.prototype,"lightMap"),Zt(we.prototype,"aoMap"),Zt(we.prototype,"gradientMap"));function Nk(o){if(Or===!1)return;const e=o[_c];if(e)for(const t of e)eu(_c,t,o,!1)}Or&&Vd(we.prototype,"dispose",function(){Nk(this)});let Ag=0;function eu(o,e,t,i){if(Ag>0)return;if(Array.isArray(t)){for(const s of t)eu(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[vc]||0;s+=1,t[vc]=s,kr&&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[vc]||0;s>0&&(s-=1,t[vc]=s),kr&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,s,"users:",n),s<=0&&(Ql.isLoading(t)||(Jd&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),av()&&Pe(t)))}t[o]=n}try{Vd(hr.prototype,"render",function(){Ag++},function(){Ag--})}catch(o){console.warn("Could not wrap WebGLRenderer.render",o)}const uv=v("debugcomponentevents");class tu{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),uv&&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(uv&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const wc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),pv=Symbol("isUsingInstancing"),mv=Symbol("instancingRenderer"),xc=Symbol("instancingAutoUpdateBounds");class dn{static isUsingInstancing(e){return e[pv]===!0}static getRenderer(e){return e[mv]||null}setAutoUpdateBounds(e,t){const i=dn.getRenderer(e);i&&(i[xc]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[wc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)dn.markDirty(i,!0)}}var Sc;(o=>{o.experimentalSmartHierarchyUpdate=!1})(Sc||(Sc={}));function Wa(o,e){try{e||o()}catch(t){return console.error(t),!1}return!0}const Ig=v("debugnewscripts"),Vk=v("debughierarchy"),Ae=[];function Wk(){return Ae.length>0}function iu(o){if(Ig&&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)){Ae.length=0,o.new_scripts.length>0&&Ae.push(...o.new_scripts),o.new_scripts.length=0;for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.isComponent!==!0){(A()||Ig)&&console.error(`Registered script is not a Needle Engine component.
|
|
170
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
171
|
+
`,t),Ae.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
|
|
172
|
+
Did you add and remove a component in the same frame?`),Ae.splice(e,1),e--;continue}t.context=o,Cc(t.gameObject),Lg(t,o)}catch(t){console.error(t),Ao(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed){Ao(Ae[e],o),Ae.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),Cc(t.gameObject),t.activeAndEnabled&&Wa(t.__internalAwake.bind(t)))}catch(t){console.error(t),Ao(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed||t.enabled===!1||(Cc(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,Wa(t.__internalEnable.bind(t)))}catch(t){console.error(t),Ao(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed||!t.gameObject)continue;o.new_script_start.push(t)}catch(t){console.error(t),Ao(Ae[e],o),Ae.splice(e,1),e--}Ae.length=0;for(const e of o.new_scripts_post_setup_callbacks)e&&e();o.new_scripts_post_setup_callbacks.length=0}}function $k(o){o&&(o.__internalDisable(!0),Ao(o,o.context))}function gv(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;Wa(i.__internalAwake.bind(i)),i.enabled&&(Wa(i.__internalEnable.bind(i)),Wa(i.__internalStart.bind(i)),o.new_script_start.splice(t,1),t--)}catch(i){console.error(i),Ao(o.new_script_start[t],o),o.new_script_start.splice(t,1),t--}}function Lg(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),Dg(o,null)&&e.new_scripts_xr.push(o),Dg(o,"immersive-vr")&&e.scripts_immersive_vr.push(o),Dg(o,"immersive-ar")&&e.scripts_immersive_ar.push(o))}function Ao(o,e){Xi(o,e.new_scripts),Xi(o,e.new_script_start),Xi(o,e.scripts),Xi(o,e.scripts_earlyUpdate),Xi(o,e.scripts_update),Xi(o,e.scripts_lateUpdate),Xi(o,e.scripts_onBeforeRender),Xi(o,e.scripts_onAfterRender),Xi(o,e.scripts_pausedChanged),Xi(o,e.new_scripts_xr),Xi(o,e.scripts_immersive_vr),Xi(o,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(o)}function Xi(o,e){const t=e.indexOf(o);t>=0&&e.splice(t,1)}function Dg(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 jg=!0;function Bg(){jg=!0}function nu(o,e=!1){if(Sc.experimentalSmartHierarchyUpdate){if(!e&&!jg)return;jg=!1}if(o||(o=pe.Current.scene),!o){console.trace("Invalid call - no current context.");return}const t=Xa(o);fv(o,t,!0)||(Ig||A()?console.error(`Error updating hierarchy
|
|
173
|
+
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 fv(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=Xa(o);if(e&&(e=n,e&&o.parent&&i===0)){const a=o.parent;e=a[Mo],e===void 0&&(a instanceof Si||(e=!0))}const s=o[Mo]!==e;s&&(o[Mo]=e,Vk&&console.warn("ACTIVE CHANGE",o.name,n,o.visible,e,"changed?"+s,o),Hk(o,a=>{e?a.enabled&&(Wa(a.__internalAwake.bind(a)),a.enabled&&a.__internalEnable()):a.__didAwake&&a.enabled&&(a.__didEnable=!1,a.onDisable())}));let r=!0;if(o.children)for(const a of o.children)fv(a,e,t,i+1)===!1&&(r=!1);return r}function Cc(o){let e=!0,t=o,i=!1;for(;t&&t;){if(t.type==="Scene"&&(i=!0),!Xa(t)){e=!1;break}t=t.parent}if(!o){console.error("GO is null");return}o[Mo]=e&&i}function Hk(o,e){if(o.userData?.components)for(const t of o.userData.components)e(t)}const ou=new Map,yv=Symbol("prewarmFlag"),Fg=Symbol("waitingForPrewarm"),Ug=v("debugprewarm");function Gk(o,e){!o||o[yv]===!0||o[Fg]===!0||(ou.has(e)||ou.set(e,[]),o[Fg]=!0,ou.get(e).push(o),Ug&&console.debug("register prewarm",o.name))}let bv=null,_v=null;function qk(o){if(!o)return;const e=ou.get(o);if(!e?.length)return;const t=o.mainCamera;if(t){Ug&&console.log("prewarm",e.length,"objects",[...e]);const i=o.renderer;if(i.compile){const n=o.scene;i.compile(n,t),bv??=new zS(64),_v??=new NS(.001,9999999,bv),_v.update(i,n);for(const s of e)s[yv]=!0,s[Fg]=!1;e.length=0,Ug&&console.log("prewarm done")}}}pe.registerCallback(ue.ContextCreated,o=>{const e=o.context;Pv(e),xv(e)});const su=v("debugcomponents"),vv="eff8ba80-635d-11ec-90d6-0242ac120003";class Dt{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=Dt.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return kb(e,vv);const t=this._seed;return this._seed-=1,kb(t.toString(),vv)}initialize(e){typeof e=="string"?this._seed=Dt.hash(e):this._seed=e}static createFromString(e){return new Dt(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 wv=(o=>(o.NewInstanceCreated="new-instance-created",o.InstanceDestroyed="instance-destroyed",o))(wv||{});class Xk{guid;dontSave;constructor(e){this.guid=e}}function Pc(o,e,t=!0,i){if(!o)return;const n=o;if(Yi(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}zg(s,e,i)}function zg(o,e,t){const i=new Xk(o);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,wn.Queued)}function xv(o){o.connection.beginListen("instance-destroyed",e=>{su&&console.log("[Remote] Destroyed",o.scene,e);const t=Kg(e.guid,o.scene);t&&Yi(t)})}class Qk{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class Sv{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}function Ng(o,e,t,i){const n=o;if(!n.guid)return console.warn("Can not instantiate: No guid",n),null;if(e.context||(e.context=z.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const s=e?{...e}:null,{instance:r,seed:a}=Yk(n,e);if(r){const l=r;if(l.guid){su&&console.log("[Local] new instance","gameobject:",r?.guid);const c=new Sv(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 st?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:c.parent=s.parent.guid),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&&$a.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 Cv(){return Math.random()*9999999}const $a=new Array;function Pv(o){o.connection.beginListen("new-instance-created",async e=>{const t=await Zk(e.originalGuid,o.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const i=new Fn;e.position&&(i.position=new b(e.position.x,e.position.y,e.position.z)),e.rotation&&(i.rotation=new N(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(i.scale=new b(e.scale.x,e.scale.y,e.scale.z)),i.parent=e.parent,e.seed&&(i.idProvider=new Dt(e.seed)),i.visible=e.visible,i.context=o,su&&o.alias&&console.log("[Remote] instantiate in: "+o.alias);const n=Ya(t,i);$a.push(new WeakRef(n)),n&&(e.parent==="scene"&&o.scene.add(n),su&&console.log("[Remote] new instance","gameobject:",n?.guid,t))}),o.connection.beginListen("left-room",()=>{$a.length>0&&console.debug(`Left networking room, cleaning up ${$a.length} instantiated objects`);for(const e of $a){const t=e.deref();t&&t.destroy()}$a.length=0})}function Yk(o,e){const t=Cv(),i=e??new Fn;i.idProvider=new Dt(t);const n=Ya(o,i);return{seed:t,instance:n}}const Ov={};function kv(o,e){Ov[o]=e}async function Zk(o,e){const t=Ov[o];if(t!=null){const i=await t(o);if(i)return i}return Mv(o,e)}function Mv(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=Mv(o,t);if(i)return i}return null}const Oc=v("gizmos"),yt=v("debugextension"),Vg=v("debugtypes");class Kk{_types=new Map;_reverseTypes=new Map;constructor(){Vg&&console.warn("TypeStore: Created",this)}add(e,t){Vg&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?Vg&&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))}get(e){return this._types.get(e)||null}getKey(e){return this._reverseTypes.get(e)||null}}const Jk=Symbol("BuiltInType"),C=new Kk,Wg=function(o){C.get(o.name)||C.add(o.name,o)},$g=v("debugresolvedependencies"),eM=["/extensions/","extensions/"],tM=[{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 Hg(o,e){$g&&console.log(o,e);const t=[];Gg(tM,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 iM(o,e){o["needle:identifier"]=e}function Gg(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=Ev(e,s);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=Tv(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=Ev(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=Av(c.prefix,a);if(h>=0){$g&&console.log(c,h,c.dependencyName),i.push(e.getDependency(c.dependencyName,h).then(d=>s[r]=d));break}}typeof a=="object"&&Gg(o,e,a,i)}else typeof s=="object"&&Gg(o,e,s,i)}else if(typeof t=="string"){const n=Tv(o,e,t);n&&i.push(n)}}function Ev(o,e){if(o&&o.plugins&&typeof e=="string"){for(const t of eM)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(yt&&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 Tv(o,e,t){for(const i of o){const n=Av(i.prefix,t);if(n>=0)return $g&&console.warn("GET DEPENDENCY",i,n,i.dependencyName),e.getDependency(i.dependencyName,n)}return null}function Av(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 nM(o){return o?.___persistentAsset===!0}class oM{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;yt&&console.log(t);const i=new Array;for(const n of t?.assets){const s=Hg(this.parser,n);s&&i.push(s)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){yt&&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&&C.get(r)}return s}}return null}}const qn=v("debugserializer");class sM{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;qn&&console.warn("Type: "+e+" is already registered",t,i)}qn&&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){qn&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return qn&&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;qn&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}qn&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const ru=new sM;class Qi{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)ru.register(i,this);else ru.register(e,this)}}class rM{isDevMode=$i();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)),qn&&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 Xg{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function Iv(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=ru.getSerializerForConstructor(r);if(a){i[s]=a.onSerialize(r,e);continue}}i[s]=r}function n(s){const r=C._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 au=[];function Lv(o,e){if(!o)return e;typeof o.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,o.$serializedTypes));const t=Object.getPrototypeOf(o);return Lv(t,e)}function lu(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=Lv(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?Qg(a,c,t,void 0,o[n]):Qg(a,l,t,void 0,o[n])};const r=i[n],a=e[n];if(qn&&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);au.length=0}o.onAfterDeserializeMember!==void 0&&o.onAfterDeserializeMember(n,a,t)}}cM(o,e)}return lM(o,e,t.implementationInformation),o.onAfterDeserialize!==void 0&&o.onAfterDeserialize(e,t),!0}const aM=v("noerrors");function lM(o,e,t){if(aM||!e||!$i()||!o||o.constructor&&o.constructor[Jk]===!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)&&(mr(Ri.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)){mr(Ri.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
174
|
+
|
|
175
|
+
Please change to:
|
|
176
|
+
@serializable(Object3D)
|
|
177
|
+
${s}? : Object3D;
|
|
178
|
+
|
|
179
|
+
in ${i}.ts
|
|
180
|
+
<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+`
|
|
181
|
+
${s}:`,a,l),mr(Ri.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"))){mr(Ri.Warn,`<strong>Missing serialization for object reference!</strong>
|
|
182
|
+
|
|
183
|
+
Please change to:
|
|
184
|
+
@serializable(AssetReference)
|
|
185
|
+
${s}? : AssetReference;
|
|
186
|
+
|
|
187
|
+
in script ${i}.ts
|
|
188
|
+
<a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(i,s,o[s],o);continue}}}}function cM(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){qn&&console.log(t,"is undefined on",o);continue}for(const s of Object.keys(i))if(n[s]===void 0&&Dv(i[s])&&!Dv(n)){const r=hM(n,s);if(r&&(r?.writable===void 0||r?.writable===!1)&&r.set===void 0){qn&&console.warn('Property is not writable "'+s+'"',n,r,i[s],n[s]);continue}n[s]=i[s]}}}}function hM(o,e){for(;o;){const t=Object.getOwnPropertyDescriptor(o,e);if(t)return t;o=Object.getPrototypeOf(o)}}function Dv(o){switch(typeof o){case"number":case"string":case"boolean":return!0}return!1}function Qg(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 fn||n instanceof ki))return n;if(i||(i={serializer:ru.getSerializerForConstructor(r)}),n&&typeof n=="object"&&nM(n)){if(n.__concreteInstance)return n.__concreteInstance;const h=n;if(!h.$serializedTypes&&r.prototype.$serializedTypes&&(h.$serializedTypes=r.prototype.$serializedTypes),h.$serializedTypes&&lu(h,o,t),n&&r!==void 0)try{let d=null;i.serializer&&(d=i.serializer.onDeserialize(o,t)),d||(d=new r,yt&&console.log("Create concrete instance for persistent asset",n,"instance:",d),Ha(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=Qg(p,e,t,i,p);h.push(m)}return h}const a=i?.serializer;if(a)return a.onDeserialize(o,t);if(n instanceof Le)return n;let l;if(o&&(o.isMaterial||o.isTexture||o.isObject3D||o instanceof ki))l=o;else{if(o===void 0)return;if(o===null&&(r===we||r===Le||r===H||r===ki))return null;try{l=new r(...dM(o))}catch(h){console.error("Error creating "+t.path,t.target,h);return}}const c=l;return c.$serializedTypes&&lu(c,o,t),l}function dM(o){if(au.length=0,typeof o=="object"&&o!==null&&o!==void 0)for(const e of Object.keys(o))au.push(o[e]);return au}const Yg=Symbol("assigned component properties");function Ha(o,e,t,i){if(e==null||o==null)return;o[Yg]=!0;const n=o.constructor?.name??"unknown";t?.registerDefinedKeys(n,o);for(const s of Object.keys(e)){const r=uM(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[Yg]}function uM(o,e){let t;do t=Object.getOwnPropertyDescriptor(o,e);while(!t&&(o=Object.getPrototypeOf(o)));return t}const jv=Symbol("customVisibilityFlag");function Io(o,e){o.layers[jv]=e}const Bv=Symbol("DidPatchLayers");function pM(){const o=ps.prototype;if(o[Bv])return;o[Bv]=!0;const e=o.test;o.test=function(t){return this[jv]===!1?!1:e.call(this,t)}}pM(),Object.defineProperty(ae.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(ae.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(ae.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});const Fv=new Map;function Uv(o,e){if(!o)return;if(!e){console.warn("No prototype found",o,o.prototype,o.constructor);return}const t=Fv.get(e);t&&t.apply(o)}function zv(o){const e=mM(o.prototype);Fv.set(o,e)}function mM(o){return new gM(o)}class gM{$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)}}}}const fM=v("debuggetcomponent"),Nv=()=>fM||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function yM(o){return o==null||o.isObject3D?o:o.object&&o.object.isObject3D?o.object:o}function Zg(o,e){if(!o||!o.userData.components)return e;const t=o.userData.components.indexOf(e);return t<0||(tu.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,o.userData.components.splice(t,1)),e}function kc(o,e,t){return Rr(o,e)||Cn(o,e,t)}const Vv=new Dt("addComponentIdProvider");function Mr(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=Vv.generateUUID()),hu(o),Cu(e,e.context);try{t&&e.__internalAwake&&(Cc(o),e.activeAndEnabled&&e.__internalAwake()),tu.dispatchComponentLifecycleEvent("component-added",e)}catch(i){console.error(i)}return e}function Cn(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),Mr(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=Vv.generateUUID()),t&&e._internalInit(t),Cu(e,e.context),e}function Wv(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(),Ao(o,o.context??z.Current),o.destroy(),o.gameObject=null}let $v=!1;function Hv(o,e,t){if(o==null)return null;if(!o.isObject3D)return console.error("Object is not object3D"),null;if(!o?.userData?.components||(typeof e=="string"&&($v||($v=!0,console.warn(`Accessing components by name is not supported.
|
|
189
|
+
Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
|
|
190
|
+
|
|
191
|
+
You can import other modules your main module to get access to types
|
|
192
|
+
or if you use npmdefs you can make types available globally using globalThis:
|
|
193
|
+
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e))),Nv()&&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(Nv()&&console.log("[onGetComponent] MATCH BY PROTOYPE",s),t)t.push(n);else return n;s=Object.getPrototypeOf(s)}}return t||null}function Rr(o,e){const t=Hv(o,e);return t?Array.isArray(t)?t[0]:t:null}function Mc(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),Hv(o,e,t),t}function Rc(o,e,t=!1){if(t===!1&&o[Mo]===!1)return null;const i=Rr(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=Rc(o.children[n],e,t);if(s)return s}return null}function Ga(o,e,t,i=!0){t||(t=[]),i&&(t.length=0),Mc(o,e,t,!1);for(let n=0;n<o?.children?.length;n++)Ga(o.children[n],e,t,!1);return t}function Ec(o,e){if(!o)return null;if(Array.isArray(o)){for(let i=0;i<o.length;i++){const n=yM(o[i]),s=Ec(n,e);if(s)return s}return null}return Rr(o,e)||(o.parent?Ec(o.parent,e):null)}function cu(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),o?(Mc(o,e,t,!1),o.parent?cu(o.parent,e,t,!1):t):t}function qa(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&&Rc(i,o,t)||null}function Gv(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&&Ga(i,o,e,!1),e}function hu(o){o&&o.isObject3D===!0&&Uv(o,k)}if(Sc.experimentalSmartHierarchyUpdate){const o=k.prototype.add;k.prototype.add=function(...i){return Bg(),o.apply(this,i)};const e=k.prototype.attach;k.prototype.attach=function(...i){return Bg(),e.apply(this,i)};const t=k.prototype.remove;k.prototype.remove=function(...i){return Bg(),t.apply(this,i)}}k.prototype.SetActive=function(o){this.visible=o},k.prototype.setActive=function(o){this.visible=o},k.prototype.destroy=function(){Yi(this)},k.prototype.addComponent=function(o,e){return Cn(this,o,e)},k.prototype.addNewComponent=function(o,e){return Cn(this,o,e)},k.prototype.removeComponent=function(o){return Zg(this,o)},k.prototype.getOrAddComponent=function(o,e){return kc(this,o,e)},k.prototype.getComponent=function(o){return Rr(this,o)},k.prototype.getComponents=function(o,e){return Mc(this,o,e)},k.prototype.getComponentInChildren=function(o){return Rc(this,o)},k.prototype.getComponentsInChildren=function(o,e){return Ga(this,o,e)},k.prototype.getComponentInParent=function(o){return Ec(this,o)},k.prototype.getComponentsInParent=function(o,e){return cu(this,o,e)},Object.getOwnPropertyDescriptor(k.prototype,"activeSelf")||Object.defineProperty(k.prototype,"activeSelf",{get:function(){return Xa(this)},set:function(o){Tc(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"raycastAllowed")||Object.defineProperty(k.prototype,"raycastAllowed",{get:function(){return this.userData&&this.userData.raycastAllowed!==!1},set:function(o){const e=this;e.userData||(e.userData={}),e.userData.raycastAllowed=o}}),Object.getOwnPropertyDescriptor(k.prototype,"worldPosition")||Object.defineProperty(k.prototype,"worldPosition",{get:function(){return this instanceof _b?J(this.object):J(this)},set:function(o){ft(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldQuaternion")||Object.defineProperty(k.prototype,"worldQuaternion",{get:function(){return this instanceof _b?_e(this.object):_e(this)},set:function(o){bn(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRotation")||Object.defineProperty(k.prototype,"worldRotation",{get:function(){return Fd(this)},set:function(o){l_(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldScale")||Object.defineProperty(k.prototype,"worldScale",{get:function(){return Ge(this)},set:function(o){La(this,o)}});const bM=new K,_M=new b(0,0,0),vM=new b(0,1,0);Object.getOwnPropertyDescriptor(k.prototype,"worldForward")||Object.defineProperty(k.prototype,"worldForward",{get:function(){return B().set(0,0,1).applyQuaternion(_e(this))},set:function(o){const e=li().setFromRotationMatrix(bM.lookAt(_M.set(0,0,0),o,vM.set(0,1,0)));this.worldQuaternion=e}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRight")||Object.defineProperty(k.prototype,"worldRight",{get:function(){return B().set(1,0,0).applyQuaternion(_e(this))}}),Object.getOwnPropertyDescriptor(k.prototype,"worldUp")||Object.defineProperty(k.prototype,"worldUp",{get:function(){return B().set(0,1,0).applyQuaternion(_e(this))}}),Object.getOwnPropertyDescriptor(k.prototype,"contains")||Object.defineProperty(k.prototype,"contains",{value:function(o){if(!o)return!1;if(this===o)return!0;for(const e of this.children)if(e.contains(o))return!0;return!1}}),zv(k);const du=v("debuggetcomponent"),Er=v("debuginstantiate");class Fn{idProvider;parent;keepWorldPosition;position;rotation;scale;visible;context;components;clone(){const e=new Fn;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 Xa(o){return o.visible}function Tc(o,e){return typeof e=="number"&&(e=e>.5),o.visible=e,o.visible}function qv(o){return o[Mo]||uu(o)}function Xv(o,e){o[pv]=e}function uu(o){return dn.isUsingInstancing(o)}function Kg(o,e){return Aa(o,e,!0,!0)}const Qv=Symbol("isDestroyed");function Tr(o){return o[Qv]}function Yv(o,e){o[Qv]=e}const Jg=Symbol("isDontDestroy");function Qa(o,e=!0){o[Jg]=e}const pu=[],mu=[];function Yi(o,e=!0,t=!1){pu.length=0,mu.length=0,ef(o,e,!0);for(const i of pu)i.gameObject=null,i.context=null;for(const i of mu)Yv(i,!0),t&&Pe(i);mu.length=0,pu.length=0}function ef(o,e=!0,t=!0){if(o==null)return;const i=o;if(i.isComponent){if(i[Jg])return;pu.push(i);const r=i.gameObject;i.__internalDisable(),i.__internalDestroy(),i.gameObject=r;return}if(o[Jg])return;const n=o;du&&console.log(n),mu.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];ef(l,e,!1),s.length<r&&(r=s.length,a--)}}if(e&&n.children)for(const r of n.children)ef(r,e,!1);t&&n.removeFromParent()}function Ar(o,e,t=!0){return Zv(o,e,t)}function*gu(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*gu(s,e,!0,i,n+1)}}function Zv(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=Zv(r,e,t,n);if(a!==void 0)return a}}}}function Ya(o,e){if("isAssetReference"in o)return o.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new Fn,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 Dt(Date.now()));const n=[],s={},r={},a=Kv(i,o,t,n,s,r);a&&(SM(a,s),xM(r,s)),du&&(Ud(o,!0),Ud(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)),Cu(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)}iu(i)}return a}function Kv(o,e,t,i,n,s){if(!e||e[Ei])return null;const r=e.userData;e.userData={};const a=e.children;e.children=[];const l=e.clone(!1);if(hu(l),e.userData=r,e.children=a,n[e.uuid]={original:e,clone:l},Er&&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 st)l.worldQuaternion=li().setFromEuler(t.rotation);else if(Array.isArray(t.rotation)){const h=new st;h.fromArray(t.rotation),l.worldQuaternion=li().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=Aa(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;wM(m,f),m[pc]!==void 0&&(f[pc]=m[pc]),d.push(f),f.gameObject=l,i.push(f),n[m.guid]={original:m,clone:f},tu.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=Kv(o,d,t,i,n,s);p&&(n[p.uuid]={original:d,clone:p},l.add(p))}return l}function wM(o,e,t){Ha(e,o,void 0,{})}function xM(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 SM(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=Jv(s,a,d,e);p!==void 0?(Er&&console.log("Found new instance for",a,d,"->",p),c.push(p)):(Er&&console.warn("Could not find new instance for",a,d),c.push(d))}}else if(typeof l=="object"){const c=Jv(s,a,l,e);c!==void 0?s[a]=c:Er&&console.warn("Could not find new instance for",a,l)}}}}function Jv(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){Er&&console.log("reference did not change",e,o,t);return}const a=n.userData.components.indexOf(t);if(a>=0&&r.isObject3D)return Er&&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 Er&&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)}}var Ir;(o=>{o.baseUrl="https://networking.needle.tools";function e(l){return Mb(new Uint8Array(l))}o.hashMD5=e;function t(l){const c=Mb(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 Do()?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(!Do()&&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(M){return c?.onProgress?.call(null,{progress01:0,state:"inprogress"}),fetch(M,{method:"PUT",headers:g,body:d,signal:c?.abort}).then(O=>(c?.onProgress?.call(null,{progress01:1,state:"finished"}),O)).catch(O=>O)};console.debug("Uploading file",y.upload);let w=!1,P=null;for(let M=0;M<3;M++)try{if(w)break;if(c?.abort?.aborted)return console.debug("Aborted upload"),null;const O=await _(y.upload);O instanceof Error?(P=O,await ko(1e3*M)):O.ok&&(console.debug("File uploaded successfully"),w=!0)}catch(O){console.error(O)}if(!w)return console.error(P?.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 _m;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})(Ir||(Ir={}));const ws=v("debugaddressables");class ew{_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 tf=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=fs(e,t);ws&&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 k&&(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;kv(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||Tr(this.asset)===!0}_loadingPromise=null;isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(ws&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Yi(this.asset.scene,!0,!0),Yi(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,ws&&console.log("Preload",this.url);const e=await Ir.download(this.url,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(ws&&console.log("[AssetReference] loadAssetAsync",this.url),!this.mustLoad)return 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=vn().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else ws&&console.log("Load async",this.url),this._loadingPromise=vn().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[tf]=this,this._glbRoot&&(this._glbRoot[tf]=this),this.asset&&(this.asset[tf]=this),iu(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 Fn;if(e instanceof k?s.parent=e:e&&(Object.assign(s,e),s.cloneAssign(e)),s.parent===void 0&&(s.parent=n.scene),this.mustLoad&&await this.loadAssetAsync(),ws&&console.log("Instantiate",this.url,"parent:",e),this.asset){ws&&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;a.guid=this.url;const l=Ng(a,s,void 0,i);if(l)return l}else{const a=Ya(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 ws&&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 CM extends Qi{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 k){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 CM;const PM=Promise.resolve(null);class Sa{static imageReferences=new Map;static getOrCreate(e){let t=Sa.imageReferences.get(e);return t||(t=new Sa(e),Sa.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 tc),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"),PM)}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 tw extends Qi{constructor(){super([Sa],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=fs(t.gltfId,e);return Sa.getOrCreate(i)}}}new tw;class Ca{static cache=new Map;static getOrCreate(e){let t=Ca.cache.get(e);return t||(t=new Ca(e),Ca.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 iw extends Qi{constructor(){super([Ca],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=fs(t.gltfId,e);return Ca.getOrCreate(i)}}}new iw;class OM{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)}}class xs{static tryGetActionsFromMixer(e){return e._actions||null}static tryGetAnimationClipsFromObjectHierarchy(e,t){if(t||(t=new Array),e)e.animations&&t.push(...e.animations);else return t;if(e.children)for(const i of e.children)this.tryGetAnimationClipsFromObjectHierarchy(i,t);return t}static autoplayAnimations(e){if(!e||!e.animations)return console.debug("No animations found in file"),null;const t="scene"in e?e.scene:e,i=new Array;for(let s=0;s<e.animations.length;s++){const r=e.animations[s];if(!r.tracks||r.tracks.length<=0){console.warn("Animation has no tracks");continue}for(const a in r.tracks){const l=r.tracks[a],c=Ra.parseTrackName(l.name);let h=Ra.findNode(t,c.nodeName);if(!h){const p=l.__objectName??l.name.substring(0,l.name.indexOf("."));if(h=t.getObjectByProperty("uuid",p),!h)continue}let d=n(h)||n(t);if(!d){const p=C.get("Animation");if(d=t.addComponent(p),!d){console.error("Failed creating Animation component: No 'Animation' component found in TypeStore");break}}i.push(d),d.addClip&&d.addClip(r)}}return i;function n(s){if(!s)return null;const r=s.userData?.components;if(r&&r.length>0)for(let a=0;a<r.length;a++){const l=r[a];if(l.isAnimationComponent===!0)return l}return n(s.parent)}}static emptyClip(){return new ki("empty",0,[])}static createScaleClip(e){const t=e?.duration??.3;let i={x:1,y:1,z:1};e?.scale!==void 0&&(typeof e.scale=="number"?i={x:e.scale,y:e.scale,z:e.scale}:i=e.scale);const n=e?.type??"linear",s=e?.scaleFactor??1.2,r=new Array,a=new Array;switch(n){case"linear":r.push(0,t),a.push(i.x,i.y,i.z,i.x*s,i.y*s,i.z*s);break;case"spring":r.push(0,t*.3,t*.5,t*.7,t*.9,t),a.push(i.x,i.y,i.z,i.x*s,i.y*s,i.z*s,i.x*.9,i.y*.9,i.z*.9,i.x*1.05,i.y*1.05,i.z*1.05,i.x*.98,i.y*.98,i.z*.98,i.x,i.y,i.z);break}const l=new VS(".scale",r,a);return new ki("scale",r[r.length-1],[l])}}function*nf(o,e=null){const t=e?e.time:z.Current.time,i=t.time;for(;t.time-i<o;)yield}function*kM(o){for(let e=0;e<o;e++)yield}function*nw(o){let e=!0;for(o.then(()=>e=!1),o.catch(()=>e=!1);e;)yield}const ow="NEEDLE_lightmaps",Za=v("debuglightmapsextension")||v("debuglightmaps");var Xn=(o=>(o[o.Lightmap=0]="Lightmap",o[o.Skybox=1]="Skybox",o[o.Reflection=2]="Reflection",o))(Xn||{});class MM{get name(){return ow}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[ow];if(i){const n=i.textures;return n?.length?(Za&&console.log(i),new Promise(async(s,r)=>{const a=[];for(const c of n)if(c.pointer){Za&&console.log(c);let h=null;if(c.pointer.startsWith("/textures/")||c.pointer.startsWith("textures/"))Za&&console.log("Load texture from gltf",c.pointer),h=Hg(this.parser,c.pointer).then(d=>this.resolveTexture(c,d));else if(typeof c.pointer=="string"){Za&&console.log("Load texture from path",c.pointer);const d=fs(this.source,c.pointer);let p;d.endsWith(".exr")?p=new Em(this.parser.options.manager):d.endsWith(".hdr")?p=new vb(this.parser.options.manager):p=new tc(this.parser.options.manager),h=p.loadAsync(d,void 0).then(m=>this.resolveTexture(c,m))}else c.pointer;h&&a.push(h)}const l=await Wm(a);l?.anyFailed&&(A()||Za)&&console.error("[NEEDLE_lightmaps]Error during extension loading:",l),s()})):null}}return null}resolveTexture(e,t){const i=t;Za&&console.log("Light Texture loaded:",i),i?.isTexture&&(this.registry?(i.colorSpace=So,this.registry.registerTexture(this.source,e.type,i,e.index)):console.log(Xn[e.type],e.pointer,i))}}const Ka=!!v("debuglightmaps");class RM{context;map=new Map;clear(){this.map.clear()}constructor(e){this.context=e}registerTexture(e,t,i,n){Ka&&console.log("Registering ",Xn[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),hv(i,!1),r[n]=i,s?.set(t,r)}tryGetLightmap(e,t=0){return this.tryGet(e,Xn.Lightmap,t)}tryGetSkybox(e){return Ka&&console.log("[Get Skybox]",e,this.map),this.tryGet(e,Xn.Skybox,0)}tryGetReflection(e){return Ka&&console.log("[Get Reflection]",e,this.map),this.tryGet(e,Xn.Reflection,0)}tryGet(e,t,i){if(!e)return Ka&&console.warn("Missing source id"),null;const n=this.map.get(e);if(!n)return Ka&&console.warn(`[Lighting] No ${Xn[t]} texture entry for`,e),null;const s=n.get(t);return s===void 0?(Ka&&console.warn(`[Lighting] No ${Xn[t]} texture for`,e,"index",i),null):!s?.length||s.length<=i?null:s[i]}}Xt.lights_fragment_maps=Xt.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
|
|
194
|
+
vec2 lUv = vLightMapUv.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
|
|
195
|
+
vec4 lightMapTexel = texture2D( lightMap, lUv);
|
|
196
|
+
// 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.
|
|
197
|
+
lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
|
|
198
|
+
lightMapTexel.a = 1.;
|
|
199
|
+
lightMapTexel = conv_sRGBToLinear(lightMapTexel);
|
|
200
|
+
`),Xt.lightmap_pars_fragment=`
|
|
201
|
+
#ifdef USE_LIGHTMAP
|
|
202
|
+
uniform sampler2D lightMap;
|
|
203
|
+
uniform float lightMapIntensity;
|
|
204
|
+
uniform vec4 lightmapScaleOffset;
|
|
205
|
+
|
|
206
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
207
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
208
|
+
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 );
|
|
209
|
+
}
|
|
210
|
+
#endif
|
|
211
|
+
`,Xt.lights_fragment_begin=Xt.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
|
|
212
|
+
#if defined(USE_LIGHTMAP)
|
|
213
|
+
irradiance += 0.;
|
|
214
|
+
#else
|
|
215
|
+
irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
|
|
216
|
+
#endif`),WS.lightmap.lightmapScaleOffset={value:new me(1,1,0,0)};const of=v("debugprogressive"),fu=new Ci,yu=new xd;class EM{static GLTF_PROGRESSIVE_LODSMANAGER_TYPE=ur;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(),ur.removePlugin(this),ur.addPlugin(this),ur.debugDrawLine=F.DrawLine,this._lodsManager=ur.get(e,{engine:"needle-engine"}),this.applySettings(),this._lodsManager.enable()}disable(){this._lodsManager?.disable(),ur.removePlugin(this)}onAfterUpdatedLOD(e,t,i,n,s){of&&this.onRenderDebug(i,n,s)}onRenderDebug(e,t,i){if(!t.geometry||!We.hasLODLevelAvailable(t.geometry)&&!We.hasLODLevelAvailable(t.material))return;const n=ur.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(of&&t.geometry.boundingSphere){const a=t.geometry.boundingSphere;yu.copy(a),yu.applyMatrix4(t.matrixWorld);const l=yu.center,c=yu.radius,h=["#76c43e","#bcc43e","#c4ac3e","#c4673e","#ff3e3e"];if(r)F.DrawWireSphere(l,c,h[s],.1);else{const d=t.geometry.index?.count??0,p=We.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,w=y==p.length-1;m+=_.toFixed(0)+">"+(_/n.lastScreenCoverage).toFixed(0)+(w?"":",")}const f=p?p[s]?.density:-1;let g="LOD "+i.mesh_lod+`
|
|
217
|
+
TEX `+i.texture_lod;if(of=="density"&&(g+=`
|
|
218
|
+
`+d+` tris
|
|
219
|
+
`+(f/n.lastScreenCoverage).toFixed(0)+` dens
|
|
220
|
+
`+(n.lastScreenCoverage*100).toFixed(1)+`% cov
|
|
221
|
+
`+(n.lastCentrality*100).toFixed(1)+`% centr
|
|
222
|
+
`+(fu.min.x.toFixed(2)+"-"+fu.max.x.toFixed(2)+"x"+fu.min.y.toFixed(2)+"-"+fu.max.y.toFixed(2))+" scr"),n.lastScreenCoverage>.1){const y=e,_=y.worldForward,w=y.worldPosition,P=B(_).multiplyScalar(c*.7).add(l),M=P.distanceTo(w),O=h[Math.min(h.length-1,Math.max(0,s))]+"88",j=this.context.domHeight>0?screen.height/this.context.domHeight:1,I=e.isPerspectiveCamera?Math.tan(e.fov*Math.PI/180/2):1;F.DrawLabel(P,g,M*.012*j*I,void 0,16777215,O)}}}}}const TM=v("debugplayerview");var Lo=(o=>(o.Browser="browser",o.Headset="headset",o.Handheld="handheld",o))(Lo||{});class sw{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 rw{context;playerViews=new Map;constructor(e){this.context=e}setPlayerView(e,t,i){let n=this.playerViews.get(e);n||(n=new sw(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&&(TM&&console.log("REMOVE",e),i.removed=!0,this.playerViews.delete(e))}}new _m;const Ac=new Uint8Array(4);Ac[0]=255,Ac[1]=255,Ac[2]=255,Ac[3]=255;const AM=new vm(Ac,1,1,Sd);function sf(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 vm(n,e,e);return l.needsUpdate=!0,l}function IM(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),w=Math.floor(c.g*255),P=Math.floor(c.b*255);for(let M=0;M<i;M++){const O=(d*i+M)*4;l[O+0]=_,l[O+1]=w,l[O+2]=P,l[O+3]=255}}const h=new vm(l,i,n);return h.needsUpdate=!0,h}function bu(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 me(n,s,r,a);e.push(l)}return e}const rf=[],aw=[];function LM(o,e){if(rf.length===0)for(let t=0;t<27;t++)rf.push(0);e||(e=rf);for(let t=0;t<27;t++)aw[t]=e[t];e=aw,o.unity_SHAr={value:new me(e[9],e[3],e[6],e[0])},o.unity_SHBr={value:new me(e[12],e[15],e[18],e[21])},o.unity_SHAg={value:new me(e[10],e[4],e[7],e[1])},o.unity_SHBg={value:new me(e[13],e[16],e[19],e[22])},o.unity_SHAb={value:new me(e[11],e[5],e[8],e[2])},o.unity_SHBb={value:new me(e[14],e[17],e[20],e[23])},o.unity_SHC={value:new me(e[24],e[25],e[26],1)}}class DM{vertexShader;fragmentShader;technique;constructor(e,t,i){this.vertexShader=e,this.fragmentShader=t,this.technique=i}}async function jM(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 lw(s),!r.code&&r.uri&&await lw(r),!s.code||!r.code)return null;const a=o.techniques[e];return new DM(s.code,r.code,a)}}return console.error("Shader technique not found",e),null}async function lw(o){const e=o.uri;if(e)if(e.endsWith(".glsl")){const t=await new _m().loadAsync(e);o.code=t.toString()}else o.code=BM(o.uri)}function BM(o){return decodeURIComponent(Array.prototype.map.call(atob(o),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const Pn=v("debugenvlight");var Ja=(o=>(o[o.Skybox=0]="Skybox",o[o.Trilight=1]="Trilight",o[o.Flat=3]="Flat",o[o.Custom=4]="Custom",o))(Ja||{}),_u=(o=>(o[o.Skybox=0]="Skybox",o[o.Custom=1]="Custom",o))(_u||{});class cw{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 me;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?(Pn&&console.log("Enable scene light settings",e,t),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,t.enabled=!0,!0):(Pn&&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?(Pn&&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}Pn&&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}Pn&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){Pn&&console.log("Register reflection",e,t);const i=new hw(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(Pn&&console.log("Enable reflection",e,t?Ja[t.ambientMode]:"Unknown ambient mode",t),t?.ambientMode){case 0:case 4:const i=this.internalGetReflection(e);if(i&&i.Source){Pn&&console.log("Setting environment reflection",i);const n=this.context.scene,s=i.Source;return s.mapping=Vn,n.environment=s,n.environmentIntensity=this.environmentIntensity||1,s}else Pn&&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=IM(i[0],i[1],i[2],64,64);return n.colorSpace=Co,n.mapping=Vn,this.context.scene.environment=n,n}else console.error("Missing ambient trilight",t.sourceId);case 3:if(t.ambientLight){const i=sf(t.ambientLight,64);return i.colorSpace=Co,i.mapping=Vn,this.context.scene.environment=i,i}else console.error("Missing ambientlight",t.sourceId)}return null}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){Pn&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}Pn&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}_lighting={}}class hw{get Source(){return this._source}_source;constructor(e,t,i=1){this._source=t,t.mapping=Vn}}const dw=v("timescale");let af=1;typeof dw=="number"&&(af=dw);class uw{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 $S;_smoothedFps=0;_smoothedDeltaTime=0;_fpsSamples=[];_fpsSampleIndex=0;constructor(){typeof af=="number"&&(this.timeScale=af)}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 pw=!1;function mw(o){pw||(pw=!0,FM(),UM())}mw();function FM(){const o=`
|
|
223
|
+
float startCompression = 0.8;
|
|
224
|
+
float desaturation = 0.5;
|
|
225
|
+
// Patched tonemapping function
|
|
226
|
+
vec3 NeutralToneMapping( vec3 color ) {
|
|
227
|
+
color *= toneMappingExposure;
|
|
228
|
+
|
|
229
|
+
float d = 1. - startCompression;
|
|
230
|
+
// float peak = dot(color, vec3(0.299, 0.587, 0.114));
|
|
231
|
+
float peak = max(color.r, max(color.g, color.b));
|
|
232
|
+
if (peak < startCompression) return color;
|
|
233
|
+
float newPeak = 1. - d * d / (peak + d - startCompression);
|
|
234
|
+
float invPeak = 1. / peak;
|
|
235
|
+
|
|
236
|
+
float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
|
|
237
|
+
|
|
238
|
+
color *= newPeak * invPeak;
|
|
239
|
+
float g = 1. - 3. / (desaturation * extraBrightness + 3.);
|
|
240
|
+
return mix(color, vec3(1, 1, 1), g);
|
|
241
|
+
}
|
|
242
|
+
`,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
|
|
243
|
+
}`,i=Xt.tonemapping_pars_fragment.indexOf(e),n=Xt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Xt.tonemapping_pars_fragment.substring(i,n+t.length);Xt.tonemapping_pars_fragment=Xt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function UM(){const o=`
|
|
244
|
+
// 0: Default, 1: Golden, 2: Punchy
|
|
245
|
+
#define AGX_LOOK 0
|
|
246
|
+
|
|
247
|
+
vec3 userSlope = vec3(1.0);
|
|
248
|
+
vec3 userOffset = vec3(0.0);
|
|
249
|
+
vec3 userPower = vec3(1.0);
|
|
250
|
+
float userSaturation = 1.0;
|
|
251
|
+
|
|
252
|
+
// Mean error^2: 3.6705141e-06
|
|
253
|
+
vec3 _agxDefaultContrastApprox(vec3 x) {
|
|
254
|
+
vec3 x2 = x * x;
|
|
255
|
+
vec3 x4 = x2 * x2;
|
|
256
|
+
|
|
257
|
+
return + 15.5 * x4 * x2
|
|
258
|
+
- 40.14 * x4 * x
|
|
259
|
+
+ 31.96 * x4
|
|
260
|
+
- 6.868 * x2 * x
|
|
261
|
+
+ 0.4298 * x2
|
|
262
|
+
+ 0.1191 * x
|
|
263
|
+
- 0.00232;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
vec3 _agx(vec3 val) {
|
|
267
|
+
const mat3 agx_mat = mat3(
|
|
268
|
+
0.842479062253094, 0.0423282422610123, 0.0423756549057051,
|
|
269
|
+
0.0784335999999992, 0.878468636469772, 0.0784336,
|
|
270
|
+
0.0792237451477643, 0.0791661274605434, 0.879142973793104);
|
|
271
|
+
|
|
272
|
+
const float min_ev = -12.47393;
|
|
273
|
+
const float max_ev = 4.026069;
|
|
274
|
+
|
|
275
|
+
// val = pow(val, vec3(2.2));
|
|
276
|
+
|
|
277
|
+
// Input transform (inset)
|
|
278
|
+
val = agx_mat * val;
|
|
279
|
+
|
|
280
|
+
// Log2 space encoding
|
|
281
|
+
val = clamp(log2(val), min_ev, max_ev);
|
|
282
|
+
val = (val - min_ev) / (max_ev - min_ev);
|
|
283
|
+
|
|
284
|
+
// Apply sigmoid function approximation
|
|
285
|
+
val = _agxDefaultContrastApprox(val);
|
|
286
|
+
|
|
287
|
+
return val;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
vec3 _agxEotf(vec3 val) {
|
|
291
|
+
const mat3 agx_mat_inv = mat3(
|
|
292
|
+
1.19687900512017, -0.0528968517574562, -0.0529716355144438,
|
|
293
|
+
-0.0980208811401368, 1.15190312990417, -0.0980434501171241,
|
|
294
|
+
-0.0990297440797205, -0.0989611768448433, 1.15107367264116);
|
|
295
|
+
|
|
296
|
+
// Inverse input transform (outset)
|
|
297
|
+
val = agx_mat_inv * val;
|
|
298
|
+
|
|
299
|
+
// sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
|
|
300
|
+
// NOTE: We're linearizing the output here. Comment/adjust when
|
|
301
|
+
// *not* using a sRGB render target
|
|
302
|
+
val = pow(val, vec3(2.2));
|
|
303
|
+
|
|
304
|
+
return val;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
vec3 _agxLook(vec3 val) {
|
|
308
|
+
const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
|
|
309
|
+
float luma = dot(val, lw);
|
|
310
|
+
|
|
311
|
+
// Default
|
|
312
|
+
vec3 offset = vec3(0.0);
|
|
313
|
+
vec3 slope = vec3(1.0);
|
|
314
|
+
vec3 power = vec3(1.0);
|
|
315
|
+
float sat = 1.0;
|
|
316
|
+
|
|
317
|
+
#if AGX_LOOK == 1
|
|
318
|
+
// Golden
|
|
319
|
+
slope = vec3(1.0, 0.9, 0.5);
|
|
320
|
+
power = vec3(0.8);
|
|
321
|
+
sat = 0.8;
|
|
322
|
+
#elif AGX_LOOK == 2
|
|
323
|
+
// Punchy
|
|
324
|
+
slope = vec3(1.0);
|
|
325
|
+
power = vec3(1.35, 1.35, 1.35);
|
|
326
|
+
sat = 1.4;
|
|
327
|
+
#endif
|
|
328
|
+
|
|
329
|
+
// Needle
|
|
330
|
+
slope = vec3(1.05);
|
|
331
|
+
power = vec3(1.10, 1.10, 1.10);
|
|
332
|
+
sat = 1.15;
|
|
333
|
+
|
|
334
|
+
// User
|
|
335
|
+
// slope = userSlope;
|
|
336
|
+
// offset = userOffset;
|
|
337
|
+
// power = userPower;
|
|
338
|
+
// sat = userSaturation;
|
|
339
|
+
|
|
340
|
+
// ASC CDL
|
|
341
|
+
val = pow(val * slope + offset, power);
|
|
342
|
+
return luma + sat * (val - luma);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
vec3 AgXToneMapping( vec3 color ) {
|
|
347
|
+
// apply AGX
|
|
348
|
+
color *= toneMappingExposure;
|
|
349
|
+
color = max(color, vec3(0.001)); // Prevent NaN
|
|
350
|
+
color = _agx(color);
|
|
351
|
+
color = _agxLook(color); // Optional
|
|
352
|
+
color = _agxEotf(color);
|
|
353
|
+
return color;
|
|
354
|
+
`,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",i=Xt.tonemapping_pars_fragment.indexOf(e),n=Xt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Xt.tonemapping_pars_fragment.substring(i,n+t.length);Xt.tonemapping_pars_fragment=Xt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function gw(o){if(typeof o=="string")switch(o=o.toLowerCase(),o){case"none":return Od;case"neutral":return Ea;case"aces":return Pd;case"agx":return Cd;case"khronos_neutral":return Ea;default:console.warn("[PostProcessing] Unknown tone mapping mode",o);return}}const zM='<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>',NM=btoa(zM),VM="data:image/svg+xml;base64,"+NM,vu=VM,WM=`<?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(WM);const $M='<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>',HM=btoa($M),GM="data:image/svg+xml;charset=utf-8;base64,"+HM,fw=GM;var Ic;(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})(Ic||(Ic={}));async function yw(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 qM(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 qM(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=Do();let h=null;if(h=Ic.getAttributeAndCheckFalsey(l,"qrcode-logo-src"),c&&e.showLogo!==!0&&h===!1||(h||=Ic.getAttributeAndCheckFalsey(l,"logo-src"),c&&e.showLogo!==!0&&h===!1)||(h||=Ic.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||=vu,!h))return;let d=!1;e.showLogo!==!1&&(a.src=h,d=await new Promise((P,M)=>{a.onload=()=>P(!0),a.onerror=O=>{const j=h!==vu?"'"+h+"'":null;console.error("[QR Code] Error loading logo image for QR code",j,A()?O:""),P(!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 P=a.width/a.height;P>1?y=g/P:g=y*P;const M=n*o.width,O=Math.max(g,y),j=Math.round(O+M),I=Math.round(O+M),W=(p.width-O)/2,V=(p.height-O)/2;m.shadowColor=s,m.shadowBlur=i;const G=r,X=Math.round(W-M/2),E=Math.round(V-M/2);m.beginPath(),m.moveTo(X+G,E),m.lineTo(X+j-G,E),m.quadraticCurveTo(X+j,E,X+j,E+G),m.lineTo(X+j,E+I-G),m.quadraticCurveTo(X+j,E+I,X+j-G,E+I),m.lineTo(X+G,E+I),m.quadraticCurveTo(X,E+I,X,E+I-G),m.lineTo(X,E+G),m.quadraticCurveTo(X,E,X+G,E),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"),w=document.createElement("img");return w.src=_,w.style.width="100%",w.style.height="auto",w}function Ot(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}function bw(o){return o.classList?.contains("material-symbols-outlined")||!1}const wu=new Map;async function lf(o){const e="Material Symbols Outlined";if(document.fonts.check(`1em '${e}'`)||(console.log("Font not loaded yet"),await document.fonts.ready),wu.has(o))return wu.get(o);const t=document.createElement("canvas"),i=48;t.width=i,t.height=i;const n=t.getContext("2d");if(n){n.font=`${i}px '${e}'`,n.fillStyle="black",n.fillText(o,0,i);const s=t.toDataURL(),r=new Le;return r.name=o+" icon",r.image=new Image,r.image.src=s,r.needsUpdate=!0,wu.set(o,r),r}return wu.set(o,null),null}class Un{static _instance;static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new Un),this._instance}static create(){return new Un}_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";const i=Ot("fullscreen"),n=Ot("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=Ot("volume_off"),n=Ot("volume_up");return 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(){if(this._qrButton)return this._qrButton;const e=this,t=document.createElement("button");this._qrButton=t,t.innerText="QR Code",t.prepend(Ot("qr_code")),t.title="Scan this QR code with your phone to open this page",this.hideElementDuringXRSession(t);const i=document.createElement("div");i.style.cssText=`
|
|
355
|
+
position: fixed;
|
|
356
|
+
display: inline-block;
|
|
357
|
+
padding: 0.5rem;
|
|
358
|
+
background-color: white;
|
|
359
|
+
border-radius: 0.4rem;
|
|
360
|
+
cursor: pointer;
|
|
361
|
+
z-index: 1000;
|
|
362
|
+
box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
|
|
363
|
+
`;const n=document.createElement("div");n.classList.add("qr-code-container"),i.appendChild(n),t.addEventListener("click",()=>{if(i.parentNode)return r();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."),s()});async function s(){await a();const l=document.body.querySelector("needle-engine")||document.body;l.appendChild(i);const c=n.getBoundingClientRect(),h=t.getBoundingClientRect();i.style.left=h.left+h.width*.5-c.width*.5+"px";const d=h.top<c.height,p="1.3rem";d?i.style.top=`calc(${h.bottom}px + ${i.style.padding} + 0.0rem)`:i.style.top=`calc(${h.top-c.height}px - ${i.style.padding} - ${p})`,i.style.opacity="0",i.style.pointerEvents="all",i.style.transition="opacity 0.2s ease-in-out",setTimeout(()=>{i.style.opacity="1",window.addEventListener("click",r,{once:!0})}),window.addEventListener("resize",r),window.addEventListener("scroll",r),document.fullscreenElement?document.fullscreenElement.appendChild(i):l.appendChild(i)}function r(){i.style.pointerEvents="none",i.style.transition="opacity 0.2s",i.style.opacity="0",setTimeout(()=>i.parentNode?.removeChild(i),500),window.removeEventListener("click",r),window.removeEventListener("resize",r),window.removeEventListener("scroll",r)}async function a(){const l=await yw({text:e.qrButtonUrl,width:200,height:200});n.innerHTML="",n.appendChild(l)}return t.addEventListener("pointerenter",()=>{a()},{once:!0}),t}hideElementDuringXRSession(e){$d(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),pg(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}}function xu(o,e){const t=e?.element||document.head,i=Array.from(t.querySelectorAll(`link[rel=stylesheet][href*='${o}']`));if(i.length<=0){const n=document.createElement("link");n.href=o,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(){xu("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap")}const cf="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block",Su="needle-logo-element";class vw extends HTMLElement{static get elementName(){return Su}static create(){return document.createElement(Su)}constructor(){super(),this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
|
|
364
|
+
:host {
|
|
365
|
+
position: relative;
|
|
366
|
+
min-width: fit-content;
|
|
367
|
+
/* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
|
|
368
|
+
display: flex;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.wrapper {
|
|
372
|
+
position: relative;
|
|
373
|
+
display: grid;
|
|
374
|
+
grid-template-columns: auto auto;
|
|
375
|
+
padding: .1rem;
|
|
376
|
+
}
|
|
377
|
+
.wrapper:hover {
|
|
378
|
+
cursor: pointer;
|
|
379
|
+
}
|
|
380
|
+
img {
|
|
381
|
+
height: 100%;
|
|
382
|
+
align-self: end;
|
|
383
|
+
margin-left: 0.6rem;
|
|
384
|
+
transition: transform 0.2s;
|
|
385
|
+
}
|
|
386
|
+
img.with-text {
|
|
387
|
+
width: 11.5ch;
|
|
388
|
+
&:hover {
|
|
389
|
+
transform: scale(1.02);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
img.compact {
|
|
393
|
+
width: 1.7em;
|
|
394
|
+
&:hover {
|
|
395
|
+
transform: scale(1.1);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
span {
|
|
399
|
+
font-size: 1rem;
|
|
400
|
+
white-space: nowrap;
|
|
401
|
+
}
|
|
402
|
+
</style>
|
|
403
|
+
<div class="wrapper">
|
|
404
|
+
<img class="logo with-text" src=${fw} />
|
|
405
|
+
</div>
|
|
406
|
+
`,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")}),this.wrapper.setAttribute("title","Made with Needle Engine")}_root;wrapper;logoElement;setLogoVisible(e){this.logoElement.style.display=e?"block":"none"}setType(e){e==="full"?(this.logoElement.src=fw,this.logoElement.classList.remove("with-text"),this.logoElement.classList.remove("compact")):(this.logoElement.src=vu,this.logoElement.classList.add("with-text"),this.logoElement.classList.add("compact"))}}customElements.get(Su)||customElements.define(Su,vw);const hf=v("debugspatialmenu");class XM{_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&&!hf))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(),Ce.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}if(hf&&L.isDesktop()&&this.updateMenu(),!this._context.xr?.running){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 k;positionFilter=new Xm(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||L.isDesktop()&&hf,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),ac(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,Ce.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 Ce.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 me(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=C.get("ObjectRaycaster");return e&&Mr(this.menu,new e),this.menu}_poweredByNeedleElement;handleNeedleWatermark(){if(!this._poweredByNeedleElement){this._poweredByNeedleElement=new Ce.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 ww(this._context,()=>globalThis.open("https://needle.tools","_self"));Mr(this._poweredByNeedleElement,e);const t=new Ce.Text({textContent:"Powered by",width:"auto",height:"auto"}),i=new Ce.Text({textContent:"needle",width:"auto",height:"auto",fontSize:.07,margin:new me(0,0,0,.02)});this._poweredByNeedleElement.add(t),this._poweredByNeedleElement.add(i),this.menu?.add(this._poweredByNeedleElement),this.markDirty(),new tc().load("./include/needle/poweredbyneedle.webp",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&&Qn())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=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png")?.addEventListener("ready",()=>{this.markDirty()}))}createButton(e,t){const i=new Ce.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 Ce.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 ww(this._context,()=>t.click());return Mr(i,s),new QM(this,e,t,i,n)}}class QM{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&&bw(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 lf(e);if(i&&!this.spatialIcon){const n=new Ce.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:i,backgroundOpacity:1,margin:new me(0,.005,0,0)});this.spatialIcon=n,this.spatialContainer.add(n),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const i=await lf(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 ww{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}),Ce.update())}onPointerExit(){this.context.input.unsetCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:0}),Ce.update())}onPointerDown(e){e.use()}onPointerUp(e){e.use()}onPointerClick(e){e.use(),this.onclick()}}const Lr="needle-menu",Lc=v("debugmenu"),xw=v("debugnoncommercial");let YM=class{_context;_menu;_spatialMenu;constructor(o){this._menu=um.getOrCreate(o.domElement,o),this._context=o,this._spatialMenu=new XM(o,this._menu),window.addEventListener("message",this.onPostMessage),$d(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=Ot(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)}},this._menu.appendChild(n)}else Lc&&console.error("NeedleMenu: unknown postMessage event",e)}else Lc&&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=!L.isMobileDevice()),o){const e=Un.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=Un.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(o){if(!o){this._muteButton?.remove();return}this._muteButton=Un.getOrCreate().createMuteButton(this._context),this._muteButton.setAttribute("priority","100"),this._menu.appendChild(this._muteButton)}_muteButton;showFullscreenOption(o){if(!o){this._fullscreenButton?.remove();return}this._fullscreenButton=Un.getOrCreate().createFullscreenButton(this._context),this._fullscreenButton&&(this._fullscreenButton.setAttribute("priority","150"),this._menu.appendChild(this._fullscreenButton))}_fullscreenButton;appendChild(o){return this._menu.appendChild(o)}};class um extends HTMLElement{static create(){return document.createElement(Lr,{is:Lr})}static getOrCreate(e,t){let i=e.querySelector(Lr);return!i&&e.shadowRoot&&(i=e.shadowRoot.querySelector(Lr)),i||(i=window.document.body.querySelector(Lr)),i||(i=um.create(),e.shadowRoot?e.shadowRoot.appendChild(i):e.appendChild(i)),i._domElement=e,i._context=t,i}_domElement=null;_context=null;constructor(){super();const e=document.createElement("template");e.innerHTML=`<style>
|
|
407
|
+
|
|
408
|
+
/** Styling attributes that ensure the nested menu z-index does not cause it to overlay elements outside of <needle-engine> */
|
|
409
|
+
:host {
|
|
410
|
+
position: absolute;
|
|
411
|
+
width: 100%;
|
|
412
|
+
height: 100%;
|
|
413
|
+
z-index: 0;
|
|
414
|
+
top: 0;
|
|
415
|
+
pointer-events: none;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
#root {
|
|
419
|
+
position: absolute;
|
|
420
|
+
width: auto;
|
|
421
|
+
max-width: 95%;
|
|
422
|
+
left: 50%;
|
|
423
|
+
transform: translateX(-50%);
|
|
424
|
+
top: min(20px, 10vh);
|
|
425
|
+
padding: 0.3rem;
|
|
426
|
+
display: flex;
|
|
427
|
+
visibility: visible;
|
|
428
|
+
flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
|
|
429
|
+
pointer-events: all;
|
|
430
|
+
z-index: 1000;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** hide the menu if it's empty **/
|
|
434
|
+
#root.has-no-options.logo-hidden {
|
|
435
|
+
display: none;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** using a div here because then we can change the class for placement **/
|
|
439
|
+
#root.bottom {
|
|
440
|
+
top: auto;
|
|
441
|
+
bottom: min(30px, 10vh);
|
|
442
|
+
}
|
|
443
|
+
#root.top {
|
|
444
|
+
top: calc(.7rem + env(safe-area-inset-top));
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.wrapper {
|
|
448
|
+
position: relative;
|
|
449
|
+
display: flex;
|
|
450
|
+
flex-direction: row;
|
|
451
|
+
justify-content: center;
|
|
452
|
+
align-items: stretch;
|
|
453
|
+
gap: 0px;
|
|
454
|
+
padding: 0 0rem;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.wrapper > *, .options > button, .options > select, ::slotted(*) {
|
|
458
|
+
position: relative;
|
|
459
|
+
border: none;
|
|
460
|
+
border-radius: 0;
|
|
461
|
+
outline: 1px solid rgba(0,0,0,0);
|
|
462
|
+
display: flex;
|
|
463
|
+
justify-content: center;
|
|
464
|
+
align-items: center;
|
|
465
|
+
max-height: 2.3rem;
|
|
466
|
+
max-width: 100%;
|
|
467
|
+
|
|
468
|
+
/** basic font settings for all entries **/
|
|
469
|
+
font-size: 1rem;
|
|
470
|
+
font-family: 'Roboto Flex', sans-serif;
|
|
471
|
+
font-optical-sizing: auto;
|
|
472
|
+
font-weight: 500;
|
|
473
|
+
font-weight: 200;
|
|
474
|
+
font-variation-settings: "wdth" 100;
|
|
475
|
+
color: rgb(20,20,20);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.options > select[multiple]:hover {
|
|
479
|
+
max-height: 300px;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.floating-panel-style {
|
|
483
|
+
background: rgba(255, 255, 255, .4);
|
|
484
|
+
outline: rgb(0 0 0 / 5%) 1px solid;
|
|
485
|
+
border: 1px solid rgba(255, 255, 255, .1);
|
|
486
|
+
box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
|
|
487
|
+
border-radius: 1.5rem;
|
|
488
|
+
/**
|
|
489
|
+
* to make nested background filter work
|
|
490
|
+
* https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
|
|
491
|
+
**/
|
|
492
|
+
&::before {
|
|
493
|
+
content: '';
|
|
494
|
+
position: absolute;
|
|
495
|
+
width: 100%;
|
|
496
|
+
height: 100%;
|
|
497
|
+
top: 0;
|
|
498
|
+
left: 0;
|
|
499
|
+
z-index: -1;
|
|
500
|
+
border-radius: 1.5rem;
|
|
501
|
+
-webkit-backdrop-filter: blur(8px);
|
|
502
|
+
backdrop-filter: blur(8px);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
a {
|
|
507
|
+
color: inherit;
|
|
508
|
+
text-decoration: none;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.options {
|
|
512
|
+
display: flex;
|
|
513
|
+
flex-direction: row;
|
|
514
|
+
align-items: center;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.options > *, ::slotted(*) {
|
|
518
|
+
max-height: 2.25rem;
|
|
519
|
+
padding: .4rem .5rem;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
:host .options > *, ::slotted(*) {
|
|
523
|
+
background: transparent;
|
|
524
|
+
border: none;
|
|
525
|
+
white-space: nowrap;
|
|
526
|
+
transition: all 0.1s linear .02s;
|
|
527
|
+
border-radius: 1.5rem;
|
|
528
|
+
user-select: none;
|
|
529
|
+
}
|
|
530
|
+
:host .options > *:hover, ::slotted(*:hover) {
|
|
531
|
+
cursor: pointer;
|
|
532
|
+
color: black;
|
|
533
|
+
background: rgba(245, 245, 245, .8);
|
|
534
|
+
box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
|
|
535
|
+
outline: rgba(0,0,0,.1) 1px solid;
|
|
536
|
+
}
|
|
537
|
+
:host .options > *:active, ::slotted(*:active) {
|
|
538
|
+
background: rgba(255, 255, 255, .8);
|
|
539
|
+
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);
|
|
540
|
+
transition: all 0.05s linear;
|
|
541
|
+
}
|
|
542
|
+
:host .options > *:focus, ::slotted(*:focus) {
|
|
543
|
+
outline: rgba(255,255,255,.5) 1px solid;
|
|
544
|
+
}
|
|
545
|
+
:host .options > *:focus-visible, ::slotted(*:focus-visible) {
|
|
546
|
+
outline: rgba(0,0,0,.5) 1px solid;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
:host .options > *:disabled, ::slotted(*:disabled) {
|
|
550
|
+
background: rgba(0,0,0,.05);
|
|
551
|
+
color: rgba(60,60,60,.7);
|
|
552
|
+
pointer-events: none;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
button, ::slotted(button) {
|
|
556
|
+
gap: 0.3rem;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/** XR button animation **/
|
|
560
|
+
:host button.this-mode-is-requested {
|
|
561
|
+
background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
|
|
562
|
+
background-size: 200% auto;
|
|
563
|
+
background-position: 0 100%;
|
|
564
|
+
animation: AnimationName .7s ease infinite forwards;
|
|
565
|
+
}
|
|
566
|
+
:host button.other-mode-is-requested {
|
|
567
|
+
opacity: .5;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
@keyframes AnimationName {
|
|
571
|
+
0% { background-position: 0% 0 }
|
|
572
|
+
100% { background-position: -200% 0 }
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
.logo {
|
|
579
|
+
cursor: pointer;
|
|
580
|
+
padding-left: 0.0rem;
|
|
581
|
+
padding-bottom: .02rem;
|
|
582
|
+
margin-right: 0.5rem;
|
|
583
|
+
}
|
|
584
|
+
.logo-hidden {
|
|
585
|
+
.logo {
|
|
586
|
+
display: none;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
:host .has-options .logo {
|
|
590
|
+
border-left: 1px solid rgba(40,40,40,.4);
|
|
591
|
+
margin-left: 0.3rem;
|
|
592
|
+
margin-right: 0.5rem;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
.logo > span {
|
|
596
|
+
white-space: nowrap;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
/** COMPACT */
|
|
602
|
+
|
|
603
|
+
/** Hide the menu button normally **/
|
|
604
|
+
.compact-menu-button { display: none; }
|
|
605
|
+
/** And show it when we're in compact mode **/
|
|
606
|
+
.compact .compact-menu-button {
|
|
607
|
+
position: relative;
|
|
608
|
+
display: block;
|
|
609
|
+
background: none;
|
|
610
|
+
border: none;
|
|
611
|
+
border-radius: 2rem;
|
|
612
|
+
|
|
613
|
+
margin: 0;
|
|
614
|
+
padding: 0 .3rem;
|
|
615
|
+
padding-top: .2rem;
|
|
616
|
+
|
|
617
|
+
z-index: 100;
|
|
618
|
+
|
|
619
|
+
color: #000;
|
|
620
|
+
|
|
621
|
+
&:hover {
|
|
622
|
+
background: rgba(255,255,255,.2);
|
|
623
|
+
cursor: pointer;
|
|
624
|
+
}
|
|
625
|
+
&:focus {
|
|
626
|
+
outline: 1px solid rgba(255,255,255,.5);
|
|
627
|
+
}
|
|
628
|
+
&:focus-visible {
|
|
629
|
+
outline: 1px solid rgba(0,0,0,.5);
|
|
630
|
+
}
|
|
631
|
+
& .expanded-click-area {
|
|
632
|
+
position: absolute;
|
|
633
|
+
left: 0;
|
|
634
|
+
right: 0;
|
|
635
|
+
top: 10%;
|
|
636
|
+
bottom: 10%;
|
|
637
|
+
transform: scale(1.8);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
.has-no-options .compact-menu-button {
|
|
641
|
+
display: none;
|
|
642
|
+
}
|
|
643
|
+
.open .compact-menu-button {
|
|
644
|
+
background: rgba(255,255,255,.2);
|
|
645
|
+
}
|
|
646
|
+
.logo-visible .compact-menu-button {
|
|
647
|
+
margin-left: .2rem;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/** Open and hide menu **/
|
|
651
|
+
.compact .foldout {
|
|
652
|
+
display: none;
|
|
653
|
+
}
|
|
654
|
+
.open .options, .open .foldout {
|
|
655
|
+
display: flex;
|
|
656
|
+
justify-content: center;
|
|
657
|
+
}
|
|
658
|
+
.compact .wrapper {
|
|
659
|
+
padding: 0;
|
|
660
|
+
}
|
|
661
|
+
.compact .wrapper, .compact .options {
|
|
662
|
+
height: auto;
|
|
663
|
+
max-height: initial;
|
|
664
|
+
flex-direction: row;
|
|
665
|
+
gap: .12rem;
|
|
666
|
+
}
|
|
667
|
+
.compact .options {
|
|
668
|
+
flex-wrap: wrap;
|
|
669
|
+
gap: .3rem;
|
|
670
|
+
}
|
|
671
|
+
.compact .top .options {
|
|
672
|
+
height: auto;
|
|
673
|
+
flex-direction: row;
|
|
674
|
+
}
|
|
675
|
+
.compact .bottom .wrapper {
|
|
676
|
+
height: auto;
|
|
677
|
+
flex-direction: column;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
.compact .foldout {
|
|
681
|
+
max-height: min(100ch, calc(100vh - 100px));
|
|
682
|
+
overflow: auto;
|
|
683
|
+
overflow-x: hidden;
|
|
684
|
+
align-items: center;
|
|
685
|
+
|
|
686
|
+
position: fixed;
|
|
687
|
+
bottom: calc(100% + 5px);
|
|
688
|
+
z-index: 100;
|
|
689
|
+
width: auto;
|
|
690
|
+
max-width: 90vw;
|
|
691
|
+
left: 50%;
|
|
692
|
+
transform: translateX(-50%);
|
|
693
|
+
padding: .2rem 1em;
|
|
694
|
+
|
|
695
|
+
}
|
|
696
|
+
.compact.logo-hidden .foldout {
|
|
697
|
+
/** for when there's no logo we want to center the foldout **/
|
|
698
|
+
min-width: 24ch;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.compact.top .foldout {
|
|
702
|
+
top: calc(100% + 5px);
|
|
703
|
+
bottom: auto;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
::-webkit-scrollbar {
|
|
707
|
+
max-width: 7px;
|
|
708
|
+
background: rgba(100,100,100,.2);
|
|
709
|
+
border-radius: .2rem;
|
|
710
|
+
}
|
|
711
|
+
::-webkit-scrollbar-thumb {
|
|
712
|
+
background: rgba(255, 255, 255, .3);
|
|
713
|
+
border-radius: .2rem;
|
|
714
|
+
}
|
|
715
|
+
::-webkit-scrollbar-thumb:hover {
|
|
716
|
+
background: rgb(150,150,150);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
.compact .options > *, .compact .options > ::slotted(*) {
|
|
720
|
+
font-size: 1.2rem;
|
|
721
|
+
padding: .6rem .5rem;
|
|
722
|
+
width: 100%;
|
|
723
|
+
}
|
|
724
|
+
.compact.has-options .logo {
|
|
725
|
+
border: none;
|
|
726
|
+
padding-left: 0;
|
|
727
|
+
margin-left: 1rem;
|
|
728
|
+
margin-bottom: .02rem;
|
|
729
|
+
}
|
|
730
|
+
.compact .options {
|
|
731
|
+
/** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
|
|
732
|
+
max-width: 100%;
|
|
733
|
+
|
|
734
|
+
& > button, & > select {
|
|
735
|
+
display: flex;
|
|
736
|
+
flex-basis: 100%;
|
|
737
|
+
min-height: 3rem;
|
|
738
|
+
}
|
|
739
|
+
& > button.row2 {
|
|
740
|
+
//border: 1px solid red !important;
|
|
741
|
+
display: flex;
|
|
742
|
+
flex: 1;
|
|
743
|
+
flex-basis: 30%;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/** If there's really not enough space then just hide all options **/
|
|
748
|
+
@media (max-width: 100px) or (max-height: 100px){
|
|
749
|
+
.foldout {
|
|
750
|
+
display: none !important;
|
|
751
|
+
}
|
|
752
|
+
.compact-menu-button {
|
|
753
|
+
display: none !important;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/* dark mode */
|
|
758
|
+
/*
|
|
759
|
+
@media (prefers-color-scheme: dark) {
|
|
760
|
+
:host {
|
|
761
|
+
background: rgba(0,0,0, .6);
|
|
762
|
+
}
|
|
763
|
+
:host button {
|
|
764
|
+
color: rgba(200,200,200);
|
|
765
|
+
}
|
|
766
|
+
:host button:hover {
|
|
767
|
+
background: rgba(100,100,100, .8);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
*/
|
|
771
|
+
|
|
772
|
+
</style>
|
|
773
|
+
|
|
774
|
+
<div id="root" class="logo-hidden floating-panel-style bottom">
|
|
775
|
+
<div class="wrapper">
|
|
776
|
+
<div class="foldout">
|
|
777
|
+
<div class="options" part="options">
|
|
778
|
+
<slot></slot>
|
|
779
|
+
</div>
|
|
780
|
+
<div class="options" part="options">
|
|
781
|
+
<slot name="end"></slot>
|
|
782
|
+
</div>
|
|
783
|
+
</div>
|
|
784
|
+
<div style="user-select:none;" class="logo">
|
|
785
|
+
<span class="madewith notranslate" style="display:none;">powered by</span>
|
|
786
|
+
</div>
|
|
787
|
+
</div>
|
|
788
|
+
<button class="compact-menu-button">
|
|
789
|
+
<div class="expanded-click-area"></div>
|
|
790
|
+
</button>
|
|
791
|
+
</div>
|
|
792
|
+
`;const t=this.attachShadow({mode:"open"});_w(),xu(cf,{loadedCallback:()=>{this.handleSizeChange()}}),xu(cf,{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"),this.logoContainer=this.root?.querySelector(".logo"),this.compactMenuButton=this.root?.querySelector(".compact-menu-button"),this.compactMenuButton.append(Ot("more_vert")),this.foldout=this.root?.querySelector(".foldout"),this.root?.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const n=vw.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(()=>nR(c=>{if(c==!0&&Do()&&!xw){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)=>{Lc&&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)&&!Do()){const d=r++;$i()&&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}),Lc&&this.___insertDebugOptions()}_sizeChangeInterval;connectedCallback(){window.addEventListener("resize",this.handleSizeChange),this.handleMenuVisible(),this._sizeChangeInterval=setInterval(()=>this.handleSizeChange(void 0,!0),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&&(!Do()||xw)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!$i()))&&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;logoContainer;compactMenuButton;foldout;append(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.options.appendChild(i)}else 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=Ot(e.icon);e.iconSide==="right"?t.appendChild(i):t.prepend(i)}e.class&&t.classList.add(e.class),e=t}return this.options.appendChild(e)}prepend(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.options.prepend(i)}else this.options.prepend(t)}_isHandlingChange=!1;onChangeDetected(e){if(!this._isHandlingChange){this._isHandlingChange=!0;try{this.handleMenuVisible();for(const t of e)t.target==this.options&&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(){Lc&&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;_timeoutHandle=0;handleSizeChange=(e,t)=>{if(!this._domElement)return;const i=this._domElement.clientWidth;if(i<100){clearTimeout(this._timeoutHandle),this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style");return}const n=i-40;if(!t&&Math.abs(n-this._lastAvailableWidthChange)<1)return;this._lastAvailableWidthChange=n,clearTimeout(this._timeoutHandle),this._timeoutHandle=setTimeout(()=>{const a=r();a<0?(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")):a>0&&(this.root.classList.remove("compact"),this.foldout.classList.remove("floating-panel-style"),r()<0&&(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")))},5);const s=()=>this.options.clientWidth+this.logoContainer.clientWidth,r=()=>n-s()};___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)}}customElements.get(Lr)||customElements.define(Lr,um);const Ze=v("debugcontext"),ZM=v("stats"),KM=v("debugactive"),JM=v("debugframerate"),eR=v("debugcoroutine"),tR={};class iR{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 Cu(o,e){if(!o)return;if(!o.isComponent){(A()||Ze)&&console.error(`Registered script is not a Needle Engine component.
|
|
793
|
+
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
794
|
+
`,o);return}e||(e=z.Current,Ze&&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:L.isiOS()||L.isMacOS()?"default":"high-performance",stencil:!0};static get DefaultWebGLRendererParameters(){return z._defaultWebglRendererParameters}get version(){return _n}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;composer=null;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 ae(75,this.domWidth/this.domHeight,.1,1e3)),this._fallbackCamera}set mainCamera(e){this._mainCamera=e}_mainCamera=null;_fallbackCamera=null;application;animations;time;input;physics;connection;assets;mainLight=null;get rendererData(){return this.sceneLighting}sceneLighting;addressables;lightmaps;players;lodsManager;menu;get isCreated(){return this._isCreated}get rootSourceId(){return this.rootSceneSourceIdentifiers[0]||void 0}_needsUpdateSize=!1;_isCreated=!1;_isCreating=!1;_isVisible=!1;_stats=ZM?new JC: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 Si,e?.camera&&(this._mainCamera=e.camera),this.application=new Bn(this),this.time=new uw,this.input=new A_(this),this.physics=new Xl(this),this.connection=new q_(this),this.assets=new rv,this.sceneLighting=new cw(this),this.addressables=new ew(this),this.lightmaps=new RM(this),this.players=new rw(this),this.menu=new YM(this),this.lodsManager=new EM(this),this.animations=new OM(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,Ze&&console.log("Using canvas from shadow root",t))}return Ze&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new hr(e),this.renderer.debug.checkShaderErrors=A()||v("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=Od,this.renderer.setClearColor(new oe("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=HS,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=Co,this.renderer.nodes={library:new GS,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),tk(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=oc(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),Gn(this,ue.ContextClearing),Yi(this.scene,!0,!0),this.scene=new Si,this.addressables?.dispose(),this.lightmaps?.clear(),this.physics?.engine?.clearCaches(),this.lodsManager.disable(),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()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){z.Current=this,pe.dispatchCallback(ue.ContextDestroying,this),Gn(this,ue.ContextDestroying),this.clear(),this.renderer?.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(Ze&&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),Gn(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+`
|
|
795
|
+
Coroutine functions must be generators: "*myCoroutine() {...}"
|
|
796
|
+
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;Ze&&console.log("Creating context",this.name,e);const i=globalThis["needle:dependencies:ready"];i instanceof Promise&&(Ze&&console.log("Waiting for dependencies to be ready"),await i.catch(h=>{if(Ze||A()){if(dc("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:
|
|
797
|
+
|
|
798
|
+
# Make sure you don't have circular imports in your scripts!
|
|
799
|
+
|
|
800
|
+
Possible solutions:
|
|
801
|
+
\u2192 Replace @serializable(${d}) in your script with @serializable(Behaviour)
|
|
802
|
+
\u2192 If you only need type information try importing the type only, e.g: import { type ${d} }
|
|
803
|
+
|
|
804
|
+
---`,h);return}console.error("Needle Engine dependencies failed to load",h)}}).then(()=>{Ze&&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 Ze&&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;Ar(this.scene,d=>{const p=d;if(p?.isCamera){if(Cc(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,iu(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)),Ze&&Ud(this.scene,!0),this.targetFrameRate===void 0?(Ze&&console.warn("No target framerate set, using default",z.DefaultTargetFrameRate),this.targetFrameRate=z._defaultTargetFramerate):Ze&&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),Gn(this,ue.ContextCreated),Ze&&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=vn(),a=0;for(let l=0;l<n.length;l++){if(t.abortSignal?.aborted){Ze&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){Ze&&console.log("Aborting loading because create id changed",e,this._createId);break}const c=n[l];t?.onLoadingStart?.call(this,l,c),Ze&&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){Ze&&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)Yi(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 k;m.position.x=d*1.1,m.position.y=h,this.scene.add(m),Cr.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()||Ze||Wk())try{this.internalStep(e,t),this._renderlooperrors=0}catch(i){this._renderlooperrors+=1,(A()||Ze)&&(i instanceof Error||i instanceof TypeError)&&Ee("Caught unhandled exception during render-loop - see console for details.",Ri.Error),console.error("Frame #"+this.time.frame+`
|
|
805
|
+
`,i),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null),Dr.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(),JM&&console.log("FPS",this.time.smoothedFps.toFixed(0)),iu(this),nu(this.scene),gv(this),Gn(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),Gn(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),Gn(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),Gn(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),Gn(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 ae){const n=this.focusRectSettings,s=n.damping>0?this.time.deltaTime/n.damping:1;cO(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||(qk(this),this._currentFrameEvent=-1,wb.camera=this.mainCamera,wb.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),Gn(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;this.time.frameCount%e===0&&console.log(this.renderer.info.render.calls+" DrawCalls",`
|
|
806
|
+
Render:`,{...this.renderer.info.render},`
|
|
807
|
+
Memory:`,{...this.renderer.info.memory},`
|
|
808
|
+
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!==Od&&mw(),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&&L.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){KM&&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 Wn(this.domWidth,this.domHeight),this._requireDepthTexture){const i=new lb(this.domWidth,this.domHeight);this._renderTarget.depthTexture=i}this._requireColorTexture&&(this._renderTarget.texture=new Le,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=kd,this._renderTarget.texture.magFilter=kd,this._renderTarget.texture.format=Sd)}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){eR&&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=nw(c);s.chained?.push(h);continue}}catch(s){console.error(s)}}function t(i){return!!(i&&i.next&&i.return)}}}const Bt=v("debuglicense"),Sw=[];let On="basic";Bt&&console.log("License Type: "+On);function Qn(){switch(On){case"pro":case"enterprise":return!0}return!1}function Dc(){return On==="indie"}function df(){return On==="edu"}function Do(){return Qn()||Dc()||df()}function nR(o){if(Qn()||Dc()||df())return o(!0);Sw.push(o)}function Pu(o){for(const e of Sw)try{e(o)}catch{}}var Dr;(o=>{function e(r){let a=r?.domElement;if(a||(a=document.querySelector("needle-engine")),!a&&!r)return!1;const l=a?.getAttribute("no-telemetry");return(l===""||l==="true"||l==="1")&&(On==="pro"||On==="enterprise")?(Bt&&console.debug("Telemetry is disabled via no-telemetry attribute"),!1):!0}o.isAllowed=e;const t="dabb8317376f";async function i(r,a,l){if(!e(r)){Bt&&console.debug("Telemetry is disabled");return}const c={site_id:t,type:"custom_event",pathname:window.location.pathname,event_name:a,properties:l?JSON.stringify(l):void 0};return s(c)}o.sendEvent=i;async function n(r,a,l){if(!e(r)){Bt&&console.debug("Telemetry is disabled");return}l instanceof ErrorEvent?l={message:l.message,stack:l.error?.stack,filename:l.filename,lineno:l.lineno,colno:l.colno,timestamp:l.timeStamp||Date.now()}:l instanceof Error&&(l={message:l.message,stack:l.stack,timestamp:Date.now()});const c={site_id:t,type:"error",properties:{error_name:a,message:l.message,stack:l.stack,filename:l.filename,lineno:l.lineno,colno:l.colno,timestamp:l.timestamp}};return s(c)}o.sendError=n;function s(r){try{return fetch("https://needle.tools/api/v1/rum/t",{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"},keepalive:!0,mode:"cors",priority:"low"}).catch(a=>{Bt&&console.error("Failed to send telemetry",a)})}catch(a){Bt&&console.error(a)}return Promise.resolve()}})(Dr||(Dr={})),pe.registerCallback(ue.ContextRegistered,o=>{rR(o.context),sR(o.context),setTimeout(()=>lR(o.context),2e3)});let Ou,uf=!1,pf="";async function oR(){if(Ou)return Ou;if(On==="basic")try{const o="https://needle.tools/api/v1/needle-engine/check?location="+encodeURIComponent(window.location.href)+"&version="+_n+"&generator="+encodeURIComponent(Nd),e=await fetch(o,{method:"GET"}).catch(t=>{Bt&&console.error("License check failed",t)});e?.status===200?(uf=!1,Bt&&console.log("License check succeeded"),On="pro",Pu(!0)):e?.status===403?(Pu(!1),uf=!0,pf=await e.text()):(Pu(!1),Bt&&console.log("License check failed with status "+e?.status))}catch(o){Pu(!1),Bt&&console.error("License check failed",o)}else Bt&&console.log('Runtime license check is skipped because license is already applied as "'+On+'"')}Ou=oR();async function sR(o){function e(){const n=document.createElement("div");n.className="needle-forbidden",n.style.cssText=`
|
|
809
|
+
position: fixed;
|
|
810
|
+
top: 0;
|
|
811
|
+
left: 0;
|
|
812
|
+
width: 100%;
|
|
813
|
+
height: 100%;
|
|
814
|
+
pointer-events: all;
|
|
815
|
+
zIndex: 2147483647;
|
|
816
|
+
line-height: 1.5;
|
|
817
|
+
backdrop-filter: blur(15px);
|
|
818
|
+
-webkit-backdrop-filter: blur(15px);
|
|
819
|
+
`;const s=n.style.cssText,r=document.createElement("div");n.appendChild(r),r.style.cssText=`
|
|
820
|
+
position: absolute;
|
|
821
|
+
left: 0;
|
|
822
|
+
right: 0;
|
|
823
|
+
top:0;
|
|
824
|
+
bottom: 0;
|
|
825
|
+
padding: 10%;
|
|
826
|
+
color: white;
|
|
827
|
+
font-size: 20px;
|
|
828
|
+
font-family: sans-serif;
|
|
829
|
+
text-align: center;
|
|
830
|
+
pointer-events: all;
|
|
831
|
+
display: flex;
|
|
832
|
+
justify-content: center;
|
|
833
|
+
align-items: center;
|
|
834
|
+
background-color: rgba(0,0,0,.3);
|
|
835
|
+
text-shadow: 0 0 2px black;
|
|
836
|
+
`;const a=r.style.cssText,l=pf?.length>1?pf:"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(()=>{uf===!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 rR(o){try{if(!Qn()&&!Dc())return mf(o)}catch(e){return Bt&&console.log("License check failed",e),mf(o)}Bt&&mf(o)}async function mf(o){let e=!1;o.domElement.addEventListener("ready",()=>e=!0),await Ou?.catch(()=>{}),!(Qn()||Dc())&&(Do()===!1&&aR(),e?gf(o):o.domElement.addEventListener("ready",()=>{gf(o)}))}function gf(o){const e=`
|
|
837
|
+
position: relative;
|
|
838
|
+
display: block;
|
|
839
|
+
background-size: 20px;
|
|
840
|
+
background-position: 10px 5px;
|
|
841
|
+
background-repeat:no-repeat;
|
|
842
|
+
background-image:url('${Cw}');
|
|
843
|
+
background-max-size: 40px;
|
|
844
|
+
padding: 10px;
|
|
845
|
+
padding-left: 30px;
|
|
846
|
+
`;if(On==="edu")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=`
|
|
847
|
+
position: absolute;
|
|
848
|
+
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
849
|
+
font-size: 12px;
|
|
850
|
+
color: rgb(100, 100, 100);
|
|
851
|
+
/*mix-blend-mode: difference;*/
|
|
852
|
+
background-color: transparent;
|
|
853
|
+
z-index: 10000;
|
|
854
|
+
|
|
855
|
+
cursor: pointer;
|
|
856
|
+
user-select: none;
|
|
857
|
+
opacity: 0;
|
|
858
|
+
|
|
859
|
+
bottom: 6px;
|
|
860
|
+
right: 12px;
|
|
861
|
+
transform: translateY(0px);
|
|
862
|
+
transition: all .5s ease-in-out 1s;
|
|
863
|
+
`;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);df()&&setTimeout(()=>{clearInterval(s),t?.remove(),setTimeout(()=>{o.domElement.parentNode&&gf(o)},1e3*60*5)},2e4)}const Cw="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let Pw=0;async function aR(o){const e=Date.now();if(e-Pw<2e3)return;Pw=e;const t=`
|
|
864
|
+
position: relative;
|
|
865
|
+
display: block;
|
|
866
|
+
font-size: 18px;
|
|
867
|
+
background-size: 20px;
|
|
868
|
+
background-position: 10px 5px;
|
|
869
|
+
background-repeat:no-repeat;
|
|
870
|
+
background-image:url('${Cw}');
|
|
871
|
+
background-max-size: 40px;
|
|
872
|
+
margin-bottom: 5px;
|
|
873
|
+
margin-top: .3em;
|
|
874
|
+
margin-bottom: .5em;
|
|
875
|
+
padding: .2em;
|
|
876
|
+
padding-left: 25px;
|
|
877
|
+
border-radius: .5em;
|
|
878
|
+
border: 2px solid rgba(160,160,160,.3);
|
|
879
|
+
`,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${_n}`;z.Current?.xr?console.log(i):console.log("%c "+i,t)}async function lR(o){if(!window.crossOriginIsolated){if(!Dr.isAllowed(o)){Bt&&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:On,url:t,hostname:window.location.hostname,pathname:window.location.pathname,version:_n,generator:Nd,build_time:cg,public_key:ja},n=navigator.sendBeacon?.(e,JSON.stringify(i));Bt&&console.debug("Sent beacon: "+n)}}catch(e){Bt&&console.log("Failed to send non-commercial usage message to analytics backend",e)}}}function Ow(o,e){return To(o,ue.ContextCreated,e),()=>_s(o,ue.ContextCreated)}function cR(o,e){return To(o,ue.ContextClearing,e),()=>_s(o,ue.ContextClearing)}function hR(o,e){return To(o,ue.ContextDestroying,e),()=>_s(o,ue.ContextDestroying)}function ku(o,e){return To(o,xe.Start,e),()=>_s(o,xe.Start)}function kw(o,e){return To(o,xe.Update,e),()=>_s(o,xe.Update)}function dR(o,e){return To(o,xe.OnBeforeRender,e),()=>_s(o,xe.OnBeforeRender)}function uR(o,e){return To(o,xe.OnAfterRender,e),()=>_s(o,xe.OnAfterRender)}const pR=v("debugdecoders");let ff=null;function Mw(){if(!ff){const o=Rm(null);ff={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return ff}function Rw(o){o!==void 0&&typeof o=="string"&&QC(o)}function Ew(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=Mw();pR&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function Tw(o){o!==void 0&&typeof o=="string"&&XC(o)}function yf(o,e){const t=Mw();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),GC(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),qC(o,{progressive:!0}),o}const Xe=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=Aw(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=Aw(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 Aw(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const Ss=v("debughotreload");let jc=!1;const Bc=new Map;function mR(){return jc}function bf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function Iw(o){if(jc){Ss&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}Ss&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;Bc.has(e)?Bc.get(e)?.push(o):Bc.set(e,[o])}function Lw(o){if(jc){Ss&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}Ss&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=Bc.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let Dw=!1;function gR(){if(Ss||Dw)return;Dw=!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 fR(o){Ss&&console.log("[HMR] Apply changes",o,Object.keys(o)),gR();for(const e of Object.keys(o))try{jc=!0;const t=C.get(e);if(!t){Ss&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=Bc.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&&Ao(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],w=_.name,P="bound ";if(w===P)continue;const M=_.name.substring(P.length),O=i.prototype[M];O&&(d[y]=O.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{m&&g&&Lg(p,g),m&&f&&(p.enabled=!0)}}}}catch(t){if(Ss)console.error(t);else return!1}finally{jc=!1,mr(Ri.Log,"Script changes applied (HMR)")}return!0}class x extends k{guid;static isDestroyed(e){return Tr(e)}static setActive(e,t,i=!0){e&&(Tc(e,t),nu(e),t&&i&&gv(z.Current,e))}static isActiveSelf(e){return Xa(e)}static isActiveInHierarchy(e){return qv(e)}static markAsInstancedRendered(e,t){Xv(e,t)}static isUsingInstancing(e){return uu(e)}static foreachComponent(e,t,i=!0){return Ar(e,t,i)}static instantiateSynced(e,t){return e?Ng(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Ya(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??z.Current,Pc(n,t.connection,i)}static destroy(e,t=!0){return Yi(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),Tc(e,!0),nu(e),i?x.foreachComponent(e,n=>{Lg(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),Tc(e,!1),nu(e),x.foreachComponent(e,t=>{$k(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 Cn(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return Cn(e,t,i,n)}static moveComponent(e,t){return Cn(e,t)}static removeComponent(e){return Zg(e.gameObject,e),e}static getOrAddComponent(e,t){return kc(e,t)}static getComponent(e,t){return e===null?null:Rr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:Mc(e,t,i)}static findByGuid(e,t){return Kg(e,t)}static findObjectOfType(e,t,i=!0){return qa(e,t??z.Current,i)}static findObjectsOfType(e,t){const i=[];return Gv(e,i,t),i}static getComponentInChildren(e,t,i=!1){return Rc(e,t,i)}static getComponentsInChildren(e,t,i=null){return Ga(e,t,i??void 0)}static getComponentInParent(e,t){return Ec(e,t)}static getComponentsInParent(e,t,i=null){return cu(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]}}const yR=Symbol("component-name");class R{get isComponent(){return!0}get[yR](){return C.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[Mo];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[Mo]=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),bf()&&Iw(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}))),Wv(this),bf()&&Lw(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 J(this.gameObject)}set worldPosition(e){ft(this.gameObject,e)}setWorldPosition(e,t,i){gr(this.gameObject,e,t,i)}get worldQuaternion(){return _e(this.gameObject)}set worldQuaternion(e){bn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){eg(this.gameObject,e,t,i,n)}get worldEuler(){return tg(this.gameObject)}set worldEuler(e){ig(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){lc(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return R._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return R._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return R._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 bR=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:R,Component:R,GameObject:x},Symbol.toStringTag,{value:"Module"}));var _R=Object.defineProperty,jw=(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&&_R(e,t,n),n};class Fc extends R{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=J(this.from).clone(),t=J(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),ft(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(J(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}jw([u(x)],Fc.prototype,"from"),jw([u(x)],Fc.prototype,"to");var vR=Object.defineProperty,wR=Object.getOwnPropertyDescriptor,jr=(o,e,t,i)=>{for(var n=i>1?void 0:i?wR(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&&vR(e,t,n),n};const Cs=v("debuganimation");let Bw=class{x;y};class Ft extends R{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){Cs&&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,Cs&&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){Cs&&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){Cs&&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(Cs&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){Cs&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){Cs&&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?qS:wm:e.loop=wm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),Cs&&console.log("PLAY",e.getClip().name,e);const n=new xR(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 xm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}jr([u()],Ft.prototype,"playAutomatically",2),jr([u()],Ft.prototype,"randomStartTime",2),jr([u(Bw)],Ft.prototype,"minMaxSpeed",2),jr([u(Bw)],Ft.prototype,"minMaxOffsetNormalized",2),jr([u()],Ft.prototype,"loop",2),jr([u()],Ft.prototype,"clampWhenFinished",2),jr([u(ki)],Ft.prototype,"clips",1);class xR{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)}}const Mu=Symbol("objectIsAnimatedData");function Fw(o,e,t){if(!o)return;if(o[Mu]===void 0){if(!t)return;o[Mu]=new Set}const i=o[Mu];t?i.add(e):i.has(e)&&i.delete(e)}function SR(o){if(!o)return!1;const e=o[Mu];return e!==void 0&&e.size>0}class CR{_context;get context(){return this._context??z.Current}get isStateMachineBehaviour(){return!0}}class Uc{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 Uw(o,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??wo.generateUUID(),index:-1,clip:new ki(o,0,[])}}var Ps=(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))(Ps||{}),_f=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(_f||{});const at=v("debuganimatorcontroller"),Ru=v("debugrootmotion");class un{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 Dt(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new un(n)}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){at&&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){at&&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 Uc(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 xm(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;at&&console.warn("AnimatorController clone()",this.model);const e=oc(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||c_(n)||n.tracks!==void 0||n instanceof un));return console.assert(e!==this.model),new un(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,at&&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()&&(at&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(at||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&&(at&&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===_f.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,at){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
|
|
880
|
+
Timescale: `+i.timeScale,`
|
|
881
|
+
Normalized time: `+l.toFixed(3),`
|
|
882
|
+
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 Uc(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&&(at&&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 ki))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 Uc(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):at&&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(),this.rootMotionHandler&&this.rootMotionHandler.onStart(l),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const d=new Uc(e,i,h,this._speed);for(const p of this._activeState.behaviours)p.instance?.onStateEnter?.call(p.instance,this.animator,d,n)}}else at&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));at&&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 PR(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 Ps.If:return t.value===!0;case Ps.IfNot:return t.value===!1;case Ps.Greater:return t.value>e.threshold;case Ps.Less:return t.value<e.threshold;case Ps.Equals:return t.value===e.threshold;case Ps.NotEqual:return t.value!==e.threshold}return!1}createActions(e){at&&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||(at&&console.warn("No motion",s),s.motion=Uw(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:(at||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){at&&console.warn("No clip assigned to state",s);const r=new ki(void 0,void 0,[]);s.motion.clip=r}if(s.motion?.clip){const r=s.motion.clip;if(r instanceof ki){const a=this.createAction(r);s.motion.action=a}else(at||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=C.get(r.typeName);if(a){const l=new a;l.isStateMachineBehaviour&&(l._context=this.context??void 0,Ha(l,r.properties),r.instance=l),at&&console.log("Created animator controller behaviour",s.name,r.typeName,r.properties,l)}else(at||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 zw{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 pt{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,pt.firstKeyframeRotation[this.cacheId]||(pt.firstKeyframeRotation[this.cacheId]=new N),s){const r=s.values;pt.firstKeyframeRotation[this.cacheId].set(r[0],r[1],r[2],r[3])}pt.spaceRotation[this.cacheId]||(pt.spaceRotation[this.cacheId]=new N),pt.effectiveSpaceRotation[this.cacheId]||(pt.effectiveSpaceRotation[this.cacheId]=new N),pt.clipOffsetRotation[this.cacheId]=new N,s&&pt.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;pt.lastObjRotation[this.cacheId]||(pt.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=pt.lastObjRotation[this.cacheId];if(pt.spaceRotation[this.cacheId].copy(t),Ru){const i=new st().setFromQuaternion(t);console.log("START",this.clip.name,D.toDegrees(i.y),this.root.position.z)}}getClipRotationOffset(){return pt.clipOffsetRotation[this.cacheId]}_prevTime=0;handlePosition(e,t){if(t){const i=this.root;Ru&&i.add(new Pi),pt.lastObjPosition[this.cacheId]||(pt.lastObjPosition[this.cacheId]=this.root.position.clone());const n=new b,s=new b;this.positionWrapper=new zw(t,(r,a)=>{const l=this.action.getEffectiveWeight();return Ru&&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(Ru){const r=t.values,a=new st().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 st().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 zw(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(pt.identityQuaternion,1-e),!0)}}class PR{controller;handler=[];root;basePosition=new b;baseQuaternion=new N;baseRotation=new st;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 pt(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 Qi{onSerialize(e,t){}onDeserialize(e,t){if(t.type===un&&e?.__type==="AnimatorController")return new un(e)}}new OR(un);var kR=Object.defineProperty,MR=Object.getOwnPropertyDescriptor,Eu=(o,e,t,i)=>{for(var n=i>1?void 0:i?MR(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&&kR(e,t,n),n};const Zi=v("debuganimator");class bt extends R{get isAnimationComponent(){return!0}applyRootMotion=!1;hasRootMotion=!1;keepAnimatorControllerStateOnDisable=!1;set runtimeAnimatorController(e){this._animatorController&&this._animatorController.model===e||(e?e instanceof un?(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 un(e.model)),this._animatorController=e,this._animatorController.bind(this)):(Zi&&console.log("Assign animator controller",e,this),this._animatorController=new un(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){Zi&&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 Zi&&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),Zi&&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 Zi&&console.log("getFloat",e,t),t}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){this.runtimeAnimatorController?.getInteger(e)!==t&&(this._parametersAreDirty=!0),Zi&&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 Zi&&console.log("getInteger",e,t),t}SetTrigger(e){this.setTrigger(e)}setTrigger(e){this._parametersAreDirty=!0,Zi&&console.log("setTrigger",e),this.runtimeAnimatorController?.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){this._parametersAreDirty=!0,Zi&&console.log("resetTrigger",e),this.runtimeAnimatorController?.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){const t=this.runtimeAnimatorController?.getTrigger(e);return Zi&&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&&(Zi&&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(){Zi&&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,!SR(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}Eu([u()],bt.prototype,"applyRootMotion",2),Eu([u()],bt.prototype,"hasRootMotion",2),Eu([u()],bt.prototype,"keepAnimatorControllerStateOnDisable",2),Eu([u()],bt.prototype,"runtimeAnimatorController",1);const Nw=Symbol("previous-visibility");class _o extends Wn{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 hr){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(){_o._userSet.clear();const e=Tg(this.texture,!0,null,_o._userSet);for(const t of e)t instanceof H&&(t[Nw]=t.visible,t.visible=!1)}onAfterRender(){for(const e of _o._userSet)e instanceof H&&(e.visible=e[Nw]);_o._userSet.clear()}}var RR=Object.defineProperty,ER=Object.getOwnPropertyDescriptor,zc=(o,e,t,i)=>{for(var n=i>1?void 0:i?ER(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&&RR(e,t,n),n};const Tu=v("debuggroundprojection");class Yn extends R{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 ls(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{Tu&&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 sc(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 Le&&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 Le)){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){Tu&&console.log("Create/Update Ground Projection",e.name),this._projection?.removeFromParent();try{this._projection=new Ta(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",ng(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=Qt(this.context.scene.children,[this._projection]),r=s.min.y;if(r<1/0){const a=B();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,ft(this._projection,a)}Tu&&F.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,Tu&&console.log("Update Blurriness",t),this._blurrynessShader??=new Nn({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:TR,fragmentShader:AR}),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=rr.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}zc([u()],Yn.prototype,"applyOnAwake",2),zc([u()],Yn.prototype,"autoFit",2),zc([u()],Yn.prototype,"radius",1),zc([u()],Yn.prototype,"height",1),zc([u()],Yn.prototype,"arBlending",1);const TR=`
|
|
883
|
+
varying vec2 vUv;
|
|
884
|
+
|
|
885
|
+
void main() {
|
|
886
|
+
vUv = uv;
|
|
887
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
888
|
+
}
|
|
889
|
+
`,AR=`
|
|
890
|
+
uniform sampler2D map;
|
|
891
|
+
uniform float blurriness;
|
|
892
|
+
uniform float alphaFactor;
|
|
893
|
+
uniform float blending;
|
|
894
|
+
varying vec2 vUv;
|
|
895
|
+
|
|
896
|
+
const float PI = 3.14159265359;
|
|
897
|
+
|
|
898
|
+
// Gaussian function
|
|
899
|
+
float gaussian(float x, float sigma) {
|
|
900
|
+
return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
// Custom smoothstep function for desired falloff
|
|
904
|
+
float customSmoothstep(float edge0, float edge1, float x) {
|
|
905
|
+
float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
|
|
906
|
+
return t * t * (3.0 - 2.0 * t);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
void main() {
|
|
910
|
+
vec2 center = vec2(0.0, 0.0);
|
|
911
|
+
vec2 pos = vUv;
|
|
912
|
+
pos.x = 0.0; // Only consider vertical distance
|
|
913
|
+
float distance = length(pos - center);
|
|
914
|
+
|
|
915
|
+
// Calculate blur amount based on custom falloff
|
|
916
|
+
float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
|
|
917
|
+
blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
|
|
918
|
+
|
|
919
|
+
// Gaussian blur
|
|
920
|
+
vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
|
|
921
|
+
vec4 color = vec4(0.0);
|
|
922
|
+
float totalWeight = 0.0;
|
|
923
|
+
int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
|
|
924
|
+
float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
|
|
925
|
+
|
|
926
|
+
for (int x = -blurSize; x <= blurSize; x++) {
|
|
927
|
+
for (int y = -blurSize; y <= blurSize; y++) {
|
|
928
|
+
vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
|
|
929
|
+
float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
|
|
930
|
+
color += textureLod(map, vUv + offset, lodLevel) * weight;
|
|
931
|
+
totalWeight += weight;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
|
|
936
|
+
|
|
937
|
+
gl_FragColor = color;
|
|
938
|
+
|
|
939
|
+
float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
|
|
940
|
+
float stepFactor = blending - brightness * .1;
|
|
941
|
+
gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
|
|
942
|
+
gl_FragColor.a *= alphaFactor;
|
|
943
|
+
// gl_FragColor.rgb = vec3(1.0);
|
|
944
|
+
|
|
945
|
+
// #include <tonemapping_fragment>
|
|
946
|
+
// #include <colorspace_fragment>
|
|
947
|
+
|
|
948
|
+
// Uncomment to visualize blur amount
|
|
949
|
+
// gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
|
|
950
|
+
}
|
|
951
|
+
`;function Vw(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 ae?t?.fov:-1}=o,a=new b,l=new b,c=t instanceof ae?t.aspect:1,h=o.objects||e.scene,d=Qt(h,void 0,t?.layers),p=d.clone();d.getCenter(l);const m=new b;if(d.getSize(m),t instanceof ae&&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)),w=s*Math.max(y,_)+a.z/2;o.maxZoom=w*10,o.minZoom=w*.01,o.debug===!0&&console.log("Fit camera to objects",{fitHeightDistance:y,fitWidthDistance:_,distance:w,verticalFov:f,horizontalFov:g});const P=.05,M=l.clone();if(M.y-=a.y*P,o.targetOffset&&(o.targetOffset.x!==void 0&&(M.x+=o.targetOffset.x),o.targetOffset.y!==void 0&&(M.y+=o.targetOffset.y),o.targetOffset.z!==void 0&&(M.z+=o.targetOffset.z)),o.relativeTargetOffset&&(o.relativeTargetOffset.x!==void 0&&(M.x+=o.relativeTargetOffset.x*a.x),o.relativeTargetOffset.y!==void 0&&(M.y+=o.relativeTargetOffset.y*a.y),o.relativeTargetOffset.z!==void 0&&(M.z+=o.relativeTargetOffset.z*a.z)),n==null||n=="auto"){const I=qa(Yn),W=I?I.radius:0,V=Math.max(m.x,m.y,m.z,W);t instanceof ae&&(t.near=w/100,t.far=V+w*10,t.updateProjectionMatrix()),I&&(o.maxZoom=Math.max(Math.min(o.maxZoom,W*.5),w))}o.currentZoom!==void 0&&(o.currentZoom<o.minZoom&&(o.minZoom=o.currentZoom*.9),o.currentZoom>o.maxZoom&&(o.maxZoom=o.currentZoom*1.1));const O=l.clone();o.fitDirection?O.sub(new b().copy(o.fitDirection).multiplyScalar(1e6)):O.sub(t.worldPosition),i==="y"&&(O.y=0),O.normalize(),O.multiplyScalar(w),i==="y"&&(O.y+=-P*4*w);let j=l.clone().sub(O);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&&(F.DrawWireBox3(d,16777011,10),F.DrawWireBox3(p,65280,10)),o.autoApply&&(t.position.copy(j),t.lookAt(M),r>0&&t instanceof ae&&(t.fov=r,t.updateProjectionMatrix())),{camera:t,position:j,lookAt:M,fov:o.fov}}var IR=Object.defineProperty,vf=(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&&IR(e,t,n),n};class Br extends R{constraintActive=!0;locked=!1;sources=[];setConstraintPosition(e){const t=this.sources[0];t&&(t.worldPosition=e)}}vf([u()],Br.prototype,"constraintActive"),vf([u()],Br.prototype,"locked"),vf([u(k)],Br.prototype,"sources");let Fr=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 Ww{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new Fr).__init(this.bb_pos,this.bb)}rotation(e){return(e||new Fr).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new Fr).__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 cs{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new cs).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+Rb),(t||new cs).__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 Ww).__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 T;(o=>{(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./rapier-DJ-luMxr.min.js");return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.RAPIER_PHYSICS||(o.RAPIER_PHYSICS={})),(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./postprocessing-B5ksn9-G.min.js").then(r=>r.index);return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.POSTPROCESSING||(o.POSTPROCESSING={})),(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./postprocessing-B5ksn9-G.min.js").then(r=>r.N8AO);return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.POSTPROCESSING_AO||(o.POSTPROCESSING_AO={}))})(T||(T={}));var _t=(o=>(o[o.Average=0]="Average",o[o.Multiply=1]="Multiply",o[o.Minimum=2]="Minimum",o[o.Maximum=3]="Maximum",o))(_t||{}),Au=(o=>(o[o.Discrete=0]="Discrete",o[o.Continuous=1]="Continuous",o))(Au||{}),Qe=(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))(Qe||{}),el=(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))(el||{});const kt=function(o,e){return function(t,i,n){LR(t,i,n,o,e)}};function LR(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),Ee("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,Ri.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 ee||l instanceof b||l instanceof me||l instanceof N){const c=this[s];Ad(c,()=>{this.onValidate(s)})}Object.defineProperty(this,s,{set:function(c){if(this[Yg]===!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 DR=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 jR=Object.defineProperty,BR=Object.getOwnPropertyDescriptor,Ti=(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&&jR(e,t,n),n};class FR{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 ls(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 ls(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 K;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 ui=class am extends R{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=Qe.None;isKinematic=!1;drag=0;angularDrag=1;detectCollisions=!0;sleepThreshold=.01;collisionDetectionMode=Au.Discrete;get lockPositionX(){return(this.constraints&Qe.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Qe.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Qe.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Qe.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Qe.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Qe.FreezeRotationZ)!==0}set lockPositionX(e){e?this.constraints|=Qe.FreezePositionX:this.constraints&=~Qe.FreezePositionX}set lockPositionY(e){e?this.constraints|=Qe.FreezePositionY:this.constraints&=~Qe.FreezePositionY}set lockPositionZ(e){e?this.constraints|=Qe.FreezePositionZ:this.constraints&=~Qe.FreezePositionZ}set lockRotationX(e){e?this.constraints|=Qe.FreezeRotationX:this.constraints&=~Qe.FreezeRotationX}set lockRotationY(e){e?this.constraints|=Qe.FreezeRotationY:this.constraints&=~Qe.FreezeRotationY}set lockRotationZ(e){e?this.constraints|=Qe.FreezeRotationZ:this.constraints&=~Qe.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 FR(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 sc(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;am.tempPosition.setFromMatrixPosition(e);const t=am.tempPosition.sub(this._lastPosition);this._lastPosition.copy(am.tempPosition),this._smoothedVelocity.lerp(t,this.context.time.deltaTime/.1)}};Ti([kt()],ui.prototype,"autoMass",2),Ti([u()],ui.prototype,"mass",1),Ti([kt(),u()],ui.prototype,"useGravity",2),Ti([u(b)],ui.prototype,"centerOfMass",2),Ti([kt(),u()],ui.prototype,"constraints",2),Ti([kt(),u()],ui.prototype,"isKinematic",2),Ti([kt(),u()],ui.prototype,"drag",2),Ti([kt(),u()],ui.prototype,"angularDrag",2),Ti([kt(),u()],ui.prototype,"detectCollisions",2),Ti([kt(),u()],ui.prototype,"sleepThreshold",2),Ti([kt(),u()],ui.prototype,"collisionDetectionMode",2),Ti([kt()],ui.prototype,"_gravityScale",2),Ti([kt()],ui.prototype,"dominanceGroup",2);let Ke=ui;new b,new b;const Os=v("debugsync"),Nc="STRS";bg(Nc,cs.getRootAsSyncedTransformModel);const Zn=new Am;function $w(o,e,t=!0){Zn.clear();const i=Zn.createString(o);cs.startSyncedTransformModel(Zn),cs.addGuid(Zn,i),cs.addFast(Zn,t);const n=e.worldPosition,s=e.worldEuler,r=e.gameObject.scale;cs.addTransform(Zn,Ww.createTransform(Zn,n.x,n.y,n.z,s.x,s.y,s.z,r.x,r.y,r.z));const a=cs.endSyncedTransformModel(Zn);return Zn.finish(a,Nc),Zn.asUint8Array()}let wf=0,Vc=0;kw(o=>{const e=o.connection.currentServerUrl?.includes("glitch")?10:40;Vc=Math.floor(wf/e),wf=0,Os&&Vc>0&&console.log("Sync Transform Fast Interval",Vc)});class kn extends R{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(){Os&&console.log("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(){Os&&console.log("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,Ke),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new vg(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(Nc,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&zg(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(ie.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(Nc,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}tempEuler=new st;onReceivedData(e){if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){Os&&console.log("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){dn.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)&&ig(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){Os&&console.log("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:(Os&&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),dn.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&&dn.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&&(Os&&console.log("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(wf++,s&&Vc>0&&this.context.time.frameCount%Vc!==0)return;Os&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const r=$w(this.guid,this,!!s);this.context.connection.sendBinary(r)}}}class gd{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 gd(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function Iu(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}const jo=new Array;class Bo{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?(jo.length=0,e!==void 0&&e.length>0&&jo.push(...e),jo.push(...this.arguments),this.target(...this.arguments),jo.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?(jo.length=0,e!==void 0&&e.length>0&&jo.push(...e),jo.push(...this.arguments),t.call(this.target,...jo),jo.length=0):t.call(this.target,...e):this.arguments?this.target[this.methodName]=this.arguments[0]||e[0]:this.target[this.methodName]=e[0]}}}}const UR=o=>/^[A-Z]*$/.test(o);class Lu extends Event{args}class de{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]:c?.isComponent?e[c.guid]:c);t.push(new Bo(a.clone,n.methodName,l,n.enabled))}else A()&&console.warn("Could not find target for event listener")}}}return new de(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&&UR(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 de(e)}constructor(e){if(this.methods=[],Array.isArray(e))for(const t of e)t instanceof Bo?this.methods.push(t):typeof t=="function"&&this.methods.push(new Bo(t));else typeof e=="function"&&this.methods.push(new Bo(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 Lu(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 Bo(e)),e}removeEventListener(e){if(e)for(let t=this.methods.length-1;t>=0;t--)this.methods[t].target===e&&(this.methods[t].enabled=!1,this.methods.splice(t,1))}removeAllEventListeners(){this.methods.length=0}}class zR extends Qi{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 NR=new zR;class VR extends Qi{constructor(){super([st],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new st(e.x,e.y,e.z,e.order);if(e.x!=null)return new st(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const WR=new VR;class $R extends Qi{constructor(){super(k,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const i=t.objectToNode[e.uuid];return yt&&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}"
|
|
952
|
+
|
|
953
|
+
It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
|
|
954
|
+
|
|
955
|
+
To fix this please change your code to:
|
|
956
|
+
|
|
957
|
+
@serializable(AssetReference)
|
|
958
|
+
${t.path}! : AssetReference;
|
|
959
|
+
\0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const i=t.nodeToObject[e.node];return yt&&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&&(yt&&console.warn("Deserialized object reference is a component"),i=i.gameObject),yt&&console.log("Deserialized object reference?",e,i,t?.nodeToObject)):((A()||yt)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),i}}}}const Hw=new $R;class HR extends Qi{constructor(){super([R,R],"ComponentSerializer")}onSerialize(e,t){if(e?.guid)return{guid:e.guid}}onDeserialize(e,t){if(e?.guid){if(e.___persistentAsset){yt&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const i=t.path;yt&&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()||yt)&&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 Du=new HR;class GR extends Qi{constructor(){super([de])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){if(typeof e=="function")return new de([new Bo(e,null,[],!0)]);if(e&&e.type==="EventList"){yt&&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=Hw.onDeserialize(h,t);if(d||(d=Du.onDeserialize(h,t)),d)return d}return h};yt&&console.log(r);let l=Du.findObjectForGuid(r.target,t.root);!l&&t.context?.scene&&(l=Du.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:
|
|
960
|
+
Could not find method ${r.method} on object ${l.name}. Please rename ${r.method} to ${d}?
|
|
961
|
+
`,l[d],`
|
|
962
|
+
in script: `,l),be("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
|
|
963
|
+
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()||yt)&&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 Bo(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 de(i);yt&&console.log(n);const s=t.target;return s!==void 0&&t.path!==void 0&&n.setEventTarget(t.path,s),n}}}const qR=new GR,ju=new WeakMap,XR=Le.prototype.clone;Le.prototype.clone=function(){const o=XR.call(this);return ju.has(o)||ju.set(o,this),o};class Gw extends Qi{constructor(){super([_o,Wn])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof Le&&t.type===_o){let i=e;ju.has(i)&&(i=ju.get(i)),i.isRenderTargetTexture=!0,i.flipY=!0,i.offset.y=1,i.repeat.y=-1,i.needsUpdate=!0,i.mipmaps=[],i instanceof XS&&(i.isCompressedTexture=!1,i.format=Sd);const n=new _o(i.image.width,i.image.height,{colorSpace:So});return n.texture=i,n}}}new Gw;class qw extends Qi{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return fs(t.gltfId,e)}}new qw;var QR=Object.defineProperty,YR=(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&&QR(e,t,n),n};class tl extends R{awake(){ri.createIfNoneExists(this.context)}onEnable(){ri.get(this.context)?.register(this)}onDisable(){ri.get(this.context)?.unregister(this)}}class Ai extends tl{targets=null;raycastHits=[];ignoreSkinnedMeshes=!1;start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??=new vs,e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=n=>n instanceof ms?"continue in children":t?t(n):!0);const i=this.context.physics.raycast(e);return e.testObject=t,i}}YR([u()],Ai.prototype,"ignoreSkinnedMeshes");class Bu extends Ai{constructor(){super(),this.ignoreSkinnedMeshes=!0}}class _a extends tl{static allow=!0;performRaycast(e){if(!Z.active||!_a.allow||!e?.ray)return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}}class xf{static getObject(e){const t=e[Ei];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=Ar(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=Ar(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 Sf(o){return o[Ei]||(o.parent?Sf(o.parent):null)}function ZR(o){return o.isUI===!0||typeof o[Ei]=="object"}function Fu(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?Oi:gs,t.shadowSide=e.doubleSided?Oi:gs,o.castShadow=e.castShadows?e.castShadows:!1,o.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const i of o.children)Fu(i,e)}function il(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 Xw=Symbol("Scheduled action");function KR(o,e,t=xe.OnBeforeRender){let i=o[Xw];i||(i=o[Xw]={});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 ks=v("debugeventsystem");var Cf=(o=>(o.BeforeHandleInput="BeforeHandleInput",o.AfterHandleInput="AfterHandleInput",o))(Cf||{});Ow(o=>{ri.createIfNoneExists(o)});class ri extends R{static ensureUpdateMeshUI(e,t,i=!1){Wc.update(e,t,i)}static markUIDirty(e){Wc.markDirty()}static createIfNoneExists(e){e.scene.getComponent(ri)||e.scene.addComponent(ri)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(ri)}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(tl)||this.context.scene.addComponent(Ai)}onEnable(){this.context.input.addEventListener(Te.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Te.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Te.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Te.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Te.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Te.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 gd(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==Te.PointerDown,t.isUp=e.type==Te.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId);const i=new vs;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(ks&&(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})}ks&&t.isClick&&Ee("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(tl):null;if(t&&t!=this._currentlyActiveRaycaster)return!1;let i=null;if(ZR(e)&&(i=e[Ei]?.gameObject),this._testObjectsCache.has(e)||i&&this._testObjectsCache.has(i))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let n=Iu(e,this._currentPointerEventName);if(!n&&i&&(n=Iu(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&&ks&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return ks&&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[Ei]){const h=i[Ei].gameObject;if(h){if(!xf.isInteractable(h,this.out))return!1;s=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,c),e=h}}}n&&ks&&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===Hd.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),ks&&console.log("released pointer capture",i,t,this._capturedPointer))}}invokePointerCapture(e){if(e.event.type===Te.PointerMove){const t=e.pointerId,i=this._capturedPointer[t];if(i){ks&&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=Wc.updateState(e,t);return i&&this.currentActiveMeshUIComponents.push(i),i!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&Wc.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];Wc.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?x.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class Wc{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&&(ks&&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 JR=Object.defineProperty,eE=Object.getOwnPropertyDescriptor,Oe=(o,e,t,i)=>{for(var n=i>1?void 0:i?eE(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&&JR(e,t,n),n};const Ut=v("debugorbit"),Pf=v("freecam"),tE=v("debugcamerafit"),Uu=v("smoothcam"),iE={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let Of;class $c extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class fe extends R{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;lookAtConstraint=null;lookAtConstraint01=1;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;awake(){Ut&&console.debug("OrbitControls",this),this._didSetTarget=0,this._startedListeningToKeyEvents=!1,this.context.domElement.cameraControls===!1&&(this.enabled=!1)}start(){this._eventSystem=ri.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(Cf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){this._controls?.dispose(),this._eventSystem?.removeEventListener(Cf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._enableTime=this.context.time.time;const e=x.getComponent(this.gameObject,pi);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof ae&&(t=this.gameObject),t&&Qm(t,this,!0),!this._controls&&t instanceof k){this._cameraObject=t;const i=this.targetElement??this.context.renderer.domElement,n=t?.quaternion.clone();this._controls=new xb(t,i),t?.quaternion.copy(n),Of===void 0&&(Of={...this._controls.keys});const s=J(t),r=this.gameObject.worldForward,a=s.clone().sub(r.multiplyScalar(2.5));this._controls.target.copy(a)}if(this._controls)if(Pf&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,L.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,kn)??void 0,this.context.pre_render_callbacks.push(this.__onPreRender),this._activePointerEvents=[],this.context.input.addEventListener("pointerdown",this._onPointerDown,{queue:hi.Early}),this.context.input.addEventListener("pointerdown",this._onPointerDownLate,{queue:hi.Late}),this.context.input.addEventListener("pointerup",this._onPointerUp,{queue:hi.Early}),this.context.input.addEventListener("pointerup",this._onPointerUpLate,{queue:hi.Late})}onDisable(){if(this._camera?.threeCamera&&Qm(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}Ut&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}};_onPointerUpLate=e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()};updateTargetNow(e){const t=new vo(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?(Ut&&F.DrawWireSphere(n.point,.1,16711680,2),this._controls?.target.copy(i[0].point)):Ut&&console.log("OrbitControls: No hit found when updating target",{hits:[...i]})}_orbitStartAngle=0;_zoomStartDistance=0;onControlsChangeStarted=()=>{Ut&&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(Ut&&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?(Ut&&console.debug("OrbitControls: Update target",{deltaAngle:e}),this.updateTargetNow({allowSlowRaycastFallback:!1})):Ut&&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,pi);if(e&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const t=J(e.threeCamera),i=Math.max(.01,t.length()),n=new b(0,0,-i).applyMatrix4(e.threeCamera.matrixWorld);Ut&&F.DrawLine(t,n,5592575,10),this.setLookTargetPosition(n,!0)}if(!this.setLookTargetFromConstraint()){const t=new vs;t.screenPoint=new ee(0,0),t.lineThreshold=.1;const i=this.context.physics.raycast(t);i.length>0&&this.setLookTargetPosition(i[0].point,!0),tE&&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 $c(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 $c(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=B(this.targetBounds.worldScale).multiplyScalar(.5),n=B(t).sub(i),s=B(t).add(i),r=B(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)),Ut&&F.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?Of:iE,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,Pf||(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 Uu=="number"||Uu===!0){this._controls.enableDamping=!0;const t=typeof Uu=="number"?Uu:.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||(!Pf&&this.lookAtConstraint?.locked&&!this._lookTargetLerpActive&&this.setLookTargetFromConstraint(0,this.lookAtConstraint01),this._controls.update(this.context.time.deltaTime),Ut&&F.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()||Ut)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof k)&&!(e instanceof pi))return(A()||Ut)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof pi&&(e=e.gameObject);const i=e.worldPosition,n=e.worldForward;e instanceof QS&&(Ut&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),n.multiplyScalar(-1));const s=new vo(i,n);return Ut&&F.DrawRay(s.origin,s.direction,16711680,10),this.setTargetFromRaycast(s,t)||this.setLookTargetPosition(s.at(2,B()),t),this.setCameraTargetPosition(i,t),!0}setCameraTargetPosition(e,t=!1){e&&(e instanceof k&&(e=J(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 k&&(e=J(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,Ut&&(console.warn("OrbitControls: setLookTargetPosition",e,t),F.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=0,t=1){if(!this._controls||this.lookAtConstraint?.enabled===!1)return!1;const i=this.lookAtConstraint?.sources;if(i&&i.length>0){const n=i[e];if(n)return n.getWorldPosition(this._lookTargetEndPosition),this.lerpLookTarget(this._controls.target,this._lookTargetEndPosition,t),!0}return!1}lerpLookTarget(e,t,i){this._controls&&(i>=1?this._controls.target.copy(t):this._controls.target.lerpVectors(e,t,i),this.lookAtConstraint&&this.lookAtConstraint.setConstraintPosition(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=Sf(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 k)&&!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=Vw({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}Oe([u()],fe.prototype,"autoTarget",2),Oe([u()],fe.prototype,"autoFit",2),Oe([u()],fe.prototype,"enableRotate",2),Oe([u()],fe.prototype,"autoRotate",2),Oe([u()],fe.prototype,"autoRotateSpeed",2),Oe([u()],fe.prototype,"minAzimuthAngle",2),Oe([u()],fe.prototype,"maxAzimuthAngle",2),Oe([u()],fe.prototype,"minPolarAngle",2),Oe([u()],fe.prototype,"maxPolarAngle",2),Oe([u()],fe.prototype,"enableKeys",2),Oe([u()],fe.prototype,"enableDamping",2),Oe([u()],fe.prototype,"dampingFactor",2),Oe([u()],fe.prototype,"enableZoom",2),Oe([u()],fe.prototype,"minZoom",2),Oe([u()],fe.prototype,"maxZoom",2),Oe([u()],fe.prototype,"zoomSpeed",2),Oe([u()],fe.prototype,"enablePan",2),Oe([u(Br)],fe.prototype,"lookAtConstraint",2),Oe([u()],fe.prototype,"lookAtConstraint01",2),Oe([u()],fe.prototype,"allowInterrupt",2),Oe([u()],fe.prototype,"middleClickToFocus",2),Oe([u()],fe.prototype,"doubleClickToFocus",2),Oe([u()],fe.prototype,"clickBackgroundToFitScene",2),Oe([u()],fe.prototype,"targetLerpDuration",1),Oe([u(k)],fe.prototype,"targetBounds",2);var nE=Object.defineProperty,oE=Object.getOwnPropertyDescriptor,Kt=(o,e,t,i)=>{for(var n=i>1?void 0:i?oE(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&&nE(e,t,n),n},Ur=(o=>(o[o.None=0]="None",o[o.Skybox=1]="Skybox",o[o.SolidColor=2]="SolidColor",o[o.Uninitialized=4]="Uninitialized",o))(Ur||{});const Ms=v("debugcam"),Qw=v("debugscreenpointtoray"),zt=class cd extends R{get isCamera(){return!0}get aspect(){return this._cam instanceof ae?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(e){this._cam instanceof ae&&this._cam.aspect!==e&&(this._cam.aspect=e,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof ae?this._cam.fov:this._fov}set fieldOfView(e){const t=this.fieldOfView!=e;if(this._fov=e,t&&this._cam&&this._cam instanceof ae){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=cd._origin;s.set(e,t,-1),this.context.input.convertScreenspaceToRaycastSpace(s),Qw&&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=cd._direction.set(s.x,s.y,s.z),a=J(n);return r.sub(a),r.normalize(),i?(i.set(a,r),i):new vo(a.clone(),r.clone())}_frustum;getFrustum(){return this._frustum||(this._frustum=new cb,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new cb),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 K;awake(){Qw&&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);F.DrawRay(n.origin,n.direction,s,10)})}onEnable(){Ms&&console.log(`Camera enabled: "${this.name}". ClearFlags=${Ur[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),rE(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 ae&&(this._fov=t.fov)):t=this.gameObject.children[0],t&&t.isCamera)t instanceof ae&&(this._fov&&(t.fov=this._fov),t.near=this._nearClipPlane,t.far=this._farClipPlane,t.updateProjectionMatrix());else if(!this.orthographic)t=new ae(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 _d(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){Ms&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this.fieldOfView,Ms){const i=`[Camera] Apply ClearFlags: ${Ur[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(cd.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:Ms&&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:Ms&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let i=this._backgroundColor.alpha;cd.backgroundShouldBeTransparent(this.context)&&(i=this.ARBackgroundAlpha??0),this.context.scene.background=null,this.context.xr?.isVR?this.context.renderer.setClearColor(t_(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,i)}else this._backgroundColor||Ms&&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 sE(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;Ms&&Ee("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(L.isNeedleAppClip())return!0}return t._transparent=n,n}};Kt([u()],zt.prototype,"aspect",1),Kt([u()],zt.prototype,"fieldOfView",1),Kt([u()],zt.prototype,"nearClipPlane",1),Kt([u()],zt.prototype,"farClipPlane",1),Kt([u()],zt.prototype,"clearFlags",1),Kt([u()],zt.prototype,"orthographic",2),Kt([u()],zt.prototype,"orthographicSize",2),Kt([u()],zt.prototype,"ARBackgroundAlpha",2),Kt([u()],zt.prototype,"cullingMask",1),Kt([u()],zt.prototype,"backgroundBlurriness",1),Kt([u()],zt.prototype,"backgroundIntensity",1),Kt([u(st)],zt.prototype,"backgroundRotation",1),Kt([u()],zt.prototype,"environmentIntensity",1),Kt([u(se)],zt.prototype,"backgroundColor",1),Kt([u(_o)],zt.prototype,"targetTexture",1);let pi=zt;class sE{_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");Ms&&console.debug(`[Camera] Apply Skybox ${this._skybox?.name} ${e} - "${this._camera.name}"`),e?.length||(this._skybox.mapping=Vn,this.context.scene.background=this._skybox)}}}function rE(o){v("freecam")&&o.context.mainCameraComponent===o&&x.getOrAddComponent(o.gameObject,fe)}class Fo extends R{get listener(){return this._listener==null&&(this._listener=new YS),this._listener}_listener=null;onEnable(){Bn.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){Bn.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,pi);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 aE=Object.defineProperty,lE=Object.getOwnPropertyDescriptor,Mn=(o,e,t,i)=>{for(var n=i>1?void 0:i?lE(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&&aE(e,t,n),n};const Mt=v("debugaudio"),Ki=class nr extends R{static get userInteractionRegistered(){return Bn.userInteractionRegistered}static registerWaitForAllowAudio(e){Bn.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&&(Mt&&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&&nr.userInteractionRegistered){let e=this.gameObject.getComponent(Fo)??this.context.mainCamera.getComponent(Fo)??qa(Fo,this.context,!1);!e&&this.context.mainCamera&&(e=this.context.mainCamera.addComponent(Fo)),e?.listener?(this.sound=new ZS(e.listener),this.gameObject?.add(this.sound)):Mt&&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(){Mt&&console.log("[AudioSource]",this),this.audioLoader=new Sm,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),nr.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():nr.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(gg.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(gg.MuteChanged,this.onApplicationMuteChanged),this.pause()}onVisibilityChanged=()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||L.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":Mt&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,nr.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&nr.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){Mt&&console.warn("AudioSource destroyed, not creating audio",this.name);return}Mt&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){Mt&&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&&nr.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),nr.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(Mt&&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?Mt&&!this.helper&&(this.helper=new eP(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(Mt&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new Sm),this.shouldPlay=!0,this._lastClipStartedLoading===e){Mt&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,Mt&&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+`
|
|
964
|
+
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,Mt&&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(){Mt&&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(){Mt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,Mt&&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,Mt&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};Mn([u(URL)],Ki.prototype,"clip",2),Mn([u()],Ki.prototype,"playOnAwake",2),Mn([u()],Ki.prototype,"preload",2),Mn([u()],Ki.prototype,"playInBackground",2),Mn([u()],Ki.prototype,"loop",1),Mn([u()],Ki.prototype,"spatialBlend",1),Mn([u()],Ki.prototype,"minDistance",1),Mn([u()],Ki.prototype,"maxDistance",1),Mn([u()],Ki.prototype,"volume",1),Mn([u()],Ki.prototype,"pitch",1),Mn([u()],Ki.prototype,"rollOffMode",2);let Ii=Ki;const cE=v("debugavatar");class Ie extends R{static getAvatar(e){return e>=0&&e<Ie.instances.length?Ie.instances[e]:null}static instances=[];static onAvatarMarkerCreated(e){return Ie._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return Ie._onAvatarMarkerDestroyed.push(e),e}static _onNewAvatarMarkerAdded=[];static _onAvatarMarkerDestroyed=[];connectionId;avatar;awake(){Ie.instances.push(this),cE&&console.log(this);for(const e of Ie._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){Ie.instances.splice(Ie.instances.indexOf(this),1);for(const e of Ie._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}}class zr{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 hE{guid;position=new b}class Hc extends R{set controlledTarget(e){this.target=e;const t=C.get("MoveRandom");if(t&&this.target){const i=x.getComponent(this.target,t);i&&i.destroy()}}target=null;avatar=null;_model=null;_targetModel=new hE;_currentTargetObject=null;_lastUpdateTime=0;_lookDuration=0;_lastPoiChangedTime=0;awake(){if(this.avatar=x.getComponentInParent(this.gameObject,Ie),this.avatar){const e=x.getComponentInParent(this.gameObject,Ie);this._model=new vg(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&&ft(this.target,e.position)})}update(){if((!this.context.connection.isConnected||this._model?.hasOwnership)&&(zr.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=zr.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const e=J(this._currentTargetObject);ft(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=zr.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}}}}}function Yw(o){const e=o;return!!(e.parser&&e.parser.json)}var zu=(o=>(o[o.None=0]="None",o[o.DontExport=1]="DontExport",o))(zu||{});function Zw(o){return o&&o.isComponent}const dE=Symbol("object"),kf=new Mi(()=>new b,20);class Kw{_point;_normal;_tangentVelocity;distance;impulse;friction;get point(){return kf.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return kf.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return kf.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 Jw{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 ex{object;collider;constructor(e,t){this.object=e,this.collider=t}}const De=v("debugnetworkingstreams");var Kn=(o=>(o.Connected="peer-user-connected",o.StreamReceived="receive-stream",o.StreamEnded="call-ended",o.Disconnected="peer-user-disconnected",o.UserJoined="user-joined",o))(Kn||{});class Mf{type="call-ended";userId;direction;constructor(e,t){this.userId=e,this.direction=t}}class tx{type="receive-stream";userId;stream;target;constructor(e,t,i){this.userId=e,this.stream=t,this.target=i}}class uE{guid;peerId;dontSave=!0;constructor(e,t){this.guid=e.id,this.peerId=t}}var ix=(o=>(o.Incoming="incoming",o.Outgoing="outgoing",o))(ix||{});class pE extends Cm{peerId;userId;direction;call;get stream(){return this._stream}_stream=null;_isDisposed=!1;close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),Jn(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",`
|
|
965
|
+
Audio:`,s.getAudioTracks(),`
|
|
966
|
+
Video:`,s.getVideoTracks()),this._stream=s,i==="incoming"){const r=new tx(e,s,this);this.dispatchEvent(r)}}),t.on("close",()=>{this.dispatchEvent(new Mf(e,i))})}}function nx(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 hs extends Cm{static instances=new Map;static getOrCreate(e,t){if(hs.instances.has(t))return hs.instances.get(t);const i=new hs(e,t);return hs.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=>nx(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}`,`
|
|
967
|
+
Outgoing:`,this._outgoingCalls,`
|
|
968
|
+
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()}setupPeer(){if(this.context.connection.connectionId&&!this._enabledPeer){if(this._enabledPeer=!0,!this._peer){const e=this.getMyPeerId();e?this._peer=N_(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 uE(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=>nx(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 pE(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 Mf(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 fd extends Cm{static create(e,t){const i=hs.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new fd(e.context,i)}context;peer;_sendingStreams=new Map;debug=!1;constructor(e,t){if(super(),Zw(e)){const i=e;e=i.context,t=hs.getOrCreate(i.context,i.guid)}else typeof t=="string"&&(t=hs.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;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 Jn(o){if(o&&o instanceof MediaStream)for(const e of o.getTracks())e.stop()}var mE=Object.defineProperty,Rf=(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&&mE(e,t,n),n};const gE="noVoip",fE=v("debugvoip");class Rs extends R{autoConnect=!0;runInBackground=!0;createMenuButton=!0;debug=!1;_net;_menubutton;awake(){fE&&(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=fd.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(Kn.StreamReceived,this.onReceiveStream),this._net.addEventListener(Kn.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(Kn.StreamReceived,this.onReceiveStream),this._net.removeEventListener(Kn.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)}onDestroy(){this._menubutton?.remove(),this._menubutton=void 0}_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 L.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),Jn(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 L.microphonePermissionsGranted()?console.error("VOIP: Could not get audio stream - please make sure to connect an audio device and grant microphone permissions"):dc("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),Jn(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(),L.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 L.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(Ot(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(L.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 ko(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())Jn(e.srcObject);this._incomingStreams.clear()};_incomingStreams=new Map;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.setAttribute("autoplay","true"),Bn.registerWaitForInteraction(()=>{n?.play().catch(s=>{console.error("VOIP: Failed to play audio",s)})})};onStreamEnded=e=>{const t=this._incomingStreams.get(e.userId);Jn(t?.srcObject),this._incomingStreams.delete(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}}}Rf([u()],Rs.prototype,"autoConnect"),Rf([u()],Rs.prototype,"runInBackground"),Rf([u()],Rs.prototype,"createMenuButton");var yE=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&&yE(e,t,n),n};const bE=v("debugmouth");class Gc extends R{idle=[];talking=[];marker=null;voip=null;lastMouthChangeTime=0;mouthChangeLength=0;awake(){setTimeout(()=>{this.voip=x.findObjectOfType(Rs,this.context),this.marker||(this.marker=x.getComponentInParent(this.gameObject,Ie))},3e3)}update(){if(!this.voip||this.context.time.frameCount%10!==0)return;let e=this.marker?.connectionId??null;if(!e){bE&&(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)}}}}ox([u(k)],Gc.prototype,"idle"),ox([u(k)],Gc.prototype,"talking");class Ef extends R{voip=null;marker=null;_startPosition=null;awake(){this.voip=x.findObjectOfType(Rs,this.context),this.marker=x.getComponentInParent(this.gameObject,Ie)}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 _E=Object.defineProperty,vE=(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&&_E(e,t,n),n};const nl=v("debugxrflags"),sx=v("disablexrflags");sx&&console.warn("XRFlags are disabled");var eo=(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))(eo||{});class si{static Global=new si;Mask=17;Has(e){return(this.Mask&e)!==0}Set(e){nl&&console.warn("Set XR flag state to",e),this.Mask=e,Ji.Apply()}Enable(e){this.Mask|=e,Ji.Apply()}Disable(e){this.Mask&=~e,Ji.Apply()}Toggle(e){this.Mask^=e,Ji.Apply()}EnableAll(){this.Mask=-1,Ji.Apply()}DisableAll(){this.Mask=0,Ji.Apply()}}const rx=class ss extends R{static registry=[];static Apply(){for(const e of this.registry)e.UpdateVisible(si.Global)}static firstApply;static buffer=new si;visibleIn;awake(){ss.registry.push(this)}onEnable(){ss.firstApply?this.UpdateVisible(si.Global):(ss.firstApply=!0,ss.Apply())}onDestroy(){const e=ss.registry.indexOf(this);e>=0&&ss.registry.splice(e,1)}get isOn(){return this.gameObject.visible}UpdateVisible(e=null){if(sx)return;let t;const i=e;if(i&&typeof i=="number"&&(console.assert(typeof i=="number","XRFlag.UpdateVisible: state must be a number",i),nl&&console.log(i),ss.buffer.Mask=i,e=ss.buffer),e instanceof si?(nl&&console.warn(this.name,"use passed in mask",e.Mask,this.visibleIn),t=e.Has(this.visibleIn)):(nl&&console.log(this.name,"use global mask"),si.Global.Has(this.visibleIn)),t!==void 0)if(t)nl&&console.log(this.name,"is visible",this.gameObject.uuid),x.setActive(this.gameObject,!0);else{if(nl&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}};vE([u()],rx.prototype,"visibleIn");let Ji=rx;var wE=Object.defineProperty,Nu=(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&&wE(e,t,n),n};class Nr extends R{eyes=[];lastBlinkTime=0;blinkLength=0;eyesOpen=!0;state=null;awake(){this.state=x.getComponentInParent(this.gameObject,Ji)}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)}}}Nu([u(k)],Nr.prototype,"eyes"),Nu([u()],Nr.prototype,"lastBlinkTime"),Nu([u()],Nr.prototype,"blinkLength"),Nu([u()],Nr.prototype,"eyesOpen");var xE=Object.defineProperty,Tf=(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&&xE(e,t,n),n};const Vu=class vS extends R{head=null;eyes=null;target=null;brain=null;awake(){this.brain||(this.brain=x.getComponentInParent(this.gameObject,Hc)),this.brain||(this.brain=x.addComponent(this.gameObject,Hc)),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=J(e);this.currentTargetPoint.lerp(i,this.context.time.deltaTime/.1);const n=J(this.head),s=this.vec.copy(this.currentTargetPoint).sub(n).normalize();if(s.length()<.1)return;const r=vS.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)}}}};Tf([u(k)],Vu.prototype,"head"),Tf([u(k)],Vu.prototype,"eyes"),Tf([u(k)],Vu.prototype,"target");let Af=Vu;var SE=Object.defineProperty,If=(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&&SE(e,t,n),n};class ol extends R{length=1;depthTest=!0;isGizmo=!1;_axes=null;onEnable(){if(this.isGizmo&&!Oc)return;this._axes||(this._axes=new Pi(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)}}If([u()],ol.prototype,"length"),If([u()],ol.prototype,"depthTest"),If([u()],ol.prototype,"isGizmo");class Lf extends R{from;to;hint;desiredDistance=1;onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=J(this.to).clone(),t=J(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=J(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),ft(this.gameObject,d);const p=s.clone();p.sub(a),this.gameObject.lookAt(p)}}const CE=v("gizmos"),PE=v("debugboxhelper");class Pt extends R{box=null;static testBox=new Ci;_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 Ci),Qt([e],void 0,void 0,Pt.testBox),Pt.testBox.isEmpty()){const i=J(e,Pt._position);Pt.testBox.setFromCenterAndSize(i,Pt._emptyObjectSize)}this.updateBox();const t=this.box?.intersectsBox(Pt.testBox);return t&&PE&&F.DrawWireBox3(Pt.testBox,16711680,5),t}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new Ci),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const i=t,n=J(this.gameObject,Pt._position,i),s=Ge(this.gameObject,Pt._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(!(!CE&&!t)){if(this._helper){e&&this._color?.set(e),this.gameObject.add(this._helper);return}this._helper=Mg(e),this.gameObject.add(this._helper)}}}var OE=Object.defineProperty,mi=(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&&OE(e,t,n),n};class en extends R{get isCollider(){return!0}attachedRigidbody=null;isTrigger=!1;sharedMaterial;membership=[0];filter;awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ke))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ke))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ke))}onDisable(){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)}}mi([u(Ke)],en.prototype,"attachedRigidbody"),mi([u()],en.prototype,"isTrigger"),mi([u()],en.prototype,"sharedMaterial"),mi([u()],en.prototype,"membership"),mi([u()],en.prototype,"filter");class sl extends en{radius=.5;center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.addSphereCollider(this),Ad(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Um(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}mi([kt(),u()],sl.prototype,"radius"),mi([u(b)],sl.prototype,"center");const Df=class wS extends en{static add(e,t){const i=Cn(e,wS);return i.autoFit(),t?.rigidbody===!0&&Cn(e,Ke,{isKinematic:!1}),i}size=new b(1,1,1);center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.addBoxCollider(this,this.size),Ad(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Um(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=Qt([t]);t.position.copy(i),t.quaternion.copy(n),t.scale.copy(s),t.parent=r,e?.debug===!0&&F.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)}};mi([kt(),u(b)],Df.prototype,"size"),mi([u(b)],Df.prototype,"center");let Wu=Df;class Es extends en{sharedMesh;convex=!1;onEnable(){if(super.onEnable(),!this.context.physics.engine)return;this.sharedMesh?.isMesh||(this.gameObject instanceof H||this.gameObject instanceof xo)&&(this.sharedMesh=this.gameObject);const e=0;if(this.sharedMesh?.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),We.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(We.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()||v("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)}}}mi([u(H)],Es.prototype,"sharedMesh"),mi([u()],Es.prototype,"convex");class Uo extends en{center=new b(0,0,0);radius=.5;height=2;onEnable(){super.onEnable(),this.context.physics.engine?.addCapsuleCollider(this,this.height,this.radius)}}mi([u(b)],Uo.prototype,"center"),mi([u()],Uo.prototype,"radius"),mi([u()],Uo.prototype,"height");var kE=Object.defineProperty,zo=(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&&kE(e,t,n),n};const ax=v("debugcharactercontroller");class Vr extends R{center=new b(0,0,0);radius=.5;height=2;_rigidbody=null;get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(Ke),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(Ke)),this.rigidbody)}_activeGroundCollisions;awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(Uo);t||(t=this.gameObject.addComponent(Uo)),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),ax&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),ax&&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}}zo([u(b)],Vr.prototype,"center"),zo([u()],Vr.prototype,"radius"),zo([u()],Vr.prototype,"height");class No extends R{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 ee(0,0);moveInput=new ee(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 vo),this._raycastOptions.ray.origin.copy(J(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 vs}zo([u(Vr)],No.prototype,"controller"),zo([u()],No.prototype,"movementSpeed"),zo([u()],No.prototype,"rotationSpeed"),zo([u()],No.prototype,"jumpForce"),zo([u()],No.prototype,"doubleJumpForce"),zo([u(bt)],No.prototype,"animator");var ME=Object.defineProperty,rl=(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&&ME(e,t,n),n};const qc=v("debugcontactshadows");ku(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=Xc.auto(o),i=parseFloat(e);isNaN(i)||(t.opacity=i,t.darkness=i)}});const Wr=class hd extends R{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 k;i=Cn(n,hd,{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 k;shadowCamera;shadowGroup=new xo;renderTarget;renderTargetBlur;plane;occluderMesh;blurPlane;depthMaterial;horizontalBlurMaterial;verticalBlurMaterial;textureSize=512;fitShadows(e={}){qc&&console.warn("Fitting shadows to scene"),jd(this.shadowsRoot,!1);const t=e.object||this.context.scene,i=Qt(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)),qc&&F.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,qc&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){hd._instances.set(this.context,this),this.shadowsRoot.hideFlags=zu.DontExport,jd(this.shadowsRoot,!1)}start(){qc&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new Wn(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new Wn(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const e=new zn(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"),Io(this.gameObject,!1));const t=new Se({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:gs});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 Se({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:Md})).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 _d(-1/2,1/2,1/2,-1/2,i,n),this.shadowCamera.layers.enableAll(),this.shadowCamera.rotation.x=Math.PI/2,this.shadowGroup.add(this.shadowCamera),this.depthMaterial=new KS,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=JS,this.depthMaterial.blendEquation=eC,this.depthMaterial.onBeforeCompile=s=>{this.depthMaterial&&(s.uniforms.darkness=this.depthMaterial.userData.darkness,s.fragmentShader=`
|
|
969
|
+
uniform float darkness;
|
|
970
|
+
${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) );")}
|
|
971
|
+
`)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new Nn(tP),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new Nn(iP),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){hd._instances.get(this.context)===this&&hd._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){qc&&console.error("ContactShadows: not initialized yet");return}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&&Io(this.gameObject,!1);const r=t.background;t.background=null,t.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=Oi:this.depthMaterial.side=gs;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;lx.length=0,h.transparent=lx,jf.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||d_(m.object)===!1;!g&&m.material.isLineMaterial&&(g=!0),!g&&m.material.isPointsMaterial&&(g=!0),g&&(jf.push(m.object),m.object["needle:visible"]=m.object.visible,m.object.visible=!1)}i.setRenderTarget(this.renderTarget),i.clear(),i.render(t,this.shadowCamera),h.transparent=d;for(const m of jf)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))}};rl([u()],Wr.prototype,"autoFit"),rl([u()],Wr.prototype,"darkness"),rl([u()],Wr.prototype,"opacity"),rl([u()],Wr.prototype,"blur"),rl([u()],Wr.prototype,"occludeBelowGround"),rl([u()],Wr.prototype,"backfaceShadows");let Xc=Wr;const lx=[],jf=new Array,RE=v("logstats");class Bf extends R{onEnable(){console.log(this),RE&&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 Qc extends R{isUsed=!0;usedBy=null}class Ff extends R{}const cx=v("debugdeletable");class lr extends Pt{static _instances=[];onEnable(){lr._instances.push(this)}onDisable(){const e=lr._instances.indexOf(this);e>=0&&lr._instances.splice(e,1)}}class Uf extends R{update(){for(const e of lr._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const i=x.getComponentInParent(this.gameObject,Qc);if(i)cx&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,i);else{if(cx)try{if(e.box){const n=e.box,s=Pt.testBox;F.DrawWireBox3(n,16711680,5),F.DrawWireBox3(s,255,5),console.log("DeleteBox: Destroying",this.gameObject,{deleteBoxArea:n,deletedObjectArea:s})}else console.log("DeleteBox: Destroying",this.gameObject)}catch{}Pc(this.gameObject,this.context.connection)}}}}}var EE=Object.defineProperty,TE=(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&&EE(e,t,n),n};class $u extends R{visibleOn;onEnable(){this.apply()}apply(){this.test()||x.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:L.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}TE([u()],$u.prototype,"visibleOn");var AE=Object.defineProperty,$r=(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&&AE(e,t,n),n};const to=v("debugdrag"),zf=[];var Nf=(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))(Nf||{});const Ts=class cn extends R{static get HasAnySelected(){return this._active>0}static _active=0;static get CurrentlySelected(){zf.length=0;for(const e of this._instances)e._isDragging&&zf.push(e);return zf}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,Ke),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(Ai)||this.gameObject.addComponent(Ai)}onEnable(){cn._instances.push(this)}onDisable(){cn._instances=cn._instances.filter(e=>e!==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,cn);!t||t!==this||(cn.lastHovered=e.object,this.context.domElement.style.cursor="pointer")}onPointerMove(e){(this._isDragging||this._potentialDragStartEvt!==null)&&e.use()}onPointerExit(e){this.allowEdit(this.gameObject)&&e.mode==="screen"&&cn.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)&&(cn.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),cn._active+=1;const t=new Vf(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 Vf&&s instanceof Vf){const r=new IE(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()}}onPointerUp(e){if(to&&F.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&&(cn._active>0&&(cn._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())}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,cn);if(!t||t!==this&&t._isDragging)return;const i=this._targetObject||this.gameObject;if(!i)return;this._isDragging=!0;const n=x.getComponentInChildren(i,kn);to&&console.log("DRAG START",n,i),n&&(n.fastMode=!0,n?.requestOwnership()),this._marker=x.addComponent(i,Qc),this._draggingRigidbodies.length=0;const s=x.getComponentsInChildren(i,Ke);s&&this._draggingRigidbodies.push(...s)}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;dn.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,kn);i&&(i.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const t=this._dragHelper.selected;to&&console.log("DRAG END",t,t?.visible),this._dragHelper.setSelected(null,this.context)}};$r([u()],Ts.prototype,"dragMode"),$r([u()],Ts.prototype,"snapGridResolution"),$r([u()],Ts.prototype,"keepRotation"),$r([u()],Ts.prototype,"xrDragMode"),$r([u()],Ts.prototype,"xrKeepRotation"),$r([u()],Ts.prototype,"xrDistanceDragFactor"),$r([u()],Ts.prototype,"showGizmo");let Hr=Ts;class IE{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 k,this._manipulatorObject=new k,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?(to&&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),to){this._followObject.add(new Pi(2)),this._manipulatorObject.add(new Pi(5));const r=a=>`${a.x.toFixed(2)}, ${a.y.toFixed(2)}, ${a.z.toFixed(2)}`;F.DrawLine(this._tempVec1,this._tempVec2,65535,0,!1),F.DrawLabel(this._tempVec3,"A:B "+this._initialDistance.toFixed(2)+`
|
|
972
|
+
`+r(this._tempVec1)+`
|
|
973
|
+
`+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 K;_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),to&&(F.DrawLabel(this._tempVec3.clone().add(new b(0,.2,0)),"A:B "+t.toFixed(2),.03),F.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}setTargetObject(e){this.gameObject=e}}class Vf{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 K;_hitPointInLocalSpace=new b;_hitNormalInLocalSpace=new b;_bottomCenter=new b;_backCenter=new b;_backBottomCenter=new b;_bounds=new Ci;_dragPlane=new dr(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 k}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,to&&(F.DrawLine(t,e.worldPosition,65280,.5,!1),F.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=Qt([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),to){let s=t;i&&(s=s.clone(),s.transformDirection(i.matrixWorld)),F.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 w=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);h=Math.max(0,w),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 vo(n,s);if(l==4){const w=this.context.physics.raycastFromRay(m,{testObject:P=>P!==this.followObject&&P!==i&&P!==t});if(w.length>0){const P=w[0];if(this._draggedOverObject===P.object?this._draggedOverObjectDuration+=this.context.time.deltaTime:(this._draggedOverObject=P.object,this._draggedOverObjectDuration=0),P.face){this._hasLastSurfaceHitPoint=!0,this._lastSurfaceHitPoint.copy(P.point);const M=this._draggedOverObjectDuration>=.15,O=this._totalMovement.length()>=.001,j=B(P.normal||P.face.normal).applyQuaternion(P.object.worldQuaternion);if((M||O)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(j)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(P.face.normal);const I=B(),W=B();this._bounds.getCenter(I),this._bounds.getSize(W),I.sub(W.multiplyScalar(.5).multiply(j)),this._hitPointInLocalSpace.copy(I),this._hitNormalInLocalSpace.copy(P.face.normal),this._bounds.getCenter(I),this._bounds.getSize(W),I.add(W.multiplyScalar(.5).multiply(P.face.normal));const V=B(this._hitPointInLocalSpace).add(I);this._followObject.localToWorld(V);const G=P.point;this._dragPlane.setFromNormalAndCoplanarPoint(j,G)}else if(!(M||O))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 w=B(this._hitPointInLocalSpace);this._followObject.localToWorld(w),to&&F.DrawLine(w,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(w),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const w=this._followObject.worldPosition,P=this.settings.snapGridResolution;w.x=Math.round(w.x/P)*P,w.y=Math.round(w.y/P)*P,w.z=Math.round(w.z/P)*P,this._followObject.worldPosition=w,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=_,to){const w=this._hitPointInLocalSpace.clone();t.localToWorld(w),F.DrawSphere(w,.02,16711680);const P=this._hitNormalInLocalSpace.clone();P.applyQuaternion(_),F.DrawRay(w,P,16711680),F.DrawLabel(y.add(new b(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
|
|
974
|
+
|
|
975
|
+
Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
|
|
976
|
+
|
|
977
|
+
Session: ${!!Z.active}
|
|
978
|
+
|
|
979
|
+
Device: ${this._deviceMode}
|
|
980
|
+
|
|
981
|
+
`,.03);const M=this._bottomCenter.clone(),O=this._backCenter.clone(),j=this._backBottomCenter.clone();t.localToWorld(M),t.localToWorld(O),t.localToWorld(j),F.DrawSphere(M,.01,65280,0,!1),F.DrawSphere(O,.01,255,0,!1),F.DrawSphere(j,.01,16711935,0,!1),F.DrawLine(M,j,65535,0,!1),F.DrawLine(j,O,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=B(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 xS{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 dr;_hasGroundPlane=!1;_groundPlane=new dr;_groundOffset=new b;_groundOffsetFactor=0;_groundDistance=0;_groundPlanePoint=new b;_raycaster=new wd;_cameraPlaneOffset=new b;_intersection=new b;_worldPosition=new b;_inverseMatrix=new K;_rbs=[];_groundLine;_groundMarker;static geometry=new fn().setFromPoints([new b(0,0,0),new b(0,-1,0)]);constructor(e){this._camera=e;const t=new Ma(xS.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 vd(.5,22,22),s=new Se({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&&zr.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}zr.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=J(this._selected);n.y=e.y,e=n}if(ft(this._selected,e),ft(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=J(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(n,n,n),ft(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=J(this._selected),t=new vo(B(0,.1,0).add(e),B(0,-1,0)),i=new vs;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=B(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 LE{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 As;(o=>{const e=new Map;function t(n){e.has(n.guid)&&i(n.guid);const s=new k;e.set(n.guid,s);const r=new k;r.position.y=-.5,s.add(r);const a=new H(new ka(1,1,1,1,1,1),new Se({color:14540253,wireframe:!0,transparent:!0,opacity:.3}));a.position.y=.5,r.add(a);const l=new k;r.add(l);const c=new H(new ka(1,1,1,1,1,1),new Se({color:12307660,transparent:!0,opacity:.4}));c.position.y=.5,l.scale.y=.01,l.add(c);const h=new H(new zn(1,1,1,1),new Se({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 k&&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})(As||(As={}));const al=[],Hu=[];var Wf;(o=>{function e(i,n){const s={name:n?.name,priority:n?.priority??0,callback:i};return al.push(s),al.sort((r,a)=>r.priority===a.priority?0:r.priority>a.priority?-1:1),()=>{const r=al.indexOf(s);r>=0&&al.splice(r,1)}}o.onCreateCustomModelLoader=e;function t(i){return Hu.push(i),()=>{const n=Hu.indexOf(i);n>=0&&Hu.splice(n,1)}}o.onDetermineModelMimetype=t})(Wf||(Wf={}));const Yc=v("debugfileformat");function dx(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 ux(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()),Yc&&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"}}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=px(i,s,n);return Yc&&console.log("[Needle Engine] Determined file type from header: "+r),r}return"unknown"}function px(o,e,t){if(e.byteLength<4)return"unknown";const i=new Uint8Array(e);Yc&&console.warn(`[Needle Engine] Trying to determine file type from binary data
|
|
982
|
+
`,'"'+new TextDecoder().decode(e)+`"
|
|
983
|
+
`,i);const n=new TextDecoder().decode(e).replace(/\s/g,"");if(n[0]==="{"&&n[1]==='"')return 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 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 console.debug("GLB detected"),"model/gltf-binary";if(i[0]==80&&i[1]==75&&i[2]==3&&i[3]==4)return 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 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 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 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 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 console.debug("OBJ detected"),"model/obj";if(t.headers.has("content-type")){const s=t.headers.get("content-type");if(s?.startsWith("image/"))return console.debug("Image detected, not a model file"),"unsupported";switch(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":return s}}if(i[0]==118&&i[1]==32||i[0]==102&&i[1]==32)return 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 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 console.debug("OBJ detected (mtllib)"),"obj";for(const s of Hu){const r=s({url:o,response:t,contentType:t.headers.get("content-type"),bytes:i});if(r)return Yc&&console.debug(`Mimetype callback returned: ${r}`),r}if(A()||Yc){const s=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));console.warn(`Could not determine file type.
|
|
984
|
+
|
|
985
|
+
Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
|
|
986
|
+
|
|
987
|
+
Content-Type: "${t.headers.get("content-type")}
|
|
988
|
+
"Text: "${s}"
|
|
989
|
+
Binary:`,i)}else console.debug("Could not determine file type from binary data");return"unknown"}const $f=v("debugstencil");function DE(o,e){return(o&1<<e.layer)!=0}const jE=Symbol("stencils");class ar{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if($f&&console.log(t,ar.stencils),!t)return;const i=ar.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(DE(s.layer,e)){$f&&console.log(s),setTimeout(()=>{$i()&&uu(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[jE]=!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[FE];if(i){$f&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=BE(r.compareFunc),r.passOp=Hf(r.passOp),r.failOp=Hf(r.failOp),r.zFailOp=Hf(r.zFailOp),ar.stencils[this.source]||(ar.stencils[this.source]=[]),ar.stencils[this.source].push(r)}}}return null}}function Hf(o){switch(o){case 0:return gC;case 1:return mC;case 2:return pC;case 3:return uC;case 4:return dC;case 6:return hC;case 7:return cC;case 5:return lC}return 0}function BE(o){switch(o){case 1:return hb;case 2:return aC;case 3:return rC;case 4:return sC;case 5:return oC;case 6:return nC;case 7:return iC;case 8:return tC}return hb}const FE="NEEDLE_render_objects";var UE=Object.defineProperty,mx=(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&&UE(e,t,n),n};const ll=v("debugreflectionprobe"),gx=v("noreflectionprobe"),Gf=Symbol("reflectionProbeKey"),fx=Symbol("original material"),qf=class rs extends R{static _probes=new Map;static isUsingReflectionProbe(e){return!!(e[Gf]||e[fx]?.[Gf])}static get(e,t,i,n){if(!e||e.isObject3D!==!0||gx)return null;const s=rs._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 ll&&console.log("Found reflection probe",e.name,r.name),r}}return ll&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;set texture(e){this._texture!==e&&(this._texture=e,ll&&console.debug("[ReflectionProbe] Set reflection probe texture "+(e?.name||"(removed)")),e&&(e instanceof db||e.mapping!==Vn&&(e.mapping=Vn),e.colorSpace=So,e.needsUpdate=!0))}get texture(){return this._texture}center;size;_boxHelper;isInBox(e){return this._boxHelper?.isInBox(e)}constructor(){super(),rs._probes.has(this.context)||rs._probes.set(this.context,[]),rs._probes.get(this.context)?.push(this)}awake(){this._boxHelper=this.gameObject.addComponent(Pt),this._boxHelper.updateBox(!0),ll&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=Vn,this._texture.colorSpace=So,this._texture.needsUpdate=!0)}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=rs._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}static _rendererMaterialsCache=new Map;onSet(e){if(gx||!this.enabled||e.sharedMaterials?.length<=0||!this.texture)return;let t=rs._rendererMaterialsCache.get(e);t||(t=[],rs._rendererMaterialsCache.set(e,t));for(let i=0;i<e.sharedMaterials.length;i++){const n=e.sharedMaterials[i];if(!n||n.envMap===void 0||n instanceof Se)continue;let s=t[i];const r=n===s?.copy,a=!s||s.material.uuid!==n.uuid||s.copy.version!==n.version;if(!r&&a){if(ll){let h="";s?s.material!==n?h="reference changed; cached instance?: "+r:s.copy.version!==n.version&&(h="version changed"):h="not cached",console.warn("Cloning material",n.name,n.version,"Reason:",h,`
|
|
990
|
+
`,n.uuid,`
|
|
991
|
+
`,s?.copy.uuid,`
|
|
992
|
+
`,e.name)}const c=n.clone();c.version=n.version,s?(s.copy=c,s.material=n):(s={material:n,copy:c},t.push(s)),c[Gf]=this,c[fx]=n,ll&&console.log("Set reflection",e.name,e.guid)}s&&s.copy&&(s.copy.onBeforeCompile=n.onBeforeCompile);const l=s?.copy;"envMap"in l&&(l.envMap=this.texture,l.needsUpdate=!0),e.sharedMaterials[i]=l}}onUnset(e){const t=rs._rendererMaterialsCache.get(e);if(t)for(let i=0;i<t.length;i++){const n=t[i];e.sharedMaterials[i]=n.material}}};mx([u(b)],qf.prototype,"center"),mx([u(b)],qf.prototype,"size");let Zc=qf;const Xf=v("debugexr");class zE{get name(){return"EXT_texture_exr"}parser;constructor(e){this.parser=e,Xf&&console.log(e)}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if(Xf&&console.log("EXT_texture_exr.loadTexture",e,n),!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=new Em(i.options.manager);return Xf&&console.log("EXT_texture_exr.loadTexture",s),i.loadTextureImage(e,s.source,r)}}typeof window<"u"&&window.addEventListener("unhandledrejection",o=>{});const io=yt,Gu="$___Export_Components",NE="NEEDLE_components";class VE{[vr]}class WE{node;nodeIndex;nodeDef;constructor(e,t,i){this.node=e,this.nodeIndex=t,this.nodeDef=i}}class yx{get name(){return NE}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[Gu]=i,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&io&&console.log("DONE",JSON.stringify(t)),e[Gu]===void 0)return;const i=e[Gu];delete e[Gu],i!==null&&(e.userData.components=i)}writeNode(e,t){const i=this.writer.json.nodes.length;io&&console.log(e.name,i,e.uuid);const n=new WE(e,i,t);this.exportContext[i]=n,this.objectToNodeMap[e.uuid]=i}afterParse(e){io&&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 VE;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=vn().writeBuiltinComponentData(h,this.context);d!==null&&c.push(d)}c.length>0&&(l[vr]=c,io&&console.log("DID WRITE",n,"nodeIndex",r,c))}}parser;nodeToObjectMap={};gltf=null;beforeRoot(){return io&&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];io&&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;io&&console.log("NODE",l);const p=this.nodeToObjectMap[c];if(!p){console.error("Could not find object for node index: "+c,l,t);continue}hu(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;iM(r,l)}}}async createComponents(e,t,i,n){if(!n)return;const s=n[vr];if(s){const r=new Array;io&&console.log(i.name,s);for(const a in s){const l=s[a];if(io&&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&&(io||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(Hg(this.parser,l).catch(c=>console.error(`Error while resolving references (see console for details)
|
|
993
|
+
`,c,i,l))),i.userData=i.userData||{},i.userData[vr]=i.userData[vr]||[],i.userData[vr].push(l)}await Promise.all(r).catch(a=>{console.error("Error while loading components",a)})}}}const bx="NEEDLE_gameobject_data";class $E{get name(){return bx}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[bx];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 _x="NEEDLE_lighting_settings",cl=v("debugenvlight");class HE{get name(){return _x}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[_x];if(i){cl&&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,qu,{},{callAwake:!1})}else{const s=new k;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=x.addComponent(s,qu,{},{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(qu,e);t?.sourceId&&(t.enabled=!0)});class qu extends R{ambientMode=Ja.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=_u.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===_u.Skybox?Xn.Skybox:Xn.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),cl&&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(cl&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Ja.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new fC(this.ambientLight,this.ambientIntensity*e),cl&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Ja.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new yC(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),cl&&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(){cl&&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 vx=(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))(vx||{});const no=v("debugcustomshader"),hl="NEEDLE_techniques_webgl";class GE{objectToWorldMatrix=new K;worldToObjectMatrix=new K;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),bu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),bu(this.worldToObjectMatrix,this.worldToObject)}}class Re extends ub{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return wx(e),e}constructor(e,...t){super(...t),this.identifier=e,no&&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 K;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new K;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new me;static _mainLightPosition=new b;static _lightData=new me;_rendererData=new GE;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&&(Re.viewProjection&&this.uniforms[this._viewProjectionName]&&(Re.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),bu(Re.viewProjection,Re._viewProjectionValues)),Re.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Re.viewMatrix.copy(e.matrixWorldInverse),bu(Re.viewMatrix,Re._viewMatrixValues)),this.uniforms[Re._worldSpaceCameraPosName]&&Re._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=J(n.gameObject,Re._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Re._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Re._mainLightColor};const l=n.intensity;Re._lightData.z=l,this.uniforms.unity_LightData={value:Re._lightData}}if(e&&(Re.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Re._viewProjectionValues),Re.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Re._viewMatrixValues),this.uniforms[Re._worldSpaceCameraPosName]&&(this.uniforms[Re._worldSpaceCameraPosName]={value:Re._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 qE{get name(){return hl}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return no&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[hl])return no&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;no&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[hl].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[hl];if(!n)return no?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;no&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await jM(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();no&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new me(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new me(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new me(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new me(0,0,0,0)});for(const g in p){const y=g;switch(y){case"_TimeParameters":const _=new me;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[hl]){const g=t.extensions[hl];if(g.technique===i){no&&console.log(t.name,"Material Properties",g);for(const y in g.values){const _=g.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const w=_.substring(10),P=Number.parseInt(w);if(P>=0){const M=await this.parser.getDependency("texture",P);M instanceof Le&&(M.colorSpace=So,M.needsUpdate=!0),d[y]={value:M};continue}}if(y==="alphaMode"){_==="BLEND"&&(m=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new me(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Re(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=bC,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=Oi;break;case 1:f.side=Md;break;case 2:f.side=gs;break;default:f.side=gs;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=PC;break;case 6:f.depthTest=!0,f.depthFunc=CC;break;case 2:f.depthTest=!0,f.depthFunc=SC;break;case 4:f.depthTest=!0,f.depthFunc=xC;break;case 5:f.depthTest=!0,f.depthFunc=wC;break;case 7:f.depthTest=!0,f.depthFunc=vC;break;case 8:f.depthTest=!1,f.depthFunc=_C;break}f.transparent=m,m&&(f.depthWrite=!1),LM(d),f.onUpdateUniforms();for(const g in p){const y=g,_=p[g].type;d[y]?.value===void 0&&(_===vx.SAMPLER_2D?(d[y]={value:AM},console.warn("Missing/unassigned texture, fallback to white: "+y)):y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[g]))}no&&console.log(f.uuid,d),wx(f),r(f)}):null}}function wx(o){if(o.uniforms){no&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)e(t,t),t==="_Color"&&e("color",t)}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 XE=v("debugextensions");let Xu;const QE=import("./vendor-sURMCFSI.min.js").then(o=>o.index$2).then(async o=>(Xu=o.GLTFAnimationPointerExtension,Xu)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),Gr=new Array;function YE(o){Gr.includes(o)||Gr.push(o)}function ZE(o){const e=Gr.indexOf(o);e>=0&&Gr.splice(e,1)}function Qf(o){if(o instanceof Po){const e=new yx;return o.register(t=>(e.parser=t,e)),e}return null}class KE{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 Qu(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 $E(s)),o.register(s=>new oM(s)),o.register(s=>new MM(s,e.lightmaps,i)),o.register(s=>new HE(s,i,e)),o.register(s=>new qE(s,i)),o.register(s=>new ar(s,i)),o.register(s=>new We(s)),o.register(s=>new zE(s)),lv()&&o.register(s=>new Ql(s)),await QE.catch(s=>{}),o.register(s=>{if(Xu){const r=new Xu(s);return r.setAnimationPointerResolver.bind(r)(new KE),r}else return(XE||A())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const s of Gr)s.onImport&&s.onImport(o,t,e)}function Yf(o,e){for(const t of Gr)t.onExport&&t.onExport(o,e)}function xx(o,e,t){for(const i of Gr)i.onLoaded&&i.onLoaded(o,e,t)}const Nt=v("debuginstancing");class wa{static instance=new wa;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=>We.assignTextureLOD(d,0)):We.assignTextureLOD(l,0);const c=a.object,h=c.geometry;We.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 Nt&&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=wa.getStartInstanceCount(e);(!a||a<0)&&(a=4);let l=e.name;l?.length||(l=Nb());const c=new JE(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[wc]||i.equals(a)===!1)&&(i.copy(a),e[wc]=!0),a};e.matrixWorld.multiplyMatrices=n}}class Pa{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[mv]=t,this.meshInformation=qr(e.geometry),Pa.all.push(this)}updateMeshInformation(){const e=qr(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()||Nt)&&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=Pa.all.indexOf(this);t>=0&&Pa.all.splice(t,1)}}}class JE{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(),Nt&&this._batchedMesh.boundingSphere){const i=this._batchedMesh.boundingSphere;F.DrawWireSphere(i.center,i.radius,65280)}}_context;_batchedMesh;_handles=[];_geometryIds=new WeakMap;_maxInstanceCount;_currentInstanceCount=0;_currentVertexCount=0;_currentIndexCount=0;_maxVertexCount;_maxIndexCount;static nullMatrix=new K;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),Nt&&(this._debugMaterial=Sx());const r=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],n);this._maxVertexCount=r.vertexCount,this._maxIndexCount=r.indexCount,this._batchedMesh=new pb(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh.name=this.getBatchedMeshName(),this._batchedMesh[xc]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),i instanceof ub&&(i.defines.USE_INSTANCING=!0,i.needsUpdate=!0),s.pre_render_callbacks.push(this.onBeforeRender),s.post_render_callbacks.push(this.onAfterRender),Nt&&console.log(`Instanced renderer (${this.name}) created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}dispose(){Nt&&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 Pa(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()})
|
|
994
|
+
`,i),A()){dc("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),Nt&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,qr(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[xc]===!0&&(Nt==="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(){Nt==="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=qr(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(Nt){const h=qr(e);console.warn(`[Instancing] Growing Buffer
|
|
995
|
+
Mesh: "${this.name}${e.name?.length?"/"+e.name:""}" (${h.vertexCount.toLocaleString()} vertices, ${h.indexCount.toLocaleString()} indices)
|
|
996
|
+
Max count ${this._maxInstanceCount.toLocaleString()} \u2192 ${i.toLocaleString()}
|
|
997
|
+
Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${r.toLocaleString()}
|
|
998
|
+
Max index count ${this._maxIndexCount.toLocaleString()} -> ${a.toLocaleString()}`),this._debugMaterial=Sx()}else A()&&console.debug(`[Instancing] Growing Buffer
|
|
999
|
+
Mesh: "${this.name}${e.name?.length?"/"+e.name:""}"
|
|
1000
|
+
Max count ${this._maxInstanceCount} \u2192 ${i}
|
|
1001
|
+
Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${r.toLocaleString()}
|
|
1002
|
+
Max index count ${this._maxIndexCount.toLocaleString()} -> ${a.toLocaleString()}`);this._maxVertexCount=r,this._maxIndexCount=a;const l=new pb(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[xc]=this._batchedMesh[xc],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){Nt&&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,...qr(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=qr(h);d!=null&&(l+=d.vertexCount*i,c+=d.indexCount*i)}return Nt&&console.log(`[Instancing] Estimated size for new buffer ${this.name}
|
|
1003
|
+
Geometries: ${a} (New: ${t?.length||0})
|
|
1004
|
+
Instances: ${e}
|
|
1005
|
+
Estimated Vertices: ${l.toLocaleString()}
|
|
1006
|
+
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?(Nt&&console.warn(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
|
|
1007
|
+
Current Instances: ${this._currentInstanceCount}
|
|
1008
|
+
Max Vertices: ${e.maxVertexCount.toLocaleString()}
|
|
1009
|
+
Max Indices: ${e.maxIndexCount.toLocaleString()}
|
|
1010
|
+
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):Nt==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
|
|
1011
|
+
GEOMETRY_ID=${i}
|
|
1012
|
+
${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),Nt&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
|
|
1013
|
+
GEOMETRY_ID=${i}
|
|
1014
|
+
${this._currentInstanceCount} instances
|
|
1015
|
+
Index: ${e.__instanceIndex}
|
|
1016
|
+
Vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()},
|
|
1017
|
+
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}Nt&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
|
|
1018
|
+
GEOMETRY_ID=${e.__geometryIndex}
|
|
1019
|
+
${this._currentInstanceCount} instances
|
|
1020
|
+
Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}function qr(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=We.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 Sx(){const o=new mt({color:new oe(Math.random(),Math.random(),Math.random())});return o.emissive=o.color,o.emissiveIntensity=.3,v("wireframe")&&(o.wireframe=!0),o}const dl=v("debuglightmaps");let Zf=0;const Kf=Symbol("lightmap-material-version");class Jf{get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.lightmapTexture&&We.assignTextureLOD(this.lightmapTexture,0).then(t=>{t?.isTexture&&(this.lightmapTexture=t)}))}lightmapIndex=-1;lightmapScaleOffset=new me(1,1,0,0);renderer;clonedMaterials=new Array;get context(){return this.renderer.context}get gameObject(){return this.renderer.gameObject}lightmapTexture=null;lightmapScaleOffsetUniform={value:new me(1,1,0,0)};lightmapUniform={value: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,We.assignTextureLOD(i,0).then(n=>{n?.isTexture&&(this.lightmapTexture=n)}),dl=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
|
|
1021
|
+
ScaleOffset:`,t,`
|
|
1022
|
+
Texture:`,i),this.setLightmapDebugMaterial()):dl&&console.log("Use debuglightmaps=show to render lightmaps only in the scene."),this.applyLightmap())}updateLightmapUniforms(e){const t=e.uniforms;t&&t.lightmap&&(this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,t.lightmapScaleOffset=this.lightmapScaleOffsetUniform)}applyLightmap(){if(this.gameObject.type==="Object3D"){dl&&console.warn("Can not add lightmap. Is this object missing a renderer?",this.gameObject.name);return}const e=this.gameObject;this.ensureLightmapUvs(e);for(let t=0;t<this.renderer.sharedMaterials.length;t++){const i=this.renderer.sharedMaterials[t];if(!i)continue;const n=this.ensureLightmapMaterial(i,t);i!==n&&(this.renderer.sharedMaterials[t]=n)}if(this.lightmapIndex>=0&&this.lightmapTexture){this.lightmapTexture.channel=1;for(const t of this.renderer.sharedMaterials)t&&this.assignLightmapTexture(t)}}ensureLightmapUvs(e){if(e instanceof H)e.geometry.getAttribute("uv1")||e.geometry.setAttribute("uv1",e.geometry.getAttribute("uv"));else if(e instanceof xo)for(const t of e.children)this.ensureLightmapUvs(t)}ensureLightmapMaterial(e,t){if(e.userData||(e.userData={}),this.clonedMaterials[t]!==e){dl&&(++Zf,Zf++<1e3?console.warn(`Cloning material for lightmap ${this.renderer.name}: '${e.name}'`):Zf===1e3&&console.warn("Further material cloning for lightmaps suppressed to avoid flooding the console."));const i=e.clone();i.name?.includes("(lightmap)")||(i.name=e.name+" (lightmap)"),e=i,e.onBeforeCompile=this.onBeforeCompile,this.clonedMaterials[t]=e}return e}assignLightmapTexture(e){!e||e instanceof Pm&&e.transmission>0||!(e.lightMap!==this.lightmapTexture||e[Kf]!==e.version)||(dl&&console.log(`Assigning lightmap texture ${this.renderer.name}: '${e.name}' (${e.version} ${e[Kf]})`),e.lightMap=this.lightmapTexture,e.needsUpdate=!0,e[Kf]=e.version)}onBeforeCompile=(e,t)=>{dl==="verbose"&&console.log(`Lightmaps, before compile
|
|
1023
|
+
`,e),this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,this.lightmapUniform.value=this.lightmapTexture,e.uniforms.lightmapScaleOffset=this.lightmapScaleOffsetUniform};setLightmapDebugMaterial(){this.gameObject.material=new Nn({vertexShader:`
|
|
1024
|
+
varying vec2 vUv1;
|
|
1025
|
+
void main()
|
|
1026
|
+
{
|
|
1027
|
+
vUv1 = uv1;
|
|
1028
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
1029
|
+
}
|
|
1030
|
+
`,fragmentShader:`
|
|
1031
|
+
uniform sampler2D lightMap;
|
|
1032
|
+
uniform float lightMapIntensity;
|
|
1033
|
+
uniform vec4 lightmapScaleOffset;
|
|
1034
|
+
varying vec2 vUv1;
|
|
1035
|
+
|
|
1036
|
+
// took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
|
|
1037
|
+
vec4 conv_sRGBToLinear( in vec4 value ) {
|
|
1038
|
+
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 );
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
void main() {
|
|
1042
|
+
vec2 lUv = vUv1.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
|
|
1043
|
+
|
|
1044
|
+
vec4 lightMapTexel = texture2D( lightMap, lUv);
|
|
1045
|
+
gl_FragColor = lightMapTexel;
|
|
1046
|
+
gl_FragColor.a = 1.;
|
|
1047
|
+
}
|
|
1048
|
+
`,defines:{USE_LIGHTMAP:""}})}}var eT=Object.defineProperty,Vo=(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 ul=v("debugrenderer"),Cx=v("debugskinnedmesh"),Px=v("noinstancing"),tT=v("wireframe");class Ox{path=null;asset=null;default}class iT{_renderer;_targets=[];_indexMapMaxIndex;_indexMap;_changed=!1;get changed(){return this._changed}set changed(e){e===!0&&ul&&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),$i()&&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 oo=class lm extends R{static setInstanced(e,t){const i=kc(e,lm);return i.setInstancingEnabled(t),i}static isInstanced(e){const t=Rr(e,lm);return t?t.isInstancingActive:dn.isUsingInstancing(e)}static setVisible(e,t){Io(e,t)}receiveShadows=!1;shadowCastingMode=0;lightmapIndex=-1;lightmapScaleOffset=new me(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 iT(this,this._originalMaterials)),this._sharedMaterials}static get shouldSuppressInstancing(){return Px}_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,ul&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&ul&&this.probeAnchor.add(new Pi(.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,lm))){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(),tT)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 Jf(this);t.init(this.lightmapIndex,this.lightmapScaleOffset,e),this._lightmaps.push(t)}else ul&&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=wa.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&&!Px&&(this.setInstancingEnabled(!0),dn.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()}onDisable(){this.setVisibility(!1),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)}onBeforeRender(){if(this.gameObject){if(this._probeAnchorLastFrame!==this.probeAnchor&&(this._reflectionProbe?.onUnset(this),this.updateReflectionProbe()),ul==this.name&&this.gameObject instanceof H){this.gameObject.geometry.computeBoundingSphere();const e=B(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);F.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[wc]===!0){this.gameObject[wc]=!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];Io(t.object,!1)}if(this.reflectionProbeUsage!==0&&this._reflectionProbe&&(this._lightmaps?.length||this._reflectionProbe.onSet(this)),this._sharedMaterials)for(const e of this._sharedMaterials)e&&"envMap"in e&&"envMapIntensity"in e&&!Zc.isUsingReflectionProbe(e)&&(e.envMap=this.context.scene.environment,e.envMapRotation=this.context.scene.environmentRotation);else ul&&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];Io(t.object,!0)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onUnset(this),this.static&&this.gameObject.matrixAutoUpdate&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){ar.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=Zc.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Io(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Io(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};Vo([u()],oo.prototype,"receiveShadows"),Vo([u()],oo.prototype,"shadowCastingMode"),Vo([u()],oo.prototype,"lightmapIndex"),Vo([u(me)],oo.prototype,"lightmapScaleOffset"),Vo([u()],oo.prototype,"enableInstancing"),Vo([u()],oo.prototype,"renderOrder"),Vo([u()],oo.prototype,"allowOcclusionWhenDynamic"),Vo([u(k)],oo.prototype,"probeAnchor"),Vo([u()],oo.prototype,"reflectionProbeUsage");let Jt=oo;class Kc extends Jt{}class ey extends Kc{_needUpdateBoundingSphere=!1;awake(){super.awake(),Cx&&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 ms){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,i=bb(e);i&&(e.geometry=i),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(Cx){for(const e of this.sharedMeshes)if(e instanceof ms&&e.boundingSphere){const t=B(e.boundingSphere.center).applyMatrix4(e.matrixWorld);F.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var nT=Object.defineProperty,pl=(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&&nT(e,t,n),n};const gi=v("debugdroplistener");class oT extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const sT="blob";class Wo extends R{dropArea;fitIntoVolume=!1;fitVolumeSize=new b(1,1,1);placeAtHitPosition=!0;useNetworking=!1;onDropped=new de;loadFromURL(e,t){return this.addFromUrl(e,{screenposition:new ee,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(Jt)||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){gi&&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 ee,point:e.point,size:e.size},!0);else this.addFromUrl(t,{screenposition:new ee,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 ee(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(i)&&this.addFromUrl(t,i,!1)}}).catch(console.warn)};onDrag=e=>{gi&&console.debug("DropListener Drag",e,this.context.connection.allowEditing),this.context.connection.allowEditing!==!1&&e.preventDefault()};onDrop=async e=>{if(gi&&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 ee(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){gi&&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=rT(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 Yu.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(gi&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),nc(sT,null),this._abort?.abort("New files dropped"),this._abort=new AbortController;for(const i of e){if(!i)continue;if(i.type.startsWith("image/")){gi&&console.warn("Ignoring dropped image file",i.name,i.type);continue}else if(i.name.endsWith(".bin")){gi&&console.warn("Ignoring dropped binary file",i.name,i.type);continue}console.debug("Load file "+i.name+" + "+i.type);const n=await Yu.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"),Ir.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(gi&&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;this.gameObject.attach(r),r.position.set(0,0,0),r.quaternion.identity(),this._addedObjects.push(r),this._addedModels.push(n);const a=new Ci().setFromCenterAndSize(new b(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(gi&&F.DrawWireBox3(a,255,5),this.fitIntoVolume&&u_(r,a,{position:!this.placeAtHitPosition}),this.placeAtHitPosition&&t&&t.screenposition){r.visible=!1;const c=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(r.visible=!0,c&&c.length>0)for(const h of c){const d=h.point.clone();gi&&console.log("Place object at hit",h),p_(r,d);break}}xs.autoplayAnimations(n);const l=new oT({sender:this,gltf:n,model:n,object:r,contentMD5:s,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(l),this.onDropped?.invoke(l.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){gi&&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=Qt([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))}}pl([u(k)],Wo.prototype,"dropArea"),pl([u()],Wo.prototype,"fitIntoVolume"),pl([u(b)],Wo.prototype,"fitVolumeSize"),pl([u()],Wo.prototype,"placeAtHitPosition"),pl([u()],Wo.prototype,"useNetworking"),pl([u(de)],Wo.prototype,"onDropped");function rT(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 Yu;(o=>{async function e(i,n,s){const r=s.guid,a=new Dt(r),l=new Blob([i],{type:i.type||dx(i.name)||void 0}),c=URL.createObjectURL(l),h=await vn().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=Ir.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 Dt(n.guid),l=i.toString();gi&&F.DrawWireSphere(n.point,.1,16711680,3);const c=As.addPreview({guid:n.guid,parent:n.parent,position:n?.point,size:n?.size}),h=await vn().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=Ir.hashMD5(d);gi?setTimeout(()=>As.removePreview(n.guid),3e3):As.removePreview(n.guid),s({model:h,contentMD5:p})}else gi?setTimeout(()=>As.removePreview(n.guid),3e3):As.removePreview(n.guid),console.warn("Unsupported file type: "+i.toString())})}o.loadFileFromURL=t})(Yu||(Yu={}));var aT=Object.defineProperty,ty=(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 Zu=class SS extends R{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 Dt(this.guid);this.object=x.instantiate(this.object,{idProvider:t,keepWorldPosition:!1}),x.getComponent(this.object,SS)?.destroy();let i=this.object.getComponentInChildren(Hr);i||(i=this.object.addComponent(Hr,{dragMode:Nf.SnapToSurfaces}),i.guid=t.generateUUID());let n=x.getComponent(i.gameObject,kn);n||(n=i.gameObject.addComponent(kn),n.guid=t.generateUUID())}this.object.visible=!1;const e=this.gameObject.getComponent(Hr);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(Ai)||this.gameObject.addComponent(Ai)}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,Hr);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 nf(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.visible=!0,this._startPosition&&this.object.position.copy(this._startPosition),this._startQuaternion&&this.object.quaternion.copy(this._startQuaternion);const e=new Fn;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}};ty([u(k)],Zu.prototype,"parent"),ty([u(k)],Zu.prototype,"object"),ty([u()],Zu.prototype,"limitCount");let iy=Zu;var $o=(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[o.Drag=5]="Drag",o[o.Drop=6]="Drop",o[o.Scroll=7]="Scroll",o[o.UpdateSelected=8]="UpdateSelected",o[o.Select=9]="Select",o[o.Deselect=10]="Deselect",o[o.Move=11]="Move",o[o.InitializePotentialDrag=12]="InitializePotentialDrag",o[o.BeginDrag=13]="BeginDrag",o[o.EndDrag=14]="EndDrag",o[o.Submit=15]="Submit",o[o.Cancel=16]="Cancel",o))($o||{}),lT=Object.defineProperty,ny=(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&&lT(e,t,n),n};class oy{eventID;callback=new de}ny([u()],oy.prototype,"eventID"),ny([u(de)],oy.prototype,"callback");class Ku extends R{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($o.PointerClick)||this.hasTrigger($o.PointerDown)||this.hasTrigger($o.PointerUp)}onPointerClick(e){this.invoke($o.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke($o.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke($o.PointerExit)}onPointerDown(e){this.invoke($o.PointerDown)}onPointerUp(e){this.invoke($o.PointerUp)}}ny([u(oy)],Ku.prototype,"triggers");class kx{writer;constructor(e){this.writer=e}writeNode(e){}}class cT extends kx{beforeWriteNode(e,t){F.isGizmo(e)&&(t.keep=!1)}}class Mx extends kx{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=sf(new se(1,1,1,0)))}}function sy(o){const e=zu.DontExport;return!(o.hideFlags&e)}class Rx{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 K;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 gt(h,3)),ROTATION:i.processAccessor(new gt(d,4)),SCALE:i.processAccessor(new gt(p,3))},n[this.name]=!0}}var hT=Object.defineProperty,Ex=(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};const Ju=v("debuggltfexport");class ry extends Pt{sceneRoot}const ay=class Hl extends R{binary=!0;objects=[];ext;async exportNow(e,t){Ju&&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:Hl.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?Hl.saveArrayBuffer(n,e):Hl.saveJson(n,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const i=new Sb;i.register(c=>new Rx(c)),i.register(c=>new Mx(c)),Yf(i,this.context),Hl.filterTopmostParent(e);const n={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||Hl.collectAnimations(e),...t},s=new Array,r=new k;t?.pivot&&r.position.sub(t.pivot),Ju&&console.log("EXPORT",e),e.forEach(c=>{c&&sy(c)&&(r.children.push(c),c.matrixAutoUpdate=!1,c.matrix.copy(c.matrixWorld),x.getComponentsInChildren(c,Jt).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}),c.traverse(h=>{if(!sy(h)){const d=h.parent;h.removeFromParent(),s.push(()=>{d&&d.add(h)})}}))});const a=new Xg(r);return t?.needleComponents&&(this.ext=new yx),this.ext&&(this.ext.registerExport(i),this.ext.context=a),new Promise((c,h)=>{Ju&&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()),Ju&&console.log("Finished glTF export.")}});function l(){e.forEach(c=>{c&&(c.matrixAutoUpdate=!0,x.getComponentsInChildren(c,Jt).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(J(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}}}};Ex([u()],ay.prototype,"binary"),Ex([u(k)],ay.prototype,"objects");let ly=ay;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 dT=v("debugprogress");function Tx(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 uT(e,t);Jc.set(e,i)}static report(e,t){const i=Jc.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=Jc.get(e);t&&(t.end(),Jc.delete(e))}}const Jc=new Map;class uT{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?Jc.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??!!dT,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 je="</StageRoot/Materials";function pT(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 w=`${y}${_.size?`_${_.size}`:""}`;_.set(g,w)}return _.get(g)},s=o.colorNode?ep(o.colorNode):[],r=o.colorNode?`color3f inputs:diffuseColor.connect = ${je}/${e}/${n(s.values().next().value)}.outputs:out>`:"",a=o.roughnessNode?ep(o.roughnessNode):[],l=o.roughnessNode?`float inputs:roughness.connect = ${je}/${e}/${n(a.values().next().value)}.outputs:out>`:"",c=o.normalNode?ep(o.normalNode):[],h=o.normalNode?`float3 inputs:normal.connect = ${je}/${e}/${n(c.values().next().value)}.outputs:out>`:"",d=o.metalnessNode?ep(o.metalnessNode):[],p=o.metalnessNode?`float inputs:metallic.connect = ${je}/${e}/${n(d.values().next().value)}.outputs:out>`:"",m=new Set([...s,...a,...c,...d]),f=fT(m,e,t,n);return console.debug(f),`
|
|
1049
|
+
|
|
1050
|
+
def Material "${e}" ${o.name?`(
|
|
1051
|
+
displayName = "${o.name}"
|
|
1052
|
+
)`:""}
|
|
1053
|
+
{
|
|
1054
|
+
token outputs:mtlx:surface.connect = ${je}/${e}/N_mtlxsurface.outputs:surface>
|
|
1055
|
+
|
|
1056
|
+
def Shader "N_mtlxsurface"
|
|
1057
|
+
{
|
|
1058
|
+
uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
|
|
1059
|
+
${r}
|
|
1060
|
+
${l}
|
|
1061
|
+
${h}
|
|
1062
|
+
${p}
|
|
1063
|
+
token outputs:surface
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
${f}
|
|
1067
|
+
|
|
1068
|
+
}`}function ep(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,_=w=>{if(!(!w.isNode||y.has(w))){w.nodeType___needle||(w.nodeType___needle=e(w)),w.shaderNode?(w.type___needle="ShaderCallNodeInternal",w.shaderNodeLayoutName___needle=w.shaderNode.layout.name.slice(3)):w.type___needle=w.type,y.add(w);for(const P in w)w[P]?.isNode&&(_(w[P]),w.nodeType___needle||=w[P].nodeType___needle),Array.isArray(w[P])&&w[P].forEach(M=>{M.isNode&&(_(M),w.nodeType___needle||=M.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 w in _){if(_[w]?.isNode&&_[w]===g)return{parent:_,label:w};if(Array.isArray(_[w])&&_[w].find(P=>P.isNode&&P===g))return{parent:_,label:w}}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"},w=r(g,y);return w?.parent&&(w.parent[w.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 w=r(_,g);if(_.components.length===1)_.nodeType___needle="float";else if(w)_.nodeType___needle=w.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 w=r(_,g);w?.parent&&(w.parent[w.label]=_.node),_=_.node}y.add(_)}return y},f=t(o);return m(f)}function mT(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 gT(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 = ${mT(o.value,h)}`);break;case"JoinNode":d="combine"+o.nodes.length+"_"+c;let m=1;for(const w of o.nodes)p.push(`float inputs:in${m++}.connect = ${je}/${e}/${t(w)}.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 = ${je}/${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 = ${je}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode&&!o.cNode&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in1.connect = ${je}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:in2.connect = ${je}/${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 = ${je}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:low.connect = ${je}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.cNode.nodeType___needle)} inputs:high.connect = ${je}/${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 = ${je}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:bg.connect = ${je}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`float inputs:mix.connect = ${je}/${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 = ${je}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode){const w=r(o.aNode.nodeType___needle),P=r(o.bNode.nodeType___needle);(w==="color3f"&&P==="float"||P==="float"&&P==="color3f")&&(d=f+"_color3FA"),p.push(`${w} inputs:in1.connect = ${je}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${P} inputs:in2.connect = ${je}/${e}/${t(o.bNode)}.outputs:out>`)}break;case"TextureNode":o.uvNode?(d="tiledimage_"+c,p.push(`float2 inputs:texcoord.connect = ${je}/${e}/${t(o.uvNode)}.outputs:out>`)):d="image_"+c;const g=o._value,y=gy.includes(g.format),_=yT(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 = ${je}/${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 = ${je}/${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 = ${je}/${e}/${t(o.node)}.outputs:out>`),p.push(`string inputs:channels = "${o.components}"`);break}return`
|
|
1069
|
+
${n}def Shader "${t(o)}"
|
|
1070
|
+
${n}{
|
|
1071
|
+
${n}uniform token info:id = "ND_${d}"
|
|
1072
|
+
${n}${h} outputs:out
|
|
1073
|
+
${n}${p.length>0?p.join(`
|
|
1074
|
+
`):""}
|
|
1075
|
+
${n}}
|
|
1076
|
+
`}function fT(o,e,t,i){let n="";for(const s of o)n+=gT(s,e,i,t);return n}function yT(o){return Li(o.name)+"_"+(o.source?.id??o.id)}function Li(o){return o=o.replace(/[^a-zA-Z0-9_]/g,""),o.match(/^[a-zA-Z_]/)||(o="_"+o),o}function Ax(o){return o=o.replace('"','\\"'),o}function Ix(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 Lx(o){const e=Ix(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 bT=new b,_T=new N,vT=new b(1,1,1);class ot{static USDObject_export_id=0;uuid;name;type;extraSchemas=[];displayName;visibility;getMatrix(){if(!this.transform)return new K;const{position:e,quaternion:t,scale:i}=this.transform,n=new K;return n.compose(e||bT,t||_T,i||vT),n}setMatrix(e){if(!e||!(e instanceof K)){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 ot(wo.generateUUID(),e.name+"_empty_"+ot.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 ot(wo.generateUUID(),"Empty_"+ot.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=Li(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 ot(wo.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 cy extends ot{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}
|
|
1077
|
+
`;const c=a;return`#usda 1.0
|
|
1078
|
+
(
|
|
1079
|
+
customLayerData = {
|
|
1080
|
+
string creator = "Needle Engine ${_n}"
|
|
1081
|
+
dictionary Needle = {
|
|
1082
|
+
bool animations = ${t?1:0}
|
|
1083
|
+
bool interactive = ${i?1:0}
|
|
1084
|
+
bool physics = ${n?1:0}
|
|
1085
|
+
bool quickLookCompatible = ${e.quickLookCompatible?1:0}
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
defaultPrim = "${Li(this.name)}"
|
|
1089
|
+
metersPerUnit = 1
|
|
1090
|
+
upAxis = "Y"
|
|
1091
|
+
startTimeCode = ${s}
|
|
1092
|
+
endTimeCode = ${r}
|
|
1093
|
+
timeCodesPerSecond = 60
|
|
1094
|
+
framesPerSecond = 60
|
|
1095
|
+
doc = """Generated by Needle Engine USDZ Exporter ${_n}"""
|
|
1096
|
+
${c}
|
|
1097
|
+
)
|
|
1098
|
+
`}}const ml=`
|
|
1099
|
+
`,ei="</StageRoot/Materials";class Dx{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+=ml,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=ml,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+ml}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=ml,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+ml}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=ml}toString(){return this.str}applyIndent(e){let t="";for(let i=0;i<this.indent;i++)t+=" ";return t+e}}class wT{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 cy,this.output="",this.animations=[]}makeNameSafe(e){return Li(e)}}const jx=()=>({ar:{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}},quickLookCompatible:!1,extensions:[],maxTextureSize:4096,exportInvisible:!1});let Bx=class{debug;pruneUnusedNodes;sceneAnchoringOptions=jx();extensions=[];keepObject;beforeWritingDocument;constructor(){this.debug=!1,this.pruneUnusedNodes=!0}async parse(o,e=jx()){e=Object.assign({},e),this.sceneAnchoringOptions=e;const t=new wT(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 tp(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 ms){const g=f.skeleton.bones,y=Ix(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&&Fx(o,t.document,t,this.keepObject),le.report("export-usdz","Invoking onAfterBuildDocument"),await tp(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&&Ux(t.document,"Hierarchy BEFORE pruning",f),zx(t.document,f),this.debug&&Ux(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 xT(t,e),le.report("export-usdz","Invoking onAfterSerialize"),await tp(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)+`
|
|
1100
|
+
`+t.output;this.debug&&console.debug(c),i[n]=Cb(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 hr({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 w={imageData:y.image};le.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const P=g.scale!==void 0&&g.scale.x!==1&&g.scale.y!==1&&g.scale.z!==1&&g.scale.w!==1;(y.isCompressedTexture||y.isRenderTargetTexture||P)&&(w=await Vx(y,e.maxTextureSize,h,g.scale)),le.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const M=await CT(w.imageBitmap||w.imageData,e.maxTextureSize).catch(O=>{console.error("Error converting texture to canvas",y,O)});if(M){le.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const O=await M.convertToBlob({type:_?"image/png":"image/jpeg",quality:.95});i[`textures/${f}.${_?"png":"jpg"}`]=new Uint8Array(await O.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 w=64-_,P=new Uint8Array(w);i[f]=[g,{extra:{12345:P}}]}m=g.length}return le.report("export-usdz","zip archive"),nP(i,{level:0})}};function Fx(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 ms)&&(s=o.geometry,r=o.material),i&&!i(o)&&(s=void 0,r=void 0),(o instanceof H||o instanceof ms)&&r&&typeof r=="object"&&(r instanceof mt||r instanceof Se||r.isMeshPhysicalNodeMaterial||r instanceof we&&r.type==="MeshLineMaterial")){const l=op(o),c=o instanceof ms?o:null;n=new ot(o.uuid,l,a,s,r,void 0,c,o.animations)}else if(o instanceof ae||o instanceof _d){const l=op(o);n=new ot(o.uuid,l,a,void 0,void 0,o)}else{const l=op(o);n=new ot(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=op(o),c=new ot(o.uuid,l,{position:o.position,quaternion:o.quaternion,scale:o.scale});e&&e.add(c),e=c}for(const l of o.children)Fx(l,e,t,i)}function Ux(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 zx(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=zx(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 xT(o,e){le.start("export-usdz-resources","export-usdz");const t=[];for(const c of o.document.children)Nx(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 Dx,s=o.exporter.sceneAnchoringOptions.ar;n.beginBlock(`def Xform "${o.document.name}"`),n.beginBlock(`def Scope "Scenes" (
|
|
1101
|
+
kind = "sceneLibrary"
|
|
1102
|
+
)`),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)Hx(c,n,o);le.end("export-usdz-xforms"),le.report("export-usdz","invoke onAfterHierarchy"),await tp(o,"onAfterHierarchy",n),n.closeBlock(),n.closeBlock(),le.report("export-usdz","Building materials");const l=ET(o.materials,o.textures,e.quickLookCompatible);n.appendLine(l),n.closeBlock(),le.report("export-usdz","write to string"),o.output+=n.toString()}function Nx(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/"+dy(i,o.name)+".usda";if(!(s in e.files)){const r=()=>{const a=kT(i,o.skinnedMesh?.skeleton?.bones,e.quickLookCompatible);e.files[s]=OT(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)Nx(s,e,t)}async function tp(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 ip=null,ti=null,hy,gl,np;async function Vx(o,e=1/0,t=null,i=void 0){hy||(hy=new zn(2,2,1,1)),gl||(gl=new Nn({uniforms:{blitTexture:new Wi(o),flipY:new Wi(!1),scale:new Wi(new me(1,1,1,1))},vertexShader:`
|
|
1103
|
+
varying vec2 vUv;
|
|
1104
|
+
uniform bool flipY;
|
|
1105
|
+
void main(){
|
|
1106
|
+
vUv = uv;
|
|
1107
|
+
if (flipY)
|
|
1108
|
+
vUv.y = 1. - vUv.y;
|
|
1109
|
+
gl_Position = vec4(position.xy * 1.0,0.,.999999);
|
|
1110
|
+
}`,fragmentShader:`
|
|
1111
|
+
uniform sampler2D blitTexture;
|
|
1112
|
+
uniform vec4 scale;
|
|
1113
|
+
varying vec2 vUv;
|
|
1114
|
+
|
|
1115
|
+
void main(){
|
|
1116
|
+
gl_FragColor = vec4(vUv.xy, 0, 1);
|
|
1117
|
+
|
|
1118
|
+
#ifdef IS_SRGB
|
|
1119
|
+
gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
|
|
1120
|
+
#else
|
|
1121
|
+
gl_FragColor = texture2D( blitTexture, vUv);
|
|
1122
|
+
#endif
|
|
1123
|
+
|
|
1124
|
+
gl_FragColor.rgba *= scale.rgba;
|
|
1125
|
+
}`}));const n=gl.uniforms;n.blitTexture.value=o,n.flipY.value=!1,n.scale.value=new me(1,1,1,1),i!==void 0&&n.scale.value.copy(i),gl.defines.IS_SRGB=o.colorSpace==Co,gl.needsUpdate=!0,np||(np=new H(hy,gl),np.frustumCulled=!1);const s=new ae,r=new Si;r.add(np),t||(t=ip=new hr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const a=Math.min(o.image.width,e),l=Math.min(o.image.height,e);ti&&(ti.width!==a||ti.height!==l)&&(ti.dispose(),ti=null),ti||(ti=new Wn(a,l,{format:Sd,type:OC,minFilter:Rd,magFilter:Rd})),t.setRenderTarget(ti),t.setSize(a,l),t.clear(),t.render(r,s),ip&&(ip.dispose(),ip=null);const c=new Uint8ClampedArray(ti.width*ti.height*4);t.readRenderTargetPixels(ti,0,0,ti.width,ti.height,c);const h=new ImageData(c,ti.width,ti.height,void 0),d=await createImageBitmap(h,{premultiplyAlpha:"none"});return{imageData:h,imageBitmap:d}}function ST(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 CT(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 Wx(o,e=void 0,t=!1,i=4096){if(ST(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 ke=7;function PT(){return`#usda 1.0
|
|
1126
|
+
(
|
|
1127
|
+
customLayerData = {
|
|
1128
|
+
string creator = "Needle Engine USDZExporter"
|
|
1129
|
+
}
|
|
1130
|
+
metersPerUnit = 1
|
|
1131
|
+
upAxis = "Y"
|
|
1132
|
+
)
|
|
1133
|
+
`}function OT(o,e){let t=PT();return t+=o,Cb(t)}function op(o){return o.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+o.id}function $x(o){return Li(o.name||"bone_"+o.uuid)}function dy(o,e){return Li(o.name||"Geometry")+"_"+o.id}function sp(o){return Li(o.name||"Material")+"_"+o.id}function fl(o,e){let t=$x(o),i=o.parent;for(;i&&i!==e;)t=$x(i)+"/"+t,i=i.parent;return t}function Hx(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 Se&&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===Oi&&!l?e.appendLine(`prepend references = @./geometries/${dy(n)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${dy(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 = "${Ax(o.displayName)}"`),(r||o.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),n&&s){if(!d){const m=sp(s);e.appendLine(`rel material:binding = </StageRoot/Materials/${m}>`)}!t.quickLookCompatible&&s.side===Oi&&(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(ke)}`),e.appendLine(`float verticalAperture = ${((Math.abs(r.top)+Math.abs(r.bottom))*10).toPrecision(ke)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in r&&r.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${r.near.toPrecision(ke)}, ${r.far.toPrecision(ke)})`),e.appendLine(`float focalLength = ${r.getFocalLength().toPrecision(ke)}`),e.appendLine(`float focusDistance = ${r.focus.toPrecision(ke)}`),e.appendLine(`float horizontalAperture = ${r.getFilmWidth().toPrecision(ke)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${r.getFilmHeight().toPrecision(ke)}`))),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)Hx(m,e,t)}e.closeBlock()}function ce(o){return Number.isInteger(o)?o.toString():o.toFixed(10)}function Gx(o){const e=o.elements;return`( ${rp(e,0)}, ${rp(e,4)}, ${rp(e,8)}, ${rp(e,12)} )`}function rp(o,e){return`(${ce(o[e+0])}, ${ce(o[e+1])}, ${ce(o[e+2])}, ${ce(o[e+3])})`}function kT(o,e=[],t=!0){return`
|
|
1134
|
+
def "Geometry"
|
|
1135
|
+
${MT(o,e,t)}
|
|
1136
|
+
`}function MT(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 w of _)p.indexOf(w.uuid)===-1&&e.indexOf(w)!==-1&&(a.push({bone:w,index:e.indexOf(w)}),p.push(w.uuid))}m<=0&&console.error("Failed to sort bones in skinned mesh",a,e,p);for(const y of Lx(e))a.push({bone:y,index:a.length});const f=a[0].bone.parent;a.sort((y,_)=>fl(y.bone,f)>fl(_.bone,f)?1:-1),a.map(y=>'"'+fl(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),w=g.getY(y),P=g.getZ(y),M=g.getW(y);c.push(l[_],l[w],l[P],l[M])}h=new gt(new Uint16Array(c),4)}const d=n.skinWeight&&n.skinIndex;return`
|
|
1137
|
+
{
|
|
1138
|
+
def Mesh "${i}" ${d?`(
|
|
1139
|
+
prepend apiSchemas = ["SkelBindingAPI"]
|
|
1140
|
+
)`:""}
|
|
1141
|
+
{
|
|
1142
|
+
int[] faceVertexCounts = [${uy(o)}]
|
|
1143
|
+
int[] faceVertexIndices = [${py(o)}]
|
|
1144
|
+
${n.normal||t?`normal3f[] normals = [${ap(n.normal,s)}] (
|
|
1145
|
+
interpolation = "vertex"
|
|
1146
|
+
)`:""}
|
|
1147
|
+
point3f[] points = [${ap(n.position,s)}]
|
|
1148
|
+
${n.uv?`texCoord2f[] primvars:st = [${Xx(n.uv,s,!0)}] (
|
|
1149
|
+
interpolation = "vertex"
|
|
1150
|
+
)`:""}
|
|
1151
|
+
${n.uv1?my("st1",n.uv1):""}
|
|
1152
|
+
${n.uv2?my("st2",n.uv2):""}
|
|
1153
|
+
${n.uv3?my("st3",n.uv3):""}
|
|
1154
|
+
${d?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
|
|
1155
|
+
elementSize = 1
|
|
1156
|
+
interpolation = "constant"
|
|
1157
|
+
)`:""}
|
|
1158
|
+
${n.skinIndex?`int[] primvars:skel:jointIndices = [${qx(h,!0)}] (
|
|
1159
|
+
elementSize = 4
|
|
1160
|
+
interpolation = "vertex"
|
|
1161
|
+
)`:""}
|
|
1162
|
+
${n.skinWeight?`float[] primvars:skel:jointWeights = [${qx(n.skinWeight)}] (
|
|
1163
|
+
elementSize = 4
|
|
1164
|
+
interpolation = "vertex"
|
|
1165
|
+
)`:""}
|
|
1166
|
+
${n.color?`color3f[] primvars:displayColor = [${ap(n.color,s)}] (
|
|
1167
|
+
interpolation = "vertex"
|
|
1168
|
+
)`:""}
|
|
1169
|
+
uniform token subdivisionScheme = "none"
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
${t?`
|
|
1173
|
+
# This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
|
|
1174
|
+
# geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
|
|
1175
|
+
def "${i}_doubleSided" (
|
|
1176
|
+
prepend references = </Geometry>
|
|
1177
|
+
)
|
|
1178
|
+
{
|
|
1179
|
+
over "Geometry"
|
|
1180
|
+
{
|
|
1181
|
+
int[] faceVertexCounts = [${uy(o)+", "+uy(o)}]
|
|
1182
|
+
int[] faceVertexIndices = [${py(o)+", "+py(o,!0)}]
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
`:""}
|
|
1186
|
+
`}function uy(o){const e=o.index!==null?o.index.count:o.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function py(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 my(o,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${o} = [${Xx(e,t,!0)}] (
|
|
1187
|
+
interpolation = "vertex"
|
|
1188
|
+
)`;case 3:return`texCoord3f[] primvars:${o} = [${ap(e,t)}] (
|
|
1189
|
+
interpolation = "vertex"
|
|
1190
|
+
)`;case 4:return`double4[] primvars:${o} = [${RT(e,t)}] (
|
|
1191
|
+
interpolation = "vertex"
|
|
1192
|
+
)`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+o+"."),""}}function ap(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(ke)}, ${s.toPrecision(ke)}, ${r.toPrecision(ke)})`)}return t.join(", ")}function RT(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(ke)}, ${s.toPrecision(ke)}, ${r.toPrecision(ke)}, ${a.toPrecision(ke)})`)}return t.join(", ")}function qx(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(ke)}`),t.push(`${e?s:s.toPrecision(ke)}`),t.push(`${e?r:r.toPrecision(ke)}`),t.push(`${e?a:a.toPrecision(ke)}`)}return t.join(", ")}function Xx(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(ke)}, ${r.toPrecision(ke)})`)}return i.join(", ")}function ET(o,e,t=!1){const i=[];for(const n in o){const s=o[n];i.push(TT(s,e,t))}return`
|
|
1193
|
+
def "Materials"
|
|
1194
|
+
{
|
|
1195
|
+
${i.join("")}
|
|
1196
|
+
}`}function tn(o){return Li(o.name)+"_"+(o.source?.id??o.id)}function Is(o,e,t,i,n,s,r=void 0,a=void 0){const l=tn(o),c=l+(a!==void 0&&a!==1?"_"+a:""),h=t&&a!==void 0&&a!==1,d=h?new me(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,w=Math.sin(_),P=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+=w/g.x,y.y+=P-1):(y.x+=w*g.x,y.y+=(1-P)*g.y);const M=sp(n),O=g.x!=1||g.y!=1||y.x!=0||y.y!=0||_!=0,j=`${ei}/${M}/${"uvReader_"+p}.outputs:result>`,I=`${ei}/${M}/Transform2d_${e}.outputs:result>`,W=e!=="normal"&&r&&(r.r!==1||r.g!==1||r.b!==1||a!==1)||!1,V=e==="normal",G=n instanceof mt&&n.normalScale?n.normalScale.x*2:2,X=G.toFixed(ke),E=(-1*(G/2)).toFixed(ke),$=(1-G).toFixed(ke);return`
|
|
1197
|
+
${O?`def Shader "Transform2d_${e}" (
|
|
1198
|
+
sdrMetadata = {
|
|
1199
|
+
string role = "math"
|
|
1200
|
+
}
|
|
1201
|
+
)
|
|
1202
|
+
{
|
|
1203
|
+
uniform token info:id = "UsdTransform2d"
|
|
1204
|
+
float2 inputs:in.connect = ${j}
|
|
1205
|
+
float2 inputs:scale = ${Yx(g)}
|
|
1206
|
+
float2 inputs:translation = ${Yx(y)}
|
|
1207
|
+
float inputs:rotation = ${(_/Math.PI*180).toFixed(ke)}
|
|
1208
|
+
float2 outputs:result
|
|
1209
|
+
}
|
|
1210
|
+
`:""}
|
|
1211
|
+
def Shader "${l}_${e}"
|
|
1212
|
+
{
|
|
1213
|
+
uniform token info:id = "UsdUVTexture"
|
|
1214
|
+
asset inputs:file = @textures/${c}.${m?"png":"jpg"}@
|
|
1215
|
+
token inputs:sourceColorSpace = "${o.colorSpace==="srgb"?"sRGB":"raw"}"
|
|
1216
|
+
float2 inputs:st.connect = ${O?I:j}
|
|
1217
|
+
${W?`
|
|
1218
|
+
float4 inputs:scale = (${r?r.r+", "+r.g+", "+r.b:"1, 1, 1"}, ${a})
|
|
1219
|
+
`:""}
|
|
1220
|
+
${V?`
|
|
1221
|
+
float4 inputs:scale = (${X}, ${X}, ${X}, 1)
|
|
1222
|
+
float4 inputs:bias = (${E}, ${E}, ${$}, 0)
|
|
1223
|
+
`:""}
|
|
1224
|
+
token inputs:wrapS = "${f[o.wrapS]}"
|
|
1225
|
+
token inputs:wrapT = "${f[o.wrapT]}"
|
|
1226
|
+
float outputs:r
|
|
1227
|
+
float outputs:g
|
|
1228
|
+
float outputs:b
|
|
1229
|
+
float3 outputs:rgb
|
|
1230
|
+
${n.transparent||n.alphaTest>0?"float outputs:a":""}
|
|
1231
|
+
}`}function TT(o,e,t=!1){const i=sp(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`
|
|
1232
|
+
|
|
1233
|
+
def Material "${i}" ${o.name?`(
|
|
1234
|
+
displayName = "${o.name}"
|
|
1235
|
+
)`:""}
|
|
1236
|
+
{
|
|
1237
|
+
token outputs:mtlx:surface.connect = ${ei}/${i}/Occlusion.outputs:out>
|
|
1238
|
+
|
|
1239
|
+
def Shader "Occlusion"
|
|
1240
|
+
{
|
|
1241
|
+
uniform token info:id = "${d}"
|
|
1242
|
+
token outputs:out
|
|
1243
|
+
}
|
|
1244
|
+
}`}const n=" ",s=[],r=[],a=new Set;if(o.isMeshPhysicalNodeMaterial===!0)return pT(o,i,e);let l=o.transparent||o.alphaTest?o.opacity:1,c=!1,h=!1;if(o instanceof Pm&&o.transmission!==void 0&&(l*=1-o.transmission*(1-o.roughness*.5)),o.map?(s.push(`${n}color3f inputs:diffuseColor.connect = ${ei}/${i}/${tn(o.map)}_diffuse.outputs:rgb>`),o instanceof Se&&o.transparent&&o.alphaTest==0&&t?(s.push(`${n}float inputs:opacity.connect = ${ei}/${i}/${tn(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 = ${ei}/${i}/${tn(o.map)}_diffuse.outputs:a>`),c=!0):o.alphaTest>0&&(s.push(`${n}float inputs:opacity.connect = ${ei}/${i}/${tn(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0),r.push(Is(o.map,"diffuse",t,e,o,a,o.color,l))):s.push(`${n}color3f inputs:diffuseColor = ${Qx(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 = ${ei}/${i}/${tn(o.aoMap)}_occlusion.outputs:r>`),r.push(Is(o.aoMap,"occlusion",t,e,o,a))),o.alphaMap?(s.push(`${n}float inputs:opacity.connect = ${ei}/${i}/${tn(o.alphaMap)}_opacity.outputs:r>`),s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),c=!0,h=!0,r.push(Is(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 mt){if(o.emissiveMap){s.push(`${n}color3f inputs:emissiveColor.connect = ${ei}/${i}/${tn(o.emissiveMap)}_emissive.outputs:rgb>`);const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),r.push(Is(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 = ${Qx(d)}`)}o.normalMap&&(s.push(`${n}normal3f inputs:normal.connect = ${ei}/${i}/${tn(o.normalMap)}_normal.outputs:rgb>`),r.push(Is(o.normalMap,"normal",t,e,o,a))),o.roughnessMap&&o.roughness===1?(s.push(`${n}float inputs:roughness.connect = ${ei}/${i}/${tn(o.roughnessMap)}_roughness.outputs:g>`),r.push(Is(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 = ${ei}/${i}/${tn(o.metalnessMap)}_metallic.outputs:b>`),r.push(Is(o.metalnessMap,"metallic",t,e,o,a))):s.push(`${n}float inputs:metallic = ${o.metalness!==void 0?o.metalness:0}`)}return o instanceof Pm&&(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 = ${ei}/${i}/${tn(o.transmissionMap)}_transmission.outputs:r>`),r.push(Is(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."),`
|
|
1245
|
+
|
|
1246
|
+
def Material "${i}" ${o.name?`(
|
|
1247
|
+
displayName = "${Ax(o.name)}"
|
|
1248
|
+
)`:""}
|
|
1249
|
+
{
|
|
1250
|
+
token outputs:surface.connect = ${ei}/${i}/PreviewSurface.outputs:surface>
|
|
1251
|
+
|
|
1252
|
+
def Shader "PreviewSurface"
|
|
1253
|
+
{
|
|
1254
|
+
uniform token info:id = "UsdPreviewSurface"
|
|
1255
|
+
${s.join(`
|
|
1256
|
+
`)}
|
|
1257
|
+
int inputs:useSpecularWorkflow = ${o instanceof Se?"1":"0"}
|
|
1258
|
+
token outputs:surface
|
|
1259
|
+
}
|
|
1260
|
+
${r.length>0?`
|
|
1261
|
+
${a.has(0)?`
|
|
1262
|
+
def Shader "uvReader_st"
|
|
1263
|
+
{
|
|
1264
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1265
|
+
token inputs:varname = "st"
|
|
1266
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1267
|
+
float2 outputs:result
|
|
1268
|
+
}
|
|
1269
|
+
`:""}
|
|
1270
|
+
${a.has(1)?`
|
|
1271
|
+
def Shader "uvReader_st1"
|
|
1272
|
+
{
|
|
1273
|
+
uniform token info:id = "UsdPrimvarReader_float2"
|
|
1274
|
+
token inputs:varname = "st1"
|
|
1275
|
+
float2 inputs:fallback = (0.0, 0.0)
|
|
1276
|
+
float2 outputs:result
|
|
1277
|
+
}
|
|
1278
|
+
`:""}
|
|
1279
|
+
${r.join(`
|
|
1280
|
+
`)}`:""}
|
|
1281
|
+
}`}function Qx(o){return`(${o.r}, ${o.g}, ${o.b})`}function Yx(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];v("debugusdz");class Lt{static global_id=0;id;trigger;action;exclusive=!1;makeExclusive(e){return this.exclusive=e,this}constructor(e,t,i){this.id="Behavior_"+Li(e)+"_"+Lt.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 yl=new Set;function fy(o,e){let t="";if(Array.isArray(o)){yl.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(yl.has(s))continue;i+=s,yl.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(yl.has(r))continue;i+=r,yl.add(r)}n+1<o.length&&(i+=", ")}i+=" ]",t=i,yl.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 or{static global_id=0;id;targetId;tokenId;type;distance;constructor(e,t){e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+or.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=fy(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 Zx(o,e={direct:!0,indirect:!0}){const t=ot.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 Vt{static __sceneStartTrigger;static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new or(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 or(e);if(Array.isArray(e)&&e.length>1)for(const n of e)n instanceof ot&&Zx(n,t);else e instanceof ot&&Zx(e,t);return i.tokenId="TapGesture",i}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const i=new or(e);return i.tokenId="ProximityToCamera",i.distance=t,i}}class Xr{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 xi{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 xi,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+="_"+xi.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=fy(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=fy(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 mn{x=0;y=0;z=0;constructor(e,t,i){this.x=e,this.y=t,this.z=i}static get up(){return new mn(0,1,0)}static get right(){return new mn(1,0,0)}static get forward(){return new mn(0,0,1)}static get back(){return new mn(0,0,-1)}static get zero(){return new mn(0,0,0)}}class ye{static sequence(...e){return new Xr("Group_"+Xr.getId(),e).makeSequence()}static parallel(...e){return new Xr("Group_"+Xr.getId(),e).makeParallel()}static fadeAction(e,t,i){const n=new xi(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 xi(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),ye.sequence(s,h)}return s}static waitAction(e){const t=new xi;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,i,n){const s=new xi(e);return s.tokenId="LookAtCamera",s.duration=t===void 0?9999999999999:t,s.front=i??mn.forward,s.up=n??mn.up,s}static emphasize(e,t,i="bounce",n=1,s="basic"){const r=new xi(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 xi(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 xi(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 xi(e);return i.tokenId="Impulse",i.velocity=t,i}}class AT{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 yy extends AT{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||ot.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=ye.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=ye.fadeAction(this.object,0,!1),this._disableAction)}}class Kx{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 so=v("debugusdzanimation"),by=v("debugusdzanimationserialization");class cr{_start;get start(){return this._start===void 0&&(this._start=this.ext.getStartTimeByClip(this.clip)),this._start}get duration(){return this.clip?.duration??Ne.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=Ra.parseTrackName(t.name);let n=Ra.findNode(this.root,i.nodeName);if(n)if(!e)e=n;else{if(n===e||cr.isDescendantOf(e,n))continue;if(!cr.isDescendantOf(n,e)){for(;!cr.isDescendantOf(n,e)&&n.parent;)n=n.parent;cr.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 Ne{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=Ne.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,bt);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-Ne.animationDurationPadding/2+1/60):m>=e.length?(f=e[e.length-1],g=f+Ne.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 K;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 lp{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:(Ne.restPoseClipDuration+Ne.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);so&&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=Ra.parseTrackName(c.name),d=Ra.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 Ne(null,d,null));let m=p[s];m||(m=new Ne(e,d,t),p[s]=m),m.addTrack(c),r?.includes(d)||r?.push(d)}so&&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 Ne(null,c,null);h[0]=p}let d=h[s];d||(so&&console.log("Adding padding clip for ",c,t,"at slot",s),d=new Ne(e,c,t),h[s]=d)}const l=new cr(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(i,l),so&&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=Ne.restPoseClipDuration);let h=this.lastClipEndTime+Ne.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){so&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){so&&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 Ne(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;by&&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 IT(e,this);this.serializers.push(n),n.registerCallback(t)}}class IT{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)),by&&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(E){const $=[];for(const[q,he]of E){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(E){const $=[];for(const[q,he]of E){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(E){let $,q=!0;const he=new Map;for(const[ge,te]of E){$===void 0&&($=te.length),$!==te.length&&(q=!1);let Ve=0;for(const ai of te)Ve++,ai||(he.has(ge)||he.set(ge,[]),he.get(ge).push(Ve))}so&&console.log("Bone count: ",E.size,"TransformData entries per bone: ",$,"Undefined bone entries: ",he),console.assert(q,"All bones should have the same number of TransformData entries",E),console.assert(he.size===0,"All TransformData entries should be set",he);const re=[];for(const[ge,te]of E)for(let Ve=0;Ve<te.length;Ve++){const ai=te[Ve],bd=i.getStartTimeByClip(ai.clip);re.length<=Ve&&re.push({pos:[],rot:[],scale:[],timeOffset:bd});const us=re[Ve];us.pos.push(...ai.getSortedTimesArray(!0,!1,!1)),us.rot.push(...ai.getSortedTimesArray(!1,!0,!1)),us.scale.push(...ai.getSortedTimesArray(!1,!1,!0))}for(const ge of re)ge.pos.sort((te,Ve)=>te-Ve),ge.rot.sort((te,Ve)=>te-Ve),ge.scale.sort((te,Ve)=>te-Ve),ge.pos=[...new Set(ge.pos)],ge.rot=[...new Set(ge.rot)],ge.scale=[...new Set(ge.scale)];return re},c=function(E,$,q){const he=new Map,re=new Map,ge=new Map,te=$.length;for(const Ve of q){const ai=E.get(Ve);let bd;ai?console.assert(ai.length===te,"We should have the same number of TransformData entries for each bone",ai,$):bd=new Ne(null,Ve,null);for(let us=0;us<te;us++){const mm=ai?ai[us]:bd,Oa=$[us];for(const{time:Jl,translation:ec}of mm.getValues(Oa.pos,!0,!1,!1)){const gn=(Jl+Oa.timeOffset)*60;he.has(gn)||he.set(gn,new Array),he.get(gn).push(ec.clone())}for(const{time:Jl,rotation:ec}of mm.getValues(Oa.rot,!1,!0,!1)){const gn=(Jl+Oa.timeOffset)*60;re.has(gn)||re.set(gn,new Array),re.get(gn).push(ec.clone())}for(const{time:Jl,scale:ec}of mm.getValues(Oa.scale,!1,!1,!0)){const gn=(Jl+Oa.timeOffset)*60;ge.has(gn)||ge.set(gn,new Array),ge.get(gn).push(ec.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(E){const $=[];for(const q of E)$.push(`(${ce(q.x)}, ${ce(q.y)}, ${ce(q.z)})`);return $.join(", ")},d=function(E){const $=[];for(const q of E)$.push(`(${ce(q.w)}, ${ce(q.x)}, ${ce(q.y)}, ${ce(q.z)})`);return $.join(", ")},p=function(E){const $=new Map;if(so){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
|
|
1282
|
+
`+q.join(`
|
|
1283
|
+
`))}for(const q of E){const he=s.get(q);he&&$.set(q,he)}return $},m=function(E){const $=p(E),q=l($);return c($,q,E)};const f=n.skinnedMesh.skeleton,g=new Array,y=[],_=[];for(const E of f.bones){y.push(E),_.push(E.uuid);const $=f.boneInverses[f.bones.indexOf(E)];g.push({bone:E,inverse:$})}let w=1e4;for(;_.length<f.bones.length&&w-- >0;)for(const E of y){const $=E.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})}}w<=0&&console.error("Failed to sort bones in skinned mesh",n.skinnedMesh,f.bones,_);for(const E of Lx(f.bones))g.push({bone:E,inverse:E.matrixWorld.clone().invert()});const P=g[0].bone.parent;P||console.error("No bone parent found for skinned mesh during USDZ export",n.skinnedMesh),g.sort((E,$)=>fl(E.bone,P)>fl($.bone,P)?1:-1);const M=t.quickLookCompatible,O=[],j=[],I=[],W=[];for(const{bone:E}of g){if(M){const $=E.scale;$.x==0&&($.x=1e-5),$.y==0&&($.y=1e-5),$.z==0&&($.z=1e-5),O.push(new K().compose(E.position,E.quaternion,E.scale))}else O.push(E.matrix.clone());j.push(E.position),I.push(E.quaternion),W.push(E.scale)}const V=g.map(E=>'"'+fl(E.bone,P)+'"').join(", "),G=g.map(E=>Gx(E.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${G}]`),e.appendLine(`uniform token[] joints = [${V}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${O.map(E=>Gx(E)).join(", ")}]`);const X=m(g.map(E=>E.bone));if(so){let E=1e7,$=0;for(const q of X.position?.keys()??[])E=Math.min(E,q),$=Math.max($,q);console.log("Time samples",E,$,X)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${V}]`),e.appendLine(`quatf[] rotations = [${d(I)}]`),X&&X.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const E=a(X.quaternion);for(const $ of E)e.appendLine($);e.closeBlock()}if(e.appendLine(`half3[] scales = [${h(W)}]`),X&&X.scale){e.beginBlock("half3[] scales.timeSamples = {","");const E=r(X.scale);for(const $ of E)e.appendLine($);e.closeBlock()}if(e.appendLine(`float3[] translations = [${h(j)}]`),X&&X.position){e.beginBlock("float3[] translations.timeSamples = {","");const E=r(X.position);for(const $ of E)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 Ne(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;by&&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),w=d==="rotation"&&(m.rot||y),P=d==="scale"&&(m.scale||y);if(_||w||P){const M=m.clip?.name??"rest",O=m.getDuration();so&&console.log("Write .timeSamples:",M,f,O,h),e.appendLine("# "+M+": start="+l.format(f*Ne.frameRate)+", length="+l.format(O*Ne.frameRate)+", frames="+m.getFrames())}if(_)for(const{time:M,translation:O}of m.getValues(g,!0,!1,!1)){const j=`${l.format((f+M)*Ne.frameRate)}: (${ce(O.x)}, ${ce(O.y)}, ${ce(O.z)}),`;e.appendLine(j)}if(w)for(const{time:M,rotation:O}of m.getValues(g,!1,!0,!1)){const j=`${l.format((f+M)*Ne.frameRate)}: (${ce(O.w)}, ${ce(O.x)}, ${ce(O.y)}, ${ce(O.z)}),`;e.appendLine(j)}if(P)for(const{time:M,scale:O}of m.getValues(g,!1,!1,!0)){const j=`${l.format((f+M)*Ne.frameRate)}: (${ce(O.x)}, ${ce(O.y)}, ${ce(O.z)}),`;e.appendLine(j)}}e.closeBlock()}}c(a,"position"),c(a,"rotation"),c(a,"scale")}}const LT=v("debugusdz");class va{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)),Li(i)+"."+t}get extensionName(){return"Audio"}files=new Array;onExportObject(e,t,i){const n=x.getComponents(e,Ii);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=va.getName(s.clip),l=Li(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]){LT&&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 DT=Object.defineProperty,Be=(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 Jx=v("debugusdzbehaviours");function eh(o){o&&(o.getComponentInParent(tl)||(A()&&console.debug('Raycaster on "'+o.name+'" was automatically added, because no raycaster was found in the parent hierarchy.'),o.addComponent(Ai)))}class Qr extends R{object;target;duration=1;relativeMotion=!1;coroutine=null;targetPos=new b;targetRot=new N;targetScale=new b;start(){eh(this.gameObject)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){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=J(this.object).clone(),t=J(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){ft(this.object,t),bn(this.object,n),La(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),ft(this.object,this.targetPos),bn(this.object,this.targetRot),La(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 Lt("Move to "+this.target?.name,Vt.tapTrigger(this.gameObject),ye.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(t)}}}Be([u(k)],Qr.prototype,"object"),Be([u(k)],Qr.prototype,"target"),Be([u()],Qr.prototype,"duration"),Be([u()],Qr.prototype,"relativeMotion");const cp=class oi extends R{materialToSwitch;variantMaterial;fadeDuration=0;start(){this._objectsWithThisMaterial=this.objectsWithThisMaterial,eh(this.gameObject),A()&&this._objectsWithThisMaterial.length<=0&&console.warn('ChangeMaterialOnClick: No objects found with material "'+this.materialToSwitch?.name+'"')}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=[],oi._materialTriggersPerId={},oi.variantSwitchIndex=0,this.materialToSwitch&&await We.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await We.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&&(oi._materialTriggersPerId[this.materialToSwitch.uuid]||(oi._materialTriggersPerId[this.materialToSwitch.uuid]=[]),oi._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(e,t){if(!this.materialToSwitch)return;const i=oi._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 oi._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(e,t,i){const n=[],s=Math.max(0,this.fadeDuration);n.push(ye.fadeAction([...this.targetModels,...i],s,!1)),n.push(ye.fadeAction(t,s,!0)),e.addBehavior(new Lt("Select_"+this.selfModel.name,Vt.tapTrigger(this.selfModel),ye.parallel(...n))),oi._parallelStartHiddenActions.push(...t),oi._startHiddenBehaviour||(oi._startHiddenBehaviour=new Lt("StartHidden_"+this.selfModel.name,Vt.sceneStartTrigger(),ye.fadeAction(oi._parallelStartHiddenActions,s,!1)),e.addBehavior(oi._startHiddenBehaviour))}static getMaterialName(e){return Li(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_"+oi.variantSwitchIndex+++"_"+oi.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())&&ot.createEmptyParent(t),t.parent&&t.parent.add(i),e.push(i)}return e}};Be([u(we)],cp.prototype,"materialToSwitch"),Be([u(we)],cp.prototype,"variantMaterial"),Be([u()],cp.prototype,"fadeDuration");let _y=cp;const th=class ze extends R{target;toggleOnClick=!1;targetState=!0;hideSelf=!0;start(){eh(this.gameObject)}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[ze.wasVisible]===void 0&&(this.gameObject[ze.wasVisible]=this.gameObject.activeSelf),this.target[ze.wasVisible]===void 0&&(this.target[ze.wasVisible]=this.target.activeSelf),this.stateBeforeCreatingDocument=this.gameObject[ze.wasVisible],this.targetStateBeforeCreatingDocument=this.target[ze.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())&&cy.createEmptyParent(this.selfModel),this.toggleModel=this.selfModel.deepClone(),this.toggleModel.name+="_toggle",this.selfModel.parent.add(this.toggleModel);else{if(!this.gameObject[ze.toggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new K),l.name+="_toggle"+ze.clonedToggleIndex++,i.add(l),this.gameObject[ze.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[ze.toggleClone];if(!this.gameObject[ze.reverseToggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new K),l.name+="_toggleReverse"+ze.clonedToggleIndex++,i.add(l),this.gameObject[ze.reverseToggleClone]=l}this.toggleModel=this.gameObject[ze.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(ye.fadeAction(n,0,!1)),a.push(ye.fadeAction(this.toggleModel,0,!0)),a.push(ye.fadeAction(this.targetModel,0,s)),e.addBehavior(new Lt("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),Vt.tapTrigger(n),ye.parallel(...a)));const l=[];l.push(ye.fadeAction(this.toggleModel,0,!1)),l.push(ye.fadeAction(n,0,!0)),l.push(ye.fadeAction(this.targetModel,0,!s)),e.addBehavior(new Lt("Toggle_"+n.name+"_ToggleTo"+(s?"Off":"On"),Vt.tapTrigger(this.toggleModel),ye.parallel(...l)))}}else{const a=[];this.hideSelf&&a.push(ye.fadeAction(n,0,!1)),a.push(ye.fadeAction(this.targetModel,0,s)),e.addBehavior(new Lt("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),Vt.tapTrigger(n),a.length>1?ye.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),pn.add(r,e)}}afterSerialize(e,t){this.gameObject[ze.wasVisible]!==void 0&&(this.gameObject.visible=this.gameObject[ze.wasVisible],delete this.gameObject[ze.wasVisible]),this.target&&this.target[ze.wasVisible]!==void 0&&(this.target.visible=this.target[ze.wasVisible],delete this.target[ze.wasVisible]),delete this.gameObject[ze.toggleClone],delete this.gameObject[ze.reverseToggleClone]}};Be([u(k)],th.prototype,"target"),Be([u()],th.prototype,"toggleOnClick"),Be([u()],th.prototype,"targetState"),Be([u()],th.prototype,"hideSelf");let vy=th;class pn extends R{static _fadeBehaviour;static _fadeObjects=[];static add(e,t){const i=Array.isArray(e)?e:[e];for(const n of i)pn._fadeObjects.includes(n)||(console.log("adding hide on start",n),pn._fadeObjects.push(n));pn._fadeBehaviour===void 0&&(pn._fadeBehaviour=new Lt("HideOnStart",Vt.sceneStartTrigger(),ye.fadeAction(pn._fadeObjects,0,!1)),t.addBehavior(pn._fadeBehaviour))}start(){x.setActive(this.gameObject,!1)}createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.wasVisible||pn.add(t,e))}wasVisible=!1;beforeCreateDocument(){this.wasVisible=x.isActiveSelf(this.gameObject)}}class bl extends R{target;duration=.5;motionType="bounce";beforeCreateDocument(){}createBehaviours(e,t,i){if(this.target&&t.uuid===this.gameObject.uuid){const n=new Lt("emphasize "+this.name,Vt.tapTrigger(this.gameObject),ye.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(n)}}afterCreateDocument(e,t){}}Be([u()],bl.prototype,"target"),Be([u()],bl.prototype,"duration"),Be([u()],bl.prototype,"motionType");class Ls extends R{target;clip="";toggleOnClick=!1;trigger="tap";start(){eh(this.gameObject)}ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(Ii);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}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;va.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=ye.playAudioAction(s,c,"play",r,a);this.target&&this.target.loop&&(h=ye.sequence(h).makeLooping());const d=this.name?"_"+this.name:"";if(l&&this.trigger==="tap"){this.toggleOnClick&&(h.multiplePerformOperation="stop");const p=new Lt("playAudio"+d,Vt.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 Lt("playAudioOnStart"+d,Vt.sceneStartTrigger(),h);e.addBehavior(p)}}}}Be([u(Ii)],Ls.prototype,"target"),Be([u(URL)],Ls.prototype,"clip"),Be([u()],Ls.prototype,"toggleOnClick");const wy=class yo extends R{animator;stateName;trigger="tap";animation;get target(){return this.animator?.gameObject||this.animation?.gameObject}start(){eh(this.gameObject)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),this.target&&this.stateName&&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(yo.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,...yo.rootsWithExclusivePlayback)}yo.animationActions=[],yo.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 lp);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."),yo.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";i.traverse(a=>{if(a.uuid===this.target?.uuid){const l=yo.getActionForSequences(i,a,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),c=new Lt(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+this.target?.name,this.trigger=="tap"?Vt.tapTrigger(this.selfModel):Vt.sceneStartTrigger(),l);s&&c.makeExclusive(!0),e.addBehavior(c)}})}static getActionForSequences(e,t,i,n,s){const r=(l,c)=>{let h=yo.animationActions.find(d=>d.affectedObjects==l&&d.start==c.start&&d.duration==c.duration&&d.animationSpeed==c.speed);return h||(h=ye.startAnimationAction(l,c),yo.animationActions.push(h)),h},a=ye.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:ye.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(ye.waitAction(s)),a}static getAndRegisterAnimationSequences(e,t,i){if(!t)return;const n=t.getComponent(bt),s=t.getComponent(Ft);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(w=>w.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),Jx&&console.log("found loop from "+i,"states until loop",h,"states looping",d)}else h=f,d=[],Jx&&console.log("found no loop from "+i,"states",h);if(!d.length){const y=h[h.length-1],_=y.motion?.clip;if(_){let w;if(e.holdClipMap.has(_))w=e.holdClipMap.get(_);else{const P=y.name+"_hold";w=_.clone(),w.duration=1,w.name=P;const M=_.duration;w.tracks=_.tracks.map(O=>{const j=O.clone();j.times=new Float32Array([0,M]);const I=O.values.length,W=O.getValueSize(),V=O.values.slice(I-W,I);return j.values=new Float32Array(2*W),j.values.set(V,0),j.values.set(V,W),j}),w.name=P,e.holdClipMap.set(_,w)}if(w){const P={name:w.name,motion:{clip:w,isLooping:!1,name:w.name},speed:1,transitions:[],behaviours:[],hash:y.hash+1};d.push(P)}}}}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=yo.getAndRegisterAnimationSequences(e,this.target,this.stateName);n&&(this.animationSequence=n.animationSequence,this.animationLoopAfterSequence=n.animationLoopAfterSequence,this.randomOffsetNormalized=n.randomTimeOffset,this.stateAnimationModel=t)}};Be([u(bt)],wy.prototype,"animator"),Be([u()],wy.prototype,"stateName");let ih=wy;class _l extends R{getType(){}target;getDuration(){}}Be([u(k)],_l.prototype,"target");class nh extends R{target}Be([u(_l)],nh.prototype,"target");class oh extends _l{type=1;duration=1;getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}Be([u()],oh.prototype,"type"),Be([u()],oh.prototype,"duration");class xy extends nh{}class sr{static _instance;static create(){return new sr}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 Un.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=L.supportsQuickLookAR();let i="View in AR";L.isVisionOS()?i="View in AR":(t||L.isiOS())&&(i="Open in Quicklook"),e.innerText=i,e.prepend(Ot("view_in_ar"));let n=!1,s=null;return e.addEventListener("click",()=>{s=qa(Tn),s||(n=!0,s=new Tn),n&&(s.objectToExport=z.Current.scene),s?(e.classList.add("this-mode-is-requested"),s.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(r=>{e.classList.remove("this-mode-is-requested"),console.error(r)})):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");return this._arButton=i,i.classList.add("webxr-button"),i.dataset.needle="webxr-ar-button",i.innerText="Enter AR",i.prepend(Ot("view_in_ar")),i.title="Click to start an AR session",i.addEventListener("click",()=>Z.start(t,e)),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),L.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(Ot("panorama_photosphere")),i.title="Click to start a VR session",i.addEventListener("click",()=>Z.start(t,e)),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),L.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(Ot("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&&Ee("This page doesn't allow popups. Please paste "+n+" into your browser.")}),this.listenToXRSessionState(t),this.hideElementDuringXRSession(t),L.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>{navigator.xr?.isSessionSupported("immersive-vr")?t.style.display="none":t.style.display=""}),t}createQRCode(){return Un.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!(t==="immersive-ar"&&L.isiOS()&&!L.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){$d(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),pg(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 jT=Object.defineProperty,BT=Object.getOwnPropertyDescriptor,vt=(o,e,t,i)=>{for(var n=i>1?void 0:i?BT(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&&jT(e,t,n),n};const sh=v("debugspriterenderer"),FT=v("wireframe");class xa{static cache={};static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&xa.cache[e.guid])return sh&&console.log("Take cached geometry for sprite",e.guid),xa.cache[e.guid];const t=new fn;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 gt(i,3)),t.setAttribute("uv",new gt(n,2)),e.guid&&(this.cache[e.guid]=t),sh&&console.log("Built sprite geometry",e,t),t}}class UT{x;y}function e1(o){o&&(o.colorSpace!=Co&&(o.colorSpace=Co,o.needsUpdate=!0),o.minFilter==kd&&o.magFilter==kd&&(o.anisotropy=1,o.needsUpdate=!0))}let Ho=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(xa.getOrCreateGeometry(this),this.material)),this._mesh}_mesh;get material(){return this._material||(this.texture&&e1(this.texture),this._material=new Se({map:this.texture,color:16777215,side:Oi,transparent:!0})),this._material}_material;getGeometry(){return xa.getOrCreateGeometry(this)}};vt([u()],Ho.prototype,"guid",2),vt([u(Le)],Ho.prototype,"texture",2),vt([Xe()],Ho.prototype,"triangles",2),vt([Xe()],Ho.prototype,"uv",2),vt([Xe()],Ho.prototype,"vertices",2);const Sy=Symbol("spriteOwner");class vl{sprites;constructor(){this.sprites=[]}}vt([u(Ho)],vl.prototype,"sprites",2);const Cy=class K0{static create(){const e=new K0;return e.spriteSheet=new vl,e}constructor(){}clone(){const e=new K0;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 vl,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&&(e1(n),!i.__hasLoadedProgressive)){i.__hasLoadedProgressive=!0;const s=n;We.assignTextureLOD(n,0).then(r=>{r instanceof Le&&(i.texture=r,e?.map===s&&(e.map=r,e.needsUpdate=!0))})}}};vt([u(vl)],Cy.prototype,"spriteSheet",2),vt([u()],Cy.prototype,"index",2);let wl=Cy;class fi extends R{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=wl.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);sh&&console.log("[SpriteSheet] Set index to "+t+" (was "+this.spriteIndex+")",e),this.spriteIndex=t}else e instanceof Ho?(this._spriteSheet||(this._spriteSheet=wl.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=wl.create(),sh&&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 sh&&console.warn("Sprite not found",this.spriteIndex,t.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=xa.getOrCreateGeometry(i),this._currentSprite.material.map=i.texture;else{const n=new Se({color:16777215,side:Oi});if(FT&&(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[Sy]!==void 0&&s[Sy]!==this&&this.spriteFrames>1&&(s=i.texture=s.clone()),s[Sy]=this,n.map=s}this.sharedMaterial=n,this._currentSprite=new H(xa.getOrCreateGeometry(i),n),this._currentSprite.renderOrder=Math.round(this.renderOrder),We.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}}vt([u()],fi.prototype,"drawMode",2),vt([u(UT)],fi.prototype,"size",2),vt([u(se)],fi.prototype,"color",2),vt([u(we)],fi.prototype,"sharedMaterial",2),vt([u()],fi.prototype,"transparent",2),vt([u()],fi.prototype,"cutoutThreshold",2),vt([u()],fi.prototype,"castShadows",2),vt([u()],fi.prototype,"renderOrder",2),vt([u()],fi.prototype,"toneMapped",2),vt([u(wl)],fi.prototype,"sprite",1);const t1=v("debugwebxr"),zT=new K().makeRotationY(Math.PI);class Vi extends R{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 K;_createdPlacementObject=null;_reparentedComponents=[];_placementScene=new Si;_reticle=[];_hits=[];_placementStartTime=-1;_rigPlacementMatrix;_anchor=null;userInput;onEnable(){this.customReticle?.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){t1&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,Vi._hasPlaced=!1,this.gameObject.updateMatrixWorld(),this._startOffset.copy(this.gameObject.matrixWorld);const t=new k;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=Qt(this._placementScene.children),n=i.getCenter(new b),s=i.getSize(new b),r=new K;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)Yi(i);this._reticle.length=0,this._isPlacing=!0,this.context.input.addEventListener("pointerup",this.onPlaceScene,{queue:hi.Early})}onLeaveXR(){this.context.input.removeEventListener("pointerup",this.onPlaceScene,{queue:hi.Early}),this.onRevertSceneChanges(),this._anchor=null,Vi._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 pm(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=Ya(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else s=new H(new kC(.07,.09,32).rotateX(-Math.PI/2),new Se({side:Oi,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),s.name="AR Placement Reticle";if(t1){const r=new Pi(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(B(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 mg){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),Vi._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(Z.active,i),this.context.xr)for(const n of this.context.xr.controllers)n.cancelHitTestSource()};onSetScale(){if(!Vi._hasPlaced)return;const e=Z.active?.rig?.gameObject;if(e){const t=Z.active?.rigScale||1,i=1/this._arScale*t,n=new K().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(zT),t.matrix.premultiply(this._startOffset),t.matrix.decompose(t.position,t.quaternion,t.scale),i.add(t)}}class pm{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 K,this.plane=new dr,this.plane.setFromNormalAndCoplanarPoint(pm.up,pm.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:hi.Early}),this.context.input.addEventListener("pointerdown",this.onPointerDownLate,{queue:hi.Late}),this.context.input.addEventListener("pointerup",this.onPointerUpEarly,{queue:hi.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:hi.Early}),this.context.input.removeEventListener("pointerdown",this.onPointerDownLate,{queue:hi.Late}),this.context.input.removeEventListener("pointerup",this.onPointerUpEarly,{queue:hi.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=L.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 wd;_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 K;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)}}const Ds=v("debugautosync"),Py=Symbol("syncerId");class NT{_syncers={};getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new VT(e);return t[Py]=e.guid,this._syncers[t[Py]]=t,t}removeSyncer(e){delete this._syncers[e[Py]]}}const Oy=new NT;class VT{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||(Ds&&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];Ds&&console.log("SEND",this.comp.guid,this.networkingKey),e.send(this.networkingKey,{guid:this.comp.guid,property:t,data:i},wn.Queued),delete this.changedProperties[t]}};onHandleReceiving=e=>{if(Ds&&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 WT(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 rh=Symbol("AutoSyncHandler");function $T(o){if(o[rh])return o[rh];const e=Oy.getOrCreateSyncer(o);return e?.init(o),o[rh]=e,e}function HT(o){const e=o[rh];e&&(Oy.removeSyncer(e),e.destroy(),delete o[rh])}const ky=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()||Ds)&&o!=null&&console.warn('syncField: no callback function found for property "'+i+'"','"'+o+'"');const r=e,a=r.__internalAwake;if(typeof a!="function"){(Ds||A())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+e?.constructor?.name+'" is not supported',e);return}Ds&&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()||Ds)&&console.warn("Recursive call detected",i);return}h=!0;try{const m=WT(d,p);Ds&&console.log("SyncField assignment",i,"changed?",m,d,s),m&&s?.call(this,d,p)!==!1&&$T(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(){HT(this),c.call(this)}}};var GT=Object.defineProperty,hp=(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&>(e,t,n),n};const ii=v("debugplayersync"),dp=class CS extends R{static async setupFrom(e,t){const i=ne.getOrCreateFromUrl(e);if(!i.asset){const r=await i.loadAssetAsync();r&&x.getOrAddComponent(r,nn)}const n=new CS;n._internalInit(t),n.asset=i;const s=new k;return s.guid=e,x.addComponent(s,n),n}autoSync=!0;asset;onPlayerSpawned;_localInstance;awake(){this.watchTabVisible(),this.onPlayerSpawned||(this.onPlayerSpawned=new de)}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.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)}onJoinedRoom=()=>{ii&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()};async getInstance(){if(this._localInstance)return this._localInstance;if(ii&&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,nn);if(ii&&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=>{ii&&console.log("PlayerSync.destroyInstance",e),Pc(e,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0};watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=nn.all.length-1;t>=0;t--){const i=nn.all[t];(!i.owner||!this.context.connection.userIsInRoom(i.owner))&&i.doDestroy()}})}};hp([u()],dp.prototype,"autoSync"),hp([u(ne)],dp.prototype,"asset"),hp([u(de)],dp.prototype,"onPlayerSpawned");let My=dp;var i1=(o=>(o.OwnerChanged="ownerChanged",o))(i1||{});const Ry=class At extends R{static _all=[];static get all(){return At._all}static _local=[];static get local(){return At._local}static getFor(e){if(e instanceof k)return x.getComponentInParent(e,At);if(e instanceof R)return x.getComponentInParent(e.gameObject,At)}static isLocalPlayer(e){return At.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 de;onFirstOwnerChangeEvent=new de;hasOwner=!1;owner;dontDestroy=!1;get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(e,t){ii&&console.log(`PlayerSync.onOwnerChange: ${t} \u2192 ${e} (me: ${this.context.connection.connectionId})`);const i=At._local.indexOf(this);i>=0&&At._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){At._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),At.dispatchEvent("ownerChanged",s)}awake(){At.all.push(this),ii&&console.log("Registered new PlayerState",this.guid,At.all.length-1,At.all),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeftRoom)}async start(){ii&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await ko(300),this.context.connection.userIsInRoom(this.owner)==!1&&(ii&&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||(ii&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?ii&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(ii&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):ii&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){ii&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),Pc(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(ii&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeftRoom),At.all.splice(At.all.indexOf(this),1),this.isLocalPlayer){const e=At._local.indexOf(this);e>=0&&At._local.splice(e,1)}}onUserLeftRoom=e=>{if(e.userId===this.owner){ii&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}}};hp([ky(Ry.prototype.onOwnerChange)],Ry.prototype,"owner");let nn=Ry;var qT=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&&qT(e,t,n),n};class ro extends R{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&&(L.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}xl([u()],ro.prototype,"position"),xl([u()],ro.prototype,"showNeedleLogo"),xl([u()],ro.prototype,"showSpatialMenu"),xl([u()],ro.prototype,"createFullscreenButton"),xl([u()],ro.prototype,"createMuteButton"),xl([u()],ro.prototype,"createQRCodeButton");var XT=Object.defineProperty,Ey=(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&&XT(e,t,n),n};const ah=v("debugwebxr"),n1=new N().setFromAxisAngle(new b(0,1,0),Math.PI);class js extends R{head;leftHand;rightHand;_leftHandMeshes;_rightHandMeshes;_syncTransforms;async onEnterXR(e){if(!this.activeAndEnabled)return;ah&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=nn.getFor(this);if(t?.owner){const i=this.gameObject.addComponent(Ie);i.avatar=this.gameObject,i.connectionId=t.owner,this.context.players.setPlayerView(t.owner,this.head?.asset,Lo.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(Ie);t&&t.destroy()}onUpdateXR(e){if(!this.activeAndEnabled)return;const t=nn.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,Ji);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(n1),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(n1),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=>{Io(s,!n)})}}updateRemoteAvatarVisibility(){if(this.context.connection.isConnected){const e=nn.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,Ji);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};ev.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 k&&(this.head=new ne("",this.sourceId,this.head));else{const e=new k;e.name="Head";const t=Cr.createPrimitive(Sr.Cube);e.add(t),this.gameObject.add(e),this.head=new ne("",this.sourceId,e),ah&&console.log("Create head",e)}if(this.rightHand)this.rightHand instanceof k&&(this.rightHand=new ne("",this.sourceId,this.rightHand));else{const e=new k;e.name="Right Hand",this.gameObject.add(e),this.rightHand=new ne("",this.sourceId,e),ah&&console.log("Create right hand",e)}if(this.leftHand)this.leftHand instanceof k&&(this.leftHand=new ne("",this.sourceId,this.leftHand));else{const e=new k;e.name="Left Hand",this.gameObject.add(e),this.leftHand=new ne("",this.sourceId,e),ah&&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)}),nn.isLocalPlayer(this.gameObject)&&(this._syncTransforms=x.getComponentsInChildren(this.gameObject,kn))}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 Wm(a);ah&&console.log("Avatar loaded results:",l)}}Ey([u(ne)],js.prototype,"head"),Ey([u(ne)],js.prototype,"leftHand"),Ey([u(ne)],js.prototype,"rightHand");var QT=Object.defineProperty,up=(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&&QT(e,t,n),n};const Bs=v("debugwebxr"),Fs=new Array;class Go extends R{createControllerModel=!0;createHandModel=!0;customLeftHand;customRightHand;static factory=new oP;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&&Qa(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&&(Qa(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&&(Qa(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&&(Bs&&(Fs[0]=Date.now()),this.updateRendering(Z.active),Bs)){const e=Date.now()-Fs[0];Fs.push(e),Fs.length>=30&&(Fs[0]=0,Fs.reduce((t,i)=>t+i,0)/Fs.length,Fs.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){Bs&&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(Ua))}}}}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 Qa(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||(Bs?F.DrawLabel(t.rayWorldPosition,"No hand found for index "+t.index,.05,5):console.warn("No hand found for index "+t.index));const s=new Po;yf(s,i),await Qu(s,i,this.sourceId??"",this.sourceId??"");const r=Qf(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 k;Qa(c);const h=new sP(c,n,s.path,a,s,d=>{const p=r?.gltf;p?.scene.children?.length===0&&(p.scene.children[0]=d),r?.gltf&&vn().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&&We.assignMeshLOD(m,0)}),t.connected||(Bs&&F.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),d.removeFromParent())});if(Bs&&c.add(new Pi(.5)),t.inputSource.hand){Bs&&console.log(t.inputSource.hand);for(const d of t.inputSource.hand.values())if(n.joints[d.jointName]===void 0){const p=new xo;p.matrixAutoUpdate=!1,p.visible=!0,n.joints[d.jointName]=p,n.add(p)}}else Bs&&F.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)}}}up([u()],Go.prototype,"createControllerModel"),up([u()],Go.prototype,"createHandModel"),up([u(ne)],Go.prototype,"customLeftHand"),up([u(ne)],Go.prototype,"customRightHand");class pp extends R{}var YT=Object.defineProperty,Us=(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&&YT(e,t,n),n};const Ty=v("debugwebxr");class Di extends R{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=B(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=J(this.context.mainCamera).clone();t.rotateY(n*D.toRadians(this.rotationStep));const r=J(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 Ta){const r=n.normal?.dot(B(0,1,0));if(r!==void 0&&r<.4)return}let s=n?.point;if(!s&&!this.useTeleportTarget){this._plane||(this._plane=new dr(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 MC(a.origin,B(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,pp))return;const r=s.clone();if(Ty&&F.DrawSphere(s,.025,16711680,5),this.context.mainCamera?.position){const a=this.context.xr?.getUserOffsetInRig();a&&(a.y=0,r.sub(a),Ty&&F.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;Ty&&(F.DrawWireSphere(c.point,.025*h,16711680),F.DrawLabel(B(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(ZT,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 Iu(e)||e.isUI===!0?!0:e.isScene?!1:e.parent?this.isObjectWithInteractiveComponent(e.parent,t+1):!1}updateHitPointerPosition(e,t,i){const n=B(e.rayWorldPosition);n.add(B(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 vd(.3,6,6),new Se({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:Oi}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new rP;e.layers.disableAll(),e.layers.enable(2);const t=new aP;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 lP({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:mb,dashed:!1});return e.material=s,e}}Us([u()],Di.prototype,"movementSpeed"),Us([u()],Di.prototype,"rotationStep"),Us([u()],Di.prototype,"useTeleport"),Us([u()],Di.prototype,"usePinchToTeleport"),Us([u()],Di.prototype,"useTeleportTarget"),Us([u()],Di.prototype,"useTeleportFade"),Us([u()],Di.prototype,"showRays"),Us([u()],Di.prototype,"showHits");const ZT=new b(0,1,0);var KT=Object.defineProperty,wt=(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&&KT(e,t,n),n};const lh=v("debugwebxr"),JT=v("debugusdz"),lt=class Gl extends R{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=L.isVisionOS()&&!e;(this.useQuicklookExport||t)&&(x.findObjectOfType(Tn)||(lh&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=x.addComponent(this.gameObject,Tn),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0))}),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(lh&&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(My),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!Gl.activeWebXRComponent||Gl.activeWebXRComponent===this}onBeforeXR(e,t){if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${Gl.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}Gl.activeWebXRComponent=this,e=="immersive-ar"&&this.useDepthSensing&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("depth-sensing"))}async onEnterXR(e){if(!this.isActiveWebXR)return;lh&&console.log("WebXR onEnterXR"),this._previousXRState=si.Global.Mask;const t=e.xr.isVR;if(si.Global.Set(t?eo.VR:eo.AR),e.xr.isAR){let i=x.findObjectOfType(Vi,this.context,!1);if(!i)if(this.usePlacementReticle){const n=new k;for(const s of this.context.scene.children)n.add(s);this.context.scene.add(n),i=x.addComponent(n,Vi),this._createdComponentsInSession.push(i)}else(lh||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(_a)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(_a))),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){si.Global.Set(this._previousXRState),this._playerSync?.destroyInstance();for(const t of this._createdComponentsInSession)t.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),sc(1).then(()=>Gl.activeWebXRComponent=null)}}setDefaultMovementEnabled(e){let t=this.gameObject.getComponent(Di);return!t&&e&&(t=this.gameObject.addComponent(Di),this._createdComponentsInSession.push(t)),t&&(t.enabled=e),t}setDefaultControllerRenderingEnabled(e){let t=this.gameObject.getComponent(Go);return!t&&e&&(t=this.gameObject.addComponent(Go),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=>{lh&&console.log("WebXR.onAvatarSpawned",e);let t=x.getComponentInChildren(e,js);t??=x.addComponent(e,js)};getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=sr.getOrCreate()),this._buttonFactory}_buttonFactory;handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((L.isiOS()&&L.isSafari()||JT)&&this.useQuicklookExport){const e=x.findObjectOfType(Tn);if(!e||e&&e.allowCreateQuicklookButton){const t=this.getButtonsFactory().createQuicklookButton();this.addButton(t,50)}}if(this.createARButton){const e=this.getButtonsFactory().createARButton();this.addButton(e,50)}if(this.createVRButton){const e=this.getButtonsFactory().createVRButton();this.addButton(e,50)}}if(this.createSendToQuestButton&&!L.isQuest()&&Z.isVRSupported().then(e=>{if(!e){const t=this.getButtonsFactory().createSendToQuestButton();this.addButton(t,50)}}),this.createQRCode){const e=qa(ro);if(e&&e.createQRCodeButton===!1)A()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!L.isMobileDevice()){const t=Un.getOrCreate().createQRCode();this.addButton(t,50)}}}_buttons=[];addButton(e,t){this._buttons.push(e),e.setAttribute("priority",t.toString()),this.context.menu.appendChild(e)}removeButtons(){for(const e of this._buttons)e.remove();this._buttons.length=0}};wt([u()],lt.prototype,"createVRButton"),wt([u()],lt.prototype,"createARButton"),wt([u()],lt.prototype,"createSendToQuestButton"),wt([u()],lt.prototype,"createQRCode"),wt([u()],lt.prototype,"useDefaultControls"),wt([u()],lt.prototype,"showControllerModels"),wt([u()],lt.prototype,"showHandModels"),wt([u()],lt.prototype,"usePlacementReticle"),wt([u(ne)],lt.prototype,"customARPlacementReticle"),wt([u()],lt.prototype,"usePlacementAdjustment"),wt([u()],lt.prototype,"arScale"),wt([u()],lt.prototype,"useXRAnchor"),wt([u()],lt.prototype,"autoPlace"),wt([u()],lt.prototype,"autoCenter"),wt([u()],lt.prototype,"useQuicklookExport"),wt([u()],lt.prototype,"useDepthSensing"),wt([u()],lt.prototype,"useSpatialGrab"),wt([u(ne)],lt.prototype,"defaultAvatar");let mp=lt;const gp=v("debugusdzbehaviours");class Ay{get extensionName(){return"Behaviour"}behaviours=[];addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+va.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)}),gp&&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=gp;let a=`graph LR
|
|
1284
|
+
`,l="";function c(d){if(d instanceof Xr){r&&(a+=`subgraph Group_${d.id}
|
|
1285
|
+
`);for(const p of d.actions)r&&(a+=`${d.id}[${d.id}] -- ${d.type},loops:${d.loops} --> ${p.id}[${p.id}]
|
|
1286
|
+
`),c(p);r&&(a+=`end
|
|
1287
|
+
`)}else if(d instanceof xi){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}
|
|
1288
|
+
${p}] -- ${p} --> ${g.uuid}(("${g.displayName||g.name||g.uuid}"))
|
|
1289
|
+
`);else typeof m=="object"?(i.add(m),r&&(l+=`${d.id}[${d.id}
|
|
1290
|
+
${p}] -- ${p} --> ${m.uuid}(("${m.displayName||m.name||m.uuid}"))
|
|
1291
|
+
`)):typeof m=="string"&&i.add({uuid:m});const f=d.xFormTarget;f&&(typeof f=="object"?(i.add(f),r&&(l+=`${d.id}[${d.id}
|
|
1292
|
+
${p}] -- ${p} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
|
|
1293
|
+
`)):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 or){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}
|
|
1294
|
+
${m}]
|
|
1295
|
+
`)),r&&(a+=`${d.id}((${d.id})) -- ${m} --> ${p.id}[${p.tokenId||p.id}]
|
|
1296
|
+
`)}}for(const d of this.behaviours)r&&(a+=`subgraph ${d.id}
|
|
1297
|
+
`),c(d.action),h(d.trigger,d.action),r&&(a+=`end
|
|
1298
|
+
`);r&&(a+=`
|
|
1299
|
+
`+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
|
|
1300
|
+
title Animations
|
|
1301
|
+
dateFormat X
|
|
1302
|
+
axisFormat %s
|
|
1303
|
+
`;const p=Array.from(s),m=new Set;for(const _ of p)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const w of _.affectedObjects)m.add(w);else m.add(_.affectedObjects);r&&(d+=`section ${_.animationName} (${_.id})
|
|
1304
|
+
`,d+=`${_.id} : ${_.start}, ${_.duration}s
|
|
1305
|
+
`)}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 w=_.getPath();w.startsWith("<")&&(w=w.substring(1)),w.endsWith(">")&&(w=w.substring(0,w.length-1)),f.add({path:w,obj:_})}const g=Array.from(f).sort((_,w)=>_.path.length-w.path.length),y=new Array;for(let _=0;_<g.length;_++)for(let w=_+1;w<g.length;w++)if(g[w].path.startsWith(g[_].path)){const P=g[w],M=g[_];y.push({child:P.obj.displayName+" ("+P.path+")",parent:M.obj.displayName+" ("+M.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);gp&&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){gp&&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 Iy{get extensionName(){return"Physics"}onExportObject(e,t,i){const n=x.getComponents(e,Ke).filter(l=>l.enabled),s=x.getComponents(e,en).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 Ke,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 sl){const d=a;l.appendLine('token shapeType = "Sphere"'),l.appendLine(`float radius = ${d.radius}`)}else if(a instanceof Wu){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 Uo){const d=a;l.appendLine('token shapeType = "Capsule"'),l.appendLine(`float radius = ${d.radius}`),l.appendLine(`float height = ${d.height}`)}else if(a instanceof Es&&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 eA=v("debugshadowcomponents");Ab.prototype.interactable={get(){return this.interactive},set(o){this.interactable=o}};class hn extends R{isRoot(){return this.Root?.gameObject===this.gameObject}get canvas(){const e=this.Root;return e?.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){ri.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,ch)),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,hn),!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[Ei]=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),Oc&&e.add(new Pi(.5)),this.onAfterAddedToScene(),n&&PP(),eA&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Ei]===void 0||e[Ei]===this)&&(e[Ei]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,i){if(e&&e[Ei]===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 ch extends hn{awake(){super.awake()}}var tA=Object.defineProperty,iA=Object.getOwnPropertyDescriptor,hh=(o,e,t,i)=>{for(var n=i>1?void 0:i?iA(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&&tA(e,t,n),n};const Ly=v("debugui"),Dy=v("debuguilayout");class o1{width;height}class s1{x;y;width;height}const Rn=new b,dh=new K,fp=new N,Sl=class PS extends hn{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 ee),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}sizeDelta=new ee(100,100);pivot=new ee(.5,.5);anchorMin=new ee(0,0);anchorMax=new ee(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 k,this.rectBlock.name=this.name,this.lastMatrix=new K,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new ee),il(this,"_anchoredPosition",()=>{this.markDirty()}),il(this,"sizeDelta",()=>{this.markDirty()}),il(this,"pivot",()=>{this.markDirty()}),il(this,"anchorMin",()=>{this.markDirty()}),il(this,"anchorMax",()=>{this.markDirty()})}onEnable(){super.onEnable(),this.rectBlock||(this.rectBlock=new k),this.lastMatrix||(this.lastMatrix=new K),this._lastAnchoring||(this._lastAnchoring=new ee),this._initialPosition||(this._initialPosition=new b),this._anchoredPosition||(this._anchoredPosition=new ee),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(Dy?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(Dy&&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,PS):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,Dy&&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,Rn.set(0,0,0),this.applyPivot(Rn),t.matrix.setPosition(Rn.x,Rn.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&(fp.copy(this.gameObject.quaternion),fp.x*=-1,fp.z*=-1,dh.makeRotationFromQuaternion(fp),t.matrix.premultiply(dh)),Rn.set(0,0,0),this.applyAnchoring(Rn),this.canvas?.screenspace?Rn.z+=.1:Rn.z+=.01,dh.identity(),dh.setPosition(Rn.x,Rn.y,Rn.z),t.matrix.premultiply(dh),t.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const i=!0;for(const n of gu(this.gameObject,hn,i,1)){if(n===this||!n.activeAndEnabled)continue;const s=n;s.onParentRectTransformChanged&&s.onParentRectTransformChanged(this)}}_lastAnchoring;applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new ee);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},Ly&&console.log(this.name,e);const t=new Ab(e);return this._createdBlocks.push(t),t}createNewText(e){Ly&&console.log(e),e={...this.getBasicOptions(),...e},Ly&&console.log(this.name,e);const t=new Tb(e);return this._createdTextBlocks.push(t),t}};hh([u(ee)],Sl.prototype,"anchoredPosition",1),hh([u(ee)],Sl.prototype,"sizeDelta",2),hh([u(ee)],Sl.prototype,"pivot",2),hh([u(ee)],Sl.prototype,"anchorMin",2),hh([u(ee)],Sl.prototype,"anchorMax",2);let En=Sl;var nA=Object.defineProperty,r1=(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&&nA(e,t,n),n};class Cl extends R{effectColor;effectDistance}r1([u(se)],Cl.prototype,"effectColor"),r1([u(ee)],Cl.prototype,"effectDistance");var oA=Object.defineProperty,sA=Object.getOwnPropertyDescriptor,a1=(o,e,t,i)=>{for(var n=i>1?void 0:i?sA(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&&oA(e,t,n),n};const Yr={backgroundColor:new oe(1,1,1),backgroundOpacity:1,borderColor:new oe(1,1,1),borderOpacity:1},jy=class dd extends hn{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||this._color.alpha!==e.alpha)&&(this._color||(this._color=new se(1,1,1,1)),this._color.copy(e),this.onColorChanged())}_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(),Yr.backgroundColor=this.sRGBColor,Yr.backgroundOpacity=this._color.alpha;const e=this.uiObject._simpleState__activeStates?.[0];if(e){const t=this.uiObject._simpleState__states?.[e];t&&("backgroundColor"in t&&(Yr.backgroundColor=t.backgroundColor),"backgroundOpacity"in t&&(Yr.backgroundOpacity=t.backgroundOpacity))}Yr.backgroundOpacity*=this._alphaFactor,this.applyEffects(Yr,this._alphaFactor),this.uiObject.set(Yr),this.markDirty()}}get m_Color(){return this._color}raycastTarget=!0;uiObject=null;_color=null;_rect=null;_stateManager=null;get rectTransform(){if(this._rect||(this._rect=x.getComponent(this.gameObject,En)),!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 OP(this.uiObject)),this.uiObject.setupState(e.state,e.attributes))}setOptions(e){this.makePanel(),this.uiObject&&this.uiObject.set(e)}awake(){super.awake(),this.makePanel(),il(this,"_color",()=>KR(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(Cl);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(dd.textureCache.has(e))e=dd.textureCache.get(e);else if(!e.isRenderTargetTexture){const t=e.clone();t.colorSpace=So,dd.textureCache.set(e,t),e=t}this.setOptions({backgroundImage:e,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),We.assignTextureLOD(e,0).then(t=>{t instanceof Le&&(e&&dd.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)}};a1([u(se)],jy.prototype,"color",1),a1([u()],jy.prototype,"raycastTarget",2);let uh=jy;class ph extends uh{_flippedObject=!1;onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var rA=Object.defineProperty,aA=Object.getOwnPropertyDescriptor,qo=(o,e,t,i)=>{for(var n=i>1?void 0:i?aA(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&&rA(e,t,n),n};const Zr=v("debugtext");var ct=(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))(ct||{}),l1=(o=>(o[o.Normal=0]="Normal",o[o.Bold=1]="Bold",o[o.Italic=2]="Italic",o[o.BoldAndItalic=3]="BoldAndItalic",o))(l1||{});class Wt extends uh{alignment=0;verticalOverflow=0;horizontalOverflow=0;lineSpacing=1;supportRichText=!1;font;fontStyle=0;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())}set_text(e){this.text=e}get fontSize(){return this._fontSize}set fontSize(e){this._fontSize=e,this.uiObject?.set({fontSize:e})}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){Zr&&console.log(this),this.horizontalOverflow==1&&(e.whiteSpace="pre"),this.verticalOverflow==0&&(this.context.renderer.localClippingEnabled=!0,e.overflow="hidden"),this.horizontalOverflow==1&&this.verticalOverflow==0,e.lineHeight=this.lineSpacing,delete e.backgroundOpacity,delete e.backgroundColor,Zr&&(e.backgroundColor=16750848,e.backgroundOpacity=.5);const t=this.rectTransform;e={...e,...this.getTextOpts()},this.getAlignment(e),Zr&&(e.backgroundColor=Math.random()*16777215,e.backgroundOpacity=.1),this.uiObject=t.createNewText(e),this.feedText(this.text,this.supportRichText)}onAfterAddedToScene(){super.onAfterAddedToScene(),this.handleTextRenderOnTop()}_text="";_fontSize=12;_textMeshUi=null;getTextOpts(){const e=this.fontSize,t={color:this.color,fontOpacity:this.color.alpha,fontSize:e,fontKerning:"normal"};return this.setFont(t,this.fontStyle),t}onEnable(){super.onEnable(),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)}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(Zr&&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 Lm({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 Lm(r);this.uiObject?.add(a)}else{r.textContent=e.substring(i.endIndex),this.handleTag(i,r,n);const a=new Lm(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&&(Fu(r,i),e[s]=!0)}if(!n)break;yield}}handleTag(e,t,i){if(!e.isEndTag){if(e.type.includes("color")){const n=new By(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 By(e,{fontWeight:700});i.push(n)}else if(e.type=="i"){this.setFont(t,2);const n=new By(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)return;const i=this.font,n=this.getFamilyNameWithCorrectSuffix(i,t);Zr&&console.log("Selected font family:"+n);let s=Ib.getFontFamily(n);switch(s||(s=Ib.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){(e.startsWith("https:")||e.startsWith("http:"))&&(e=new URL(e).pathname);const i=e.lastIndexOf("-");if(i<0)return e;const n=e.substring(i+1)?.toLowerCase();if(lA.includes(n))return Zr&&console.warn("Unsupported font style: "+n),e;const s=e.lastIndexOf("/");let r=e;s>=0&&(r=r.substring(s+1));const a=r[0]===r[0].toUpperCase(),l=e.substring(0,i>s?i:e.length);switch(Zr&&console.log("Select font: ",e,l1[t],r,a,l),t){case 0:return a?l+"-Regular":l+"-regular";case 1:return a?l+"-Bold":l+"-bold";case 2:return a?l+"-Italic":l+"-italic";case 3:return a?l+"-BoldItalic":l+"-bolditalic";default:return e}}}qo([u()],Wt.prototype,"alignment",2),qo([u()],Wt.prototype,"verticalOverflow",2),qo([u()],Wt.prototype,"horizontalOverflow",2),qo([u()],Wt.prototype,"lineSpacing",2),qo([u()],Wt.prototype,"supportRichText",2),qo([u(URL)],Wt.prototype,"font",2),qo([u()],Wt.prototype,"fontStyle",2),qo([u()],Wt.prototype,"text",1),qo([u()],Wt.prototype,"fontSize",1);class By{tag;previousValues;constructor(e,t){this.tag=e,this.previousValues=t}}const lA=["medium","mediumitalic","black","blackitalic","thin","thinitalic","extrabold","light","lightitalic","semibold"];class Pl{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/${sp(this.material)}>`),t.closeBlock()}}class Fy{static singleLine(e,t,i){const n=new Pl("text_"+Pl.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 Pl("text_"+Pl.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 cA=new K().makeRotationY(Math.PI),hA=new K().makeScale(-1,1,-1);class yp{get extensionName(){return"text"}exportText(e,t,i){const n=x.getComponent(e,Wt);if(!n)return;const s=x.getComponent(e,En);let r=100,a=100;s&&(r=s.width,a=s.height);const l=cA.clone();s&&l.premultiply(hA),t.setMatrix(l);const c=n.color.clone();t.material=new mt({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=Fy.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 ct.LowerLeft:case ct.MiddleLeft:case ct.UpperLeft:e.horizontalAlignment="left";break;case ct.LowerCenter:case ct.MiddleCenter:case ct.UpperCenter:e.horizontalAlignment="center";break;case ct.LowerRight:case ct.MiddleRight:case ct.UpperRight:e.horizontalAlignment="right";break}switch(t){case ct.LowerLeft:case ct.LowerCenter:case ct.LowerRight:e.verticalAlignment="bottom";break;case ct.MiddleLeft:case ct.MiddleCenter:case ct.MiddleRight:e.verticalAlignment="middle";break;case ct.UpperLeft:case ct.UpperCenter:case ct.UpperRight:e.verticalAlignment="top";break}}}var dA=Object.defineProperty,Je=(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 c1=v("debuguilayout");class Kr{left=0;right=0;top=0;bottom=0;get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}Je([u()],Kr.prototype,"left"),Je([u()],Kr.prototype,"right"),Je([u()],Kr.prototype,"top"),Je([u()],Kr.prototype,"bottom");class ji extends R{_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&&(c1&&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(){c1&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(En);const e=this.gameObject.getComponentInParent(Ol);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(Ol);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}Je([u()],ji.prototype,"childAlignment"),Je([u()],ji.prototype,"reverseArrangement"),Je([u()],ji.prototype,"spacing"),Je([u(Kr)],ji.prototype,"padding"),Je([u()],ji.prototype,"minWidth"),Je([u()],ji.prototype,"minHeight"),Je([u()],ji.prototype,"flexibleHeight"),Je([u()],ji.prototype,"flexibleWidth"),Je([u()],ji.prototype,"preferredHeight"),Je([u()],ji.prototype,"preferredWidth");class zs extends ji{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,w=0;for(let I=0;I<this.gameObject.children.length;I++){const W=this.gameObject.children[I],V=x.getComponent(W,En);V?.activeAndEnabled&&(w+=1,a?_+=V.width:_+=V.height)}let P=0;const M=this.spacing*(w-1);if(d||c){let I=0;a?I=n-=M:I=r-=M,w>0&&(P=I/w)}let O=0;O+=this.padding.left,O-=this.padding.right,g!==0&&(y=f-_,y*=g,y-=M*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 I=0;I<this.gameObject.children.length;I++){const W=this.gameObject.children[I],V=x.getComponent(W,En);if(V?.activeAndEnabled){V.pivot?.set(.5,.5),V.anchorMin.set(0,1),V.anchorMax.set(0,1);const G=i*.5+O*.5;V.anchoredPosition.x!==G&&(V.anchoredPosition.x=G);const X=s*-.5;V.anchoredPosition.y!==X&&(V.anchoredPosition.y=X),p&&h&&V.sizeDelta[l]!==m&&(V.sizeDelta[l]=m),d&&c&&V.sizeDelta[t]!==P&&(V.sizeDelta[t]=P);const E=a?V.width:V.height,$=E*.5;if(y+=$,d){const he=P*j-P*.5;he>y&&(y=he-P*.5+E+this.padding.left,y-=$)}let q=y;t==="y"&&(q=-q),V.anchoredPosition[t]!==q&&(V.anchoredPosition[t]=q),y+=$,y+=this.spacing,j+=1}}}}Je([u()],zs.prototype,"childControlHeight"),Je([u()],zs.prototype,"childControlWidth"),Je([u()],zs.prototype,"childForceExpandHeight"),Je([u()],zs.prototype,"childForceExpandWidth"),Je([u()],zs.prototype,"childScaleHeight"),Je([u()],zs.prototype,"childScaleWidth");class Uy extends zs{get primaryAxis(){return"y"}}class zy extends zs{get primaryAxis(){return"x"}}class Ny extends ji{onCalculateLayout(){}}var uA=Object.defineProperty,pA=Object.getOwnPropertyDescriptor,ao=(o,e,t,i)=>{for(var n=i>1?void 0:i?pA(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&&uA(e,t,n),n},h1=(o=>(o[o.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",o[o.ScreenSpaceCamera=1]="ScreenSpaceCamera",o[o.WorldSpace=2]="WorldSpace",o[o.Undefined=-1]="Undefined",o))(h1||{});const Vy=v("debuguilayout"),on=class OS extends ch{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=-1;_rootCanvas;set rootCanvas(e){this._rootCanvas instanceof OS||(this._rootCanvas=e)}get rootCanvas(){return this._rootCanvas}_scaleFactor=1;get scaleFactor(){return this._scaleFactor}set scaleFactor(e){this._scaleFactor=e}worldCamera;planeDistance=-1;awake(){this.shadowComponent=this.gameObject,this.previousParent=this.gameObject.parent,Vy&&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 K,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 sc(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(),ri.ensureUpdateMeshUI(Lb,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(),ri.ensureUpdateMeshUI(Lb,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 K);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);Vy&&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(ji)),(t.isDirty||i?.isDirty)&&(Vy&&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(),Fu(this.shadowComponent,this);for(const e of x.getComponentsInChildren(this.gameObject,hn))Fu(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(En);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}}};ao([u()],on.prototype,"renderOnTop",1),ao([u()],on.prototype,"depthWrite",1),ao([u()],on.prototype,"doubleSided",1),ao([u()],on.prototype,"castShadows",1),ao([u()],on.prototype,"receiveShadows",1),ao([u()],on.prototype,"renderMode",1),ao([u(on)],on.prototype,"rootCanvas",1),ao([u()],on.prototype,"scaleFactor",1),ao([u(pi)],on.prototype,"worldCamera",2),ao([u()],on.prototype,"planeDistance",2);let Ol=on;var mA=Object.defineProperty,gA=Object.getOwnPropertyDescriptor,Wy=(o,e,t,i)=>{for(var n=i>1?void 0:i?gA(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&&mA(e,t,n),n};class Ns extends R{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,hn,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}Wy([u()],Ns.prototype,"alpha",1),Wy([u()],Ns.prototype,"interactable",2),Wy([u()],Ns.prototype,"blocksRaycasts",2);class $y{get extensionName(){return"tmui"}onExportObject(e,t,i){const n=x.getComponent(e,Ol);if(n&&n.enabled&&n.renderMode===h1.WorldSpace){const s=new yp,r=x.getComponent(e,En),a=x.getComponent(e,Ns),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,hn);m&&(m.onEnable(),l.push(()=>{m.onDisable()}));const f=x.getComponent(d,En);f&&(f.onEnable(),f.updateTransform(),f.onApplyTransform(),l.push(()=>{f.onDisable()}));const g=x.getComponent(d,Wt);g&&(g.onEnable(),l.push(()=>{g.onDisable()})),l.push(()=>{x.setActive(d,p)})}}),r.width,r.height;const c=ot.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=ot.createEmpty();g.setMatrix(f.matrix);const y=f.parent,_=!!y&&typeof y.textContent=="string"&&y.textContent.length>0;let w=m.get(y)||1;const P=x.getComponent(f,Ns);if(P&&(w*=P.alpha),f instanceof H&&_){const O=f[Ei];O?s.exportText(O.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 O=f.geometry.clone();O.scale(1,1,-1),this.flipWindingOrder(O),g.geometry=O;const j=new oe,I=f.material.opacity;j.copy(f.material.color),g.material=new Se({color:j,opacity:I*w,map:f.material.map,transparent:!0})}p.set(f,g),m.set(f,w);const M=p.get(y);if(!M){console.error("Error when exporting UI: shadow component parent not found!",f,f.parent);return}M.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 mh=v("debugusdz");function fA(o,e){const t=[],i=x.getComponentsInChildren(o,bt),n=x.getComponentsInChildren(o,Ft),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 ih;c.animator=a,c.stateName=l.name,c.trigger="start",c.name="PlayAnimationOnClick_implicitAtStart_"+c.stateName;const h=new k;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;mh&&console.log(a);const l=[];for(const c of a.runtimeAnimatorController.enumerateActions()){mh&&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 ih;l.animation=a,l.stateName=a.clip.name,l.trigger="start",l.name="PlayAnimationOnClick_implicitAtStart_"+l.stateName;const c=new k;x.addComponent(c,l),r.push(c),s.push(a),o.add(c)}else for(const a of n){mh&&console.log(a);const l=[];for(const c of a.animations)l.includes(c)||l.push(c);t.push({root:a.gameObject,clips:l})}mh&&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 yA(o,e){const t=x.getComponentsInChildren(o,Ii),i=x.getComponentsInChildren(o,Ls),n=new Array,s=new Array;mh&&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 Ls;a.target=r,a.name="PlayAudioOnClick_implicitAtStart_",a.trigger="start";const l=new k;x.addComponent(l,a),console.log("implicit PlayAudioOnStart",l,a),s.push(l),n.push(r),o.add(l)}return s}function bA(o){return new Lt("DisableAtStart",Vt.sceneStartTrigger(),ye.fadeAction(o,0,!1))}function d1(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 _A=Object.defineProperty,Rt=(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};const Et=v("debugusdz"),vA=v("debugusdzpruning");class Jr{callToAction;checkoutTitle;checkoutSubtitle;callToActionURL}Rt([u()],Jr.prototype,"callToAction"),Rt([u()],Jr.prototype,"checkoutTitle"),Rt([u()],Jr.prototype,"checkoutSubtitle"),Rt([u()],Jr.prototype,"callToActionURL");const yi=class ba extends R{static beforeExport=new de;static afterExport=new de;static beforeLODExport=new de;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(){Et&&(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=L.supportsQuickLookAR(),t=L.isiOS()||L.isiPad();!this.button&&(Et||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=d1(this.context,e),this.link.addEventListener("message",this.lastCallback)),Et&&Ee("USDZ Exporter enabled: "+this.name),document.getElementById("open-in-ar")?.addEventListener("click",this.onClickedOpenInARElement),bc.registerExporter(this)}onDisable(){this.button?.remove(),this.link?.removeEventListener("message",this.lastCallback),Et&&Ee("USDZ Exporter disabled: "+this.name),document.getElementById("open-in-ar")?.removeEventListener("click",this.onClickedOpenInARElement),bc.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+="-"+Tx(),Qn()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=d1(this.context,L.supportsQuickLookAR())),this.customUsdzFile)return Et&&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;ba.beforeExport.invoke({exporter:this});const t=await this.export(this.objectToExport).finally(()=>{ba.afterExport.invoke({exporter:this})});return t?(Et&&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:M=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:M}}))}}),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,fi);for(const M of t)M&&M.enabled&&M.updateSprite(!0);const i=x.getComponentsInChildren(e,Jt),n=new Array;let s=0;for(const M of i){for(const O of M.sharedMeshes)if(O){let j=0;const I={exporter:this,type:"mesh",object:M.gameObject,mesh:O};if(ba.beforeLODExport.invoke(I),I.overrideLevel!==void 0)if(I.overrideLevel===-1){Et&&console.warn("Skipping LOD export for mesh due to overrideLevel -1",M.gameObject,O);continue}else I.overrideLevel>=0&&(j=I.overrideLevel,Et&&console.log("Overriding LOD level for mesh export to level "+j+" "+O.name));const W=We.assignMeshLOD(O,j);W instanceof Promise&&n.push(new Promise((V,G)=>{W.then(()=>{s++,le.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:s,totalSteps:n.length}),V()}).catch(X=>G(X))}))}for(const O of M.sharedMaterials)if(O){let j=0;const I={exporter:this,type:"texture",object:M.gameObject,material:O};if(ba.beforeLODExport.invoke(I),I.overrideLevel!==void 0)if(I.overrideLevel===-1){Et&&console.warn("Skipping LOD assignment due to overrideLevel -1",M.gameObject,O);continue}else I.overrideLevel>=0&&(j=I.overrideLevel,Et&&console.log("Overriding LOD level for texture export to level "+j+" "+O.name));const W=We.assignTextureLOD(O,j);W instanceof Promise&&n.push(new Promise((V,G)=>{W.then(()=>{s++,le.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:s,totalSteps:n.length}),V()}).catch(X=>G(X))}))}}Et&&Ee("Progressive Loading: "+n.length),await Promise.all(n),Et&&Ee("Progressive Loading: done"),le.end("export-usdz-textures");const r=si.Global.Mask;si.Global.Set(eo.AR);const a=new Bx,l=new lp(this.quickLookCompatible);let c;const h=[];this.interactive&&(h.push(new Ay),h.push(new va),globalThis.NEEDLE_USE_RAPIER&&x.getComponentsInChildren(e,Ke).length>0&&(this.physics?(c=new Iy,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 yp),h.push(new $y));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(...fA(e,l)),d.find(M=>M.extensionName==="Audio")&&this.autoExportAudioSources&&m.push(...yA(e)),a.debug=Et,a.pruneUnusedNodes=!vA;const f=wa.instance.objs.map(M=>M.batchedMesh);a.keepObject=M=>{let O=!0;const j=x.getComponent(M,Jt);return j&&!j.enabled&&(O=!1),O&&f.includes(M)&&(O=!1),O&&x.getComponentInParent(M,Xc)&&(O=!1),O&&x.getComponentInParent(M,Yn)&&(O=!1),Et&&!O&&console.log("USDZExporter: Discarding object",M),O},a.beforeWritingDocument=()=>{if(A()&&l&&c){const M=l.animatedRoots;for(const O of M){const j=x.getComponentsInChildren(O,Ke).filter(W=>W.enabled),I=x.getComponents(O,en).filter(W=>W.enabled&&!W.isTrigger);(j.length>0||I.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.",O)}}};const g=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(M=>{M.visible||g.push(M)});const y=d.find(M=>M.extensionName==="Behaviour");this.interactive&&y&&g.length>0&&y.addBehavior(bA(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 w=await a.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:d,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:_}),P=new Blob([w],{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 M of m)x.destroy(M);return si.Global.Set(r),le.end("export-usdz"),P}openInQuickLook(e,t){const i=e instanceof Blob?URL.createObjectURL(e):e,n=this.buildQuicklookOverlay();Et&&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){ba.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"){Et&&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");Et&&Ee("Quicklook url: "+n),n&&(Qn()?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),Qn()||(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 K().makeRotationY(Math.PI);static invertForwardQuaternion=new N().setFromEuler(new st(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(mp);let t=x.getComponentInParent(this.objectToExport,Vi);t||(t=x.getComponentInChildren(this.objectToExport,Vi));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(ba.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=sr.getOrCreate().createQuicklookButton();return e.parentNode||this.context.menu.appendChild(e),e}};Rt([u(k)],yi.prototype,"objectToExport"),Rt([u()],yi.prototype,"autoExportAnimations"),Rt([u()],yi.prototype,"autoExportAudioSources"),Rt([u()],yi.prototype,"exportFileName"),Rt([u(URL)],yi.prototype,"customUsdzFile"),Rt([u(Jr)],yi.prototype,"customBranding"),Rt([u()],yi.prototype,"anchoringType"),Rt([u()],yi.prototype,"maxTextureSize"),Rt([u()],yi.prototype,"planeAnchoringAlignment"),Rt([u()],yi.prototype,"interactive"),Rt([u()],yi.prototype,"physics"),Rt([u()],yi.prototype,"allowCreateQuicklookButton"),Rt([u()],yi.prototype,"quickLookCompatible");let Tn=yi;var wA=Object.defineProperty,xA=Object.getOwnPropertyDescriptor,Hy=(o,e,t,i)=>{for(var n=xA(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wA(e,t,n),n};class kl extends R{get fog(){return this._fog||(this._fog=new sb(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)}}Hy([u()],kl.prototype,"near"),Hy([u()],kl.prototype,"far"),Hy([u(oe)],kl.prototype,"color");var SA=Object.defineProperty,Gy=(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&&SA(e,t,n),n};class ea extends R{objectBounds=!1;color;isGizmo=!0;_gizmoObject=null;_boxHelper=null;onEnable(){this.isGizmo&&!Oc||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new RC(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=Mg(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}}Gy([u()],ea.prototype,"objectBounds"),Gy([u(oe)],ea.prototype,"color"),Gy([u()],ea.prototype,"isGizmo");var CA=Object.defineProperty,qy=(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&&CA(e,t,n),n};class Ml extends R{isGizmo=!1;color0;color1;gridHelper;size;divisions;offset;onEnable(){if(this.isGizmo&&!Oc)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new gm(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)}}qy([u()],Ml.prototype,"isGizmo"),qy([u(oe)],Ml.prototype,"color0"),qy([u(oe)],Ml.prototype,"color1");var PA=Object.defineProperty,Xy=(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&&PA(e,t,n),n};class Qy extends R{connectedBody;get rigidBody(){return this._rigidBody}_rigidBody=null;onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(Ke)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}Xy([u(Ke)],Qy.prototype,"connectedBody");class Yy extends Qy{createJoint(e,t){this.context.physics.engine?.addFixedJoint(e,t)}}class gh extends Qy{anchor;axis;createJoint(e,t){this.axis&&this.anchor&&this.context.physics.engine?.addHingeJoint(e,t,this.anchor,this.axis)}}Xy([u(b)],gh.prototype,"anchor"),Xy([u(b)],gh.prototype,"axis");var OA=Object.defineProperty,kA=Object.getOwnPropertyDescriptor,lo=(o,e,t,i)=>{for(var n=i>1?void 0:i?kA(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&&OA(e,t,n),n};function Zy(o){return o*Math.PI/180}const u1=300,Vs=v("debuglights");class bi extends R{type=0;range=1;spotAngle=1;innerSpotAngle=1;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){if(this._intensity=e,this.light){let t=1;if(this.context.isInXR&&this._webARRoot){const i=this._webARRoot?.arScale;typeof i=="number"&&i>0&&(t/=i)}this.light.intensity=e*t}Vs&&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),Vs&&console.log(this.name,this)}onEnable(){Vs&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Vs&&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(){Vs&&console.log("DISABLE LIGHT",this.name),this.light&&(this.selfIsLight?this.light.intensity=0:this.light.visible=!1)}_webXRStartedListener;_webXREndedListener;_webARRoot;onEnterXR(e){this._webARRoot=x.getComponentInParent(this.gameObject,Vi)??void 0}onLeaveXR(e){}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 fm(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-u1*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),gr(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Vs){const r=new TC(this.light,.2,this.color);this.context.scene.add(r)}break;case 0:const i=new EC(this.color,this.intensity*Math.PI,this.range,Zy(this.spotAngle/2),1-Zy(this.innerSpotAngle/2)/Zy(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 ym(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),Vs&&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=u1*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,Vs&&this.context.scene.add(new AC(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))}setDirectionalLight(e){e.add(e.target),e.target.position.set(0,0,-1)}}lo([u()],bi.prototype,"type",2),lo([u(oe)],bi.prototype,"color",1),lo([u()],bi.prototype,"shadowNearPlane",1),lo([u()],bi.prototype,"shadowBias",1),lo([u()],bi.prototype,"shadowNormalBias",1),lo([u()],bi.prototype,"shadows",1),lo([u()],bi.prototype,"lightmapBakeType",2),lo([u()],bi.prototype,"intensity",1),lo([u()],bi.prototype,"shadowDistance",1),lo([u()],bi.prototype,"shadowResolution",1),new b(0,0,0);var MA=Object.defineProperty,fh=(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 Ky=v("debuglods"),RA=v("nolods");class Rl{screenRelativeTransitionHeight;distance;renderers}fh([u()],Rl.prototype,"screenRelativeTransitionHeight"),fh([u()],Rl.prototype,"distance"),fh([u(Jt)],Rl.prototype,"renderers");class EA{model;get renderers(){return this.model.renderers}constructor(e){this.model=e}}class yh extends R{fadeMode=0;localReferencePoint=void 0;lodCount=0;size=0;animateCrossFading=!1;lodModels;_lods=[];_settings=[];_lodsHandler;start(){if(Ky&&console.log("LODGROUP",this.name,this.lodModels,this),!RA&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const i of this.lodModels){const n=new EA(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 IC;this._lodsHandler.push(n),this.gameObject.add(n)}const t=new k;t.name="Cull "+this.name;for(let i=0;i<e.length;i++){const n=e[i],s=this._lodsHandler[i],r=n.gameObject;Ky&&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}Ky&&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}}}}fh([u(b)],yh.prototype,"localReferencePoint"),fh([u(Rl)],yh.prototype,"lodModels");var TA=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&&TA(e,t,n),n};const bp=v("debugnestedgltf");class bh extends R{filePath;loaded=new de;loadAssetInParent=!0;_isLoadingOrDoneLoading=!1;listenToProgress(e){this.filePath?.beginListenDownload(e)}preload(){return this.filePath?.preload()||null}async start(){if(this._isLoadingOrDoneLoading)return;bp&&console.log(this,this.guid);const e=this.gameObject.parent;if(e&&this.filePath){this._isLoadingOrDoneLoading=!0;const t=new Fn;t.idProvider=new Dt(this.hash(this.guid)),t.parent=this.loadAssetInParent!==!1?e:this.gameObject,this.gameObject.updateMatrix();const i=this.gameObject.matrix;bp&&console.log("Load nested:",this.filePath?.url??this.filePath,this.gameObject.position);const n=await this.filePath?.instantiate?.call(this.filePath,t);bp&&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})),bp&&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}}p1([u(ne)],bh.prototype,"filePath"),p1([u(de)],bh.prototype,"loaded");var AA=Object.defineProperty,Jy=(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&&AA(e,t,n),n};const IA=v("debugnet"),_p=class J0 extends R{url=null;urlParameterName=null;localhost=null;awake(){IA&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?J0.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const i=v(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=J0.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 $i(e)}};Jy([u()],_p.prototype,"url"),Jy([u()],_p.prototype,"urlParameterName"),Jy([u()],_p.prototype,"localhost");let e0=_p;var LA=Object.defineProperty,vp=(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&&LA(e,t,n),n};class ta extends R{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=J(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 dr(this.gameObject.up,0),l=J(this.referenceSpace);a.setFromNormalAndCoplanarPoint(this.gameObject.up,l);const c=new b(0,0,0);a.projectPoint(e,c),e.copy(c)}this.affectPosition&&ft(this.gameObject,e);const n=new st(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),s=new N().setFromEuler(n);this.affectRotation&&bn(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)}}vp([u(x)],ta.prototype,"referenceSpace"),vp([u(x)],ta.prototype,"from"),vp([u(b)],ta.prototype,"positionOffset"),vp([u(b)],ta.prototype,"rotationOffset");var DA=Object.defineProperty,Ws=(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};class _i{time=0;value=0;inTangent=1/0;inWeight;outTangent=1/0;outWeight;weightedMode;constructor(e=0,t=0){this.time=e,this.value=t}}Ws([u()],_i.prototype,"time"),Ws([u()],_i.prototype,"value"),Ws([u()],_i.prototype,"inTangent"),Ws([u()],_i.prototype,"inWeight"),Ws([u()],_i.prototype,"outTangent"),Ws([u()],_i.prototype,"outWeight"),Ws([u()],_i.prototype,"weightedMode");const m1=class ud{static linearFromTo(e,t,i){const n=new ud,s=new _i;s.time=0,s.value=e;const r=new _i;return r.time=i,r.value=t,n.keys.push(s,r),n}static constant(e){const t=new ud,i=new _i;return i.time=0,i.value=e,t.keys.push(i),t}keys=[];clone(){const e=new ud;return e.keys=this.keys?.map(t=>{const i=new _i;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:ud.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,w=_*_,P=w*_;return m*P+f*w+g*_+y}};Ws([u(_i)],m1.prototype,"keys");let _h=m1;var jA=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&&jA(e,t,n),n};const wp=v("debugparticles");var Xo=(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))(Xo||{});class ia{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()],ia.prototype,"alphaKeys"),S([u()],ia.prototype,"colorKeys");var vh=(o=>(o[o.Local=0]="Local",o[o.World=1]="World",o[o.Custom=2]="Custom",o))(vh||{}),xp=(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))(xp||{});const Qo=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()],Qo.prototype,"mode"),S([u()],Qo.prototype,"constant"),S([u()],Qo.prototype,"constantMin"),S([u()],Qo.prototype,"constantMax"),S([u(_h)],Qo.prototype,"curve"),S([u(_h)],Qo.prototype,"curveMin"),S([u(_h)],Qo.prototype,"curveMax"),S([u()],Qo.prototype,"curveMultiplier");let Y=Qo;const $s=class It{static constant(e){const t=new It;return t.constant(e),t}static betweenTwoColors(e,t){const i=new It;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,It._temp),It._temp;case 2:case"TwoColors":return It._temp.lerpColors(this.colorMin,this.colorMax,i);case 3:case"TwoGradients":return this.gradientMin.evaluate(e,It._temp),this.gradientMax.evaluate(e,It._temp2),It._temp.lerp(It._temp2,i);case 4:case"RandomColor":const n=Math.random();return this.gradientMin.evaluate(e,It._temp),this.gradientMax.evaluate(e,It._temp2),It._temp.lerp(It._temp2,n)}return It._temp.set(16777215),It._temp.alpha=1,It._temp}};S([u()],$s.prototype,"mode"),S([u(se)],$s.prototype,"color"),S([u(se)],$s.prototype,"colorMin"),S([u(se)],$s.prototype,"colorMax"),S([u(ia)],$s.prototype,"gradient"),S([u(ia)],$s.prototype,"gradientMin"),S([u(ia)],$s.prototype,"gradientMax");let na=$s;var t0=(o=>(o[o.Hierarchy=0]="Hierarchy",o[o.Local=1]="Local",o[o.Shape=2]="Shape",o))(t0||{});class $t{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)],$t.prototype,"gravityModifier"),S([u(na)],$t.prototype,"startColor"),S([u(Y)],$t.prototype,"startDelay"),S([u(Y)],$t.prototype,"startLifetime"),S([u(Y)],$t.prototype,"startRotation"),S([u(Y)],$t.prototype,"startRotationX"),S([u(Y)],$t.prototype,"startRotationY"),S([u(Y)],$t.prototype,"startRotationZ"),S([u(Y)],$t.prototype,"startSize"),S([u(Y)],$t.prototype,"startSizeX"),S([u(Y)],$t.prototype,"startSizeY"),S([u(Y)],$t.prototype,"startSizeZ"),S([u(Y)],$t.prototype,"startSpeed");class Sp{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 Yo{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()],Yo.prototype,"enabled"),S([u()],Yo.prototype,"bursts"),S([u(Y)],Yo.prototype,"rateOverTime"),S([u()],Yo.prototype,"rateOverTimeMultiplier"),S([u(Y)],Yo.prototype,"rateOverDistance"),S([u()],Yo.prototype,"rateOverDistanceMultiplier");class Cp{enabled;color}S([u(na)],Cp.prototype,"color");class oa{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)],oa.prototype,"size"),S([u(Y)],oa.prototype,"x"),S([u(Y)],oa.prototype,"y"),S([u(Y)],oa.prototype,"z");const et=class md{get type(){return xp[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 md}shapeType=5;enabled=!0;alignToDirection=!1;angle=0;arc=360;arcSpread;arcSpeedMultiplier;arcMode;boxThickness;position;rotation;_rotation=new st;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 K;_worldSpaceMatrixInverse=new K;constructor(){wp&&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 LC;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:wp&&F.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:",xp[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)),wp&&F.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=B(),g=B(),y=B();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),wp&&(F.DrawSphere(t,.01,8925952,.5,!0),F.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=md._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=md._randomQuat,n=md._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()],et.prototype,"shapeType"),S([u()],et.prototype,"enabled"),S([u()],et.prototype,"alignToDirection"),S([u()],et.prototype,"angle"),S([u()],et.prototype,"arc"),S([u()],et.prototype,"arcSpread"),S([u()],et.prototype,"arcSpeedMultiplier"),S([u()],et.prototype,"arcMode"),S([u(b)],et.prototype,"boxThickness"),S([u(b)],et.prototype,"position"),S([u(b)],et.prototype,"rotation"),S([u(b)],et.prototype,"scale"),S([u()],et.prototype,"radius"),S([u()],et.prototype,"radiusThickness"),S([u()],et.prototype,"sphericalDirectionAmount"),S([u()],et.prototype,"randomDirectionAmount"),S([u()],et.prototype,"randomPositionAmount"),S([u()],et.prototype,"meshShapeType"),S([u(Kc)],et.prototype,"meshRenderer");let i0=et;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 Fe{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()],Fe.prototype,"enabled"),S([u()],Fe.prototype,"attachRibbonToTransform"),S([u(na)],Fe.prototype,"colorOverLifetime"),S([u(na)],Fe.prototype,"colorOverTrail"),S([u()],Fe.prototype,"dieWithParticles"),S([u()],Fe.prototype,"inheritParticleColor"),S([u(Y)],Fe.prototype,"lifetime"),S([u()],Fe.prototype,"lifetimeMultiplier"),S([u()],Fe.prototype,"minVertexDistance"),S([u()],Fe.prototype,"mode"),S([u()],Fe.prototype,"ratio"),S([u()],Fe.prototype,"ribbonCount"),S([u()],Fe.prototype,"shadowBias"),S([u()],Fe.prototype,"sizeAffectsLifetime"),S([u()],Fe.prototype,"sizeAffectsWidth"),S([u()],Fe.prototype,"splitSubEmitterRibbons"),S([u()],Fe.prototype,"textureMode"),S([u(Y)],Fe.prototype,"widthOverTrail"),S([u()],Fe.prototype,"widthOverTrailMultiplier"),S([u()],Fe.prototype,"worldSpace");class $e{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 K;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,w=Math.cos(_*f),P=Math.sin(_*f),M=Math.cos(_*g),O=Math.sin(_*g),j=Math.cos(_*y),I=Math.sin(_*y),W=m.x*(M*j)+m.y*(M*I)+m.z*-O,V=m.x*(P*O*j-w*I)+m.y*(P*O*I+w*j)+m.z*(P*M),G=m.x*(w*O*j+P*I)+m.y*(w*O*I-P*j)+m.z*(w*M),X=this._temp3.set(m.x-W,m.y-V,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()],$e.prototype,"enabled"),S([u()],$e.prototype,"space"),S([u(Y)],$e.prototype,"orbitalX"),S([u(Y)],$e.prototype,"orbitalY"),S([u(Y)],$e.prototype,"orbitalZ"),S([u()],$e.prototype,"orbitalXMultiplier"),S([u()],$e.prototype,"orbitalYMultiplier"),S([u()],$e.prototype,"orbitalZMultiplier"),S([u()],$e.prototype,"orbitalOffsetX"),S([u()],$e.prototype,"orbitalOffsetY"),S([u()],$e.prototype,"orbitalOffsetZ"),S([u(Y)],$e.prototype,"speedModifier"),S([u()],$e.prototype,"speedModifierMultiplier"),S([u(Y)],$e.prototype,"x"),S([u()],$e.prototype,"xMultiplier"),S([u(Y)],$e.prototype,"y"),S([u()],$e.prototype,"yMultiplier"),S([u(Y)],$e.prototype,"z"),S([u()],$e.prototype,"zMultiplier");class Ht{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()],Ht.prototype,"animation"),S([u()],Ht.prototype,"enabled"),S([u()],Ht.prototype,"cycleCount"),S([u(Y)],Ht.prototype,"frameOverTime"),S([u()],Ht.prototype,"frameOverTimeMultiplier"),S([u()],Ht.prototype,"numTilesX"),S([u()],Ht.prototype,"numTilesY"),S([u(Y)],Ht.prototype,"startFrame"),S([u()],Ht.prototype,"startFrameMultiplier"),S([u()],Ht.prototype,"rowMode"),S([u()],Ht.prototype,"rowIndex"),S([u()],Ht.prototype,"spriteCount"),S([u()],Ht.prototype,"timeMode");class An{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()],An.prototype,"enabled"),S([u()],An.prototype,"separateAxes"),S([u(Y)],An.prototype,"x"),S([u()],An.prototype,"xMultiplier"),S([u(Y)],An.prototype,"y"),S([u()],An.prototype,"yMultiplier"),S([u(Y)],An.prototype,"z"),S([u()],An.prototype,"zMultiplier");class sn{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()],sn.prototype,"enabled"),S([u()],sn.prototype,"range"),S([u()],sn.prototype,"separateAxes"),S([u(Y)],sn.prototype,"x"),S([u()],sn.prototype,"xMultiplier"),S([u(Y)],sn.prototype,"y"),S([u()],sn.prototype,"yMultiplier"),S([u(Y)],sn.prototype,"z"),S([u()],sn.prototype,"zMultiplier");class ht{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()],ht.prototype,"enabled"),S([u()],ht.prototype,"dampen"),S([u(Y)],ht.prototype,"drag"),S([u()],ht.prototype,"dragMultiplier"),S([u(Y)],ht.prototype,"limit"),S([u()],ht.prototype,"limitMultiplier"),S([u()],ht.prototype,"separateAxes"),S([u(Y)],ht.prototype,"limitX"),S([u()],ht.prototype,"limitXMultiplier"),S([u(Y)],ht.prototype,"limitY"),S([u()],ht.prototype,"limitYMultiplier"),S([u(Y)],ht.prototype,"limitZ"),S([u()],ht.prototype,"limitZMultiplier"),S([u()],ht.prototype,"multiplyDragByParticleSize"),S([u()],ht.prototype,"multiplyDragByParticleVelocity"),S([u()],ht.prototype,"space");const wh=class kS{enabled;curve;curveMultiplier;mode;clone(){const e=new kS;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()],wh.prototype,"enabled"),S([u(Y)],wh.prototype,"curve"),S([u()],wh.prototype,"curveMultiplier"),S([u()],wh.prototype,"mode");let n0=wh;class vi{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()],vi.prototype,"enabled"),S([u(ee)],vi.prototype,"range"),S([u()],vi.prototype,"separateAxes"),S([u(Y)],vi.prototype,"size"),S([u()],vi.prototype,"sizeMultiplier"),S([u(Y)],vi.prototype,"x"),S([u()],vi.prototype,"xMultiplier"),S([u(Y)],vi.prototype,"y"),S([u()],vi.prototype,"yMultiplier"),S([u(Y)],vi.prototype,"z"),S([u()],vi.prototype,"zMultiplier");class El{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()],El.prototype,"enabled"),S([u(ee)],El.prototype,"range"),S([u(na)],El.prototype,"color"),new b(1,1,1),new b(0,0,1);class o0{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 Mi(()=>new Im,s)}type="NeedleParticleSubEmitter";emitterType;emitterProbability;q_=new N;v_=new b;v2_=new b;_emitterMatrix=new Im;_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===s0.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===s0.Death){let n=e.life;if(e[Tl]!==void 0&&(n=e[Tl]),!(e.age+t*1.2>=n))return;const s=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=s}const i=new Im;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 BA=Object.defineProperty,Ue=(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 Hs=v("debugparticles"),FA=v("noprogressive"),UA=v("debugprogressive");var s0=(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))(s0||{});class rn extends R{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"){Hs&&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=So,t.map.premultiplyAlpha=!1);const i=new Se;i.copy(t),e?this.trailMaterial=i:this.particleMaterial=i}t.map&&(t.map.colorSpace=So,t.map.premultiplyAlpha=!1),e&&t.side===gs&&(t=t.clone(),t.side=Md,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!FA&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,UA&&console.log("Load material LOD",t.name),We.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof H&&(t=this.particleMesh.geometry),t===null)){t=new zn(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())}}Ue([u()],rn.prototype,"renderMode"),Ue([u(we)],rn.prototype,"particleMaterial"),Ue([u(we)],rn.prototype,"trailMaterial"),Ue([u()],rn.prototype,"maxParticleSize"),Ue([u()],rn.prototype,"minParticleSize"),Ue([u()],rn.prototype,"velocityScale"),Ue([u()],rn.prototype,"cameraVelocityScale"),Ue([u()],rn.prototype,"lengthScale");class Pp{_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 r0{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 zA extends r0{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class NA extends r0{_lastPosition=new b;_lastDistance=0;update(){const e=J(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 VA extends r0{genValue(){return this.system.isPlaying,0}}class Gs{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 WA extends Gs{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 g1=Symbol("particleRotation");class $A extends Gs{type="NeedleRotation";initialize(e){e[g1]=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[g1])*t:this.system.renderer.renderMode===Xo.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const n=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(i,n)*t}}}const f1=Symbol("sizeLerpFactor"),HA=new b;class GA extends Gs{type="NeedleSize";_minSize=0;_maxSize=1;initialize(e){e[f1]=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[f1]).x);let s=1;this.system.renderer.renderMode!==Xo.Mesh&&(s=this.system.worldScale.x/this.system.cameraScale);const r=B(e.startSize).multiplyScalar(n*s);if(e.size.set(r.x,r.y,r.z),this.system.localspace){const a=w1(this.system,HA);e.size.x*=a.x,e.size.y*=a.y,e.size.z*=a.z}}}const Tl=Symbol("particleLife"),a0=Symbol("trailLifetime"),y1=Symbol("trailStartLength"),l0=Symbol("trailWidthRandom");class qA extends Gs{type="NeedleTrail";initialize(e){e instanceof Eb&&(e[Tl]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[a0]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[a0]),e[y1]=e.length,e[l0]=Math.random())}update(e){if(this.system.trails?.enabled&&e instanceof Eb){const t=e,i=e.age/e[Tl],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[l0]);c.x=h,c.y=h,c.z=h}a.size=this.system.trails.getWidth(c.x,i,l,t[l0]),a.color.copy(e.color),this.system.trails.getColor(a.color,i,l)}if(e.age>e[Tl]){e.velocity.set(0,0,0);const r=(e.age-e[Tl])/e[a0];t.length=D.lerp(e[y1],0,r)}}}}const Op=Symbol("startVelocity"),b1=Symbol("gravityModifier"),c0=Symbol("gravitySpeed"),kp=Symbol("velocity lerp factor"),h0=new b;class XA extends Gs{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[Op]?e[Op].copy(e.velocity):e[Op]=e.velocity.clone();const n=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[b1]=n*t,e[c0]=n*t*.5,e[kp]=Math.random(),this.system.velocityOverLifetime?.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===vh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){const i=e[Op],n=e[b1];if(n!==0){const d=n*e[c0];h0.copy(this._gravityDirection).multiplyScalar(d),e[c0]+=t*.05,i.add(h0)}e.velocity.copy(i);const s=e.age/e.life;this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,s,e[kp]);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[kp],e.size));const l=this.system.colorBySpeed;l?.enabled&&l.evaluate(e.velocity,e[kp],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 _1=Symbol("colorLerpFactor"),v1=new se(1,1,1,1),sa=new se(1,1,1,1);class QA extends Gs{type="NeedleColor";initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;sa.copy(this.system.main.startColor.evaluate(Math.random())),t?.color&&(v1.copy(t.color),sa.multiply(v1)),sa.convertLinearToSRGB(),e.startColor.set(sa.r,sa.g,sa.b,sa.alpha),e.color.copy(e.startColor),e[_1]=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[_1]);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 YA{system;emission;get anim(){return this.system.textureSheetAnimation}constructor(e){this.system=e,this.emission=new NA(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 Pp(this.system.main.startLifetime)}get startSpeed(){return new Pp(this.system.main.startSpeed)}get startRotation(){return new Pp(this.system.main.startRotation)}get startSize(){return new Pp(this.system.main.startSize)}startLength;get startColor(){return new vP(new wP(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new VA(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 Oo.Trail;switch(this.system.renderer.renderMode){case Xo.Billboard:return Oo.BillBoard;case Xo.Stretch:return Oo.StretchedBillBoard;case Xo.HorizontalBillboard:return Oo.HorizontalBillBoard;case Xo.VerticalBillboard:return Oo.VerticalBillBoard;case Xo.Mesh:return Oo.Mesh}return Oo.BillBoard}rendererEmitterSettings={startLength:new xP(220),followLocalOrigin:!1};get speedFactor(){let e=this.system.main.simulationSpeed;return this.system.renderer?.renderMode===Xo.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=So,this.clonedTexture.original=t,this.clonedTexture.clone=i}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=sf(new se(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new zA(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??DC}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===vh.World}}class ZA{burstParticleIndex=0;burstParticleCount=0;isBursting=!1;travelDistance=0;previousWorldPos;burstIndex=0;burstWaveIndex=0;time=0;waitEmiting=0}const Gt=class cm extends R{play(e=!1){e&&x.foreachComponent(this.gameObject,t=>{t instanceof cm&&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 cm&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&x.foreachComponent(this.gameObject,i=>{i instanceof cm&&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 ZA),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===vh.World}get localspace(){return this.main.simulationSpace===vh.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,J(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof Gs&&(e.system=this),Hs&&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()||Hs)&&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 Sp)){const n=new Sp;Ha(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 Mp)){const n=new Mp;Ha(n,i),e[t]=n}}Hs&&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(rn),!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 k,this._container.matrixAutoUpdate=!1,this.context.scene.add(this._container),this._batchSystem=new bP,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new YA(this),this._particleSystem=new _P(this._interface),this._particleSystem.addBehavior(new GA(this)),this._particleSystem.addBehavior(new QA(this)),this._particleSystem.addBehavior(new WA(this)),this._particleSystem.addBehavior(new $A(this)),this._particleSystem.addBehavior(new XA(this)),this._particleSystem.addBehavior(new qA(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),Hs&&(console.log(this),this.gameObject.add(new Pi(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof H&&this._interface.renderMode==Oo.Mesh&&We.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==Oo.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();Hs&&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=w1(this,h0);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 o0(this,this._particleSystem,e.particleSystem,t);i.emitterType=e.type,i.emitterProbability=e.emitProbability,this._particleSystem.addBehavior(i)}else Hs&&console.warn("Could not add SubParticleSystem",e,this)}}};Ue([u(Cp)],Gt.prototype,"colorOverLifetime"),Ue([u($t)],Gt.prototype,"main"),Ue([u(Yo)],Gt.prototype,"emission"),Ue([u(oa)],Gt.prototype,"sizeOverLifetime"),Ue([u(i0)],Gt.prototype,"shape"),Ue([u(ve)],Gt.prototype,"noise"),Ue([u(Fe)],Gt.prototype,"trails"),Ue([u($e)],Gt.prototype,"velocityOverLifetime"),Ue([u(ht)],Gt.prototype,"limitVelocityOverLifetime"),Ue([u(n0)],Gt.prototype,"inheritVelocity"),Ue([u(El)],Gt.prototype,"colorBySpeed"),Ue([u(Ht)],Gt.prototype,"textureSheetAnimation"),Ue([u(An)],Gt.prototype,"rotationOverLifetime"),Ue([u(sn)],Gt.prototype,"rotationBySpeed"),Ue([u(vi)],Gt.prototype,"sizeBySpeed");let xh=Gt;class Mp{particleSystem;emitProbability=1;properties;type;_deserialize(e,t){const i=this.particleSystem;if(i instanceof xh)return;let n="";i&&typeof i.guid=="string"&&(n=i.guid,this.particleSystem=x.findByGuid(n,t)),Hs&&!(this.particleSystem instanceof xh)&&console.warn("Could not find particle system for sub emitter",n,t,this)}}function w1(o,e){if(e.set(1,1,1),o.gameObject.parent&&o.localspace)switch(o.main.scalingMode){case t0.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 "+t0[o.main.scalingMode]+" is not supported";A()&&be(t),console.warn(t,o.name,o)}e=Ge(o.gameObject,e);break}return e}var KA=Object.defineProperty,d0=(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&&KA(e,t,n),n};class Al extends R{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))})}}d0([u()],Al.prototype,"strength"),d0([u()],Al.prototype,"radius"),d0([u(Ke)],Al.prototype,"targets");class Yl extends R{_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 nf(.2),!this.tryAssignColor()););}tryAssignColor=()=>{const e=x.getComponentInParent(this.gameObject,nn);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=x.getComponentInParent(this.gameObject,Ie);return t?.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1};assignUserColor(e){const t=Yl.hashCode(e),i=Yl.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)}}const Sh=v("debugpost");let u0=null;function JA(o){u0=o}function x1(o){let e=o.gameObject;for(;e;){for(const t of gu(e))if(t.isPostProcessingManager===!0)return t;e=e.parent}return null}function e2(o){let e=x1(o);if(!e)if(u0){Sh&&console.warn("Adding postprocessing manager to the scene.");const t=o.scene;e=Cn(t,u0)}else A()&&console.warn("No post processing manager found");return e}const dt={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 tt=null;function t2(o){Sh==="verbose"&&console.debug("Before ordering effects",[...o]),tt||(tt=new Map,tt.set(T.POSTPROCESSING.MODULE.NormalPass,dt.NormalPass),tt.set(T.POSTPROCESSING.MODULE.DepthDownsamplingPass,dt.DepthDownsamplingPass),tt.set(T.POSTPROCESSING.MODULE.SMAAEffect,dt.SMAA),tt.set(T.POSTPROCESSING.MODULE.SSAOEffect,dt.SSAO),tt.set(T.POSTPROCESSING_AO.MODULE.N8AOPostPass,dt.SSAO),tt.set(T.POSTPROCESSING_AO.MODULE.N8AOPass,dt.SSAO),tt.set(T.POSTPROCESSING.MODULE.TiltShiftEffect,dt.TiltShift),tt.set(T.POSTPROCESSING.MODULE.DepthOfFieldEffect,dt.DepthOfField),tt.set(T.POSTPROCESSING.MODULE.ChromaticAberrationEffect,dt.ChromaticAberration),tt.set(T.POSTPROCESSING.MODULE.BloomEffect,dt.Bloom),tt.set(T.POSTPROCESSING.MODULE.SelectiveBloomEffect,dt.Bloom),tt.set(T.POSTPROCESSING.MODULE.VignetteEffect,dt.Vignette),tt.set(T.POSTPROCESSING.MODULE.PixelationEffect,dt.Pixelation),tt.set(T.POSTPROCESSING.MODULE.ToneMappingEffect,dt.ToneMapping),tt.set(T.POSTPROCESSING.MODULE.HueSaturationEffect,dt.HueSaturation),tt.set(T.POSTPROCESSING.MODULE.BrightnessContrastEffect,dt.BrightnessContrast)),o.sort((e,t)=>{const i=typeof e.priority=="number"?e.priority:tt.get(e.effect.constructor)??Number.NEGATIVE_INFINITY,n=typeof t.priority=="number"?t.priority:tt.get(t.effect.constructor)??Number.NEGATIVE_INFINITY;return i===Number.NEGATIVE_INFINITY?(Sh&&console.warn("Unknown effect found: ",e.constructor.name,e),1):n===Number.NEGATIVE_INFINITY?(Sh&&console.warn("Unknown effect found: ",t.constructor.name,t),-1):i-n}),Sh==="verbose"&&console.debug("After ordering effects",[...o])}var i2=Object.defineProperty,n2=Object.getOwnPropertyDescriptor,S1=(o,e,t,i)=>{for(var n=n2(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&i2(e,t,n),n};const o2=v("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;o2&&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}}S1([u()],U.prototype,"overrideState"),S1([u()],U.prototype,"value");class s2 extends Qi{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 s2;var r2=Object.defineProperty,a2=(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 p0=v("debugpost");class it extends R{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;_manager=null;onEnable(){super.onEnable(),p0&&console.warn("Enable",this.constructor.name+(this.__internalDidAwakeAndStart?"":" (awake)")),this.__internalDidAwakeAndStart&&(this.active=!0),this.onEffectEnabled()}onDisable(){super.onDisable(),p0&&console.warn("Disable",this.constructor.name),this._manager?.removeEffect(this),this.active=!1}onEffectEnabled(e){e&&e.isPostProcessingManager===!0?this._manager=e:this._manager||(this._manager=e2(this)),this._manager.addEffect(this),this._manager.dirty=!0}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(){p0&&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}}}a2([u()],it.prototype,"active");var l2=Object.defineProperty,c2=(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 h2=v("debugpost"),m0={};function an(o,e){m0[o]=e}function d2(o){return o.__type in m0?m0[o.__type]:(h2&&o.__type&&console.warn("Unknown postprocessing type",o.__type,o),it)}class Rp{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)}}c2([Xe([o=>d2(o),it])],Rp.prototype,"components");var u2=Object.defineProperty,p2=(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&&u2(e,t,n),n};const m2=v("debugpost");class Ch extends it{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=>{m2&&console.log("Antialiasing preset changed to",t),e.applyPreset(t)},e}}p2([u(U)],Ch.prototype,"preset"),an("Antialiasing",Ch);var g2=Object.defineProperty,g0=(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&&g2(e,t,n),n};const Ep=class MS extends it{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=MS.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=wo.lerp(.1,.9,t))},e}};g0([u(U)],Ep.prototype,"threshold"),g0([u(U)],Ep.prototype,"intensity"),g0([u(U)],Ep.prototype,"scatter");let Tp=Ep;an("Bloom",Tp);var f2=Object.defineProperty,y2=(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 Ph extends it{get typeName(){return"ChromaticAberration"}intensity=new U(0);onCreateEffect(){const e=new T.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new ee(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}}y2([u(U)],Ph.prototype,"intensity"),an("ChromaticAberration",Ph);var Oh=(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))(Oh||{});const C1=new Map;function f0(o){switch(o){case 0:return km;case 1:return Om;case 2:return Pd;case 3:return Cd;case 4:return Ea;default:return C1.has(o)||(C1.set(o,!0),console.warn("[Postprocessing] Unknown tone mapping mode",o)),Ea}}function b2(o){switch(o){case km:return 0;case Pd:return 2;case Cd:return 3;case Ea:return 1;case Om:return 1;default:return 0}}function Ap(o){switch(o){case km:return T.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case Pd:return T.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case Cd:return T.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case Ea:return T.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case Om:return T.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return T.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}var _2=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&&_2(e,t,n),n};const y0=v("debugpost");class qs extends it{get typeName(){return"ToneMapping"}mode=new U(void 0);exposure=new U(1);setMode(e){const t=Oh[e];return t===void 0?(console.error("[PostProcessing] Invalid ToneMapping mode",e),this):(this.mode.value=t,this)}get isToneMapping(){return!0}onEffectEnabled(){const e=x1(this);e&&super.onEffectEnabled(e)}_tonemappingEffect=null;onCreateEffect(){if(this.mode.isInitialized==!1){const i=b2(this.context.renderer.toneMapping);y0&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+i),this.mode.initialize(i)}this._tonemappingEffect?.dispose();const e=f0(this.mode.value),t=this._tonemappingEffect=new T.POSTPROCESSING.MODULE.ToneMappingEffect({mode:Ap(e)});return this.mode.onValueChanged=i=>{if(typeof i=="string")i=gw(i),t.mode=Ap(i);else{const n=f0(i);t.mode=Ap(n)}t.name="ToneMapping ("+Oh[i]+")",y0&&console.log("[PostProcessing] ToneMapping mode changed to",Oh[i],e,t.mode)},y0&&console.log("[PostProcessing] Use ToneMapping",Oh[this.mode.value],e,t.mode,"renderer.tonemapping: "+this.context.renderer.toneMapping),t}onBeforeRender(){if(this._tonemappingEffect&&this.postprocessingContext?.handler.getEffectIsActive(this._tonemappingEffect)&&(this.mode.overrideState&&(this.context.renderer.toneMapping=f0(this.mode.value)),this.exposure.overrideState&&this.exposure.value!==void 0)){const e=Math.max(0,this.exposure.value);this.context.renderer.toneMappingExposure=e}}}P1([u(U)],qs.prototype,"mode"),P1([u(U)],qs.prototype,"exposure"),an("Tonemapping",qs);var v2=Object.defineProperty,Ip=(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&&v2(e,t,n),n};class Xs extends it{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 qs);t||(t=new qs,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}}Ip([u(U)],Xs.prototype,"postExposure"),Ip([u(U)],Xs.prototype,"contrast"),Ip([u(U)],Xs.prototype,"hueShift"),Ip([u(U)],Xs.prototype,"saturation"),an("ColorAdjustments",Xs);var w2=Object.defineProperty,ra=(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&&w2(e,t,n),n};const x2=v("debugpost");class In extends it{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){x2&&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(){}}ra([u()],In.prototype,"mode"),ra([u(U)],In.prototype,"focusDistance"),ra([u(U)],In.prototype,"focalLength"),ra([u(U)],In.prototype,"aperture"),ra([u(U)],In.prototype,"gaussianMaxRadius"),ra([u(U)],In.prototype,"resolutionScale"),ra([u(U)],In.prototype,"bokehScale"),an("DepthOfField",In);class kh extends it{effect;constructor(e){super(),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var S2=Object.defineProperty,C2=(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 Mh extends it{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}}C2([u(U)],Mh.prototype,"granularity"),an("PixelationEffect",Mh);var P2=Object.defineProperty,Rh=(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&&P2(e,t,n),n};class Zo extends it{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 ae){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}}Rh([u(U)],Zo.prototype,"intensity"),Rh([u(U)],Zo.prototype,"falloff"),Rh([u(U)],Zo.prototype,"samples"),Rh([u(U)],Zo.prototype,"color"),Rh([u(U)],Zo.prototype,"luminanceInfluence"),an("ScreenSpaceAmbientOcclusion",Zo);var O2=Object.defineProperty,aa=(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 k2=v("debugN8AO");var b0=(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))(b0||{});class Ln extends it{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(b0[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=b0[this.quality];n.setQualityMode(s),n.configuration.transparencyAware=!1;const r=new Wn(t,i);return n.configuration.beautyRenderTarget=r,n.configuration.autoRenderBeauty=!1,n.configuration.gammaCorrection=this.gammaCorrection,n.configuration.screenSpaceRadius=this.screenspaceRadius,k2&&(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}}aa([kt(),u()],Ln.prototype,"gammaCorrection"),aa([u(U)],Ln.prototype,"aoRadius"),aa([u(U)],Ln.prototype,"falloff"),aa([u(U)],Ln.prototype,"intensity"),aa([u(U)],Ln.prototype,"color"),aa([kt(),u()],Ln.prototype,"screenspaceRadius"),aa([kt(),u()],Ln.prototype,"quality"),an("ScreenSpaceAmbientOcclusionN8",Ln);var M2=Object.defineProperty,R2=Object.getOwnPropertyDescriptor,O1=(o,e,t,i)=>{for(var n=R2(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&M2(e,t,n),n};class Eh extends it{get typeName(){return"Sharpening"}order=dt.Sharpening;_effect;onCreateEffect(){return this._effect??=new(E2()),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}O1([u()],Eh.prototype,"amount"),O1([u()],Eh.prototype,"radius");function E2(){const o=`
|
|
1306
|
+
void mainSupport() {
|
|
1307
|
+
vUv = uv;
|
|
1308
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
1309
|
+
}
|
|
1310
|
+
`,e=`
|
|
1311
|
+
uniform sampler2D tDiffuse;
|
|
1312
|
+
uniform float amount;
|
|
1313
|
+
uniform float radius;
|
|
1314
|
+
|
|
1315
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
1316
|
+
float tx = 1.0 / resolution.x;
|
|
1317
|
+
float ty = 1.0 / resolution.y;
|
|
1318
|
+
vec2 texelSize = vec2(tx, ty);
|
|
1319
|
+
|
|
1320
|
+
vec4 blurred = vec4(0.0);
|
|
1321
|
+
float total = 0.0;
|
|
1322
|
+
|
|
1323
|
+
for (float x = -radius; x <= radius; x++) {
|
|
1324
|
+
for (float y = -radius; y <= radius; y++) {
|
|
1325
|
+
vec2 offset = vec2(x, y) * texelSize;
|
|
1326
|
+
vec4 diffuse = texture2D(tDiffuse, uv + offset);
|
|
1327
|
+
float weight = exp(-length(offset) * amount);
|
|
1328
|
+
blurred += diffuse * weight;
|
|
1329
|
+
total += weight;
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
if (total > 0.0) {
|
|
1334
|
+
blurred /= total;
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
// Calculate the sharpened color using inputColor
|
|
1338
|
+
vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
|
|
1339
|
+
// Keep original alpha
|
|
1340
|
+
sharp.a = inputColor.a;
|
|
1341
|
+
|
|
1342
|
+
// Ensure the sharp color does not go below 0 or above 1
|
|
1343
|
+
// This means: sharpening must happen AFTER tonemapping.
|
|
1344
|
+
sharp = clamp(sharp, 0.0, 1.0);
|
|
1345
|
+
|
|
1346
|
+
outputColor = sharp;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
`;class t extends T.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:o,blendFunction:T.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new Wi(1)],["radius",new Wi(1)]]),attributes:kP.CONVOLUTION})}}return t}var T2=Object.defineProperty,Il=(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&&T2(e,t,n),n};class co extends it{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}}Il([u(U)],co.prototype,"offset"),Il([u(U)],co.prototype,"rotation"),Il([u(U)],co.prototype,"focusArea"),Il([u(U)],co.prototype,"feather"),Il([u(U)],co.prototype,"kernelSize"),Il([u(U)],co.prototype,"resolutionScale"),an("TiltShiftEffect",co);var A2=Object.defineProperty,_0=(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};class la extends it{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}}_0([u(U)],la.prototype,"color"),_0([u(U)],la.prototype,"intensity"),_0([u(U)],la.prototype,"center"),an("Vignette",la),globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const Ko=v("debugpost"),v0=Symbol("needle:postprocessing-handler"),Th=Symbol("needle:previous-autoclear-state"),Ah=Symbol("needle:previous-tone-mapping");class w0{_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(Ko&&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[v0]===this&&(delete t[v0],typeof t.renderer[Th]=="boolean"&&(t.renderer.autoClear=t.renderer[Th]),typeof t.renderer[Ah]=="number"&&(t.renderer.toneMapping=t.renderer[Ah])),this._composer?.removeAllPasses(),e&&this._composer?.dispose(),t.composer===this._composer&&(t.composer=null),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[v0]=this,Ko&&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:
|
|
1350
|
+
- 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}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[Th]=="boolean"&&(i.autoClear=i[Th]),i[Th]=i.autoClear,typeof i[Ah]=="number"&&(i.toneMapping=i[Ah]),i[Ah]=i.toneMapping,i.toneMapping!=Od&&!this._effects.find(h=>h instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect)){const h=new T.POSTPROCESSING.MODULE.ToneMappingEffect;h.name=`ToneMapping (${i.toneMapping})`,h.mode=Ap(i.toneMapping),this._effects.push({typeName:"ToneMapping",effect:h,priority:dt.ToneMapping})}this._composer||(this._composer=new T.POSTPROCESSING.MODULE.EffectComposer(i,{frameBufferType:Mm,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 h of r.passes)h.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=(h,d,p,m,f)=>{d&&(d.samples=0,p&&(p.samples=0),(!this._customInputBuffer||this._customInputBuffer.width!==d.width||this._customInputBuffer.height!==d.height||this._customInputBuffer.samples!==this._multisampling||this._customInputBuffer.texture.format!==d.texture.format||this._customInputBuffer.texture.type!==Mm)&&(this._customInputBuffer?.dispose(),this._customInputBuffer=new Wn(d.width,d.height,{format:d.texture.format,type:Mm,depthBuffer:d.depthBuffer,depthTexture:d.depthTexture?new lb(d.width,d.height):void 0,stencilBuffer:d.stencilBuffer,samples:Math.max(0,this._multisampling),minFilter:d.texture.minFilter??Rd,magFilter:d.texture.magFilter??Rd,generateMipmaps:d.texture.generateMipmaps}),this._customInputBufferId++,this._customInputBuffer.texture.name=`CustomInputBuffer-${this._customInputBufferId}`,this._customInputBuffer.depthTexture&&d.depthTexture&&(this._customInputBuffer.depthTexture.format=d.depthTexture.format,this._customInputBuffer.depthTexture.type=d.depthTexture.type),this._customInputBuffer.samples>0&&(this._customInputBuffer.ignoreDepthForMultisampleCopy=!1),Ko&&console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`)),l.call(a,h,this._customInputBuffer,p,m,f),rr.blit(this._customInputBuffer.texture,d,{renderer:h,depthTexture:this._customInputBuffer.depthTexture,depthWrite:!0,depthTest:!0}))};try{t2(this._effects);let h=!1,d=null;for(let f=this._effects.length-1;f>=0;f--){const g=this._effects[f].effect;if(g instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect){if(h){Ko&&console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${g.name} and ${d?.name}. Only the last one added will be used.`),this._effects.splice(f,1);continue}d=g,h=!0}}const p=[];let m=!1;for(let f=0;f<this._effects.length;f++){const g=this._effects[f].effect;if(g instanceof T.POSTPROCESSING.MODULE.SMAAEffect?this._hasSmaaEffect=!0:g instanceof T.POSTPROCESSING.MODULE.NormalPass&&(this._anyPassHasNormal=!0),!(g instanceof T.POSTPROCESSING.MODULE.ToneMappingEffect&&d!==g))if(g instanceof T.POSTPROCESSING.MODULE.Effect){const y=g.getAttributes(),_=T.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;y&_&&(Ko&&console.log("[PostProcessing] Convolution effect: "+g.name),m&&(Ko&&console.log("[PostProcessing] \u2192 Merging effects ["+p.map(w=>w.name).join(", ")+"]"),this.createPassForMergeableEffects(p,r,s,n)),m=!0),p.push(g)}else g instanceof T.POSTPROCESSING.MODULE.Pass?(m=!1,this.createPassForMergeableEffects(p,r,s,n),g.renderToScreen=!1,r.addPass(g)):(m=!1,this.createPassForMergeableEffects(p,r,s,n),r.addPass(g))}this.createPassForMergeableEffects(p,r,s,n)}catch(h){console.error("Error while applying postprocessing effects",h),r.passes.forEach(d=>d.dispose()),r.removeAllPasses()}let c=!1;for(let h=r.passes.length-1;h>=0;h--){const d=r.passes[h];let p=!1,m=!1;d.enabled&&(c||(p=!0,m=!0),c=!0),d.renderToScreen=m,d?.configuration!==void 0?d.configuration.gammaCorrection=p:"autosetGamma"in d&&(d.autosetGamma=p),this._anyPassHasDepth||=d.needsDepthTexture}this.handleDevicePixelRatio(),Ko&&console.log("[PostProcessing] Passes \u2192",[...r.passes],`
|
|
1351
|
+
---------------------------------
|
|
1352
|
+
\u2022 `+r.passes.map(h=>h.name||h.constructor.name+"*").join(`
|
|
1353
|
+
\u2022 `)+`
|
|
1354
|
+
`),Ko&&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(Ko==="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)})}}}}var I2=Object.defineProperty,k1=(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&&I2(e,t,n),n};const ca=v("debugpost");class Ll extends R{get isPostProcessingManager(){return!0}get effects(){return this._activeEffects}get dirty(){return this._isDirty}set dirty(e){this._isDirty=e}sharedProfile;multisampling="auto";addEffect(e){let t=e;return t instanceof it||(t=new kh(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._isDirty=!0),e}removeEffect(e){let t=-1;if(e instanceof it?t=this._effects.indexOf(e):t=this._effects.findIndex(i=>i instanceof kh&&i.effect===e),t!==-1)return this._effects.splice(t,1),this._isDirty=!0,e;if(e instanceof it){const i=this.sharedProfile?.components?.indexOf(e);i!==void 0&&i!==-1&&(this._isDirty=!0,this.sharedProfile?.components?.splice(i,1))}return e}_postprocessing;_activeEffects=[];_effects=[];markDirty(){this._isDirty=!0}awake(){ca&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",e=>{e.key==="p"&&(this.enabled=!this.enabled,Ee("Toggle PostProcessing "+this.name+": Enabled="+this.enabled),this.markDirty())})),this.sharedProfile?.__init(this)}_componentEnabledTime=-1;_multisampleAutoChangeTime=0;_multisampleAutoDecreaseTime=0;onEnable(){this._componentEnabledTime=this.context.time.realtimeSinceStartup,this._isDirty=!0}onDisable(){this._postprocessing?.unapply(),this._isDirty=!1}onBeforeRender(){if(!this.context.isInXR&&(this.context.mainCamera&&this._isDirty&&this.apply(),this.context.composer&&this._postprocessing&&this._postprocessing.composer===this.context.composer)){if(this.context.renderer.getContext().isContextLost()&&this.context.renderer.forceContextRestore(),this.context.composer.getRenderer()!==this.context.renderer&&this.context.composer.setRenderer(this.context.renderer),this.context.composer.setMainScene(this.context.scene),this.multisampling==="auto")if(this._postprocessing&&this._postprocessing.hasSmaaEffect)this._postprocessing.multisampling!==0&&(this._postprocessing.multisampling=0,(ca||A())&&console.log(`[PostProcessing] multisampling is disabled because it's set to 'auto' on your PostprocessingManager/Volume component that also has an SMAA effect.
|
|
1355
|
+
|
|
1356
|
+
If you need multisampling consider changing 'auto' to a fixed value (e.g. 4).`));else{const e=this.context.time.realtimeSinceStartup-this._multisampleAutoChangeTime;if(this.context.time.realtimeSinceStartup-this._componentEnabledTime>2&&e>.5){const t=this._postprocessing.multisampling;if(this._postprocessing.multisampling>0&&this.context.time.smoothedFps<=50){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup,this._multisampleAutoDecreaseTime=this.context.time.realtimeSinceStartup;let i=this._postprocessing.multisampling*.5;i=Math.floor(i),i!=this._postprocessing.multisampling&&(this._postprocessing.multisampling=i),ca&&console.debug(`[PostProcessing] Reduced multisampling from ${t} to ${this._postprocessing.multisampling}`)}else if(e>1&&this.context.time.smoothedFps>=59&&this._postprocessing.multisampling<this.context.renderer.capabilities.maxSamples&&this.context.time.realtimeSinceStartup-this._multisampleAutoDecreaseTime>10){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup;let i=this._postprocessing.multisampling<=0?1:this._postprocessing.multisampling*2;i=Math.floor(i),i!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=i),ca&&console.debug(`[PostProcessing] Increased multisampling from ${t} to ${this._postprocessing.multisampling}`)}}}else{const e=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples));e!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=e)}if(this.context.mainCamera){const e=this.context.composer.passes;for(const t of e)if(t.mainCamera&&t.mainCamera!==this.context.mainCamera){this.context.composer.setMainCamera(this.context.mainCamera);break}}}}onDestroy(){this._postprocessing?.dispose()}_lastApplyTime;_rapidApplyCount=0;_isDirty=!1;apply(){if(ca&&console.log(`Apply PostProcessing "${this.name||"unnamed"}"`),A()&&(this._lastApplyTime!==void 0&&Date.now()-this._lastApplyTime<100&&(this._rapidApplyCount++,this._rapidApplyCount===5&&console.warn("Detected rapid post processing modifications - this might be a bug",this)),this._lastApplyTime=Date.now()),this._isDirty=!1,this._activeEffects.length=0,this.sharedProfile?.components){const e=this.sharedProfile.components;for(const t of e)t.active&&t.enabled&&!this._activeEffects.includes(t)&&this._activeEffects.push(t)}for(const e of this._effects)e.active&&e.enabled&&!this._activeEffects.includes(e)&&this._activeEffects.push(e);this._activeEffects.length>0?(this._postprocessing||(this._postprocessing=new w0(this.context)),this._postprocessing.apply(this._activeEffects)?.then(()=>{this.activeAndEnabled&&(this._applyPostQueue(),this._postprocessing?(this.multisampling==="auto"?this._postprocessing.multisampling=L.isMobileDevice()?2:4:this._postprocessing.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples)),ca&&console.debug(`[PostProcessing] Set multisampling to ${this._postprocessing.multisampling} (Is Mobile: ${L.isMobileDevice()})`)):ca&&console.warn("[PostProcessing] No composer found"))})):this._postprocessing?.unapply(!1)}_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._postprocessing)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(!Lp.has(i)){const r=new Array;Lp.set(i,r);const a=Object.keys(s);for(const l of a)s[l]instanceof U&&r.push(l)}if(Lp.has(i)){const r=n.toLowerCase(),a=Lp.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)}}k1([Xe(Rp)],Ll.prototype,"sharedProfile"),k1([Xe()],Ll.prototype,"multisampling");const Lp=new Map;JA(Ll);async function x0(o){const{NeedleEngineWebComponent:e}=await Promise.resolve().then(()=>OL);e.observedAttributes.includes(o)||e.observedAttributes.push(o)}var L2=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&&L2(e,t,n),n};const St=v("debugsceneswitcher"),D2=v("sceneswitcher:clearscene"),Dp="scene";x0(Dp);const Qs=Promise.resolve(!1);class Ye extends R{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 de;sceneLoadingProgress=new de;sceneLoaded=new de;_currentIndex=-1;_currentScene=void 0;_engineElementOverserver=void 0;_preloadScheduler;_menuButtons;awake(){this.scenes===void 0&&(this.scenes=[]);for(const e of this.scenes)e&&!e.hasUrl&&e.asset instanceof k?x.remove(e.asset):e instanceof k&&x.remove(e);St&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Te.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Te.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Te.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===Dp){const i=this.context.domElement.getAttribute(Dp);i!==null&&this.trySelectSceneFromValue(i)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new j2(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(Dp);(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(Te.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Te.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Te.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);St&&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(St&&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 Qs}if(!this.scenes?.length)return Qs;if(e<0){if(this.clamp)return Qs;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return Qs;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}__lastSwitchScene;__lastSwitchScenePromise;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 k){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){St&&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():e.asset instanceof k&&x.remove(e.asset)}}_currentlyLoadingScene;async __internalSwitchScene(e){await this.__unloadCurrentScene();const t=this._currentIndex=this.scenes?.indexOf(e)??-1;try{St&&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(St){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 St&&console.warn("[SceneSwitcher] Adding loaded scene prevented:",e,n),!1;if(!e.asset)return St&&console.warn("[SceneSwitcher] Failed loading scene:",e),!1;if(this._currentIndex===t){if(St&&console.log("[SceneSwitcher] ADD",e.url),this._currentScene=e,D2){const a=this.context.mainCameraComponent?.gameObject||this.context.mainCamera;a?.removeFromParent();const l=this.gameObject.removeFromParent();Yi(this.context.scene,!0,!0),this.context.scene=new Si,this.context.scene.add(l),a&&this.context.scene.add(a)}if(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=Vn,this.context.scene.background=a):St&&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 k?a=e.name:e.url&&(a=M1(e.url))),this.queryParameterName?.length)nc(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}St&&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 Qs}tryLoadFromQueryParam(){if(!this.queryParameterName?.length)return Qs;const e=v(this.queryParameterName);return typeof e=="boolean"?Qs: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 k?s.name:M1(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 $i()&&console.warn('[SceneSwitcher] Can not find scene: "'+e+'"',this),Qs}_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)){St&&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){St&&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}}xt([u()],Ye.prototype,"autoLoadFirstScene"),xt([u(ne)],Ye.prototype,"scenes"),xt([u(ne)],Ye.prototype,"loadingScene"),xt([u()],Ye.prototype,"queryParameterName"),xt([u()],Ye.prototype,"useSceneName"),xt([u()],Ye.prototype,"clamp"),xt([u()],Ye.prototype,"useHistory"),xt([u()],Ye.prototype,"useKeyboard"),xt([u()],Ye.prototype,"useSwipe"),xt([u()],Ye.prototype,"useSceneLighting"),xt([u()],Ye.prototype,"useSceneBackground"),xt([u()],Ye.prototype,"preloadNext"),xt([u()],Ye.prototype,"preloadPrevious"),xt([u()],Ye.prototype,"preloadConcurrent"),xt([u()],Ye.prototype,"createMenuButtons"),xt([u(de)],Ye.prototype,"sceneLoadingStart"),xt([u(de)],Ye.prototype,"sceneLoadingProgress"),xt([u(de)],Ye.prototype,"sceneLoaded");function M1(o){const e=o.split("/").pop()?.split(".").shift();return e?.length?e:o}class j2{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;St&&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()&&(St&&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];St&&console.log("[SceneSwitcher] Schedule preload scene",{roomIndex:h,searchForward:l,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},d?.url),new B2(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 B2{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()&&(St&&console.log("[SceneSwitcher] Preload start: "+this.asset.url,this.index),await this.asset.preload(),St&&console.log("[SceneSwitcher] Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}function F2(){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 U2(o){await F2(),o()}var z2=Object.defineProperty,N2=Object.getOwnPropertyDescriptor,Bi=(o,e,t,i)=>{for(var n=i>1?void 0:i?N2(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&&z2(e,t,n),n};const Ct=v("debugvideo");var R1=(o=>(o[o.None=0]="None",o[o.AdjustHeight=1]="AdjustHeight",o[o.AdjustWidth=2]="AdjustWidth",o))(R1||{}),E1=(o=>(o[o.VideoClip=0]="VideoClip",o[o.Url=1]="Url",o))(E1||{}),T1=(o=>(o[o.CameraFarPlane=0]="CameraFarPlane",o[o.CameraNearPlane=1]="CameraNearPlane",o[o.RenderTexture=2]="RenderTexture",o[o.MaterialOverride=3]="MaterialOverride",o))(T1||{});class ut extends R{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;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(){Ct&&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,Ct&&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(){Ct&&console.log("VideoPlayer.onEnable",E1[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(),U2(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],v("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}play(){if(this._videoElement||this.create(!1),!this._videoElement){Ct&&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}Ct&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(e=>{console.log(e),Ct&&console.error("Error playing video",e,"CODE="+e.code,this.videoElement?.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),Ct&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),Ct&&console.log("STOP",this))}pause(){this.time=this._videoElement?.currentTime??0,this._isPlaying=!1,this._videoElement?.pause(),Ct&&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||(Ct&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(Ct&&console.log("Set Video src",t),this._videoElement.src=t):(Ct&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new jC(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=Co,e&&this.handleBeginPlaying(e),Ct&&console.log("Video: handle playing done...",t,e),!0):(Ct&&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 V2(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),Ct&&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,Jt)?.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,T1[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)s[n]=this._videoTexture;else switch(this.targetMaterialProperty){default: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):(Ct&&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=()=>{Ct&&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(),Ct&&console.log("HLS: loaded",this.clip))}}Bi([u()],ut.prototype,"playOnAwake",2),Bi([u()],ut.prototype,"aspectMode",2),Bi([u(URL)],ut.prototype,"clip",2),Bi([u()],ut.prototype,"source",2),Bi([u(URL)],ut.prototype,"url",1),Bi([u()],ut.prototype,"renderMode",2),Bi([u()],ut.prototype,"targetMaterialProperty",2),Bi([u(Jt)],ut.prototype,"targetMaterialRenderer",2),Bi([u(Le)],ut.prototype,"targetTexture",2),Bi([u()],ut.prototype,"time",2),Bi([u()],ut.prototype,"playbackSpeed",1),Bi([u()],ut.prototype,"isLooping",1),Bi([u()],ut.prototype,"audioOutputMode",1);class V2{context;constructor(e){this.context=e,this._input=new W2(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=Cr.createPrimitive(Sr.Quad,{material:new $2(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 W2{_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 ee;window.addEventListener("mousemove",n=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const s=new ee(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 $2 extends Nn{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 ee;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 me(0,0,1,1)}},this.vertexShader=`
|
|
1357
|
+
uniform sampler2D map;
|
|
1358
|
+
uniform float screenAspect;
|
|
1359
|
+
uniform vec4 offsetScale;
|
|
1360
|
+
varying vec2 vUv;
|
|
1361
|
+
|
|
1362
|
+
void main() {
|
|
1363
|
+
|
|
1364
|
+
gl_Position = vec4( position , 1.0 );
|
|
1365
|
+
vUv = uv;
|
|
1366
|
+
vUv.y = 1. - vUv.y;
|
|
1367
|
+
|
|
1368
|
+
// fit into screen
|
|
1369
|
+
ivec2 res = textureSize(map, 0);
|
|
1370
|
+
float videoAspect = float(res.x) / float(res.y);
|
|
1371
|
+
float aspect = videoAspect / screenAspect;
|
|
1372
|
+
if(aspect >= 1.0)
|
|
1373
|
+
{
|
|
1374
|
+
vUv.y = vUv.y * aspect;
|
|
1375
|
+
float offset = (1. - aspect) * .5;
|
|
1376
|
+
vUv.y = vUv.y + offset;
|
|
1377
|
+
}
|
|
1378
|
+
else
|
|
1379
|
+
{
|
|
1380
|
+
vUv.x = vUv.x / aspect;
|
|
1381
|
+
float offset = (1. - 1. / aspect) * .5;
|
|
1382
|
+
vUv.x = vUv.x + offset;
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
vUv.x -= .5;
|
|
1386
|
+
vUv.y -= .5;
|
|
1387
|
+
|
|
1388
|
+
vUv.x *= offsetScale.z;
|
|
1389
|
+
vUv.y *= offsetScale.z;
|
|
1390
|
+
vUv.x += offsetScale.x;
|
|
1391
|
+
vUv.y += offsetScale.y;
|
|
1392
|
+
|
|
1393
|
+
vUv.x += .5;
|
|
1394
|
+
vUv.y += .5;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
`,this.fragmentShader=`
|
|
1398
|
+
uniform sampler2D map;
|
|
1399
|
+
varying vec2 vUv;
|
|
1400
|
+
void main() {
|
|
1401
|
+
if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
|
|
1402
|
+
gl_FragColor = vec4(0., 0., 0., 1.);
|
|
1403
|
+
else
|
|
1404
|
+
{
|
|
1405
|
+
vec4 texcolor = texture2D(map, vUv);
|
|
1406
|
+
gl_FragColor = texcolor;
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
`}}var H2=Object.defineProperty,G2=Object.getOwnPropertyDescriptor,Ih=(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&&H2(e,t,n),n};const Tt=v("debugscreensharing");var A1=(o=>(o[o.Screen=0]="Screen",o[o.Camera=1]="Camera",o[o.Canvas=2]="Canvas",o[o.Microphone=3]="Microphone",o))(A1||{});class Ys extends R{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=A1[this.device]),Tt&&console.log("Screensharing",this.name,this),Ii.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new fd(this)}onEnable(){this._net?.enable(),this._net?.addEventListener(Kn.StreamReceived,this.onReceiveStream),this._net?.addEventListener(Kn.StreamEnded,this.onCallEnded),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.autoConnect&&ko(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){this._net?.removeEventListener(Kn.StreamReceived,this.onReceiveStream),this._net?.removeEventListener(Kn.StreamEnded,this.onCallEnded),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this._net?.disable(),this.close()}onJoinedRoom=async()=>{await ko(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()};_ensureVideoPlayer(){const e=new ut;e.aspectMode=R1.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,ut)??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):Jn(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):Jn(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&&(Tt&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),this._net?.stopSendingStream(this._currentStream),Jn(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 Ii,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),n||(Tt&&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",()=>{Tt&&console.log("Track ended",s),this.close()}),Tt&&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=>{Tt&&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");Tt&&console.log(`Request camera. These are your kind:videoinput devices:
|
|
1410
|
+
`,i);let n=!1;for(const s of i)try{if(!this._requestOpen){Tt&&console.log("Camera selection cancelled");break}if(s.kind!=="videoinput"){Tt&&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){Tt&&console.log("Skipping device due to options.deviceId: "+s.label+"; "+s.deviceId);continue}if(t?.deviceFilter&&t.deviceFilter(s)===!1){Tt&&console.log("Skipping device due to options.deviceFilter: "+s.label+"; "+s.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(s)===!1){Tt&&console.log("Skipping device due to ScreenShare.deviceFilter: "+s.label+"; "+s.deviceId);continue}else Tt&&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){Tt&&console.log("Skipping device due to ScreenShare.deviceName: "+s.label+"; "+s.deviceId);continue}else Tt&&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),Tt&&console.log("Selected camera",s)):(Jn(a),Tt&&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))}}Ih([u()],Ys.prototype,"allowStartOnClick",2),Ih([u()],Ys.prototype,"autoConnect",2),Ih([u(ut)],Ys.prototype,"videoPlayer",1),Ih([u()],Ys.prototype,"device",2),Ih([u()],Ys.prototype,"deviceName",2);var q2=Object.defineProperty,Dl=(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 X2=v("debugseethrough");let Q2=0;class Jo extends R{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=Q2++;onEnable(){this._needsUpdate=!0,this._renderer=null,Lh.components.push(this)}onDisable(){this._renderer?.forEach(t=>{const i=this.rendererMaterialsOriginal.get(t);for(let n=0;n<t.sharedMaterials.length;n++)t.sharedMaterials[n]&&i&&i[n]&&(t.sharedMaterials[n]=i[n]);this.rendererMaterials.delete(t),this.rendererMaterialsOriginal.delete(t)});const e=Lh.components.indexOf(this);e!==-1&&Lh.components.splice(e,1)}update(){if(this._needsUpdate?(this._needsUpdate=!1,this._renderer=this.gameObject.getComponentsInChildren(Jt),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(X2&&this.referencePoint){const t=this.gameObject.worldPosition;F.DrawArrow(B(t),t.sub(this._referencePointDir),e?16711680:65280),F.DrawWireSphere(this.referencePoint.worldPosition,.05,255)}e?this.updateAlpha(this.minAlpha,this.fadeDuration):this.updateAlpha(1,this.fadeDuration)}rendererMaterials=new WeakMap;rendererMaterialsOriginal=new WeakMap;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(B(1,.5,1)).normalize()}updateAlpha(e,t=this.fadeDuration){this.overrideAlpha!==void 0&&this.overrideAlpha!==-1&&(e=this.overrideAlpha),this._renderer?.forEach(i=>{if(e<.9?i.gameObject.raycastAllowed=!1:i.gameObject.raycastAllowed=!0,!this.rendererMaterials.has(i)){const s=new Array,r=new Array;for(let a=0;a<i.sharedMaterials.length;a++){const l=i.sharedMaterials[a];if(!l)continue;s.push(l);const c=l.clone();c.userData=l.userData||{},c.userData.seeThrough={initial:{opacity:c.opacity,transparent:c.transparent,alphaHash:c.alphaHash}},r.push(c),i.sharedMaterials[a]=c}this.rendererMaterials.set(i,r),this.rendererMaterialsOriginal.set(i,s)}const n=i.hasLightmap?i.sharedMaterials:this.rendererMaterials.get(i);if(n)for(const s of n){if(!s)continue;let r=D.lerp(s.opacity,e,t<=0?1:this.context.time.deltaTime/t);r>=.99?r=1:r<=.01&&(r=0);const a=s.transparent,l=s.alphaHash,c=s.opacity;if(s.alphaHash=this.useAlphaHash,s.userData&&"seeThrough"in s.userData){const h=s.userData.seeThrough.initial;s.opacity=h.opacity*r,s.transparent=s.opacity>=1?h.transparent:!this.useAlphaHash}else s.transparent=s.opacity>=1?!1:!this.useAlphaHash;(a!==s.transparent||l!==s.alphaHash||s.opacity!==c)&&(s.needsUpdate=!0)}})}}Dl([u(k)],Jo.prototype,"referencePoint"),Dl([u()],Jo.prototype,"fadeDuration"),Dl([u()],Jo.prototype,"minAlpha"),Dl([u()],Jo.prototype,"useAlphaHash"),Dl([u()],Jo.prototype,"overrideAlpha"),Dl([u()],Jo.prototype,"autoUpdate");class Lh{static components=[];get extensionName(){return"SeeThrough"}}const I1=new Lh;Tn.beforeExport.addEventListener(o=>{Lh.components.length!==0&&o.exporter.extensions.includes(I1)===!1&&o.exporter.extensions.push(I1)});var Y2=Object.defineProperty,L1=(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};class Dh extends R{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=Cr.createPrimitive(Sr.Quad,{name:"ShadowCatcher",material:new mt({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=mb,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
|
|
1411
|
+
// diffuse-only lighting with overdrive to somewhat compensate
|
|
1412
|
+
// for the loss of indirect lighting and to make it more visible.
|
|
1413
|
+
vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
|
|
1414
|
+
float max = max(direct.r, max(direct.g, direct.b));
|
|
1415
|
+
|
|
1416
|
+
// early out - we're simply returning direct lighting and some alpha based on it so it can
|
|
1417
|
+
// be blended onto the scene.
|
|
1418
|
+
gl_FragColor = vec4(direct, max);
|
|
1419
|
+
return;
|
|
1420
|
+
`)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new ib;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 Se;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)}}L1([u()],Dh.prototype,"mode"),L1([u(se)],Dh.prototype,"shadowColor");const jp=new Map;function D1(o,e){if(jp.has(o))return jp.get(o);const t=new URL(o,window.location.href),i=Z2(t,e);return jp.set(o,i),i.finally(()=>{jp.delete(o)}),i}async function Z2(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 Em;else if(s)a=new vb;else if(r){const{ktx2Loader:c}=Rm(e);a=c}else a=new tc;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=gb),a instanceof tc&&(c.colorSpace=Co)}return c}).catch(c=>(console.warn("Failed to load texture from url:",o),null))}var K2=Object.defineProperty,jh=(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&&K2(e,t,n),n};const ni=v("debugskybox");x0("background-image"),x0("environment-image");const j1={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 B1(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 Fp;s.sourceId=$b(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 zm(o.domElement,n,r),s.addEventListener("destroy",()=>{ni&&console.log("Destroyed attribute remote skybox",n),Nm(o.domElement,n,r)}),s.setSkybox(e)}const Bp=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=B1(e,t,!0,!1,"background-image");n&&Bp.push(n)}if(i){ni&&console.log("Creating RemoteSkybox to load environment "+i);const n=B1(e,i,!1,!0,"environment-image");n&&Bp.push(n)}}),pe.registerCallback(ue.ContextCreationStart,()=>Promise.all(Bp).finally(()=>{Bp.length=0}));const ha=class extends R{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,pi.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=J2(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 D1(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 db||o instanceof BC||o.mapping==gb||(o.mapping=FC,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,!pi.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=o),this.background&&!pi.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}}}};jh([ky(ha.prototype.urlChangedSyncField),u(URL)],ha.prototype,"url"),jh([u()],ha.prototype,"allowDrop"),jh([u()],ha.prototype,"background"),jh([u()],ha.prototype,"environment"),jh([u()],ha.prototype,"allowNetworking");let Fp=ha;function J2(o,e,t){if(o==null)return null;const i=e&&!t,n=j1[o.toLowerCase()];return n?i?n.url_low:n.url:(typeof o=="string"&&o?.length&&(A()||ni)&&!o.startsWith("http")&&!o.startsWith("file:")&&!o.startsWith("blob:")&&!o.startsWith("data:")&&console.warn(`RemoteSkybox: Unknown magic skybox name "${o}". Valid names are: ${Object.keys(j1).map(s=>`"${s}"`).join(", ")}`),o)}var eI=Object.defineProperty,Up=(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 Bh=class RS extends R{target=null;followFactor=.1;rotateFactor=.1;positionAxes=el.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=J(this.target),i=this._firstUpdate||e?1:D.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&el.X&&(n.x=D.lerp(n.x,t.x,i)),this.positionAxes&el.Y&&(n.y=D.lerp(n.y,t.y,i)),this.positionAxes&el.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(RS._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}}};Up([u(k)],Bh.prototype,"target"),Up([u()],Bh.prototype,"followFactor"),Up([u()],Bh.prototype,"rotateFactor"),Up([u()],Bh.prototype,"positionAxes");let zp=Bh;var tI=Object.defineProperty,Fh=(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 Uh=v("debugspatialtrigger"),F1=new ps,U1=new ps;function iI(o,e){return F1.mask=o,U1.mask=e,F1.test(U1)}class ho extends R{triggerMask=0;onEnter;onStay;onExit;start(){Uh&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of Np.triggers)iI(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){Uh&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){Uh&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}Fh([u()],ho.prototype,"triggerMask"),Fh([u(de)],ho.prototype,"onEnter"),Fh([u(de)],ho.prototype,"onStay"),Fh([u(de)],ho.prototype,"onExit");const z1=class hm extends R{static triggers=[];triggerMask;boxHelper;start(){Uh&&console.log(this.name,this.triggerMask,this)}onEnable(){hm.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,Pt),this.boxHelper?.showHelper(null,Uh))}onDisable(){hm.triggers.splice(hm.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 ho&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof ho&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof ho&&t.onExitTrigger(this)},!1)}};Fh([u()],z1.prototype,"triggerMask");let Np=z1;var nI=Object.defineProperty,oI=(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&&nI(e,t,n),n};const Fi=v("debugspectator");class Vp extends R{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 aI(this.context,this),this._networking=new hI(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,pi),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new sI(this.context,this.cam,this)),this.orbit=x.getComponent(this.context.mainCamera,fe)}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 L.isDesktop()&&!L.isMobileDevice()&&!t}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(Fi&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){this.context.removeCamera(this.cam),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._handler?.set(void 0),this._handler?.disable(),this.isSpectatingSelf&&this.stopSpectating()}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,Lo.Headset),this.target=this.context.players.getPlayerView(this.localId)),Fi&&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 Ie.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=eo.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?eo.FirstPerson:eo.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const s of n)s.UpdateVisible(i)}}resetAvatarFlags(){for(const e of Ie.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(eo.FirstPerson):i.UpdateVisible(eo.ThirdPerson)}}}oI([u()],Vp.prototype,"useKeys");class sI{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,zp)),this.target||(this.target=new k),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,Fi&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){Fi&&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){Fi&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(Fi&&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!==Lo.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!==Lo.Browser?i.quaternion.copy(rI):i.quaternion.identity()}}}const rI=new N().setFromAxisAngle(new b(0,1,0),Math.PI);class aI{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(Te.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(Te.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 vs;e.setMask(16777215);const t=this.context.physics.raycast(e);if(Fi&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,s=nn.getFor(n);let r=s?.owner;if(r||(r=x.getComponentInParent(n,Ie)?.connectionId),r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,Fi&&console.log("spectate",r,s);break}}}}class lI{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class cI{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class hI{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(Fi&&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 lI(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",s)}}onRequestFollowMe(e=!1){if(Fi&&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 cI(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){v("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(Fi&&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 Fi&&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):(Fi&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}var dI=Object.defineProperty,uI=Object.getOwnPropertyDescriptor,jl=(o,e,t,i)=>{for(var n=i>1?void 0:i?uI(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&&dI(e,t,n),n};const N1=v("debugsplines");class uo{position=new b;rotation=new N;tangentIn=new b;tangentOut=new b}jl([Xe(b)],uo.prototype,"position",2),jl([Xe(N)],uo.prototype,"rotation",2),jl([Xe(b)],uo.prototype,"tangentIn",2),jl([Xe(b)],uo.prototype,"tangentOut",2);class da extends R{addKnot(e){if(e instanceof uo)this.spline.push(e),this._isDirty=!0;else{const t=new uo;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(){N1&&(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=pI(this.spline,this.closed),this.buildDebugCurve()}}buildDebugCurve(){if(N1&&this.spline&&this._curve){this._debugLine?.removeFromParent(),this._debugLine=null;const e=new bm({color:6684927}),t=this.spline.length*10,i=this._curve.getPoints(t),n=new fn().setFromPoints(i);this._debugLine=new Ma(n,e),this.gameObject?.add(this._debugLine)}}}jl([Xe()],da.prototype,"closed",1),jl([Xe(uo)],da.prototype,"spline",2);function pI(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.remap(i,0,.3,0,.5);return new UC(t,e,"catmullrom",n)}var mI=Object.defineProperty,gI=Object.getOwnPropertyDescriptor,Zs=(o,e,t,i)=>{for(var n=i>1?void 0:i?gI(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&&mI(e,t,n),n};class ln extends R{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}Zs([Xe(da)],ln.prototype,"spline",2),Zs([Xe(k)],ln.prototype,"object",2),Zs([Xe()],ln.prototype,"useLookAt",2),Zs([Xe(k)],ln.prototype,"lookAt",2),Zs([Xe()],ln.prototype,"clamp",2),Zs([Xe()],ln.prototype,"position01",1),Zs([Xe()],ln.prototype,"autoRun",2),Zs([Xe()],ln.prototype,"duration",2);class bo{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new bo).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+Rb),(t||new bo).__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 Fr).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new Fr).__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 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 Wp="SCAM";bg(Wp,bo.getRootAsSyncedCameraModel);const Ui=new Am;class bI{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Ui.clear();const i=Ui.createString(this.guid),n=Ui.createString(this.userId);bo.startSyncedCameraModel(Ui),bo.addGuid(Ui,i),bo.addUserId(Ui,n);const s=J(e),r=Fd(e);bo.addPos(Ui,Fr.createVec3(Ui,s.x,s.y,s.z)),bo.addRot(Ui,Fr.createVec3(Ui,r.x,r.y,r.z));const a=bo.endSyncedCameraModel(Ui);Ui.finish(a,Wp),t.sendBinary(Ui.asUint8Array())}}}const V1=class eb extends R{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(Wp,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Wp,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],eb.instances.push(s),this.context.players.removePlayerView(s.userId,Lo.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 bI(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=J(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,Lo.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 Fn;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,eb.instances.push(n);const h=x.getOrAddComponent(c,Ie);h.connectionId=i,h.avatar=c}else return;const s=n.obj;this.context.players.setPlayerView(i,s,Lo.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,dn.markDirty(s);const r=e.pos();r&&gr(s,r.x(),r.y(),r.z());const a=e.rot();a&&lc(s,a.x(),a.y(),a.z())}};yI([u([k,ne])],V1.prototype,"cameraPrefab");let S0=V1;var _I=Object.defineProperty,vI=Object.getOwnPropertyDescriptor,Ks=(o,e,t,i)=>{for(var n=i>1?void 0:i?vI(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&&_I(e,t,n),n};const C0="view",P0=v("debugsyncedroom");class Dn extends R{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){return v(C0)||v(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),P0&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=v(C0);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}if(this.tryJoinRoom(),this.createJoinButton){const t=this.createRoomButton();this.context.menu.appendChild(t)}this.createViewOnlyButton&&this.onEnableViewOnlyButton()}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=v(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=Vb(i.toString());this.roomName=n}else if(this.joinRandomRoom&&(console.log("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?((P0||A())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
|
|
1421
|
+
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.
|
|
1422
|
+
Please choose one of the following options to fix this:
|
|
1423
|
+
A) Set a room name in the SyncedRoom component
|
|
1424
|
+
B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
|
|
1425
|
+
C) Set "joinRandomRoom" to true`),!1):(P0&&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(C0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=ic(),t=this.generateRoomName();v(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Fm(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&&nc(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=v(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?nc(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Ot("group"),this._roomButtonIconLeave=Ot("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),Ee("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(Ot("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)}}Ks([u()],Dn.prototype,"roomName",2),Ks([u()],Dn.prototype,"urlParameterName",2),Ks([u()],Dn.prototype,"joinRandomRoom",2),Ks([u()],Dn.prototype,"requireRoomParameter",2),Ks([u()],Dn.prototype,"autoRejoin",2),Ks([u()],Dn.prototype,"createJoinButton",2),Ks([u()],Dn.prototype,"createViewOnlyButton",2),Ks([u()],Dn.prototype,"roomPrefix",1);function wI(){const o=v("testwindowcount")||0;o&&o>0&&xI(o)}function xI(o){if(v("testwindow"))return null;const e=new URL(window.location.href);Bm(e.searchParams,gE,1),Bm(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 O0 extends R{awake(){wI()}}class k0 extends R{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Nc,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new SI(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 Am(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=$w(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 SI{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 CI=Object.defineProperty,$p=(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&&CI(e,t,n),n};const PI=v("debugsignals");class Hp{guid}$p([u()],Hp.prototype,"guid");class zh{signal;reaction}$p([u(Hp)],zh.prototype,"signal"),$p([u(de)],zh.prototype,"reaction");const W1=class as extends R{static receivers={};static invoke(e){if(as.receivers[e]){const t=as.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){PI&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)as.receivers[e.signal.guid]||(as.receivers[e.signal.guid]=[]),as.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(as.receivers[e.signal.guid]){const t=as.receivers[e.signal.guid].indexOf(this);t>=0&&as.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)}}};$p([u(zh)],W1.prototype,"events");let Nh=W1;var zi=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(zi||{}),po=(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))(po||{}),M0=(o=>(o.Signal="SignalEmitter",o))(M0||{});const mo=v("debugtimeline");class Bl{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 OI{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";mo&&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),mo&&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),mo)){const a=new st().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class Vh extends Bl{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&&Fw(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";mo&&console.warn("Create quaternion track",h,d);const m=new NC(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";mo&&console.warn("Create position track",h,d);const m=new zC(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,mo&&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 OI(e);this._actionOffsets.push(t)}this.target&&(this._animator=x.getComponent(this.target,bt)??null,this._animator&&Fw(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!==po.None?(!f||f.start>e)&&(g=!0,n=!0):a==0&&!g&&!s&&l.start>e&&p!==po.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 w=d;if(y)switch(p){case po.Hold:break;case po.Loop:e+=l.start,w=!0;break;default:e+=l.start,w=!0;break}let P=this.getClipTime(e,l),M=0;const O=h.duration;if(y&&p===po.Hold&&(P=0),w){if(h.loop)for(M+=Math.floor(P/(O+1e-6));P>O;)P-=O}else if(!d&&n)switch(m){case po.Hold:P=this.getClipTime(l.end,l);break;case po.Loop:P%=O;break;case po.PingPong:const I=Math.floor(P/O)%2!==0;P%=O,I&&(P=O-P);break}l.reversed===!0?c.time=c.getClip().duration-P:c.time=P,c.timeScale=0;const j=Math.max(0,_);if(c.weight=j,r+=j,c.clampWhenFinished=!1,c.isRunning()||c.play(),this._useclipOffsets){const I=t==0?this._totalOffsetPosition:this._totalOffsetPosition2,W=t==0?this._totalOffsetRotation:this._totalOffsetRotation2;t<1&&(i=1-_),t+=1;const V=this._summedPos.set(0,0,0),G=this._tempPos.set(0,0,0),X=this._summedRot.identity(),E=this._tempRot.identity(),$=h.rotation;$&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp($,_));const q=this._actionOffsets[a];if(q.hasOffsets)for(let he=0;he<M;he++)q.rootPositionOffset?G.copy(q.rootPositionOffset):G.set(0,0,0),G.applyQuaternion(X),this._clipRotQuat&&G.applyQuaternion(this._clipRotQuat),q.rootQuaternionOffset&&(E.copy(q.rootQuaternionOffset),X.multiply(E)),V.add(G);this._clipRotQuat&&W.multiply(this._clipRotQuat),W.multiply(X),h.position&&V.add(h.position),I.add(V)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(mo||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 kI=v("mutetimeline");class ds extends Bl{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return fs(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 VC(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(kI||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),Ii.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,mo&&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(){ds._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new Sm);const i=this.getAudioFilePath(e.asset.clip);if(ds._audioBuffers.get(i)){const s=ds._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}mo&&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 ds._audioBuffers.set(i,n),n}}class Gp extends Bl{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 Wh extends Bl{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(mo&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)Nh.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class qp extends Bl{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=x.getComponent(i.sourceObject,ua);this.timelines.push(n),n&&i.updateDirector&&(n.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 MI=Object.defineProperty,$1=(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&&MI(e,t,n),n};const jn=v("debugtimeline"),R0=class tb extends R{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||$i())&&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&&!Ii.userInteractionRegistered&&this.waitForAudio;)await ko(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 zi.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 Vh||s.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=oc(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),tb.createTrackFunctions[t.type])continue;t.type!==zi.Audio&&t.type!==zi.Control&&t.type!==zi.Marker&&t.type!==zi.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===zi.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(Fo,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=tb.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===zi.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 k){const l=x.getOrAddComponent(r,bt);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new Vh;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 bt&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new xm(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===zi.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new ds;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Ii),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Fo)),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===zi.Marker){if(t.markers){const s=new Wh;s.director=this,s.track=t;const r=new Gp;r.director=this,r.track=t;for(const a of t.markers)a.type===M0.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,Nh);a&&(s.receivers.push(a),this._signalTracks.push(s))}r!==null&&r.models.length>0&&this._markerTracks.push(r)}}else if(t.type===zi.Signal){const s=new Wh;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===zi.Control){const s=new qp;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)}};$1([u()],R0.prototype,"playOnAwake"),$1([u()],R0.prototype,"extrapolationMode");let ua=R0;var RI=Object.defineProperty,Xp=(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 pa extends R{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!Oc)&&this.context.mainCamera&&(this._control||(this._control=new cP(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,fe)??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(wo.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(kn);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(kn);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()}}Xp([u()],pa.prototype,"isGizmo"),Xp([u()],pa.prototype,"translationSnap"),Xp([u()],pa.prototype,"rotationSnapAngle"),Xp([u()],pa.prototype,"scaleSnap");var EI=Object.defineProperty,TI=Object.getOwnPropertyDescriptor,Qp=(o,e,t,i)=>{for(var n=i>1?void 0:i?TI(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&&EI(e,t,n),n};class E0{texture=null;rect}Qp([u(Le)],E0.prototype,"texture",2);let Fl=class extends ph{set image(o){this.sprite||(this.sprite=new E0),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))}};Qp([u(E0)],Fl.prototype,"sprite",1),Qp([u()],Fl.prototype,"pixelsPerUnitMultiplier",2);class Yp extends ph{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))}}Qp([u(Le)],Yp.prototype,"mainTexture",1);var AI=Object.defineProperty,II=Object.getOwnPropertyDescriptor,Ni=(o,e,t,i)=>{for(var n=i>1?void 0:i?II(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&&AI(e,t,n),n};const ma=v("debugbutton");class Js{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}Ni([u()],Js.prototype,"colorMultiplier",2),Ni([u(se)],Js.prototype,"disabledColor",2),Ni([u()],Js.prototype,"fadeDuration",2),Ni([u(se)],Js.prototype,"highlightedColor",2),Ni([u(se)],Js.prototype,"normalColor",2),Ni([u(se)],Js.prototype,"pressedColor",2),Ni([u(se)],Js.prototype,"selectedColor",2);class LI{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class es extends R{click(){this.onClick?.invoke()}onClick=new de;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),ma&&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),ma&&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){ma&&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){ma&&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===Hd.Mouse)&&(ma&&(console.warn("Button Click",this.onClick),Ee("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),ma))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),F.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(),ma&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent(tl)||this.gameObject.addComponent(Bu)}onEnable(){super.onEnable()}onDestroy(){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,Fl),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()}}Ni([u(de)],es.prototype,"onClick",2),Ni([u(Js)],es.prototype,"colors",2),Ni([u()],es.prototype,"transition",2),Ni([u(LI)],es.prototype,"animationTriggers",2),Ni([u(bt)],es.prototype,"animator",2),Ni([u()],es.prototype,"interactable",1);var DI=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&&DI(e,t,n),n};const er=v("debuginputfield"),$h=class Q extends R{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(){er&&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),L.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){er&&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&&(er&&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||"",er&&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,er&&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(er&&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&&(er&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){Q.htmlField&&(er&&console.log("Focus Inputfield",Q.htmlFieldFocused),Q.htmlField.setSelectionRange(Q.htmlField.value.length,Q.htmlField.value.length),L.isiOS()?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=Sf(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};Zp([u(Wt)],$h.prototype,"textComponent"),Zp([u(Wt)],$h.prototype,"placeholder"),Zp([u(de)],$h.prototype,"onValueChanged"),Zp([u(de)],$h.prototype,"onEndEdit");let T0=$h;var jI=Object.defineProperty,H1=(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};class Hh extends R{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 hP;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new dP(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=Fd(this.gameObject).clone();lc(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new Ci;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()}}H1([u()],Hh.prototype,"id"),H1([u()],Hh.prototype,"keepAspect");const BI={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]}]},FI={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 Kp extends Si{constructor(e){super(),this.position.y=-3.5;const t=new ka;t.deleteAttribute("uv");const i=new mt({metalness:0,side:Md}),n=new mt({metalness:0}),s=e=="legacy"?BI:FI,r=new ym(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 Se;return t.color.setScalar(e),t}}var UI=Object.defineProperty,Jp=(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&&UI(e,t,n),n};const Gh=class ES extends R{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),ac(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(ES.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=ot.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new K().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new K().makeRotationZ(-Math.PI/2*a)))}const s=new Lt("lookat "+this.name,Vt.sceneStartTrigger(),ye.lookAtCameraAction(n,void 0,this.invertForward?mn.back:mn.forward,this.keepUpDirection?mn.up:mn.zero));e.addBehavior(s)}}};Jp([u(k)],Gh.prototype,"target"),Jp([u()],Gh.prototype,"invertForward"),Jp([u()],Gh.prototype,"keepUpDirection"),Jp([u()],Gh.prototype,"copyTargetRotation");let A0=Gh;var zI=Object.defineProperty,I0=(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&&zI(e,t,n),n};class Ul extends R{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),A()&&Ee("Open URL: "+e),this.mode){case 0:L.isSafari(),globalThis.open(e,"_blank");break;case 1:L.isSafari()&&L.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:L.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(Ai)||this.gameObject.addComponent(Ai)}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)}}I0([u()],Ul.prototype,"url"),I0([u()],Ul.prototype,"mode"),I0([u()],Ul.prototype,"clickable"),ku(o=>{const e=o.domElement.getAttribute("clickthrough");if(t(e)){const i=o.scene.addComponent(em);zm(o.domElement,"clickthrough",()=>{const n=o.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class em extends R{_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 ee(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 NI=Object.defineProperty,tm=(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&&NI(e,t,n),n};const VI=v("debugcursor");class ga extends R{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=B(e,t,1).unproject(i);s.sub(n).normalize();const r=B(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){L0.origin=a,L0.direction=s.multiplyScalar(-1);const l=this.context.physics.raycastFromRay(L0);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,VI&&F.DrawLine(c.point,c.normal.add(c.point),65280)}}}}tm([u()],ga.prototype,"damping"),tm([u()],ga.prototype,"useFullPage"),tm([u()],ga.prototype,"keepDistance"),tm([u()],ga.prototype,"snapToSurface");const L0=new vo;var WI=Object.defineProperty,$I=Object.getOwnPropertyDescriptor,zl=(o,e,t,i)=>{for(var n=i>1?void 0:i?$I(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&&WI(e,t,n),n};let go=class extends R{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=xs.emptyClip()),(!this.hovered||!(this.hovered instanceof ki))&&(this.hovered=xs.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Ft),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})}};zl([u()],go.prototype,"type",2),zl([u()],go.prototype,"duration",2),zl([u()],go.prototype,"scaleFactor",2),zl([u(ki)],go.prototype,"hovered",2),zl([u(ki)],go.prototype,"idle",2),go=zl([Wg],go);var HI=Object.defineProperty,Nl=(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&&HI(e,t,n),n};const qh=v("debugscroll");class ts extends R{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new de;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),qh&&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 ua)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof bt)e.setFloat("scroll",t);else if(e instanceof Ft)e.time=t*e.duration;else if(e instanceof Ii){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof ln)e.position01=t;else if(e instanceof bi)e.intensity=t;else if(e instanceof k){const i=e;i["needle:scrollbounds"]===void 0&&(i["needle:scrollbounds"]=Qt(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=G1.get(e);if(!n){n=[],G1.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=q1(h),qh&&console.debug(`ScrollMarker #${h} (${c.time.toFixed(2)}) found`,c.element),!c.element){(qh||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+`
|
|
1426
|
+
`,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()||qh)&&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"}))}fo.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=GI(p),f=1-Math.abs(m-.5)*2,g=`marker${l}`;if(m>0&&m<=1){const y=c.time+(d-c.time)*m;fo.push({name:g,time:y,weight:f}),s+=f}else l===0&&m<=0?(fo.push({name:g,time:0,weight:1}),s+=1):l===n.length-1&&m>=1&&(fo.push({name:g,time:i,weight:1}),s+=1)}}if(fo.length<=0&&a<=0)e.time=t*i;else if(fo.length>0){let l=fo[0].time;if(fo.length>1)for(const c of fo){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),qh&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,fo.map(c=>`[${c.name} ${(c.weight*100).toFixed(0)}%]`).join(", "))}}}Nl([u([R,k])],ts.prototype,"target"),Nl([u()],ts.prototype,"damping"),Nl([u()],ts.prototype,"invert"),Nl([u()],ts.prototype,"htmlSelector"),Nl([u()],ts.prototype,"mode"),Nl([u(de)],ts.prototype,"changed");const G1=new WeakMap,fo=[],D0=new Array;let j0=!0;function q1(o){return j0?(j0=!1,D0.length=0,document.querySelectorAll("[data-timeline-marker]").forEach((e,t)=>{D0[t]=e}),j0=!1,q1(o)):D0[o]||null}function GI(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 X1=Object.defineProperty,qI=Object.getOwnPropertyDescriptor,XI=(o,e,t)=>e in o?X1(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,im=(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&&X1(e,t,n),n},B0=(o,e,t)=>XI(o,typeof e!="symbol"?e+"":e,t);const tr=v("debugviewbox"),QI=new se(.5,.5,.5,.5);let nt=class extends R{referenceFieldOfView=-1;get mode(){return this._mode}set mode(o){o!==this._mode&&(this._mode=o,o==="once"&&(this._applyCount=0),(tr||this.debug)&&console.debug("[ViewBox] Set mode:",o))}_mode="continuous";debug=!1;onEnable(){(tr||this.debug||A())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),nt.instances.push(this),this._applyCount=0,this.removeUpdateCallback(),this.context.pre_render_callbacks.push(this.internalUpdate)}onDisable(){(tr||this.debug)&&console.debug("[ViewBox] Disabled");const o=nt.instances.indexOf(this);o!==-1&&nt.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(nt.instances[nt.instances.length-1]!==this){(tr||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,QI);return}(tr||this.debug)&&F.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const o=this.context.mainCamera;if(!o||!(o instanceof ae))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){(tr||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),nt._tempProjectionMatrix.copy(o.projectionMatrix),nt._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),_=B(f).sub(p);if(g<y){(this.debug||tr)&&console.warn("[ViewBox] Moving camera out of bounds",g,"<",y);const X=B(_);X.y*=1e-8,X.normalize();const E=y-g,$=f.add(X.multiplyScalar(E));o.worldPosition=$.lerp(f,1-this.context.time.deltaTime)}const w=B(p);o.worldToLocal(w),o.lookAt(p),o.updateMatrixWorld();const P=this.referenceFieldOfView*Math.PI/180,M=2*Math.tan(P/2)*g,O=M*o.aspect,j=this.projectBoxIntoCamera(o,1),I=j.maxX-j.minX,W=j.maxY-j.minY,V=this.fit(I*o.aspect,W,O/s,M/r)/(M*.5),G=B(p);G.project(o),this.context.focusRectSettings.offsetX=G.x,this.context.focusRectSettings.offsetY=G.y,this.context.focusRectSettings.zoom=V,this.context.focusRect||this.context.setCameraFocusRect(this.context.domElement),o.view=l,o.zoom=c,o.aspect=h,o.fov=d,o.projectionMatrix.copy(nt._tempProjectionMatrix),o.projectionMatrixInverse.copy(nt._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=[B(-t,-t,-t),B(t,-t,-t),B(-t,t,-t),B(t,t,-t),B(-t,-t,t),B(t,-t,t),B(-t,t,t),B(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 tr&&(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};B0(nt,"instances",[]),B0(nt,"_tempProjectionMatrix",new K),B0(nt,"_tempProjectionMatrixInverse",new K),im([u()],nt.prototype,"referenceFieldOfView",2),im([u()],nt.prototype,"mode",1),im([u()],nt.prototype,"debug",2),nt=im([Wg],nt);var YI=Object.defineProperty,Vl=(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&&YI(e,t,n),n};class is extends R{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=B(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=B(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))}}Vl([u()],is.prototype,"side"),Vl([u()],is.prototype,"controller"),Vl([u()],is.prototype,"hands"),Vl([u()],is.prototype,"controlVisibility"),Vl([u()],is.prototype,"useGripSpace"),Vl([u()],is.prototype,"resetTransformAfterXRSession");function Q1(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.
|
|
1427
|
+
|
|
1428
|
+
Example to request camera-access in global scope:
|
|
1429
|
+
NeedleXRSession.onSessionRequestStart(evt => {
|
|
1430
|
+
evt.init.optionalFeatures = evt.init.optionalFeatures || [];
|
|
1431
|
+
evt.init.optionalFeatures.push('camera-access');
|
|
1432
|
+
});
|
|
1433
|
+
`),A()&&dc("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){ZI(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 Y1=new WeakMap;function ZI(o,e){const t=Y1.get(e)||new WeakSet;if(t.has(o))return;t.add(o),Y1.set(e,t),console.debug("Initialize texture for camera feed");const i=new Se,n=new zn,s=new Si;s.add(new H(n,i));const r=new ae;i.map=e,o.render(s,r)}function KI(o,e,t,i="image/webp",n){return F0({context:o,width:e,height:t,mimeType:i,camera:n})}function F0(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=>{To(I=>{const W=F0(o);j(W)},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(),w=a.getClearColor(new oe),P=a.getClearAlpha(),M=i.scene.background,O="aspect"in r?r.aspect:null;try{const j=o.render_events!==!1,I=new Array;j&&(Ga(i.scene,Jt,I),I.forEach(E=>{if(E?.onBeforeRender(),E.isInstancingActive&&E.instances)for(let $=0;$<E.instances?.length;$++){const q=E.instances[$];Io(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 ae&&(r.aspect=n/s,r.updateProjectionMatrix());const W="type"in o&&o.type==="texture";let V=null;W&&(V=new Wn(n,s,{wrapS:yb,wrapT:yb,format:1023}),a.setRenderTarget(V));let G=c;if(l?(V&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),G=Qh.compositeWithCameraImage({width:p,height:m,scene:i.scene,camera:r,renderer:a})):i.renderNow(r||null),r instanceof ae&&O!=null&&(r.aspect=O,r.updateProjectionMatrix()),j&&I.forEach(E=>E.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 E=JI(G);E&&(G=E)}if("type"in o){if(o.type==="texture")return V?(o.target&&(o.target.image=V?.texture.image,o.target.needsUpdate=!0),V.texture.offset.set(0,-1),V.texture.needsUpdate=!0,V.texture):(console.error("No target texture found"),null);if(o.type==="blob")return new Promise((E,$)=>{G.toBlob(q=>{E(q)},t)});if(o.type==="share")return new Promise((E,$)=>{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(()=>{E({blob:q,shared:!0})})}return{blob:q,shared:!1}},t)})}const X=G.toDataURL(t);if("download_filename"in o&&o.download_filename){let E=o.download_filename;if(L.isMobileDevice()&&typeof window<"u"){const $=E+"_screenshots",q=E.split("."),he=q.pop()?.toLowerCase();let re=0;localStorage.getItem($)&&(re=parseInt(sessionStorage.getItem($)||"0")),re>0&&(E=`${q.join()}-${re}.${he}`),re+=1,sessionStorage.setItem($,re.toString())}Z1(X,E)}return X}finally{a.setRenderTarget(_),i.scene.background=M,a.setSize(h,d,!1),a.setClearColor(w,P),O!=null&&r instanceof ae&&(r.aspect=O,r.updateProjectionMatrix()),a.xr.enabled=y,a.xr.isPresenting=l,l||i.updateSize(!0)}return null}function JI(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 Xh=null;function Z1(o,e){if(o){if(!o.startsWith("data:image")){console.error("Can not save image: Data url is not an image",o);return}Xh||(Xh=document.createElement("a")),Xh.href=o,Xh.download=e,Xh.click()}}var Qh;(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,w=d/p;(!i||i.width!==y||i.height!==_)&&(i??=new Wn(y,_,{colorSpace:Co}),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/w}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 Le),h.xr.updateCamera(c.camera),h.xr.enabled=!1,h.autoClear=!1,h.clear(),h.setSize(y,_),h.setRenderTarget(i),Q1(c.renderer,n)||console.error("Could not update texture from XR frame");const P=x.findObjectOfType(Yh);return P?P.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=`
|
|
1434
|
+
uniform sampler2D t2D;
|
|
1435
|
+
varying vec2 vUv;
|
|
1436
|
+
|
|
1437
|
+
void main() {
|
|
1438
|
+
|
|
1439
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1440
|
+
|
|
1441
|
+
#ifdef DECODE_VIDEO_TEXTURE
|
|
1442
|
+
|
|
1443
|
+
// inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
|
|
1444
|
+
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 );
|
|
1445
|
+
|
|
1446
|
+
#endif
|
|
1447
|
+
|
|
1448
|
+
gl_FragColor = texColor;
|
|
1449
|
+
#include <tonemapping_fragment>
|
|
1450
|
+
#include <colorspace_fragment>
|
|
1451
|
+
}
|
|
1452
|
+
`;function l(c){const h=c?.material||new Nn({name:"BackgroundMaterial",uniforms:fb.clone(Ed.background.uniforms),vertexShader:Ed.background.vertexShader,fragmentShader:a,defines:c?.defines,side:gs,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(h,"map",{get:function(){return this.threeTexture}});const d=new H(new zn(2,2),h);return jd(d,!1),d.geometry.deleteAttribute("normal"),d.renderOrder=-1e6,d.setTexture=function(p){h.uniforms.t2D.value=p},d}o.makeFullscreenPlane=l})(Qh||(Qh={}));var eL=Object.defineProperty,tL=(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};const K1=v("debugarcamera");class Yh extends R{onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),K1&&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 Se,t=new zn,i=new Si;i.add(new H(t,e));const n=new ae;return function(s,r){e.map=r,s.render(i,n),K1&&console.warn("Force texture initialization")}}();preRender=()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new Le,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=Qh.makeFullscreenPlane({material:new Nn({name:"BackgroundMaterial",uniforms:{...fb.clone(Ed.background.uniforms),tint:{value:new me(e.r,e.g,e.b,e.a)}},vertexShader:Ed.background.vertexShader,fragmentShader:iL,side:Oi,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof Nn&&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"&&(Q1(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)}}tL([u(se)],Yh.prototype,"backgroundTint");const iL=`
|
|
1453
|
+
uniform sampler2D t2D;
|
|
1454
|
+
uniform vec4 tint;
|
|
1455
|
+
|
|
1456
|
+
varying vec2 vUv;
|
|
1457
|
+
|
|
1458
|
+
void main() {
|
|
1459
|
+
|
|
1460
|
+
vec4 texColor = texture2D( t2D, vUv );
|
|
1461
|
+
texColor.w = 1.0;
|
|
1462
|
+
|
|
1463
|
+
// inline sRGB decode
|
|
1464
|
+
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 );
|
|
1465
|
+
|
|
1466
|
+
gl_FragColor = texColor * tint;
|
|
1467
|
+
|
|
1468
|
+
#include <tonemapping_fragment>
|
|
1469
|
+
#include <colorspace_fragment>
|
|
1470
|
+
}
|
|
1471
|
+
`;var nL=Object.defineProperty,ir=(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&&nL(e,t,n),n};const nm=v("debugimagetracking");class Zl{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 Mi(()=>new b,20);static _rotationBuffer=new Mi(()=>new N,20);_position;_rotation;ensureTransformData(){if(!this._position){this._position=Zl._positionBuffer.get(),this._rotation=Zl._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 ns{constructor(e){this.image=e.url,this.widthInMeters=e.widthInMeters,e.object instanceof k?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}}ir([u(URL)],ns.prototype,"image"),ir([u()],ns.prototype,"widthInMeters"),ir([u(ne)],ns.prototype,"object"),ir([u()],ns.prototype,"createObjectInstance"),ir([u()],ns.prototype,"imageDoesNotMove"),ir([u()],ns.prototype,"hideWhenTrackingIsLost");class oL{constructor(e,t){this.exporter=e,this.component=t,nm&&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&&(nm||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=L.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=Kh.get(t.image),n=await(await(await Wx(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 K;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 Zh extends R{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),J1(e.image)),t&&this.setPrimaryImage(e)}trackedImages=[];smooth=!0;trackedImageIndexMap=new Map;get supported(){return this._supported}_supported=!0;awake(){if(nm&&console.log(this),!!this.trackedImages)for(const e of this.trackedImages)e.image&&J1(e.image)}onEnable(){Tn.beforeExport.addEventListener(this.onBeforeUSDZExport)}onDisable(){Tn.beforeExport.removeEventListener(this.onBeforeUSDZExport)}onBeforeUSDZExport=e=>{this.activeAndEnabled&&this.trackedImages?.length&&e.exporter.extensions.push(new oL(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=[];for(const i of this.trackedImages)if(i.image?.length&&i.widthInMeters>0){const n=Kh.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&&L.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 Zl(this,c,r.image,r.measuredSize,a,h);this.currentImages.push(d)}else nm&&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(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(Jt))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))}}}}ir([u(ns)],Zh.prototype,"trackedImages"),ir([u()],Zh.prototype,"smooth");const Kh=new Map,om=new Map;async function J1(o){if(Kh.has(o))return om.has(o)?om.get(o):Promise.resolve(!0);const e=new Promise(t=>{Kh.set(o,null);const i=document.createElement("img");i.src=o,i.addEventListener("load",async()=>{const n=await createImageBitmap(i);Kh.set(o,n),t(!0)})});return om.set(o,e),e.finally(()=>{om.delete(o)}),e}var sL=Object.defineProperty,Wl=(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 fa=v("debugplanetracking");class os extends R{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),fa){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),F.DrawLabel(this.center.add(this.labelOffset),(c.xrData.semanticLabel||"plane").toUpperCase()+`
|
|
1472
|
+
`+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new Ci;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),fa&&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()):fa&&console.warn("No normals helper found for mesh",i.mesh)}),Yi(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 xo)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()}fa&&(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;fa?d.material=new WC:this.occluder?(d.material=new Se,this.makeOccluder(d,d.material,!0)):d.material=new Se({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,ng(d,!1),d instanceof H)Pe(d.geometry),d.geometry=this.createGeometry(a),this.makeOccluder(d,d.material,this.occluder&&!this.dataTemplate);else if(d instanceof xo)for(const f of d.children)f instanceof H&&(Pe(f.geometry),f.geometry=this.createGeometry(a),this.makeOccluder(f,f.material,this.occluder&&!this.dataTemplate));const p=d.getComponent(Es);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),fa&&console.log("New plane detected, id="+m.id,m,{hasCollider:!!p,isGroup:d instanceof xo});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,fa&&h.traverse(d=>{if(d instanceof H)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new uP(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new K().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new Ci;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 fn}_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 fn;n.setIndex(new gt(t,1)),n.setAttribute("position",new gt(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 gt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new fn,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 gt(new Float32Array(i),3)),t.setAttribute("uv",new gt(new Float32Array(n),2)),t.setAttribute("normal",new gt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Wl([u(ne)],os.prototype,"dataTemplate"),Wl([u()],os.prototype,"occluder"),Wl([u()],os.prototype,"initiateRoomCaptureIfNoData"),Wl([u()],os.prototype,"usePlaneData"),Wl([u()],os.prototype,"useMeshData"),Wl([u()],os.prototype,"runInVR");var rL=Object.defineProperty,aL=(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 eS=v("debugwebxr");class sm extends R{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Z.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(eS){const e=new k;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(ea);t&&(t.isGizmo=!1);const i=new Pi(.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),eS&&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)}}aL([u()],sm.prototype,"priority");class lL extends R{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}C.add("AlignmentConstraint",Fc),C.add("Animation",Ft),C.add("Animator",bt),C.add("AudioListener",Fo),C.add("AudioSource",Ii),C.add("Avatar_Brain_LookAt",Hc),C.add("Avatar_MouthShapes",Gc),C.add("Avatar_MustacheShake",Ef),C.add("AvatarBlink_Simple",Nr),C.add("AvatarEyeLook_Rotation",Af),C.add("AxesHelper",ol),C.add("BasicIKConstraint",Lf),C.add("BoxHelperComponent",Pt),C.add("Camera",pi),C.add("CharacterController",Vr),C.add("CharacterControllerInput",No),C.add("SphereCollider",sl),C.add("BoxCollider",Wu),C.add("MeshCollider",Es),C.add("CapsuleCollider",Uo),C.add("ContactShadows",Xc),C.add("LogStats",Bf),C.add("DeleteBox",lr),C.add("Deletable",Uf),C.add("DeviceFlag",$u),C.add("DragControls",Hr),C.add("DropListener",Wo),C.add("Duplicatable",iy),C.add("EventListEvent",Lu),C.add("EventTrigger",Ku),C.add("GltfExportBox",ry),C.add("GltfExport",ly),C.add("VariantAction",yy),C.add("ChangeTransformOnClick",Qr),C.add("ChangeMaterialOnClick",_y),C.add("SetActiveOnClick",vy),C.add("HideOnStart",pn),C.add("EmphasizeOnClick",bl),C.add("PlayAudioOnClick",Ls),C.add("PlayAnimationOnClick",ih),C.add("PreliminaryAction",_l),C.add("PreliminaryTrigger",nh),C.add("VisibilityAction",oh),C.add("TapGestureTrigger",xy),C.add("USDZExporter",Tn),C.add("Fog",kl),C.add("BoxGizmo",ea),C.add("GridHelper",Ml),C.add("GroundProjectedEnv",Yn),C.add("UsageMarker",Qc),C.add("Interactable",Ff),C.add("FixedJoint",Yy),C.add("HingeJoint",gh),C.add("Light",bi),C.add("LODGroup",yh),C.add("LookAtConstraint",Br),C.add("NeedleMenu",ro),C.add("NestedGltf",bh),C.add("Networking",e0),C.add("OffsetConstraint",ta),C.add("CameraTargetReachedEvent",$c),C.add("OrbitControls",fe),C.add("ParticleSystemRenderer",rn),C.add("ParticleSystem",xh),C.add("Attractor",Al),C.add("PlayerColor",Yl),C.add("Antialiasing",Ch),C.add("BloomEffect",Tp),C.add("ChromaticAberration",Ph),C.add("ColorAdjustments",Xs),C.add("DepthOfField",In),C.add("EffectWrapper",kh),C.add("PixelationEffect",Mh),C.add("ScreenSpaceAmbientOcclusion",Zo),C.add("ScreenSpaceAmbientOcclusionN8",Ln),C.add("SharpeningEffect",Eh),C.add("TiltShiftEffect",co),C.add("ToneMappingEffect",qs),C.add("Vignette",la),C.add("Volume",Ll),C.add("ReflectionProbe",Zc),C.add("Renderer",Jt),C.add("MeshRenderer",Kc),C.add("SkinnedMeshRenderer",ey),C.add("Rigidbody",Ke),C.add("SceneSwitcher",Ye),C.add("ScreenCapture",Ys),C.add("SeeThrough",Jo),C.add("ShadowCatcher",Dh),C.add("RemoteSkybox",Fp),C.add("SmoothFollow",zp),C.add("SpatialTriggerReceiver",ho),C.add("SpatialTrigger",Np),C.add("SpectatorCamera",Vp),C.add("SplineContainer",da),C.add("SplineWalker",ln),C.add("SpriteRenderer",fi),C.add("SyncedCamera",S0),C.add("SyncedRoom",Dn),C.add("SyncedTransform",kn),C.add("TestRunner",O0),C.add("TestSimulateUserData",k0),C.add("PlayableDirector",ua),C.add("SignalReceiver",Nh),C.add("AnimationTrackHandler",Vh),C.add("AudioTrackHandler",ds),C.add("MarkerTrackHandler",Gp),C.add("SignalTrackHandler",Wh),C.add("ControlTrackHandler",qp),C.add("TransformGizmo",pa),C.add("BaseUIComponent",hn),C.add("UIRootComponent",ch),C.add("Button",es),C.add("Canvas",Ol),C.add("CanvasGroup",Ns),C.add("EventSystem",ri),C.add("Graphic",uh),C.add("MaskableGraphic",ph),C.add("Image",Fl),C.add("RawImage",Yp),C.add("InputField",T0),C.add("VerticalLayoutGroup",Uy),C.add("HorizontalLayoutGroup",zy),C.add("GridLayoutGroup",Ny),C.add("Outline",Cl),C.add("ObjectRaycaster",Ai),C.add("GraphicRaycaster",Bu),C.add("SpatialGrabRaycaster",_a),C.add("RectTransform",En),C.add("SpatialHtml",Hh),C.add("Text",Wt),C.add("EnvironmentScene",Kp),C.add("LookAt",A0),C.add("OpenURL",Ul),C.add("VideoPlayer",ut),C.add("Voip",Rs),C.add("ClickThrough",em),C.add("CursorFollow",ga),C.add("HoverAnimation",go),C.add("ScrollFollow",ts),C.add("ViewBox",nt),C.add("Avatar",js),C.add("XRControllerFollow",is),C.add("XRControllerModel",Go),C.add("XRControllerMovement",Di),C.add("TeleportTarget",pp),C.add("WebARCameraBackground",Yh),C.add("WebARSessionRoot",Vi),C.add("WebXR",mp),C.add("AvatarMarker",Ie),C.add("WebXRImageTracking",Zh),C.add("WebXRPlaneTracking",os),C.add("XRRig",sm),C.add("XRFlag",Ji),C.add("PlayerSync",My),C.add("PlayerState",nn),C.add("PresentationMode",lL);const Jh=yt,cL=v("debugtypestore");cL&&console.log(C);function hL(o,e){const t=Iv(o,e);return t!==void 0?t:null}const dL=new rM,U0=Symbol("deserialize-queue");async function uL(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 Dt(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new Xg(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=dL;let c=o[U0];if(c||(c=o[U0]=[]),t.scenes)for(const h of t.scenes)await V0(l,h,c,s,0);if(t.children)for(const h of t.children)await V0(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[U0];if(h){for(const d of h)pL(d,l);h.length=0}if(r){const d={},p=[];N0(t,r,d,p);for(const m of t.scenes)N0(m,r,d,p);for(const m of p)m.resolveGuids(d)}})}const z0=Symbol("original-component-name"),$l=new Map;function N0(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&($l.has(s)||(Jh&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),$l.set(s,new Dt(s))));const r=s&&$l.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?$l.has(l)||(Jh&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[z0]),$l.set(l,new Dt(l))):Jh&&console.warn("Can not create IdProvider: component "+a[z0]+" has no guid",a.guid);const c=$l.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)N0(a,e,t,i)}const ed=[];async function V0(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;const l=C.get(a.name);if(l!=null){const c=new l;c.sourceId=o.gltfId,Ha(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[pc]=a.guid),c[z0]=a.name,Mr(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 Jh&&console.debug("unknown component: "+a.name),ed.includes(a.name)||ed.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await V0(o,r,t,i,n+1);if(ed.length>0&&n===0){const r=ed.join(", ");console.warn(`Unknown components in scene: ${r}`),ed.length=0,$i()&&Ee(`<strong>Unknown components in scene</strong>:
|
|
1473
|
+
|
|
1474
|
+
${r}
|
|
1475
|
+
|
|
1476
|
+
This could mean you forgot to add a npmdef to your ExportInfo
|
|
1477
|
+
<a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,Ri.Warn)}}function pL(o,e){const{instance:t,compData:i,obj:n}=o;e.object=n,e.target=t,lu(t,i,e),Jh&&console.debug("add "+i.name,i,t)}class tS{createBuiltinComponents(e,t,i,n,s){return uL(e,t,i,n,s)}writeBuiltinComponentData(e,t){return hL(e,t)}parseSync(e,t,i,n){return oS(e,t,i,n)}loadSync(e,t,i,n,s){return W0(e,t,i,n,s)}}hg(tS);const iS=v("printGltf")||v("printgltf"),mL=v("debugfileformat");async function nS(o,e,t){const i=await ux(o,{useExtension:!0})||"unknown";mL&&console.debug(`Determined file type: '${i}' for url '${o}'`,{registeredModelLoaderCallbacks:al});for(const n of al){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.
|
|
1478
|
+
Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,o);const n=new Po;return await Qu(n,e,o,t),n}case"model/fbx":case"model/vnd.autodesk.fbx":return new Pb;case"model/obj":return new Tm;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 Po;return await Qu(n,e,o,t),n}}}function gL(o,e){return W0(e?.context||z.Current,o,o,e?.seed||null,e?.onprogress)}async function oS(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 nS(t,o,t);if(!n)return;const{componentsExtension:s}=sS(n,o);if(n instanceof Tm){typeof e!="string"&&(e=new TextDecoder().decode(e));const r=n.parse(e);return await td(n,o,t,r,i,s)}if(!(n instanceof Po)){if(n.parse===void 0){console.error("Loader does not support parse");return}const r=n.parse(e,t);return await td(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 td(n,o,t,h,i,s);r(d)},h=>{console.error('Loading asset at "'+t+`" failed
|
|
1479
|
+
`,h),r(void 0)})}catch(l){console.error(l),a(l)}})}async function W0(o,e,t,i,n){yL(e);const s=await nS(e,o,t);if(!s)return;const{componentsExtension:r}=sS(s,o);if(!(s instanceof Po)){const a=await s.loadAsync(e,n);return await td(s,o,e,a,i,r)}return new Promise((a,l)=>{try{s.load(e,async c=>{const h=await td(s,o,t,c,i,r);a(h)},c=>{n?.call(s,c)},c=>{console.error('Loading asset at "'+e+`" failed
|
|
1480
|
+
`,c),a(void 0)})}catch(c){console.error(c),l(c)}})}function sS(o,e){const t=Qf(o);return o instanceof Po&&yf(o,e),{componentsExtension:t}}async function td(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 k,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 k,animations:[],scenes:[]};if(i instanceof k)i={scene:i,animations:i.animations,scenes:[i]};else if(i instanceof fn){const r=new mt({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]),bL(o,i),Yw(i)&&(xx(t,i,e),await vn().createBuiltinComponents(e,t,i,n,s||void 0)),await fL(i.scene,e,e.mainCamera),i}async function fL(o,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(o,t,e.scene).catch(i=>{console.warn(i.message)}):Gk(o,e)}catch(i){console.warn(i?.message||i)}}function yL(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.
|
|
1481
|
+
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>`;Ee(e),console.warn(e)}}function bL(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 Pb||o instanceof Tm){let t=e;t instanceof k||(t=e.scene||e.scenes.find(i=>i)),t.traverse(i=>{const n=i;n?.isMesh&&og(n,n.material)})}}const id=v("debugoverlay"),rS="ar",_L="quit-ar";class vL{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,L.isMozillaXR()){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,L.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;id&&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),id&&!L.isMobileDevice()&&this.ensureQuitARButton(t),t}onRequestedEndAR(){this.currentSession&&(this.currentSession.end(),this.currentSession=null)}ensureQuitARButton(e){if(L.isNeedleAppClip())return;const t=document.createElement("slot");t.setAttribute("name","quit-ar"),this.appendElement(t,e),this._createdAROnlyElements.push(t),t.style.pointerEvents="auto";const i=document.querySelector(`.${_L}`);if(i){i.addEventListener("click",this.requestEndAR),id&&i.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),id&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const n=document.createElement("div");n.style.cssText=`
|
|
1482
|
+
position: fixed;
|
|
1483
|
+
top: 0;
|
|
1484
|
+
right: 0;
|
|
1485
|
+
z-index: 600;
|
|
1486
|
+
pointer-events: all;
|
|
1487
|
+
`,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=`
|
|
1488
|
+
background: rgba(255, 255, 255, .4);
|
|
1489
|
+
-webkit-backdrop-filter: blur(8px);
|
|
1490
|
+
backdrop-filter: blur(8px);
|
|
1491
|
+
border-radius: 50%;
|
|
1492
|
+
box-shadow: 0 0 5px rgba(0,0,0,.3);
|
|
1493
|
+
outline: 1px solid rgba(255, 255, 255, .6);
|
|
1494
|
+
display: flex;
|
|
1495
|
+
justify-content: center;
|
|
1496
|
+
align-items: center;
|
|
1497
|
+
`,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=`
|
|
1498
|
+
/**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
|
|
1499
|
+
`,s.appendChild(r),id&&console.log("Created fallback close button",s,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const ya=v("debugloading"),nd=v("debugloadingrendering");v("debuglicense");class wL{className;additionalClasses}let od=0,aS;function $0(o){ya&&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?(aS!==o.name&&(od=0),aS=o.name,od+=(1-od)*.001,ya&&be("Loading "+o.name+" did not report total size")):od=o.progress.loaded/t;const i=o.index/e+od/e;return D.clamp01(i)}class yd{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(ya&&console.warn("Begin Loading"),!this._loadingElement){for(let i=0;i<t.children.length;i++){const n=t.children[i];if(n.classList.contains(yd.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){ya&&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=$0(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=i,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){ya&&console.warn("Finished Loading"),nd||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}_progressLoop;smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;nd&&(e=1/500,typeof nd=="number"&&(e*=nd)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!nd&&(e=.9),this._progress=D.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){if(this._loadingElement){ya&&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){ya&&!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=Qn();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??yd.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=`
|
|
1500
|
+
position: relative;
|
|
1501
|
+
display: flex;
|
|
1502
|
+
flex-direction: column;
|
|
1503
|
+
align-items: center;
|
|
1504
|
+
justify-content: center;
|
|
1505
|
+
width: 100%;
|
|
1506
|
+
height: 100%;
|
|
1507
|
+
pointer-events: none;
|
|
1508
|
+
`,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=`
|
|
1509
|
+
position: absolute;
|
|
1510
|
+
left: 0;
|
|
1511
|
+
top: 0;
|
|
1512
|
+
bottom: 0;
|
|
1513
|
+
right: 0;
|
|
1514
|
+
z-index: -1;
|
|
1515
|
+
overflow: hidden;
|
|
1516
|
+
|
|
1517
|
+
margin: -${g};
|
|
1518
|
+
background: url('${r?.length?r:"/include/poster.webp"}') center center no-repeat;
|
|
1519
|
+
background-size: cover;
|
|
1520
|
+
filter: blur(${g});
|
|
1521
|
+
`,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=vu,i&&this._element){const f=this._element.getAttribute("loading-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=`
|
|
1522
|
+
display: flex;
|
|
1523
|
+
flex-direction: column;
|
|
1524
|
+
align-items: center;
|
|
1525
|
+
justify-content: center;
|
|
1526
|
+
width: 100%;
|
|
1527
|
+
opacity: 0;
|
|
1528
|
+
transition: opacity 1s ease-in-out 4s;
|
|
1529
|
+
`,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}}hg(tS);const Me=v("debugwebcomponent"),lS="needle-engine",cS="vr",hS="desktop",xL=[rS,cS,hS],sd="ar-session-active",rd="desktop-session-active",SL=["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 H0 extends HTMLElement{static get observedAttributes(){return SL}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;constructor(){super(),this._overlay_ar=new vL,this.addEventListener("ready",this.onReady),_w(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
|
|
1530
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
|
|
1531
|
+
|
|
1532
|
+
:host {
|
|
1533
|
+
position: absolute;
|
|
1534
|
+
display: block;
|
|
1535
|
+
width: max(600px, 100%);
|
|
1536
|
+
height: max(300px, 100%);
|
|
1537
|
+
touch-action: none;
|
|
1538
|
+
|
|
1539
|
+
-webkit-tap-highlight-color: transparent;
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
@media (max-width: 600px) {
|
|
1543
|
+
:host {
|
|
1544
|
+
width: 100%;
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
@media (max-height: 300px) {
|
|
1548
|
+
:host {
|
|
1549
|
+
height: 100%;
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
:host > div.canvas-wrapper {
|
|
1554
|
+
width: 100%;
|
|
1555
|
+
height: 100%;
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
:host canvas {
|
|
1559
|
+
position: absolute;
|
|
1560
|
+
user-select: none;
|
|
1561
|
+
-webkit-user-select: none;
|
|
1562
|
+
|
|
1563
|
+
/** allow touch panning but no pinch zoom **/
|
|
1564
|
+
/** but this doesnt work yet:
|
|
1565
|
+
* touch-action: pan-x, pan-y;
|
|
1566
|
+
**/
|
|
1567
|
+
|
|
1568
|
+
-webkit-touch-callout: none;
|
|
1569
|
+
-webkit-user-drag: none;
|
|
1570
|
+
-webkit-user-modify: none;
|
|
1571
|
+
|
|
1572
|
+
left: 0;
|
|
1573
|
+
top: 0;
|
|
1574
|
+
}
|
|
1575
|
+
:host .content {
|
|
1576
|
+
position: absolute;
|
|
1577
|
+
top: 0;
|
|
1578
|
+
width: 100%;
|
|
1579
|
+
height: 100%;
|
|
1580
|
+
visibility: visible;
|
|
1581
|
+
z-index: 500; /* < must be less than the webxr buttons element */
|
|
1582
|
+
pointer-events: none;
|
|
1583
|
+
}
|
|
1584
|
+
:host .overlay-content {
|
|
1585
|
+
position: absolute;
|
|
1586
|
+
user-select: auto;
|
|
1587
|
+
pointer-events: all;
|
|
1588
|
+
}
|
|
1589
|
+
:host slot[name="quit-ar"]:hover {
|
|
1590
|
+
cursor: pointer;
|
|
1591
|
+
}
|
|
1592
|
+
:host .quit-ar-button {
|
|
1593
|
+
position: absolute;
|
|
1594
|
+
// top: env(titlebar-area-y); /** this doesnt work **/
|
|
1595
|
+
top: 60px; /** camera access needs a bit more space **/
|
|
1596
|
+
right: 20px;
|
|
1597
|
+
z-index: 9999;
|
|
1598
|
+
}
|
|
1599
|
+
</style>
|
|
1600
|
+
<div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
|
|
1601
|
+
<canvas></canvas>
|
|
1602
|
+
</div>
|
|
1603
|
+
<div class="content">
|
|
1604
|
+
<slot class="overlay-content"></slot>
|
|
1605
|
+
</div>
|
|
1606
|
+
`,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new z({domElement:this}),this.addEventListener("error",this.onError)}async connectedCallback(){if(Me&&console.log("<needle-engine> connected"),this.setPublicKey(),this.setVersion(),(this.getAttribute("tabindex")===null||this.getAttribute("tabindex")===void 0)&&this.setAttribute("tabindex","0"),this.addEventListener("xr-session-started",this.onXRSessionStarted),this.onSetupDesktop(),!this.getAttribute("src")){const t=globalThis["needle:codegen_files"];Me&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(Me&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}Me&&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";Me&&console.warn('<needle-engine> disconnected, keep-alive: "'+e+'"',typeof e,"Dispose=",t),t?(Me&&console.warn("<needle-engine> dispose"),this._context?.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):Me&&console.warn("<needle-engine> is not disposed because keep-alive is set")}connectedMoveCallback(){}attributeChangedCallback(e,t,i){switch(Me&&console.log("attributeChangedCallback",e,t,i),e){case"src":Me&&console.warn(`<needle-engine src>
|
|
1607
|
+
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&&(Me&&console.log(e+" attribute changed",i),this.registerEventFromAttribute(e,i));break;case"dracoDecoderPath":Me&&console.log("dracoDecoderPath",i),Rw(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(Me&&console.log("dracoDecoderType",i),Ew(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":Me&&console.log("ktx2DecoderPath",i),Tw(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!=ja&&this.setPublicKey();break}case"version":{i!=_n&&this.setVersion();break}case"focus-rect":{const n=this.getAttribute("focus-rect");if(n&&this._context)if(n===null)this._context.setCameraFocusRect(null);else if(typeof n=="string"&&n.length>0){const s=document.querySelector(n);this._context.setCameraFocusRect(s instanceof HTMLElement?s:null)}else n instanceof HTMLElement&&this._context.setCameraFocusRect(n)}break}}get toneMapping(){return this.getAttribute("tonemapping")||this.getAttribute("tone-mapping")}_loadId=0;_abortController=null;_lastSourceFiles=null;_createContextPromise=null;async onLoad(){if(!this.isConnected)return;if(this._context||(Me&&console.warn("Create new context"),this._context=new z({domElement:this})),!this._context){console.error("Needle Engine: Context not initialized");return}const e=this.getSourceFiles();if(!this.checkIfSourceHasChanged(e,this._lastSourceFiles))return;this._abortController&&(Me&&console.warn("Abort previous loading process"),this._abortController.abort(),this._abortController=null),this._lastSourceFiles=e;const t=++this._loadId;if((e==null||e.length<=0)&&(Me&&console.warn("Clear scene",e),this._context.clear(),t!==this._loadId))return;const i=this.getAttribute("alias");this.classList.add("loading");const n=Do();this.ensureLoadStartIsRegistered();let s=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:i},cancelable:!0}));if(n){const f=this.getAttribute("hide-loading-overlay");f!=null&&f!=="0"&&(s=!1)}s===!1&&!n&&(A()||(s=!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&&s&&(this._loadingView=new yd(this)),s&&(this._didFullyLoad!==!0?this._loadingView?.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===t&&this._loadingView.onLoadingBegin("begin load")},300)),Me&&console.warn(`--------------
|
|
1608
|
+
Needle Engine: Begin loading `+t+`
|
|
1609
|
+
`,e),this.onBeforeBeginLoading();const r=[],a={context:this._context,name:"",progress:{},index:0,count:e.length,totalProgress01:this._loadingProgress01},l=new CustomEvent("progress",{detail:a}),c=new Array,h=new AbortController;this._abortController=h;const d={files:e,abortSignal:h.signal,onLoadingProgress:f=>{if(Me&&console.debug("Loading progress: ",f),h.signal.aborted)return;const g=f.index;!c[g]&&f.name&&(c[g]=CL(f.name)),f.name=c[g],s&&this._loadingView?.onLoadingUpdate(f),a.name=f.name,a.progress=f.progress,this._loadingProgress01=$0(f),a.totalProgress01=this._loadingProgress01,this.dispatchEvent(l)},onLoadingFinished:(f,g,y)=>{Me&&console.debug(`Finished loading "${g}" (aborted? ${h.signal.aborted})`),!h.signal.aborted&&y&&r.push({src:g,file:y})}};PL(this);const p=this.getAttribute("hash");p!=null&&(this._context.hash=p),this._context.alias=i,this._createContextPromise=this._context.create(d);const m=await this._createContextPromise;if(this.applyAttributes(),Me&&console.warn(`--------------
|
|
1610
|
+
Needle Engine: finished loading `+t+`
|
|
1611
|
+
`,e,`Aborted? ${h.signal.aborted}`),h.signal.aborted){console.log("Loading finished but aborted...");return}if(this._loadId!==t){console.log("Load id changed during loading process");return}this._loadingProgress01=1,s&&m&&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:i,loadedFiles:r}}))}applyAttributes(){if(this._context?.renderer){const n=gw(this.toneMapping);n!==void 0&&(this._context.renderer.toneMapping=n);const s=this.getAttribute("tone-mapping-exposure");if(s!=null){const r=parseFloat(s);isNaN(r)||(this._context.renderer.toneMappingExposure=r)}}const e=this.getAttribute("background-blurriness");if(e!=null){const n=parseFloat(e);!isNaN(n)&&this._context&&(this._context.scene.backgroundBlurriness=n)}const t=this.getAttribute("environment-intensity");if(t!=null&&this._context){const n=parseFloat(t);!isNaN(n)&&this._context&&(this._context.scene.environmentIntensity=n)}const i=this.getAttribute("background-color");if(this._context?.renderer)if(typeof i=="string"&&i.length>0){const n=se.fromColorRepresentation(i);Me&&console.debug("<needle-engine> background-color changed, str:",i,"\u2192",n),this._context.renderer.setClearColor(n,n.alpha),this.context.scene.background=null}else this.getAttribute("background-image")&&this.setAttribute("background-image",this.getAttribute("background-image"))}onXRSessionStarted=()=>{const e=this.context.xrSessionMode;e==="immersive-ar"?this.onEnterAR(this.context.xrSession):e==="immersive-vr"&&this.onEnterVR(this.context.xrSession),this.context.xrSession?.addEventListener("end",()=>{this.dispatchEvent(new CustomEvent("xr-session-ended",{detail:{session:this.context.xrSession,context:this._context,sessionMode:e}})),e==="immersive-ar"?this.onExitAR(this.context.xrSession):e==="immersive-vr"&&this.onExitVR(this.context.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._context,s)))}catch(n){console.error("Error registering event "+e+'="'+t+`" failed with the following error:
|
|
1612
|
+
`,n)}}setPublicKey(){ja&&ja.length>0&&this.setAttribute("public-key",ja)}setVersion(){_n.length>0&&this.setAttribute("version",_n)}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){this.onSetupAR();const t=this.getAROverlayContainer();this._overlay_ar.onBegin(this._context,t,e),this.dispatchEvent(new CustomEvent("enter-ar",{detail:{session:e,context:this._context,htmlContainer:this._overlay_ar?.ARContainer}}))}onExitAR(e){this._overlay_ar.onEnd(this._context),this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-ar",{detail:{session:e,context:this._context,htmlContainer:this._overlay_ar?.ARContainer}}))}onEnterVR(e){this.onSetupVR(),this.dispatchEvent(new CustomEvent("enter-vr",{detail:{session:e,context:this._context}}))}onExitVR(e){this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-vr",{detail:{session:e,context:this._context}}))}onSetupAR(){this.classList.add(sd),this.classList.remove(rd);const e=this.getAROverlayContainer();Me&&console.warn("onSetupAR:",e),e&&(e.classList.add(sd),e.classList.remove(rd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,rS))}onSetupVR(){this.classList.remove(sd),this.classList.remove(rd),this.foreachHtmlElement(e=>this.setupElementsForMode(e,cS))}onSetupDesktop(){this.classList.remove(sd),this.classList.add(rd);const e=this.getAROverlayContainer();e&&(e.classList.remove(sd),e.classList.add(rd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,hS))}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 xL)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&&(Me&&console.log("using custom draco decoder path",e),Rw(e));const t=this.getAttribute("dracoDecoderType");t&&(Me&&console.log("using custom draco decoder type",t),Ew(t));const i=this.getAttribute("ktx2DecoderPath");i&&(Me&&console.log("using custom ktx2 decoder path",i),Tw(i))}setAttribute(e,t){super.setAttribute(e,t)}getAttribute(e){return super.getAttribute(e)}addEventListener(e,t,i){return super.addEventListener(e,t,i)}}typeof window<"u"&&!window.customElements.get(lS)&&window.customElements.define(lS,H0);function CL(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 A()&&console.debug("Loading: use default name",t),t}function PL(o){ku(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 OL=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:H0},Symbol.toStringTag,{value:"Module"}));function kL(){Bn.registerWaitForInteraction(()=>{const o=$C.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)})})}setTimeout(kL,1e3);const He=v("debugphysics"),G0=v("debugcolliderplacement"),q0=v("debugcollisions"),ML=v("showcolliders"),rm=v("debugraycasts"),wi=Symbol("needle component"),qt=Symbol("physics body"),dS=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,He&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),pe.registerCallback(ue.ContextCreationStart,o=>{He&&console.log("Register rapier physics backend"),o.context.physics.engine=new Kl(o.context)});class Kl{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if(He&&console.log("REMOVE BODY",e?.name,e[qt]),!e)return;this.validate();const t=e[qt];if(e[qt]=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[wi]||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)))}}}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[qt];s&&this.syncPhysicsBody(n.gameObject,s,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[qt];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 v("__nophysics")?(console.warn("Physics are disabled"),!1):(He&&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&&(He&&console.trace("Loading rapier physics engine"),await(await T.RAPIER_PHYSICS.load()).init()),He&&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,He&&console.log("Physics world created"),!0))}validate(){this._isInitialized||He&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new Mi(()=>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||rm)&&F.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[wi];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[wi]}}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||rm)&&F.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[wi];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[wi]}}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)&&(He&&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=J(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||rm)&&F.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||rm)&&F.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[wi],r=new ex(s.gameObject,s);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[wi].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 K;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){He&&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){He&&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){He&&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){He&&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=pP(s));let r=null;const a=s.getAttribute("position");if(a instanceof ab){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){He&&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))He&&console.warn("Use cached mesh collider"),r=this._meshCache.get(d);else{(He||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[qt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case _t.Average:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case _t.Maximum:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case _t.Minimum:i.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case _t.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 _t.Average:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case _t.Maximum:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case _t.Minimum:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case _t.Multiply:i.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[qt]:null}getComponent(e){return e?e[wi]: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):(He&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(_e(e.gameObject)),i.setPosition(J(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 _t.Average:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case _t.Maximum:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case _t.Minimum:t.setRestitutionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case _t.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 _t.Average:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case _t.Maximum:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case _t.Minimum:t.setFrictionCombineRule(T.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case _t.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[wi]=e,e[qt]=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),He&&console.log("Created collider",e.name,r),r}catch(r){return console.error('Error creating collider "'+e.name+`"
|
|
1613
|
+
Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[qt],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[qt],!i){const s=n.isKinematic&&!G0;He&&console.log("Create rigidbody",s);const r=s?T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),a=J(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[wi]=n,n[qt]=i,this.internalUpdateRigidbodyProperties(n,i),this.getRigidbodyRelativeMatrix(e.gameObject,n.gameObject,t),e[dS]=i}else{const n=T.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),s=J(e.gameObject);n.setTranslation(s.x,s.y,s.z),n.setRotation(_e(e.gameObject)),i=this.world.createRigidBody(n),t.identity(),i[wi]=null}return i}internal_getRigidbody(e){return e.isCollider===!0?e[dS]:e[qt]}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!==Au.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;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 RL(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){if(He||G0||ML||this.debugRenderColliders===!0){if(!this.lines){const i=new bm({color:7855479,fog:!1}),n=new fn;this.lines=new rb(n,i),this.lines.layers.disableAll(),this.lines.layers.enable(2)}this.lines.parent!==this.context?.scene&&this.context?.scene.add(this.lines);const t=e.debugRender();this.lines.geometry.setAttribute("position",new gt(t.vertices,3)),this.lines.geometry.setAttribute("color",new gt(t.colors,4)),(this.context.time.frame%30===0||this.lines.geometry.boundingSphere?.radius===0)&&this.lines.geometry.computeBoundingSphere()}else this.lines&&this.context?.scene.remove(this.lines)}syncObjects(){if(!G0)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}gr(t.gameObject,s.x,s.y,s.z),eg(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=J(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[wi];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=Kl._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[qt],n=t[qt];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(Kl.centerConnectionPos,Kl.centerConnectionRot,this._tempPosition,this._tempQuaternion),r=this.world.createImpulseJoint(s,i,n,!0);He&&console.log("ADD FIXED JOINT",r)}addHingeJoint(e,t,i,n){if(!this.world){console.error("Physics world not initialized");return}const s=e[qt],r=t[qt];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);He&&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 RL{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[wi],a=s[wi];q0&&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)Ar(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)=>{Ar(r,c=>{if(c.destroyed)return;const h=c.onCollisionEnter||c.onCollisionStay||c.onCollisionExit;if(h||q0){if(!s){const d=[],p=a.normal();i instanceof Es&&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),w=a.solverContactTangentVelocity(m),P=new Kw(f,y,p,g,_,w);d.push(P),q0&&F.DrawDirection(f,p,16711680,3,!0)}}s=new Jw(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)}}}}}}class EL{static async createComparisonScene(e){const{files:t}=e,i=await Promise.all(t.map(f=>new ne(f).loadAssetAsync())),n=new Si;let s=0;for(const f of i)if(f instanceof k){f.position.y=s,n.add(f);const g=Qt([f]);s+=g.getSize(new b).y,s+=.1}const r=new ae(20);n.add(r);const a=e.environment||"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/studio_small_09_1k.exr";{let f=null;if(a.endsWith(".hdr")){const g=(await import("./three-examples-MsJjauyk.min.js").then(y=>y.RGBELoader$1)).RGBELoader;f=new g}else if(a.endsWith(".exr")){const g=(await import("./three-examples-MsJjauyk.min.js").then(y=>y.EXRLoader$1)).EXRLoader;f=new g}if(f){const g=await f.loadAsync(a).catch(y=>(console.error(y),null));g&&(g.mapping=Vn,g.needsUpdate=!0,n.background=g,n.environment=g,n.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",a)}const l=Qt(n.children),c=l.getCenter(new b),h=l.getSize(new b),d=Math.max(h.x,h.y,h.z)/(2*Math.tan(Math.PI*r.fov/360));r.position.set(c.x,c.y,d),r.lookAt(c);const p=new xb(r,e.domElement||document.body);p.target=c,p.update();const m=(e.domElement||document.body).getBoundingClientRect();return r.aspect=m.width/m.height,r.updateProjectionMatrix(),{scene:n,camera:r}}}let X0=0;function uS(o){o?X0++:X0--}function TL(){return X0>0}const AL={binary:!0,animations:!0};async function IL(o){if(!o.context)throw new Error("No context provided to exportAsGLTF");o.scene||(o.scene=o.context.scene);const e={...AL,...o},{context:t}=e,i=new Sb;i.register(a=>new Rx(a)),i.register(a=>new cT(a)),i.register(a=>new Mx(a)),Yf(i,e.context);const n={binary:e.binary,animations:DL(t,e.scene,[])},s=new LL;console.debug("Exporting GLTF",n),s.onBeforeExport(e),uS(!0);const r=await i.parseAsync(e.scene,n).catch(a=>(console.error(a),null));if(uS(!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 pS=Symbol("needle:weight");class LL{_undo=[];onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const i=xs.tryGetActionsFromMixer(t);if(i)for(let n=0;n<i.length;n++){const s=i[n];s[pS]=s.weight,s.weight=0,this._undo.push(()=>{s.weight=s[pS]})}t.update(0)}),e.context.scene.traverse(t=>{if(!sy(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 DL(o,e,t){o.animations.mixers.forEach(n=>{const s=xs.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)xs.tryGetAnimationClipsFromObjectHierarchy(n,t);const i=new Set(t);return Array.from(i)}const mS="needle-button",Q0=A();class gS extends HTMLElement{static observedAttributes=["ar","vr","quicklook"];constructor(){super(),this.removeEventListener("click",this.#r),this.addEventListener("click",this.#r)}attributeChangedCallback(e,t,i){this.#a()}#t;#n;#o;#e;#i;#s;#a(){if(this.#e?.remove(),this.getAttribute("ar")!=null)this.#i??=new sr,this.#e=this.#i.createARButton();else if(this.getAttribute("vr")!=null)this.#i??=new sr,this.#e=this.#i.createVRButton();else if(this.getAttribute("quicklook")!=null)this.#i??=new sr,this.#e=this.#i.createQuicklookButton();else{Q0?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.");return}this.#t??=this.attachShadow({mode:"open"}),this.#n??=document.createElement("slot"),this.#o??=document.createElement("style"),this.#o.innerHTML=`
|
|
1614
|
+
button {
|
|
1615
|
+
all: initial;
|
|
1616
|
+
cursor: inherit;
|
|
1617
|
+
color: inherit;
|
|
1618
|
+
font-family: inherit;
|
|
1619
|
+
gap: inherit;
|
|
1620
|
+
white-space: nowrap;
|
|
1621
|
+
}
|
|
1622
|
+
`,this.getAttribute("unstyled")!=null||(this.#o.innerHTML+=`
|
|
1623
|
+
:host {
|
|
1624
|
+
display: inline-block;
|
|
1625
|
+
background: rgba(255, 255, 255, .8);
|
|
1626
|
+
backdrop-filter: blur(10px);
|
|
1627
|
+
width: fit-content;
|
|
1628
|
+
transition: background .2s;
|
|
1629
|
+
|
|
1630
|
+
cursor: pointer;
|
|
1631
|
+
padding: 0.4rem .5rem;
|
|
1632
|
+
border-radius: 0.8rem;
|
|
1633
|
+
color: black;
|
|
1634
|
+
background: rgba(245, 245, 245, .8);
|
|
1635
|
+
outline: rgba(0,0,0,.05) 1px solid;
|
|
1636
|
+
}
|
|
1637
|
+
:host(:hover) {
|
|
1638
|
+
background: rgba(255, 255, 255, 1);
|
|
1639
|
+
transition: background .2s;
|
|
1640
|
+
}
|
|
1641
|
+
slot {
|
|
1642
|
+
display: flex;
|
|
1643
|
+
align-items: center;
|
|
1644
|
+
justify-content: center;
|
|
1645
|
+
gap: .5rem;
|
|
1646
|
+
}
|
|
1647
|
+
`),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),xu(cf,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#l()),this.#s.observe(this.#e,{attributes:!0}),Q0&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{Q0&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(mS)&&window.customElements.define(mS,gS);const ad=v("debugavatar");class Y0{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 fS{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 Fn;i=x.instantiate(Aa(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(ad&&console.log("[Custom Avatar] valid config",t,ad?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,ad?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(ad&&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 vn().parseSync(e,s,null,0))?.scene??null:null}const i=new Po;return yf(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await vn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{ad&&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 Ci().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 Y0(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 yS{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class bS{}const jL=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ye,ActionCollection:Kx,ActionModel:xi,AlignmentConstraint:Fc,Animation:Ft,AnimationCurve:_h,AnimationExtension:lp,AnimationTrackHandler:Vh,Animator:bt,AnimatorController:un,Antialiasing:Ch,Attractor:Al,AudioExtension:va,AudioListener:Fo,AudioSource:Ii,AudioTrackHandler:ds,Avatar:js,AvatarBlink_Simple:Nr,AvatarEyeLook_Rotation:Af,AvatarLoader:fS,AvatarMarker:Ie,AvatarModel:Y0,Avatar_Brain_LookAt:Hc,Avatar_MouthShapes:Gc,Avatar_MustacheShake:Ef,Avatar_POI:zr,AxesHelper:ol,BaseUIComponent:hn,BasicIKConstraint:Lf,BehaviorExtension:Ay,BehaviorModel:Lt,BloomEffect:Tp,BoxCollider:Wu,BoxGizmo:ea,BoxHelperComponent:Pt,Button:es,CallInfo:Bo,Camera:pi,CameraTargetReachedEvent:$c,Canvas:Ol,CanvasGroup:Ns,CapsuleCollider:Uo,ChangeMaterialOnClick:_y,ChangeTransformOnClick:Qr,CharacterController:Vr,CharacterControllerInput:No,ChromaticAberration:Ph,ClickThrough:em,ColorAdjustments:Xs,ColorBySpeedModule:El,ColorOverLifetimeModule:Cp,ContactShadows:Xc,ControlTrackHandler:qp,CursorFollow:ga,CustomBranding:Jr,Deletable:Uf,DeleteBox:lr,DepthOfField:In,DeviceFlag:$u,DocumentExtension:yS,DragControls:Hr,DropListener:Wo,Duplicatable:iy,EffectWrapper:kh,EmissionModule:Yo,EmphasizeOnClick:bl,EnvironmentScene:Kp,EventList:de,EventListEvent:Lu,EventSystem:ri,EventTrigger:Ku,FieldWithDefault:Ox,FixedJoint:Yy,Fog:kl,GltfExport:ly,GltfExportBox:ry,Gradient:ia,Graphic:uh,GraphicRaycaster:Bu,GridHelper:Ml,GridLayoutGroup:Ny,GroundProjectedEnv:Yn,GroupActionModel:Xr,HideOnStart:pn,HingeJoint:gh,HorizontalLayoutGroup:zy,get HoverAnimation(){return go},Image:Fl,InheritVelocityModule:n0,InputField:T0,InstanceHandle:Pa,InstancingHandler:wa,Interactable:Ff,Keyframe:_i,LODGroup:yh,LODModel:Rl,Light:bi,LimitVelocityOverLifetimeModule:ht,LogStats:Bf,LookAt:A0,LookAtConstraint:Br,MainModule:$t,MarkerTrackHandler:Gp,MaskableGraphic:ph,MeshCollider:Es,MeshRenderer:Kc,MinMaxCurve:Y,MinMaxGradient:na,NeedleMenu:ro,NestedGltf:bh,Networking:e0,NoiseModule:ve,ObjectRaycaster:Ai,OffsetConstraint:ta,OpenURL:Ul,OrbitControls:fe,Outline:Cl,Padding:Kr,ParticleBurst:Sp,ParticleSubEmitter:o0,ParticleSystem:xh,ParticleSystemRenderer:rn,PhysicsExtension:Iy,PixelationEffect:Mh,PlayAnimationOnClick:ih,PlayAudioOnClick:Ls,PlayableDirector:ua,PlayerColor:Yl,PointerEventData:gd,PostProcessingHandler:w0,PreliminaryAction:_l,PreliminaryTrigger:nh,RawImage:Yp,Rect:s1,RectTransform:En,ReflectionProbe:Zc,RegisteredAnimationInfo:cr,RemoteSkybox:Fp,Renderer:Jt,RendererLightmap:Jf,Rigidbody:Ke,RotationBySpeedModule:sn,RotationOverLifetimeModule:An,SceneSwitcher:Ye,ScreenCapture:Ys,ScreenSpaceAmbientOcclusion:Zo,ScreenSpaceAmbientOcclusionN8:Ln,ScrollFollow:ts,SeeThrough:Jo,SetActiveOnClick:vy,ShadowCatcher:Dh,ShapeModule:i0,SharpeningEffect:Eh,SignalAsset:Hp,SignalReceiver:Nh,SignalReceiverEvent:zh,SignalTrackHandler:Wh,Size:o1,SizeBySpeedModule:vi,SizeOverLifetimeModule:oa,SkinnedMeshRenderer:ey,SmoothFollow:zp,SpatialGrabRaycaster:_a,SpatialHtml:Hh,SpatialTrigger:Np,SpatialTriggerReceiver:ho,SpectatorCamera:Vp,SphereCollider:sl,SplineContainer:da,SplineData:uo,SplineWalker:ln,Sprite:Ho,SpriteData:wl,SpriteRenderer:fi,SpriteSheet:vl,SubEmitterSystem:Mp,SyncedCamera:S0,SyncedRoom:Dn,SyncedTransform:kn,TapGestureTrigger:xy,TeleportTarget:pp,TestRunner:O0,TestSimulateUserData:k0,Text:Wt,TextBuilder:Fy,TextExtension:yp,TextureSheetAnimationModule:Ht,TiltShiftEffect:co,ToneMappingEffect:qs,TrailModule:Fe,TransformData:Ne,TransformGizmo:pa,TriggerBuilder:Vt,TriggerModel:or,UIRaycastUtils:xf,UIRootComponent:ch,USDZExporter:Tn,USDZText:Pl,USDZUIExtension:$y,UsageMarker:Qc,VariantAction:yy,VelocityOverLifetimeModule:$e,VerticalLayoutGroup:Uy,VideoPlayer:ut,get ViewBox(){return nt},Vignette:la,VisibilityAction:oh,Voip:Rs,Volume:Ll,VolumeParameter:U,VolumeProfile:Rp,WebARCameraBackground:Yh,WebARSessionRoot:Vi,WebXR:mp,WebXRImageTracking:Zh,WebXRImageTrackingModel:ns,WebXRPlaneTracking:os,WebXRTrackedImage:Zl,XRControllerFollow:is,XRControllerModel:Go,XRControllerMovement:Di,XRFlag:Ji,XRRig:sm,XRState:si,__Ignore:bS},Symbol.toStringTag,{value:"Module"})),ld=v("debugmissingcamera");pe.registerCallback(ue.MissingCamera,o=>{ld&&console.warn("Creating missing camera");const e=o.context.scene,t=new ae;t.name="Default Fallback Camera",e.add(t);const i=new pi;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Ur.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Ur.Skybox;else{if(i.clearFlags=Ur.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 HC(o.context.renderer),r=new Kp("neutral");e.environment=s.fromScene(r,.025).texture}}const n=Mr(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&_S(o.context,n),n}),pe.registerCallback(ue.ContextCreated,o=>{if(!o.context.mainCamera){ld&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(Kb(o.context.mainCamera)?.isCameraController==!0){ld&&console.log("Will not auto-fit because a camera controller exists");return}_S(o.context)}});function _S(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(ld&&console.log("Creating default camera controls",e?.name),t){const i=kc(t,fe);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,ld&&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")}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 Ft&&i.playAutomatically||i instanceof bt||i instanceof ua&&i.playOnAwake===!0)return!0;if(i instanceof Ft)return i.playAutomatically=!0,!0;if(i instanceof ua)return i.playOnAwake=!0,!0}},!0)!==!0&&xs.autoplayAnimations(t.file)});var Z0;(o=>{function e(t,i=!1,n=.75){const s=new da,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 uo;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(Z0||(Z0={}));class BL extends SP{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-iyfPIK6R.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=CP.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 gt(d.index,1,!1);t.setIndex(g)}f.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new Ci)),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 FL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:BL},Symbol.toStringTag,{value:"Module"}));export{dE as $physicsKey,ye as ActionBuilder,Kx as ActionCollection,xi as ActionModel,ew as Addressables,Fc as AlignmentConstraint,Ja as AmbientMode,Ft as Animation,_h as AnimationCurve,lp as AnimationExtension,Vh as AnimationTrackHandler,xs as AnimationUtils,bt as Animator,Ps as AnimatorConditionMode,un as AnimatorController,_f as AnimatorControllerParameterType,Uc as AnimatorStateInfo,Ch as Antialiasing,Bn as Application,rv as AssetDatabase,ne as AssetReference,Al as Attractor,va as AudioExtension,Fo as AudioListener,Ii as AudioSource,ds as AudioTrackHandler,js as Avatar,Nr as AvatarBlink_Simple,Af as AvatarEyeLook_Rotation,fS as AvatarLoader,Ie as AvatarMarker,Y0 as AvatarModel,Hc as Avatar_Brain_LookAt,Gc as Avatar_MouthShapes,Ef as Avatar_MustacheShake,zr as Avatar_POI,el as Axes,ol as AxesHelper,cg as BUILD_TIME,hn as BaseUIComponent,Lf as BasicIKConstraint,Ay as BehaviorExtension,Lt as BehaviorModel,Ir as BlobStorage,Tp as BloomEffect,Wu as BoxCollider,ea as BoxGizmo,Pt as BoxHelperComponent,es as Button,Un as ButtonsFactory,ix as CallDirection,Bo as CallInfo,pi as Camera,$c as CameraTargetReachedEvent,Ol as Canvas,Ns as CanvasGroup,Uo as CapsuleCollider,_y as ChangeMaterialOnClick,Qr as ChangeTransformOnClick,Vr as CharacterController,No as CharacterControllerInput,Ph as ChromaticAberration,Mi as CircularBuffer,Ur as ClearFlags,em as ClickThrough,po as ClipExtrapolation,en as Collider,Jw as Collision,Au as CollisionDetectionMode,Xs as ColorAdjustments,El as ColorBySpeedModule,Cp as ColorOverLifetimeModule,bR as Component,R as Component$1,tu as ComponentLifecycleEvents,jL as Components,H_ as ConnectionEvents,Kw as ContactPoint,Xc as ContactShadows,z as Context,iR as ContextArgs,ue as ContextEvent,pe as ContextRegistry,qp as ControlTrackHandler,ga as CursorFollow,Jr as CustomBranding,Re as CustomShader,_u as DefaultReflectionMode,Uf as Deletable,lr as DeleteBox,In as DepthOfField,$u as DeviceFlag,L as DeviceUtilities,yS as DocumentExtension,Hr as DragControls,Nf as DragMode,Wo as DropListener,iy as Duplicatable,kh as EffectWrapper,Yo as EmissionModule,bl as EmphasizeOnClick,yd as EngineLoadingView,Kp as EnvironmentScene,de as EventList,Lu as EventListEvent,ri as EventSystem,Ku as EventTrigger,Ox as FieldWithDefault,Ca as FileReference,iw as FileReferenceSerializer,LE as FileSpawnModel,hx as File_Event,Yy as FixedJoint,kl as Fog,xe as FrameEvent,Nd as GENERATOR,x as GameObject,F as Gizmos,ly as GltfExport,ry as GltfExportBox,ia as Gradient,uh as Graphic,Bu as GraphicRaycaster,rr as Graphics,Ml as GridHelper,Ny as GridLayoutGroup,Yn as GroundProjectedEnv,Xr as GroupActionModel,zu as HideFlags,pn as HideOnStart,gh as HingeJoint,zy as HorizontalLayoutGroup,Qk as HostData,go as HoverAnimation,Fl as Image,Sa as ImageReference,tw as ImageReferenceSerializer,n0 as InheritVelocityModule,A_ as Input,hi as InputEventQueue,Te as InputEvents,T0 as InputField,Pa as InstanceHandle,wa as InstancingHandler,dn as InstancingUtil,wv as InstantiateEvent,Dt as InstantiateIdProvider,Fn as InstantiateOptions,Ff as Interactable,Qh as InternalScreenshotUtils,bk as JoinedRoomResponse,ak as KeyEventArgs,_i as Keyframe,yh as LODGroup,Rl as LODModel,_k as LeftRoomResponse,bi as Light,hw as LightData,ht as LimitVelocityOverLifetimeModule,wL as LoadingElementOptions,Bf as LogStats,Ri as LogType,A0 as LookAt,Br as LookAtConstraint,T as MODULES,$t as MainModule,Gp as MarkerTrackHandler,M0 as MarkerType,ph as MaskableGraphic,D as Mathf,Es as MeshCollider,Kc as MeshRenderer,Y as MinMaxCurve,na as MinMaxGradient,Sc as NEEDLE_ENGINE_FEATURE_FLAGS,mc as NEKeyboardEvent,Ro as NEPointerEvent,gS as NeedleButtonElement,Wf as NeedleEngineModelLoader,H0 as NeedleEngineWebComponent,ro as NeedleMenu,Wd as NeedlePatchesKey,mg as NeedleXRController,Z as NeedleXRSession,X_ as NeedleXRSync,ev as NeedleXRUtils,bh as NestedGltf,q_ as NetworkConnection,Kn as NetworkedStreamEvents,fd as NetworkedStreams,e0 as Networking,Sv as NewInstanceModel,ve as NoiseModule,Ai as ObjectRaycaster,Cr as ObjectUtils,ta as OffsetConstraint,Ld as OneEuroFilter,Xm as OneEuroFilterXYZ,Ul as OpenURL,fe as OrbitControls,Cl as Outline,G_ as OwnershipEvent,vg as OwnershipModel,ja as PUBLIC_KEY,Kr as Padding,Sp as ParticleBurst,o0 as ParticleSubEmitter,xh as ParticleSystem,Gs as ParticleSystemBaseBehaviour,rn as ParticleSystemRenderer,xp as ParticleSystemShapeType,hs as PeerHandle,W_ as PeerNetworking,Xl as Physics,Iy as PhysicsExtension,_t as PhysicsMaterialCombine,Mh as PixelationEffect,ih as PlayAnimationOnClick,Ls as PlayAudioOnClick,ua as PlayableDirector,Yl as PlayerColor,nn as PlayerState,i1 as PlayerStateEvent,My as PlayerSync,sw as PlayerView,rw as PlayerViewManager,gd as PointerEventData,Hd as PointerType,it as PostProcessingEffect,dt as PostProcessingEffectOrder,w0 as PostProcessingHandler,_l as PreliminaryAction,nh as PreliminaryTrigger,As as PreviewHelper,Sr as PrimitiveType,le as Progress,Wm as PromiseAllWithErrors,Vm as PromiseErrorResult,se as RGBAColor,Kl as RapierPhysics,Yp as RawImage,vs as RaycastOptions,s1 as Rect,En as RectTransform,Zc as ReflectionProbe,cr as RegisteredAnimationInfo,Fp as RemoteSkybox,_o as RenderTexture,Gw as RenderTextureSerializer,Jt as Renderer,cw as RendererData,Jf as RendererLightmap,Ke as Rigidbody,Qe as RigidbodyConstraints,ie as RoomEvents,sn as RotationBySpeedModule,An as RotationOverLifetimeModule,qu as SceneLightSettings,Ye as SceneSwitcher,Ys as ScreenCapture,Zo as ScreenSpaceAmbientOcclusion,Ln as ScreenSpaceAmbientOcclusionN8,ts as ScrollFollow,Jo as SeeThrough,wn as SendQueue,Xg as SerializationContext,vy as SetActiveOnClick,Dh as ShadowCatcher,i0 as ShapeModule,ex as ShapeOverlapResult,Eh as SharpeningEffect,Hp as SignalAsset,Nh as SignalReceiver,zh as SignalReceiverEvent,Wh as SignalTrackHandler,o1 as Size,vi as SizeBySpeedModule,oa as SizeOverLifetimeModule,ey as SkinnedMeshRenderer,zp as SmoothFollow,_a as SpatialGrabRaycaster,Hh as SpatialHtml,Np as SpatialTrigger,ho as SpatialTriggerReceiver,Vp as SpectatorCamera,sl as SphereCollider,Eg as SphereIntersection,da as SplineContainer,uo as SplineData,Z0 as SplineUtils,ln as SplineWalker,Ho as Sprite,wl as SpriteData,fi as SpriteRenderer,vl as SpriteSheet,CR as StateMachineBehaviour,Mf as StreamEndedEvent,tx as StreamReceivedEvent,Mp as SubEmitterSystem,S0 as SyncedCamera,Dn as SyncedRoom,kn as SyncedTransform,xy as TapGestureTrigger,pp as TeleportTarget,O0 as TestRunner,EL as TestSceneUtils,k0 as TestSimulateUserData,Wt as Text,Fy as TextBuilder,yp as TextExtension,Ht as TextureSheetAnimationModule,co as TiltShiftEffect,uw as Time,qs as ToneMappingEffect,Bl as TrackHandler,zi as TrackType,Fe as TrailModule,Ne as TransformData,pa as TransformGizmo,Vt as TriggerBuilder,or as TriggerModel,C as TypeStore,xf as UIRaycastUtils,ch as UIRootComponent,cy as USDDocument,ot as USDObject,Dx as USDWriter,Bx as USDZExporter,Tn as USDZExporter$1,Pl as USDZText,$y as USDZUIExtension,qw as UriSerializer,Qc as UsageMarker,vk as UserJoinedOrLeftRoomModel,_n as VERSION,yy as VariantAction,$e as VelocityOverLifetimeModule,Uy as VerticalLayoutGroup,ut as VideoPlayer,nt as ViewBox,Lo as ViewDevice,la as Vignette,oh as VisibilityAction,Rs as Voip,Ll as Volume,U as VolumeParameter,Rp as VolumeProfile,kM as WaitForFrames,nw as WaitForPromise,nf as WaitForSeconds,ls as Watch,Yh as WebARCameraBackground,Vi as WebARSessionRoot,mp as WebXR,sr as WebXRButtonFactory,Zh as WebXRImageTracking,ns as WebXRImageTrackingModel,os as WebXRPlaneTracking,Zl as WebXRTrackedImage,is as XRControllerFollow,Go as XRControllerModel,Di as XRControllerMovement,Ji as XRFlag,sm as XRRig,si as XRState,eo as XRStateFlag,bS as __Ignore,Fk as __internalNotifyObjectDestroyed,Mo as activeInHierarchyFieldName,zm as addAttributeChangeCallback,Cn as addComponent,YE as addCustomExtensionPlugin,Mr as addNewComponent,Vd as addPatch,hu as apply,fR as applyHMRChanges,Uv as applyPrototypeExtensions,xv as beginListenDestroy,Pv as beginListenInstantiate,yg as binaryIdentifierCasts,tR as build_scene_functions,vr as builtinComponentKeyName,$0 as calculateProgress01,tO as clearMessages,NR as colorSerializer,Rv as compareAssociation,Du as componentSerializer,h_ as copyTexture,Uw as createMotion,di as debugNet,fc as debugOwner,Vx as decompressGpuTexture,oc as deepClone,ko as delay,sc as delayForFrames,lu as deserializeObject,Yi as destroy,Wv as destroyComponentInstance,dx as determineMimeTypeFromExtension,Pe as disposeObjectResources,Jn as disposeStream,pc as editorGuidKeyName,Da as enableSpatialConsole,WR as euler,qR as eventListSerializer,IL as exportAsGLTF,Kg as findByGuid,qa as findObjectOfType,Gv as findObjectsOfType,Tg as findResourceUsers,Vw as fitCamera,u_ as fitObjectIntoVolume,Ar as foreachComponent,gu as foreachComponentEnumerator,_O as forward,yw as generateQRCode,Cv as generateSeed,Qt as getBoundingBox,Kb as getCameraController,Rr as getComponent,Rc as getComponentInChildren,Ec as getComponentInParent,Mc as getComponents,Ga as getComponentsInChildren,cu as getComponentsInParent,Tx as getFormattedDate,Ot as getIconElement,lf as getIconTexture,vn as getLoader,kc as getOrAddComponent,v as getParam,xO as getParentHierarchyPath,IP as getPath,mk as getPeerOptions,N_ as getPeerjsInstance,zk as getResourceUserCount,t_ as getTempColor,li as getTempQuaternion,B as getTempVector,ic as getUrlParams,d_ as getVisibleInCustomShadowRendering,s_ as getWorldDirection,tg as getWorldEuler,J as getWorldPosition,_e as getWorldQuaternion,Fd as getWorldRotation,Ge as getWorldScale,Do as hasCommercialLicense,Dc as hasIndieLicense,Iu as hasPointerEventComponent,Qn as hasProLicense,y_ as hideDebugConsole,Wx as imageToCanvas,Ya as instantiate,xx as invokeLoadedImportPluginHooks,T_ as invokeXRSessionEnd,E_ as invokeXRSessionStart,qv as isActiveInHierarchy,Xa as isActiveSelf,UP as isAndroidDevice,c_ as isAnimationAction,Zw as isComponent,RP as isDebugMode,DP as isDesktop,Tr as isDestroyed,A as isDevEnvironment,Bk as isDisposed,TL as isExporting,Yw as isGLTFModel,Db as isHostedOnGlitch,bf as isHotReloadEnabled,mR as isHotReloading,BP as isIPad,bw as isIconElement,$i as isLocalNetwork,NP as isMacOS,jP as isMobileDevice,zP as isMozillaXR,$P as isQuest,lv as isResourceTrackingEnabled,WP as isSafari,uu as isUsingInstancing,VP as isiOS,FP as isiPad,gL as loadAsset,D1 as loadPMREM,W0 as loadSync,Ud as logHierarchy,dO as lookAtInverse,ac as lookAtObject,uO as lookAtScreenPoint,TP as makeId,Nb as makeIdFromRandomWords,Li as makeNameSafe,Xv as markAsInstancedRendered,HP as microphonePermissionsGranted,MP as nameof,Bb as nameofFactory,Hw as objectSerializer,rk as offXRSessionEnd,sk as offXRSessionStart,uR as onAfterRender,dR as onBeforeRender,cR as onClear,hR as onDestroy,Ow as onInitialized,ku as onStart,kw as onUpdate,pg as onXRSessionEnd,$d as onXRSessionStart,oS as parseSync,p_ as placeOnSurface,og as postprocessFBXMaterials,DR as prefix,Fb as pushState,AP as randomNumber,bg as registerBinaryType,Cu as registerComponent,Qf as registerComponentExtension,an as registerCustomEffectType,Yf as registerExportExtensions,Qu as registerExtensions,Iw as registerHotReloadType,hg as registerLoader,kv as registerPrefabProvider,zv as registerPrototypeExtensions,Wg as registerType,Wb as relativePathPrefix,Nm as removeAttributeChangeCallback,Zg as removeComponent,ZE as removeCustomImportExtensionType,nk as removePatch,fs as resolveUrl,Vb as sanitizeString,Z1 as saveImage,KI as screenshot,F0 as screenshot2,zg as sendDestroyed,u as serializable,Iv as serializeObject,Xe as serializeable,Tc as setActive,qb as setAllowBalloonMessages,ZP as setAllowOverlayMessages,jd as setAutoFitEnabled,Qm as setCameraController,Yv as setDestroyed,EO as setDevEnvironment,hv as setDisposable,Qa as setDontDestroy,Bm as setOrAddParamsToUrl,EP as setParam,nc as setParamWithoutReload,gk as setPeerOptions,jk as setResourceTrackingEnabled,Fm as setState,ng as setVisibleInCustomShadowRendering,ig as setWorldEuler,ft as setWorldPosition,gr as setWorldPositionXYZ,bn as setWorldQuaternion,eg as setWorldQuaternionXYZW,l_ as setWorldRotation,lc as setWorldRotationXYZ,La as setWorldScale,dc as showBalloonError,Ee as showBalloonMessage,be as showBalloonWarning,ag as showDebugConsole,hO as slerp,Pc as syncDestroy,ky as syncField,Ng as syncInstantiate,SO as textureToCanvas,$b as toSourceId,U_ as tryCastBinary,px as tryDetermineMimetypeFromBinary,ux as tryDetermineMimetypeFromURL,Aa as tryFindObject,z_ as tryGetGuid,Lw as unregisterHotReloadType,Um as unwatchWrite,Jb as useForAutoFit,kt as validate,Ad as watchWrite};
|