@needle-tools/engine 4.9.2 → 4.9.3-next.0facab6

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.
Files changed (105) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/components.needle.json +1 -1
  3. package/dist/{gltf-progressive-DhE1A6hX.min.js → gltf-progressive-CoZbSfPR.min.js} +1 -1
  4. package/dist/{gltf-progressive-egsMzRdv.js → gltf-progressive-DUR9TuAH.js} +3 -3
  5. package/dist/{gltf-progressive-DWiyqrwB.umd.cjs → gltf-progressive-Iy7aSAPk.umd.cjs} +1 -1
  6. package/dist/{needle-engine.bundle-WLYWw5OF.umd.cjs → needle-engine.bundle-DAo7BPxQ.umd.cjs} +149 -127
  7. package/dist/needle-engine.bundle-DP2gYtOQ.min.js +1638 -0
  8. package/dist/{needle-engine.bundle-XBRfMDwo.js → needle-engine.bundle-TvT7wv7z.js} +7567 -7380
  9. package/dist/needle-engine.js +446 -444
  10. package/dist/needle-engine.min.js +1 -1
  11. package/dist/needle-engine.umd.cjs +1 -1
  12. package/dist/{postprocessing-B_FzkwDz.min.js → postprocessing-BHMVuZQ1.min.js} +53 -53
  13. package/dist/{postprocessing-DTX5VXrj.umd.cjs → postprocessing-BsnRNRRS.umd.cjs} +76 -76
  14. package/dist/{postprocessing-DP1U_BpT.js → postprocessing-DQ2pynXW.js} +213 -191
  15. package/dist/{three-BK56xWDs.umd.cjs → three-B-jwTHao.umd.cjs} +11 -11
  16. package/dist/{three-CsHK73Zc.js → three-CJSAehtG.js} +1 -0
  17. package/dist/{three-examples-Bph291U2.min.js → three-examples-BivkhnvN.min.js} +1 -1
  18. package/dist/{three-examples-C9WfZu-X.umd.cjs → three-examples-Deqc1bNw.umd.cjs} +1 -1
  19. package/dist/{three-examples-BvMpKSun.js → three-examples-Doq0rvFU.js} +1 -1
  20. package/dist/{three-mesh-ui-CN6aRT7i.js → three-mesh-ui-CktOi6oI.js} +1 -1
  21. package/dist/{three-mesh-ui-DnxkZWNA.umd.cjs → three-mesh-ui-CsHwj9cJ.umd.cjs} +1 -1
  22. package/dist/{three-mesh-ui-n_qS2BM-.min.js → three-mesh-ui-DhYXcXZe.min.js} +1 -1
  23. package/dist/{three-TNFQHSFa.min.js → three-qw28ZtTy.min.js} +10 -10
  24. package/dist/{vendor-BtJpSuCj.umd.cjs → vendor-D0Yvltn9.umd.cjs} +1 -1
  25. package/dist/{vendor-k9i6CeGi.js → vendor-DU8tJyl_.js} +1 -1
  26. package/dist/{vendor-XJ9xiwrv.min.js → vendor-JyrX4DVM.min.js} +1 -1
  27. package/lib/engine/api.d.ts +1 -0
  28. package/lib/engine/api.js +1 -0
  29. package/lib/engine/api.js.map +1 -1
  30. package/lib/engine/codegen/register_types.js +2 -0
  31. package/lib/engine/codegen/register_types.js.map +1 -1
  32. package/lib/engine/engine_animation.d.ts +21 -1
  33. package/lib/engine/engine_animation.js +32 -1
  34. package/lib/engine/engine_animation.js.map +1 -1
  35. package/lib/engine/engine_camera.fit.d.ts +68 -0
  36. package/lib/engine/engine_camera.fit.js +193 -0
  37. package/lib/engine/engine_camera.fit.js.map +1 -0
  38. package/lib/engine/engine_gizmos.d.ts +2 -2
  39. package/lib/engine/engine_gizmos.js +2 -2
  40. package/lib/engine/engine_physics.js +6 -3
  41. package/lib/engine/engine_physics.js.map +1 -1
  42. package/lib/engine/webcomponents/needle-engine.d.ts +1 -0
  43. package/lib/engine/webcomponents/needle-engine.js +6 -0
  44. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  45. package/lib/engine/webcomponents/needle-engine.loading.js +59 -23
  46. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  47. package/lib/engine/xr/NeedleXRSession.d.ts +1 -0
  48. package/lib/engine/xr/NeedleXRSession.js +25 -11
  49. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  50. package/lib/engine-components/AnimatorController.js +16 -0
  51. package/lib/engine-components/AnimatorController.js.map +1 -1
  52. package/lib/engine-components/CameraUtils.js +8 -9
  53. package/lib/engine-components/CameraUtils.js.map +1 -1
  54. package/lib/engine-components/OrbitControls.d.ts +4 -47
  55. package/lib/engine-components/OrbitControls.js +30 -178
  56. package/lib/engine-components/OrbitControls.js.map +1 -1
  57. package/lib/engine-components/Renderer.js +9 -5
  58. package/lib/engine-components/Renderer.js.map +1 -1
  59. package/lib/engine-components/SpriteRenderer.js +4 -1
  60. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  61. package/lib/engine-components/api.d.ts +0 -1
  62. package/lib/engine-components/api.js.map +1 -1
  63. package/lib/engine-components/codegen/components.d.ts +1 -0
  64. package/lib/engine-components/codegen/components.js +1 -0
  65. package/lib/engine-components/codegen/components.js.map +1 -1
  66. package/lib/engine-components/web/Clickthrough.d.ts +3 -0
  67. package/lib/engine-components/web/Clickthrough.js +3 -0
  68. package/lib/engine-components/web/Clickthrough.js.map +1 -1
  69. package/lib/engine-components/web/CursorFollow.d.ts +3 -0
  70. package/lib/engine-components/web/CursorFollow.js +3 -0
  71. package/lib/engine-components/web/CursorFollow.js.map +1 -1
  72. package/lib/engine-components/web/HoverAnimation.d.ts +44 -0
  73. package/lib/engine-components/web/HoverAnimation.js +105 -0
  74. package/lib/engine-components/web/HoverAnimation.js.map +1 -0
  75. package/lib/engine-components/web/ScrollFollow.d.ts +4 -0
  76. package/lib/engine-components/web/ScrollFollow.js +4 -0
  77. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  78. package/lib/engine-components/web/index.d.ts +1 -0
  79. package/lib/engine-components/web/index.js +1 -0
  80. package/lib/engine-components/web/index.js.map +1 -1
  81. package/package.json +2 -2
  82. package/plugins/vite/alias.js +5 -3
  83. package/plugins/vite/poster-client.js +22 -21
  84. package/src/engine/api.ts +2 -1
  85. package/src/engine/codegen/register_types.ts +2 -0
  86. package/src/engine/engine_animation.ts +69 -1
  87. package/src/engine/engine_camera.fit.ts +288 -0
  88. package/src/engine/engine_gizmos.ts +2 -2
  89. package/src/engine/engine_physics.ts +6 -3
  90. package/src/engine/webcomponents/needle-engine.loading.ts +63 -24
  91. package/src/engine/webcomponents/needle-engine.ts +6 -1
  92. package/src/engine/xr/NeedleXRSession.ts +25 -10
  93. package/src/engine-components/AnimatorController.ts +21 -2
  94. package/src/engine-components/CameraUtils.ts +8 -9
  95. package/src/engine-components/OrbitControls.ts +30 -239
  96. package/src/engine-components/Renderer.ts +9 -6
  97. package/src/engine-components/SpriteRenderer.ts +3 -1
  98. package/src/engine-components/api.ts +0 -1
  99. package/src/engine-components/codegen/components.ts +1 -0
  100. package/src/engine-components/web/Clickthrough.ts +3 -0
  101. package/src/engine-components/web/CursorFollow.ts +3 -0
  102. package/src/engine-components/web/HoverAnimation.ts +99 -0
  103. package/src/engine-components/web/ScrollFollow.ts +4 -0
  104. package/src/engine-components/web/index.ts +1 -0
  105. package/dist/needle-engine.bundle-DwspSk2O.min.js +0 -1616
@@ -0,0 +1,1638 @@
1
+ import{Vector2 as K,Vector3 as b,Vector4 as pe,Quaternion as U,PlaneGeometry as Ln,WebGLRenderer as ir,PerspectiveCamera as ce,OrthographicCamera as od,Scene as yi,Mesh as H,Texture as Re,Uniform$1 as Ni,Color as ne,ShaderMaterial as jn,Box3 as bi,ShadowMaterial as I0,Euler as nt,MeshStandardMaterial as ut,Box3Helper as eS,GridHelper as em,Object3D as k,Material as ve,Matrix3 as L0,Matrix4 as J,Layers as os,Ray as ss,MathUtils as mo,AxesHelper as _i,MeshBasicMaterial as xe,DoubleSide as vi,BufferGeometry as pn,Group as rs,CylinderGeometry as j0,SphereGeometry as sd,BoxGeometry as fa,SpriteMaterial as tS,Sprite as iS,Shape as nS,ExtrudeGeometry as oS,Fog as D0,DirectionalLight as tm,PointLight as im,EdgesGeometry as sS,LineSegments as B0,LineBasicMaterial as nm,Line as ya,BufferAttribute as pt,Raycaster as rd,Sphere as ad,ArrayCamera as rS,Plane as nr,SkinnedMesh as as,InterleavedBufferAttribute as F0,Skeleton as aS,Bone as lS,WebGLCubeRenderTarget as cS,CubeCamera as hS,AnimationClip as Wi,FileLoader as om,TextureLoader as Nl,PropertyBinding as ba,KeyframeTrack as dS,LinearSRGBColorSpace as go,ShaderChunk as Wt,UniformsLib as uS,DataTexture as sm,RGBAFormat as ld,EquirectangularReflectionMapping as fo,SRGBColorSpace as yo,Clock as pS,NeutralToneMapping as _a,AgXToneMapping as cd,ACESFilmicToneMapping as hd,NoToneMapping as dd,PCFSoftShadowMap$1 as mS,BasicNodeLibrary as gS,WebGLRenderTarget as Dn,DepthTexture as U0,NearestFilter as ud,LoopRepeat as fS,LoopOnce as rm,AnimationMixer as am,CompressedTexture as yS,FrontSide as ls,Camera as bS,Frustum as z0,AudioListener as _S,PositionalAudio as vS,AudioLoader as lm,EventDispatcher as cm,BackSide as pd,MeshDepthMaterial as wS,CustomBlending as xS,MaxEquation as SS,AmbientLight as CS,HemisphereLight as PS,AlwaysStencilFunc as OS,GreaterEqualStencilFunc as kS,NotEqualStencilFunc as MS,GreaterStencilFunc as RS,LessEqualStencilFunc as TS,EqualStencilFunc as ES,LessStencilFunc as AS,NeverStencilFunc as N0,InvertStencilOp as IS,DecrementWrapStencilOp as LS,IncrementWrapStencilOp as jS,DecrementStencilOp as DS,IncrementStencilOp as BS,ReplaceStencilOp as FS,ZeroStencilOp as US,KeepStencilOp as zS,RawShaderMaterial as W0,GLSL3 as NS,AlwaysDepth as WS,GreaterEqualDepth as VS,GreaterDepth as $S,LessEqualDepth as HS,LessDepth as GS,NotEqualDepth as qS,EqualDepth as XS,BatchedMesh as V0,MeshPhysicalMaterial as hm,LinearFilter as md,UnsignedByteType as QS,RingGeometry as YS,Line3 as ZS,AdditiveBlending as $0,BoxHelper as KS,SpotLight as JS,DirectionalLightHelper as eC,CameraHelper as tC,LOD as iC,Triangle as nC,NormalBlending as oC,ReinhardToneMapping as dm,LinearToneMapping as um,HalfFloatType as pm,VideoTexture as sC,CubeUVReflectionMapping as H0,CubeTexture as rC,CompressedCubeTexture as aC,EquirectangularRefractionMapping as lC,CatmullRomCurve3 as cC,VectorKeyframeTrack as hC,QuaternionKeyframeTrack as dC,Audio as uC,ShaderLib as gd,UniformsUtils as G0,MirroredRepeatWrapping as q0,MeshNormalMaterial as pC,AudioContext as mC,PMREMGenerator$1 as gC}from"./three-qw28ZtTy.min.js";import{createLoaders as mm,getRaycastMesh as X0,LODsManager as or,NEEDLE_progressive as Ve,addDracoAndKTX2Loaders as fC,configureLoader as yC,setKTX2TranscoderLocation as bC,setDracoDecoderLocation as _C}from"./gltf-progressive-CoZbSfPR.min.js";import{GroundedSkybox as va,Font as vC,TextGeometry as wC,FontLoader as xC,GLTFLoader as bo,TransformControlsGizmo as Q0,EXRLoader as gm,RGBELoader as Y0,Stats as SC,nodeFrame as CC,OrbitControls as Z0,PositionalAudioHelper as PC,HorizontalBlurShader as OC,VerticalBlurShader as kC,GLTFExporter as K0,strToU8 as J0,zipSync as MC,XRControllerModelFactory as RC,XRHandMeshModel as TC,Line2 as EC,LineGeometry as AC,LineMaterial as IC,TransformControls as LC,InteractiveGroup as jC,HTMLMesh as DC,VertexNormalsHelper as BC,OBJLoader as fm,FBXLoader as eb,mergeVertices as FC}from"./three-examples-BivkhnvN.min.js";import{fetchProfile as UC,MotionController as zC,$70d766613f57b014$export$2e2bcd8739ae039 as tb,ByteBuffer as NC,v5 as ib,md5 as nb,SIZE_PREFIX_LENGTH as ob,Builder as ym,createNoise4D as WC,Matrix4 as bm,BatchedParticleRenderer as VC,ParticleSystem as $C,RenderMode as _o,ConstantColor as HC,Vector4 as GC,ConstantValue as qC,TrailParticle as sb,WorkerBase as XC,MeshBVH as QC}from"./vendor-JyrX4DVM.min.js";import{__webpack_exports__default as Ce,__webpack_exports__Text as rb,__webpack_exports__Block as ab,__webpack_exports__update as YC,SimpleStateBehavior as ZC,__webpack_exports__Inline as _m,__webpack_exports__FontLibrary as lb,ThreeMeshUI as cb}from"./three-mesh-ui-DhYXcXZe.min.js";import{EffectAttribute as KC}from"./postprocessing-BHMVuZQ1.min.js";const vm=new Map;function Vi(o=globalThis.location?.hostname){if(vm.has(o))return vm.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return vm.set(o,e),e===!0}function hb(){return window.location.hostname.includes("glitch.me")}const JC='<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>',eP=btoa(JC),tP="data:image/svg+xml;base64,"+eP,db=tP,iP=`<?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(iP);const nP='<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>',oP=btoa(nP),sP="data:image/svg+xml;charset=utf-8;base64,"+oP,rP=sP,ub=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var de=(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))(de||{});class ue{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static Registered=[];static register(e){this.Registered.indexOf(e)===-1&&(ub&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(ub&&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 pb=()=>o=>o;function aP(o){return pb()(o)}function lP(){return!!w("debug")}class wi{_factory;_cache=[];_maxSize;_index=0;constructor(e,t){this._factory=e,this._maxSize=t}get(){const e=this._index%this._maxSize;return this._index++,this._cache.length<=e&&(this._cache[e]=this._factory()),this._cache[e]}}let sr=!1;const wm=new Array;typeof window<"u"&&setTimeout(()=>{if(sr){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of wm){const r=new URL(e);r.searchParams.append(s,""),o[s]=r.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine.
2
+ Append any of these parameters to the URL to enable specific debug options.
3
+ Example: ${i} will show an onscreen console window.`);const n=sr===!0?"":` (containing "${sr}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof sr=="string"&&!s.toLowerCase().includes(sr.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function Wl(){return new URLSearchParams(globalThis.location?.search)}function w(o){sr&&!wm.includes(o)&&wm.push(o);const e=Wl();if(e.has(o)){const t=e.get(o);if(t){const i=Number(t);return isNaN(i)?t:i}else return!0}return!1}sr=w("help");function cP(o,e){const t=Wl();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function Vl(o,e,t=!0){const i=Wl();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?mb(o,i):Sm(o,i)}function xm(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function mb(o,e,t){window.history.pushState(t,o,"?"+e.toString())}function Sm(o,e,t){window.history.replaceState(t,o,"?"+e.toString())}function hP(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 dP(o,e){return Math.floor(Math.random()*(e-o+1))+o}const gb=["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"],fb=["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 yb(){const o=gb[Math.floor(Math.random()*gb.length)],e=fb[Math.floor(Math.random()*fb.length)];return o+"_"+e}function bb(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function wa(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=wa(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=wa(o,s,t,i);if(r)return r}}}function $l(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]=$l(n,e)}return t}return o}function Bn(o){return new Promise((e,t)=>{setTimeout(e,o)})}function Hl(o,e){if(o<=0)return Promise.resolve();if(e||(e=ue.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+o;return new Promise((i,n)=>{if(!e)return n("No context");const s=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(s),1),i())};e.pre_update_callbacks.push(s)})}const fd=w("debugresolveurl"),_b="rel:";function uP(o,e){return cs(o,e)}function cs(o,e){if(e===void 0)return fd&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return fd&&console.warn("getPath: uri is absolute, returning uri",e),e;if(o===void 0)return fd&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(_b)&&(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 fd&&console.log("source:",o,`changed uri
4
+ from`,e,`
5
+ to `,n,`
6
+ basePath: `+i),n}return e}class pP{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 Jo{_watches=[];constructor(e,t){if(Array.isArray(t))for(const i of t)this._watches.push(new Jo(e,i));else this._watches.push(new pP(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 xa=Symbol("needle:watches");function yd(o,e){if(!o[xa])if(o instanceof K)o[xa]=new Jo(o,["x","y"]);else if(o instanceof b)o[xa]=new Jo(o,["x","y","z"]);else if(o instanceof pe||o instanceof U)o[xa]=new Jo(o,["x","y","z","w"]);else return!1;return o[xa].subscribeWrite(e),!0}function Cm(o,e){if(!o)return;const t=o[xa];t&&t.unsubscribeWrite(e)}var G;(o=>{let e;function t(){if(e!==void 0)return e;const N=window.navigator.userAgent,oe=/Windows|MacOS|Mac OS/.test(N),le=/Windows NT/.test(N)&&/Edg/.test(N)&&!/Win64/.test(N);return e=oe&&!le&&!v()}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(){return r!==void 0?r:r=/iPad/.test(navigator.userAgent)}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 g(){if(p!==void 0)return p;if(navigator.userAgentData)return p=navigator.userAgentData.platform==="macOS";{const N=navigator.userAgent.toLowerCase();return p=N.includes("mac os x")||N.includes("macintosh")}}o.isMacOS=g;let f;function m(){return f!==void 0?f:f=g()&&"xr"in navigator}o.isVisionOS=m;let y;const _=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function v(){return y!==void 0?y:y=_.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}o.isiOS=v;let P;function T(){return P!==void 0||(P=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),P}o.isSafari=T;let O;function A(){return O!==void 0?O:O=navigator.userAgent.includes("OculusBrowser")}o.isQuest=A;let I;function W(){return I!==void 0||(I=document.createElement("a").relList.supports("ar")),I}o.supportsQuickLookAR=W;async function D(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(N){return console.error("Error querying `microphone` permissions.",N),!1}}o.microphonePermissionsGranted=D;let q;function ie(){if(q!==void 0)return q;const N=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(N&&(q=N[1].replace("_",".")),!q){const oe=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);oe&&(q=oe[1])}return q||(q=null),q}o.getiOSVersion=ie;let L;function V(){if(L!==void 0)return L;const N=navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);return N?L=N[1].replace("_","."):L=null,L}o.getChromeVersion=V})(G||(G={}));function mP(){return G.isDesktop()}function gP(){return G.isMobileDevice()}function fP(){return G.isiPad()}function yP(){return G.isiPad()}function bP(){return G.isAndroidDevice()}function _P(){return G.isMozillaXR()}function vP(){return G.isMacOS()}function wP(){return G.isiOS()}function xP(){return G.isSafari()}function SP(){return G.isQuest()}async function CP(){return G.microphonePermissionsGranted()}const hs=new WeakMap;function vb(o,e,t){if(!hs.get(o)){const n=new MutationObserver(s=>{PP(o,s)});hs.set(o,{observer:n,attributeChangedListeners:new Map}),n.observe(o,{attributes:!0})}const i=hs.get(o).attributeChangedListeners;i.has(e)||i.set(e,[]),i.get(e).push(t)}function wb(o,e,t){if(!hs.get(o))return;const i=hs.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),hs.get(o)?.observer.disconnect(),hs.delete(o)))}function PP(o,e){const t=hs.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 Pm{reason;constructor(e){this.reason=e}}async function Om(o){const e=await Promise.allSettled(o).catch(n=>[new Pm(n.message)]);let t=!1;const i=e.map(n=>"value"in n?n.value:(t=!0,new Pm(n.reason)));return{anyFailed:t,results:i}}async function xb(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 OP(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 OP(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")?.getAttribute("loading-logo-src")||db;if(!l)return;let c=!1;e.showLogo!==!1&&(a.src=l,c=await new Promise((_,v)=>{a.onload=()=>_(!0),a.onerror=P=>{console.error("Error loading favicon image for QR code",P),_(!1)}}));const h=document.createElement("canvas");h.width=o.width+t,h.height=o.height+t;const d=h.getContext("2d");if(!d)return;d.fillStyle="#ffffff",d.fillRect(0,0,h.width,h.height),d.drawImage(o,t/2,t/2),d.imageSmoothingEnabled=!0,d.imageSmoothingQuality="high",d.mozImageSmoothingEnabled=!0,d.webkitImageSmoothingEnabled=!0,d.globalCompositeOperation="lighten";const p=d.createLinearGradient(0,0,0,h.height);p.addColorStop(0,"rgb(45, 45, 45)"),p.addColorStop(1,"rgb(45, 45, 45)"),d.fillStyle=p,d.fillRect(0,0,h.width,h.height),d.globalCompositeOperation="source-over";let g=Math.min(o.width,o.height)*(e.logoSize||.25),f=g;if(c){const _=a.width/a.height;_>1?f=g/_:g=f*_;const v=n*o.width,P=Math.max(g,f),T=Math.round(P+v),O=Math.round(P+v),A=(h.width-P)/2,I=(h.height-P)/2;d.shadowColor=s,d.shadowBlur=i;const W=r,D=Math.round(A-v/2),q=Math.round(I-v/2);d.beginPath(),d.moveTo(D+W,q),d.lineTo(D+T-W,q),d.quadraticCurveTo(D+T,q,D+T,q+W),d.lineTo(D+T,q+O-W),d.quadraticCurveTo(D+T,q+O,D+T-W,q+O),d.lineTo(D+W,q+O),d.quadraticCurveTo(D,q+O,D,q+O-W),d.lineTo(D,q+W),d.quadraticCurveTo(D,q,D+W,q),d.fillStyle="#ffffff",d.closePath(),d.fill(),d.clip(),d.shadowColor="transparent";const ie=(h.width-g)/2,L=(h.height-f)/2;d.drawImage(a,ie,L,g,f)}const m=h.toDataURL("image/png"),y=document.createElement("img");return y.src=m,y.style.width="100%",y.style.height="auto",y}const kP=w("debugdebug");let km=!1;(w("noerrors")||w("nooverlaymessages"))&&(km=!0);const Mm="needle_engine_global_error_container";var xi=(o=>(o[o.Log=0]="Log",o[o.Warn=1]="Warn",o[o.Error=2]="Error",o))(xi||{});function Sb(){return Ob}const Rm=new Array;function MP(o){Rm.push(o)}let Tm=!1;function RP(...o){if(!Tm){Tm=!0;try{for(let e=0;e<Rm.length;e++)Rm[e](...o)}catch(e){console.error(e)}Tm=!1}}const Cb=console.error,TP=function(...o){Cb.apply(console,o),IP(o),rr(2,o),AP(...o)};function Pb(o){km=!o,o?console.error=TP:console.error=Cb}function EP(o){return Pb(o)}let Ob=0;function AP(...o){Ob+=1,RP(...o)}function IP(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 rr(o,e,t,i){if(km)return;const n=ue.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||LP(o,n,e)}}const Gl=new Map;function LP(o,e,t){if(t==null)return;const i=BP(e);if(i.childElementCount>=20){const a=i.lastElementChild;Mb(a)}t.length>400&&(t=t.substring(0,400)+"...");const n=t;if(Gl.has(n))return;const s=FP(o,t);i.prepend(s);const r=()=>{Gl.delete(n),Mb(s)};Gl.set(n,r),setTimeout(r,1e4)}function jP(){kP&&console.log("Clearing messages");for(const o of Gl.values())o?.call(o);Gl.clear()}const DP=`
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 BP(o){globalThis[Mm]||(globalThis[Mm]=new Map);const e=globalThis[Mm];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: 9999999999;
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=DP,t.appendChild(i),t}}const kb=Symbol("logtype"),bd=new Map;function Mb(o){o.remove();const e=o[kb],t=bd.get(e)??[];t.push(o),bd.set(e,t)}function FP(o,e){if(bd.has(o)){const i=bd.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[kb]=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 UP{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 zP){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 zP=["x","y","z","w"],j=new UP;class Rb{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 _d{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 Rb(this.alpha(this.minCutOff)),this.dx=new Rb(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 Em{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new _d(e,t,i,n),this.y=new _d(e,t,i,n),this.z=new _d(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 vd="needle:cameraController";function Tb(o){return o[vd]}function Am(o,e,t){t?o[vd]=e:o[vd]===e&&(o[vd]=null)}const Im="needle:autofit";function Eb(o){return o[Im]===void 0?!0:o[Im]!==!1}function wd(o,e){o[Im]=e}let vo;const NP={x:0,y:0,width:0,height:0};function WP(o,e,t,i){o instanceof Element&&(o=o.getBoundingClientRect()),vo=i.domElement.getBoundingClientRect();const n=NP;n.x=o.x,n.y=o.y,n.width=o.width,n.height=o.height,n.x-=vo.x,n.y-=vo.y;const s=n.width/-2-(n.x-vo.width/2),r=n.height/-2-(n.y-vo.height/2),a=t.view;let l=a?.offsetX||0,c=a?.offsetY||0;l=j.lerp(l,s,e),c=j.lerp(c,r,e),t.setViewOffset(vo.width,vo.height,l,c,vo.width,vo.height),t.updateProjectionMatrix()}function VP(o,e,t){const i=o.length(),n=e.length(),s=j.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const Lm=new U,Ab=new U().setFromAxisAngle(new b(0,1,0),Math.PI);function $P(o,e){o.lookAt(e),o.quaternion.multiply(Ab)}function ql(o,e,t=!0,i=!1){if(o===e)return;Lm.copy(o.quaternion);const n=Z(e),s=Z(o);if(i){if(mn(o,be(e)),t){const r=s.y,a=s.sub(Bb(o));a.y=r,o.lookAt(a),o.quaternion.multiply(Ab)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Lm);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Lm)}function HP(o,e,t,i=1){if(t){const n=$(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 GP=new wi(()=>new b,100);function $(o,e,t){const i=GP.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 qP=new wi(()=>new ne,30);function Ib(o){const e=qP.get();return o?e.copy(o):e.set(0,0,0),e}const XP=new wi(()=>new U,100);function ti(o){const e=XP.get();return e.identity(),o instanceof U?e.copy(o):o instanceof DOMPointReadOnly&&e.set(o.x,o.y,o.z,o.w),e}const jm=new wi(()=>new b,100),Lb=Symbol("lastMatrixWorldUpdateKey");function Z(o,e=null,t=!0){const i=e??jm.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[Lb]!==Date.now()&&(o[Lb]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function mt(o,e){if(!o)return o;const t=jm.get();return e!==t&&t.copy(e),(o?.parent??o).worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function ar(o,e,t,i){const n=jm.get();return n.set(e,t,i),mt(o,n),o}const xd=new wi(()=>new U,100),lr=new U,Dm=new U;function be(o,e=null){if(!o)return xd.get().identity();const t=e??xd.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function mn(o,e){if(!o)return;e!==lr&&lr.copy(e);const t=lr;o?.parent?.getWorldQuaternion(Dm),Dm.invert();const i=Dm.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Bm(o,e,t,i,n){lr.set(e,t,i,n),mn(o,lr)}const QP=new wi(()=>new b,100),YP=new b;function $e(o,e=null){return e||(e=QP.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function Sa(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=YP;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const ZP=new b,jb=new U;function KP(o){return be(o,jb),ZP.set(0,0,1).applyQuaternion(jb)}const JP=new wi(()=>new b,100),Db=new U;function Bb(o,e){return e||(e=JP.get().set(0,0,1)),be(o,Db),e.applyQuaternion(Db)}const Fb=new nt,Ub=new nt,eO=new b;function Fm(o){const e=xd.get();return o.getWorldQuaternion(e),Ub.setFromQuaternion(e),Ub}function Um(o,e){const t=xd.get();mn(o,t.setFromEuler(e))}function Sd(o){const e=Fm(o),t=eO;return t.set(e.x,e.y,e.z),t.x=j.toDegrees(t.x),t.y=j.toDegrees(t.y),t.z=j.toDegrees(t.z),t}function zb(o,e){Xl(o,e.x,e.y,e.z,!0)}function Xl(o,e,t,i,n=!0){n&&(e=j.toRadians(e),t=j.toRadians(t),i=j.toRadians(i)),Fb.set(e,t,i),lr.setFromEuler(Fb),mn(o,lr)}function Cd(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 tO(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 Nb(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 Yp extends jn{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:Yp.vertex,uniforms:{map:new Ni(null),flipY:new Ni(!0),writeDepth:new Ni(!1),depthTexture:new Ni(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 Ks{static planeGeometry=new Ln(2,2,1,1);static renderer=new ir({antialias:!1,alpha:!0});static perspectiveCam=new ce;static orthographicCam=new od;static scene=new yi;static blitMaterial=new Yp;static mesh=new H(Ks.planeGeometry,Ks.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=Yp.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 Re(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 Ni(!0),s.uniforms.depthTexture.value=a):(s.uniforms.writeDepth=new Ni(!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(),g=p.getParameter(p.DEPTH_TEST),f=p.getParameter(p.DEPTH_WRITEMASK),m=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 ne(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(g),y.setMask(f),y.setFunc(m)}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=Wb(e));const i=e.image;if(nO(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 Wb(o){return Ks.copyTexture(o)}function iO(o,e=!1){return Ks.textureToCanvas(o,e)}function nO(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 oO(o){const e=o.type;return e==="Mesh"||e==="SkinnedMesh"}function zm(o,e){e?o["needle:rendercustomshadow"]=!0:o["needle:rendercustomshadow"]=!1}function Vb(o){return!!(o&&(o["needle:rendercustomshadow"]===!0||o["needle:rendercustomshadow"]==null))}function Vt(o,e=void 0,t=void 0,i=void 0){const n=i||new bi;n.makeEmpty();const s=[];function r(l){let c=!0;if(l.visible&&Eb(l)!==!1&&!(l.type==="TransformControlsGizmo"||l.type==="TransformControlsPlane")){if(l instanceof eS&&(c=!1),l instanceof em&&(c=!1),l instanceof va&&(c=!1),l.isGizmo===!0&&(c=!1),l.material instanceof I0&&(c=!1),oO(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 $b(o,e,t){const i=Vt([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&&Sa(o,$e(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 g=p.clone().sub(d);h&&g.multiplyScalar(c),mt(o,Z(o).add(g))}return{boundsBefore:i,scale:l}}function Hb(o,e){const t=Vt([o]),i=new b;t.getCenter(i),i.y=t.min.y;const n=e.clone().sub(i),s=Z(o);return mt(o,s.add(n)),{offset:n,bounds:t}}function Nm(o,e,t,i){if(Array.isArray(e)){let r=!0;for(let a=0;a<e.length;a++)Nm(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 ut;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 Pd=!1;MP((...o)=>{E()&&ue.Current?.isInXR&&(cr(!0),Gb("error",...o))});function cr(o){if(o){if(Pd)return;Pd=!0,rO()}else{if(!Pd)return;Pd=!1,aO()}}const Ql={log:void 0,warn:void 0,error:void 0};class sO{familyName="needle-xr";root=null;context=null;defaultFontSize=.06;constructor(){this.ensureFont()}onEnable(){this.context=ue.Current||ue.All[0],this.context.pre_render_callbacks.push(this.onBeforeRender)}onDisable(){this.context?.pre_render_callbacks.splice(this.context?.pre_render_callbacks.indexOf(this.onBeforeRender),1),this.root?.removeFromParent()}targetObject=new k;userForwardViewPoint=new b;oneEuroFilter=new Em(90,.8);_lastElementRemoveTime=0;onBeforeRender=()=>{const e=this.context?.mainCamera;if(this.context&&e instanceof ce){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),ql(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 hr=null;function rO(){hr||(hr=new sO),hr.onEnable();for(const o in Ql){Ql[o]=console[o];let e=!1;console[o]=function(){if(Ql[o]?.apply(console,arguments),!e)try{e=!0,Gb(o,...arguments)}finally{e=!1}}}}function aO(){hr?.onDisable();for(const o in Ql)console[o]=Ql[o]}const Yl=new Map;function Gb(o,...e){try{switch(Yl.clear(),o){case"log":hr?.addLog("log",t());break;case"warn":hr?.addLog("warn",t());break;case"error":hr?.addLog("error",t());break}}catch(s){console.error("Error in spatial console",s)}finally{Yl.clear()}function t(){let s="";for(let r=0;r<e.length;r++){const a=e[r];s+=i(a),r<e.length-1&&(s+=", ")}return s}function i(s,r=0){if(typeof s=="string")return'"'+s+'"';if(typeof s=="number"){if(s%1!==0){const a=s.toFixed(5),l=a.indexOf(".");let c=a.length-1;for(;c>l&&a[c]==="0";)c--;return a.substring(0,c+1)}return s.toString()}else if(Array.isArray(s)){let a="[";for(let l=0;l<s.length;l++){const c=s[l];a+=i(c,r+1),l<s.length-1&&(a+=", ")}return a+="]",a}else{if(s===null)return"null";if(s===void 0)return"undefined";if(typeof s=="function")return s.name+"()"}if(s instanceof K)return`(${i(s.x)}, ${i(s.y)})`;if(s instanceof b)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)})`;if(s instanceof pe)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof U)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof ve||s instanceof Re)return s.name;if(s instanceof L0)return`[${s.elements.join(", ")}]`;if(s instanceof J)return`[${s.elements.join(", ")}]`;if(s instanceof os)return s.mask.toString();if(typeof s=="object"){if(Yl.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(Yl.has(p)){c+="";continue}Yl.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 lO=w("nodevlogs");function Te(o,e=xi.Log){rr(e,o)}function ge(o){Te(o,xi.Warn)}function Zl(o){Te(o,xi.Error)}let Wm,Vm;function E(){if(lO)return!1;if(Wm!==void 0)return Wm;if(Vm!==void 0)return Vm;let o=Vi();return o||(o=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),Vm=o,o}function cO(o){Wm=o}let $i,dr=null,Fn=null,Kl=!1,qb=null;const Xb="terminal",hO=w("console");hO&&$m();const dO=Symbol("consoleParent");function $m(){if($i){$i.showSwitch();return}fO()}function Qb(){$i&&($i.hide(),$i.hideSwitch())}function uO(){qb||(qb=setInterval(pO,500))}let Yb=0;function pO(){const o=Sb(),e=o!==Yb;Yb=o,e&&mO()}function mO(){$m(),Fn&&(Fn.setAttribute("error","true"),Fn.innerText="\u{1F92C}")}function gO(){Fn&&(Fn.removeAttribute("error"),Fn.innerText=Xb)}function fO(o=!1){if($i!==void 0||Kl)return;Kl=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),Kl=!1,$i=null;return}Kl=!1,uO(),$i=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&$i.addPlugin(yO()),dr=_O(),dr&&(dr[dO]=dr.parentElement,dr.style.position="absolute",dr.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),$i.setSwitchPosition(20,30),Fn=bO(),Fn){Fn.innerText=Xb,Fn.addEventListener("click",gO);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
+ `,dr?.prepend(i),o===!0&&Sb()<=0&&Qb(),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.":"")),Kl=!1,$i=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function yO(){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"),$i?.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}function bO(){return document.querySelector("#__vconsole .vc-switch")||null}function _O(){return document.querySelector("#__vconsole")||null}const Zb=w("debugdefines");ds('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ds('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ds('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ds('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ds('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.9.3";'),ds('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),ds('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Sep 18 2025 12:17:25 GMT+0000 (Coordinated Universal Time)";'),ds('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const gn="4.9.3",Od="undefined",Hm="Thu Sep 18 2025 12:17:25 GMT+0000 (Coordinated Universal Time)";Zb&&console.log(`Engine version: ${gn} (generator: ${Od})
145
+ Project built at ${Hm}`);const Ca=NEEDLE_PUBLIC_KEY,wo="needle_isActiveInHierarchy",ur="builtin_components",Jl="needle_editor_guid";function ds(o){try{(0,eval)(o)}catch(e){Zb&&console.error(e)}}let Kb,Jb=null;function fn(){return Kb}function Gm(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}Jb!==o&&(Jb=o,Kb=new o)}const Si=Symbol("shadowDomOwner"),vO=w("debugpatch");function kd(o,e,t,i){const n=vO===e;if(!t&&!i)return;const s=e+"___needle";xO(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]=t_(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]=t_(l,o,e);else{const c=this[s];i_(o,e,this,c,l),this[s]=l,n_(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function wO(o,e,t){const i=Xm(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 e_=Symbol("Needle:Patches:WrappedFunction");function t_(o,e,t){if(o[e_])return o;const i=function(...n){i_(e,t,this,...n);const s=o.apply(this,n);return n_(e,t,this,s,...n),s};return i[e_]=!0,i}const Md="Needle:Patches";function qm(){return globalThis[Md]||(globalThis[Md]=new WeakMap),globalThis[Md]}function Xm(o,e){const t=qm().get(o);return t?t.get(e):null}function xO(o,e,t,i){let n=qm().get(o);n||(n=new Map,qm().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function i_(o,e,t,...i){if(!t)return;const n=Xm(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function n_(o,e,t,i,...n){if(!t)return;const s=Xm(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}const Pa=[];function Rd(o){Pa.indexOf(o)===-1&&Pa.push(o)}function SO(o){const e=Pa.indexOf(o);e!==-1&&Pa.splice(e,1)}const Oa=[];function Qm(o){Oa.indexOf(o)===-1&&Oa.push(o)}function CO(o){const e=Oa.indexOf(o);e!==-1&&Oa.splice(e,1)}function o_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<Pa.length;e++)Pa[e](o)}function s_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<Oa.length;e++)Oa[e](o)}const ot=w("debuginput");var Td=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(Td||{}),Ee=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Ee||{});class xo extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new ss(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;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}_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(),ot&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class ec extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class PO{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var ii=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(ii||{});class r_{_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 ec){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 xo){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,ot&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,ot&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const s of e)if(i===s){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new K];_pointerPositionsLastFrame=[new K];_pointerPositionsDelta=[new K];_pointerPositionsRC=[new K];_pointerPositionDown=[new b];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":ot&&Te("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":ot&&Te("Create Pointer move"),this.onMove(e);break;case"pointerup":ot&&Te("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&&G.isMozillaXR()?!0:(ot&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(ot&&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 ec("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 ec("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 ec("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);ot&&Te(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new xo("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 xo("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||(ot&&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 xo("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,ot&&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 xo("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 xo("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 xo("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(s),this._pointerIds[n]=-1}};tempNearPlaneVector=new b;tempFarPlaneVector=new b;tempLookMatrix=new J;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new 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||$(0,1,0).applyQuaternion(be(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 ot&&!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}`,ot?e:""),ot&&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 K);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){ot&&console.log(e.pointerType,"UP",t,"was not down");return}ot&&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]){ot&&ge("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;ot&&console.log("CLICK",t,a,l,c,h),h<this._doubleClickTimeThreshold&&h>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new K);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new K);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new K);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let s=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const h=e.source;s===0&&h.movementX!==0&&(s=h.movementX||0),r===0&&h.movementY!==0&&(r=h.movementY||0)}n.x+=s,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new K);const c=this._pointerPositionsRC[t];c.set(a,l),this.convertScreenspaceToRaycastSpace(c)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(ot&&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 ka=new J().makeRotationY(Math.PI),Hi=new U().setFromAxisAngle(new b(0,1,0),Math.PI),OO=w("debugwebxr");class kO{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new k,this.gameObject.name="Implicit XR Rig",OO){const e=hg(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const So=w("debugwebxr"),Ed=w("debugcustomgesture"),MO="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",RO="generic-trigger",TO=new U().setFromEuler(new nt(mo.degToRad(0),mo.degToRad(-90),mo.degToRad(-90))),EO=new b(.04,-.04,0);class Ym{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new J;_gripPosition=new b;_gripQuaternion=new U;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new U;_rayMatrix=new J;_rayPosition=new b;_rayQuaternion=new U;get gripPosition(){return $(this._gripPosition)}get gripQuaternion(){return ti(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return $(this._linearVelocity).applyQuaternion(Hi)}get rayPosition(){return $(this._rayPosition)}get rayQuaternion(){return ti(this._rayQuaternion)}get gripWorldPosition(){return $(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return ti(this._gripWorldQuaternion)}_gripWorldQuaternion=new U;get rayWorldPosition(){return $(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 ti(this._rayWorldQuaternion)}_rayWorldQuaternion=new U;get pinchPosition(){return $(this._pinchPosition)}_pinchPosition=new b;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?be(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($(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=$(0,1,0).applyQuaternion(e.quaternion),i=$(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 _i(.15);_debugGripAxesHelper=new _i(.07);_debugRayAxesHelper=new _i(.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}`,So&&(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 ss,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,$(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}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(ka),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,$(1,1,1)),s=$(h.position),r=ti(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=$(d.position),n=ti(d.orientation),this._gripMatrix.fromArray(d.matrix).premultiply(ka),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,$(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 m=p.transform.position,y=p.transform.orientation;this._object.position.set(m.x,m.y,m.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 g=a.get("middle-finger-metacarpal"),f=g&&this.getHandJointPose(g,e);f&&(this._gripMatrix.fromArray(f.transform.matrix).premultiply(ka),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,$(1,1,1)),i=$().copy(f.transform.position),n=ti().copy(f.transform.orientation),n.multiply(TO),i.add($(EO).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));So&&(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?be(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,So&&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":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=UC(this.inputSource,MO,RO);this.getMotionController=e.then(t=>{if(!this.connected)return null;this._motioncontroller=new zC(this.inputSource,t.profile,t.assetPath||"");const i=t.profile.layouts[this.inputSource.handedness];if(this._layout=i,this._layout&&!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}}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),!Ed&&(So&&F.DrawDirection(this.rayWorldPosition,$(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Ee.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSelectEnd=e=>{this.emitPointerUpEvent&&(Ed||this.inputSource===e.inputSource&&this.emitPointerEvent(Ee.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&&(So&&F.DrawDirection(this.rayWorldPosition,$(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Ee.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)))};onSequeezeEnd=e=>{this.emitPointerUpEvent&&this.inputSource===e.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Ee.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 a_;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"),(So||Ed)&&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 a_,a=(.02+.01)*1.5;r.value=1-(n-.02)/a;const l=n<.02-.01,c=n>.02+.01;l&&!r.pressed?(Ed&&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 U;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),So&&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){So&&e!==Ee.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,So&&e!=="pointermove"&&console.warn("Pointer event",e,t,i,{...this.pointerInit}),this.xr.context.input.createInputEvent(new xo(e,s,this.pointerInit)),z.Current=a}}}class a_{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 Zm=(o=>(o.Visible="application-visible",o.Hidden="application-hidden",o.MuteChanged="application-mutechanged",o))(Zm||{});let Ad=!1;const Ma=[];function pr(){if(Ad)return;E()&&console.debug("User interaction registered: audio can now be played"),Ad=!0;const o=[...Ma];Ma.length=0,o.forEach(e=>e())}document.addEventListener("mousedown",pr),document.addEventListener("pointerup",pr),document.addEventListener("click",pr),document.addEventListener("dragstart",pr),document.addEventListener("touchend",pr),document.addEventListener("keydown",pr);class En extends EventTarget{static get userInteractionRegistered(){return Ad}static registerWaitForAllowAudio=En.registerWaitForInteraction;static registerWaitForInteraction(e){if(e!==null){if(Ad){e();return}Ma.indexOf(e)===-1&&Ma.push(e)}}static unregisterWaitForInteraction(e){const t=Ma.indexOf(e);t!==-1&&Ma.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 Ra=new Map,Ta=new Map;let c_=0;function Co(o,e,t){if(Ra.has(e)||Ra.set(e,new Array),Ra.get(e).push({method:o,options:{once:!1,...t}}),c_<30){const i=Ta.get(e);i&&i?.length>100&&(c_+=1,console.warn(`You have ${i.length} methods registered for Event ${e}.
153
+
154
+ This might be a performance issue!
155
+ Consider unregistering the methods when they are not needed anymore!
156
+
157
+ To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
158
+
159
+ or by using the once option like onStart(()=>{}, { once:true }).
160
+
161
+ See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function us(o,e){const t=Ta.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=Ra.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Un(o,e){e===de.ContextCreated&&Km.delete(o),h_(o,e)}function h_(o,e){e===we.Start&&Ra.get(de.ContextCreated)&&h_(o,de.ContextCreated);const t=e===we.Start||e===de.ContextCreated,i=Ta.get(e);i&&i.length>0&&u_(o,i,t);const n=Ra.get(e);if(n&&n.length>0){const s=[...n];n.length=0,u_(o,s,t),s.length>0&&(Ta.has(e)||Ta.set(e,new Array),Ta.get(e).push(...s))}}const Id=new Array,d_={context:null};function u_(o,e,t){Id.length=0;for(let n=0;n<e.length;n++)Id.push(e[n]);let i=Km.get(o);for(let n=0;n<Id.length;n++){const s=Id[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{d_.context=o,s.method?.call(d_,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,Km.set(o,i)),i.add(s))}}const Km=new WeakMap,Jm={};function eg(o,e){Jm[o]=e}function p_(o){const e=o.getBufferIdentifier(),t=Jm[e];return t(o)}function m_(o){return typeof o.guid=="function"?o.guid():null}let tg;function AO(){return tg}function IO(o){tg=o}function g_(o,e){return e||(e={}),e={...tg,...e},o?new tb(o,e):new tb(e)}async function f_(){const o=await import("./vendor-JyrX4DVM.min.js").then(e=>e.bundler);return console.log(o),o.default===void 0?o:o.default}class y_{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 f_(),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 jO(i)})}async trySetupClient(e){const t=await f_();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 LO{_peer;constructor(e){this._peer=e}}class jO extends LO{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 yn=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(yn||{});const b_="https://urls.needle.tools/default-networking-backend/index";let Gi="wss://networking.needle.tools/socket";const ni=!!w("debugnet"),tc=!!(ni||w("debugowner")),Ld=w("debugnetbin");var __=(o=>(o.ConnectionInfo="connection-start-info",o))(__||{}),ee=(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))(ee||{});class DO{room;viewId;allowEditing;inRoom}class BO{room}class FO{userId}var v_=(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))(v_||{});class ig{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||(tc&&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 tc&&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?(tc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(tc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class w_{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new y_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return ni}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(),ni&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},yn.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=yn.Queued){if(t===null&&(t={}),i===yn.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){Ld&&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,yn.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&ni&&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:hb()&&(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: "+b_),Gi=await(await fetch(b_)).text()),Gi===void 0){n(!1);return}console.debug(`\u22A1 Connecting to networking backend on
162
+ `+Gi);const s=await import("./vendor-JyrX4DVM.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,E()||ni?console.log(`\u229E Connected to networking backend
163
+ `+Gi):console.debug("\u229E Connected to networking backend",Gi),n(!0),this.onSendQueued(yn.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("\u22A0 Websocket connection failed..."),n(!1)}).onRetry(()=>{console.log("\u2192 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){ni&&i==="pong"?console.log("<<",i):E()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){Ld&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new NC(i),s=n.getBufferIdentifier(),r=this._listenersBinary[s],a=p_(n),l=m_(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(ni&&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(ni&&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),(Ld||E())&&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}
164
+ ${a.href}`)}this.onSendQueued(yn.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,(Ld||E())&&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),ni&&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&&(ni&&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":ni&&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),ni&&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=yn.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));ni&&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 ic=w("debugwebxr");class ng{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=>{ic&&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||(ic&&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),ic&&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(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ee.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(ee.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(ee.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ee.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(ee.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(ee.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(ic&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new ng(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new ng(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)||(ic&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new ng(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 S_{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new xe({color:0,transparent:!0,depthTest:!1,fog:!1,side:vi}),this._fadeToColorQuad=new H(new Ln(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=j.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 mr=(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))(mr||{});class gr{static createText(e,t){let i=null;const n=t?.font||zO(t?.familyFamily||null);n instanceof vC?i=this.#t(e,n,t):i==null&&(i=new pn);const s=t?.color||16777215,r=new H(i,t?.material??new ut({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 wC(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 xe({colorWrite:!1,depthWrite:!0,side:vi});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 Ln(1,1,1,1),r=t?.material??new ut({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 fa(1,1,1),r=t?.material??new ut({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=UO(1,1,1,.1,2),r=t?.material??new ut({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 sd(.5,16,16),r=t?.material??new ut({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 j0(.5,.5,1,32),r=t?.material??new ut({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new H(s,r),i.name="Cylinder"}break;case"ShaderBall":i=new rs,i.name="ShaderBall",NO(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const t=new tS({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 UO(o,e,t,i,n){const s=new nS,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 oS(s,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(c,h)=>{const d=[];for(let p=0;p<h.length;p+=3)d.push(new K(h[p]/o,h[p+1]/e));return d},generateSideWallUV:(c,h,d,p,g,f)=>{const m=[];return m.push(new K(h[d]/o,h[d+1]/e)),m.push(new K(h[p]/o,h[p+1]/e)),m.push(new K(h[g]/o,h[g+1]/e)),m.push(new K(h[f]/o,h[f+1]/e)),m}}});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 jd=new Map;function zO(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(jd.has(e)){const n=jd.get(e);if(n)return n}const t=new xC,i=new Promise((n,s)=>{t.load(e,r=>{jd.set(e,r),n(r)},void 0,s)});return jd.set(e,i),i}let og=!1,sg=null;function NO(o,e){if(sg===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new bo,n=mm(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),og=!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),P_())).finally(()=>{og=!1})}if(og){const t=P_();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&C_(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(),C_(n,e)),o.add(i)})}function C_(o,e){if(e?.color||e?.material||e?.texture){const t=e?.material??o.material?.clone()??new ut;e.color&&"color"in t&&t.color instanceof ne&&t.color.set(e.color),e?.texture&&"map"in t&&(t.map=e.texture),o.material=t}}function P_(){return new rs().add(gr.createPrimitive("Sphere",{material:new xe({transparent:!0,opacity:.1})}))}class Il{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);return i.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new Il(e,t,i),this._active):(i.end(),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 Bn(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 ir({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new ce,this._scene=new yi,this._scene.fog=new D0(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 Bn(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new ne(0),this._scene.add(new em(5,10,1118481,1118481));const e=new tm(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new tm(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new im(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 ut({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new ne(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=j.random(0,1)>.5?mr.Sphere:mr.Cube,l=gr.createPrimitive(a,{material:r});l.position.x=j.random(-n,n),l.position.y=j.random(-2,n),l.position.z=j.random(-n,n),l.rotation.x=j.random(0,Math.PI*2),l.rotation.y=j.random(0,Math.PI*2),l.rotation.z=j.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 nc;(o=>{const e=[];function t(){if(!e?.length)return!1;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})(nc||(nc={}));const He=w("debugwebxr"),O_=w("stats");let rg=0;function WO(o){let e=null;const t=o;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=o,e}VO();async function VO(){if(w("debugasap")){let o=globalThis["needle:XRSession"];if(o instanceof Promise){delete globalThis["needle:XRSession"],ue.addContextCreatedCallback(async e=>{if(!o)return;cr(!0);const t=await o;if(t){const i=Y.getDefaultSessionInit("immersive-vr");Y.setSession("immersive-vr",t,i,e.context)}else console.error("NeedleXRSession: ASAP session was rejected");o=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()=>{cr(!0),console.log("Received Session Granted..."),await Bn(100);const o=sessionStorage.getItem("needle_xr_session_mode"),e=sessionStorage.getItem("needle_xr_session_init")??null,t=e?JSON.parse(e):null;let i=null;if(k_()&&(await Il.start(o||"immersive-vr",t||Y.getDefaultSessionInit("immersive-vr")),await GO(),i=await Il.handoff()),i)Y.setSession(i.mode,i.session,i.init,z.Current);else if(o&&e){console.log("Session Granted: Restore last session");const n=JSON.parse(e);Y.start(o,n).catch(s=>console.warn(s))}else Y.start("immersive-vr").catch(n=>console.warn("Session Granted failed:",n))},{once:!0})}}function $O(o,e){sessionStorage.setItem("needle_xr_session_mode",o),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function HO(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const ag=new Set;ue.registerCallback(de.ContextCreationStart,async o=>{ag.add(o.context)}),ue.registerCallback(de.ContextCreated,async o=>{ag.delete(o.context);const e=o.context?.domElement.getAttribute("autostart")||null;qO(e)});function k_(){return ag.size>0}function GO(){return new Promise(o=>{const e=Date.now(),t=setInterval(()=>{(!k_()||Date.now()-e>6e4)&&(clearInterval(t),o())},100)})}G.isDesktop()&&E()&&window.addEventListener("keydown",o=>{(o.key==="x"||o.key==="Escape")&&Y.active&&Y.stop()});function qO(o){if(o)switch(o?.toLowerCase()){case"ar":En.registerWaitForInteraction(()=>{Y.start("ar")});break}}const Dd=Symbol("initial-fov");class Y{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=>(He&&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=>Y.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 G.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return G.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(G.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return nc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(E()&&w("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await Il.start(e,t||Y.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(He||E())&&ge("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=ue.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=WO(i.domElement);a&&!G.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 Il.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;He?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.onBeforeXR(e,t);for(const r of this._sessionRequestStartListeners)r({mode:e,init:t});He&&Te("Requesting "+e+" session ("+Date.now()+")"),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&&ge("Make sure your device has the required permissions (e.g. camera access)"),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:"&&ge("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 Y(e,t,n,{scripts:s,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),He?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?(He&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):He&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{He&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return Y._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")||E()&&G.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&&xr(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 $(0,0,0);const t=$(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(ti(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(xr(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)}He&&(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=$(i.transform.position),s=ti(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(ka),r?.parent){n.applyMatrix4(r.parent.matrixWorld),s.multiply(Hi);const a=be(r.parent);a.premultiply(Hi),s.premultiply(a)}return{hit:e,position:n,quaternion:s}}return null}convertSpace(e){const t=$(e.position);t.applyMatrix4(ka);const i=ti(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){$O(e,n.init),this.session=t,this.mode=e,this.context=i,(He||w("console"))&&cr(!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,Co(this.onBefore,we.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=Z(this.context.mainCamera,new b),this._originalCameraWorldRotation=be(this.context.mainCamera,new U),this._originalCameraWorldScale=$e(this.context.mainCamera,new b),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof ce&&(this.context.mainCamera[Dd]=this.context.mainCamera.fov)),this._defaultRig=new kO,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):He&&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 Ym(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(s,r)=>{if(s.inputSource===e){He&&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"),HO(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,us(this.onBefore,we.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()}),s_({session:this});for(const s of Y._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&&mt(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&mn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&Sa(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof ce&&this.context.mainCamera[Dd]&&(this.context.mainCamera.fov=this.context.mainCamera[Dd],this.context.mainCamera[Dd]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),cr(!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&&(He&&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=Vt(this.context.scene.children);if(s){const r=s.getSize($());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($());l.y=a.position.y,a.lookAt(l)}}}o_({session:this}),pr();for(const s of Y._xrStartListeners)s(i);const n=[...this._xr_scripts];He&&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)}He&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(cr(!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(He)for(const e of this.controllers)e.onRenderDebug();if((He||O_)&&this.rig&&(rg++,rg>=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()}`,He||O_)for(const s of this.controllers)n+=`
165
+ ${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;rg=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 ce&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),G.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:(He&&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){He&&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=$e(this.rig.gameObject);e*=i.x}this._camera instanceof ce&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,He&&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 ce&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new U;_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 S_),this._transition}fadeTransition(){return this._transition||(this._transition=new S_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof ce&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const lg=w("debugwebxr");class M_{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(lg&&console.log("FOUND AVATAR HEAD",e.name),i.head=new te("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(lg&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new te("",t,e)),!i.rightHand&&n.includes("right")&&(lg&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new te("",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)}}}const It=new b,R_=new b,T_=new U,XO=w("debuggizmos"),bn=8947848,cg=32;class F{constructor(){}static enabled=!0;static isGizmo(e){return e[dg]!==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=bn);const l=Y.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=bn,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),It.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),a.needsUpdate=!0,r.material.color.set(i),r.material.depthTest=s,r.material.depthWrite=!1}static DrawDirection(e,t,i=bn,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?(It.set(0,0,-r),T_.set(t.x,t.y,t.z,t.w),It.applyQuaternion(T_)):(It.set(t.x,t.y,t.z),It.multiplyScalar(r)),l.setXYZ(1,e.x+It.x,e.y+It.y,e.z+It.z),l.needsUpdate=!0,a.material.color.set(i),a.material.depthTest=s,a.material.depthWrite=!1}static DrawLine(e,t,i=bn,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.color.set(i),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1}static DrawCircle(e,t,i,n=bn,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,It.set(t.x,t.y,t.z).normalize()),a.material.color.set(n),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1}static DrawWireSphere(e,t,i=bn,n=0,s=!0){if(!F.enabled)return;const r=qi.getSphere(t,n,!0);ar(r,e.x,e.y,e.z),r.material.color.set(i),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1}static DrawSphere(e,t,i=bn,n=0,s=!0){if(!F.enabled)return;const r=qi.getSphere(t,n,!1);ar(r,e.x,e.y,e.z),r.material.color.set(i),r.material.depthTest=s,r.material.depthWrite=!1}static DrawWireBox(e,t,i=bn,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.color.set(i),a.material.depthTest=s,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1}static DrawWireBox3(e,t=bn,i=0,n=!0){if(!F.enabled)return;const s=qi.getBox(i);s.position.copy(e.getCenter(It)),s.scale.copy(e.getSize(It)),s.material.color.set(t),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1}static _up=new b(0,1,0);static DrawArrow(e,t,i=bn,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),It.set(t.x,t.y,t.z).sub(R_.set(e.x,e.y,e.z)).normalize());const l=It.set(t.x,t.y,t.z).sub(R_.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.color.set(i),a.material.depthTest=s,a.material.wireframe=r,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.matrix.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrix.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.color.set(e.color??bn),t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0}}const QO=new fa(1,1,1);function hg(o=null){const e=new ne(o??14540253),t=new sS(QO);return new B0(t,new nm({color:e}))}const dg=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),XO&&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 rb(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 fa(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 ya;let i=t.geometry.getAttribute("position");i||(i=new pt(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 ya;let i=t.geometry.getAttribute("position");if(!i){i=new pt(new Float32Array(cg*3),3),t.geometry.setAttribute("position",i);const n=$(0,1,0),s=$(0,0,1),r=$(s);r.cross(n).normalize();const a=$(r),l=Math.PI*2/(cg-1);for(let c=0;c<cg+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 sd(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 j0(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 xe),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[dg]=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(xr(n))continue;const s=e.isInVR,r=!1,a=!s;ql(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(),xr(r)!=!0&&r[dg].push(r))}}}const $t=w("debugphysics"),E_=new os;class ps{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new K),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){E_.set(e),this.layerMask=E_}setMask(e){this.layerMask||(this.layerMask=new os);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class ug{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class Ll{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 rd;defaultRaycastOptions=new ps;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new os;sphere=new ad;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){$t&&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 $t&&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 rS&&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 os?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),$t&&console.time("raycast"),s.length=0,Ll._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))),Ll._raycasting--,$t&&(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 ya)continue;let r=!0;const a=s,l=a.geometry;if(n.testObject){const c=n.testObject?.(s);if(c===!1)continue;c==="continue in children"&&(r=!1)}if(r&&(l&&A_(l)||(r=!1)),r){const c=X0(s);c&&(a.geometry=c);const h=i.length;let d=!0;if(n.precise===!1&&(d=!1),d||=l.getAttribute("position")?.array?.length<64,a instanceof va&&(d=!1),!d&&ZO(a,e,i)||(n.useAcceleratedRaycast!==!1?Fd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),$t&&i.length!=h){const p=i[i.length-1],g=c?8969557:7798784;F.DrawWireSphere(p.point,.1,g,1,!1),F.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:g})}a.geometry=l}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new bi;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 ya),c&&=!(e instanceof va);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&&A_(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const g=s.length;if(Fd.runMeshBVHRaycast(this.sphere,h,s,this.context,{}),g!=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),g=this.sphere;if(g.center.copy(t),g.radius=i,g.intersectsBox(p)){const f=Z(e),m=f.distanceTo(g.center),y=new ug(e,m,f);if(s.push(y),!r)return}}}if(e.children)for(const p of e.children){const g=s.length;if(this.intersectSphere(p,t,i,n,s,r,a,l),g!=s.length&&!r)return}}}function A_(o){return!(o.index&&o.index.array.length<3)}const fr=new ad,Bd=new nr,YO=new L0;function ZO(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 va){Bd.setFromNormalAndCoplanarPoint($(0,1,0),$(0,-l.position.y,0)),Bd.applyMatrix4(l.matrixWorld,YO);const d=s.ray.intersectPlane(Bd,$());if(d){fr.copy(c),fr.applyMatrix4(l.matrixWorld);const p=$(d).sub(s.ray.origin).length(),g=fr.radius*.5;p<g&&r.push({distance:p,point:d,object:l,normal:Bd.normal.clone()})}return}fr.copy(c),fr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(fr,$());if(h){const d=$(h).sub(s.ray.origin),p=d.length();if(p>fr.radius){const g=d.clone().normalize();r.push({distance:p,point:h,object:l,normal:g})}}}}),o._computeIntersections=n,e.intersectObject(o,!1,t),o._computeIntersections=i,!0}var Fd;(o=>{function e(_,v,P,T,O){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const A=v.geometry;if(v?.isSkinnedMesh){const I=v,W=I.bvhNeedsUpdate;if(!I.staticGenerator)a(),s&&(I.staticGenerator=new s(v),I.staticGenerator.applyWorldTransforms=!1,I.staticGeometry=I.staticGenerator.generate(),A.boundsTree=r?.call(I.staticGeometry),I.staticGeometryLastUpdate=performance.now()+Math.random()*200,I.bvhNeedsUpdate=!0);else if(A.boundsTree&&(I.autoUpdateMeshBvhInterval!==void 0&&I.autoUpdateMeshBvhInterval>=0||W===!0)){const D=performance.now(),q=D-I.staticGeometryLastUpdate,ie=I.autoUpdateMeshBvhInterval??100;(W||q>ie)&&($t&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${q.toFixed(2)}ms`),I.bvhNeedsUpdate=!1,I.staticGeometryLastUpdate=D,I.staticGenerator?.generate(I.staticGeometry),A.boundsTree.refit())}}else if(!A.boundsTree){c||y();let I=!0;if((T.xr||A[g]===!1||A.getAttribute("position")?.isInterleavedBufferAttribute||A.index&&A.index?.isInterleavedBufferAttribute)&&(I=!1),I&&d){if(A[p]===void 0){let W=null;if(m.length>0){const D=m.shift();D&&!D.running&&(W=D)}if(!W&&f.length<3&&(W=new d,f.push(W)),W!=null&&!W.running){const D=v.name;$t&&console.log("<<<< worker start",D,W),A[p]="queued",performance.mark("bvh.create.start");const q=A.clone();try{W.generate(q).then(ie=>{A[p]="done",A.boundsTree=ie}).catch(ie=>{A[p]="failed - "+ie?.message,A[g]=!1,$t&&console.error("Failed to generate mesh bvh on worker",ie)}).finally(()=>{$t&&console.log(">>>>> worker done",D,{hasBoundsTre:A.boundsTree!=null}),m.push(W),q.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(ie){console.error("Failed to generate mesh bvh on worker",ie)}}else $t&&console.warn("No worker available")}}else(!h||!I)&&(a(),n&&(performance.mark("bvh.create.start"),A.boundsTree=new n(A),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(_ instanceof rd){const I=_,W=v.raycast;if(A.boundsTree)a(),i&&(v.acceleratedRaycast||(v.acceleratedRaycast=i.bind(v),$t&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if($t&&console.warn("No bounds tree found for mesh",v.name,{workerTask:A[p],hasAcceleratedRaycast:i!=null}),O.allowSlowRaycastFallback===!1&&(A.getAttribute("position")?.array?.length??0)>2e3)return $t&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const D=I.firstHitOnly;return I.firstHitOnly=!1,I.intersectObject(v,!1,P),I.firstHitOnly=D,v.raycast=W,!0}else if(_ instanceof ad){const I=A.boundsTree;if(I){const W=_;if(l.copy(v.matrixWorld).invert(),W.applyMatrix4(l),I.intersectsSphere(W)){const D=Z(v),q=D.distanceTo(W.center),ie=new ug(v,q,D);P.push(ie)}}return!0}return!1}o.runMeshBVHRaycast=e;let t=!1,i=null,n=null,s=null,r=null;function a(){t||(t=!0,import("./vendor-JyrX4DVM.min.js").then(_=>_.index$1).then(_=>{i=_.acceleratedRaycast,n=_.MeshBVH,s=_.StaticGeometryGenerator,r=_.computeBoundsTree}).catch(_=>{($t||E())&&console.error("Failed to load BVH library...",_.message)}))}const l=new J;let c=!1,h=!1,d=null;const p=Symbol("Needle:MeshBVH-Worker"),g=Symbol("Needle:MeshBVH-CanUseWorker"),f=[],m=[];function y(){c=!0,h=!0,Promise.resolve().then(()=>BI).then(_=>{d=_.GenerateMeshBVHWorker}).catch(_=>{($t||E())&&console.warn("Failed to setup mesh bvh worker")}).finally(()=>{h=!1})}})(Fd||(Fd={}));const I_=Symbol("gltf-loader-internal-usage-tracker"),KO=w("debugusers");class jl{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return jl._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(){jl._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[I_]=e._loadingId),r)),s},null}afterRoot(e){jl._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[I_],t instanceof k&&(t.parent||t instanceof H&&setTimeout(()=>{KO&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class L_{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:
166
+ `+i.src),e.preventDefault())}})}}const Ud=w("trackresources");function j_(){return Ud==="dispose"}let yr=!0;Ud===0&&(yr=!1);function JO(o){yr=o}function D_(){return yr}const B_=Symbol("disposable");function F_(o,e){o&&(o[B_]=e,br&&console.warn("Set disposable",e,o))}const U_=Symbol("disposed");function ek(o){return o[U_]===!0}function Pe(o){if(o){if(o[B_]===!1){br&&console.warn("Object is marked as not disposable",o);return}if(typeof o=="object"&&(o[U_]=!0),o instanceof yi)Pe(o.environment),Pe(o.background),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial);else if(o instanceof as)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 pn){Ea(o);for(const e of Object.keys(o.attributes)){const t=o.attributes[e];Pe(t)}}else if(o instanceof pt||o instanceof F0)br&&console.warn("BufferAttribute dispose not supported",o.count);else if(o instanceof Array)for(const e of o)e instanceof ve&&Pe(e);else if(o instanceof ve){Ea(o);for(const t of Object.keys(o)){const i=o[t];i instanceof Re&&Pe(i)}const e=o.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof Re?Pe(i):i instanceof Ni&&Pe(i.value)}}else o instanceof Re?(Ea(o),Ea(o.source),o.source?.data instanceof ImageBitmap&&Ea(o.source.data)):o instanceof aS?(Ea(o.boneTexture),o.boneTexture=null):o instanceof lS||!(o instanceof k)&&br&&console.warn("Unknown object type",o)}}function Ea(o){o&&((br||j_()||Ud)&&console.warn("\u{1F9E8} FREE",o),o instanceof ImageBitmap||"dispose"in o&&typeof o.dispose=="function"&&o.dispose())}function tk(o){}const ik=new Set;function pg(o,e,t=null,i){if(i||(i=ik,i.clear()),!o)return i;const n=o[oc];if(n)for(const s of n)i.has(s)||t?.call(null,s)!==!1&&(i.add(s),e&&pg(s,!0,t,i));return i}function nk(o){return o[sc]}const br=w("debugresourceusers")||w("debugmemory"),oc=Symbol("needle-resource-users"),sc=Symbol("needle-resource-users-count");function Ht(o,e){kd(o,e,function(t,i){yr&&!Ll.raycasting&&(zd(oc,this,t,!1),zd(oc,this,i,!0))})}yr&&(Ht(H.prototype,"material"),Ht(H.prototype,"geometry"),Ht(ve.prototype,"map"),Ht(ve.prototype,"bumpMap"),Ht(ve.prototype,"alphaMap"),Ht(ve.prototype,"normalMap"),Ht(ve.prototype,"displacementMap"),Ht(ve.prototype,"roughnessMap"),Ht(ve.prototype,"metalnessMap"),Ht(ve.prototype,"emissiveMap"),Ht(ve.prototype,"specularMap"),Ht(ve.prototype,"envMap"),Ht(ve.prototype,"lightMap"),Ht(ve.prototype,"aoMap"),Ht(ve.prototype,"gradientMap"));function ok(o){if(yr===!1)return;const e=o[oc];if(e)for(const t of e)zd(oc,t,o,!1)}yr&&kd(ve.prototype,"dispose",function(){ok(this)});let mg=0;function zd(o,e,t,i){if(mg>0)return;if(Array.isArray(t)){for(const s of t)zd(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[sc]||0;s+=1,t[sc]=s,br&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,s,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let s=t[sc]||0;s>0&&(s-=1,t[sc]=s),br&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,s,"users:",n),s<=0&&(jl.isLoading(t)||(Ud&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),j_()&&Pe(t)))}t[o]=n}try{kd(ir.prototype,"render",function(){mg++},function(){mg--})}catch(o){console.warn("Could not wrap WebGLRenderer.render",o)}const z_=w("debugcomponentevents");class Nd{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),z_&&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(z_&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const rc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),N_=Symbol("isUsingInstancing"),W_=Symbol("instancingRenderer"),ac=Symbol("instancingAutoUpdateBounds");class ln{static isUsingInstancing(e){return e[N_]===!0}static getRenderer(e){return e[W_]||null}setAutoUpdateBounds(e,t){const i=ln.getRenderer(e);i&&(i[ac]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[rc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)ln.markDirty(i,!0)}}var lc;(o=>{o.experimentalSmartHierarchyUpdate=!1})(lc||(lc={}));function Aa(o,e){try{e||o()}catch(t){return console.error(t),!1}return!0}const gg=w("debugnewscripts"),sk=w("debughierarchy"),Ae=[];function rk(){return Ae.length>0}function Wd(o){if(gg&&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){(E()||gg)&&console.error(`Registered script is not a Needle Engine component.
167
+ The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
168
+ `,t),Ae.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
169
+ Did you add and remove a component in the same frame?`),Ae.splice(e,1),e--;continue}t.context=o,cc(t.gameObject),fg(t,o)}catch(t){console.error(t),Po(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed){Po(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&&Aa(t.__internalAwake.bind(t)))}catch(t){console.error(t),Po(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,Aa(t.__internalEnable.bind(t)))}catch(t){console.error(t),Po(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),Po(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 ak(o){o&&(o.__internalDisable(!0),Po(o,o.context))}function V_(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;Aa(i.__internalAwake.bind(i)),i.enabled&&(Aa(i.__internalEnable.bind(i)),Aa(i.__internalStart.bind(i)),o.new_script_start.splice(t,1),t--)}catch(i){console.error(i),Po(o.new_script_start[t],o),o.new_script_start.splice(t,1),t--}}function fg(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),yg(o,null)&&e.new_scripts_xr.push(o),yg(o,"immersive-vr")&&e.scripts_immersive_vr.push(o),yg(o,"immersive-ar")&&e.scripts_immersive_ar.push(o))}function Po(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 yg(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 bg=!0;function _g(){bg=!0}function Vd(o,e=!1){if(lc.experimentalSmartHierarchyUpdate){if(!e&&!bg)return;bg=!1}if(o||(o=ue.Current.scene),!o){console.trace("Invalid call - no current context.");return}const t=Ba(o);$_(o,t,!0)||(gg||E()?console.error(`Error updating hierarchy
170
+ 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 $_(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=Ba(o);if(e&&(e=n,e&&o.parent&&i===0)){const a=o.parent;e=a[wo],e===void 0&&(a instanceof yi||(e=!0))}const s=o[wo]!==e;s&&(o[wo]=e,sk&&console.warn("ACTIVE CHANGE",o.name,n,o.visible,e,"changed?"+s,o),lk(o,a=>{e?a.enabled&&(Aa(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)$_(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),!Ba(t)){e=!1;break}t=t.parent}if(!o){console.error("GO is null");return}o[wo]=e&&i}function lk(o,e){if(o.userData?.components)for(const t of o.userData.components)e(t)}const $d=new Map,H_=Symbol("prewarmFlag"),vg=Symbol("waitingForPrewarm"),wg=w("debugprewarm");function ck(o,e){!o||o[H_]===!0||o[vg]===!0||($d.has(e)||$d.set(e,[]),o[vg]=!0,$d.get(e).push(o),wg&&console.debug("register prewarm",o.name))}let G_=null,q_=null;function hk(o){if(!o)return;const e=$d.get(o);if(!e?.length)return;const t=o.mainCamera;if(t){wg&&console.log("prewarm",e.length,"objects",[...e]);const i=o.renderer;if(i.compile){const n=o.scene;i.compile(n,t),G_??=new cS(64),q_??=new hS(.001,9999999,G_),q_.update(i,n);for(const s of e)s[H_]=!0,s[vg]=!1;e.length=0,wg&&console.log("prewarm done")}}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context;J_(e),Y_(e)});const Hd=w("debugcomponents"),X_="eff8ba80-635d-11ec-90d6-0242ac120003";class At{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=At.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return ib(e,X_);const t=this._seed;return this._seed-=1,ib(t.toString(),X_)}initialize(e){typeof e=="string"?this._seed=At.hash(e):this._seed=e}static createFromString(e){return new At(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 Q_=(o=>(o.NewInstanceCreated="new-instance-created",o.InstanceDestroyed="instance-destroyed",o))(Q_||{});class dk{guid;dontSave;constructor(e){this.guid=e}}function hc(o,e,t=!0,i){if(!o)return;const n=o;if(Ci(o,t),!e){console.warn("Can not send destroy: No networking connection provided",o.guid);return}if(!e.isConnected){E()&&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}xg(s,e,i)}function xg(o,e,t){const i=new dk(o);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,yn.Queued)}function Y_(o){o.connection.beginListen("instance-destroyed",e=>{Hd&&console.log("[Remote] Destroyed",o.scene,e);const t=Ig(e.guid,o.scene);t&&Ci(t)})}class uk{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class Z_{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}function Sg(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}=pk(n,e);if(r){const l=r;if(l.guid){Hd&&console.log("[Local] new instance","gameobject:",r?.guid);const c=new Z_(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 nt?s.rotation=new U().setFromEuler(s.rotation):s.rotation instanceof Array&&(s.rotation=new U().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&&E()&&console.debug("Object will be instantiated but it will not be synced: not connected",n.guid),e.context.connection.isInRoom&&Ia.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 K_(){return Math.random()*9999999}const Ia=new Array;function J_(o){o.connection.beginListen("new-instance-created",async e=>{const t=await mk(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 An;e.position&&(i.position=new b(e.position.x,e.position.y,e.position.z)),e.rotation&&(i.rotation=new U(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 At(e.seed)),i.visible=e.visible,i.context=o,Hd&&o.alias&&console.log("[Remote] instantiate in: "+o.alias);const n=Ua(t,i);Ia.push(new WeakRef(n)),n&&(e.parent==="scene"&&o.scene.add(n),Hd&&console.log("[Remote] new instance","gameobject:",n?.guid,t))}),o.connection.beginListen("left-room",()=>{Ia.length>0&&console.debug(`Left networking room, cleaning up ${Ia.length} instantiated objects`);for(const e of Ia){const t=e.deref();t&&t.destroy()}Ia.length=0})}function pk(o,e){const t=K_(),i=e??new An;i.idProvider=new At(t);const n=Ua(o,i);return{seed:t,instance:n}}const ev={};function tv(o,e){ev[o]=e}async function mk(o,e){const t=ev[o];if(t!=null){const i=await t(o);if(i)return i}return iv(o,e)}function iv(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=iv(o,t);if(i)return i}return null}const dc=w("gizmos"),gt=w("debugextension"),Cg=w("debugtypes");class gk{_types=new Map;constructor(){Cg&&console.warn("TypeStore: Created",this)}add(e,t){Cg&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?Cg&&i!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):this._types.set(e,t)}get(e){return this._types.get(e)||null}getKey(e){for(const[t,i]of this._types)if(i===e)return t;return null}}const fk=Symbol("BuiltInType"),C=new gk,nv=function(o){C.get(o.name)||C.add(o.name,o)},Pg=w("debugresolvedependencies"),yk=["/extensions/","extensions/"],bk=[{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 Og(o,e){Pg&&console.log(o,e);const t=[];kg(bk,o,e,t);const i=await Promise.all(t);return typeof e=="string"&&i.length===1?i[0]:i}function ov(o,e){return!o||!e?!1:o["needle:identifier"]!=null&&e["needle:identifier"]!=null?o["needle:identifier"]===e["needle:identifier"]:!1}function _k(o,e){o["needle:identifier"]=e}function kg(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=sv(e,s);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=rv(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=sv(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){Pg&&console.log(c,h,c.dependencyName),i.push(e.getDependency(c.dependencyName,h).then(d=>s[r]=d));break}}typeof a=="object"&&kg(o,e,a,i)}else typeof s=="object"&&kg(o,e,s,i)}else if(typeof t=="string"){const n=rv(o,e,t);n&&i.push(n)}}function sv(o,e){if(o&&o.plugins&&typeof e=="string"){for(const t of yk)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(gt&&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 rv(o,e,t){for(const i of o){const n=av(i.prefix,t);if(n>=0)return Pg&&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 Mg="NEEDLE_persistent_assets";function vk(o){return o?.___persistentAsset===!0}class wk{get name(){return Mg}parser;constructor(e){this.parser=e}async afterRoot(e){if(!this.parser?.json?.extensions)return;const t=this.parser.json.extensions[Mg];if(!t)return;gt&&console.log(t);const i=new Array;for(const n of t?.assets){const s=Og(this.parser,n);s&&i.push(s)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){gt&&console.log(t);const n=e.json.extensions[Mg];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 zn=w("debugserializer");class xk{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;zn&&console.warn("Type: "+e+" is already registered",t,i)}zn&&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){zn&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return zn&&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;zn&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}zn&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const Gd=new xk;class Qi{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)Gd.register(i,this);else Gd.register(e,this)}}class Sk{isDevMode=Vi();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)),zn&&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 Rg{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function lv(o,e){const t=o.$serializedTypes;if(t===void 0)return null;const i={};for(const s in t){const r=o[s];if(r!=null&&typeof r=="object"){const a=Gd.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 qd=[];function cv(o,e){if(!o)return e;typeof o.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,o.$serializedTypes));const t=Object.getPrototypeOf(o);return cv(t,e)}function Xd(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=cv(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?Tg(a,c,t,void 0,o[n]):Tg(a,l,t,void 0,o[n])};const r=i[n],a=e[n];if(zn&&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);qd.length=0}o.onAfterDeserializeMember!==void 0&&o.onAfterDeserializeMember(n,a,t)}}Ok(o,e)}return Pk(o,e,t.implementationInformation),o.onAfterDeserialize!==void 0&&o.onAfterDeserialize(e,t),!0}const Ck=w("noerrors");function Pk(o,e,t){if(Ck||!e||!Vi()||!o||o.constructor&&o.constructor[fk]===!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)&&(rr(xi.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)){rr(xi.Warn,`<strong>Missing serialization for object reference!</strong>
171
+
172
+ Please change to:
173
+ @serializable(Object3D)
174
+ ${s}? : Object3D;
175
+
176
+ in ${i}.ts
177
+ <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+`
178
+ ${s}:`,a,l),rr(xi.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"))){rr(xi.Warn,`<strong>Missing serialization for object reference!</strong>
179
+
180
+ Please change to:
181
+ @serializable(AssetReference)
182
+ ${s}? : AssetReference;
183
+
184
+ in script ${i}.ts
185
+ <a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(i,s,o[s],o);continue}}}}function Ok(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){zn&&console.log(t,"is undefined on",o);continue}for(const s of Object.keys(i))if(n[s]===void 0&&hv(i[s])&&!hv(n)){const r=kk(n,s);if(r&&(r?.writable===void 0||r?.writable===!1)&&r.set===void 0){zn&&console.warn('Property is not writable "'+s+'"',n,r,i[s],n[s]);continue}n[s]=i[s]}}}}function kk(o,e){for(;o;){const t=Object.getOwnPropertyDescriptor(o,e);if(t)return t;o=Object.getPrototypeOf(o)}}function hv(o){switch(typeof o){case"number":case"string":case"boolean":return!0}return!1}function Tg(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 ve||n instanceof H||n instanceof pn||n instanceof Wi))return n;if(i||(i={serializer:Gd.getSerializerForConstructor(r)}),n&&typeof n=="object"&&vk(n)){if(n.__concreteInstance)return n.__concreteInstance;const h=n;if(!h.$serializedTypes&&r.prototype.$serializedTypes&&(h.$serializedTypes=r.prototype.$serializedTypes),h.$serializedTypes&&Xd(h,o,t),n&&r!==void 0)try{let d=null;i.serializer&&(d=i.serializer.onDeserialize(o,t)),d||(d=new r,gt&&console.log("Create concrete instance for persistent asset",n,"instance:",d),La(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],g=Tg(p,e,t,i,p);h.push(g)}return h}const a=i?.serializer;if(a)return a.onDeserialize(o,t);if(n instanceof Re)return n;let l;if(o&&(o.isMaterial||o.isTexture||o.isObject3D||o instanceof Wi))l=o;else{if(o===void 0)return;if(o===null&&(r===ve||r===Re||r===H||r===Wi))return null;try{l=new r(...Mk(o))}catch(h){console.error("Error creating "+t.path,t.target,h);return}}const c=l;return c.$serializedTypes&&Xd(c,o,t),l}function Mk(o){if(qd.length=0,typeof o=="object"&&o!==null&&o!==void 0)for(const e of Object.keys(o))qd.push(o[e]);return qd}const Eg=Symbol("assigned component properties");function La(o,e,t,i){if(e==null||o==null)return;o[Eg]=!0;const n=o.constructor?.name??"unknown";t?.registerDefinedKeys(n,o);for(const s of Object.keys(e)){const r=Rk(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[Eg]}function Rk(o,e){let t;do t=Object.getOwnPropertyDescriptor(o,e);while(!t&&(o=Object.getPrototypeOf(o)));return t}const dv=Symbol("customVisibilityFlag");function Oo(o,e){o.layers[dv]=e}const uv=Symbol("DidPatchLayers");function Tk(){const o=os.prototype;if(o[uv])return;o[uv]=!0;const e=o.test;o.test=function(t){return this[dv]===!1?!1:e.call(this,t)}}Tk(),Object.defineProperty(ce.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(ce.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(ce.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 pv=new Map;function mv(o,e){if(!o)return;if(!e){console.warn("No prototype found",o,o.prototype,o.constructor);return}const t=pv.get(e);t&&t.apply(o)}function gv(o){const e=Ek(o.prototype);pv.set(o,e)}function Ek(o){return new Ak(o)}class Ak{$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 Ik=w("debuggetcomponent"),fv=()=>Ik||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function Lk(o){return o==null||o.isObject3D?o:o.object&&o.object.isObject3D?o.object:o}function Ag(o,e){if(!o||!o.userData.components)return e;const t=o.userData.components.indexOf(e);return t<0||(Nd.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,o.userData.components.splice(t,1)),e}function uc(o,e,t){return vr(o,e)||_n(o,e,t)}const yv=new At("addComponentIdProvider");function _r(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=yv.generateUUID()),Yd(o),cu(e,e.context);try{t&&e.__internalAwake&&(cc(o),e.activeAndEnabled&&e.__internalAwake()),Nd.dispatchComponentLifecycleEvent("component-added",e)}catch(i){console.error(i)}return e}function _n(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),_r(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=yv.generateUUID()),t&&e._internalInit(t),cu(e,e.context),e}function bv(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(),Po(o,o.context??z.Current),o.destroy(),o.gameObject=null}let _v=!1;function vv(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.
186
+ Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
187
+
188
+ You can import other modules your main module to get access to types
189
+ or if you use npmdefs you can make types available globally using globalThis:
190
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e))),fv()&&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(fv()&&console.log("[onGetComponent] MATCH BY PROTOYPE",s),t)t.push(n);else return n;s=Object.getPrototypeOf(s)}}return t||null}function vr(o,e){const t=vv(o,e);return t?Array.isArray(t)?t[0]:t:null}function pc(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),vv(o,e,t),t}function mc(o,e,t){if(t===!1&&o[wo]===!1)return null;const i=vr(o,e);if(t===!1&&i?.enabled===!1)return null;if(i)return i;for(let n=0;n<o?.children?.length;n++){const s=mc(o.children[n],e);if(s)return s}return null}function ja(o,e,t,i=!0){t||(t=[]),i&&(t.length=0),pc(o,e,t,!1);for(let n=0;n<o?.children?.length;n++)ja(o.children[n],e,t,!1);return t}function gc(o,e){if(!o)return null;if(Array.isArray(o)){for(let i=0;i<o.length;i++){const n=Lk(o[i]),s=gc(n,e);if(s)return s}return null}return vr(o,e)||(o.parent?gc(o.parent,e):null)}function Qd(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),o?(pc(o,e,t,!1),o.parent?Qd(o.parent,e,t,!1):t):t}function Da(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&&mc(i,o,t)||null}function wv(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&&ja(i,o,e,!1),e}function Yd(o){o&&o.isObject3D===!0&&mv(o,k)}if(lc.experimentalSmartHierarchyUpdate){const o=k.prototype.add;k.prototype.add=function(...i){return _g(),o.apply(this,i)};const e=k.prototype.attach;k.prototype.attach=function(...i){return _g(),e.apply(this,i)};const t=k.prototype.remove;k.prototype.remove=function(...i){return _g(),t.apply(this,i)}}k.prototype.SetActive=function(o){this.visible=o},k.prototype.setActive=function(o){this.visible=o},k.prototype.destroy=function(){Ci(this)},k.prototype.addComponent=function(o,e){return _n(this,o,e)},k.prototype.addNewComponent=function(o,e){return _n(this,o,e)},k.prototype.removeComponent=function(o){return Ag(this,o)},k.prototype.getOrAddComponent=function(o,e){return uc(this,o,e)},k.prototype.getComponent=function(o){return vr(this,o)},k.prototype.getComponents=function(o,e){return pc(this,o,e)},k.prototype.getComponentInChildren=function(o){return mc(this,o)},k.prototype.getComponentsInChildren=function(o,e){return ja(this,o,e)},k.prototype.getComponentInParent=function(o){return gc(this,o)},k.prototype.getComponentsInParent=function(o,e){return Qd(this,o,e)},Object.getOwnPropertyDescriptor(k.prototype,"activeSelf")||Object.defineProperty(k.prototype,"activeSelf",{get:function(){return Ba(this)},set:function(o){fc(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldPosition")||Object.defineProperty(k.prototype,"worldPosition",{get:function(){return this instanceof Q0?Z(this.object):Z(this)},set:function(o){mt(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldQuaternion")||Object.defineProperty(k.prototype,"worldQuaternion",{get:function(){return this instanceof Q0?be(this.object):be(this)},set:function(o){mn(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRotation")||Object.defineProperty(k.prototype,"worldRotation",{get:function(){return Sd(this)},set:function(o){zb(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldScale")||Object.defineProperty(k.prototype,"worldScale",{get:function(){return $e(this)},set:function(o){Sa(this,o)}});const jk=new J,Dk=new b(0,0,0),Bk=new b(0,1,0);Object.getOwnPropertyDescriptor(k.prototype,"worldForward")||Object.defineProperty(k.prototype,"worldForward",{get:function(){return $().set(0,0,1).applyQuaternion(be(this))},set:function(o){const e=ti().setFromRotationMatrix(jk.lookAt(Dk.set(0,0,0),o,Bk.set(0,1,0)));this.worldQuaternion=e}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRight")||Object.defineProperty(k.prototype,"worldRight",{get:function(){return $().set(1,0,0).applyQuaternion(be(this))}}),Object.getOwnPropertyDescriptor(k.prototype,"worldUp")||Object.defineProperty(k.prototype,"worldUp",{get:function(){return $().set(0,1,0).applyQuaternion(be(this))}}),gv(k);class se extends ne{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=j.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=j.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 Zd=w("debuggetcomponent"),wr=w("debuginstantiate");class An{idProvider;parent;keepWorldPosition;position;rotation;scale;visible;context;components;clone(){const e=new An;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 Ba(o){return o.visible}function fc(o,e){return typeof e=="number"&&(e=e>.5),o.visible=e,o.visible}function xv(o){return o[wo]||Kd(o)}function Sv(o,e){o[N_]=e}function Kd(o){return ln.isUsingInstancing(o)}function Ig(o,e){return wa(o,e,!0,!0)}const Cv=Symbol("isDestroyed");function xr(o){return o[Cv]}function Pv(o,e){o[Cv]=e}const Lg=Symbol("isDontDestroy");function Fa(o,e=!0){o[Lg]=e}const Jd=[],eu=[];function Ci(o,e=!0,t=!1){Jd.length=0,eu.length=0,jg(o,e,!0);for(const i of Jd)i.gameObject=null,i.context=null;for(const i of eu)Pv(i,!0),t&&Pe(i);eu.length=0,Jd.length=0}function jg(o,e=!0,t=!0){if(o==null)return;const i=o;if(i.isComponent){if(i[Lg])return;Jd.push(i);const r=i.gameObject;i.__internalDisable(),i.__internalDestroy(),i.gameObject=r;return}if(o[Lg])return;const n=o;Zd&&console.log(n),eu.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];jg(l,e,!1),s.length<r&&(r=s.length,a--)}}if(e&&n.children)for(const r of n.children)jg(r,e,!1);t&&n.removeFromParent()}function Sr(o,e,t=!0){return Ov(o,e,t)}function*tu(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*tu(s,e,!0,i,n+1)}}function Ov(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=Ov(r,e,t,n);if(a!==void 0)return a}}}}function Ua(o,e){if("isAssetReference"in o)return o.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new An,t.position=e):t=e);let i=z.Current;t?.context&&(i=t.context),Zd&&i.alias&&console.log("context",i.alias),t&&!t.idProvider&&(t.idProvider=new At(Date.now()));const n=[],s={},r={},a=kv(i,o,t,n,s,r);a&&(zk(a,s),Uk(r,s)),Zd&&(Cd(o,!0),Cd(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,Zd&&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)}Wd(i)}return a}function kv(o,e,t,i,n,s){if(!e||e[Si])return null;const r=e.userData;e.userData={};const a=e.children;e.children=[];const l=e.clone(!1);if(Yd(l),e.userData=r,e.children=a,n[e.uuid]={original:e,clone:l},wr&&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 U)l.worldQuaternion=t.rotation;else if(t.rotation instanceof nt)l.worldQuaternion=ti().setFromEuler(t.rotation);else if(Array.isArray(t.rotation)){const h=new nt;h.fromArray(t.rotation),l.worldQuaternion=ti().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=wa(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 g=h[p],f=new g.constructor;Fk(g,f),g[Jl]!==void 0&&(f[Jl]=g[Jl]),d.push(f),f.gameObject=l,i.push(f),n[g.guid]={original:g,clone:f},Nd.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 Fk(o,e,t){La(e,o,void 0,{})}function Uk(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 zk(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=Mv(s,a,d,e);p!==void 0?(wr&&console.log("Found new instance for",a,d,"->",p),c.push(p)):(wr&&console.warn("Could not find new instance for",a,d),c.push(d))}}else if(typeof l=="object"){const c=Mv(s,a,l,e);c!==void 0?s[a]=c:wr&&console.warn("Could not find new instance for",a,l)}}}}function Mv(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){wr&&console.log("reference did not change",e,o,t);return}const a=n.userData.components.indexOf(t);if(a>=0&&r.isObject3D)return wr&&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 wr&&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 Cr;(o=>{o.baseUrl="https://networking.needle.tools";function e(l){return nb(new Uint8Array(l))}o.hashMD5=e;function t(l){const c=nb(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 $n()?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,g=p/1024/1024;if(g>50)return c?.silent!==!0&&ge(`File (${g.toFixed(1)}MB) is too large for uploading (see console for details)`),console.warn(`Your file is too large for uploading (${g.toFixed(1)}MB). Max allowed size is 50MB`),null;if(!$n()&&g>5)return c?.silent!==!0&&ge('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 (${g.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 (${g.toFixed(1)}MB). Min size is 1 byte`),null;const f=t(d),m={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:m,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(T){return c?.onProgress?.call(null,{progress01:0,state:"inprogress"}),fetch(T,{method:"PUT",headers:m,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 v=!1,P=null;for(let T=0;T<3;T++)try{if(v)break;if(c?.abort?.aborted)return console.debug("Aborted upload"),null;const O=await _(y.upload);O instanceof Error?(P=O,await Bn(1e3*T)):O.ok&&(console.debug("File uploaded successfully"),v=!0)}catch(O){console.error(O)}if(!v)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 om;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})(Cr||(Cr={}));const ms=w("debugaddressables");class Rv{_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 Dg=Symbol("assetReference");class te{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 te(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=cs(e,t);ms&&console.log("GetOrCreate Addressable from",e,t,"FinalPath=",n);const s=i.addressables,r=s.findAssetReference(n);if(r)return r;const a=new te(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;tv(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||xr(this.asset)===!0}_loadingPromise=null;isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(ms&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Ci(this.asset.scene,!0,!0),Ci(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,ms&&console.log("Preload",this.url);const e=await Cr.download(this.url,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(ms&&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=fn().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else ms&&console.log("Load async",this.url),this._loadingPromise=fn().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[Dg]=this,this._glbRoot&&(this._glbRoot[Dg]=this),this.asset&&(this.asset[Dg]=this),Wd(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 An;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(),ms&&console.log("Instantiate",this.url,"parent:",e),this.asset){ms&&console.log("Add to scene",this.asset);let r=te.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,te.currentlyInstantiating.set(this.url,r),t){s.context=n;const a=this.asset;a.guid=this.url;const l=Sg(a,s,void 0,i);if(l)return l}else{const a=Ua(this.asset,s);if(a)return a}}finally{n.post_render_callbacks.push(()=>{r===void 0||r<0?r=0:r-=1,te.currentlyInstantiating.set(this.url,r)})}}else ms&&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 Nk extends Qi{constructor(){super([te],"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?te.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 te(s,void 0,i);return n.addressables.registerAssetReference(a),a}return null}}new Nk;const Wk=Promise.resolve(null);class ua{static imageReferences=new Map;static getOrCreate(e){let t=ua.imageReferences.get(e);return t||(t=new ua(e),ua.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 Nl),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"),Wk)}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 Tv extends Qi{constructor(){super([ua],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=cs(t.gltfId,e);return ua.getOrCreate(i)}}}new Tv;class pa{static cache=new Map;static getOrCreate(e){let t=pa.cache.get(e);return t||(t=new pa(e),pa.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 Ev extends Qi{constructor(){super([pa],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=cs(t.gltfId,e);return pa.getOrCreate(i)}}}new Ev;class Vk{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 gs{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=ba.parseTrackName(l.name);let h=ba.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 Wi("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 dS(".scale",r,a);return new Wi("scale",r[r.length-1],[l])}}function*Bg(o,e=null){const t=e?e.time:z.Current.time,i=t.time;for(;t.time-i<o;)yield}function*$k(o){for(let e=0;e<o;e++)yield}function*Av(o){let e=!0;for(o.then(()=>e=!1),o.catch(()=>e=!1);e;)yield}const Iv="NEEDLE_lightmaps",yc=w("debuglightmapsextension")||w("debuglightmaps");var Nn=(o=>(o[o.Lightmap=0]="Lightmap",o[o.Skybox=1]="Skybox",o[o.Reflection=2]="Reflection",o))(Nn||{});class Hk{get name(){return Iv}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[Iv];if(i){const n=i.textures;return n?.length?(yc&&console.log(i),new Promise(async(s,r)=>{const a=[];for(const c of n)if(c.pointer){yc&&console.log(c);let h=null;if(c.pointer.startsWith("/textures/")||c.pointer.startsWith("textures/"))yc&&console.log("Load texture from gltf",c.pointer),h=Og(this.parser,c.pointer).then(d=>this.resolveTexture(c,d));else if(typeof c.pointer=="string"){yc&&console.log("Load texture from path",c.pointer);const d=cs(this.source,c.pointer);let p;d.endsWith(".exr")?p=new gm(this.parser.options.manager):d.endsWith(".hdr")?p=new Y0(this.parser.options.manager):p=new Nl(this.parser.options.manager),h=p.loadAsync(d,void 0).then(g=>this.resolveTexture(c,g))}else c.pointer;h&&a.push(h)}const l=await Om(a);l?.anyFailed&&E()&&console.error("Failed to load lightmap extension",l),s()})):null}}return null}resolveTexture(e,t){const i=t;yc&&console.log("Lightmap loaded:",i),i?.isTexture&&(this.registry?(i.colorSpace=go,this.registry.registerTexture(this.source,e.type,i,e.index)):console.log(Nn[e.type],e.pointer,i))}}const za=!!w("debuglightmaps");class Gk{_context;_lightmaps=new Map;clear(){this._lightmaps.clear()}constructor(e){this._context=e}registerTexture(e,t,i,n){za&&console.log("Registering ",Nn[t]+' "'+e+'"',i),this._lightmaps.has(e)||this._lightmaps.set(e,new Map);const s=this._lightmaps.get(e),r=s?.get(t)??[];r.length<n&&(r.length=n+1),F_(i,!1),r[n]=i,s?.set(t,r)}tryGetLightmap(e,t=0){return this.tryGet(e,Nn.Lightmap,t)}tryGetSkybox(e){return za&&console.log("[Get Skybox]",e,this._lightmaps),this.tryGet(e,Nn.Skybox,0)}tryGetReflection(e){return za&&console.log("[Get Reflection]",e,this._lightmaps),this.tryGet(e,Nn.Reflection,0)}tryGet(e,t,i){if(!e)return za&&console.warn("Missing source id"),null;const n=this._lightmaps.get(e);if(!n)return za&&console.warn(`[Lighting] No ${Nn[t]} texture entry for`,e),null;const s=n.get(t);return s===void 0?(za&&console.warn(`[Lighting] No ${Nn[t]} texture for`,e,"index",i),null):!s?.length||s.length<=i?null:s[i]}}Wt.lights_fragment_maps=Wt.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
191
+ vec2 lUv = vLightMapUv.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
192
+ vec4 lightMapTexel = texture2D( lightMap, lUv);
193
+ // 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.
194
+ lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
195
+ lightMapTexel.a = 1.;
196
+ lightMapTexel = conv_sRGBToLinear(lightMapTexel);
197
+ `),Wt.lightmap_pars_fragment=`
198
+ #ifdef USE_LIGHTMAP
199
+ uniform sampler2D lightMap;
200
+ uniform float lightMapIntensity;
201
+ uniform vec4 lightmapScaleOffset;
202
+
203
+ // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
204
+ vec4 conv_sRGBToLinear( in vec4 value ) {
205
+ 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 );
206
+ }
207
+ #endif
208
+ `,Wt.lights_fragment_begin=Wt.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
209
+ #if defined(USE_LIGHTMAP)
210
+ irradiance += 0.;
211
+ #else
212
+ irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
213
+ #endif`),uS.lightmap.lightmapScaleOffset={value:new pe(1,1,0,0)};const Fg=w("debugprogressive"),iu=new bi,nu=new ad;class qk{static GLTF_PROGRESSIVE_LODSMANAGER_TYPE=or;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(),or.removePlugin(this),or.addPlugin(this),or.debugDrawLine=F.DrawLine,this._lodsManager=or.get(e,{engine:"needle-engine"}),this.applySettings(),this._lodsManager.enable()}disable(){this._lodsManager?.disable(),or.removePlugin(this)}onAfterUpdatedLOD(e,t,i,n,s){Fg&&this.onRenderDebug(i,n,s)}onRenderDebug(e,t,i){if(!t.geometry||!Ve.hasLODLevelAvailable(t.geometry)&&!Ve.hasLODLevelAvailable(t.material))return;const n=or.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(Fg&&t.geometry.boundingSphere){const a=t.geometry.boundingSphere;nu.copy(a),nu.applyMatrix4(t.matrixWorld);const l=nu.center,c=nu.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=Ve.getMeshLODExtension(t.geometry)?.lods;s=p?Math.min(p?.length-1,s):0;let g="";if(p&&n.lastScreenCoverage>0)for(let y=0;y<p.length;y++){const _=p[y].density,v=y==p.length-1;g+=_.toFixed(0)+">"+(_/n.lastScreenCoverage).toFixed(0)+(v?"":",")}const f=p?p[s]?.density:-1;let m="LOD "+i.mesh_lod+`
214
+ TEX `+i.texture_lod;if(Fg=="density"&&(m+=`
215
+ `+d+` tris
216
+ `+(f/n.lastScreenCoverage).toFixed(0)+` dens
217
+ `+(n.lastScreenCoverage*100).toFixed(1)+`% cov
218
+ `+(n.lastCentrality*100).toFixed(1)+`% centr
219
+ `+(iu.min.x.toFixed(2)+"-"+iu.max.x.toFixed(2)+"x"+iu.min.y.toFixed(2)+"-"+iu.max.y.toFixed(2))+" scr"),n.lastScreenCoverage>.1){const y=e,_=y.worldForward,v=y.worldPosition,P=$(_).multiplyScalar(c*.7).add(l),T=P.distanceTo(v),O=h[Math.min(h.length-1,Math.max(0,s))]+"88",A=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,m,T*.012*A*I,void 0,16777215,O)}}}}}const Xk=w("debugplayerview");var fs=(o=>(o.Browser="browser",o.Headset="headset",o.Handheld="handheld",o))(fs||{});class Lv{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 jv{context;playerViews=new Map;constructor(e){this.context=e}setPlayerView(e,t,i){let n=this.playerViews.get(e);n||(n=new Lv(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&&(Xk&&console.log("REMOVE",e),i.removed=!0,this.playerViews.delete(e))}}new om;const bc=new Uint8Array(4);bc[0]=255,bc[1]=255,bc[2]=255,bc[3]=255;const Qk=new sm(bc,1,1,ld);function Ug(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 sm(n,e,e);return l.needsUpdate=!0,l}function Yk(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 ne;for(let d=0;d<n;d++){const p=Math.floor(d/n*a),g=j.clamp(p+1,0,a-1),f=r[p],m=r[g],y=d/n*a%1;c.lerpColors(f,m,y);const _=Math.floor(c.r*255),v=Math.floor(c.g*255),P=Math.floor(c.b*255);for(let T=0;T<i;T++){const O=(d*i+T)*4;l[O+0]=_,l[O+1]=v,l[O+2]=P,l[O+3]=255}}const h=new sm(l,i,n);return h.needsUpdate=!0,h}function ou(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 pe(n,s,r,a);e.push(l)}return e}const zg=[],Dv=[];function Zk(o,e){if(zg.length===0)for(let t=0;t<27;t++)zg.push(0);e||(e=zg);for(let t=0;t<27;t++)Dv[t]=e[t];e=Dv,o.unity_SHAr={value:new pe(e[9],e[3],e[6],e[0])},o.unity_SHBr={value:new pe(e[12],e[15],e[18],e[21])},o.unity_SHAg={value:new pe(e[10],e[4],e[7],e[1])},o.unity_SHBg={value:new pe(e[13],e[16],e[19],e[22])},o.unity_SHAb={value:new pe(e[11],e[5],e[8],e[2])},o.unity_SHBb={value:new pe(e[14],e[17],e[20],e[23])},o.unity_SHC={value:new pe(e[24],e[25],e[26],1)}}class Kk{vertexShader;fragmentShader;technique;constructor(e,t,i){this.vertexShader=e,this.fragmentShader=t,this.technique=i}}async function Jk(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 Bv(s),!r.code&&r.uri&&await Bv(r),!s.code||!r.code)return null;const a=o.techniques[e];return new Kk(s.code,r.code,a)}}return console.error("Shader technique not found",e),null}async function Bv(o){const e=o.uri;if(e)if(e.endsWith(".glsl")){const t=await new om().loadAsync(e);o.code=t.toString()}else o.code=eM(o.uri)}function eM(o){return decodeURIComponent(Array.prototype.map.call(atob(o),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const vn=w("debugenvlight");var Na=(o=>(o[o.Skybox=0]="Skybox",o[o.Trilight=1]="Trilight",o[o.Flat=3]="Flat",o[o.Custom=4]="Custom",o))(Na||{}),su=(o=>(o[o.Skybox=0]="Skybox",o[o.Custom=1]="Custom",o))(su||{});class Fv{context;constructor(e){this.context=e,this.context.pre_update_callbacks.push(this.preUpdate.bind(this))}_currentLightSettingsId;_sceneLightSettings;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 pe;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 te&&(e=e.url);const t=this._sceneLightSettings?.get(e);return t?(vn&&console.log("Enable scene light settings",e,t),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,t.enabled=!0,!0):(vn&&console.warn("No light settings found for",e),!1)}disable(e){if(e instanceof te&&(e=e.url),e==null)return!1;const t=this._sceneLightSettings?.get(e);return t?(vn&&console.log("Disable scene light settings",e,t),t.enabled=!1,!0):!1}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}vn&&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}vn&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){vn&&console.log("Register reflection",e,t);const i=new Uv(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(vn&&console.log("Enable reflection",e,t?Na[t.ambientMode]:"Unknown ambient mode",t),t?.ambientMode){case 0:case 4:const i=this.internalGetReflection(e);if(i&&i.Source){vn&&console.log("Setting environment reflection",i);const n=this.context.scene,s=i.Source;s.mapping=fo,n.environment=s;return}else vn&&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=Yk(i[0],i[1],i[2],64,64);n.colorSpace=yo,n.mapping=fo,this.context.scene.environment=n}else console.error("Missing ambient trilight",t.sourceId);return;case 3:if(t.ambientLight){const i=Ug(t.ambientLight,64);i.colorSpace=yo,i.mapping=fo,this.context.scene.environment=i}else console.error("Missing ambientlight",t.sourceId);return;default:return}}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){vn&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}vn&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}_lighting={}}class Uv{get Source(){return this._source}_source;constructor(e,t,i=1){this._source=t,t.mapping=fo}}const zv=w("timescale");let Ng=1;typeof zv=="number"&&(Ng=zv);class Nv{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 pS;_smoothedFps=0;_smoothedDeltaTime=0;_fpsSamples=[];_fpsSampleIndex=0;constructor(){typeof Ng=="number"&&(this.timeScale=Ng)}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 Wv=!1;function Vv(o){Wv||(Wv=!0,tM(),iM())}Vv();function tM(){const o=`
220
+ float startCompression = 0.8;
221
+ float desaturation = 0.5;
222
+ // Patched tonemapping function
223
+ vec3 NeutralToneMapping( vec3 color ) {
224
+ color *= toneMappingExposure;
225
+
226
+ float d = 1. - startCompression;
227
+ // float peak = dot(color, vec3(0.299, 0.587, 0.114));
228
+ float peak = max(color.r, max(color.g, color.b));
229
+ if (peak < startCompression) return color;
230
+ float newPeak = 1. - d * d / (peak + d - startCompression);
231
+ float invPeak = 1. / peak;
232
+
233
+ float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
234
+
235
+ color *= newPeak * invPeak;
236
+ float g = 1. - 3. / (desaturation * extraBrightness + 3.);
237
+ return mix(color, vec3(1, 1, 1), g);
238
+ }
239
+ `,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
240
+ }`,i=Wt.tonemapping_pars_fragment.indexOf(e),n=Wt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Wt.tonemapping_pars_fragment.substring(i,n+t.length);Wt.tonemapping_pars_fragment=Wt.tonemapping_pars_fragment.replace(s,o)}else E()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function iM(){const o=`
241
+ // 0: Default, 1: Golden, 2: Punchy
242
+ #define AGX_LOOK 0
243
+
244
+ vec3 userSlope = vec3(1.0);
245
+ vec3 userOffset = vec3(0.0);
246
+ vec3 userPower = vec3(1.0);
247
+ float userSaturation = 1.0;
248
+
249
+ // Mean error^2: 3.6705141e-06
250
+ vec3 _agxDefaultContrastApprox(vec3 x) {
251
+ vec3 x2 = x * x;
252
+ vec3 x4 = x2 * x2;
253
+
254
+ return + 15.5 * x4 * x2
255
+ - 40.14 * x4 * x
256
+ + 31.96 * x4
257
+ - 6.868 * x2 * x
258
+ + 0.4298 * x2
259
+ + 0.1191 * x
260
+ - 0.00232;
261
+ }
262
+
263
+ vec3 _agx(vec3 val) {
264
+ const mat3 agx_mat = mat3(
265
+ 0.842479062253094, 0.0423282422610123, 0.0423756549057051,
266
+ 0.0784335999999992, 0.878468636469772, 0.0784336,
267
+ 0.0792237451477643, 0.0791661274605434, 0.879142973793104);
268
+
269
+ const float min_ev = -12.47393;
270
+ const float max_ev = 4.026069;
271
+
272
+ // val = pow(val, vec3(2.2));
273
+
274
+ // Input transform (inset)
275
+ val = agx_mat * val;
276
+
277
+ // Log2 space encoding
278
+ val = clamp(log2(val), min_ev, max_ev);
279
+ val = (val - min_ev) / (max_ev - min_ev);
280
+
281
+ // Apply sigmoid function approximation
282
+ val = _agxDefaultContrastApprox(val);
283
+
284
+ return val;
285
+ }
286
+
287
+ vec3 _agxEotf(vec3 val) {
288
+ const mat3 agx_mat_inv = mat3(
289
+ 1.19687900512017, -0.0528968517574562, -0.0529716355144438,
290
+ -0.0980208811401368, 1.15190312990417, -0.0980434501171241,
291
+ -0.0990297440797205, -0.0989611768448433, 1.15107367264116);
292
+
293
+ // Inverse input transform (outset)
294
+ val = agx_mat_inv * val;
295
+
296
+ // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
297
+ // NOTE: We're linearizing the output here. Comment/adjust when
298
+ // *not* using a sRGB render target
299
+ val = pow(val, vec3(2.2));
300
+
301
+ return val;
302
+ }
303
+
304
+ vec3 _agxLook(vec3 val) {
305
+ const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
306
+ float luma = dot(val, lw);
307
+
308
+ // Default
309
+ vec3 offset = vec3(0.0);
310
+ vec3 slope = vec3(1.0);
311
+ vec3 power = vec3(1.0);
312
+ float sat = 1.0;
313
+
314
+ #if AGX_LOOK == 1
315
+ // Golden
316
+ slope = vec3(1.0, 0.9, 0.5);
317
+ power = vec3(0.8);
318
+ sat = 0.8;
319
+ #elif AGX_LOOK == 2
320
+ // Punchy
321
+ slope = vec3(1.0);
322
+ power = vec3(1.35, 1.35, 1.35);
323
+ sat = 1.4;
324
+ #endif
325
+
326
+ // Needle
327
+ slope = vec3(1.05);
328
+ power = vec3(1.10, 1.10, 1.10);
329
+ sat = 1.15;
330
+
331
+ // User
332
+ // slope = userSlope;
333
+ // offset = userOffset;
334
+ // power = userPower;
335
+ // sat = userSaturation;
336
+
337
+ // ASC CDL
338
+ val = pow(val * slope + offset, power);
339
+ return luma + sat * (val - luma);
340
+ }
341
+
342
+
343
+ vec3 AgXToneMapping( vec3 color ) {
344
+ // apply AGX
345
+ color *= toneMappingExposure;
346
+ color = max(color, vec3(0.001)); // Prevent NaN
347
+ color = _agx(color);
348
+ color = _agxLook(color); // Optional
349
+ color = _agxEotf(color);
350
+ return color;
351
+ `,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",i=Wt.tonemapping_pars_fragment.indexOf(e),n=Wt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=Wt.tonemapping_pars_fragment.substring(i,n+t.length);Wt.tonemapping_pars_fragment=Wt.tonemapping_pars_fragment.replace(s,o)}else E()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function $v(o){if(typeof o=="string")switch(o=o.toLowerCase(),o){case"none":return dd;case"neutral":return _a;case"aces":return hd;case"agx":return cd;case"khronos_neutral":return _a;default:console.warn("[PostProcessing] Unknown tone mapping mode",o);return}}function Ct(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 Hv(o){return o.classList?.contains("material-symbols-outlined")||!1}const ru=new Map;async function Wg(o){const e="Material Symbols Outlined";if(document.fonts.check(`1em '${e}'`)||(console.log("Font not loaded yet"),await document.fonts.ready),ru.has(o))return ru.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 Re;return r.name=o+" icon",r.image=new Image,r.image.src=s,r.needsUpdate=!0,ru.set(o,r),r}return ru.set(o,null),null}class In{static _instance;static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new In),this._instance}static create(){return new In}_fullscreenButton;get fullscreenButton(){return this._fullscreenButton}createFullscreenButton(e){if(this._fullscreenButton)return this._fullscreenButton;if(!document.fullscreenEnabled)return E()&&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=Ct("fullscreen"),n=Ct("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=Ct("volume_off"),n=Ct("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(Ct("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=`
352
+ position: fixed;
353
+ display: inline-block;
354
+ padding: 0.5rem;
355
+ background-color: white;
356
+ border-radius: 0.4rem;
357
+ cursor: pointer;
358
+ z-index: 1000;
359
+ box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
360
+ `;const n=document.createElement("div");n.classList.add("qr-code-container"),i.appendChild(n),t.addEventListener("click",()=>{if(i.parentNode)return r();E()&&window.location.href.includes("://localhost")&&ge("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 xb({text:e.qrButtonUrl,width:200,height:200});n.innerHTML="",n.appendChild(l)}return t.addEventListener("pointerenter",()=>{a()},{once:!0}),t}hideElementDuringXRSession(e){Rd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),Qm(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}}function au(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 Gv(){au("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap")}const Vg="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block",lu="needle-logo-element";class qv extends HTMLElement{static get elementName(){return lu}static create(){return document.createElement(lu)}constructor(){super(),this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
361
+ :host {
362
+ position: relative;
363
+ min-width: fit-content;
364
+ /* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
365
+ display: flex;
366
+ }
367
+
368
+ .wrapper {
369
+ position: relative;
370
+ display: grid;
371
+ grid-template-columns: auto auto;
372
+ padding: .1rem;
373
+ }
374
+ .wrapper:hover {
375
+ cursor: pointer;
376
+ }
377
+ img {
378
+ width: 95px;
379
+ height: 100%;
380
+ align-self: end;
381
+ margin-left: 0.6rem;
382
+ }
383
+ span {
384
+ font-size: 1rem;
385
+ white-space: nowrap;
386
+ }
387
+ </style>
388
+ <div class="wrapper">
389
+ <img class="logo" src=${rP} />
390
+ </div>
391
+ `,this._root.appendChild(e.content.cloneNode(!0)),this.wrapper=this._root.querySelector(".wrapper"),this._root.appendChild(this.wrapper),this.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")}),this.wrapper.setAttribute("title","Made with Needle Engine")}_root;wrapper;logoElement=document.createElement("img");textElement=document.createElement("span");setLogoVisible(e){this.logoElement.style.display=e?"block":"none"}}customElements.get(lu)||customElements.define(lu,qv);const $g=w("debugspatialmenu");class nM{_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&&!$g))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($g&&G.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 Em(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||G.isDesktop()&&$g,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),ql(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 pe(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=C.get("ObjectRaycaster");return e&&_r(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 Xv(this._context,()=>globalThis.open("https://needle.tools","_self"));_r(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 pe(0,0,0,.02)});this._poweredByNeedleElement.add(t),this._poweredByNeedleElement.add(i),this.menu?.add(this._poweredByNeedleElement),this.markDirty(),new Nl().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&&Vn())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 Xv(this._context,()=>t.click());return _r(i,s),new oM(this,e,t,i,n)}}class oM{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&&Hv(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 Wg(e);if(i&&!this.spatialIcon){const n=new Ce.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:i,backgroundOpacity:1,margin:new pe(0,.005,0,0)});this.spatialIcon=n,this.spatialContainer.add(n),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const i=await Wg(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 Xv{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 Pr="needle-menu",_c=w("debugmenu"),Qv=w("debugnoncommercial");let sM=class{_context;_menu;_spatialMenu;constructor(o){this._menu=Zp.getOrCreate(o.domElement,o),this._context=o,this._spatialMenu=new nM(o,this._menu),window.addEventListener("message",this.onPostMessage),Rd(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=Ct(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 _c&&console.error("NeedleMenu: unknown postMessage event",e)}else _c&&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=!G.isMobileDevice()),o){const e=In.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=In.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(o){if(!o){this._muteButton?.remove();return}this._muteButton=In.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=In.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 Zp extends HTMLElement{static create(){return document.createElement(Pr,{is:Pr})}static getOrCreate(e,t){let i=e.querySelector(Pr);return!i&&e.shadowRoot&&(i=e.shadowRoot.querySelector(Pr)),i||(i=window.document.body.querySelector(Pr)),i||(i=Zp.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>
392
+
393
+ /** Styling attributes that ensure the nested menu z-index does not cause it to overlay elements outside of <needle-engine> */
394
+ :host {
395
+ position: absolute;
396
+ width: 100%;
397
+ height: 100%;
398
+ z-index: 0;
399
+ top: 0;
400
+ pointer-events: none;
401
+ }
402
+
403
+ #root {
404
+ position: absolute;
405
+ width: auto;
406
+ max-width: 95%;
407
+ left: 50%;
408
+ transform: translateX(-50%);
409
+ top: min(20px, 10vh);
410
+ padding: 0.3rem;
411
+ display: flex;
412
+ visibility: visible;
413
+ flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
414
+ pointer-events: all;
415
+ z-index: 1000;
416
+ }
417
+
418
+ /** hide the menu if it's empty **/
419
+ #root.has-no-options.logo-hidden {
420
+ display: none;
421
+ }
422
+
423
+ /** using a div here because then we can change the class for placement **/
424
+ #root.bottom {
425
+ top: auto;
426
+ bottom: min(30px, 10vh);
427
+ }
428
+ #root.top {
429
+ top: calc(.7rem + env(safe-area-inset-top));
430
+ }
431
+
432
+ .wrapper {
433
+ position: relative;
434
+ display: flex;
435
+ flex-direction: row;
436
+ justify-content: center;
437
+ align-items: stretch;
438
+ gap: 0px;
439
+ padding: 0 0rem;
440
+ }
441
+
442
+ .wrapper > *, .options > button, .options > select, ::slotted(*) {
443
+ position: relative;
444
+ border: none;
445
+ border-radius: 0;
446
+ outline: 1px solid rgba(0,0,0,0);
447
+ display: flex;
448
+ justify-content: center;
449
+ align-items: center;
450
+ max-height: 2.3rem;
451
+ max-width: 100%;
452
+
453
+ /** basic font settings for all entries **/
454
+ font-size: 1rem;
455
+ font-family: 'Roboto Flex', sans-serif;
456
+ font-optical-sizing: auto;
457
+ font-weight: 500;
458
+ font-weight: 200;
459
+ font-variation-settings: "wdth" 100;
460
+ color: rgb(20,20,20);
461
+ }
462
+
463
+ .options > select[multiple]:hover {
464
+ max-height: 300px;
465
+ }
466
+
467
+ .floating-panel-style {
468
+ background: rgba(255, 255, 255, .4);
469
+ outline: rgb(0 0 0 / 5%) 1px solid;
470
+ border: 1px solid rgba(255, 255, 255, .1);
471
+ box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
472
+ border-radius: 1.5rem;
473
+ /**
474
+ * to make nested background filter work
475
+ * https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
476
+ **/
477
+ &::before {
478
+ content: '';
479
+ position: absolute;
480
+ width: 100%;
481
+ height: 100%;
482
+ top: 0;
483
+ left: 0;
484
+ z-index: -1;
485
+ border-radius: 1.5rem;
486
+ -webkit-backdrop-filter: blur(8px);
487
+ backdrop-filter: blur(8px);
488
+ }
489
+ }
490
+
491
+ a {
492
+ color: inherit;
493
+ text-decoration: none;
494
+ }
495
+
496
+ .options {
497
+ display: flex;
498
+ flex-direction: row;
499
+ align-items: center;
500
+ }
501
+
502
+ .options > *, ::slotted(*) {
503
+ max-height: 2.25rem;
504
+ padding: .4rem .5rem;
505
+ }
506
+
507
+ :host .options > *, ::slotted(*) {
508
+ background: transparent;
509
+ border: none;
510
+ white-space: nowrap;
511
+ transition: all 0.1s linear .02s;
512
+ border-radius: 1.5rem;
513
+ user-select: none;
514
+ }
515
+ :host .options > *:hover, ::slotted(*:hover) {
516
+ cursor: pointer;
517
+ color: black;
518
+ background: rgba(245, 245, 245, .8);
519
+ box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
520
+ outline: rgba(0,0,0,.1) 1px solid;
521
+ }
522
+ :host .options > *:active, ::slotted(*:active) {
523
+ background: rgba(255, 255, 255, .8);
524
+ 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);
525
+ transition: all 0.05s linear;
526
+ }
527
+ :host .options > *:focus, ::slotted(*:focus) {
528
+ outline: rgba(255,255,255,.5) 1px solid;
529
+ }
530
+ :host .options > *:focus-visible, ::slotted(*:focus-visible) {
531
+ outline: rgba(0,0,0,.5) 1px solid;
532
+ }
533
+
534
+ :host .options > *:disabled, ::slotted(*:disabled) {
535
+ background: rgba(0,0,0,.05);
536
+ color: rgba(60,60,60,.7);
537
+ pointer-events: none;
538
+ }
539
+
540
+ button, ::slotted(button) {
541
+ gap: 0.3rem;
542
+ }
543
+
544
+ /** XR button animation **/
545
+ :host button.this-mode-is-requested {
546
+ background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
547
+ background-size: 200% auto;
548
+ background-position: 0 100%;
549
+ animation: AnimationName .7s ease infinite forwards;
550
+ }
551
+ :host button.other-mode-is-requested {
552
+ opacity: .5;
553
+ }
554
+
555
+ @keyframes AnimationName {
556
+ 0% { background-position: 0% 0 }
557
+ 100% { background-position: -200% 0 }
558
+ }
559
+
560
+
561
+
562
+
563
+ .logo {
564
+ cursor: pointer;
565
+ padding-left: 0.6rem;
566
+ padding-bottom: .02rem;
567
+ margin-right: 0.5rem;
568
+ }
569
+ .logo-hidden {
570
+ .logo {
571
+ display: none;
572
+ }
573
+ }
574
+ :host .has-options .logo {
575
+ border-left: 1px solid rgba(40,40,40,.4);
576
+ margin-left: 0.3rem;
577
+ margin-right: 0.5rem;
578
+ }
579
+
580
+ .logo > span {
581
+ white-space: nowrap;
582
+ }
583
+
584
+
585
+
586
+ /** COMPACT */
587
+
588
+ /** Hide the menu button normally **/
589
+ .compact-menu-button { display: none; }
590
+ /** And show it when we're in compact mode **/
591
+ .compact .compact-menu-button {
592
+ position: relative;
593
+ display: block;
594
+ background: none;
595
+ border: none;
596
+ border-radius: 2rem;
597
+
598
+ margin: 0;
599
+ padding: 0 .3rem;
600
+ padding-top: .2rem;
601
+
602
+ z-index: 100;
603
+
604
+ color: #000;
605
+
606
+ &:hover {
607
+ background: rgba(255,255,255,.2);
608
+ cursor: pointer;
609
+ }
610
+ &:focus {
611
+ outline: 1px solid rgba(255,255,255,.5);
612
+ }
613
+ &:focus-visible {
614
+ outline: 1px solid rgba(0,0,0,.5);
615
+ }
616
+ & .expanded-click-area {
617
+ position: absolute;
618
+ left: 0;
619
+ right: 0;
620
+ top: 10%;
621
+ bottom: 10%;
622
+ transform: scale(1.8);
623
+ }
624
+ }
625
+ .has-no-options .compact-menu-button {
626
+ display: none;
627
+ }
628
+ .open .compact-menu-button {
629
+ background: rgba(255,255,255,.2);
630
+ }
631
+ .logo-visible .compact-menu-button {
632
+ margin-left: .2rem;
633
+ }
634
+
635
+ /** Open and hide menu **/
636
+ .compact .foldout {
637
+ display: none;
638
+ }
639
+ .open .options, .open .foldout {
640
+ display: flex;
641
+ justify-content: center;
642
+ }
643
+ .compact .wrapper {
644
+ padding: 0;
645
+ }
646
+ .compact .wrapper, .compact .options {
647
+ height: auto;
648
+ max-height: initial;
649
+ flex-direction: row;
650
+ gap: .12rem;
651
+ }
652
+ .compact .options {
653
+ flex-wrap: wrap;
654
+ gap: .3rem;
655
+ }
656
+ .compact .top .options {
657
+ height: auto;
658
+ flex-direction: row;
659
+ }
660
+ .compact .bottom .wrapper {
661
+ height: auto;
662
+ flex-direction: column;
663
+ }
664
+
665
+ .compact .foldout {
666
+ max-height: min(100ch, calc(100vh - 100px));
667
+ overflow: auto;
668
+ overflow-x: hidden;
669
+ align-items: center;
670
+
671
+ position: fixed;
672
+ bottom: calc(100% + 5px);
673
+ z-index: 100;
674
+ width: auto;
675
+ left: .2rem;
676
+ right: .2rem;
677
+ padding: .2rem;
678
+
679
+ }
680
+ .compact.logo-hidden .foldout {
681
+ /** for when there's no logo we want to center the foldout **/
682
+ min-width: 24ch;
683
+ margin-left: 50%;
684
+ transform: translateX(calc(-50% - .2rem));
685
+ }
686
+
687
+ .compact.top .foldout {
688
+ top: calc(100% + 5px);
689
+ bottom: auto;
690
+ }
691
+
692
+ ::-webkit-scrollbar {
693
+ max-width: 7px;
694
+ background: rgba(100,100,100,.2);
695
+ border-radius: .2rem;
696
+ }
697
+ ::-webkit-scrollbar-thumb {
698
+ background: rgba(255, 255, 255, .3);
699
+ border-radius: .2rem;
700
+ }
701
+ ::-webkit-scrollbar-thumb:hover {
702
+ background: rgb(150,150,150);
703
+ }
704
+
705
+ .compact .options > *, .compact .options > ::slotted(*) {
706
+ font-size: 1.2rem;
707
+ padding: .6rem .5rem;
708
+ width: 100%;
709
+ }
710
+ .compact.has-options .logo {
711
+ border: none;
712
+ padding-left: 0;
713
+ margin-left: 1rem;
714
+ margin-bottom: .02rem;
715
+ }
716
+ .compact .options {
717
+ /** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
718
+ max-width: 100%;
719
+
720
+ & > button, & > select {
721
+ display: flex;
722
+ flex-basis: 100%;
723
+ min-height: 3rem;
724
+ }
725
+ & > button.row2 {
726
+ //border: 1px solid red !important;
727
+ display: flex;
728
+ flex: 1;
729
+ flex-basis: 30%;
730
+ }
731
+ }
732
+
733
+ /** If there's really not enough space then just hide all options **/
734
+ @media (max-width: 100px) or (max-height: 100px){
735
+ .foldout {
736
+ display: none !important;
737
+ }
738
+ .compact-menu-button {
739
+ display: none !important;
740
+ }
741
+ }
742
+
743
+ /* dark mode */
744
+ /*
745
+ @media (prefers-color-scheme: dark) {
746
+ :host {
747
+ background: rgba(0,0,0, .6);
748
+ }
749
+ :host button {
750
+ color: rgba(200,200,200);
751
+ }
752
+ :host button:hover {
753
+ background: rgba(100,100,100, .8);
754
+ }
755
+ }
756
+ */
757
+
758
+ </style>
759
+
760
+ <div id="root" class="logo-hidden floating-panel-style bottom">
761
+ <div class="wrapper">
762
+ <div class="foldout">
763
+ <div class="options" part="options">
764
+ <slot></slot>
765
+ </div>
766
+ <div class="options" part="options">
767
+ <slot name="end"></slot>
768
+ </div>
769
+ </div>
770
+ <div style="user-select:none" class="logo">
771
+ <span class="madewith notranslate">powered by</span>
772
+ </div>
773
+ </div>
774
+ <button class="compact-menu-button">
775
+ <div class="expanded-click-area"></div>
776
+ </button>
777
+ </div>
778
+ `;const t=this.attachShadow({mode:"open"});Gv(),au(Vg,{loadedCallback:()=>{this.handleSizeChange()}}),au(Vg,{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(Ct("more_vert")),this.foldout=this.root?.querySelector(".foldout"),this.root?.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const n=qv.create();n.style.minHeight="1rem",this.logoContainer.append(n),this.logoContainer.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")});try{window.requestAnimationFrame(()=>uM(c=>{if(c==!0&&$n()&&!Qv){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)=>{_c&&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)&&!$n()){const d=r++;Vi()&&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}),_c&&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&&(!$n()||Qv)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!Vi()))&&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=Ct(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(){_c&&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(Pr)||customElements.define(Pr,Zp);const Xe=w("debugcontext"),rM=w("stats"),aM=w("debugactive"),lM=w("debugframerate"),cM=w("debugcoroutine"),hM={};class dM{name;alias;hash;runInBackground;domElement;renderer;camera;scene}var we=(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))(we||{});function cu(o,e){if(!o)return;if(!o.isComponent){(E()||Xe)&&console.error(`Registered script is not a Needle Engine component.
779
+ The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
780
+ `,o);return}e||(e=z.Current,Xe&&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:G.isiOS()||G.isMacOS()?"default":"high-performance",stencil:!0};static get DefaultWebGLRendererParameters(){return z._defaultWebglRendererParameters}get version(){return gn}static get Current(){return ue.Current}static set Current(e){ue.Current=e}static get All(){return ue.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 ce(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}_needsUpdateSize=!1;_isCreated=!1;_isCreating=!1;_isVisible=!1;_stats=rM?new SC: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 yi,e?.camera&&(this._mainCamera=e.camera),this.application=new En(this),this.time=new Nv,this.input=new r_(this),this.physics=new Ll(this),this.connection=new w_(this),this.assets=new L_,this.sceneLighting=new Fv(this),this.addressables=new Rv(this),this.lightmaps=new Gk(this),this.players=new jv(this),this.menu=new sM(this),this.lodsManager=new qk(this),this.animations=new Vk(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()),ue.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,Xe&&console.log("Using canvas from shadow root",t))}return Xe&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new ir(e),this.renderer.debug.checkShaderErrors=E()||w("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=dd,this.renderer.setClearColor(new ne("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=mS,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=yo,this.renderer.nodes={library:new gS,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),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=$l(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(){ue.dispatchCallback(de.ContextClearing,this),Un(this,de.ContextClearing),Ci(this.scene,!0,!0),this.scene=new yi,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()),ue.dispatchCallback(de.ContextCleared,this)}dispose(){this.internalOnDestroy()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){z.Current=this,ue.dispatchCallback(de.ContextDestroying,this),Un(this,de.ContextDestroying),this.clear(),this.renderer?.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(Xe&&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,ue.dispatchCallback(de.ContextDestroyed,this),Un(this,de.ContextDestroyed),ue.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+`
781
+ Coroutine functions must be generators: "*myCoroutine() {...}"
782
+ 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;Xe&&console.log("Creating context",this.name,e);const i=globalThis["needle:dependencies:ready"];i instanceof Promise&&(Xe&&console.log("Waiting for dependencies to be ready"),await i.catch(c=>{if(Xe||E()){if(Zl("Needle Engine dependencies failed to load. Please check the console for more details"),c instanceof ReferenceError){let h="YourComponentName";const d=c.message.indexOf("'");if(d>0){const p=c.message.indexOf("'",d+1);if(p>0){const g=c.message.substring(d+1,p);g.length>3&&(h=g)}}console.error(`Needle Engine dependencies failed to load:
783
+
784
+ # Make sure you don't have circular imports in your scripts!
785
+
786
+ Possible solutions:
787
+ \u2192 Replace @serializable(${h}) in your script with @serializable(Behaviour)
788
+ \u2192 If you only need type information try importing the type only, e.g: import { type ${h} }
789
+
790
+ ---`,c);return}console.error("Needle Engine dependencies failed to load",c)}}).then(()=>{Xe&&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 ue.dispatchCallback(de.ContextCreationStart,this);let r=!0,a;try{z.Current=this,e?a=await this.internalLoadInitialContent(t,e):a=[]}catch(c){console.error(c),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 Xe&&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 c=0;c<this.new_scripts.length;c++){const h=this.new_scripts[c];if(h.gameObject!==void 0&&h.gameObject!==null){h.gameObject.userData===void 0&&(h.gameObject.userData={}),h.gameObject.userData.components===void 0&&(h.gameObject.userData.components=[]);const d=h.gameObject.userData.components;d.includes(h)||d.push(h)}}if(this.post_setup_callbacks)for(let c=0;c<this.post_setup_callbacks.length;c++)z.Current=this,await this.post_setup_callbacks[c](this);if(!this._mainCamera){z.Current=this;let c=null;Sr(this.scene,h=>{const d=h;if(d?.isCamera){if(cc(d.gameObject),!d.activeAndEnabled)return;if(d.tag==="MainCamera")return c=d,!0;c=d}}),c?this.setCurrentCamera(c):!ue.dispatchCallback(de.MissingCamera,this,{files:a})&&!this.mainCamera&&!this.isManagedExternally&&console.warn("Missing camera in main scene",this)}this.input.bindEvents(),z.Current=this,Wd(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)),Xe&&Cd(this.scene,!0),this.targetFrameRate===void 0?(Xe&&console.warn("No target framerate set, using default",z.DefaultTargetFrameRate),this.targetFrameRate=z._defaultTargetFramerate):Xe&&console.log("Target framerate set to",this.targetFrameRate),this._dispatchReadyAfterFrame=!0;const l=ue.dispatchCallback(de.ContextCreated,this,{files:a});if(l){const c=this.domElement;"internalSetLoadingMessage"in c&&typeof c.internalSetLoadingMessage=="function"&&c?.internalSetLoadingMessage("finish loading"),await l}return e?.abortSignal?.aborted?!1:(Un(this,de.ContextCreated),Xe&&console.log("Context Created...",this.renderer,this.renderer.domElement),this._isCreating=!1,!this.isManagedExternally&&!e?.abortSignal?.aborted&&this.restartRenderLoop(),!0)}async internalLoadInitialContent(e,t){const i=new Array;if(t.files.length===0)return i;const n=[...t.files],s={name:"",progress:null,index:0,count:n.length},r=fn(),a=0;for(let l=0;l<n.length;l++){if(t.abortSignal?.aborted){Xe&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){Xe&&console.log("Aborting loading because create id changed",e,this._createId);break}const c=n[l];t?.onLoadingStart?.call(this,l,c),Xe&&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){Xe&&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)Ci(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),g=new k;g.position.x=d*1.1,g.position.y=h,this.scene.add(g),gr.createPrimitive("ShaderBall",{parent:g,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),E()||Xe||rk())try{this.internalStep(e,t),this._renderlooperrors=0}catch(i){this._renderlooperrors+=1,(E()||Xe)&&(i instanceof Error||i instanceof TypeError)&&Te("Caught unhandled exception during render-loop - see console for details.",xi.Error),console.error("Frame #"+this.time.frame+`
791
+ `,i),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null)),this.domElement.dispatchEvent(new CustomEvent("error",{detail:i}))}else this.internalStep(e,t)}updatePhysics(e){this.internalUpdatePhysics(e)}setCameraFocusRect(e,t){this._focusRect=e,t&&Object.assign(this.focusRectSettings,t)}get focusRect(){return this._focusRect}focusRectSettings={damping:.05};_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(),lM&&console.log("FPS",this.time.smoothedFps.toFixed(0)),Wd(this),Vd(this.scene),V_(this),Un(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),Un(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),Un(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),Un(this,2),this.physicsSteps===void 0&&(this.physicsSteps=1),this.physics.engine&&this.physicsSteps>0&&this.internalUpdatePhysics(this.physicsSteps),this.isVisibleToUser||this.runInBackground){if(this._focusRect&&this.mainCamera instanceof ce){const n=this.focusRectSettings,s=n.damping>0?this.time.deltaTime/n.damping:1;WP(this._focusRect,s,this.mainCamera,this.renderer)}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),Un(this,3),this._needsUpdateSize&&this.updateSize(),this.pre_render_callbacks)for(const n in this.pre_render_callbacks)this.pre_render_callbacks[n](t)}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||(hk(this),this._currentFrameEvent=-1,CC.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),Un(this,4),this.post_render_callbacks)for(const e in this.post_render_callbacks)this.post_render_callbacks[e]()}this._currentFrameEvent=-1,this.connection.sendBufferedMessagesNow(),this._stats&&(this._stats.end(),this.time.frameCount%150===0&&console.log(this.renderer.info.render.calls+" DrawCalls",`
792
+ Render:`,{...this.renderer.info.render},`
793
+ Memory:`,{...this.renderer.info.memory},`
794
+ Target Framerate: `+this.targetFrameRate)),this._dispatchReadyAfterFrame&&(this._dispatchReadyAfterFrame=!1,this.domElement.dispatchEvent(new CustomEvent("ready")),ue.dispatchCallback(de.ContextFirstFrameRendered,this))}_tempClearColor=new ne;_tempClearColor2=new ne;renderNow(e){if(!e&&(e=this.mainCamera,!e))return!1;if(this.handleRendererContextLost(),this._isRendering=!0,this.renderRequiredTextures(),this.renderer.toneMapping!==dd&&Vv(),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&&G.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){aM&&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 Dn(this.domWidth,this.domHeight),this._requireDepthTexture){const i=new U0(this.domWidth,this.domHeight);this._renderTarget.depthTexture=i}this._requireColorTexture&&(this._renderTarget.texture=new Re,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=ud,this._renderTarget.texture.magFilter=ud,this._renderTarget.texture.format=ld)}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){cM&&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=Av(c);s.chained?.push(h);continue}}catch(s){console.error(s)}}function t(i){return!!(i&&i.next&&i.return)}}}const Pi=w("debuglicense"),Yv=[];let Wn="basic";Pi&&console.log("License Type: "+Wn);function Vn(){switch(Wn){case"pro":case"enterprise":return!0}return!1}function vc(){switch(Wn){case"indie":return!0}return!1}function Hg(){switch(Wn){case"edu":return!0}return!1}function $n(){return Vn()||vc()||Hg()}function uM(o){if(Vn()||vc()||Hg())return o(!0);Yv.push(o)}function hu(o){for(const e of Yv)try{e(o)}catch{}}ue.registerCallback(de.ContextRegistered,o=>{gM(o.context),mM(o.context),setTimeout(()=>yM(o.context),2e3)});let Wa,Gg=!1,qg="";async function pM(){if(Wa)return Wa;if(Wn==="basic")try{const o="https://engine.needle.tools/licensing/check?location="+encodeURIComponent(window.location.href)+"&version="+gn+"&generator="+encodeURIComponent(Od),e=await fetch(o,{method:"GET"}).catch(t=>{Pi&&console.error("License check failed",t)});e?.status===200?(Gg=!1,Pi&&console.log("License check succeeded"),Wn="pro",hu(!0)):e?.status===403?(hu(!1),Gg=!0,qg=await e.text()):(hu(!1),Pi&&console.log("License check failed with status "+e?.status))}catch(o){hu(!1),Pi&&console.error("License check failed",o)}else Pi&&console.log('Runtime license check is skipped because license is already applied as "'+Wn+'"')}Wa=pM();async function mM(o){function e(){const n=document.createElement("div");n.className="needle-forbidden",n.style.cssText=`
795
+ position: fixed;
796
+ top: 0;
797
+ left: 0;
798
+ width: 100%;
799
+ height: 100%;
800
+ pointer-events: all;
801
+ zIndex: 2147483647;
802
+ line-height: 1.5;
803
+ backdrop-filter: blur(15px);
804
+ -webkit-backdrop-filter: blur(15px);
805
+ `;const s=n.style.cssText,r=document.createElement("div");n.appendChild(r),r.style.cssText=`
806
+ position: absolute;
807
+ left: 0;
808
+ right: 0;
809
+ top:0;
810
+ bottom: 0;
811
+ padding: 10%;
812
+ color: white;
813
+ font-size: 20px;
814
+ font-family: sans-serif;
815
+ text-align: center;
816
+ pointer-events: all;
817
+ display: flex;
818
+ justify-content: center;
819
+ align-items: center;
820
+ background-color: rgba(0,0,0,.3);
821
+ text-shadow: 0 0 2px black;
822
+ `;const a=r.style.cssText,l=qg?.length>1?qg:"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(()=>{Gg===!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 gM(o){try{if(!Vn()&&!vc())return Xg(o)}catch(e){return Pi&&console.log("License check failed",e),Xg(o)}Pi&&Xg(o)}async function Xg(o){let e=!1;o.domElement.addEventListener("ready",()=>e=!0),await Wa?.catch(()=>{}),!(Vn()||vc())&&($n()===!1&&fM(),e?Qg(o):o.domElement.addEventListener("ready",()=>{Qg(o)}))}function Qg(o){const e=`
823
+ position: relative;
824
+ display: block;
825
+ background-size: 20px;
826
+ background-position: 10px 5px;
827
+ background-repeat:no-repeat;
828
+ background-image:url('${Zv}');
829
+ background-max-size: 40px;
830
+ padding: 10px;
831
+ padding-left: 30px;
832
+ `;if(Wn==="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=`
833
+ position: absolute;
834
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
835
+ font-size: 12px;
836
+ color: rgb(100, 100, 100);
837
+ /*mix-blend-mode: difference;*/
838
+ background-color: transparent;
839
+ z-index: 10000;
840
+
841
+ cursor: pointer;
842
+ user-select: none;
843
+ opacity: 0;
844
+
845
+ bottom: 6px;
846
+ right: 12px;
847
+ transform: translateY(0px);
848
+ transition: all .5s ease-in-out 1s;
849
+ `;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);Hg()&&setTimeout(()=>{clearInterval(s),t?.remove(),setTimeout(()=>{o.domElement.parentNode&&Qg(o)},1e3*60*5)},2e4)}const Zv="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let Kv=0;async function fM(o){const e=Date.now();if(e-Kv<2e3)return;Kv=e;const t=`
850
+ position: relative;
851
+ display: block;
852
+ font-size: 18px;
853
+ background-size: 20px;
854
+ background-position: 10px 5px;
855
+ background-repeat:no-repeat;
856
+ background-image:url('${Zv}');
857
+ background-max-size: 40px;
858
+ margin-bottom: 5px;
859
+ margin-top: .3em;
860
+ margin-bottom: .5em;
861
+ padding: .2em;
862
+ padding-left: 25px;
863
+ border-radius: .5em;
864
+ border: 2px solid rgba(160,160,160,.3);
865
+ `,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${gn}`;z.Current?.xr?console.log(i):console.log("%c "+i,t)}async function yM(o){if(!window.crossOriginIsolated){if(Wn==="pro"){const e=o?.domElement?.getAttribute("no-telemetry");if(e===""||e==="true"||e==="1"){Pi&&console.debug("Telemetry is disabled");return}Pi&&console.debug("Telemetry attribute: "+e)}try{const e="https://needle-engine-analytics-v2-r26roub2hq-lz.a.run.app";if(e){const t=window.location.href.split("?")[0];let i="api/v2/new/request";e.endsWith("/")||(i="/"+i);const n=Wn,s=`${e}${i}`;Pi&&console.debug("Sending beacon");const r={license:n,url:t,hostname:window.location.hostname,pathname:window.location.pathname,version:gn,generator:Od,build_time:Hm,public_key:Ca},a=navigator.sendBeacon?.(s,JSON.stringify(r));Pi&&console.debug("Sent beacon: "+a)}}catch(e){Pi&&console.log("Failed to send non-commercial usage message to analytics backend",e)}}}function Jv(o,e){return Co(o,de.ContextCreated,e),()=>us(o,de.ContextCreated)}function bM(o,e){return Co(o,de.ContextClearing,e),()=>us(o,de.ContextClearing)}function _M(o,e){return Co(o,de.ContextDestroying,e),()=>us(o,de.ContextDestroying)}function du(o,e){return Co(o,we.Start,e),()=>us(o,we.Start)}function ew(o,e){return Co(o,we.Update,e),()=>us(o,we.Update)}function vM(o,e){return Co(o,we.OnBeforeRender,e),()=>us(o,we.OnBeforeRender)}function wM(o,e){return Co(o,we.OnAfterRender,e),()=>us(o,we.OnAfterRender)}const xM=w("debugdecoders");let Yg=null;function tw(){if(!Yg){const o=mm(null);Yg={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return Yg}function iw(o){o!==void 0&&typeof o=="string"&&_C(o)}function nw(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=tw();xM&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function ow(o){o!==void 0&&typeof o=="string"&&bC(o)}function Zg(o,e){const t=tw();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),fC(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),yC(o,{progressive:!0}),o}const Qe=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=sw(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=sw(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 sw(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const ys=w("debughotreload");let wc=!1;const xc=new Map;function SM(){return wc}function Kg(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function rw(o){if(wc){ys&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}ys&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;xc.has(e)?xc.get(e)?.push(o):xc.set(e,[o])}function aw(o){if(wc){ys&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}ys&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=xc.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let lw=!1;function CM(){if(ys||lw)return;lw=!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 PM(o){ys&&console.log("[HMR] Apply changes",o,Object.keys(o)),CM();for(const e of Object.keys(o))try{wc=!0;const t=C.get(e);if(!t){ys&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=xc.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,g=p.isComponent===!0,f=g?p.activeAndEnabled:!0,m=g?p.context:void 0;try{if(g&&m&&Po(p,m),g&&f&&(p.enabled=!1),d.onBeforeHotReloadFields&&d.onBeforeHotReloadFields()===!1)continue;for(const y in h)if(h[y].writable){if(d[y]===void 0)d[y]=c[y];else if(typeof d[y]=="function"&&!d[y].prototype){const _=d[y],v=_.name,P="bound ";if(v===P)continue;const T=_.name.substring(P.length),O=i.prototype[T];O&&(d[y]=O.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{g&&m&&fg(p,m),g&&f&&(p.enabled=!0)}}}}catch(t){if(ys)console.error(t);else return!1}finally{wc=!1,rr(xi.Log,"Script changes applied (HMR)")}return!0}class x extends k{guid;static isDestroyed(e){return xr(e)}static setActive(e,t,i=!0){e&&(fc(e,t),Vd(e),t&&i&&V_(z.Current,e))}static isActiveSelf(e){return Ba(e)}static isActiveInHierarchy(e){return xv(e)}static markAsInstancedRendered(e,t){Sv(e,t)}static isUsingInstancing(e){return Kd(e)}static foreachComponent(e,t,i=!0){return Sr(e,t,i)}static instantiateSynced(e,t){return e?Sg(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Ua(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??z.Current,hc(n,t.connection,i)}static destroy(e,t=!0){return Ci(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),fc(e,!0),Vd(e),i?x.foreachComponent(e,n=>{fg(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),fc(e,!1),Vd(e),x.foreachComponent(e,t=>{ak(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 _n(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return _n(e,t,i,n)}static moveComponent(e,t){return _n(e,t)}static removeComponent(e){return Ag(e.gameObject,e),e}static getOrAddComponent(e,t){return uc(e,t)}static getComponent(e,t){return e===null?null:vr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:pc(e,t,i)}static findByGuid(e,t){return Ig(e,t)}static findObjectOfType(e,t,i=!0){return Da(e,t??z.Current,i)}static findObjectsOfType(e,t){const i=[];return wv(e,i,t),i}static getComponentInChildren(e,t){return mc(e,t)}static getComponentsInChildren(e,t,i=null){return ja(e,t,i??void 0)}static getComponentInParent(e,t){return gc(e,t)}static getComponentsInParent(e,t,i=null){return Qd(e,t,i)}static getAllComponents(e){const t=e.userData?.components;return t?[...t]:[]}static*iterateComponents(e){const t=e?.userData?.components;if(t&&Array.isArray(t))for(let i=0;i<t.length;i++)yield t[i]}}class M{get isComponent(){return!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[wo];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[wo]=e)}gameObject;guid="invalid";sourceId;awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=we.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=we.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),Kg()&&rw(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?(E()&&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}))),bv(this),Kg()&&aw(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){E()&&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 Z(this.gameObject)}set worldPosition(e){mt(this.gameObject,e)}setWorldPosition(e,t,i){ar(this.gameObject,e,t,i)}get worldQuaternion(){return be(this.gameObject)}set worldQuaternion(e){mn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){Bm(this.gameObject,e,t,i,n)}get worldEuler(){return Fm(this.gameObject)}set worldEuler(e){Um(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){Xl(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return M._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return M._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return M._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 OM=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:M,Component:M,GameObject:x},Symbol.toStringTag,{value:"Module"}));var kM=Object.defineProperty,cw=(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&&kM(e,t,n),n};class Sc extends M{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=Z(this.from).clone(),t=Z(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),mt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(Z(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}cw([u(x)],Sc.prototype,"from"),cw([u(x)],Sc.prototype,"to");var MM=Object.defineProperty,RM=Object.getOwnPropertyDescriptor,Or=(o,e,t,i)=>{for(var n=i>1?void 0:i?RM(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&&MM(e,t,n),n};const bs=w("debuganimation");let hw=class{x;y};class Lt extends M{get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.includes(e)||this.animations.push(e)}playAutomatically=!0;randomStartTime=!0;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){bs&&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,bs&&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){bs&&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){bs&&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(bs&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){bs&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){bs&&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=j.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*s.duration}else e.time>=e.getClip().duration&&(e.time=0);t?.minMaxSpeed?e.timeScale=j.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?fS:rm:e.loop=rm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),bs&&console.log("PLAY",e.getClip().name,e);const n=new TM(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 am(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Or([u()],Lt.prototype,"playAutomatically",2),Or([u()],Lt.prototype,"randomStartTime",2),Or([u(hw)],Lt.prototype,"minMaxSpeed",2),Or([u(hw)],Lt.prototype,"minMaxOffsetNormalized",2),Or([u()],Lt.prototype,"loop",2),Or([u()],Lt.prototype,"clampWhenFinished",2),Or([u(Wi)],Lt.prototype,"clips",1);class TM{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 uu=Symbol("objectIsAnimatedData");function dw(o,e,t){if(!o)return;if(o[uu]===void 0){if(!t)return;o[uu]=new Set}const i=o[uu];t?i.add(e):i.has(e)&&i.delete(e)}function EM(o){if(!o)return!1;const e=o[uu];return e!==void 0&&e.size>0}class AM{_context;get context(){return this._context??z.Current}get isStateMachineBehaviour(){return!0}}class Cc{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()??mo.generateUUID(),index:-1,clip:new Wi(o,0,[])}}var _s=(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))(_s||{}),Jg=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(Jg||{});const st=w("debuganimatorcontroller"),pu=w("debugrootmotion");class cn{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 At(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new cn(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){st&&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){st&&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 Cc(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 am(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;st&&console.warn("AnimatorController clone()",this.model);const e=$l(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||Nb(n)||n.tracks!==void 0||n instanceof cn));return console.assert(e!==this.model),new cn(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,st&&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()&&(st&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(st||E())&&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&&(st&&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(g=>g.name===d.parameter);p?.type===Jg.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,st){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
866
+ Timescale: `+i.timeScale,`
867
+ Normalized time: `+l.toFixed(3),`
868
+ 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 Cc(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&&(st&&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 Wi))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 Cc(this._activeState,d,h,this._speed);for(const g of this._activeState.behaviours)g.instance?.onStateExit?.call(g.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):st&&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(rm,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 Cc(e,i,h,this._speed);for(const p of this._activeState.behaviours)p.instance?.onStateEnter?.call(p.instance,this.animator,d,n)}}else st&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));st&&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 IM(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 _s.If:return t.value===!0;case _s.IfNot:return t.value===!1;case _s.Greater:return t.value>e.threshold;case _s.Less:return t.value<e.threshold;case _s.Equals:return t.value===e.threshold;case _s.NotEqual:return t.value!==e.threshold}return!1}createActions(e){st&&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||(st&&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:(st||E())&&console.warn('Could not find clip for animator "'+this.animator?.gameObject?.name+'"',s.motion.clips.map(a=>a.node.name))}if(!s.motion.clip){st&&console.warn("No clip assigned to state",s);const r=new Wi(void 0,void 0,[]);s.motion.clip=r}if(s.motion?.clip){const r=s.motion.clip;if(r instanceof Wi){const a=this.createAction(r);s.motion.action=a}else(st||E())&&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,La(l,r.properties),r.instance=l),st&&console.log("Created animator controller behaviour",s.name,r.typeName,r.properties,l)}else(st||E())&&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 pw{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 dt{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 U;constructor(e,t,i,n,s){if(this.context=e,this.root=t,this.clip=i,dt.firstKeyframeRotation[this.cacheId]||(dt.firstKeyframeRotation[this.cacheId]=new U),s){const r=s.values;dt.firstKeyframeRotation[this.cacheId].set(r[0],r[1],r[2],r[3])}dt.spaceRotation[this.cacheId]||(dt.spaceRotation[this.cacheId]=new U),dt.effectiveSpaceRotation[this.cacheId]||(dt.effectiveSpaceRotation[this.cacheId]=new U),dt.clipOffsetRotation[this.cacheId]=new U,s&&dt.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;dt.lastObjRotation[this.cacheId]||(dt.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=dt.lastObjRotation[this.cacheId];if(dt.spaceRotation[this.cacheId].copy(t),pu){const i=new nt().setFromQuaternion(t);console.log("START",this.clip.name,j.toDegrees(i.y),this.root.position.z)}}getClipRotationOffset(){return dt.clipOffsetRotation[this.cacheId]}_prevTime=0;handlePosition(e,t){if(t){const i=this.root;pu&&i.add(new _i),dt.lastObjPosition[this.cacheId]||(dt.lastObjPosition[this.cacheId]=this.root.position.clone());const n=new b,s=new b;this.positionWrapper=new pw(t,(r,a)=>{const l=this.action.getEffectiveWeight();return pu&&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 U;handleRotation(e,t){if(t){if(pu){const r=t.values,a=new nt().setFromQuaternion(new U(r[0],r[1],r[2],r[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",j.toDegrees(a.y));const l=t.values.length-4,c=new U().set(r[l],r[l+1],r[l+2],r[l+3]),h=new nt().setFromQuaternion(c);console.log(e.name,t.name,"LAST ROTATION IN TRACK",j.toDegrees(h.y))}let i=0;const n=new U,s=new U;this.rotationWrapper=new pw(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(dt.identityQuaternion,1-e),!0)}}class IM{controller;handler=[];root;basePosition=new b;baseQuaternion=new U;baseRotation=new nt;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 dt(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 U;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 LM extends Qi{onSerialize(e,t){}onDeserialize(e,t){if(t.type===cn&&e?.__type==="AnimatorController")return new cn(e)}}new LM(cn);var jM=Object.defineProperty,DM=Object.getOwnPropertyDescriptor,mu=(o,e,t,i)=>{for(var n=i>1?void 0:i?DM(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&&jM(e,t,n),n};const Yi=w("debuganimator");class ft extends M{get isAnimationComponent(){return!0}applyRootMotion=!1;hasRootMotion=!1;keepAnimatorControllerStateOnDisable=!1;set runtimeAnimatorController(e){this._animatorController&&this._animatorController.model===e||(e?e instanceof cn?(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 cn(e.model)),this._animatorController=e,this._animatorController.bind(this)):(Yi&&console.log("Assign animator controller",e,this),this._animatorController=new cn(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){Yi&&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 Yi&&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),Yi&&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 Yi&&console.log("getFloat",e,t),t}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){this.runtimeAnimatorController?.getInteger(e)!==t&&(this._parametersAreDirty=!0),Yi&&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 Yi&&console.log("getInteger",e,t),t}SetTrigger(e){this.setTrigger(e)}setTrigger(e){this._parametersAreDirty=!0,Yi&&console.log("setTrigger",e),this.runtimeAnimatorController?.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){this._parametersAreDirty=!0,Yi&&console.log("resetTrigger",e),this.runtimeAnimatorController?.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){const t=this.runtimeAnimatorController?.getTrigger(e);return Yi&&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&&(Yi&&console.log("setSpeed",e),this._speed=e,this._animatorController?.animator==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){this._speed=j.lerp(e.x,e.y,Math.random()),this._animatorController?.animator==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){this._normalizedStartOffset=j.lerp(e.x,e.y,Math.random()),this.runtimeAnimatorController?.animator==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}_speed=1;_normalizedStartOffset=0;_animatorController=null;awake(){Yi&&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,!EM(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}mu([u()],ft.prototype,"applyRootMotion",2),mu([u()],ft.prototype,"hasRootMotion",2),mu([u()],ft.prototype,"keepAnimatorControllerStateOnDisable",2),mu([u()],ft.prototype,"runtimeAnimatorController",1);const mw=Symbol("previous-visibility");class po extends Dn{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 ir){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(){po._userSet.clear();const e=pg(this.texture,!0,null,po._userSet);for(const t of e)t instanceof H&&(t[mw]=t.visible,t.visible=!1)}onAfterRender(){for(const e of po._userSet)e instanceof H&&(e.visible=e[mw]);po._userSet.clear()}}var BM=Object.defineProperty,FM=Object.getOwnPropertyDescriptor,Pc=(o,e,t,i)=>{for(var n=i>1?void 0:i?FM(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&&BM(e,t,n),n};const gu=w("debuggroundprojection");class Hn extends M{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 Jo(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{gu&&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 Hl(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 Re&&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 Re)){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){gu&&console.log("Create/Update Ground Projection",e.name),this._projection?.removeFromParent();try{this._projection=new va(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",zm(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=Vt(this.context.scene.children,[this._projection]),r=s.min.y;if(r<1/0){const a=$();a.x=s.min.x+(s.max.x-s.min.x)*.5;const l=$e(this.gameObject).x;a.y=r+this._height*l-i,a.z=s.min.z+(s.max.z-s.min.z)*.5,mt(this._projection,a)}gu&&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,gu&&console.log("Update Blurriness",t),this._blurrynessShader??=new jn({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:UM,fragmentShader:zM}),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=Ks.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}Pc([u()],Hn.prototype,"applyOnAwake",2),Pc([u()],Hn.prototype,"autoFit",2),Pc([u()],Hn.prototype,"radius",1),Pc([u()],Hn.prototype,"height",1),Pc([u()],Hn.prototype,"arBlending",1);const UM=`
869
+ varying vec2 vUv;
870
+
871
+ void main() {
872
+ vUv = uv;
873
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
874
+ }
875
+ `,zM=`
876
+ uniform sampler2D map;
877
+ uniform float blurriness;
878
+ uniform float alphaFactor;
879
+ uniform float blending;
880
+ varying vec2 vUv;
881
+
882
+ const float PI = 3.14159265359;
883
+
884
+ // Gaussian function
885
+ float gaussian(float x, float sigma) {
886
+ return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
887
+ }
888
+
889
+ // Custom smoothstep function for desired falloff
890
+ float customSmoothstep(float edge0, float edge1, float x) {
891
+ float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
892
+ return t * t * (3.0 - 2.0 * t);
893
+ }
894
+
895
+ void main() {
896
+ vec2 center = vec2(0.0, 0.0);
897
+ vec2 pos = vUv;
898
+ pos.x = 0.0; // Only consider vertical distance
899
+ float distance = length(pos - center);
900
+
901
+ // Calculate blur amount based on custom falloff
902
+ float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
903
+ blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
904
+
905
+ // Gaussian blur
906
+ vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
907
+ vec4 color = vec4(0.0);
908
+ float totalWeight = 0.0;
909
+ int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
910
+ float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
911
+
912
+ for (int x = -blurSize; x <= blurSize; x++) {
913
+ for (int y = -blurSize; y <= blurSize; y++) {
914
+ vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
915
+ float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
916
+ color += textureLod(map, vUv + offset, lodLevel) * weight;
917
+ totalWeight += weight;
918
+ }
919
+ }
920
+
921
+ color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
922
+
923
+ gl_FragColor = color;
924
+
925
+ float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
926
+ float stepFactor = blending - brightness * .1;
927
+ gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
928
+ gl_FragColor.a *= alphaFactor;
929
+ // gl_FragColor.rgb = vec3(1.0);
930
+
931
+ // #include <tonemapping_fragment>
932
+ // #include <colorspace_fragment>
933
+
934
+ // Uncomment to visualize blur amount
935
+ // gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
936
+ }
937
+ `;function gw(o,e){if(Y.active)return console.warn("[OrbitControls] Can not fit camera while XR session is active"),null;const t=z.Current;if(!t)return console.warn("[OrbitControls] No context found"),null;const i=e?.camera||t.mainCamera;let n;if(Array.isArray(o)||o&&"type"in o?n=o:o&&typeof o=="object"&&!(o instanceof k)&&!Array.isArray(o)&&(e=o,n=e.objects),n&&!Array.isArray(n)&&(n=[n]),(!Array.isArray(n)||n&&n.length<=0)&&(n=t.scene.children),!Array.isArray(n)||n.length<=0)return console.warn("No objects to fit camera to..."),null;if(!i)return console.warn("No camera or controls found to fit camera to objects..."),null;e||(e={}),e.autoApply=e.autoApply!==!1,e.minZoom||=0,e.maxZoom||=1/0;const{centerCamera:s,cameraNearFar:r="auto",fitOffset:a=1.1,fov:l=i instanceof ce?i?.fov:-1}=e,c=new b,h=new b,d=i instanceof ce?i.aspect:1,p=Vt(n,void 0,i?.layers),g=p.clone();p.getCenter(h);const f=new b;if(p.getSize(f),i instanceof ce&&i.updateProjectionMatrix(),i.updateMatrixWorld(),p.applyMatrix4(i.matrixWorldInverse),p.getSize(c),p.setFromCenterAndSize(h,c),Number.isNaN(c.x)||Number.isNaN(c.y)||Number.isNaN(c.z))return console.warn("Camera fit size resultet in NaN",i,p),null;if(c.length()<=1e-10)return console.warn("Camera fit size is zero",p),null;const m=l,y=2*Math.atan(Math.tan(m*Math.PI/360/2)*d)/Math.PI*360,_=c.y/(2*Math.atan(Math.PI*m/360)),v=c.x/(2*Math.atan(Math.PI*y/360)),P=a*Math.max(_,v)+c.z/2;e.maxZoom=P*10,e.minZoom=P*.01,e.debug===!0&&console.log("Fit camera to objects",{fitHeightDistance:_,fitWidthDistance:v,distance:P,verticalFov:m,horizontalFov:y});const T=.05,O=h.clone();if(O.y-=c.y*T,e.targetOffset&&(e.targetOffset.x!==void 0&&(O.x+=e.targetOffset.x),e.targetOffset.y!==void 0&&(O.y+=e.targetOffset.y),e.targetOffset.z!==void 0&&(O.z+=e.targetOffset.z)),e.relativeTargetOffset&&(e.relativeTargetOffset.x!==void 0&&(O.x+=e.relativeTargetOffset.x*c.x),e.relativeTargetOffset.y!==void 0&&(O.y+=e.relativeTargetOffset.y*c.y),e.relativeTargetOffset.z!==void 0&&(O.z+=e.relativeTargetOffset.z*c.z)),r==null||r=="auto"){const W=Da(Hn),D=W?W.radius:0,q=Math.max(f.x,f.y,f.z,D);i instanceof ce&&(i.near=P/100,i.far=q+P*10,i.updateProjectionMatrix()),W&&(e.maxZoom=Math.max(Math.min(e.maxZoom,D*.5),P))}e.currentZoom!==void 0&&(e.currentZoom<e.minZoom&&(e.minZoom=e.currentZoom*.9),e.currentZoom>e.maxZoom&&(e.maxZoom=e.currentZoom*1.1));const A=h.clone();e.fitDirection?A.sub(new b().copy(e.fitDirection).multiplyScalar(1e6)):A.sub(i.worldPosition),s==="y"&&(A.y=0),A.normalize(),A.multiplyScalar(P),s==="y"&&(A.y+=-T*4*P);let I=h.clone().sub(A);return e.cameraOffset&&(e.cameraOffset.x!==void 0&&(I.x+=e.cameraOffset.x),e.cameraOffset.y!==void 0&&(I.y+=e.cameraOffset.y),e.cameraOffset.z!==void 0&&(I.z+=e.cameraOffset.z)),e.relativeCameraOffset&&(e.relativeCameraOffset.x!==void 0&&(I.x+=e.relativeCameraOffset.x*c.x),e.relativeCameraOffset.y!==void 0&&(I.y+=e.relativeCameraOffset.y*c.y),e.relativeCameraOffset.z!==void 0&&(I.z+=e.relativeCameraOffset.z*c.z)),i.parent&&(I=i.parent.worldToLocal(I)),e.debug&&(F.DrawWireBox3(p,16777011,10),F.DrawWireBox3(g,65280,10)),e.autoApply&&(i.position.copy(I),i.lookAt(O),l>0&&i instanceof ce&&(i.fov=l,i.updateProjectionMatrix())),{camera:i,position:I,lookAt:O,fov:e.fov}}var NM=Object.defineProperty,ef=(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&&NM(e,t,n),n};class kr extends M{constraintActive=!0;locked=!1;sources=[];setConstraintPosition(e){const t=this.sources[0];t&&(t.worldPosition=e)}}ef([u()],kr.prototype,"constraintActive"),ef([u()],kr.prototype,"locked"),ef([u(k)],kr.prototype,"sources");let Mr=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 fw{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new Mr).__init(this.bb_pos,this.bb)}rotation(e){return(e||new Mr).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new Mr).__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 es{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new es).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+ob),(t||new es).__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 fw).__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 R;(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-CnHGx3sO.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-BHMVuZQ1.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-BHMVuZQ1.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={}))})(R||(R={}));var yt=(o=>(o[o.Average=0]="Average",o[o.Multiply=1]="Multiply",o[o.Minimum=2]="Minimum",o[o.Maximum=3]="Maximum",o))(yt||{}),fu=(o=>(o[o.Discrete=0]="Discrete",o[o.Continuous=1]="Continuous",o))(fu||{}),Ge=(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))(Ge||{}),Va=(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))(Va||{});const Pt=function(o,e){return function(t,i,n){WM(t,i,n,o,e)}};function WM(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),Te("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,xi.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){E()&&console.warn('Usage of @validate decorate detected but there is no onValidate method in your class: "'+o.constructor?.name+'"');return}if(this[r]===void 0){this[r]=this[s];const l=this[s];if(l instanceof K||l instanceof b||l instanceof pe||l instanceof U){const c=this[s];yd(c,()=>{this.onValidate(s)})}Object.defineProperty(this,s,{set:function(c){if(this[Eg]===!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 VM=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 $M=Object.defineProperty,HM=Object.getOwnPropertyDescriptor,Oi=(o,e,t,i)=>{for(var n=i>1?void 0:i?HM(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&&$M(e,t,n),n};class GM{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 Jo(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 Jo(this.obj.quaternion,["_x","_y","_z","_w"])),this._rotationWatch.apply(),this.quaternion={},this._rotationWatch.subscribeWrite((s,r)=>{if(this.context.physics.engine?.isUpdating||this.mute)return;const a=this.quaternion[r];Math.abs(a-s)<1e-5||(this.quaternion[r]=s,this.rotationChanged=!0)}));const i=this.obj.matrixWorld.multiplyMatrices.bind(this.obj.matrixWorld),n=new J;this.obj.matrixWorld.multiplyMatrices=(s,r)=>(this.context.physics.engine?.isUpdating||this.mute||n.equals(s)||(this.positionChanged=!0,this.rotationChanged=!0,n.copy(s)),i(s,r))}stop(){this._positionWatch?.revoke(),this._rotationWatch?.revoke()}}const oi=class Gp extends M{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=Ge.None;isKinematic=!1;drag=0;angularDrag=1;detectCollisions=!0;sleepThreshold=.01;collisionDetectionMode=fu.Discrete;get lockPositionX(){return(this.constraints&Ge.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Ge.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Ge.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Ge.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Ge.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Ge.FreezeRotationZ)!==0}set lockPositionX(e){e?this.constraints|=Ge.FreezePositionX:this.constraints&=~Ge.FreezePositionX}set lockPositionY(e){e?this.constraints|=Ge.FreezePositionY:this.constraints&=~Ge.FreezePositionY}set lockPositionZ(e){e?this.constraints|=Ge.FreezePositionZ:this.constraints&=~Ge.FreezePositionZ}set lockRotationX(e){e?this.constraints|=Ge.FreezeRotationX:this.constraints&=~Ge.FreezeRotationX}set lockRotationY(e){e?this.constraints|=Ge.FreezeRotationY:this.constraints&=~Ge.FreezeRotationY}set lockRotationZ(e){e?this.constraints|=Ge.FreezeRotationZ:this.constraints&=~Ge.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 GM(this.gameObject,this.context)),this._watch.start(!0,!0),this.startCoroutine(this.beforePhysics(),we.LateUpdate),E()&&(globalThis.NEEDLE_USE_RAPIER?R.RAPIER_PHYSICS.ready().then(async()=>{await Hl(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;Gp.tempPosition.setFromMatrixPosition(e);const t=Gp.tempPosition.sub(this._lastPosition);this._lastPosition.copy(Gp.tempPosition),this._smoothedVelocity.lerp(t,this.context.time.deltaTime/.1)}};Oi([Pt()],oi.prototype,"autoMass",2),Oi([u()],oi.prototype,"mass",1),Oi([Pt(),u()],oi.prototype,"useGravity",2),Oi([u(b)],oi.prototype,"centerOfMass",2),Oi([Pt(),u()],oi.prototype,"constraints",2),Oi([Pt(),u()],oi.prototype,"isKinematic",2),Oi([Pt(),u()],oi.prototype,"drag",2),Oi([Pt(),u()],oi.prototype,"angularDrag",2),Oi([Pt(),u()],oi.prototype,"detectCollisions",2),Oi([Pt(),u()],oi.prototype,"sleepThreshold",2),Oi([Pt(),u()],oi.prototype,"collisionDetectionMode",2),Oi([Pt()],oi.prototype,"_gravityScale",2),Oi([Pt()],oi.prototype,"dominanceGroup",2);let Ye=oi;new b,new b;const vs=w("debugsync"),Oc="STRS";eg(Oc,es.getRootAsSyncedTransformModel);const Gn=new ym;function yw(o,e,t=!0){Gn.clear();const i=Gn.createString(o);es.startSyncedTransformModel(Gn),es.addGuid(Gn,i),es.addFast(Gn,t);const n=e.worldPosition,s=e.worldEuler,r=e.gameObject.scale;es.addTransform(Gn,fw.createTransform(Gn,n.x,n.y,n.z,s.x,s.y,s.z,r.x,r.y,r.z));const a=es.endSyncedTransformModel(Gn);return Gn.finish(a,Oc),Gn.asUint8Array()}let tf=0,kc=0;ew(o=>{const e=o.connection.currentServerUrl?.includes("glitch")?10:40;kc=Math.floor(tf/e),tf=0,vs&&kc>0&&console.log("Sync Transform Fast Interval",kc)});class wn extends M{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(){vs&&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(){vs&&console.log("new instance",this.guid,this),this._receivedDataBefore=!1,this._targetPosition=new b,this._targetRotation=new U,this.lastPosition=new b,this.lastRotation=new U,this.lastScale=new b,this.rb=x.getComponentInChildren(this.gameObject,Ye),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new ig(this.context.connection,this.guid),this.context.connection.isConnected&&this.tryGetLastState(),this.joinedRoomCallback=this.tryGetLastState.bind(this),this.context.connection.beginListen(ee.JoinedRoom,this.joinedRoomCallback),this.receivedDataCallback=this.onReceivedData.bind(this),this.context.connection.beginListenBinary(Oc,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&xg(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(ee.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(Oc,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}tempEuler=new nt;onReceivedData(e){if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){vs&&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){ln.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)&&Um(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){vs&&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:(vs&&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),ln.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&&ln.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&&(vs&&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(tf++,s&&kc>0&&this.context.time.frameCount%kc!==0)return;vs&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const r=yw(this.guid,this,!!s);this.context.connection.sendBinary(r)}}}class ed{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 ed(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function yu(o,e){return x.foreachComponent(o,t=>{if(!t.enabled)return;const i=t;if(e)switch(e){case"pointerdown":if(i.onPointerDown)return!0;break;case"pointerup":if(i.onPointerUp||i.onPointerClick)return!0;break;case"pointermove":if(i.onPointerEnter||i.onPointerExit||i.onPointerMove)return!0;break}else if(i.onPointerDown||i.onPointerUp||i.onPointerEnter||i.onPointerExit||i.onPointerClick)return!0},!1)===!0}const ko=new Array;class Mo{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?(ko.length=0,e!==void 0&&e.length>0&&ko.push(...e),ko.push(...this.arguments),this.target(...this.arguments),ko.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?(ko.length=0,e!==void 0&&e.length>0&&ko.push(...e),ko.push(...this.arguments),t.call(this.target,...ko),ko.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 qM=o=>/^[A-Z]*$/.test(o);class bu extends Event{args}class he{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 Mo(a.clone,n.methodName,l,n.enabled))}else E()&&console.warn("Could not find target for event listener")}}}return new he(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&&qM(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 he(e)}constructor(e){if(this.methods=[],Array.isArray(e))for(const t of e)t instanceof Mo?this.methods.push(t):typeof t=="function"&&this.methods.push(new Mo(t));else typeof e=="function"&&this.methods.push(new Mo(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 bu(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 Mo(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 XM extends Qi{constructor(){super([ne,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 ne(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 QM=new XM;class YM extends Qi{constructor(){super([nt],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new nt(e.x,e.y,e.z,e.order);if(e.x!=null)return new nt(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const ZM=new YM;class KM extends Qi{constructor(){super(k,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const i=t.objectToNode[e.uuid];return gt&&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(te))return;E()&&ge("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}"
938
+
939
+ It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
940
+
941
+ To fix this please change your code to:
942
+
943
+ @serializable(AssetReference)
944
+ ${t.path}! : AssetReference;
945
+ \0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const i=t.nodeToObject[e.node];return gt&&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&&(gt&&console.warn("Deserialized object reference is a component"),i=i.gameObject),gt&&console.log("Deserialized object reference?",e,i,t?.nodeToObject)):((E()||gt)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),i}}}}const bw=new KM;class JM extends Qi{constructor(){super([M,M],"ComponentSerializer")}onSerialize(e,t){if(e?.guid)return{guid:e.guid}}onDeserialize(e,t){if(e?.guid){if(e.___persistentAsset){gt&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const i=t.path;gt&&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;(E()||gt)&&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 _u=new JM;class eR extends Qi{constructor(){super([he])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){if(typeof e=="function")return new he([new Mo(e,null,[],!0)]);if(e&&e.type==="EventList"){gt&&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=bw.onDeserialize(h,t);if(d||(d=_u.onDeserialize(h,t)),d)return d}return h};gt&&console.log(r);let l=_u.findObjectForGuid(r.target,t.root);!l&&t.context?.scene&&(l=_u.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:
946
+ Could not find method ${r.method} on object ${l.name}. Please rename ${r.method} to ${d}?
947
+ `,l[d],`
948
+ in script: `,l),ge("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
949
+ 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 g=Object.getOwnPropertyDescriptor(p,r.method);if(g&&(g.writable===!0||g.set)){d=!0;break}p=Object.getPrototypeOf(p)}!d&&(E()||gt)&&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])console.warn(`EventList method not found: "${r.method}" on ${l?.name}`);else{h!==void 0&&!Array.isArray(h)&&(h=[h]);const d=new Mo(l,r.method,h,r.enabled);i.push(d)}}else E()&&console.warn(`[Dev] EventList: Could not find event listener in scene (${t.object?.name})`,r)}const n=new he(i);gt&&console.log(n);const s=t.target;return s!==void 0&&t.path!==void 0&&n.setEventTarget(t.path,s),n}}}const tR=new eR,vu=new WeakMap,iR=Re.prototype.clone;Re.prototype.clone=function(){const o=iR.call(this);return vu.has(o)||vu.set(o,this),o};class _w extends Qi{constructor(){super([po,Dn])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof Re&&t.type===po){let i=e;vu.has(i)&&(i=vu.get(i)),i.isRenderTargetTexture=!0,i.flipY=!0,i.offset.y=1,i.repeat.y=-1,i.needsUpdate=!0,i.mipmaps=[],i instanceof yS&&(i.isCompressedTexture=!1,i.format=ld);const n=new po(i.image.width,i.image.height,{colorSpace:go});return n.texture=i,n}}}new _w;class vw extends Qi{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return cs(t.gltfId,e)}}new vw;var nR=Object.defineProperty,oR=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&nR(e,t,n),n};class $a extends M{awake(){ei.createIfNoneExists(this.context)}onEnable(){ei.get(this.context)?.register(this)}onDisable(){ei.get(this.context)?.unregister(this)}}class ki extends $a{targets=null;raycastHits=[];ignoreSkinnedMeshes=!1;start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??=new ps,e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=n=>n instanceof as?"continue in children":t?t(n):!0);const i=this.context.physics.raycast(e);return e.testObject=t,i}}oR([u()],ki.prototype,"ignoreSkinnedMeshes");class wu extends ki{constructor(){super(),this.ignoreSkinnedMeshes=!0}}class la extends $a{static allow=!0;performRaycast(e){if(!Y.active||!la.allow||!e?.ray)return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}}class nf{static getObject(e){const t=e[Si];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=Sr(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=Sr(e,i=>{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 of(o){return o[Si]||(o.parent?of(o.parent):null)}function sR(o){return o.isUI===!0||typeof o[Si]=="object"}function xu(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?vi:ls,t.shadowSide=e.doubleSided?vi:ls,o.castShadow=e.castShadows?e.castShadows:!1,o.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const i of o.children)xu(i,e)}function Ha(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 ww=Symbol("Scheduled action");function rR(o,e,t=we.OnBeforeRender){let i=o[ww];i||(i=o[ww]={});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 ws=w("debugeventsystem");var sf=(o=>(o.BeforeHandleInput="BeforeHandleInput",o.AfterHandleInput="AfterHandleInput",o))(sf||{});Jv(o=>{ei.createIfNoneExists(o)});class ei extends M{static ensureUpdateMeshUI(e,t,i=!1){Mc.update(e,t,i)}static markUIDirty(e){Mc.markDirty()}static createIfNoneExists(e){e.scene.getComponent(ei)||e.scene.addComponent(ei)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(ei)}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($a)||this.context.scene.addComponent(ki)}onEnable(){this.context.input.addEventListener(Ee.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Ee.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Ee.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Ee.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Ee.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Ee.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 ed(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==Ee.PointerDown,t.isUp=e.type==Ee.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId);const i=new ps;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(ws&&(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})}ws&&t.isClick&&Te("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($a):null;if(t&&t!=this._currentlyActiveRaycaster)return!1;let i=null;if(sR(e)&&(i=e[Si]?.gameObject),this._testObjectsCache.has(e)||i&&this._testObjectsCache.has(i))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let n=yu(e,this._currentPointerEventName);if(!n&&i&&(n=yu(i,this._currentPointerEventName)),n){this._testObjectsCache.set(e,!0);for(const s of e.children)this.shouldRaycastObject_AddToYesCache(s);return!0}return this._testObjectsCache.set(e,!1),"continue in children"}};shouldRaycastObject_AddToYesCache(e){this._testObjectsCache.set(e,!0);for(const t of e.children)this.shouldRaycastObject_AddToYesCache(t)}performRaycast(e){if(!this.raycaster)return null;this._testObjectsCache.clear(),this._sortedHits.length=0,e.testObject=this.shouldRaycastObject;for(const t of this.raycaster){if(!t.activeAndEnabled)continue;this._currentlyActiveRaycaster=t;const i=t.performRaycast(e);this._currentlyActiveRaycaster=null,i&&i.length>0&&this._sortedHits.push(...i)}return this._sortedHits.sort((t,i)=>t.distance-i.distance),this._sortedHits}assignHitInformation(e,t){t?(e.intersection=t,e.point=t.point,e.normal=t.normal,e.face=t.face,e.distance=t.distance,e.instanceId=t.instanceId):(e.intersection=void 0,e.point=void 0,e.normal=void 0,e.face=void 0,e.distance=void 0,e.instanceId=void 0)}handleIntersections(e,t){if(e?.length){e=this.sortCandidates(e);for(const n of e){if(t.event.immediatePropagationStopped)return!1;if(this.assignHitInformation(t,n),this.handleEventOnObject(n.object,t))return!0}}this.assignHitInformation(t,e?.[0]),this.invokePointerCapture(t);const i=this.hoveredByID.get(t.pointerId);return i&&this.propagatePointerExit(i.obj,i.data,null),this.hoveredByID.delete(t.pointerId),t.isUp&&(this.pressedByID.get(t.pointerId)?.handlers.forEach(n=>this.invokeOnPointerUp(t,n)),this.pressedByID.delete(t.pointerId)),!1}_sortingBuffer=[];_noDepthTestingResults=[];sortCandidates(e){this._sortingBuffer.length=0,this._noDepthTestingResults.length=0;for(let t=0;t<e.length;t++){const i=e[t],n=i.object;if(n.material&&n.material.depthTest===!1){this._noDepthTestingResults.push(i);continue}this._sortingBuffer.push(i)}for(const t of this._sortingBuffer)this._noDepthTestingResults.push(t);return this._noDepthTestingResults}out={};handleEventOnObject(e,t){if(!this.testIsVisible(e))return t.isClick&&ws&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return ws&&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[Si]){const h=i[Si].gameObject;if(h){if(!nf.isInteractable(h,this.out))return!1;s=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,c),e=h}}}n&&ws&&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&&!j.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===Td.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 E()&&!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),ws&&console.log("released pointer capture",i,t,this._capturedPointer))}}invokePointerCapture(e){if(e.event.type===Ee.PointerMove){const t=e.pointerId,i=this._capturedPointer[t];if(i){ws&&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=Mc.updateState(e,t);return i&&this.currentActiveMeshUIComponents.push(i),i!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&Mc.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];Mc.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?x.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class Mc{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&&(ws&&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 aR=Object.defineProperty,Ie=(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&&aR(e,t,n),n};const Gt=w("debugorbit"),rf=w("freecam"),lR=w("debugcamerafit"),Su=w("smoothcam"),cR={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let af;class Rc extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class fe extends M{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}targetLerpDuration=1;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;_lookTargetLerpDuration=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(){Gt&&console.debug("OrbitControls",this),this._didSetTarget=0,this._startedListeningToKeyEvents=!1,this.context.domElement.cameraControls===!1&&(this.enabled=!1)}start(){this._eventSystem=ei.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(sf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){this._controls?.dispose(),this._eventSystem?.removeEventListener(sf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._enableTime=this.context.time.time;const e=x.getComponent(this.gameObject,si);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof ce&&(t=this.gameObject),t&&Am(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 Z0(t,i),t?.quaternion.copy(n),af===void 0&&(af={...this._controls.keys});const s=Z(t),r=this.gameObject.worldForward,a=s.clone().sub(r.multiplyScalar(2.5));this._controls.target.copy(a)}if(this._controls)if(rf&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,G.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,wn)??void 0,this.context.pre_render_callbacks.push(this.__onPreRender),this._activePointerEvents=[],this.context.input.addEventListener("pointerdown",this._onPointerDown,{queue:ii.Early}),this.context.input.addEventListener("pointerdown",this._onPointerDownLate,{queue:ii.Late}),this.context.input.addEventListener("pointerup",this._onPointerUp,{queue:ii.Early}),this.context.input.addEventListener("pointerup",this._onPointerUpLate,{queue:ii.Late})}onDisable(){if(this._camera?.threeCamera&&Am(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}Gt&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}};_onPointerUpLate=e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()};updateTargetNow(e){const t=new ss(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?(Gt&&F.DrawWireSphere(n.point,.1,16711680,2),this._controls?.target.copy(i[0].point)):Gt&&console.log("OrbitControls: No hit found when updating target",{hits:[...i]})}_orbitStartAngle=0;_zoomStartDistance=0;onControlsChangeStarted=()=>{Gt&&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(Gt&&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?(Gt&&console.debug("OrbitControls: Update target",{deltaAngle:e}),this.updateTargetNow({allowSlowRaycastFallback:!1})):Gt&&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,si);if(e&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const t=Z(e.threeCamera),i=Math.max(.01,t.length()),n=new b(0,0,-i).applyMatrix4(e.threeCamera.matrixWorld);Gt&&F.DrawLine(t,n,5592575,10),this.setLookTargetPosition(n,!0)}if(!this.setLookTargetFromConstraint()){const t=new ps;t.screenPoint=new K(0,0),t.lineThreshold=.1;const i=this.context.physics.raycast(t);i.length>0&&this.setLookTargetPosition(i[0].point,!0),lR&&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 Rc(this,"camera"));else{const e=j.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 Rc(this,"lookat"));else{const e=j.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=j.easeInOutCubic(this._fovLerp01);e.fov=j.lerp(this._fovLerpStartValue,this._fovLerpEndValue,t)}e.updateProjectionMatrix()}}if(this._controls){if(this.debugLog&&(this._controls.domElement=this.context.renderer.domElement),this._controls.enabled=!this._shouldDisable&&this._camera===this.context.mainCameraComponent&&!this.context.isInXR&&!this._activePointerEvents.some(e=>e.used),this._controls.keys=this.enableKeys?af:cR,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.enableRotate=this.enableRotate,this._controls.minAzimuthAngle=this.minAzimuthAngle,this._controls.maxAzimuthAngle=this.maxAzimuthAngle,this._controls.minPolarAngle=this.minPolarAngle,this._controls.maxPolarAngle=this.maxPolarAngle,rf||(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 Su=="number"||Su===!0){this._controls.enableDamping=!0;const e=typeof Su=="number"?Su:.99;this._controls.dampingFactor=Math.max(.001,1-Math.min(1,e))}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||(!rf&&this.lookAtConstraint?.locked&&!this._lookTargetLerpActive&&this.setLookTargetFromConstraint(0,this.lookAtConstraint01),this._controls.update(this.context.time.deltaTime),Gt&&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(E()||Gt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof k)&&!(e instanceof si))return(E()||Gt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof si&&(e=e.gameObject);const i=e.worldPosition,n=e.worldForward;e instanceof bS&&(Gt&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),n.multiplyScalar(-1));const s=new ss(i,n);return Gt&&F.DrawRay(s.origin,s.direction,16711680,10),this.setTargetFromRaycast(s,t)||this.setLookTargetPosition(s.at(2,$()),t),this.setCameraTargetPosition(i,t),!0}setCameraTargetPosition(e,t=!1){e&&(e instanceof k&&(e=Z(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=Z(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,Gt&&(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=of(n.object);if(s&&s.canvas?.screenspace)break;return this.setLookTargetPosition(n.point,t),!0}return!1}fitCamera(e){const t=gw({...e,autoApply:!1,context:this.context,camera:this._cameraObject,currentZoom:this._controls?.getDistance()||void 0,minZoom:this.minZoom,maxZoom:this.maxZoom});t&&(this.setLookTargetPosition(t.lookAt,e?.immediate||!1),this.setCameraTargetPosition(t.position,e?.immediate||!1),this.setFieldOfView(e?.fov,e?.immediate||!1),this.onBeforeRender())}_haveAttachedKeyboardEvents=!1}Ie([u()],fe.prototype,"autoTarget"),Ie([u()],fe.prototype,"autoFit"),Ie([u()],fe.prototype,"enableRotate"),Ie([u()],fe.prototype,"autoRotate"),Ie([u()],fe.prototype,"autoRotateSpeed"),Ie([u()],fe.prototype,"minAzimuthAngle"),Ie([u()],fe.prototype,"maxAzimuthAngle"),Ie([u()],fe.prototype,"minPolarAngle"),Ie([u()],fe.prototype,"maxPolarAngle"),Ie([u()],fe.prototype,"enableKeys"),Ie([u()],fe.prototype,"enableDamping"),Ie([u()],fe.prototype,"dampingFactor"),Ie([u()],fe.prototype,"enableZoom"),Ie([u()],fe.prototype,"minZoom"),Ie([u()],fe.prototype,"maxZoom"),Ie([u()],fe.prototype,"zoomSpeed"),Ie([u()],fe.prototype,"enablePan"),Ie([u(kr)],fe.prototype,"lookAtConstraint"),Ie([u()],fe.prototype,"lookAtConstraint01"),Ie([u()],fe.prototype,"allowInterrupt"),Ie([u()],fe.prototype,"middleClickToFocus"),Ie([u()],fe.prototype,"doubleClickToFocus"),Ie([u()],fe.prototype,"clickBackgroundToFitScene"),Ie([u()],fe.prototype,"targetLerpDuration");var hR=Object.defineProperty,dR=Object.getOwnPropertyDescriptor,qt=(o,e,t,i)=>{for(var n=i>1?void 0:i?dR(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&&hR(e,t,n),n},Rr=(o=>(o[o.None=0]="None",o[o.Skybox=1]="Skybox",o[o.SolidColor=2]="SolidColor",o[o.Uninitialized=4]="Uninitialized",o))(Rr||{});const xs=w("debugcam"),xw=w("debugscreenpointtoray"),jt=class qh extends M{get isCamera(){return!0}get aspect(){return this._cam instanceof ce?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(e){this._cam instanceof ce&&this._cam.aspect!==e&&(this._cam.aspect=e,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof ce?this._cam.fov:this._fov}set fieldOfView(e){const t=this.fieldOfView!=e;if(this._fov=e,t&&this._cam&&this._cam instanceof ce){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=qh._origin;s.set(e,t,-1),this.context.input.convertScreenspaceToRaycastSpace(s),xw&&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=qh._direction.set(s.x,s.y,s.z),a=Z(n);return r.sub(a),r.normalize(),i?(i.set(a,r),i):new ss(a.clone(),r.clone())}_frustum;getFrustum(){return this._frustum||(this._frustum=new z0,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new z0),this._frustum.setFromProjectionMatrix(this.getProjectionScreenMatrix(this._projScreenMatrix,!0),this.context.renderer.coordinateSystem)}getProjectionScreenMatrix(e,t){return t&&this._projScreenMatrix.multiplyMatrices(this.threeCamera.projectionMatrix,this.threeCamera.matrixWorldInverse),e===this._projScreenMatrix?e:e.copy(this._projScreenMatrix)}_projScreenMatrix=new J;awake(){xw&&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(){xs&&console.log(`Camera enabled: "${this.name}". ClearFlags=${Rr[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),pR(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 ce&&(this._fov=t.fov)):t=this.gameObject.children[0],t&&t.isCamera)t instanceof ce&&(this._fov&&(t.fov=this._fov),t.near=this._nearClipPlane,t.far=this._farClipPlane,t.updateProjectionMatrix());else if(!this.orthographic)t=new ce(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 od(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){xs&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this.fieldOfView,xs){const i=`[Camera] Apply ClearFlags: ${Rr[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(qh.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:xs&&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:xs&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let i=this._backgroundColor.alpha;qh.backgroundShouldBeTransparent(this.context)&&(i=this.ARBackgroundAlpha??0),this.context.scene.background=null,this.context.xr?.isVR?this.context.renderer.setClearColor(Ib(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,i)}else this._backgroundColor||xs&&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 uR(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;xs&&Te("Environment blend mode: "+i+" on "+navigator.userAgent);let n=i==="additive"||i==="alpha-blend";return e.isInAR&&i==="opaque"&&(navigator.userAgent?.includes("OculusBrowser")||navigator.userAgent?.includes("Mozilla")&&navigator.userAgent?.includes("Mobile WebXRViewer/v2"))&&(n=!0),t._transparent=n,n}};qt([u()],jt.prototype,"aspect",1),qt([u()],jt.prototype,"fieldOfView",1),qt([u()],jt.prototype,"nearClipPlane",1),qt([u()],jt.prototype,"farClipPlane",1),qt([u()],jt.prototype,"clearFlags",1),qt([u()],jt.prototype,"orthographic",2),qt([u()],jt.prototype,"orthographicSize",2),qt([u()],jt.prototype,"ARBackgroundAlpha",2),qt([u()],jt.prototype,"cullingMask",1),qt([u()],jt.prototype,"backgroundBlurriness",1),qt([u()],jt.prototype,"backgroundIntensity",1),qt([u(nt)],jt.prototype,"backgroundRotation",1),qt([u()],jt.prototype,"environmentIntensity",1),qt([u(se)],jt.prototype,"backgroundColor",1),qt([u(po)],jt.prototype,"targetTexture",1);let si=jt;class uR{_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");xs&&console.debug(`[Camera] Apply Skybox ${this._skybox?.name} ${e} - "${this._camera.name}"`),e?.length||(this._skybox.mapping=fo,this.context.scene.background=this._skybox)}}}function pR(o){w("freecam")&&o.context.mainCameraComponent===o&&x.getOrAddComponent(o.gameObject,fe)}class Ro extends M{get listener(){return this._listener==null&&(this._listener=new _S),this._listener}_listener=null;onEnable(){En.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){En.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,si);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 mR=Object.defineProperty,gR=Object.getOwnPropertyDescriptor,xn=(o,e,t,i)=>{for(var n=i>1?void 0:i?gR(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&&mR(e,t,n),n};const Ot=w("debugaudio"),Zi=class Qs extends M{static get userInteractionRegistered(){return En.userInteractionRegistered}static registerWaitForAllowAudio(e){En.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&&(Ot&&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&&Qs.userInteractionRegistered){let e=this.gameObject.getComponent(Ro)??this.context.mainCamera.getComponent(Ro)??Da(Ro,this.context,!1);!e&&this.context.mainCamera&&(e=this.context.mainCamera.addComponent(Ro)),e?.listener?(this.sound=new vS(e.listener),this.gameObject?.add(this.sound)):Ot&&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(){Ot&&console.log("[AudioSource]",this),this.audioLoader=new lm,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),Qs.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():Qs.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(Zm.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(Zm.MuteChanged,this.onApplicationMuteChanged),this.pause()}onVisibilityChanged=()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||G.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":Ot&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,Qs.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&Qs.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){Ot&&console.warn("AudioSource destroyed, not creating audio",this.name);return}Ot&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){Ot&&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&&Qs.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),Qs.registerWaitForAllowAudio(this.__onAllowAudioCallback)};__onAllowAudioCallback=()=>{this.shouldPlay&&this.play()};applySpatialDistanceSettings(){const e=this.sound;if(!e)return;this._needUpdateSpatialDistanceSettings=!1;const t=j.lerp(10*this._maxDistance/Math.max(1e-4,this.spatialBlend),this._minDistance,this.spatialBlend);switch(Ot&&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?Ot&&!this.helper&&(this.helper=new PC(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(Ot&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new lm),this.shouldPlay=!0,this._lastClipStartedLoading===e){Ot&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,Ot&&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)&&(E()&&console.warn("Called play on AudioSource with unknown argument type:",e+`
950
+ 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,Ot&&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(){Ot&&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(){Ot&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,Ot&&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,Ot&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};xn([u(URL)],Zi.prototype,"clip",2),xn([u()],Zi.prototype,"playOnAwake",2),xn([u()],Zi.prototype,"preload",2),xn([u()],Zi.prototype,"playInBackground",2),xn([u()],Zi.prototype,"loop",1),xn([u()],Zi.prototype,"spatialBlend",1),xn([u()],Zi.prototype,"minDistance",1),xn([u()],Zi.prototype,"maxDistance",1),xn([u()],Zi.prototype,"volume",1),xn([u()],Zi.prototype,"pitch",1),xn([u()],Zi.prototype,"rollOffMode",2);let Mi=Zi;const fR=w("debugavatar");class Le extends M{static getAvatar(e){return e>=0&&e<Le.instances.length?Le.instances[e]:null}static instances=[];static onAvatarMarkerCreated(e){return Le._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return Le._onAvatarMarkerDestroyed.push(e),e}static _onNewAvatarMarkerAdded=[];static _onAvatarMarkerDestroyed=[];connectionId;avatar;awake(){Le.instances.push(this),fR&&console.log(this);for(const e of Le._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){Le.instances.splice(Le.instances.indexOf(this),1);for(const e of Le._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}}class Tr{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 yR{guid;position=new b}class Tc extends M{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 yR;_currentTargetObject=null;_lastUpdateTime=0;_lookDuration=0;_lastPoiChangedTime=0;awake(){if(this.avatar=x.getComponentInParent(this.gameObject,Le),this.avatar){const e=x.getComponentInParent(this.gameObject,Le);this._model=new ig(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&&mt(this.target,e.position)})}update(){if((!this.context.connection.isConnected||this._model?.hasOwnership)&&(Tr.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=Tr.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const e=Z(this._currentTargetObject);mt(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=Tr.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 Sw(o){const e=o;return!!(e.parser&&e.parser.json)}var Cu=(o=>(o[o.None=0]="None",o[o.DontExport=1]="DontExport",o))(Cu||{});function Cw(o){return o&&o.isComponent}const bR=Symbol("object"),lf=new wi(()=>new b,20);class Pw{_point;_normal;_tangentVelocity;distance;impulse;friction;get point(){return lf.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return lf.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return lf.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 Ow{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 kw{object;collider;constructor(e,t){this.object=e,this.collider=t}}const je=w("debugnetworkingstreams");var qn=(o=>(o.Connected="peer-user-connected",o.StreamReceived="receive-stream",o.StreamEnded="call-ended",o.Disconnected="peer-user-disconnected",o.UserJoined="user-joined",o))(qn||{});class cf{type="call-ended";userId;direction;constructor(e,t){this.userId=e,this.direction=t}}class Mw{type="receive-stream";userId;stream;target;constructor(e,t,i){this.userId=e,this.stream=t,this.target=i}}class _R{guid;peerId;dontSave=!0;constructor(e,t){this.guid=e.id,this.peerId=t}}var Rw=(o=>(o.Incoming="incoming",o.Outgoing="outgoing",o))(Rw||{});class vR extends cm{peerId;userId;direction;call;get stream(){return this._stream}_stream=null;_isDisposed=!1;close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),Xn(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(je&&console.log("Receive stream",`
951
+ Audio:`,s.getAudioTracks(),`
952
+ Video:`,s.getVideoTracks()),this._stream=s,i==="incoming"){const r=new Mw(e,s,this);this.dispatchEvent(r)}}),t.on("close",()=>{this.dispatchEvent(new cf(e,i))})}}function Tw(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 ts extends cm{static instances=new Map;static getOrCreate(e,t){if(ts.instances.has(t))return ts.instances.get(t);const i=new ts(e,t);return ts.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){je?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=>Tw(s)},n=this._peer?.call(e,t,i);if(n){const s=this.registerCall(n,"outgoing",t);return je&&console.warn(`\u{1F4DE} CALL ${e}`,`
953
+ Outgoing:`,this._outgoingCalls,`
954
+ Incoming:`,this._incomingCalls),s}else je&&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?je&&console.warn("!!! Stream is still active, don't remove call",t.userId,"Your id: "+this.context.connection.connectionId):(je&&console.warn("!!! Remove closed call",t.userId),i=!0)),this.context.connection.userIsInRoom(t.userId)===!1&&(je&&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:je&&console.warn("[PeerJs] getUserMedia is not writable")}catch(n){je&&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(ee.JoinedRoom,this.onConnectRoomFn),this.subscribePeerEvents())}disable(){this._enabled&&(this._enabled=!1,this.context.connection.stopListen(ee.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=g_(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(je&&console.log("PEER opened as",e),e===null){console.error("Peer connection failed",e);return}this.context.connection.send("peer-user-connected",new _R(this,e))};onPeerClose=()=>{je&&console.log("PEER closed"),this.updateCalls()};onPeerDisconnected=()=>{je&&console.log("PEER disconnected"),this.updateCalls()};onPeerError=e=>{je&&console.error("PEER error",e)};onPeerReceivingCall=e=>{e.answer(void 0,{sdpTransform:t=>Tw(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"&&je?console.warn("\u2190 Receive call from",e.metadata,e.connectionId):je&&console.warn("\u2192 Make call to",e.metadata);const r=t==="incoming"?this._incomingCalls:this._outgoingCalls,a=new vR(s,e,t,i);return r.push(a),e.on("error",l=>{console.error("Call error",l)}),e.on("close",()=>{je&&console.log("Call ended",e.metadata);const l=r.indexOf(a);l!==-1&&r.splice(l,1),a.close(),this.dispatchEvent(new cf(s,t))}),a.addEventListener("call-ended",l=>{this.dispatchEvent(l)}),t==="incoming"&&(a.addEventListener("receive-stream",l=>{this.dispatchEvent(l)}),e.on("stream",()=>{je&&console.log("Received stream for call",e.metadata);let l=0;const c=setInterval(()=>{const h=l===0;!a.isOpen&&h&&(je&&console.warn("Close call because stream is not active",e.metadata),l+=1,clearInterval(c),a.close())},2e3)})),a}}class td extends cm{static create(e,t){const i=ts.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new td(e.context,i)}context;peer;_sendingStreams=new Map;debug=!1;constructor(e,t){if(super(),Cw(e)){const i=e;e=i.context,t=ts.getOrCreate(i.context,i.guid)}else typeof t=="string"&&(t=ts.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,je&&(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(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ee.UserJoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ee.UserLeftRoom,this.onUserLeft),this.context.connection.beginListen(ee.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(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ee.UserJoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ee.UserLeftRoom,this.onUserLeft),this.context.connection.stopListen(ee.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 je&&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))je&&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)?je&&(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}`)):(je&&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 Xn(o){if(o&&o instanceof MediaStream)for(const e of o.getTracks())e.stop()}var wR=Object.defineProperty,hf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&wR(e,t,n),n};const xR="noVoip",SR=w("debugvoip");class Ss extends M{autoConnect=!0;runInBackground=!0;createMenuButton=!0;debug=!1;_net;_menubutton;awake(){SR&&(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=td.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(qn.StreamReceived,this.onReceiveStream),this._net.addEventListener(qn.StreamEnded,this.onStreamEnded),this._net.enable(),this.autoConnect&&this.context.connection.isConnected&&this.connect(),this.context.connection.beginListen(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ee.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.addEventListener("visibilitychange",this.onVisibilityChanged)}onDisable(){this._net&&(this._net.stopSendingStream(this._outputStream),this._net.removeEventListener(qn.StreamReceived,this.onReceiveStream),this._net.removeEventListener(qn.StreamEnded,this.onStreamEnded),this._net?.disable()),this.context.connection.stopListen(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ee.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 G.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),Xn(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 G.microphonePermissionsGranted()?console.error("VOIP: Could not get audio stream - please make sure to connect an audio device and grant microphone permissions"):Zl("Microphone permissions not granted: Please grant microphone permissions to use voice chat"),(this.debug||E())&&console.log("VOIP: Failed to get audio stream"),!1)}disconnect(e){e?.remember&&(this._allowSending=!1),this._net?.stopSendingStream(this._outputStream),Xn(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(),G.microphonePermissionsGranted().then(e=>{e||ge("<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 G.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(Ct(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,E()&&ge("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(G.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 Bn(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())Xn(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"),En.registerWaitForInteraction(()=>{n?.play().catch(s=>{console.error("VOIP: Failed to play audio",s)})})};onStreamEnded=e=>{const t=this._incomingStreams.get(e.userId);Xn(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}}}hf([u()],Ss.prototype,"autoConnect"),hf([u()],Ss.prototype,"runInBackground"),hf([u()],Ss.prototype,"createMenuButton");var CR=Object.defineProperty,Ew=(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&&CR(e,t,n),n};const PR=w("debugmouth");class Ec extends M{idle=[];talking=[];marker=null;voip=null;lastMouthChangeTime=0;mouthChangeLength=0;awake(){setTimeout(()=>{this.voip=x.findObjectOfType(Ss,this.context),this.marker||(this.marker=x.getComponentInParent(this.gameObject,Le))},3e3)}update(){if(!this.voip||this.context.time.frameCount%10!==0)return;let e=this.marker?.connectionId??null;if(!e){PR&&(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)}}}}Ew([u(k)],Ec.prototype,"idle"),Ew([u(k)],Ec.prototype,"talking");class df extends M{voip=null;marker=null;_startPosition=null;awake(){this.voip=x.findObjectOfType(Ss,this.context),this.marker=x.getComponentInParent(this.gameObject,Le)}update(){if(!this.voip||!this.marker||this.context.time.frameCount%10!==0)return;const e=this.marker.connectionId,t=this.voip.getFrequency(e);if(t==null)return;this._startPosition||(this._startPosition=this.gameObject.position.clone());const i=t/100;this.gameObject.position.y=this._startPosition.y+i*.07}}var OR=Object.defineProperty,kR=(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&&OR(e,t,n),n};const Ga=w("debugxrflags"),Aw=w("disablexrflags");Aw&&console.warn("XRFlags are disabled");var Qn=(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))(Qn||{});class Jt{static Global=new Jt;Mask=17;Has(e){return(this.Mask&e)!==0}Set(e){Ga&&console.warn("Set XR flag state to",e),this.Mask=e,Ki.Apply()}Enable(e){this.Mask|=e,Ki.Apply()}Disable(e){this.Mask&=~e,Ki.Apply()}Toggle(e){this.Mask^=e,Ki.Apply()}EnableAll(){this.Mask=-1,Ki.Apply()}DisableAll(){this.Mask=0,Ki.Apply()}}const Iw=class Yo extends M{static registry=[];static Apply(){for(const e of this.registry)e.UpdateVisible(Jt.Global)}static firstApply;static buffer=new Jt;visibleIn;awake(){Yo.registry.push(this)}onEnable(){Yo.firstApply?this.UpdateVisible(Jt.Global):(Yo.firstApply=!0,Yo.Apply())}onDestroy(){const e=Yo.registry.indexOf(this);e>=0&&Yo.registry.splice(e,1)}get isOn(){return this.gameObject.visible}UpdateVisible(e=null){if(Aw)return;let t;const i=e;if(i&&typeof i=="number"&&(console.assert(typeof i=="number","XRFlag.UpdateVisible: state must be a number",i),Ga&&console.log(i),Yo.buffer.Mask=i,e=Yo.buffer),e instanceof Jt?(Ga&&console.warn(this.name,"use passed in mask",e.Mask,this.visibleIn),t=e.Has(this.visibleIn)):(Ga&&console.log(this.name,"use global mask"),Jt.Global.Has(this.visibleIn)),t!==void 0)if(t)Ga&&console.log(this.name,"is visible",this.gameObject.uuid),x.setActive(this.gameObject,!0);else{if(Ga&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}};kR([u()],Iw.prototype,"visibleIn");let Ki=Iw;var MR=Object.defineProperty,Pu=(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&&MR(e,t,n),n};class Er extends M{eyes=[];lastBlinkTime=0;blinkLength=0;eyesOpen=!0;state=null;awake(){this.state=x.getComponentInParent(this.gameObject,Ki)}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)}}}Pu([u(k)],Er.prototype,"eyes"),Pu([u()],Er.prototype,"lastBlinkTime"),Pu([u()],Er.prototype,"blinkLength"),Pu([u()],Er.prototype,"eyesOpen");var RR=Object.defineProperty,uf=(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&&RR(e,t,n),n};const Ou=class V1 extends M{head=null;eyes=null;target=null;brain=null;awake(){this.brain||(this.brain=x.getComponentInParent(this.gameObject,Tc)),this.brain||(this.brain=x.addComponent(this.gameObject,Tc)),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=Z(e);this.currentTargetPoint.lerp(i,this.context.time.deltaTime/.1);const n=Z(this.head),s=this.vec.copy(this.currentTargetPoint).sub(n).normalize();if(s.length()<.1)return;const r=V1.forward;if(r.set(0,0,1),r.applyQuaternion(be(this.head)),r.dot(s)>.45)for(let a=0;a<t.length;a++)t[a].lookAt(this.currentTargetPoint)}}}};uf([u(k)],Ou.prototype,"head"),uf([u(k)],Ou.prototype,"eyes"),uf([u(k)],Ou.prototype,"target");let pf=Ou;var TR=Object.defineProperty,mf=(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&&TR(e,t,n),n};class qa extends M{length=1;depthTest=!0;isGizmo=!1;_axes=null;onEnable(){if(this.isGizmo&&!dc)return;this._axes||(this._axes=new _i(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)}}mf([u()],qa.prototype,"length"),mf([u()],qa.prototype,"depthTest"),mf([u()],qa.prototype,"isGizmo");class gf extends M{from;to;hint;desiredDistance=1;onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=Z(this.to).clone(),t=Z(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=Z(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),mt(this.gameObject,d);const p=s.clone();p.sub(a),this.gameObject.lookAt(p)}}const ER=w("gizmos"),AR=w("debugboxhelper");class xt extends M{box=null;static testBox=new bi;_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 bi),Vt([e],void 0,void 0,xt.testBox),xt.testBox.isEmpty()){const i=Z(e,xt._position);xt.testBox.setFromCenterAndSize(i,xt._emptyObjectSize)}this.updateBox();const t=this.box?.intersectsBox(xt.testBox);return t&&AR&&F.DrawWireBox3(xt.testBox,16711680,5),t}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new bi),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const i=t,n=Z(this.gameObject,xt._position,i),s=$e(this.gameObject,xt._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(!(!ER&&!t)){if(this._helper){e&&this._color?.set(e),this.gameObject.add(this._helper);return}this._helper=hg(e),this.gameObject.add(this._helper)}}}var IR=Object.defineProperty,ri=(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 ai extends M{get isCollider(){return!0}attachedRigidbody=null;isTrigger=!1;sharedMaterial;membership=[0];filter;awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ye))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ye))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ye))}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)}}ri([u(Ye)],ai.prototype,"attachedRigidbody"),ri([u()],ai.prototype,"isTrigger"),ri([u()],ai.prototype,"sharedMaterial"),ri([u()],ai.prototype,"membership"),ri([u()],ai.prototype,"filter");class Xa extends ai{radius=.5;center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.addSphereCollider(this),yd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Cm(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}ri([Pt(),u()],Xa.prototype,"radius"),ri([u(b)],Xa.prototype,"center");const ff=class $1 extends ai{static add(e,t){const i=_n(e,$1);return i.autoFit(),t?.rigidbody===!0&&_n(e,Ye,{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),yd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Cm(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=Vt([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)}};ri([Pt(),u(b)],ff.prototype,"size"),ri([u(b)],ff.prototype,"center");let ku=ff;class Cs extends ai{sharedMesh;convex=!1;onEnable(){if(super.onEnable(),!this.context.physics.engine)return;this.sharedMesh?.isMesh||(this.gameObject instanceof H||this.gameObject instanceof rs)&&(this.sharedMesh=this.gameObject);const e=0;if(this.sharedMesh?.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),Ve.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(Ve.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(E()||w("showcolliders"))&&console.warn(`[MeshCollider] A MeshCollider mesh is assigned to an unknown object on "${this.gameObject.name}", but it's neither a Mesh nor a Group. Please double check that you attached the collider component to the right object and report a bug otherwise!`,this)}}}ri([u(H)],Cs.prototype,"sharedMesh"),ri([u()],Cs.prototype,"convex");class To extends ai{center=new b(0,0,0);radius=.5;height=2;onEnable(){super.onEnable(),this.context.physics.engine?.addCapsuleCollider(this,this.height,this.radius)}}ri([u(b)],To.prototype,"center"),ri([u()],To.prototype,"radius"),ri([u()],To.prototype,"height");var LR=Object.defineProperty,Eo=(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&&LR(e,t,n),n};const Lw=w("debugcharactercontroller");class Ar extends M{center=new b(0,0,0);radius=.5;height=2;_rigidbody=null;get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(Ye),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(Ye)),this.rigidbody)}_activeGroundCollisions;awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(To);t||(t=this.gameObject.addComponent(To)),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),Lw&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),Lw&&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}}Eo([u(b)],Ar.prototype,"center"),Eo([u()],Ar.prototype,"radius"),Eo([u()],Ar.prototype,"height");class Ao extends M{controller;movementSpeed=2;rotationSpeed=2;jumpForce=1;doubleJumpForce=2;animator;lookForward=!0;awake(){this._currentRotation=new U}update(){const e=this.context.input;e.isKeyPressed("KeyW")?this.moveInput.y+=1:e.isKeyPressed("KeyS")&&(this.moveInput.y-=1),e.isKeyPressed("KeyD")?this.lookInput.x+=1:e.isKeyPressed("KeyA")&&(this.lookInput.x-=1),this.jumpInput||=e.isKeyDown("Space")}move(e){this.moveInput.add(e)}look(e){this.lookInput.add(e)}jump(){this.jumpInput=!0}lookInput=new K(0,0);moveInput=new K(0,0);jumpInput=!1;onBeforeRender(){this.handleInput(this.moveInput,this.lookInput,this.jumpInput),this.lookInput.set(0,0),this.moveInput.set(0,0),this.jumpInput=!1}_currentSpeed=new b(0,0,0);_currentAngularSpeed=new b(0,0,0);_temp=new b(0,0,0);_jumpCount=0;_currentRotation;handleInput(e,t,i){if(this.controller?.isGrounded&&(this._jumpCount=0,this.doubleJumpForce>0&&this.animator?.setBool("doubleJump",!1)),this._currentSpeed.z+=e.y*this.movementSpeed*this.context.time.deltaTime,this.animator?.setBool("running",e.length()>.01),this.animator?.setBool("jumping",this.controller?.isGrounded===!0&&i),this._temp.copy(this._currentSpeed),this._temp.applyQuaternion(this.gameObject.quaternion),this.controller?this.controller.move(this._temp):this.gameObject.position.add(this._temp),this._currentAngularSpeed.y+=j.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 ss),this._raycastOptions.ray.origin.copy(Z(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 ps}Eo([u(Ar)],Ao.prototype,"controller"),Eo([u()],Ao.prototype,"movementSpeed"),Eo([u()],Ao.prototype,"rotationSpeed"),Eo([u()],Ao.prototype,"jumpForce"),Eo([u()],Ao.prototype,"doubleJumpForce"),Eo([u(ft)],Ao.prototype,"animator");var jR=Object.defineProperty,Qa=(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&&jR(e,t,n),n};const Ac=w("debugcontactshadows");du(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=Ic.auto(o),i=parseFloat(e);isNaN(i)||(t.opacity=i,t.darkness=i)}});const Ir=class Xh extends M{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=_n(n,Xh,{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 rs;renderTarget;renderTargetBlur;plane;occluderMesh;blurPlane;depthMaterial;horizontalBlurMaterial;verticalBlurMaterial;textureSize=512;fitShadows(e={}){Ac&&console.warn("Fitting shadows to scene"),wd(this.shadowsRoot,!1);const t=e.object||this.context.scene,i=Vt(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)),Ac&&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,Ac&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){Xh._instances.set(this.context,this),this.shadowsRoot.hideFlags=Cu.DontExport,wd(this.shadowsRoot,!1)}start(){Ac&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new Dn(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new Dn(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const e=new Ln(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"),Oo(this.gameObject,!1));const t=new xe({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:ls});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 xe({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:pd})).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 od(-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 wS,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=xS,this.depthMaterial.blendEquation=SS,this.depthMaterial.onBeforeCompile=s=>{this.depthMaterial&&(s.uniforms.darkness=this.depthMaterial.userData.darkness,s.fragmentShader=`
955
+ uniform float darkness;
956
+ ${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) );")}
957
+ `)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new jn(OC),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new jn(kC),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){Xh._instances.get(this.context)===this&&Xh._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){Ac&&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&&Oo(this.gameObject,!1);const r=t.background;t.background=null,t.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=vi:this.depthMaterial.side=ls;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;jw.length=0,h.transparent=jw,yf.length=0;for(const g of h.opaque){if(!g.object.visible)continue;const f=g.material;let m=g.material.colorWrite==!1||f.wireframe===!0||Vb(g.object)===!1;!m&&g.material.isLineMaterial&&(m=!0),!m&&g.material.isPointsMaterial&&(m=!0),m&&(yf.push(g.object),g.object["needle:visible"]=g.object.visible,g.object.visible=!1)}i.setRenderTarget(this.renderTarget),i.clear(),i.render(t,this.shadowCamera),h.transparent=d;for(const g of yf)g["needle:visible"]!=null&&(g.visible=g["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))}};Qa([u()],Ir.prototype,"autoFit"),Qa([u()],Ir.prototype,"darkness"),Qa([u()],Ir.prototype,"opacity"),Qa([u()],Ir.prototype,"blur"),Qa([u()],Ir.prototype,"occludeBelowGround"),Qa([u()],Ir.prototype,"backfaceShadows");let Ic=Ir;const jw=[],yf=new Array,DR=w("logstats");class bf extends M{onEnable(){console.log(this),DR&&this.startCoroutine(this.run(),we.OnAfterRender)}*run(){for(;this.enabled;){const e=this.context.renderer.info;console.log(e.memory,e.render,e.programs),yield}}}class Lc extends M{isUsed=!0;usedBy=null}class _f extends M{}const Dw=w("debugdeletable");class er extends xt{static _instances=[];onEnable(){er._instances.push(this)}onDisable(){const e=er._instances.indexOf(this);e>=0&&er._instances.splice(e,1)}}class vf extends M{update(){for(const e of er._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const i=x.getComponentInParent(this.gameObject,Lc);if(i)Dw&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,i);else{if(Dw)try{if(e.box){const n=e.box,s=xt.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{}hc(this.gameObject,this.context.connection)}}}}}var BR=Object.defineProperty,FR=(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&&BR(e,t,n),n};class Mu extends M{visibleOn;onEnable(){this.apply()}apply(){this.test()||x.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:G.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}FR([u()],Mu.prototype,"visibleOn");var UR=Object.defineProperty,Lr=(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&&UR(e,t,n),n};const Yn=w("debugdrag"),wf=[];var xf=(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))(xf||{});const Ps=class rn extends M{static get HasAnySelected(){return this._active>0}static _active=0;static get CurrentlySelected(){wf.length=0;for(const e of this._instances)e._isDragging&&wf.push(e);return wf}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,Ye),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(ki)||this.gameObject.addComponent(ki)}onEnable(){rn._instances.push(this)}onDisable(){rn._instances=rn._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,rn);!t||t!==this||(rn.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"&&rn.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)&&(rn.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),rn._active+=1;const t=new Sf(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 Sf&&s instanceof Sf){const r=new zR(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(Yn&&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&&(rn._active>0&&(rn._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,rn);if(!t||t!==this&&t._isDragging)return;const i=this._targetObject||this.gameObject;if(!i)return;this._isDragging=!0;const n=x.getComponentInChildren(i,wn);Yn&&console.log("DRAG START",n,i),n&&(n.fastMode=!0,n?.requestOwnership()),this._marker=x.addComponent(i,Lc),this._draggingRigidbodies.length=0;const s=x.getComponentsInChildren(i,Ye);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;ln.markDirty(e)}onLastDragEnd(e){if(!this||!this._isDragging)return;this._isDragging=!1;for(const i of this._draggingRigidbodies)i.setVelocity(i.smoothedVelocity);if(this._draggingRigidbodies.length=0,this._targetObject=null,e?.object){const i=x.getComponentInChildren(e.object,wn);i&&(i.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const t=this._dragHelper.selected;Yn&&console.log("DRAG END",t,t?.visible),this._dragHelper.setSelected(null,this.context)}};Lr([u()],Ps.prototype,"dragMode"),Lr([u()],Ps.prototype,"snapGridResolution"),Lr([u()],Ps.prototype,"keepRotation"),Lr([u()],Ps.prototype,"xrDragMode"),Lr([u()],Ps.prototype,"xrKeepRotation"),Lr([u()],Ps.prototype,"xrDistanceDragFactor"),Lr([u()],Ps.prototype,"showGizmo");let jr=Ps;class zR{handlerA;handlerB;context;settings;gameObject;_handlerAAttachmentPoint=new b;_handlerBAttachmentPoint=new b;_followObject;_manipulatorObject;_deviceMode;_followObjectStartWorldQuaternion=new U;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=Y.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?(Yn&&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),Yn){this._followObject.add(new _i(2)),this._manipulatorObject.add(new _i(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)+`
958
+ `+r(this._tempVec1)+`
959
+ `+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 U;_manipulatorScaleOffset=new b;_tempVec1=new b;_tempVec2=new b;_tempVec3=new b;tempLookMatrix=new J;_initialScale=new b;_initialDistance=0;alignManipulator(){if(!this.handlerA||!this.handlerB){console.error("alignManipulator called on MultiTouchDragHandler without valid handlers. This is likely a bug.",this);return}if(!this.handlerA.followObject||!this.handlerB.followObject){console.error("alignManipulator called on MultiTouchDragHandler without valid follow objects. This is likely a bug.",this.handlerA,this.handlerB);return}this._tempVec1.copy(this._handlerAAttachmentPoint),this._tempVec2.copy(this._handlerBAttachmentPoint),this.handlerA.followObject.localToWorld(this._tempVec1),this.handlerB.followObject.localToWorld(this._tempVec2),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._manipulatorObject.position.copy(this._tempVec3);const e=this.context.mainCamera;this.tempLookMatrix.lookAt(this._tempVec3,this._tempVec2,e.worldUp),this._manipulatorObject.quaternion.setFromRotationMatrix(this.tempLookMatrix);const t=this._tempVec1.distanceTo(this._tempVec2);this._manipulatorObject.scale.copy(this._initialScale).multiplyScalar(t/this._initialDistance),this._manipulatorObject.updateMatrix(),this._manipulatorObject.updateMatrixWorld(!0),Yn&&(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=j.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 Sf{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 U;_followObjectStartWorldQuaternion=new U;_lastDragPosRigSpace;_tempVec=new b;_tempMat=new J;_hitPointInLocalSpace=new b;_hitNormalInLocalSpace=new b;_bottomCenter=new b;_backCenter=new b;_backBottomCenter=new b;_bounds=new bi;_dragPlane=new nr(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=Y.active?.rig?.gameObject?.worldScale.x||1;this._grabStartDistance/=i,this._totalMovementAlongRayDirection=0,this._lastDragPosRigSpace=void 0,Yn&&(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 g=e.event.space,f=g.worldPosition;this.gameObject.worldToLocal(f),this._hitPointInLocalSpace.copy(f);const m=g.worldUp;this._tempMat.copy(this.gameObject.matrixWorld).invert(),m.transformDirection(this._tempMat),this._hitNormalInLocalSpace.copy(m)}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 g=new b(0,1,0);this.gameObject.parent&&g.transformDirection(this.gameObject.parent.matrixWorld.clone().invert()),this._dragPlane.setFromNormalAndCoplanarPoint(g,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=Vt([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=Y.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),Yn){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 v=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);h=Math.max(0,v),h=h*h*h}else this._grabStartDistance<=.5&&(d=3);this._followObject.position.copy(this._followObjectStartPosition),a||this._followObject.quaternion.copy(this._followObjectStartQuaternion),this._followObject.position.multiplyScalar(h),this._followObject.updateMatrix();const p=this._hasLastSurfaceHitPoint;this._hasLastSurfaceHitPoint=!1;const g=new ss(n,s);if(l==4){const v=this.context.physics.raycastFromRay(g,{testObject:P=>P!==this.followObject&&P!==i&&P!==t});if(v.length>0){const P=v[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 T=this._draggedOverObjectDuration>=.15,O=this._totalMovement.length()>=.001,A=$(P.normal||P.face.normal).applyQuaternion(P.object.worldQuaternion);if((T||O)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(A)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(P.face.normal);const I=$(),W=$();this._bounds.getCenter(I),this._bounds.getSize(W),I.sub(W.multiplyScalar(.5).multiply(A)),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 D=$(this._hitPointInLocalSpace).add(I);this._followObject.localToWorld(D);const q=P.point;this._dragPlane.setFromNormalAndCoplanarPoint(A,q)}else if(!(T||O))return}}else p&&this.gameObject&&this.setPlaneViewAligned(this.gameObject.worldPosition,!1)}if(l!==1&&g.intersectPlane(this._dragPlane,this._tempVec)){this._followObject.worldPosition=this._tempVec,this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const v=$(this._hitPointInLocalSpace);this._followObject.localToWorld(v),Yn&&F.DrawLine(v,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(v),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const v=this._followObject.worldPosition,P=this.settings.snapGridResolution;v.x=Math.round(v.x/P)*P,v.y=Math.round(v.y/P)*P,v.z=Math.round(v.z/P)*P,this._followObject.worldPosition=v,this._followObject.updateMatrix()}a&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const f=j.clamp01(this.context.time.deltaTime*c*d),m=j.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,m),t.worldQuaternion=_,Yn){const v=this._hitPointInLocalSpace.clone();t.localToWorld(v),F.DrawSphere(v,.02,16711680);const P=this._hitNormalInLocalSpace.clone();P.applyQuaternion(_),F.DrawRay(v,P,16711680),F.DrawLabel(y.add(new b(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
960
+
961
+ Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
962
+
963
+ Session: ${!!Y.active}
964
+
965
+ Device: ${this._deviceMode}
966
+
967
+ `,.03);const T=this._bottomCenter.clone(),O=this._backCenter.clone(),A=this._backBottomCenter.clone();t.localToWorld(T),t.localToWorld(O),t.localToWorld(A),F.DrawSphere(T,.01,65280,0,!1),F.DrawSphere(O,.01,255,0,!1),F.DrawSphere(A,.01,16711935,0,!1),F.DrawLine(T,A,65535,0,!1),F.DrawLine(A,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=$(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 H1{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 nr;_hasGroundPlane=!1;_groundPlane=new nr;_groundOffset=new b;_groundOffsetFactor=0;_groundDistance=0;_groundPlanePoint=new b;_raycaster=new rd;_cameraPlaneOffset=new b;_intersection=new b;_worldPosition=new b;_inverseMatrix=new J;_rbs=[];_groundLine;_groundMarker;static geometry=new pn().setFromPoints([new b(0,0,0),new b(0,-1,0)]);constructor(e){this._camera=e;const t=new ya(H1.geometry),i=t.material;i.color=new ne(.4,.4,.4),t.layers.set(2),t.name="line",t.scale.y=1,this._groundLine=t;const n=new sd(.5,22,22),s=new xe({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&&Tr.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}Tr.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=Z(this._selected);n.y=e.y,e=n}if(mt(this._selected,e),mt(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=Z(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(n,n,n),mt(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=Z(this._selected),t=new ss($(0,.1,0).add(e),$(0,-1,0)),i=new ps;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=$(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 Bw=(o=>(o.File_Spawned="file-spawned",o))(Bw||{});class NR{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 Os;(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 fa(1,1,1,1,1,1),new xe({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 fa(1,1,1,1,1,1),new xe({color:12307660,transparent:!0,opacity:.4}));c.position.y=.5,l.scale.y=.01,l.add(c);const h=new H(new Ln(1,1,1,1),new xe({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})(Os||(Os={}));const Ya=[],Ru=[];var Cf;(o=>{function e(i,n){const s={name:n?.name,priority:n?.priority??0,callback:i};return Ya.push(s),Ya.sort((r,a)=>r.priority===a.priority?0:r.priority>a.priority?-1:1),()=>{const r=Ya.indexOf(s);r>=0&&Ya.splice(r,1)}}o.onCreateCustomModelLoader=e;function t(i){return Ru.push(i),()=>{const n=Ru.indexOf(i);n>=0&&Ru.splice(n,1)}}o.onDetermineModelMimetype=t})(Cf||(Cf={}));const jc=w("debugfileformat");function Fw(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 Uw(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()),jc&&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=zw(i,s,n);return jc&&console.log("[Needle Engine] Determined file type from header: "+r),r}return"unknown"}function zw(o,e,t){if(e.byteLength<4)return"unknown";const i=new Uint8Array(e);jc&&console.warn(`[Needle Engine] Trying to determine file type from binary data
968
+ `,'"'+new TextDecoder().decode(e)+`"
969
+ `,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 Ru){const r=s({url:o,response:t,contentType:t.headers.get("content-type"),bytes:i});if(r)return jc&&console.debug(`Mimetype callback returned: ${r}`),r}if(E()||jc){const s=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));console.warn(`Could not determine file type.
970
+
971
+ Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
972
+
973
+ Content-Type: "${t.headers.get("content-type")}
974
+ "Text: "${s}"
975
+ Binary:`,i)}else console.debug("Could not determine file type from binary data");return"unknown"}var WR=Object.defineProperty,Za=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&WR(e,t,n),n};const Ri=w("debugdroplistener");class VR extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const $R="blob";class Io extends M{dropArea;fitIntoVolume=!1;fitVolumeSize=new b(1,1,1);placeAtHitPosition=!0;useNetworking=!1;onDropped=new he;loadFromURL(e,t){return this.addFromUrl(e,{screenposition:new K,point:t?.point,size:t?.size},!1)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}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)}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){Ri&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(e.guid?.startsWith(this.guid)){const t=e.url;if(console.debug("[DropListener] Received networked event",e),t)if(Array.isArray(t))for(const i of t)this.addFromUrl(i,{screenposition:new K,point:e.point,size:e.size},!0);else this.addFromUrl(t,{screenposition:new K,point:e.point,size:e.size},!0)}};handlePaste=e=>{this.context.connection.allowEditing===!1||e.defaultPrevented||navigator.clipboard.readText().then(t=>{if(t&&(t.startsWith("http")||t.startsWith("https")||t.startsWith("blob"))){const i={screenposition:new K(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(i)&&this.addFromUrl(t,i,!1)}}).catch(console.warn)};onDrag=e=>{this.context.connection.allowEditing!==!1&&e.preventDefault()};onDrop=async e=>{if(this.context.connection.allowEditing===!1||(Ri&&console.log(e),!e?.dataTransfer)||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new K(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const i=e.dataTransfer.items;if(!i)return;const n=[];for(const s in i){const r=i[s];if(r.kind==="file"){const a=r.getAsFile();if(!a)continue;n.push(a)}else r.kind==="string"&&r.type=="text/plain"&&r.getAsString(a=>{this.addFromUrl(a,t,!1)})}n.length>0&&await this.addFromFiles(n,t)};async addFromUrl(e,t,i){Ri&&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=HR(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 Tu.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(Ri&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),Vl($R,null),this._abort?.abort("New files dropped"),this._abort=new AbortController;for(const i of e){if(!i)continue;if(i.type.startsWith("image/")){Ri&&console.warn("Ignoring dropped image file",i.name,i.type);continue}else if(i.name.endsWith(".bin")){Ri&&console.warn("Ignoring dropped binary file",i.name,i.type);continue}console.debug("Load file "+i.name+" + "+i.type);const n=await Tu.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"),Cr.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&&Ci(t,!0,!0);this._addedObjects.length=0,this._addedModels.length=0}onObjectLoaded(e,t,i){const{model:n,contentMD5:s}=e;if(Ri&&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 bi().setFromCenterAndSize(new b(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(Ri&&F.DrawWireBox3(a,255,5),this.fitIntoVolume&&$b(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();Ri&&console.log("Place object at hit",h),Hb(r,d);break}}gs.autoplayAnimations(n);const l=new VR({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){Ri&&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=Vt([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){if(this.dropArea){const t=this.context.input.convertScreenspaceToRaycastSpace(e.screenposition.clone());if(!this.context.physics.raycast({targets:[this.dropArea],screenPoint:t,recursive:!0,testObject:i=>!this._addedObjects.includes(i)}).length)return E()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1}return!0}}Za([u(k)],Io.prototype,"dropArea"),Za([u()],Io.prototype,"fitIntoVolume"),Za([u(b)],Io.prototype,"fitVolumeSize"),Za([u()],Io.prototype,"placeAtHitPosition"),Za([u()],Io.prototype,"useNetworking"),Za([u(he)],Io.prototype,"onDropped");function HR(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 Tu;(o=>{async function e(i,n,s){const r=s.guid,a=new At(r),l=new Blob([i],{type:i.type||Fw(i.name)||void 0}),c=URL.createObjectURL(l),h=await fn().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 g=new FileReader;g.readAsArrayBuffer(i),g.onloadend=async f=>{const m=g.result,y=Cr.hashMD5(m);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 At(n.guid),l=i.toString();Ri&&F.DrawWireSphere(n.point,.1,16711680,3);const c=Os.addPreview({guid:n.guid,parent:n.parent,position:n?.point,size:n?.size}),h=await fn().loadSync(n.context,l,l,a,d=>{c.onProgress(d.loaded/d.total)}).catch(console.warn);if(h){const d=await fetch(l).then(g=>g.arrayBuffer()),p=Cr.hashMD5(d);Ri?setTimeout(()=>Os.removePreview(n.guid),3e3):Os.removePreview(n.guid),s({model:h,contentMD5:p})}else Ri?setTimeout(()=>Os.removePreview(n.guid),3e3):Os.removePreview(n.guid),console.warn("Unsupported file type: "+i.toString())})}o.loadFileFromURL=t})(Tu||(Tu={}));var GR=Object.defineProperty,Pf=(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&&GR(e,t,n),n};const Eu=class G1 extends M{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 At(this.guid);this.object=x.instantiate(this.object,{idProvider:t,keepWorldPosition:!1}),x.getComponent(this.object,G1)?.destroy();let i=this.object.getComponentInChildren(jr);i||(i=this.object.addComponent(jr,{dragMode:xf.SnapToSurfaces}),i.guid=t.generateUUID());let n=x.getComponent(i.gameObject,wn);n||(n=i.gameObject.addComponent(wn),n.guid=t.generateUUID())}this.object.visible=!1;const e=this.gameObject.getComponent(jr);e&&(e.enabled=!1),this._startPosition=this.object.position?.clone()??new b(0,0,0),this._startQuaternion=this.object.quaternion?.clone()??new U(0,0,0,1)}this.gameObject.getComponentInParent(ki)||this.gameObject.addComponent(ki)}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,jr);i?(i.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,i)):E()&&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 Bg(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 An;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}};Pf([u(k)],Eu.prototype,"parent"),Pf([u(k)],Eu.prototype,"object"),Pf([u()],Eu.prototype,"limitCount");let Of=Eu;var Lo=(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))(Lo||{}),qR=Object.defineProperty,kf=(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 Mf{eventID;callback=new he}kf([u()],Mf.prototype,"eventID"),kf([u(he)],Mf.prototype,"callback");class Au extends M{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(Lo.PointerClick)||this.hasTrigger(Lo.PointerDown)||this.hasTrigger(Lo.PointerUp)}onPointerClick(e){this.invoke(Lo.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(Lo.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(Lo.PointerExit)}onPointerDown(e){this.invoke(Lo.PointerDown)}onPointerUp(e){this.invoke(Lo.PointerUp)}}kf([u(Mf)],Au.prototype,"triggers");class Nw{writer;constructor(e){this.writer=e}writeNode(e){}}class XR extends Nw{beforeWriteNode(e,t){F.isGizmo(e)&&(t.keep=!1)}}class Ww extends Nw{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=Ug(new se(1,1,1,0)))}}function Rf(o){const e=Cu.DontExport;return!(o.hideFlags&e)}const Tf=w("debugexr");class QR{get name(){return"EXT_texture_exr"}parser;constructor(e){this.parser=e,Tf&&console.log(e)}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if(Tf&&console.log("EXT_texture_exr.loadTexture",e,n),!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=new gm(i.options.manager);return Tf&&console.log("EXT_texture_exr.loadTexture",s),i.loadTextureImage(e,s.source,r)}}typeof window<"u"&&window.addEventListener("unhandledrejection",o=>{});const jo=gt,Iu="$___Export_Components",YR="NEEDLE_components";class ZR{[ur]}class KR{node;nodeIndex;nodeDef;constructor(e,t,i){this.node=e,this.nodeIndex=t,this.nodeDef=i}}class Vw{get name(){return YR}parser;nodeToObjectMap={};gltf=null;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[Iu]=i,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&jo&&console.log("DONE",JSON.stringify(t)),e[Iu]===void 0)return;const i=e[Iu];delete e[Iu],i!==null&&(e.userData.components=i)}writeNode(e,t){const i=this.writer.json.nodes.length;jo&&console.log(e.name,i,e.uuid);const n=new KR(e,i,t);this.exportContext[i]=n,this.objectToNodeMap[e.uuid]=i}afterParse(e){jo&&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 ZR;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=fn().writeBuiltinComponentData(h,this.context);d!==null&&c.push(d)}c.length>0&&(l[ur]=c,jo&&console.log("DID WRITE",n,"nodeIndex",r,c))}}beforeRoot(){return jo&&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];jo&&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;jo&&console.log("NODE",l);const p=this.nodeToObjectMap[c];if(!p){console.error("Could not find object for node index: "+c,l,t);continue}Yd(p),s.push(this.createComponents(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;_k(r,l)}}}async createComponents(e,t){if(!t)return;const i=t[ur];if(i){const n=new Array;jo&&console.log(e.name,i);for(const s in i){const r=i[s];jo&&console.log("Serialized data",JSON.parse(JSON.stringify(r))),r&&this.parser&&n.push(Og(this.parser,r).catch(a=>console.error(`Error while resolving references (see console for details)
976
+ `,a,e,r))),e.userData=e.userData||{},e.userData[ur]=e.userData[ur]||[],e.userData[ur].push(r)}await Promise.all(n).catch(s=>{console.error("Error while loading components",s)})}}}const $w="NEEDLE_gameobject_data";class JR{get name(){return $w}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[$w];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 Hw="NEEDLE_lighting_settings",Ka=w("debugenvlight");class eT{get name(){return Hw}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[Hw];if(i){Ka&&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,Lu,{},{callAwake:!1})}else{const s=new k;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=x.addComponent(s,Lu,{},{callAwake:!1})}n.sourceId=this.sourceId,n.ambientIntensity=i.ambientIntensity,n.ambientLight=new ne().fromArray(i.ambientLight),Array.isArray(i.ambientTrilight)&&(n.ambientTrilight=i.ambientTrilight.map(s=>new ne().fromArray(s))),n.ambientMode=i.ambientMode,n.environmentReflectionSource=i.environmentReflectionSource}}return null}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context,t=x.findObjectOfType(Lu,e);t?.sourceId&&(t.enabled=!0)});class Lu extends M{ambientMode=Na.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=su.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===su.Skybox?Nn.Skybox:Nn.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),Ka&&window.addEventListener("keydown",t=>{if(!this.destroyed)switch(t.key){case"l":this.enabled=!this.enabled;break}});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*j.lerp(0,1.33,t)}onEnable(){if(Ka&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Na.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new CS(this.ambientLight,this.ambientIntensity*e),Ka&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Na.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new PS(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),Ka&&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(){Ka&&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)}}const Ef=w("debugstencil");function tT(o,e){return(o&1<<e.layer)!=0}const iT=Symbol("stencils");class Js{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if(Ef&&console.log(t,Js.stencils),!t)return;const i=Js.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(tT(s.layer,e)){Ef&&console.log(s),setTimeout(()=>{Vi()&&Kd(e.gameObject)&&(ge("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[iT]=!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[oT];if(i){Ef&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=nT(r.compareFunc),r.passOp=Af(r.passOp),r.failOp=Af(r.failOp),r.zFailOp=Af(r.zFailOp),Js.stencils[this.source]||(Js.stencils[this.source]=[]),Js.stencils[this.source].push(r)}}}return null}}function Af(o){switch(o){case 0:return zS;case 1:return US;case 2:return FS;case 3:return BS;case 4:return DS;case 6:return jS;case 7:return LS;case 5:return IS}return 0}function nT(o){switch(o){case 1:return N0;case 2:return AS;case 3:return ES;case 4:return TS;case 5:return RS;case 6:return MS;case 7:return kS;case 8:return OS}return N0}const oT="NEEDLE_render_objects";var Gw=(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))(Gw||{});const Zn=w("debugcustomshader"),Ja="NEEDLE_techniques_webgl";class sT{objectToWorldMatrix=new J;worldToObjectMatrix=new J;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),ou(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),ou(this.worldToObjectMatrix,this.worldToObject)}}class Me extends W0{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return qw(e),e}constructor(e,...t){super(...t),this.identifier=e,Zn&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&z.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}dispose(){super.dispose();const e=z.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&z.Current.pre_render_callbacks.splice(e,1)}_sphericalHarmonicsName="unity_SpecCube0";_objToWorldName="hlslcc_mtx4x4unity_ObjectToWorld";_worldToObjectName="hlslcc_mtx4x4unity_WorldToObject";static viewProjection=new J;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new J;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new pe;static _mainLightPosition=new b;static _lightData=new pe;_rendererData=new sT;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&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(Me.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),ou(Me.viewProjection,Me._viewProjectionValues)),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Me.viewMatrix.copy(e.matrixWorldInverse),ou(Me.viewMatrix,Me._viewMatrixValues)),this.uniforms[Me._worldSpaceCameraPosName]&&Me._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=Z(n.gameObject,Me._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Me._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Me._mainLightColor};const l=n.intensity;Me._lightData.z=l,this.uniforms.unity_LightData={value:Me._lightData}}if(e&&(Me.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Me._viewProjectionValues),Me.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Me._viewMatrixValues),this.uniforms[Me._worldSpaceCameraPosName]&&(this.uniforms[Me._worldSpaceCameraPosName]={value:Me._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 rT{get name(){return Ja}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return Zn&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[Ja])return Zn&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;Zn&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[Ja].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[Ja];if(!n)return Zn?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;Zn&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await Jk(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();Zn&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new pe(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new pe(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new pe(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new pe(0,0,0,0)});for(const m in p){const y=m;switch(y){case"_TimeParameters":const _=new pe;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 g=!1;if(t.extensions&&t.extensions[Ja]){const m=t.extensions[Ja];if(m.technique===i){Zn&&console.log(t.name,"Material Properties",m);for(const y in m.values){const _=m.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const v=_.substring(10),P=Number.parseInt(v);if(P>=0){const T=await this.parser.getDependency("texture",P);T instanceof Re&&(T.colorSpace=go,T.needsUpdate=!0),d[y]={value:T};continue}}switch(y){case"alphaMode":_==="BLEND"&&(g=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new pe(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Me(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=NS,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=vi;break;case 1:f.side=pd;break;case 2:f.side=ls;break;default:f.side=ls;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=XS;break;case 6:f.depthTest=!0,f.depthFunc=qS;break;case 2:f.depthTest=!0,f.depthFunc=GS;break;case 4:f.depthTest=!0,f.depthFunc=HS;break;case 5:f.depthTest=!0,f.depthFunc=$S;break;case 7:f.depthTest=!0,f.depthFunc=VS;break;case 8:f.depthTest=!1,f.depthFunc=WS;break}f.transparent=g,g&&(f.depthWrite=!1),Zk(d),f.onUpdateUniforms();for(const m in p){const y=m,_=p[m].type;if(d[y]?.value===void 0)switch(_){case Gw.SAMPLER_2D:d[y]={value:Qk},console.warn("Missing/unassigned texture, fallback to white: "+y);break;default:y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[m]);break}}Zn&&console.log(f.uuid,d),qw(f),r(f)}):null}}function qw(o){if(o.uniforms){Zn&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,i){Object.getOwnPropertyDescriptor(o,t)||Object.defineProperty(o,t,{get:()=>o.uniforms[i].value,set:n=>{o.uniforms[i].value=n,o.needsUpdate=!0}})}}const aT=w("debugextensions");let ju;const lT=import("./vendor-JyrX4DVM.min.js").then(o=>o.index$2).then(async o=>(ju=o.GLTFAnimationPointerExtension,ju)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),Dr=new Array;function cT(o){Dr.includes(o)||Dr.push(o)}function hT(o){const e=Dr.indexOf(o);e>=0&&Dr.splice(e,1)}function If(o){if(o instanceof bo){const e=new Vw;return o.register(t=>(e.parser=t,e)),e}return null}class dT{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 Du(o,e,t){const i=t.indexOf("?");i>=0&&(t=t.substring(0,i)),o.register(n=>new JR(n)),o.register(n=>new wk(n)),o.register(n=>new Hk(n,e.lightmaps,t)),o.register(n=>new eT(n,t,e)),o.register(n=>new rT(n,t)),o.register(n=>new Js(n,t)),o.register(n=>new Ve(n)),o.register(n=>new QR(n)),D_()&&o.register(n=>new jl(n)),await lT.catch(n=>{}),o.register(n=>{if(ju){const s=new ju(n);return s.setAnimationPointerResolver.bind(s)(new dT),s}else return(aT||E())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const n of Dr)n.onImport&&n.onImport(o,t,e)}function Lf(o,e){for(const t of Dr)t.onExport&&t.onExport(o,e)}function Xw(o,e,t){for(const i of Dr)i.onLoaded&&i.onLoaded(o,e,t)}class Qw{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const i=this.writer,n=i.extensionsUsed,s={};t.extensions=t.extensions||{},t.extensions[this.name]=s;let r=new J;const a=new Array,l=new Array,c=new Array;for(let g=0;g<e.count;g++){e.getMatrixAt(g,r);let f=new b,m=new U,y=new b;r.decompose(f,m,y),a.push(f.x,f.y,f.z),l.push(m.x,m.y,m.z,m.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 pt(h,3)),ROTATION:i.processAccessor(new pt(d,4)),SCALE:i.processAccessor(new pt(p,3))},n[this.name]=!0}}var uT=Object.defineProperty,Yw=(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&&uT(e,t,n),n};const Dc=w("debugreflectionprobe"),Zw=w("noreflectionprobe"),jf=Symbol("reflectionProbeKey"),Kw=Symbol("original material"),Df=class Zo extends M{static _probes=new Map;static isUsingReflectionProbe(e){return!!(e[jf]||e[Kw]?.[jf])}static get(e,t,i,n){if(!e||e.isObject3D!==!0||Zw)return null;const s=Zo._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 Dc&&console.log("Found reflection probe",e.name,r.name),r}}return Dc&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;set texture(e){if(e&&!(e instanceof Re)){console.error("ReflectionProbe.texture must be a Texture",e);return}this._texture=e,e&&(e.mapping=fo,e.colorSpace=go,e.needsUpdate=!0)}get texture(){return this._texture}center;size;_boxHelper;isInBox(e){return this._boxHelper?.isInBox(e)}constructor(){super(),Zo._probes.has(this.context)||Zo._probes.set(this.context,[]),Zo._probes.get(this.context)?.push(this)}awake(){this._boxHelper=this.gameObject.addComponent(xt),this._boxHelper.updateBox(!0),Dc&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=fo,this._texture.colorSpace=go,this._texture.needsUpdate=!0)}start(){!this._texture&&E()&&(console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`),ge("ReflectionProbe configuration hint: See browser console for details"))}onDestroy(){const e=Zo._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}static _rendererMaterialsCache=new Map;onSet(e){if(Zw||!this.enabled||e.sharedMaterials?.length<=0||!this.texture)return;let t=Zo._rendererMaterialsCache.get(e);t||(t=[],Zo._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 xe)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(Dc){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,`
977
+ `,n.uuid,`
978
+ `,s?.copy.uuid,`
979
+ `,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[jf]=this,c[Kw]=n,Dc&&console.log("Set reflection",e.name,e.guid)}s&&s.copy&&(s.copy.onBeforeCompile=n.onBeforeCompile);const l=s?.copy;l.envMap=this.texture,e.sharedMaterials[i]=l}}onUnset(e){const t=Zo._rendererMaterialsCache.get(e);if(t)for(let i=0;i<t.length;i++){const n=t[i];e.sharedMaterials[i]=n.material}}};Yw([u(b)],Df.prototype,"center"),Yw([u(b)],Df.prototype,"size");let Bc=Df;const li=w("debuginstancing");class ha{static instance=new ha;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),Ve.assignTextureLOD(a.renderer.material,0);for(let l=0;l<e.sharedMeshes.length;l++){const c=e.sharedMeshes[l],h=c.geometry;Ve.assignMeshLOD(c,0).then(d=>{d&&e.activeAndEnabled&&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 li&&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=ha.getStartInstanceCount(e);(!a||a<0)&&(a=4);let l=e.name;l?.length||(l=yb());const c=new pT(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[rc]||i.equals(a)===!1)&&(i.copy(a),e[rc]=!0),a};e.matrixWorld.multiplyMatrices=n}}class ma{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[W_]=t,this.meshInformation=Br(e.geometry),ma.all.push(this)}updateMeshInformation(){const e=Br(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:((E()||li)&&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=ma.all.indexOf(this);t>=0&&ma.all.splice(t,1)}}}class pT{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(),li&&this._batchedMesh.boundingSphere){const i=this._batchedMesh.boundingSphere;F.DrawWireSphere(i.center,i.radius,65280)}}_context;_batchedMesh;_handles=[];_geometryIds=new Map;_maxInstanceCount;_currentInstanceCount=0;_currentVertexCount=0;_currentIndexCount=0;_maxVertexCount;_maxIndexCount;static nullMatrix=new J;canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}_needUpdateBounds=!1;_debugMaterial=null;constructor(e,t,i,n,s){this.name=e,this.geometry=t,this.material=i,this._context=s,this._maxInstanceCount=Math.max(2,n),li&&(this._debugMaterial=Jw());const r=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],n);this._maxVertexCount=r.vertexCount,this._maxIndexCount=r.indexCount,this._batchedMesh=new V0(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh[ac]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),i instanceof W0&&(i.defines.USE_INSTANCING=!0,i.needsUpdate=!0),s.pre_render_callbacks.push(this.onBeforeRender),s.post_render_callbacks.push(this.onAfterRender),li&&console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}dispose(){li&&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 ma(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()})
980
+ `,i),E()){Zl("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.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),li&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,Br(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[ac]===!0&&(li==="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 E()&&console.warn(`BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`),!1;return!0}markNeedsUpdate(){li==="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)return!1;const t=Br(e),i=t.vertexCount,n=t.indexCount;return this._currentVertexCount+i>this._maxVertexCount||this._currentIndexCount+n>this._maxIndexCount}grow(e){const t=Math.ceil(this._maxInstanceCount*2),i=this.tryEstimateVertexCountSize(t,[e]),n=Math.max(this._maxVertexCount,i.vertexCount),s=Math.max(this._maxIndexCount,i.indexCount,Math.ceil(this._maxVertexCount*2));if(li){const l=Br(e);console.warn(`[Instancing] Growing Buffer
981
+ Mesh: "${this.name}${e.name?.length?"/"+e.name:""}"
982
+ ${l.vertexCount} vertices, ${l.indexCount} indices
983
+ Max count ${this._maxInstanceCount} \u2192 ${t}
984
+ Max vertex count ${this._maxVertexCount} -> ${n}
985
+ Max index count ${this._maxIndexCount} -> ${s}`),this._debugMaterial=Jw()}else E()&&console.debug(`[Instancing] Growing Buffer
986
+ Mesh: "${this.name}${e.name?.length?"/"+e.name:""}"
987
+ Max count ${this._maxInstanceCount} \u2192 ${t}
988
+ Max vertex count ${this._maxVertexCount} -> ${n}
989
+ Max index count ${this._maxIndexCount} -> ${s}`);this._maxVertexCount=n,this._maxIndexCount=s;const r=new V0(t,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material);r.layers=this._batchedMesh.layers,r.castShadow=this._batchedMesh.castShadow,r.receiveShadow=this._batchedMesh.receiveShadow,r.visible=this._batchedMesh.visible,r[ac]=this._batchedMesh[ac],r.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,r.matrixWorldNeedsUpdate=this._batchedMesh.matrixWorldNeedsUpdate,r.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,r.matrixWorld.copy(this._batchedMesh.matrixWorld),r.matrix.copy(this._batchedMesh.matrix),this._batchedMesh.dispose(),this._batchedMesh.removeFromParent(),this._geometryIds.clear(),this._batchedMesh=r,this._maxInstanceCount=t;const a=[...this._handles];this._handles=[];for(const l of a)l&&l.__instanceIndex>=0&&(this.addGeometry(l),this._handles[l.__instanceIndex]=l);this._context.scene.add(r)}tryEstimateVertexCountSize(e,t,i=1){const n=new Map;for(const c of this._handles)if(c&&c.__instanceIndex>=0&&c.object.geometry)if(n.has(c.object.geometry)){const h=n.get(c.object.geometry);h.count+=1}else{const h={count:1,...Br(c.object.geometry)};n.set(c.object.geometry,h)}let s=0,r=0;for(const[c,h]of n)s+=h.vertexCount*h.count,r+=h.indexCount*h.count;let a=Math.ceil(s/Math.max(1,this._currentInstanceCount))*e,l=Math.ceil(r/Math.max(1,this._currentInstanceCount))*e*2;if(t)for(const c of t){const h=Br(c);h!=null&&(a+=h.vertexCount*i,l+=h.indexCount*i)}return{vertexCount:a,indexCount:l}}addGeometry(e){const t=e.object.geometry;if(!t)return;let i=this._geometryIds.get(t);i==null?(li&&console.debug(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
990
+ ${this._currentInstanceCount} instances, ${e.maxVertexCount} max vertices, ${e.maxIndexCount} max indices`),i=this._batchedMesh.addGeometry(t,e.maxVertexCount,e.maxIndexCount),this._geometryIds.set(t,i)):li==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
991
+ GEOMETRY_ID=${i}
992
+ ${this._currentInstanceCount} instances`),this._currentVertexCount+=e.maxVertexCount,this._currentIndexCount+=e.maxIndexCount;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),li&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
993
+ GEOMETRY_ID=${i}
994
+ ${this._currentInstanceCount} instances
995
+ Index: ${e.__instanceIndex}`)}removeGeometry(e,t){if(e.__instanceIndex<0){console.warn("Cannot remove geometry, instance index is invalid",e.name);return}li&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
996
+ GEOMETRY_ID=${e.__geometryIndex}
997
+ ${this._currentInstanceCount} instances
998
+ Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}function Br(o){if(!o)return E()&&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=Ve.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 Jw(){const o=new ut({color:new ne(Math.random(),Math.random(),Math.random())});return o.emissive=o.color,o.emissiveIntensity=.3,w("wireframe")&&(o.wireframe=!0),o}const el=w("debuglightmaps");class Bu{get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.lightmapTexture&&Ve.assignTextureLOD(this.lightmapTexture,0).then(t=>{t?.isTexture&&(this.lightmapTexture=t)}))}lightmapIndex=-1;lightmapScaleOffset=new pe(1,1,0,0);context;gameObject;lightmapTexture=null;lightmapScaleOffsetUniform={value:new pe(1,1,0,0)};lightmapUniform={value:null};constructor(e,t){this.gameObject=e,this.context=t}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,Ve.assignTextureLOD(i,0).then(n=>{n?.isTexture&&(this.lightmapTexture=n)}),el=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
999
+ ScaleOffset:`,t,`
1000
+ Texture:`,i),this.setLightmapDebugMaterial()):el&&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"){el&&console.warn("Can not add lightmap. Is this object missing a renderer?",this.gameObject.name);return}if(this.gameObject.type==="Group"){this.gameObject["Needle:Multimaterial-LightmapWarning"]===void 0&&(this.gameObject["Needle:Multimaterial-LightmapWarning"]=!0,console.warn("Lightmap on multimaterial object is not supported yet... please open a feature request on https://github.com/needle-tools/needle-engine-support if your project requires it"));return}console.assert(this.gameObject.type==="Mesh","Lightmap only works on meshes",this);const e=this.gameObject;if(e.geometry.getAttribute("uv1")||e.geometry.setAttribute("uv1",e.geometry.getAttribute("uv")),Array.isArray(this.gameObject.material)){const t=this.gameObject.material;for(let i=0;i<t.length;i++)t[i]=this.ensureLightmapMaterial(t[i])}else this.gameObject.material=this.ensureLightmapMaterial(this.gameObject.material);if(this.lightmapIndex>=0&&this.lightmapTexture){this.lightmapTexture.channel=1;const t=this.gameObject.material;if(Array.isArray(t))for(const i of t)this.assignLightmapTexture(i);else t&&this.assignLightmapTexture(t)}}ensureLightmapMaterial(e){if(e.userData||(e.userData={}),e["NEEDLE:lightmap-material-version"]!=e.version&&e["NEEDLE:lightmap-material-version"]==null){el&&console.warn("Cloning material for lightmap "+e.name);const t=e.clone();t.name?.includes("(lightmap)")||(t.name=e.name+" (lightmap)"),e=t,e.onBeforeCompile=this.onBeforeCompile}return e}assignLightmapTexture(e){!e||e instanceof hm&&e.transmission>0||!(e.lightMap!==this.lightmapTexture||e["NEEDLE:lightmap-material-version"]!==e.version)||(el&&console.log("Assigning lightmap",e.name,e.version,e),e.lightMap=this.lightmapTexture,e["NEEDLE:lightmap-material-version"]=e.version)}onBeforeCompile=(e,t)=>{el&&console.log(`Lightmaps, before compile
1001
+ `,e),this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,this.lightmapUniform.value=this.lightmapTexture,e.uniforms.lightmapScaleOffset=this.lightmapScaleOffsetUniform};setLightmapDebugMaterial(){this.gameObject.material=new jn({vertexShader:`
1002
+ varying vec2 vUv1;
1003
+ void main()
1004
+ {
1005
+ vUv1 = uv1;
1006
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1007
+ }
1008
+ `,fragmentShader:`
1009
+ uniform sampler2D lightMap;
1010
+ uniform float lightMapIntensity;
1011
+ uniform vec4 lightmapScaleOffset;
1012
+ varying vec2 vUv1;
1013
+
1014
+ // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
1015
+ vec4 conv_sRGBToLinear( in vec4 value ) {
1016
+ 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 );
1017
+ }
1018
+
1019
+ void main() {
1020
+ vec2 lUv = vUv1.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
1021
+
1022
+ vec4 lightMapTexel = texture2D( lightMap, lUv);
1023
+ gl_FragColor = lightMapTexel;
1024
+ gl_FragColor.a = 1.;
1025
+ }
1026
+ `,defines:{USE_LIGHTMAP:""}})}}var mT=Object.defineProperty,Do=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&mT(e,t,n),n};const tl=w("debugrenderer"),ex=w("debugskinnedmesh"),tx=w("noinstancing"),gT=w("wireframe");class ix{path=null;asset=null;default}class fT{_renderer;_targets=[];_indexMapMaxIndex;_indexMap;_changed=!1;get changed(){return this._changed}set changed(e){e===!0&&tl&&console.warn("SharedMaterials have changed: "+this._renderer.name,this),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 g=t[p];if(!g){r=!0;continue}if(d.name===g.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),Vi()&&ge("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 ve&&(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 Kn=class qp extends M{static setInstanced(e,t){const i=uc(e,qp);return i.setInstancingEnabled(t),i}static isInstanced(e){const t=vr(e,qp);return t?t.isInstancingActive:ln.isUsingInstancing(e)}static setVisible(e,t){Oo(e,t)}receiveShadows=!1;shadowCastingMode=0;lightmapIndex=-1;lightmapScaleOffset=new pe(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 ve?this.sharedMaterials[i]=n:t||(t=!0,console.warn("Can not assign null as material: "+this.name,n))}}}get sharedMaterials(){return this.__didAwake?((!this._sharedMaterials||!this._sharedMaterials.is(this))&&(this._originalMaterials||(this._originalMaterials=[]),this._sharedMaterials=new fT(this,this._originalMaterials)),this._sharedMaterials):null}static get shouldSuppressInstancing(){return tx}_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,tl&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&tl&&this.probeAnchor.add(new _i(.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,qp))){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.applyLightmapping(),gT)for(let e=0;e<this.sharedMaterials.length;e++){const t=this.sharedMaterials[e];t&&(t.wireframe=!0)}}applyLightmapping(){if(this.lightmapIndex>=0){const e=this.gameObject.type,t=this._lightmapTextureOverride!==void 0?this._lightmapTextureOverride:this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex);if(t){if(this._lightmaps||(this._lightmaps=[]),e==="Mesh"){const i=this.gameObject.material;if(i?.isMeshBasicMaterial)i&&console.warn("Lightmapping is not supported on MeshBasicMaterial",i.name);else{if(this._lightmaps.length<=0){const n=new Bu(this.gameObject,this.context);this._lightmaps.push(n)}this._lightmaps[0].init(this.lightmapIndex,this.lightmapScaleOffset,t)}}else if(this.isMultiMaterialObject(this.gameObject)&&this.sharedMaterials.length>0)for(let i=0;i<this.gameObject.children.length;i++){const n=this.gameObject.children[i];if(!n.material?.isMeshBasicMaterial){let s;i>=this._lightmaps.length?(s=new Bu(n,this.context),this._lightmaps.push(s)):s=this._lightmaps[i],s.init(this.lightmapIndex,this.lightmapScaleOffset,t)}}}else tl&&console.warn("Lightmap not found",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=ha.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&&!tx&&(this.setInstancingEnabled(!0),ln.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()),tl==this.name&&this.gameObject instanceof H){this.gameObject.geometry.computeBoundingSphere();const e=$(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[rc]===!0){this.gameObject[rc]=!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];Oo(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&&!Bc.isUsingReflectionProbe(e)&&(e.envMap=this.context.scene.environment);else tl&&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.mainCameraComponent?.environmentIntensity??1;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];Oo(t.object,!0)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onUnset(this),this.static&&this.gameObject.matrixAutoUpdate&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){Js.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(),we.LateUpdate),this._probeAnchorLastFrame=this.probeAnchor)}*_updateReflectionProbe(){const e=this.probeAnchor||this.gameObject,t=!!this.probeAnchor;this._reflectionProbe=Bc.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Oo(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Oo(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};Do([u()],Kn.prototype,"receiveShadows"),Do([u()],Kn.prototype,"shadowCastingMode"),Do([u()],Kn.prototype,"lightmapIndex"),Do([u(pe)],Kn.prototype,"lightmapScaleOffset"),Do([u()],Kn.prototype,"enableInstancing"),Do([u()],Kn.prototype,"renderOrder"),Do([u()],Kn.prototype,"allowOcclusionWhenDynamic"),Do([u(k)],Kn.prototype,"probeAnchor"),Do([u()],Kn.prototype,"reflectionProbeUsage");let Ti=Kn;class Fc extends Ti{}class Bf extends Fc{_needUpdateBoundingSphere=!1;awake(){super.awake(),ex&&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 as){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,i=X0(e);i&&(e.geometry=i),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(ex){for(const e of this.sharedMeshes)if(e instanceof as&&e.boundingSphere){const t=$(e.boundingSphere.center).applyMatrix4(e.matrixWorld);F.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var yT=Object.defineProperty,nx=(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 Fu=w("debuggltfexport");class Ff extends xt{sceneRoot}const Uf=class El extends M{binary=!0;objects=[];ext;async exportNow(e,t){Fu&&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:El.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?El.saveArrayBuffer(n,e):El.saveJson(n,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const i=new K0;i.register(c=>new Qw(c)),i.register(c=>new Ww(c)),Lf(i,this.context),El.filterTopmostParent(e);const n={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||El.collectAnimations(e),...t},s=new Array,r=new k;t?.pivot&&r.position.sub(t.pivot),Fu&&console.log("EXPORT",e),e.forEach(c=>{c&&Rf(c)&&(r.children.push(c),c.matrixAutoUpdate=!1,c.matrix.copy(c.matrixWorld),x.getComponentsInChildren(c,Ti).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}),c.traverse(h=>{if(!Rf(h)){const d=h.parent;h.removeFromParent(),s.push(()=>{d&&d.add(h)})}}))});const a=new Rg(r);return t?.needleComponents&&(this.ext=new Vw),this.ext&&(this.ext.registerExport(i),this.ext.context=a),new Promise((c,h)=>{Fu&&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()),Fu&&console.log("Finished glTF export.")}});function l(){e.forEach(c=>{c&&(c.matrixAutoUpdate=!0,x.getComponentsInChildren(c,Ti).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(Z(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}}}};nx([u()],Uf.prototype,"binary"),nx([u(k)],Uf.prototype,"objects");let zf=Uf;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 bT=w("debugprogress");function ox(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 re{static start(e,t){typeof t=="string"&&(t={parentScope:t});const i=new _T(e,t);Uc.set(e,i)}static report(e,t){const i=Uc.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=Uc.get(e);t&&(t.end(),Uc.delete(e))}}const Uc=new Map;class _T{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?Uc.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??!!bT,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 De="</StageRoot/Materials";function vT(o,e,t){const i=new Map,n=m=>{const y=m.type___needle,_=i.get(y)||new Map;if(i.set(y,_),!_.has(m)){const v=`${y}${_.size?`_${_.size}`:""}`;_.set(m,v)}return _.get(m)},s=o.colorNode?Uu(o.colorNode):[],r=o.colorNode?`color3f inputs:diffuseColor.connect = ${De}/${e}/${n(s.values().next().value)}.outputs:out>`:"",a=o.roughnessNode?Uu(o.roughnessNode):[],l=o.roughnessNode?`float inputs:roughness.connect = ${De}/${e}/${n(a.values().next().value)}.outputs:out>`:"",c=o.normalNode?Uu(o.normalNode):[],h=o.normalNode?`float3 inputs:normal.connect = ${De}/${e}/${n(c.values().next().value)}.outputs:out>`:"",d=o.metalnessNode?Uu(o.metalnessNode):[],p=o.metalnessNode?`float inputs:metallic.connect = ${De}/${e}/${n(d.values().next().value)}.outputs:out>`:"",g=new Set([...s,...a,...c,...d]),f=ST(g,e,t,n);return console.debug(f),`
1027
+
1028
+ def Material "${e}" ${o.name?`(
1029
+ displayName = "${o.name}"
1030
+ )`:""}
1031
+ {
1032
+ token outputs:mtlx:surface.connect = ${De}/${e}/N_mtlxsurface.outputs:surface>
1033
+
1034
+ def Shader "N_mtlxsurface"
1035
+ {
1036
+ uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
1037
+ ${r}
1038
+ ${l}
1039
+ ${h}
1040
+ ${p}
1041
+ token outputs:surface
1042
+ }
1043
+
1044
+ ${f}
1045
+
1046
+ }`}function Uu(o){const e=m=>{if(m.nodeType)return m.nodeType;switch(m.type){case"TimerNode":return"float";case"TextureNode":return;case"ConvertNode":return m.convertTo;default:return}},t=m=>{const y=new Set,_=v=>{if(!(!v.isNode||y.has(v))){v.nodeType___needle||(v.nodeType___needle=e(v)),v.shaderNode?(v.type___needle="ShaderCallNodeInternal",v.shaderNodeLayoutName___needle=v.shaderNode.layout.name.slice(3)):v.type___needle=v.type,y.add(v);for(const P in v)v[P]?.isNode&&(_(v[P]),v.nodeType___needle||=v[P].nodeType___needle),Array.isArray(v[P])&&v[P].forEach(T=>{T.isNode&&(_(T),v.nodeType___needle||=T.nodeType___needle)})}};return _(m),y},i=m=>{if(m.type==="ConvertNode"){if(m.convertTo===m.node.nodeType___needle)return!0;if(m.node.type==="ConstNode"){if(m.convertTo==="vec4"&&m.node.value.isVector4||m.convertTo==="vec3"&&m.node.value.isVector3||m.convertTo==="vec2"&&m.node.value.isVector2||m.convertTo==="color"&&m.node.value.isColor||m.convertTo==="float"&&typeof m.node.value=="number")return!0}else if(m.node.type=="SplitNode"&&m.convertTo=="float"&&m.node.components.length===1)return!0}return!1},n=m=>{for(;s(m);)!m.node&&m.shaderNode?m=m.inputNodes[0]:m=m.node??m.aNode??m.bNode??m.cNode;return m},s=m=>{const y=["UniformNode","UniformGroupNode","ShaderNodeInternal"];return!m||i(m)||y.includes(m.type___needle)||m.type___needle===void 0},r=(m,y)=>{for(const _ of y)for(const v in _){if(_[v]?.isNode&&_[v]===m)return{parent:_,label:v};if(Array.isArray(_[v])&&_[v].find(P=>P.isNode&&P===m))return{parent:_,label:v}}return null},a=(m,y)=>{if(m.shaderNode)m.inputNodes[0]=n(m.inputNodes[0]);else if(Array.isArray(m.nodes))for(let _=0;_<m.nodes.length;_++)m.nodes[_]&&s(m.nodes[_])&&(m.nodes[_]=n(m.nodes[_]));else y.forEach(_=>{m[_]&&s(m[_])&&(m[_]=n(m[_]))})},l=m=>{m.type==="MathNode"&&m.method==="mix"&&(m.cNode.nodeType___needle="float",m.cNode.type==="ConvertNode"&&(m.cNode.convertTo="float"))},c=(m,y)=>{y.label==="cNode"&&y.parent.type==="MathNode"&&y.parent.method==="mix"||(y.parent.type==="JoinNode"?m.nodeType___needle="float":m.nodeType___needle=y.parent.nodeType___needle)},h=m=>m?.type==="ConvertNode"&&m.nodeType___needle==="color"&&m.node.nodeType___needle==="vec4",d=(m,y)=>{m.convertTo="vec3",m.nodeType___needle="vec3";const _={type:"ConvertNode",convertTo:"color",node:m,isNode:!0,nodeType___needle:"color",type___needle:"ConvertNode"},v=r(m,y);return v?.parent&&(v.parent[v.label]=_),_},p=m=>m?.type==="ConvertNode"&&m.node.type==="TextureNode"&&m.nodeType___needle!==m.node.nodeType___needle,g=m=>{const y=new Set;for(let _ of m)if(!s(_)){if(l(_),_.type=="SplitNode"){const v=r(_,m);if(_.components.length===1)_.nodeType___needle="float";else if(v)_.nodeType___needle=v.parent.nodeType___needle;else throw new Error("SplitNode without parent found, this should not happen")}if(a(_,["node","aNode","bNode","cNode"]),_.type=="ConstNode"&&_.nodeType==null&&c(_,r(_,m)),h(_)&&y.add(d(_,m)),p(_)){_.node.nodeType___needle=_.convertTo;const v=r(_,m);v?.parent&&(v.parent[v.label]=_.node),_=_.node}y.add(_)}return y},f=t(o);return g(f)}function wT(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 xT(o,e,t,i){const n=" ",s=g=>({float:"float",vec2:"vector2",vec3:"vector3",vec4:"vector4",color:"color3"})[g]||"float",r=g=>({float:"float",vec2:"float2",vec3:"float3",vec4:"float4",color:"color3f"})[g]||"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 = ${wT(o.value,h)}`);break;case"JoinNode":d="combine"+o.nodes.length+"_"+c;let g=1;for(const v of o.nodes)p.push(`float inputs:in${g++}.connect = ${De}/${e}/${t(v)}.outputs:out>`);break;case"ConvertNode":d="convert_"+s(o.node.nodeType___needle)+"_"+c,o.node&&p.push(`${r(o.node.nodeType___needle)} inputs:in.connect = ${De}/${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 = ${De}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode&&!o.cNode&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in1.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:in2.connect = ${De}/${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 = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:low.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.cNode.nodeType___needle)} inputs:high.connect = ${De}/${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 = ${De}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:bg.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`float inputs:mix.connect = ${De}/${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 = ${De}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode){const v=r(o.aNode.nodeType___needle),P=r(o.bNode.nodeType___needle);(v==="color3f"&&P==="float"||P==="float"&&P==="color3f")&&(d=f+"_color3FA"),p.push(`${v} inputs:in1.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${P} inputs:in2.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`)}break;case"TextureNode":o.uvNode?(d="tiledimage_"+c,p.push(`float2 inputs:texcoord.connect = ${De}/${e}/${t(o.uvNode)}.outputs:out>`)):d="image_"+c;const m=o._value,y=Xf.includes(m.format),_=CT(m);p.push(`asset inputs:file = @textures/${_}.${y?"png":"jpg"}@`),i[_]={texture:m,scale:void 0};break;case"NormalMapNode":h="float3",d="normalmap",p.push(`${h} inputs:in.connect = ${De}/${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 = ${De}/${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 = ${De}/${e}/${t(o.node)}.outputs:out>`),p.push(`string inputs:channels = "${o.components}"`);break}return`
1047
+ ${n}def Shader "${t(o)}"
1048
+ ${n}{
1049
+ ${n}uniform token info:id = "ND_${d}"
1050
+ ${n}${h} outputs:out
1051
+ ${n}${p.length>0?p.join(`
1052
+ `):""}
1053
+ ${n}}
1054
+ `}function ST(o,e,t,i){let n="";for(const s of o)n+=xT(s,e,i,t);return n}function CT(o){return Ji(o.name)+"_"+(o.source?.id??o.id)}function Ji(o){return o=o.replace(/[^a-zA-Z0-9_]/g,""),o.match(/^[a-zA-Z_]/)||(o="_"+o),o}function sx(o){return o=o.replace('"','\\"'),o}function rx(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 ax(o){const e=rx(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 PT=new b,OT=new U,kT=new b(1,1,1);class it{static USDObject_export_id=0;uuid;name;type;extraSchemas=[];displayName;visibility;getMatrix(){if(!this.transform)return new J;const{position:e,quaternion:t,scale:i}=this.transform,n=new J;return n.compose(e||PT,t||OT,i||kT),n}setMatrix(e){if(!e||!(e instanceof J)){this.transform=null;return}const t=new b,i=new U,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 it(mo.generateUUID(),e.name+"_empty_"+it.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 it(mo.generateUUID(),"Empty_"+it.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=Ji(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 it(mo.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 Nf extends it{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}
1055
+ `;const c=a;return`#usda 1.0
1056
+ (
1057
+ customLayerData = {
1058
+ string creator = "Needle Engine ${gn}"
1059
+ dictionary Needle = {
1060
+ bool animations = ${t?1:0}
1061
+ bool interactive = ${i?1:0}
1062
+ bool physics = ${n?1:0}
1063
+ bool quickLookCompatible = ${e.quickLookCompatible?1:0}
1064
+ }
1065
+ }
1066
+ defaultPrim = "${Ji(this.name)}"
1067
+ metersPerUnit = 1
1068
+ upAxis = "Y"
1069
+ startTimeCode = ${s}
1070
+ endTimeCode = ${r}
1071
+ timeCodesPerSecond = 60
1072
+ framesPerSecond = 60
1073
+ doc = """Generated by Needle Engine USDZ Exporter ${gn}"""
1074
+ ${c}
1075
+ )
1076
+ `}}const il=`
1077
+ `,Xt="</StageRoot/Materials";class lx{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+=il,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=il,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+il}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=il,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+il}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=il}toString(){return this.str}applyIndent(e){let t="";for(let i=0;i<this.indent;i++)t+=" ";return t+e}}class MT{root;exporter;extensions=[];quickLookCompatible;exportInvisible;materials;textures;files;document;output;animations;constructor(e,t,i){this.root=e,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 Nf,this.output="",this.animations=[]}}class Wf{ar={anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}};quickLookCompatible=!1;extensions=[];maxTextureSize=4096;exportInvisible=!1}let cx=class{debug;pruneUnusedNodes;sceneAnchoringOptions=new Wf;extensions=[];keepObject;beforeWritingDocument;constructor(){this.debug=!1,this.pruneUnusedNodes=!0}async parse(o,e=new Wf){e=Object.assign(new Wf,e),this.sceneAnchoringOptions=e;const t=new MT(o,this,e);this.extensions=t.extensions;const i=t.files,n="model.usda";i[n]=null;const s=t.materials,r=t.textures;re.report("export-usdz","Invoking onBeforeBuildDocument"),await zu(t,"onBeforeBuildDocument"),re.report("export-usdz","Done onBeforeBuildDocument"),re.report("export-usdz","Reparent bones to common ancestor");const a=[],l=new Set;o?.traverse(m=>{if(!(!e.exportInvisible&&!m.visible)&&m instanceof as){const y=m.skeleton.bones,_=rx(y);if(_){const v={object:m,originalParent:m.parent,newParent:_};a.push(v),l.add(v.object.uuid),v.newParent&&l.add(v.newParent.uuid),v.originalParent&&l.add(v.originalParent.uuid)}}});for(const m of a){const{object:y,originalParent:_,newParent:v}=m;v.add(y)}re.report("export-usdz","Traversing hierarchy"),o&&hx(o,t.document,t,this.keepObject),re.report("export-usdz","Invoking onAfterBuildDocument"),await zu(t,"onAfterBuildDocument");const c=t.extensions.find(m=>m.extensionName==="Behaviour")?.getAllTargetUuids()??new Set;if(this.pruneUnusedNodes){const m={allBehaviorTargets:c,debug:!1,boneReparentings:l,quickLookCompatible:t.quickLookCompatible};this.debug&&dx(t.document,"Hierarchy BEFORE pruning",m),ux(t.document,m),this.debug&&dx(t.document,"Hierarchy AFTER pruning")}else this.debug&&console.log("Pruning of empty nodes is disabled. This may result in a larger USDZ file.");re.report("export-usdz",{message:"Parsing document",autoStep:10}),await RT(t,()=>(re.report("export-usdz","Building materials"),BT(s,r,e.quickLookCompatible))),re.report("export-usdz","Invoking onAfterSerialize"),await zu(t,"onAfterSerialize");for(const m of a){const{object:y,originalParent:_,newParent:v}=m;_&&_.add(y)}t.exporter?.beforeWritingDocument?.();const h=t.document.buildHeader(t)+`
1078
+ `+t.output;this.debug&&console.log(h),i[n]=J0(h),t.output="",re.report("export-usdz",{message:"Exporting textures",autoStep:10}),re.start("export-usdz-textures",{parentScope:"export-usdz",logTimings:!1});const d=new ir({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}),p=Object.keys(r).length;re.report("export-usdz-textures",{totalSteps:p*3,currentStep:0});const g=async m=>{const y=r[m],_=y.texture,v=Xf.includes(_.format);let P={imageData:_.image};re.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const T=y.scale!==void 0&&y.scale.x!==1&&y.scale.y!==1&&y.scale.z!==1&&y.scale.w!==1;(_.isCompressedTexture||_.isRenderTargetTexture||T)&&(P=await mx(_,e.maxTextureSize,d,y.scale)),re.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const O=await ET(P.imageBitmap||P.imageData,e.maxTextureSize).catch(A=>{console.error("Error converting texture to canvas",_,A)});if(O){re.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const A=await O.convertToBlob({type:v?"image/png":"image/jpeg",quality:.95});i[`textures/${m}.${v?"png":"jpg"}`]=new Uint8Array(await A.arrayBuffer())}else console.warn("Can`t export texture: ",_)};for(const m in r)await g(m);d.dispose(),re.end("export-usdz-textures");let f=0;for(const m in i){const y=i[m],_=34+m.length;f+=_;const v=f&63;if(v!==4){const P=64-v,T=new Uint8Array(P);i[m]=[y,{extra:{12345:T}}]}f=y.length}return re.report("export-usdz","zip archive"),MC(i,{level:0})}};function hx(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 as)&&(s=o.geometry,r=o.material),i&&!i(o)&&(s=void 0,r=void 0),(o instanceof H||o instanceof as)&&r&&typeof r=="object"&&(r instanceof ut||r instanceof xe||r.isMeshPhysicalNodeMaterial||r instanceof ve&&r.type==="MeshLineMaterial")){const l=Vu(o),c=o instanceof as?o:null;n=new it(o.uuid,l,a,s,r,void 0,c,o.animations)}else if(o instanceof ce||o instanceof od){const l=Vu(o);n=new it(o.uuid,l,a,void 0,void 0,o)}else{const l=Vu(o);n=new it(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=Vu(o),c=new it(o.uuid,l,{position:o.position,quaternion:o.quaternion,scale:o.scale});e&&e.add(c),e=c}for(const l of o.children)hx(l,e,t,i)}function dx(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 ux(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=ux(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 RT(o,e){re.start("export-usdz-resources","export-usdz");const t=[];for(const l of o.document.children)px(l,o,t);const i=t.length;for(let l=0;l<i;l++)re.report("export-usdz-resources",{totalSteps:i,currentStep:l}),await new Promise((c,h)=>{t[l](),c()});re.end("export-usdz-resources");const n=new lx,s=o.exporter.sceneAnchoringOptions.ar;n.beginBlock(`def Xform "${o.document.name}"`),n.beginBlock(`def Scope "Scenes" (
1079
+ kind = "sceneLibrary"
1080
+ )`),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=l=>{if(!l)return 0;let c=1;for(const h of l.children)c+=r(h);return c},a=r(o.document);re.start("export-usdz-xforms","export-usdz"),re.report("export-usdz-xforms",{totalSteps:a,currentStep:1});for(const l of o.document.children)yx(l,n,o);re.end("export-usdz-xforms"),re.report("export-usdz","invoke onAfterHierarchy"),await zu(o,"onAfterHierarchy",n),n.closeBlock(),n.closeBlock(),n.appendLine(e()),n.closeBlock(),re.report("export-usdz","write to string"),o.output+=n.toString()}function px(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/"+$f(i,o.name)+".usda";if(!(s in e.files)){const r=()=>{const a=LT(i,o.skinnedMesh?.skeleton?.bones,e.quickLookCompatible);e.files[s]=IT(a)};t.push(r)}}else console.warn("NeedleUSDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",n?.name);n&&(n.uuid in e.materials||(e.materials[n.uuid]=n));for(const s of o.children)px(s,e,t)}async function zu(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 Nu=null,Qt=null,Vf,nl,Wu;async function mx(o,e=1/0,t=null,i=void 0){Vf||(Vf=new Ln(2,2,1,1)),nl||(nl=new jn({uniforms:{blitTexture:new Ni(o),flipY:new Ni(!1),scale:new Ni(new pe(1,1,1,1))},vertexShader:`
1081
+ varying vec2 vUv;
1082
+ uniform bool flipY;
1083
+ void main(){
1084
+ vUv = uv;
1085
+ if (flipY)
1086
+ vUv.y = 1. - vUv.y;
1087
+ gl_Position = vec4(position.xy * 1.0,0.,.999999);
1088
+ }`,fragmentShader:`
1089
+ uniform sampler2D blitTexture;
1090
+ uniform vec4 scale;
1091
+ varying vec2 vUv;
1092
+
1093
+ void main(){
1094
+ gl_FragColor = vec4(vUv.xy, 0, 1);
1095
+
1096
+ #ifdef IS_SRGB
1097
+ gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
1098
+ #else
1099
+ gl_FragColor = texture2D( blitTexture, vUv);
1100
+ #endif
1101
+
1102
+ gl_FragColor.rgba *= scale.rgba;
1103
+ }`}));const n=nl.uniforms;n.blitTexture.value=o,n.flipY.value=!1,n.scale.value=new pe(1,1,1,1),i!==void 0&&n.scale.value.copy(i),nl.defines.IS_SRGB=o.colorSpace==yo,nl.needsUpdate=!0,Wu||(Wu=new H(Vf,nl),Wu.frustumCulled=!1);const s=new ce,r=new yi;r.add(Wu),t||(t=Nu=new ir({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const a=Math.min(o.image.width,e),l=Math.min(o.image.height,e);Qt&&(Qt.width!==a||Qt.height!==l)&&(Qt.dispose(),Qt=null),Qt||(Qt=new Dn(a,l,{format:ld,type:QS,minFilter:md,magFilter:md})),t.setRenderTarget(Qt),t.setSize(a,l),t.clear(),t.render(r,s),Nu&&(Nu.dispose(),Nu=null);const c=new Uint8ClampedArray(Qt.width*Qt.height*4);t.readRenderTargetPixels(Qt,0,0,Qt.width,Qt.height,c);const h=new ImageData(c,Qt.width,Qt.height,void 0),d=await createImageBitmap(h,{premultiplyAlpha:"none"});return{imageData:h,imageBitmap:d}}function TT(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 ET(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 gx(o,e=void 0,t=!1,i=4096){if(TT(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 g=0;g<p.length;g+=4)p[g+0]=p[g+0]*a,p[g+1]=p[g+1]*l,p[g+2]=p[g+2]*c,p[g+3]=p[g+3]*h;r.putImageData(d,0,0)}return s}else throw new Error("NeedleUSDZExporter: No valid image data found. Unable to process texture.")}const Oe=7;function AT(){return`#usda 1.0
1104
+ (
1105
+ customLayerData = {
1106
+ string creator = "Needle Engine USDZExporter"
1107
+ }
1108
+ metersPerUnit = 1
1109
+ upAxis = "Y"
1110
+ )
1111
+ `}function IT(o,e){let t=AT();return t+=o,J0(t)}function Vu(o){return o.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+o.id}function fx(o){return Ji(o.name||"bone_"+o.uuid)}function $f(o,e){return Ji(o.name||"Geometry")+"_"+o.id}function $u(o){return Ji(o.name||"Material")+"_"+o.id}function ol(o,e){let t=fx(o),i=o.parent;for(;i&&i!==e;)t=fx(i)+"/"+t,i=i.parent;return t}function yx(o,e,t){if(o==null)return;re.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 g of o.animations)t.animations.push(g);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 xe&&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===vi&&!l?e.appendLine(`prepend references = @./geometries/${$f(n)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${$f(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(g=>`"${g}"`).join(", ")}]`)),o.displayName&&e.appendLine(`displayName = "${sx(o.displayName)}"`),(r||o.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),n&&s){if(!d){const g=$u(s);e.appendLine(`rel material:binding = </StageRoot/Materials/${g}>`)}!t.quickLookCompatible&&s.side===vi&&(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 = (${ae(i.position.x)}, ${ae(i.position.y)}, ${ae(i.position.z)})`)),i.quaternion&&(o.needsOrient=!0,e.appendLine(`quatf xformOp:orient = (${ae(i.quaternion.w)}, ${ae(i.quaternion.x)}, ${ae(i.quaternion.y)}, ${ae(i.quaternion.z)})`)),i.scale&&(o.needsScale=!0,e.appendLine(`double3 xformOp:scale = (${ae(i.scale.x)}, ${ae(i.scale.y)}, ${ae(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(Oe)}`),e.appendLine(`float verticalAperture = ${((Math.abs(r.top)+Math.abs(r.bottom))*10).toPrecision(Oe)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in r&&r.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${r.near.toPrecision(Oe)}, ${r.far.toPrecision(Oe)})`),e.appendLine(`float focalLength = ${r.getFocalLength().toPrecision(Oe)}`),e.appendLine(`float focusDistance = ${r.focus.toPrecision(Oe)}`),e.appendLine(`float horizontalAperture = ${r.getFilmWidth().toPrecision(Oe)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${r.getFilmHeight().toPrecision(Oe)}`))),o.onSerialize&&o.onSerialize(e,t),o.type===void 0){const g=new Array;o.needsTranslate&&g.push('"xformOp:translate"'),o.needsOrient&&g.push('"xformOp:orient"'),o.needsScale&&g.push('"xformOp:scale"'),g.length&&e.appendLine(`uniform token[] xformOpOrder = [${g.join(", ")}]`)}if(o.children){e.appendLine();for(const g of o.children)yx(g,e,t)}e.closeBlock()}function ae(o){return Number.isInteger(o)?o.toString():o.toFixed(10)}function bx(o){const e=o.elements;return`( ${Hu(e,0)}, ${Hu(e,4)}, ${Hu(e,8)}, ${Hu(e,12)} )`}function Hu(o,e){return`(${ae(o[e+0])}, ${ae(o[e+1])}, ${ae(o[e+2])}, ${ae(o[e+3])})`}function LT(o,e=[],t=!0){return`
1112
+ def "Geometry"
1113
+ ${jT(o,e,t)}
1114
+ `}function jT(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 g=1e4;for(;p.length<e.length&&g-- >0;)for(const y of a){const _=y.bone.children;for(const v of _)p.indexOf(v.uuid)===-1&&e.indexOf(v)!==-1&&(a.push({bone:v,index:e.indexOf(v)}),p.push(v.uuid))}g<=0&&console.error("Failed to sort bones in skinned mesh",a,e,p);for(const y of ax(e))a.push({bone:y,index:a.length});const f=a[0].bone.parent;a.sort((y,_)=>ol(y.bone,f)>ol(_.bone,f)?1:-1),a.map(y=>'"'+ol(y.bone,f)+'"').join(", ");for(const y in a)l[a[y].index]=parseInt(y);const m=n.skinIndex;c=new Array;for(let y=0;y<m.count;y++){const _=m.getX(y),v=m.getY(y),P=m.getZ(y),T=m.getW(y);c.push(l[_],l[v],l[P],l[T])}h=new pt(new Uint16Array(c),4)}const d=n.skinWeight&&n.skinIndex;return`
1115
+ {
1116
+ def Mesh "${i}" ${d?`(
1117
+ prepend apiSchemas = ["SkelBindingAPI"]
1118
+ )`:""}
1119
+ {
1120
+ int[] faceVertexCounts = [${Hf(o)}]
1121
+ int[] faceVertexIndices = [${Gf(o)}]
1122
+ ${n.normal||t?`normal3f[] normals = [${Gu(n.normal,s)}] (
1123
+ interpolation = "vertex"
1124
+ )`:""}
1125
+ point3f[] points = [${Gu(n.position,s)}]
1126
+ ${n.uv?`texCoord2f[] primvars:st = [${vx(n.uv,s,!0)}] (
1127
+ interpolation = "vertex"
1128
+ )`:""}
1129
+ ${n.uv1?qf("st1",n.uv1):""}
1130
+ ${n.uv2?qf("st2",n.uv2):""}
1131
+ ${n.uv3?qf("st3",n.uv3):""}
1132
+ ${d?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
1133
+ elementSize = 1
1134
+ interpolation = "constant"
1135
+ )`:""}
1136
+ ${n.skinIndex?`int[] primvars:skel:jointIndices = [${_x(h,!0)}] (
1137
+ elementSize = 4
1138
+ interpolation = "vertex"
1139
+ )`:""}
1140
+ ${n.skinWeight?`float[] primvars:skel:jointWeights = [${_x(n.skinWeight)}] (
1141
+ elementSize = 4
1142
+ interpolation = "vertex"
1143
+ )`:""}
1144
+ ${n.color?`color3f[] primvars:displayColor = [${Gu(n.color,s)}] (
1145
+ interpolation = "vertex"
1146
+ )`:""}
1147
+ uniform token subdivisionScheme = "none"
1148
+ }
1149
+ }
1150
+ ${t?`
1151
+ # This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
1152
+ # geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
1153
+ def "${i}_doubleSided" (
1154
+ prepend references = </Geometry>
1155
+ )
1156
+ {
1157
+ over "Geometry"
1158
+ {
1159
+ int[] faceVertexCounts = [${Hf(o)+", "+Hf(o)}]
1160
+ int[] faceVertexIndices = [${Gf(o)+", "+Gf(o,!0)}]
1161
+ }
1162
+ }
1163
+ `:""}
1164
+ `}function Hf(o){const e=o.index!==null?o.index.count:o.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function Gf(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 qf(o,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${o} = [${vx(e,t,!0)}] (
1165
+ interpolation = "vertex"
1166
+ )`;case 3:return`texCoord3f[] primvars:${o} = [${Gu(e,t)}] (
1167
+ interpolation = "vertex"
1168
+ )`;case 4:return`double4[] primvars:${o} = [${DT(e,t)}] (
1169
+ interpolation = "vertex"
1170
+ )`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+o+"."),""}}function Gu(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(Oe)}, ${s.toPrecision(Oe)}, ${r.toPrecision(Oe)})`)}return t.join(", ")}function DT(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(Oe)}, ${s.toPrecision(Oe)}, ${r.toPrecision(Oe)}, ${a.toPrecision(Oe)})`)}return t.join(", ")}function _x(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(Oe)}`),t.push(`${e?s:s.toPrecision(Oe)}`),t.push(`${e?r:r.toPrecision(Oe)}`),t.push(`${e?a:a.toPrecision(Oe)}`)}return t.join(", ")}function vx(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(Oe)}, ${r.toPrecision(Oe)})`)}return i.join(", ")}function BT(o,e,t=!1){const i=[];for(const n in o){const s=o[n];i.push(FT(s,e,t))}return`
1171
+ def "Materials"
1172
+ {
1173
+ ${i.join("")}
1174
+ }`}function en(o){return Ji(o.name)+"_"+(o.source?.id??o.id)}function ks(o,e,t,i,n,s,r=void 0,a=void 0){const l=en(o),c=l+(a!==void 0&&a!==1?"_"+a:""),h=t&&a!==void 0&&a!==1,d=h?new pe(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 g=Xf.includes(o.format),f={1e3:"repeat",1001:"clamp",1002:"mirror"},m=o.repeat.clone(),y=o.offset.clone(),_=o.rotation,v=Math.sin(_),P=Math.cos(_);y.y=1-y.y-m.y,t?(m.x===0&&(m.x=1e-4),m.y===0&&(m.y=1e-4),y.x=y.x/m.x,y.y=y.y/m.y,y.x+=v/m.x,y.y+=P-1):(y.x+=v*m.x,y.y+=(1-P)*m.y);const T=$u(n),O=m.x!=1||m.y!=1||y.x!=0||y.y!=0||_!=0,A=`${Xt}/${T}/${"uvReader_"+p}.outputs:result>`,I=`${Xt}/${T}/Transform2d_${e}.outputs:result>`,W=e!=="normal"&&r&&(r.r!==1||r.g!==1||r.b!==1||a!==1)||!1,D=e==="normal",q=n instanceof ut&&n.normalScale?n.normalScale.x*2:2,ie=q.toFixed(Oe),L=(-1*(q/2)).toFixed(Oe),V=(1-q).toFixed(Oe);return`
1175
+ ${O?`def Shader "Transform2d_${e}" (
1176
+ sdrMetadata = {
1177
+ string role = "math"
1178
+ }
1179
+ )
1180
+ {
1181
+ uniform token info:id = "UsdTransform2d"
1182
+ float2 inputs:in.connect = ${A}
1183
+ float2 inputs:scale = ${xx(m)}
1184
+ float2 inputs:translation = ${xx(y)}
1185
+ float inputs:rotation = ${(_/Math.PI*180).toFixed(Oe)}
1186
+ float2 outputs:result
1187
+ }
1188
+ `:""}
1189
+ def Shader "${l}_${e}"
1190
+ {
1191
+ uniform token info:id = "UsdUVTexture"
1192
+ asset inputs:file = @textures/${c}.${g?"png":"jpg"}@
1193
+ token inputs:sourceColorSpace = "${o.colorSpace==="srgb"?"sRGB":"raw"}"
1194
+ float2 inputs:st.connect = ${O?I:A}
1195
+ ${W?`
1196
+ float4 inputs:scale = (${r?r.r+", "+r.g+", "+r.b:"1, 1, 1"}, ${a})
1197
+ `:""}
1198
+ ${D?`
1199
+ float4 inputs:scale = (${ie}, ${ie}, ${ie}, 1)
1200
+ float4 inputs:bias = (${L}, ${L}, ${V}, 0)
1201
+ `:""}
1202
+ token inputs:wrapS = "${f[o.wrapS]}"
1203
+ token inputs:wrapT = "${f[o.wrapT]}"
1204
+ float outputs:r
1205
+ float outputs:g
1206
+ float outputs:b
1207
+ float3 outputs:rgb
1208
+ ${n.transparent||n.alphaTest>0?"float outputs:a":""}
1209
+ }`}function FT(o,e,t=!1){const i=$u(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`
1210
+
1211
+ def Material "${i}" ${o.name?`(
1212
+ displayName = "${o.name}"
1213
+ )`:""}
1214
+ {
1215
+ token outputs:mtlx:surface.connect = ${Xt}/${i}/Occlusion.outputs:out>
1216
+
1217
+ def Shader "Occlusion"
1218
+ {
1219
+ uniform token info:id = "${d}"
1220
+ token outputs:out
1221
+ }
1222
+ }`}const n=" ",s=[],r=[],a=new Set;if(o.isMeshPhysicalNodeMaterial===!0)return vT(o,i,e);let l=o.transparent||o.alphaTest?o.opacity:1,c=!1,h=!1;if(o instanceof hm&&o.transmission!==void 0&&(l*=1-o.transmission*(1-o.roughness*.5)),o.map?(s.push(`${n}color3f inputs:diffuseColor.connect = ${Xt}/${i}/${en(o.map)}_diffuse.outputs:rgb>`),o instanceof xe&&o.transparent&&o.alphaTest==0&&t?(s.push(`${n}float inputs:opacity.connect = ${Xt}/${i}/${en(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 = ${Xt}/${i}/${en(o.map)}_diffuse.outputs:a>`),c=!0):o.alphaTest>0&&(s.push(`${n}float inputs:opacity.connect = ${Xt}/${i}/${en(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0),r.push(ks(o.map,"diffuse",t,e,o,a,o.color,l))):s.push(`${n}color3f inputs:diffuseColor = ${wx(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 = ${Xt}/${i}/${en(o.aoMap)}_occlusion.outputs:r>`),r.push(ks(o.aoMap,"occlusion",t,e,o,a))),o.alphaMap?(s.push(`${n}float inputs:opacity.connect = ${Xt}/${i}/${en(o.alphaMap)}_opacity.outputs:r>`),s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),c=!0,h=!0,r.push(ks(o.alphaMap,"opacity",t,e,o,a,new ne(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 ut){if(o.emissiveMap){s.push(`${n}color3f inputs:emissiveColor.connect = ${Xt}/${i}/${en(o.emissiveMap)}_emissive.outputs:rgb>`);const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),r.push(ks(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 = ${wx(d)}`)}o.normalMap&&(s.push(`${n}normal3f inputs:normal.connect = ${Xt}/${i}/${en(o.normalMap)}_normal.outputs:rgb>`),r.push(ks(o.normalMap,"normal",t,e,o,a))),o.roughnessMap&&o.roughness===1?(s.push(`${n}float inputs:roughness.connect = ${Xt}/${i}/${en(o.roughnessMap)}_roughness.outputs:g>`),r.push(ks(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 = ${Xt}/${i}/${en(o.metalnessMap)}_metallic.outputs:b>`),r.push(ks(o.metalnessMap,"metallic",t,e,o,a))):s.push(`${n}float inputs:metallic = ${o.metalness!==void 0?o.metalness:0}`)}return o instanceof hm&&(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 = ${Xt}/${i}/${en(o.transmissionMap)}_transmission.outputs:r>`),r.push(ks(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."),`
1223
+
1224
+ def Material "${i}" ${o.name?`(
1225
+ displayName = "${sx(o.name)}"
1226
+ )`:""}
1227
+ {
1228
+ token outputs:surface.connect = ${Xt}/${i}/PreviewSurface.outputs:surface>
1229
+
1230
+ def Shader "PreviewSurface"
1231
+ {
1232
+ uniform token info:id = "UsdPreviewSurface"
1233
+ ${s.join(`
1234
+ `)}
1235
+ int inputs:useSpecularWorkflow = ${o instanceof xe?"1":"0"}
1236
+ token outputs:surface
1237
+ }
1238
+ ${r.length>0?`
1239
+ ${a.has(0)?`
1240
+ def Shader "uvReader_st"
1241
+ {
1242
+ uniform token info:id = "UsdPrimvarReader_float2"
1243
+ token inputs:varname = "st"
1244
+ float2 inputs:fallback = (0.0, 0.0)
1245
+ float2 outputs:result
1246
+ }
1247
+ `:""}
1248
+ ${a.has(1)?`
1249
+ def Shader "uvReader_st1"
1250
+ {
1251
+ uniform token info:id = "UsdPrimvarReader_float2"
1252
+ token inputs:varname = "st1"
1253
+ float2 inputs:fallback = (0.0, 0.0)
1254
+ float2 outputs:result
1255
+ }
1256
+ `:""}
1257
+ ${r.join(`
1258
+ `)}`:""}
1259
+ }`}function wx(o){return`(${o.r}, ${o.g}, ${o.b})`}function xx(o){return`(${o.x}, ${o.y})`}const Xf=[1023,33777,33778,33779,35842,35843,37496,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,36492];w("debugusdz");class Et{static global_id=0;id;trigger;action;exclusive=!1;makeExclusive(e){return this.exclusive=e,this}constructor(e,t,i){this.id="Behavior_"+Ji(e)+"_"+Et.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 sl=new Set;function Qf(o,e){let t="";if(Array.isArray(o)){sl.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(sl.has(s))continue;i+=s,sl.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(sl.has(r))continue;i+=r,sl.add(r)}n+1<o.length&&(i+=", ")}i+=" ]",t=i,sl.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 Ys{static global_id=0;id;targetId;tokenId;type;distance;constructor(e,t){e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+Ys.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=Qf(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 Sx(o,e={direct:!0,indirect:!0}){const t=it.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 Dt{static __sceneStartTrigger;static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new Ys(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 Ys(e);if(Array.isArray(e)&&e.length>1)for(const n of e)n instanceof it&&Sx(n,t);else e instanceof it&&Sx(e,t);return i.tokenId="TapGesture",i}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const i=new Ys(e);return i.tokenId="ProximityToCamera",i.distance=t,i}}class Fr{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 fi{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 fi,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+="_"+fi.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=Qf(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=Qf(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 dn{x=0;y=0;z=0;constructor(e,t,i){this.x=e,this.y=t,this.z=i}static get up(){return new dn(0,1,0)}static get right(){return new dn(1,0,0)}static get forward(){return new dn(0,0,1)}static get back(){return new dn(0,0,-1)}static get zero(){return new dn(0,0,0)}}class me{static sequence(...e){return new Fr("Group_"+Fr.getId(),e).makeSequence()}static parallel(...e){return new Fr("Group_"+Fr.getId(),e).makeParallel()}static fadeAction(e,t,i){const n=new fi(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 fi(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),me.sequence(s,h)}return s}static waitAction(e){const t=new fi;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,i,n){const s=new fi(e);return s.tokenId="LookAtCamera",s.duration=t===void 0?9999999999999:t,s.front=i??dn.forward,s.up=n??dn.up,s}static emphasize(e,t,i="bounce",n=1,s="basic"){const r=new fi(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 fi(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 fi(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 fi(e);return i.tokenId="Impulse",i.velocity=t,i}}class UT{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 Yf extends UT{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||it.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=me.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=me.fadeAction(this.object,0,!1),this._disableAction)}}class Cx{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 Jn=w("debugusdzanimation"),Zf=w("debugusdzanimationserialization");class tr{_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=ba.parseTrackName(t.name);let n=ba.findNode(this.root,i.nodeName);if(n)if(!e)e=n;else{if(n===e||tr.isDescendantOf(e,n))continue;if(!tr.isDescendantOf(n,e)){for(;!tr.isDescendantOf(n,e)&&n.parent;)n=n.parent;tr.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,ft);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."),E()&&ge("[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 U,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 g=0-p;g<e.length+p;g++){let f=0,m=0;if(g<0?(f=e[0],m=f-Ne.animationDurationPadding/2+1/60):g>=e.length?(f=e[e.length-1],m=f+Ne.animationDurationPadding/2-1/60):(f=e[g],m=f),c){const y=c.evaluate(f);s.set(y[0],y[1],y[2])}if(h){const y=h.evaluate(f);r.set(y[0],y[1],y[2],y[3])}if(d){const y=d.evaluate(f);a.set(y[0],y[1],y[2])}if(this.useRootMotion&&l===this.root){const y=new J;y.compose(s,r,a),y.multiply(l.matrix),y.decompose(s,r,a)}yield{time:m,translation:s,rotation:r,scale:a,index:g}}}}class qu{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);Jn&&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=ba.parseTrackName(c.name),d=ba.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 g=p[s];g||(g=new Ne(e,d,t),p[s]=g),g.addTrack(c),r?.includes(d)||r?.push(d)}Jn&&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||(Jn&&console.log("Adding padding clip for ",c,t,"at slot",s),d=new Ne(e,c,t),h[s]=d)}const l=new tr(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(i,l),Jn&&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,g=Math.round(d*60)/60;Math.abs(p-h)<.01&&(h=p),Math.abs(g-d)<.01&&(d=g),h=Math.ceil(h),d=h+t.duration,this.clipToStartTime.set(t,h),this.lastClipEndTime=d}}return l}onAfterHierarchy(e){Jn&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){Jn&&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;Zf&&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 zT(e,this);this.serializers.push(n),n.registerCallback(t)}}class zT{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)),Zf&&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(L){const V=[];for(const[N,oe]of L){let le=`${N} : [`;const ye=[];for(const Se of oe)ye.push(`(${ae(Se.x)}, ${ae(Se.y)}, ${ae(Se.z)})`);le=le.concat(ye.join(", ")),le=le.concat("],"),V.push(le)}return V},a=function(L){const V=[];for(const[N,oe]of L){let le=`${N} : [`;const ye=[];for(const Se of oe)ye.push(`(${ae(Se.w)}, ${ae(Se.x)}, ${ae(Se.y)}, ${ae(Se.z)})`);le=le.concat(ye.join(", ")),le=le.concat("],"),V.push(le)}return V},l=function(L){let V,N=!0;const oe=new Map;for(const[ye,Se]of L){V===void 0&&(V=Se.length),V!==Se.length&&(N=!1);let St=0;for(const zi of Se)St++,zi||(oe.has(ye)||oe.set(ye,[]),oe.get(ye).push(St))}Jn&&console.log("Bone count: ",L.size,"TransformData entries per bone: ",V,"Undefined bone entries: ",oe),console.assert(N,"All bones should have the same number of TransformData entries",L),console.assert(oe.size===0,"All TransformData entries should be set",oe);const le=[];for(const[ye,Se]of L)for(let St=0;St<Se.length;St++){const zi=Se[St],nd=i.getStartTimeByClip(zi.clip);le.length<=St&&le.push({pos:[],rot:[],scale:[],timeOffset:nd});const ns=le[St];ns.pos.push(...zi.getSortedTimesArray(!0,!1,!1)),ns.rot.push(...zi.getSortedTimesArray(!1,!0,!1)),ns.scale.push(...zi.getSortedTimesArray(!1,!1,!0))}for(const ye of le)ye.pos.sort((Se,St)=>Se-St),ye.rot.sort((Se,St)=>Se-St),ye.scale.sort((Se,St)=>Se-St),ye.pos=[...new Set(ye.pos)],ye.rot=[...new Set(ye.rot)],ye.scale=[...new Set(ye.scale)];return le},c=function(L,V,N){const oe=new Map,le=new Map,ye=new Map,Se=V.length;for(const St of N){const zi=L.get(St);let nd;zi?console.assert(zi.length===Se,"We should have the same number of TransformData entries for each bone",zi,V):nd=new Ne(null,St,null);for(let ns=0;ns<Se;ns++){const Jp=zi?zi[ns]:nd,ga=V[ns];for(const{time:Ul,translation:zl}of Jp.getValues(ga.pos,!0,!1,!1)){const un=(Ul+ga.timeOffset)*60;oe.has(un)||oe.set(un,new Array),oe.get(un).push(zl.clone())}for(const{time:Ul,rotation:zl}of Jp.getValues(ga.rot,!1,!0,!1)){const un=(Ul+ga.timeOffset)*60;le.has(un)||le.set(un,new Array),le.get(un).push(zl.clone())}for(const{time:Ul,scale:zl}of Jp.getValues(ga.scale,!1,!1,!0)){const un=(Ul+ga.timeOffset)*60;ye.has(un)||ye.set(un,new Array),ye.get(un).push(zl.clone())}}}return{position:oe.size==0?void 0:oe,quaternion:le.size==0?void 0:le,scale:ye.size==0?void 0:ye}},h=function(L){const V=[];for(const N of L)V.push(`(${ae(N.x)}, ${ae(N.y)}, ${ae(N.z)})`);return V.join(", ")},d=function(L){const V=[];for(const N of L)V.push(`(${ae(N.w)}, ${ae(N.x)}, ${ae(N.y)}, ${ae(N.z)})`);return V.join(", ")},p=function(L){const V=new Map;if(Jn){const N=new Array;for(const[oe,le]of s)N.push(oe.uuid+": "+le.length+" "+le.map(ye=>ye.clip?.uuid.substring(0,6)).join(" "));console.log(`getPerBoneTransformData
1260
+ `+N.join(`
1261
+ `))}for(const N of L){const oe=s.get(N);oe&&V.set(N,oe)}return V},g=function(L){const V=p(L),N=l(V);return c(V,N,L)};const f=n.skinnedMesh.skeleton,m=new Array,y=[],_=[];for(const L of f.bones){y.push(L),_.push(L.uuid);const V=f.boneInverses[f.bones.indexOf(L)];m.push({bone:L,inverse:V})}let v=1e4;for(;_.length<f.bones.length&&v-- >0;)for(const L of y){const V=L.children;for(const N of V)if(_.indexOf(N.uuid)===-1&&f.bones.indexOf(N)!==-1){y.push(N),_.push(N.uuid);const oe=f.boneInverses[f.bones.indexOf(N)];m.push({bone:N,inverse:oe})}}v<=0&&console.error("Failed to sort bones in skinned mesh",n.skinnedMesh,f.bones,_);for(const L of ax(f.bones))m.push({bone:L,inverse:L.matrixWorld.clone().invert()});const P=m[0].bone.parent;P||console.error("No bone parent found for skinned mesh during USDZ export",n.skinnedMesh),m.sort((L,V)=>ol(L.bone,P)>ol(V.bone,P)?1:-1);const T=t.quickLookCompatible,O=[],A=[],I=[],W=[];for(const{bone:L}of m){if(T){const V=L.scale;V.x==0&&(V.x=1e-5),V.y==0&&(V.y=1e-5),V.z==0&&(V.z=1e-5),O.push(new J().compose(L.position,L.quaternion,L.scale))}else O.push(L.matrix.clone());A.push(L.position),I.push(L.quaternion),W.push(L.scale)}const D=m.map(L=>'"'+ol(L.bone,P)+'"').join(", "),q=m.map(L=>bx(L.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${q}]`),e.appendLine(`uniform token[] joints = [${D}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${O.map(L=>bx(L)).join(", ")}]`);const ie=g(m.map(L=>L.bone));if(Jn){let L=1e7,V=0;for(const N of ie.position?.keys()??[])L=Math.min(L,N),V=Math.max(V,N);console.log("Time samples",L,V,ie)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${D}]`),e.appendLine(`quatf[] rotations = [${d(I)}]`),ie&&ie.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const L=a(ie.quaternion);for(const V of L)e.appendLine(V);e.closeBlock()}if(e.appendLine(`half3[] scales = [${h(W)}]`),ie&&ie.scale){e.beginBlock("half3[] scales.timeSamples = {","");const L=r(ie.scale);for(const V of L)e.appendLine(V);e.closeBlock()}if(e.appendLine(`float3[] translations = [${h(A)}]`),ie&&ie.position){e.beginBlock("float3[] translations.timeSamples = {","");const L=r(ie.position);for(const V of L)e.appendLine(V);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;Zf&&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 g=h[p];if(!g)continue;const f=n.getStartTimeByClip(g.clip),m=g.getSortedTimesArray(d==="position",d==="rotation",d==="scale");if(!m||m.length===0){console.error("got an animated object but no time values?",s,g);continue}const y=!g.clip,_=d==="position"&&(g.pos||y),v=d==="rotation"&&(g.rot||y),P=d==="scale"&&(g.scale||y);if(_||v||P){const T=g.clip?.name??"rest",O=g.getDuration();Jn&&console.log("Write .timeSamples:",T,f,O,h),e.appendLine("# "+T+": start="+l.format(f*Ne.frameRate)+", length="+l.format(O*Ne.frameRate)+", frames="+g.getFrames())}if(_)for(const{time:T,translation:O}of g.getValues(m,!0,!1,!1)){const A=`${l.format((f+T)*Ne.frameRate)}: (${ae(O.x)}, ${ae(O.y)}, ${ae(O.z)}),`;e.appendLine(A)}if(v)for(const{time:T,rotation:O}of g.getValues(m,!1,!0,!1)){const A=`${l.format((f+T)*Ne.frameRate)}: (${ae(O.w)}, ${ae(O.x)}, ${ae(O.y)}, ${ae(O.z)}),`;e.appendLine(A)}if(P)for(const{time:T,scale:O}of g.getValues(m,!1,!1,!0)){const A=`${l.format((f+T)*Ne.frameRate)}: (${ae(O.x)}, ${ae(O.y)}, ${ae(O.z)}),`;e.appendLine(A)}}e.closeBlock()}}c(a,"position"),c(a,"rotation"),c(a,"scale")}}const NT=w("debugusdz");class ca{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)),Ji(i)+"."+t}get extensionName(){return"Audio"}files=new Array;onExportObject(e,t,i){const n=x.getComponents(e,Mi);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=ca.getName(s.clip),l=Ji(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]){NT&&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 WT=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&&WT(e,t,n),n};const Px=w("debugusdzbehaviours");function zc(o){o&&(o.getComponentInParent($a)||(E()&&console.debug('Raycaster on "'+o.name+'" was automatically added, because no raycaster was found in the parent hierarchy.'),o.addComponent(ki)))}class Ur extends M{object;target;duration=1;relativeMotion=!1;coroutine=null;targetPos=new b;targetRot=new U;targetScale=new b;start(){zc(this.gameObject)}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=Z(this.object).clone(),t=Z(this.target).clone(),i=be(this.object).clone(),n=be(this.target).clone(),s=$e(this.object).clone(),r=$e(this.target).clone(),a=e.distanceTo(t),l=i.angleTo(n),c=s.distanceTo(r);if(a<.01&&l<.01&&c<.01){mt(this.object,t),mn(this.object,n),Sa(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),mt(this.object,this.targetPos),mn(this.object,this.targetRot),Sa(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 Et("Move to "+this.target?.name,Dt.tapTrigger(this.gameObject),me.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(t)}}}Be([u(k)],Ur.prototype,"object"),Be([u(k)],Ur.prototype,"target"),Be([u()],Ur.prototype,"duration"),Be([u()],Ur.prototype,"relativeMotion");const Xu=class Kt extends M{materialToSwitch;variantMaterial;fadeDuration=0;start(){this._objectsWithThisMaterial=this.objectsWithThisMaterial,zc(this.gameObject),E()&&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):ov(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=[],Kt._materialTriggersPerId={},Kt.variantSwitchIndex=0,this.materialToSwitch&&await Ve.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await Ve.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&&(Kt._materialTriggersPerId[this.materialToSwitch.uuid]||(Kt._materialTriggersPerId[this.materialToSwitch.uuid]=[]),Kt._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(e,t){if(!this.materialToSwitch)return;const i=Kt._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 Kt._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(e,t,i){const n=[],s=Math.max(0,this.fadeDuration);n.push(me.fadeAction([...this.targetModels,...i],s,!1)),n.push(me.fadeAction(t,s,!0)),e.addBehavior(new Et("Select_"+this.selfModel.name,Dt.tapTrigger(this.selfModel),me.parallel(...n))),Kt._parallelStartHiddenActions.push(...t),Kt._startHiddenBehaviour||(Kt._startHiddenBehaviour=new Et("StartHidden_"+this.selfModel.name,Dt.sceneStartTrigger(),me.fadeAction(Kt._parallelStartHiddenActions,s,!1)),e.addBehavior(Kt._startHiddenBehaviour))}static getMaterialName(e){return Ji(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_"+Kt.variantSwitchIndex+++"_"+Kt.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())&&it.createEmptyParent(t),t.parent&&t.parent.add(i),e.push(i)}return e}};Be([u(ve)],Xu.prototype,"materialToSwitch"),Be([u(ve)],Xu.prototype,"variantMaterial"),Be([u()],Xu.prototype,"fadeDuration");let Kf=Xu;const Nc=class ze extends M{target;toggleOnClick=!1;targetState=!0;hideSelf=!0;start(){zc(this.gameObject)}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())&&Nf.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 J),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 J),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(me.fadeAction(n,0,!1)),a.push(me.fadeAction(this.toggleModel,0,!0)),a.push(me.fadeAction(this.targetModel,0,s)),e.addBehavior(new Et("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),Dt.tapTrigger(n),me.parallel(...a)));const l=[];l.push(me.fadeAction(this.toggleModel,0,!1)),l.push(me.fadeAction(n,0,!0)),l.push(me.fadeAction(this.targetModel,0,!s)),e.addBehavior(new Et("Toggle_"+n.name+"_ToggleTo"+(s?"Off":"On"),Dt.tapTrigger(this.toggleModel),me.parallel(...l)))}}else{const a=[];this.hideSelf&&a.push(me.fadeAction(n,0,!1)),a.push(me.fadeAction(this.targetModel,0,s)),e.addBehavior(new Et("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),Dt.tapTrigger(n),a.length>1?me.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),hn.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)],Nc.prototype,"target"),Be([u()],Nc.prototype,"toggleOnClick"),Be([u()],Nc.prototype,"targetState"),Be([u()],Nc.prototype,"hideSelf");let Jf=Nc;class hn extends M{static _fadeBehaviour;static _fadeObjects=[];static add(e,t){const i=Array.isArray(e)?e:[e];for(const n of i)hn._fadeObjects.includes(n)||(console.log("adding hide on start",n),hn._fadeObjects.push(n));hn._fadeBehaviour===void 0&&(hn._fadeBehaviour=new Et("HideOnStart",Dt.sceneStartTrigger(),me.fadeAction(hn._fadeObjects,0,!1)),t.addBehavior(hn._fadeBehaviour))}start(){x.setActive(this.gameObject,!1)}createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.wasVisible||hn.add(t,e))}wasVisible=!1;beforeCreateDocument(){this.wasVisible=x.isActiveSelf(this.gameObject)}}class rl extends M{target;duration=.5;motionType="bounce";beforeCreateDocument(){}createBehaviours(e,t,i){if(this.target&&t.uuid===this.gameObject.uuid){const n=new Et("emphasize "+this.name,Dt.tapTrigger(this.gameObject),me.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(n)}}afterCreateDocument(e,t){}}Be([u()],rl.prototype,"target"),Be([u()],rl.prototype,"duration"),Be([u()],rl.prototype,"motionType");class Ms extends M{target;clip="";toggleOnClick=!1;trigger="tap";start(){zc(this.gameObject)}ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(Mi);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}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;ca.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=me.playAudioAction(s,c,"play",r,a);this.target&&this.target.loop&&(h=me.sequence(h).makeLooping());const d=this.name?"_"+this.name:"";if(l&&this.trigger==="tap"){this.toggleOnClick&&(h.multiplePerformOperation="stop");const p=new Et("playAudio"+d,Dt.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 Et("playAudioOnStart"+d,Dt.sceneStartTrigger(),h);e.addBehavior(p)}}}}Be([u(Mi)],Ms.prototype,"target"),Be([u(URL)],Ms.prototype,"clip"),Be([u()],Ms.prototype,"toggleOnClick");const ey=class ho extends M{animator;stateName;trigger="tap";animation;get target(){return this.animator?.gameObject||this.animation?.gameObject}start(){zc(this.gameObject)}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(ho.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.';E()&&ge(e),console.warn(e,...ho.rootsWithExclusivePlayback)}ho.animationActions=[],ho.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 qu);if(!n)return;const s=n.getClipCount(this.target)>1;s&&(E()&&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."),ho.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";i.traverse(a=>{if(a.uuid===this.target?.uuid){const l=ho.getActionForSequences(i,a,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),c=new Et(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+this.target?.name,this.trigger=="tap"?Dt.tapTrigger(this.selfModel):Dt.sceneStartTrigger(),l);s&&c.makeExclusive(!0),e.addBehavior(c)}})}static getActionForSequences(e,t,i,n,s){const r=(l,c)=>{let h=ho.animationActions.find(d=>d.affectedObjects==l&&d.start==c.start&&d.duration==c.duration&&d.animationSpeed==c.speed);return h||(h=me.startAnimationAction(l,c),ho.animationActions.push(h)),h},a=me.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:me.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(me.waitAction(s)),a}static getAndRegisterAnimationSequences(e,t,i){if(!t)return;const n=t.getComponent(ft),s=t.getComponent(Lt);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 m=0;if(s.minMaxOffsetNormalized){const y=s.minMaxOffsetNormalized.x,_=s.minMaxOffsetNormalized.y;m=(s.clip?.duration||1)*(y+Math.random()*(_-y))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:m}}const l=n?.runtimeAnimatorController;let c=l?.findState(i),h=[],d=[];if(l&&c){const f=new Array;f.push(c);let m=!1;for(;f.length<100;){if(!c||c===null||!c.transitions||c.transitions.length===0){c.motion?.isLooping&&(m=!0);break}const y=c.transitions.find(v=>v.conditions.length===0),_=y?l.getState(y.destinationState,0):null;if(_&&f.includes(_)){c=_,m=!0;break}else if(y){if(c=_,!c)break;f.push(c)}else{m=c.motion?.isLooping??!1;break}}if(m&&c){const y=f.indexOf(c);h=f.slice(0,y),d=f.slice(y),Px&&console.log("found loop from "+i,"states until loop",h,"states looping",d)}else h=f,d=[],Px&&console.log("found no loop from "+i,"states",h);if(!d.length){const y=h[h.length-1],_=y.motion?.clip;if(_){let v;if(e.holdClipMap.has(_))v=e.holdClipMap.get(_);else{const P=y.name+"_hold";v=_.clone(),v.duration=1,v.name=P;const T=_.duration;v.tracks=_.tracks.map(O=>{const A=O.clone();A.times=new Float32Array([0,T]);const I=O.values.length,W=O.getValueSize(),D=O.values.slice(I-W,I);return A.values=new Float32Array(2*W),A.values.set(D,0),A.values.set(D,W),A}),v.name=P,e.holdClipMap.set(_,v)}if(v){const P={name:v.name,motion:{clip:v,isLooping:!1,name:v.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,m)=>{if(!t)return;const y=e.registerAnimation(t,f.motion.clip??null);y?(y.speed=f.speed,m.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 g=0;if(n&&l&&n.minMaxOffsetNormalized){const f=n.minMaxOffsetNormalized.x,m=n.minMaxOffsetNormalized.y;g=((h.length?h[0]:d.length?d[0]:null)?.motion.clip?.duration||1)*(f+Math.random()*(m-f))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:g}}createAnimation(e,t,i){if(!this.target||!this.animator&&!this.animation)return;const n=ho.getAndRegisterAnimationSequences(e,this.target,this.stateName);n&&(this.animationSequence=n.animationSequence,this.animationLoopAfterSequence=n.animationLoopAfterSequence,this.randomOffsetNormalized=n.randomTimeOffset,this.stateAnimationModel=t)}};Be([u(ft)],ey.prototype,"animator"),Be([u()],ey.prototype,"stateName");let Wc=ey;class al extends M{getType(){}target;getDuration(){}}Be([u(k)],al.prototype,"target");class Vc extends M{target}Be([u(al)],Vc.prototype,"target");class $c extends al{type=1;duration=1;getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}Be([u()],$c.prototype,"type"),Be([u()],$c.prototype,"duration");class ty extends Vc{}class Zs{static _instance;static create(){return new Zs}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 In.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=G.supportsQuickLookAR();e.innerText="View in AR",e.prepend(Ct("view_in_ar"));let i=!1,n=null;return e.addEventListener("click",()=>{n=Da(io),n||(i=!0,n=new io),i&&(n.objectToExport=z.Current.scene),n?(e.classList.add("this-mode-is-requested"),n.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(s=>{e.classList.remove("this-mode-is-requested"),console.error(s)})):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(Ct("view_in_ar")),i.title="Click to start an AR session",i.addEventListener("click",()=>Y.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)"),G.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(Ct("panorama_photosphere")),i.title="Click to start a VR session",i.addEventListener("click",()=>Y.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)"),G.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(Ct("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&&Te("This page doesn't allow popups. Please paste "+n+" into your browser.")}),this.listenToXRSessionState(t),this.hideElementDuringXRSession(t),G.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>{navigator.xr?.isSessionSupported("immersive-vr")?t.style.display="none":t.style.display=""}),t}createQRCode(){return In.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!("xr"in navigator)){e.style.display="none";return}Y.isSessionSupported(t).then(i=>{e.style.display=i?"":"none",E()&&!i&&console.log('[WebXR] "'+t+'" is not supported on this device \u2013 make sure your server runs using HTTPS and you have a device connected that supports '+t)})}hideElementDuringXRSession(e){Rd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),Qm(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}listenToXRSessionState(e,t){t&&(Y.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"))}),Y.onSessionRequestEnd(i=>{e.classList.remove("this-mode-is-requested"),e.classList.remove("other-mode-is-requested"),e.disabled=e["was-disabled"]}))}}var VT=Object.defineProperty,$T=Object.getOwnPropertyDescriptor,bt=(o,e,t,i)=>{for(var n=i>1?void 0:i?$T(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&&VT(e,t,n),n};const Hc=w("debugspriterenderer"),HT=w("wireframe");class da{static cache={};static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&da.cache[e.guid])return Hc&&console.log("Take cached geometry for sprite",e.guid),da.cache[e.guid];const t=new pn;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 pt(i,3)),t.setAttribute("uv",new pt(n,2)),e.guid&&(this.cache[e.guid]=t),Hc&&console.log("Built sprite geometry",e,t),t}}class GT{x;y}function Ox(o){o&&(o.colorSpace!=yo&&(o.colorSpace=yo,o.needsUpdate=!0),o.minFilter==ud&&o.magFilter==ud&&(o.anisotropy=1,o.needsUpdate=!0))}let Bo=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(da.getOrCreateGeometry(this),this.material)),this._mesh}_mesh;get material(){return this._material||(this.texture&&Ox(this.texture),this._material=new xe({map:this.texture,color:16777215,side:vi,transparent:!0})),this._material}_material;getGeometry(){return da.getOrCreateGeometry(this)}};bt([u()],Bo.prototype,"guid",2),bt([u(Re)],Bo.prototype,"texture",2),bt([Qe()],Bo.prototype,"triangles",2),bt([Qe()],Bo.prototype,"uv",2),bt([Qe()],Bo.prototype,"vertices",2);const iy=Symbol("spriteOwner");class ll{sprites;constructor(){this.sprites=[]}}bt([u(Bo)],ll.prototype,"sprites",2);const ny=class M0{static create(){const e=new M0;return e.spriteSheet=new ll,e}constructor(){}clone(){const e=new M0;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 ll,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&&(Ox(n),!i.__hasLoadedProgressive)){i.__hasLoadedProgressive=!0;const s=n;Ve.assignTextureLOD(n,0).then(r=>{r instanceof Re&&(i.texture=r,e?.map===s&&(e.map=r,e.needsUpdate=!0))})}}};bt([u(ll)],ny.prototype,"spriteSheet",2),bt([u()],ny.prototype,"index",2);let cl=ny;class ci extends M{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=cl.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);Hc&&console.log("[SpriteSheet] Set index to "+t+" (was "+this.spriteIndex+")",e),this.spriteIndex=t}else e instanceof Bo?(this._spriteSheet||(this._spriteSheet=cl.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=cl.create(),Hc&&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 Hc&&console.warn("Sprite not found",this.spriteIndex,t.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=da.getOrCreateGeometry(i),this._currentSprite.material.map=i.texture;else{const n=new xe({color:16777215,side:vi});if(HT&&(n.wireframe=!0),this.color&&(n.color||(n.color=new ne),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[iy]!==void 0&&s[iy]!==this&&this.spriteFrames>1&&(s=i.texture=s.clone()),s[iy]=this,n.map=s}this.sharedMaterial=n,this._currentSprite=new H(da.getOrCreateGeometry(i),n),this._currentSprite.renderOrder=Math.round(this.renderOrder),Ve.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}}bt([u()],ci.prototype,"drawMode",2),bt([u(GT)],ci.prototype,"size",2),bt([u(se)],ci.prototype,"color",2),bt([u(ve)],ci.prototype,"sharedMaterial",2),bt([u()],ci.prototype,"transparent",2),bt([u()],ci.prototype,"cutoutThreshold",2),bt([u()],ci.prototype,"castShadows",2),bt([u()],ci.prototype,"renderOrder",2),bt([u()],ci.prototype,"toneMapped",2),bt([u(cl)],ci.prototype,"sprite",1);const kx=w("debugwebxr"),qT=new J().makeRotationY(Math.PI);class Ui extends M{static _eventListeners={};static onPlaced(e){const t="placed";return this._eventListeners[t]||(this._eventListeners[t]=[]),this._eventListeners[t].push(e),()=>{const i=this._eventListeners[t].indexOf(e);i>=0&&this._eventListeners[t].splice(i,1)}}static _hasPlaced=!1;static get hasPlaced(){return this._hasPlaced}get arScale(){return this._arScale}set arScale(e){this._arScale=Math.max(1e-6,e),this.onSetScale()}_arScale=1;invertForward=!1;customReticle;arTouchTransform=!0;autoPlace=!1;autoCenter=!1;useXRAnchor=!1;_isPlacing=!0;_startOffset=new J;_createdPlacementObject=null;_reparentedComponents=[];_placementScene=new yi;_reticle=[];_hits=[];_placementStartTime=-1;_rigPlacementMatrix;_anchor=null;userInput;onEnable(){this.customReticle?.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){kx&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,Ui._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=Vt(this._placementScene.children),n=i.getCenter(new b),s=i.getSize(new b),r=new J;r.makeTranslation(n.x,n.y-s.y*.5,n.z),this._startOffset.multiply(r)}this._reparentedComponents.length=0,this._reparentedComponents.push({comp:this,originalObject:this.gameObject}),x.addComponent(t,this);for(const i of this._reticle)Ci(i);this._reticle.length=0,this._isPlacing=!0,this.context.input.addEventListener("pointerup",this.onPlaceScene,{queue:ii.Early})}onLeaveXR(){this.context.input.removeEventListener("pointerup",this.onPlaceScene,{queue:ii.Early}),this.onRevertSceneChanges(),this._anchor=null,Ui._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 Kp(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=Ua(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else s=new H(new YS(.07,.09,32).rotateX(-Math.PI/2),new xe({side:vi,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),s.name="AR Placement Reticle";if(kx){const r=new _i(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($(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(Y.active?.isTrackingImages){console.warn("Scene Placement is disabled while images are being tracked");return}let i=this._hits[0];if(e&&e.origin instanceof Ym){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),Ui._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(Y.active,i),this.context.xr)for(const n of this.context.xr.controllers)n.cancelHitTestSource()};onSetScale(){if(!Ui._hasPlaced)return;const e=Y.active?.rig?.gameObject;if(e){const t=Y.active?.rigScale||1,i=1/this._arScale*t,n=new J().makeScale(i,i,i).invert();e.matrix.premultiply(n),e.matrix.decompose(e.position,e.quaternion,e.scale)}}onRevertSceneChanges(){for(const e of this._reticle)e&&(e.visible=!1,e?.removeFromParent());this._reticle.length=0;for(let e=this._placementScene.children.length-1;e>=0;e--){const t=this._placementScene.children[e];this.context.scene.add(t)}this._createdPlacementObject?.removeFromParent();for(const e of this._reparentedComponents)x.addComponent(e.originalObject,e.comp)}async onCreateAnchor(e,t){if(t.createAnchor===void 0){console.warn("Hit does not support creating an anchor",t),E()&&ge("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=Y.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(qT),t.matrix.premultiply(this._startOffset),t.matrix.decompose(t.position,t.quaternion,t.scale),i.add(t)}}class Kp{static up=new b(0,1,0);static zero=new b(0,0,0);static one=new b(1,1,1);oneFingerDrag=!0;twoFingerRotate=!0;twoFingerScale=!0;factor=1;context;offset;plane;_scale=1;_hasChanged=!1;get scale(){return this._scale}constructor(e){this.context=e,this.offset=new J,this.plane=new nr,this.plane.setFromNormalAndCoplanarPoint(Kp.up,Kp.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:ii.Early}),this.context.input.addEventListener("pointerdown",this.onPointerDownLate,{queue:ii.Late}),this.context.input.addEventListener("pointerup",this.onPointerUpEarly,{queue:ii.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:ii.Early}),this.context.input.removeEventListener("pointerdown",this.onPointerDownLate,{queue:ii.Late}),this.context.input.removeEventListener("pointerup",this.onPointerUpEarly,{queue:ii.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=G.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 rd;_intersection=new b;_screenPos=new b;getPositionOnPlane(e,t){const i=this.context.mainCamera;return this._screenPos.x=e/window.innerWidth*2-1,this._screenPos.y=-(t/window.innerHeight)*2+1,this._screenPos.z=1,this._screenPos.unproject(i),this._raycaster.set(i.position,this._screenPos.sub(i.position)),this._raycaster.ray.intersectPlane(this.plane,this._intersection),this._intersection}addMovement(e,t){e/=this._scale,t/=this._scale,e*=this.factor,t*=this.factor,this.offset.elements[12]+=e,this.offset.elements[14]+=t,(e!==0||t!==0)&&(this._hasChanged=!0)}_tempMatrix=new J;addScale(e){e/=window.innerWidth,e*=-1,this._scale*=1+e,this._tempMatrix.makeScale(1-e,1-e,1-e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}addRotation(e){e*=-1,this._tempMatrix.makeRotationY(e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}}const Rs=w("debugautosync"),oy=Symbol("syncerId");class XT{_syncers={};getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new QT(e);return t[oy]=e.guid,this._syncers[t[oy]]=t,t}removeSyncer(e){delete this._syncers[e[oy]]}}const sy=new XT;class QT{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||(Rs&&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];Rs&&console.log("SEND",this.comp.guid,this.networkingKey),e.send(this.networkingKey,{guid:this.comp.guid,property:t,data:i},yn.Queued),delete this.changedProperties[t]}};onHandleReceiving=e=>{if(Rs&&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 YT(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 Gc=Symbol("AutoSyncHandler");function ZT(o){if(o[Gc])return o[Gc];const e=sy.getOrCreateSyncer(o);return e?.init(o),o[Gc]=e,e}function KT(o){const e=o[Gc];e&&(sy.removeSyncer(e),e.destroy(),delete o[Gc])}const ry=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&&(E()||Rs)&&o!=null&&console.warn('syncField: no callback function found for property "'+i+'"','"'+o+'"');const r=e,a=r.__internalAwake;if(typeof a!="function"){(Rs||E())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+e?.constructor?.name+'" is not supported',e);return}Rs&&console.log(i);const l=Symbol(i);r.__internalAwake=function(){if(this[l]===void 0){if(this[l]=this[i],n=sy.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){(E()||Rs)&&console.warn("Recursive call detected",i);return}h=!0;try{const g=YT(d,p);Rs&&console.log("SyncField assignment",i,"changed?",g,d,s),g&&s?.call(this,d,p)!==!1&&ZT(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(){KT(this),c.call(this)}}};var JT=Object.defineProperty,Qu=(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&&JT(e,t,n),n};const Yt=w("debugplayersync"),Yu=class q1 extends M{static async setupFrom(e,t){const i=te.getOrCreateFromUrl(e);if(!i.asset){const r=await i.loadAssetAsync();r&&x.getOrAddComponent(r,Sn)}const n=new q1;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 he)}onEnable(){this.context.connection.beginListen(ee.RoomStateSent,this.onJoinedRoom),this.context.connection.beginListen(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ee.LeftRoom,this.destroyInstance),this.context.connection.isInRoom&&this.onJoinedRoom()}onDisable(){this.context.connection.stopListen(ee.RoomStateSent,this.onJoinedRoom),this.context.connection.stopListen(ee.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ee.LeftRoom,this.destroyInstance)}onJoinedRoom=()=>{Yt&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()};async getInstance(){if(this._localInstance)return this._localInstance;if(Yt&&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,Sn);if(Yt&&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=>{Yt&&console.log("PlayerSync.destroyInstance",e),hc(e,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0};watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=Sn.all.length-1;t>=0;t--){const i=Sn.all[t];(!i.owner||!this.context.connection.userIsInRoom(i.owner))&&i.doDestroy()}})}};Qu([u()],Yu.prototype,"autoSync"),Qu([u(te)],Yu.prototype,"asset"),Qu([u(he)],Yu.prototype,"onPlayerSpawned");let ay=Yu;var Mx=(o=>(o.OwnerChanged="ownerChanged",o))(Mx||{});const ly=class Rt extends M{static _all=[];static get all(){return Rt._all}static _local=[];static get local(){return Rt._local}static getFor(e){if(e instanceof k)return x.getComponentInParent(e,Rt);if(e instanceof M)return x.getComponentInParent(e.gameObject,Rt)}static isLocalPlayer(e){return Rt.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 he;onFirstOwnerChangeEvent=new he;hasOwner=!1;owner;dontDestroy=!1;get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(e,t){Yt&&console.log(`PlayerSync.onOwnerChange: ${t} \u2192 ${e} (me: ${this.context.connection.connectionId})`);const i=Rt._local.indexOf(this);i>=0&&Rt._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){Rt._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),Rt.dispatchEvent("ownerChanged",s)}awake(){Rt.all.push(this),Yt&&console.log("Registered new PlayerState",this.guid,Rt.all.length-1,Rt.all),this.context.connection.beginListen(ee.UserLeftRoom,this.onUserLeftRoom)}async start(){Yt&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await Bn(300),this.context.connection.userIsInRoom(this.owner)==!1&&(Yt&&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||(Yt&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?Yt&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(Yt&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):Yt&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){Yt&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),hc(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(Yt&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(ee.UserLeftRoom,this.onUserLeftRoom),Rt.all.splice(Rt.all.indexOf(this),1),this.isLocalPlayer){const e=Rt._local.indexOf(this);e>=0&&Rt._local.splice(e,1)}}onUserLeftRoom=e=>{if(e.userId===this.owner){Yt&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}}};Qu([ry(ly.prototype.onOwnerChange)],ly.prototype,"owner");let Sn=ly;var eE=Object.defineProperty,hl=(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 eo extends M{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&&(G.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}hl([u()],eo.prototype,"position"),hl([u()],eo.prototype,"showNeedleLogo"),hl([u()],eo.prototype,"showSpatialMenu"),hl([u()],eo.prototype,"createFullscreenButton"),hl([u()],eo.prototype,"createMuteButton"),hl([u()],eo.prototype,"createQRCodeButton");var tE=Object.defineProperty,cy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tE(e,t,n),n};const qc=w("debugwebxr"),Rx=new U().setFromAxisAngle(new b(0,1,0),Math.PI);class Ts extends M{head;leftHand;rightHand;_leftHandMeshes;_rightHandMeshes;_syncTransforms;async onEnterXR(e){if(!this.activeAndEnabled)return;qc&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=Sn.getFor(this);if(t?.owner){const i=this.gameObject.addComponent(Le);i.avatar=this.gameObject,i.connectionId=t.owner}else this.context.connection.isConnected?console.error("No player state found for avatar",this):t&&!this.context.connection.isConnected&&(t.dontDestroy=!0)}onLeaveXR(e){const t=this.gameObject.getComponent(Le);t&&t.destroy()}onUpdateXR(e){if(!this.activeAndEnabled)return;const t=Sn.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,Ki);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(Rx),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(Rx),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=>{Oo(s,!n)})}}updateRemoteAvatarVisibility(){if(this.context.connection.isConnected){const e=Sn.getFor(this);if(e&&e.isLocalPlayer==!1){const t=Y.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,Ki);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};M_.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 te("",this.sourceId,this.head));else{const e=new k;e.name="Head";const t=gr.createPrimitive(mr.Cube);e.add(t),this.gameObject.add(e),this.head=new te("",this.sourceId,e),qc&&console.log("Create head",e)}if(this.rightHand)this.rightHand instanceof k&&(this.rightHand=new te("",this.sourceId,this.rightHand));else{const e=new k;e.name="Right Hand",this.gameObject.add(e),this.rightHand=new te("",this.sourceId,e),qc&&console.log("Create right hand",e)}if(this.leftHand)this.leftHand instanceof k&&(this.leftHand=new te("",this.sourceId,this.leftHand));else{const e=new k;e.name="Left Hand",this.gameObject.add(e),this.leftHand=new te("",this.sourceId,e),qc&&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)}),Sn.isLocalPlayer(this.gameObject)&&(this._syncTransforms=x.getComponentsInChildren(this.gameObject,wn))}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 Om(a);qc&&console.log("Avatar loaded results:",l)}}cy([u(te)],Ts.prototype,"head"),cy([u(te)],Ts.prototype,"leftHand"),cy([u(te)],Ts.prototype,"rightHand");var iE=Object.defineProperty,Zu=(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&&iE(e,t,n),n};const Es=w("debugwebxr"),As=new Array;class Fo extends M{createControllerModel=!0;createHandModel=!0;customLeftHand;customRightHand;static factory=new RC;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&&Fa(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&&(Fa(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&&(Fa(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(Y.active&&(Es&&(As[0]=Date.now()),this.updateRendering(Y.active),Es)){const e=Date.now()-As[0];As.push(e),As.length>=30&&(As[0]=0,As.reduce((t,i)=>t+i,0)/As.length,As.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){Es&&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(ka))}}}}async loadModel(e,t){if(!e.connected)return console.warn("XRControllerModel.onXRControllerAdded: controller is not connected anymore",e.side),null;const i=await te.getOrCreate("",t).instantiate();return Fa(i),Y.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||(Es?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 bo;Zg(s,i),await Du(s,i,this.sourceId??"");const r=If(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;Fa(c);const h=new TC(c,n,s.path,a,s,d=>{const p=r?.gltf;p?.scene.children?.length===0&&(p.scene.children[0]=d),r?.gltf&&fn().createBuiltinComponents(e.context,e.sourceId||a,r.gltf,null,r),d.traverse(g=>{g.layers.set(2),Y.active?.isPassThrough&&!l&&this.makeOccluder(g),g instanceof H&&Ve.assignMeshLOD(g,0)}),t.connected||(Es&&F.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),d.removeFromParent())});if(Es&&c.add(new _i(.5)),t.inputSource.hand){Es&&console.log(t.inputSource.hand);for(const d of t.inputSource.hand.values())if(n.joints[d.jointName]===void 0){const p=new rs;p.matrixAutoUpdate=!1,p.visible=!0,n.joints[d.jointName]=p,n.add(p)}}else Es&&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 ve&&(t=e.material=t.clone(),t.depthWrite=!0,t.depthTest=!0,t.colorWrite=!1,e.receiveShadow=!1,e.renderOrder=-100)}}}Zu([u()],Fo.prototype,"createControllerModel"),Zu([u()],Fo.prototype,"createHandModel"),Zu([u(te)],Fo.prototype,"customLeftHand"),Zu([u(te)],Fo.prototype,"customRightHand");class Ku extends M{}var nE=Object.defineProperty,Is=(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&&nE(e,t,n),n};const hy=w("debugwebxr");class Ei extends M{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=$(i.x,0,i.y);n.multiplyScalar(this.context.time.deltaTimeUnscaled*this.movementSpeed);const s=$e(t);n.multiplyScalar(s.x),n.applyQuaternion(e.xr.poseOrientation),n.y=0,n.applyQuaternion(t.worldQuaternion),E()&&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=Z(this.context.mainCamera).clone();t.rotateY(n*j.toRadians(this.rotationStep));const r=Z(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 va){const r=n.normal?.dot($(0,1,0));if(r!==void 0&&r<.4)return}let s=n?.point;if(!s&&!this.useTeleportTarget){this._plane||(this._plane=new nr(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 ZS(a.origin,$(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,Ku))return;const r=s.clone();if(hy&&F.DrawSphere(s,.025,16711680,5),this.context.mainCamera?.position){const a=this.context.xr?.getUserOffsetInRig();a&&(a.y=0,r.sub(a),hy&&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=j.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;hy&&(F.DrawWireSphere(c.point,.025*h,16711680),F.DrawLabel($(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 g=n.material.opacity;if(p?g=1:g=c.distance<.15*h?.2:.6,n.material.opacity=j.lerp(n.material.opacity,g,this.context.time.deltaTimeUnscaled/.1),n.visible){if(c.normal){this.updateHitPointerPosition(i,n,c.distance);const f=c.normal.applyQuaternion(be(c.object));n.quaternion.setFromUnitVectors(oE,f)}else this.updateHitPointerPosition(i,n,c.distance);n.parent!==this.context.scene&&this.context.scene.add(n)}}else this._hitDiscs[t]&&(this._hitDiscs[t].visible=!1)}}isObjectWithInteractiveComponent(e,t=0){return yu(e)||e.isUI===!0?!0:e.isScene?!1:e.parent?this.isObjectWithInteractiveComponent(e.parent,t+1):!1}updateHitPointerPosition(e,t,i){const n=$(e.rayWorldPosition);n.add($(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 sd(.3,6,6),new xe({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:vi}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new EC;e.layers.disableAll(),e.layers.enable(2);const t=new AC;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 IC({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:$0,dashed:!1});return e.material=s,e}}Is([u()],Ei.prototype,"movementSpeed"),Is([u()],Ei.prototype,"rotationStep"),Is([u()],Ei.prototype,"useTeleport"),Is([u()],Ei.prototype,"usePinchToTeleport"),Is([u()],Ei.prototype,"useTeleportTarget"),Is([u()],Ei.prototype,"useTeleportFade"),Is([u()],Ei.prototype,"showRays"),Is([u()],Ei.prototype,"showHits");const oE=new b(0,1,0);var sE=Object.defineProperty,_t=(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};const Xc=w("debugwebxr"),rE=w("debugusdz"),rt=class Al extends M{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(){Y.getXRSync(this.context)}onEnable(){window.location.protocol!=="https:"&&ge('<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API" target="_blank">WebXR</a> only works on secure connections (https).'),this.useQuicklookExport&&(x.findObjectOfType(io)||(Xc&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=x.addComponent(this.gameObject,io),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0)),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(Xc&&console.warn("WebXR: No default avatar set, using static default avatar"),this.defaultAvatar=new te("https://cdn.needle.tools/static/avatars/DefaultAvatar.glb")),this.defaultAvatar&&(this._playerSync=this.gameObject.getOrAddComponent(ay),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 Y.isVRSupported()&&this.createVRButton?Y.offerSession("immersive-vr","default",this.context):this.createARButton&&await Y.isARSupported()&&this.createARButton?Y.offerSession("immersive-ar","default",this.context):!1}get session(){return Y.active??null}get sessionMode(){return Y.activeMode??null}get arSessionRoot(){return this._activeWebARSessionRoot}async enterVR(e){return Y.start("immersive-vr",e,this.context)}async enterAR(e){return Y.start("immersive-ar",e,this.context)}exitXR(){Y.stop()}_exitXRMenuButton;_previousXRState=0;_spatialGrabRaycaster;_activeWebARSessionRoot=null;get isActiveWebXR(){return!Al.activeWebXRComponent||Al.activeWebXRComponent===this}onBeforeXR(e,t){if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${Al.activeWebXRComponent?.name}). This is ignored: ${this.name}`);return}Al.activeWebXRComponent=this,e=="immersive-ar"&&this.useDepthSensing&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("depth-sensing"))}async onEnterXR(e){if(!this.isActiveWebXR)return;Xc&&console.log("WebXR onEnterXR"),this._previousXRState=Jt.Global.Mask;const t=e.xr.isVR;if(Jt.Global.Set(t?Qn.VR:Qn.AR),e.xr.isAR){let i=x.findObjectOfType(Ui);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,Ui),this._createdComponentsInSession.push(i)}else(Xc||E())&&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(la)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(la))),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){Jt.Global.Set(this._previousXRState),this._playerSync?.destroyInstance();for(const t of this._createdComponentsInSession)t.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),Hl(1).then(()=>Al.activeWebXRComponent=null)}}setDefaultMovementEnabled(e){let t=this.gameObject.getComponent(Ei);return!t&&e&&(t=this.gameObject.addComponent(Ei),this._createdComponentsInSession.push(t)),t&&(t.enabled=e),t}setDefaultControllerRenderingEnabled(e){let t=this.gameObject.getComponent(Fo);return!t&&e&&(t=this.gameObject.addComponent(Fo),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=>{Xc&&console.log("WebXR.onAvatarSpawned",e);let t=x.getComponentInChildren(e,Ts);t??=x.addComponent(e,Ts)};getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=Zs.getOrCreate()),this._buttonFactory}_buttonFactory;handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((G.isiOS()&&G.isSafari()||rE)&&this.useQuicklookExport){const e=x.findObjectOfType(io);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&&!G.isQuest()&&Y.isVRSupported().then(e=>{if(!e){const t=this.getButtonsFactory().createSendToQuestButton();this.addButton(t,50)}}),this.createQRCode){const e=Da(eo);if(e&&e.createQRCodeButton===!1)E()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!G.isMobileDevice()){const t=In.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}};_t([u()],rt.prototype,"createVRButton"),_t([u()],rt.prototype,"createARButton"),_t([u()],rt.prototype,"createSendToQuestButton"),_t([u()],rt.prototype,"createQRCode"),_t([u()],rt.prototype,"useDefaultControls"),_t([u()],rt.prototype,"showControllerModels"),_t([u()],rt.prototype,"showHandModels"),_t([u()],rt.prototype,"usePlacementReticle"),_t([u(te)],rt.prototype,"customARPlacementReticle"),_t([u()],rt.prototype,"usePlacementAdjustment"),_t([u()],rt.prototype,"arScale"),_t([u()],rt.prototype,"useXRAnchor"),_t([u()],rt.prototype,"autoPlace"),_t([u()],rt.prototype,"autoCenter"),_t([u()],rt.prototype,"useQuicklookExport"),_t([u()],rt.prototype,"useDepthSensing"),_t([u()],rt.prototype,"useSpatialGrab"),_t([u(te)],rt.prototype,"defaultAvatar");let Ju=rt;const ep=w("debugusdzbehaviours");class dy{get extensionName(){return"Behaviour"}behaviours=[];addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+ca.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)}),ep&&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=ep;let a=`graph LR
1262
+ `,l="";function c(d){if(d instanceof Fr){r&&(a+=`subgraph Group_${d.id}
1263
+ `);for(const p of d.actions)r&&(a+=`${d.id}[${d.id}] -- ${d.type},loops:${d.loops} --> ${p.id}[${p.id}]
1264
+ `),c(p);r&&(a+=`end
1265
+ `)}else if(d instanceof fi){d.tokenId==="StartAnimation"&&s.add(d);let p=d.tokenId;d.type!==void 0&&(p+=":"+d.type);const g=d.affectedObjects;if(g)if(Array.isArray(g))for(const m of g)i.add(m),r&&(l+=`${d.id}[${d.id}
1266
+ ${p}] -- ${p} --> ${m.uuid}(("${m.displayName||m.name||m.uuid}"))
1267
+ `);else typeof g=="object"?(i.add(g),r&&(l+=`${d.id}[${d.id}
1268
+ ${p}] -- ${p} --> ${g.uuid}(("${g.displayName||g.name||g.uuid}"))
1269
+ `)):typeof g=="string"&&i.add({uuid:g});const f=d.xFormTarget;f&&(typeof f=="object"?(i.add(f),r&&(l+=`${d.id}[${d.id}
1270
+ ${p}] -- ${p} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
1271
+ `)):typeof f=="string"&&i.add({uuid:f}))}}function h(d,p){if(Array.isArray(d))for(const g of d)h(g,p);else if(d instanceof Ys){let g=d.tokenId;d.type!==void 0&&(g+=":"+d.type),typeof d.targetId=="object"&&(t.add(d.targetId),r&&(l+=`${d.targetId.uuid}(("${d.targetId.displayName}")) --> ${d.id}[${d.id}
1272
+ ${g}]
1273
+ `)),r&&(a+=`${d.id}((${d.id})) -- ${g} --> ${p.id}[${p.tokenId||p.id}]
1274
+ `)}}for(const d of this.behaviours)r&&(a+=`subgraph ${d.id}
1275
+ `),c(d.action),h(d.trigger,d.action),r&&(a+=`end
1276
+ `);r&&(a+=`
1277
+ `+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
1278
+ title Animations
1279
+ dateFormat X
1280
+ axisFormat %s
1281
+ `;const p=Array.from(s),g=new Set;for(const _ of p)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const v of _.affectedObjects)g.add(v);else g.add(_.affectedObjects);r&&(d+=`section ${_.animationName} (${_.id})
1282
+ `,d+=`${_.id} : ${_.start}, ${_.duration}s
1283
+ `)}r&&s.size&&console.log(d);const f=new Set;for(const _ of g){_.getPath||console.error("USDZExporter: Animation target object has no getPath method. This is likely a bug",_);let v=_.getPath();v.startsWith("<")&&(v=v.substring(1)),v.endsWith(">")&&(v=v.substring(0,v.length-1)),f.add({path:v,obj:_})}const m=Array.from(f).sort((_,v)=>_.path.length-v.path.length),y=new Array;for(let _=0;_<m.length;_++)for(let v=_+1;v<m.length;v++)if(m[v].path.startsWith(m[_].path)){const P=m[v],T=m[_];y.push({child:P.obj.displayName+" ("+P.path+")",parent:T.obj.displayName+" ("+T.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);ep&&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){ep&&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 uy{get extensionName(){return"Physics"}onExportObject(e,t,i){const n=x.getComponents(e,Ye).filter(l=>l.enabled),s=x.getComponents(e,ai).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 Ye,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 Xa){const d=a;l.appendLine('token shapeType = "Sphere"'),l.appendLine(`float radius = ${d.radius}`)}else if(a instanceof ku){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 To){const d=a;l.appendLine('token shapeType = "Capsule"'),l.appendLine(`float radius = ${d.radius}`),l.appendLine(`float height = ${d.height}`)}else if(a instanceof Cs&&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 aE=w("debugshadowcomponents");ab.prototype.interactable={get(){return this.interactive},set(o){this.interactable=o}};class an extends M{isRoot(){return this.Root?.gameObject===this.gameObject}get canvas(){const e=this.Root;return e?.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){ei.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,Qc)),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,an),!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[Si]=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),dc&&e.add(new _i(.5)),this.onAfterAddedToScene(),n&&YC(),aE&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Si]===void 0||e[Si]===this)&&(e[Si]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,i){if(e&&e[Si]===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 Qc extends an{awake(){super.awake()}}var lE=Object.defineProperty,cE=Object.getOwnPropertyDescriptor,Yc=(o,e,t,i)=>{for(var n=i>1?void 0:i?cE(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&&lE(e,t,n),n};const py=w("debugui"),my=w("debuguilayout");class Tx{width;height}class Ex{x;y;width;height}const Cn=new b,Zc=new J,tp=new U,dl=class X1 extends an{get parent(){return this._parentRectTransform}get translation(){return this.gameObject.position}get rotation(){return this.gameObject.quaternion}get scale(){return this.gameObject.scale}_anchoredPosition;get anchoredPosition(){return this._anchoredPosition||(this._anchoredPosition=new K),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}sizeDelta=new K(100,100);pivot=new K(.5,.5);anchorMin=new K(0,0);anchorMax=new K(1,1);minWidth;minHeight;get width(){let e=this.sizeDelta.x;if(this.anchorMin.x!==this.anchorMax.x&&this._parentRectTransform){const t=this._parentRectTransform.width,i=this.anchorMax.x-this.anchorMin.x;e=t*i,e+=this.sizeDelta.x}return this.minWidth!==void 0&&e<this.minWidth?this.minWidth:e}get height(){let e=this.sizeDelta.y;if(this.anchorMin.y!==this.anchorMax.y&&this._parentRectTransform){const t=this._parentRectTransform.height,i=this.anchorMax.y-this.anchorMin.y;e=t*i,e+=this.sizeDelta.y}return this.minHeight!==void 0&&e<this.minHeight?this.minHeight:e}lastMatrix;rectBlock;_transformNeedsUpdate=!1;_initialPosition;_parentRectTransform;_lastUpdateFrame=-1;awake(){super.awake(),this._lastUpdateFrame=-1,this._parentRectTransform=void 0,this.rectBlock=new k,this.rectBlock.name=this.name,this.lastMatrix=new J,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new K),Ha(this,"_anchoredPosition",()=>{this.markDirty()}),Ha(this,"sizeDelta",()=>{this.markDirty()}),Ha(this,"pivot",()=>{this.markDirty()}),Ha(this,"anchorMin",()=>{this.markDirty()}),Ha(this,"anchorMax",()=>{this.markDirty()})}onEnable(){super.onEnable(),this.rectBlock||(this.rectBlock=new k),this.lastMatrix||(this.lastMatrix=new J),this._lastAnchoring||(this._lastAnchoring=new K),this._initialPosition||(this._initialPosition=new b),this._anchoredPosition||(this._anchoredPosition=new K),this.addShadowComponent(this.rectBlock),this._transformNeedsUpdate=!0,this.canvas?.registerTransform(this)}onDisable(){super.onDisable(),this.removeShadowComponent(),this.canvas?.unregisterTransform(this)}onParentRectTransformChanged(e){this._transformNeedsUpdate||this.onApplyTransform(my?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(my&&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,X1):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,my&&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,Cn.set(0,0,0),this.applyPivot(Cn),t.matrix.setPosition(Cn.x,Cn.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&(tp.copy(this.gameObject.quaternion),tp.x*=-1,tp.z*=-1,Zc.makeRotationFromQuaternion(tp),t.matrix.premultiply(Zc)),Cn.set(0,0,0),this.applyAnchoring(Cn),this.canvas?.screenspace?Cn.z+=.1:Cn.z+=.01,Zc.identity(),Zc.setPosition(Cn.x,Cn.y,Cn.z),t.matrix.premultiply(Zc),t.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const i=!0;for(const n of tu(this.gameObject,an,i,1)){if(n===this||!n.activeAndEnabled)continue;const s=n;s.onParentRectTransformChanged&&s.onParentRectTransformChanged(this)}}_lastAnchoring;applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new K);const t=this._lastAnchoring.sub(this._anchoredPosition);this.gameObject.position.x+=t.x,this.gameObject.position.y+=t.y,this._lastAnchoring.copy(this._anchoredPosition),e.x+=this._initialPosition.x-this.gameObject.position.x,e.y+=this._initialPosition.y-this.gameObject.position.y,e.z+=this._initialPosition.z-this.gameObject.position.z;const i=this._parentRectTransform;if(i){let n=0;const s=1-this.anchorMax.y-this.anchorMin.y;n-=i.height*.5*s,e.y+=n;let r=0;const a=1-this.anchorMax.x-this.anchorMin.x;r-=i.width*.5*a,e.x+=r}}applyPivot(e){if(this.pivot&&!this.isRoot()){const t=this.pivot.x-.5;e.x-=t*this.sizeDelta.x*this.gameObject.scale.x;const i=this.pivot.y-.5;e.y-=i*this.sizeDelta.y*this.gameObject.scale.y}}getBasicOptions(){const e={width:this.sizeDelta.x,height:this.sizeDelta.y,offset:0,backgroundOpacity:0,borderWidth:0,borderRadius:0,borderOpacity:0,letterSpacing:-.03};return this.ensureValidSize(e),e}ensureValidSize(e,t=1e-4){return e.width<=0&&(e.width=t),e.height<=0&&(e.height=1e-4),e}_createdBlocks=[];_createdTextBlocks=[];createNewBlock(e){e={...this.getBasicOptions(),...e},py&&console.log(this.name,e);const t=new ab(e);return this._createdBlocks.push(t),t}createNewText(e){py&&console.log(e),e={...this.getBasicOptions(),...e},py&&console.log(this.name,e);const t=new rb(e);return this._createdTextBlocks.push(t),t}};Yc([u(K)],dl.prototype,"anchoredPosition",1),Yc([u(K)],dl.prototype,"sizeDelta",2),Yc([u(K)],dl.prototype,"pivot",2),Yc([u(K)],dl.prototype,"anchorMin",2),Yc([u(K)],dl.prototype,"anchorMax",2);let Pn=dl;var hE=Object.defineProperty,Ax=(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&&hE(e,t,n),n};class ul extends M{effectColor;effectDistance}Ax([u(se)],ul.prototype,"effectColor"),Ax([u(K)],ul.prototype,"effectDistance");var dE=Object.defineProperty,uE=Object.getOwnPropertyDescriptor,Ix=(o,e,t,i)=>{for(var n=i>1?void 0:i?uE(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&&dE(e,t,n),n};const ip={backgroundColor:new ne(1,1,1),backgroundOpacity:1,borderColor:new ne(1,1,1),borderOpacity:1},gy=class Qh extends an{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 ne(1,0,1);onColorChanged(){this.uiObject&&(this.sRGBColor.copy(this._color),this.sRGBColor.convertLinearToSRGB(),ip.backgroundColor=this.sRGBColor,ip.backgroundOpacity=this._color.alpha*this._alphaFactor,this.applyEffects(ip,this._alphaFactor),this.uiObject.set(ip),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,Pn)),!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 ZC(this.uiObject)),this.uiObject.setupState(e.state,e.attributes))}setOptions(e){this.makePanel(),this.uiObject&&this.uiObject.set(e)}awake(){super.awake(),this.makePanel(),Ha(this,"_color",()=>rR(this,this.onColorChanged))}onEnable(){super.onEnable(),this.uiObject&&(this.rectTransform.shadowComponent?.add(this.uiObject),this.addShadowComponent(this.uiObject,this.rectTransform))}onDisable(){super.onDisable(),this.uiObject&&this.removeShadowComponent()}_currentlyCreatingPanel=!1;makePanel(){if(this.uiObject||this._currentlyCreatingPanel)return;this._currentlyCreatingPanel=!0;const e={backgroundColor:this.color,backgroundOpacity:this.color.alpha,offset:.015};this.onBeforeCreate(e),this.applyEffects(e),this.onCreate(e),this.controlsChildLayout=!1,this._currentlyCreatingPanel=!1,this.onAfterCreated(),this.onColorChanged()}onBeforeCreate(e){}onCreate(e){this.uiObject=this.rectTransform.createNewBlock(e),this.uiObject.name=this.name}onAfterCreated(){}applyEffects(e,t=1){const i=this.gameObject?.getComponent(ul);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(Qh.textureCache.has(e))e=Qh.textureCache.get(e);else if(!e.isRenderTargetTexture){const t=e.clone();t.colorSpace=go,Qh.textureCache.set(e,t),e=t}this.setOptions({backgroundImage:e,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),Ve.assignTextureLOD(e,0).then(t=>{t instanceof Re&&(e&&Qh.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)}};Ix([u(se)],gy.prototype,"color",1),Ix([u()],gy.prototype,"raycastTarget",2);let Kc=gy;class Jc extends Kc{_flippedObject=!1;onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var pE=Object.defineProperty,mE=Object.getOwnPropertyDescriptor,Uo=(o,e,t,i)=>{for(var n=i>1?void 0:i?mE(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&&pE(e,t,n),n};const zr=w("debugtext");var at=(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))(at||{}),Lx=(o=>(o[o.Normal=0]="Normal",o[o.Bold=1]="Bold",o[o.Italic=2]="Italic",o[o.BoldAndItalic=3]="BoldAndItalic",o))(Lx||{});class Bt extends Kc{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 ne(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 _m({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 _m(r);this.uiObject?.add(a)}else{r.textContent=e.substring(i.endIndex),this.handleTag(i,r,n);const a=new _m(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&&(xu(r,i),e[s]=!0)}if(!n)break;yield}}handleTag(e,t,i){if(!e.isEndTag){if(e.type.includes("color")){const n=new fy(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 ne(1,1,1)}else if(e.type=="b"){this.setFont(t,1);const n=new fy(e,{fontWeight:700});i.push(n)}else if(e.type=="i"){this.setFont(t,2);const n=new fy(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=lb.getFontFamily(n);switch(s||(s=lb.addFontFamily(n)),e.fontFamily=s,t){default:case 0:e.fontWeight=400,e.fontStyle="normal";break;case 1:e.fontWeight=700,e.fontStyle="normal";break;case 2:e.fontWeight=400,e.fontStyle="italic";break;case 3:e.fontStyle="italic",e.fontWeight=400}let r=s.getVariant(e.fontWeight,e.fontStyle);if(!r){let a=n;a?.endsWith("-msdf.json")||(a+="-msdf.json");let l=n;l?.endsWith(".png")||(l+=".png"),r=s.addVariant(e.fontWeight,e.fontStyle,a,l),r?.addEventListener("ready",()=>{this.markDirty()})}}getFamilyNameWithCorrectSuffix(e,t){const i=e.lastIndexOf("-");if(i<0)return e;const n=e.substring(i+1)?.toLowerCase();if(gE.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);switch(zr&&console.log("Select font: ",e,Lx[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}}}Uo([u()],Bt.prototype,"alignment",2),Uo([u()],Bt.prototype,"verticalOverflow",2),Uo([u()],Bt.prototype,"horizontalOverflow",2),Uo([u()],Bt.prototype,"lineSpacing",2),Uo([u()],Bt.prototype,"supportRichText",2),Uo([u(URL)],Bt.prototype,"font",2),Uo([u()],Bt.prototype,"fontStyle",2),Uo([u()],Bt.prototype,"text",1),Uo([u()],Bt.prototype,"fontSize",1);class fy{tag;previousValues;constructor(e,t){this.tag=e,this.previousValues=t}}const gE=["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/${$u(this.material)}>`),t.closeBlock()}}class yy{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 fE=new J().makeRotationY(Math.PI),yE=new J().makeScale(-1,1,-1);class np{get extensionName(){return"text"}exportText(e,t,i){const n=x.getComponent(e,Bt);if(!n)return;const s=x.getComponent(e,Pn);let r=100,a=100;s&&(r=s.width,a=s.height);const l=fE.clone();s&&l.premultiply(yE),t.setMatrix(l);const c=n.color.clone();t.material=new ut({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 g=yy.multiLine(p,r,a,"center","bottom","flowing");this.setTextAlignment(g,n.alignment),this.setOverflow(g,n),t.material&&(g.material=t.material),g.pointSize=this.convertToTextSize(n.fontSize),g.depth=.001,g.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 at.LowerLeft:case at.MiddleLeft:case at.UpperLeft:e.horizontalAlignment="left";break;case at.LowerCenter:case at.MiddleCenter:case at.UpperCenter:e.horizontalAlignment="center";break;case at.LowerRight:case at.MiddleRight:case at.UpperRight:e.horizontalAlignment="right";break}switch(t){case at.LowerLeft:case at.LowerCenter:case at.LowerRight:e.verticalAlignment="bottom";break;case at.MiddleLeft:case at.MiddleCenter:case at.MiddleRight:e.verticalAlignment="middle";break;case at.UpperLeft:case at.UpperCenter:case at.UpperRight:e.verticalAlignment="top";break}}}var bE=Object.defineProperty,Ze=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&bE(e,t,n),n};const jx=w("debuguilayout");class Nr{left=0;right=0;top=0;bottom=0;get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}Ze([u()],Nr.prototype,"left"),Ze([u()],Nr.prototype,"right"),Ze([u()],Nr.prototype,"top"),Ze([u()],Nr.prototype,"bottom");class Ai extends M{_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&&(jx&&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(){jx&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(Pn);const e=this.gameObject.getComponentInParent(ml);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(ml);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}Ze([u()],Ai.prototype,"childAlignment"),Ze([u()],Ai.prototype,"reverseArrangement"),Ze([u()],Ai.prototype,"spacing"),Ze([u(Nr)],Ai.prototype,"padding"),Ze([u()],Ai.prototype,"minWidth"),Ze([u()],Ai.prototype,"minHeight"),Ze([u()],Ai.prototype,"flexibleHeight"),Ze([u()],Ai.prototype,"flexibleWidth"),Ze([u()],Ai.prototype,"preferredHeight"),Ze([u()],Ai.prototype,"preferredWidth");class Ls extends Ai{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,g=a?r:n,f=a?i:s,m=.5*(a?this.childAlignment%3:Math.floor(this.childAlignment/3));let y=0;a?y+=this.padding.left:y+=this.padding.top;let _=0,v=0;for(let I=0;I<this.gameObject.children.length;I++){const W=this.gameObject.children[I],D=x.getComponent(W,Pn);D?.activeAndEnabled&&(v+=1,a?_+=D.width:_+=D.height)}let P=0;const T=this.spacing*(v-1);if(d||c){let I=0;a?I=n-=T:I=r-=T,v>0&&(P=I/v)}let O=0;O+=this.padding.left,O-=this.padding.right,m!==0&&(y=f-_,y*=m,y-=T*m,a?(y-=this.padding.right*m,y+=this.padding.left*(1-m),y<this.padding.left&&(y=this.padding.left)):(y-=this.padding.bottom*m,y+=this.padding.top*(1-m),y<this.padding.top&&(y=this.padding.top)));let A=1;for(let I=0;I<this.gameObject.children.length;I++){const W=this.gameObject.children[I],D=x.getComponent(W,Pn);if(D?.activeAndEnabled){D.pivot?.set(.5,.5),D.anchorMin.set(0,1),D.anchorMax.set(0,1);const q=i*.5+O*.5;D.anchoredPosition.x!==q&&(D.anchoredPosition.x=q);const ie=s*-.5;D.anchoredPosition.y!==ie&&(D.anchoredPosition.y=ie),p&&h&&D.sizeDelta[l]!==g&&(D.sizeDelta[l]=g),d&&c&&D.sizeDelta[t]!==P&&(D.sizeDelta[t]=P);const L=a?D.width:D.height,V=L*.5;if(y+=V,d){const oe=P*A-P*.5;oe>y&&(y=oe-P*.5+L+this.padding.left,y-=V)}let N=y;t==="y"&&(N=-N),D.anchoredPosition[t]!==N&&(D.anchoredPosition[t]=N),y+=V,y+=this.spacing,A+=1}}}}Ze([u()],Ls.prototype,"childControlHeight"),Ze([u()],Ls.prototype,"childControlWidth"),Ze([u()],Ls.prototype,"childForceExpandHeight"),Ze([u()],Ls.prototype,"childForceExpandWidth"),Ze([u()],Ls.prototype,"childScaleHeight"),Ze([u()],Ls.prototype,"childScaleWidth");class by extends Ls{get primaryAxis(){return"y"}}class _y extends Ls{get primaryAxis(){return"x"}}class vy extends Ai{onCalculateLayout(){}}var _E=Object.defineProperty,vE=Object.getOwnPropertyDescriptor,to=(o,e,t,i)=>{for(var n=i>1?void 0:i?vE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&_E(e,t,n),n},Dx=(o=>(o[o.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",o[o.ScreenSpaceCamera=1]="ScreenSpaceCamera",o[o.WorldSpace=2]="WorldSpace",o[o.Undefined=-1]="Undefined",o))(Dx||{});const wy=w("debuguilayout"),tn=class Q1 extends Qc{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 Q1||(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,wy&&console.log("Canvas.Awake()",this.previousParent?.name+"/"+this.gameObject.name),super.awake()}start(){this.applyRenderSettings()}onEnable(){super.onEnable(),this._updateRenderSettingsRoutine=void 0,this._lastMatrixWorld=new J,this.applyRenderSettings(),document.addEventListener("resize",this._boundRenderSettingsChanged),this.context.pre_render_callbacks.push(this.onBeforeRenderRoutine),this.context.post_render_callbacks.push(this.onAfterRenderRoutine)}onDisable(){super.onDisable(),document.removeEventListener("resize",this._boundRenderSettingsChanged);const e=this.context.pre_render_callbacks.indexOf(this.onBeforeRenderRoutine);e!==-1&&this.context.pre_render_callbacks.splice(e,1);const t=this.context.post_render_callbacks.indexOf(this.onAfterRenderRoutine);t!==-1&&this.context.post_render_callbacks.splice(t,1)}_boundRenderSettingsChanged=this.onRenderSettingsChanged.bind(this);previousParent=null;_lastMatrixWorld=null;_rectTransforms=[];registerTransform(e){this._rectTransforms.push(e)}unregisterTransform(e){const t=this._rectTransforms.indexOf(e);t!==-1&&this._rectTransforms.splice(t,1)}_layoutGroups=new Map;registerLayoutGroup(e){const t=e.gameObject;this._layoutGroups.set(t,e)}unregisterLayoutGroup(e){const t=e.gameObject;this._layoutGroups.delete(t)}_receivers=[];registerEventReceiver(e){this._receivers.push(e)}unregisterEventReceiver(e){const t=this._receivers.indexOf(e);t!==-1&&this._receivers.splice(t,1)}async onEnterXR(e){this.screenspace?(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!1):(this.gameObject.visible=!1,await Hl(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(),ei.ensureUpdateMeshUI(cb,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(),ei.ensureUpdateMeshUI(cb,this.context,!0),this.context.renderer.render(this.gameObject,this.context.mainCamera),this.context.renderer.autoClear=e,this.context.renderer.autoClearColor=t,this.previousParent.add(this.gameObject)}this._lastMatrixWorld?.copy(this.gameObject.matrixWorld)};invokeBeforeRenderEvents(){for(const e of this._receivers)e.onBeforeCanvasRender?.(this)}handleLayoutUpdates(){this._lastMatrixWorld===null&&(this._lastMatrixWorld=new J);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);wy&&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(Ai)),(t.isDirty||i?.isDirty)&&(wy&&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(),we.OnBeforeRender))}*_updateRenderSettingsDelayed(){if(yield,this._updateRenderSettingsRoutine=void 0,this.shadowComponent){this.onUpdateRenderMode(),xu(this.shadowComponent,this);for(const e of x.getComponentsInChildren(this.gameObject,an))xu(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=j.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(Pn);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}}};to([u()],tn.prototype,"renderOnTop",1),to([u()],tn.prototype,"depthWrite",1),to([u()],tn.prototype,"doubleSided",1),to([u()],tn.prototype,"castShadows",1),to([u()],tn.prototype,"receiveShadows",1),to([u()],tn.prototype,"renderMode",1),to([u(tn)],tn.prototype,"rootCanvas",1),to([u()],tn.prototype,"scaleFactor",1),to([u(si)],tn.prototype,"worldCamera",2),to([u()],tn.prototype,"planeDistance",2);let ml=tn;var wE=Object.defineProperty,xE=Object.getOwnPropertyDescriptor,xy=(o,e,t,i)=>{for(var n=i>1?void 0:i?xE(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&&wE(e,t,n),n};class js extends M{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(),we.OnBeforeRender))}*applyChangesDelayed(){this._isDirty=!1,this.applyChangesNow()}_buffer=[];applyChangesNow(){this._buffer.length=0;for(const e of x.getComponentsInChildren(this.gameObject,an,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}xy([u()],js.prototype,"alpha",1),xy([u()],js.prototype,"interactable",2),xy([u()],js.prototype,"blocksRaycasts",2);class Sy{get extensionName(){return"tmui"}onExportObject(e,t,i){const n=x.getComponent(e,ml);if(n&&n.enabled&&n.renderMode===Dx.WorldSpace){const s=new np,r=x.getComponent(e,Pn),a=x.getComponent(e,js),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 g=x.getComponent(d,an);g&&(g.onEnable(),l.push(()=>{g.onDisable()}));const f=x.getComponent(d,Pn);f&&(f.onEnable(),f.updateTransform(),f.onApplyTransform(),l.push(()=>{f.onDisable()}));const m=x.getComponent(d,Bt);m&&(m.onEnable(),l.push(()=>{m.onDisable()})),l.push(()=>{x.setActive(d,p)})}}),r.width,r.height;const c=it.createEmpty(),h=r.shadowComponent;if(t.add(c),h){const d=h.matrix;c.setMatrix(d);const p=new Map,g=new Map;p.set(h,c),g.set(h,a?a.alpha:1),h.traverse(f=>{if(f===h)return;const m=it.createEmpty();m.setMatrix(f.matrix);const y=f.parent,_=!!y&&typeof y.textContent=="string"&&y.textContent.length>0;let v=g.get(y)||1;const P=x.getComponent(f,js);if(P&&(v*=P.alpha),f instanceof H&&_){const O=f[Si];O?s.exportText(O.gameObject,m,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),m.geometry=O;const A=new ne,I=f.material.opacity;A.copy(f.material.color),m.material=new xe({color:A,opacity:I*v,map:f.material.map,transparent:!0})}p.set(f,m),g.set(f,v);const T=p.get(y);if(!T){console.error("Error when exporting UI: shadow component parent not found!",f,f.parent);return}T.add(m)})}}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 eh=w("debugusdz");function SE(o,e){const t=[],i=x.getComponentsInChildren(o,ft),n=x.getComponentsInChildren(o,Lt),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 Wc;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;eh&&console.log(a);const l=[];for(const c of a.runtimeAnimatorController.enumerateActions()){eh&&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 Wc;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){eh&&console.log(a);const l=[];for(const c of a.animations)l.includes(c)||l.push(c);t.push({root:a.gameObject,clips:l})}eh&&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 CE(o,e){const t=x.getComponentsInChildren(o,Mi),i=x.getComponentsInChildren(o,Ms),n=new Array,s=new Array;eh&&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 Ms;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 PE(o){return new Et("DisableAtStart",Dt.sceneStartTrigger(),me.fadeAction(o,0,!1))}function Bx(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 OE=Object.defineProperty,kt=(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};const Ii=w("debugusdz"),kE=w("debugusdzpruning");class Wr{callToAction;checkoutTitle;checkoutSubtitle;callToActionURL}kt([u()],Wr.prototype,"callToAction"),kt([u()],Wr.prototype,"checkoutTitle"),kt([u()],Wr.prototype,"checkoutSubtitle"),kt([u()],Wr.prototype,"callToActionURL");const hi=class Yh extends M{static beforeExport=new he;static afterExport=new he;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(){Ii&&(console.log("USDZExporter",this),console.log("Debug USDZ Mode. Press 'T' to export"),window.addEventListener("keydown",e=>{switch(e.key){case"t":this.exportAndOpen();break}})),this.objectToExport||(this.objectToExport=this.gameObject),!this.objectToExport?.children?.length&&!this.objectToExport?.isMesh&&(this.objectToExport=this.context.scene)}onEnable(){const e=G.supportsQuickLookAR(),t=G.isiOS()||G.isiPad();!this.button&&(Ii||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=Bx(this.context,e),this.link.addEventListener("message",this.lastCallback)),Ii&&Te("USDZ Exporter enabled: "+this.name),document.getElementById("open-in-ar")?.addEventListener("click",this.onClickedOpenInARElement),nc.registerExporter(this)}onDisable(){this.button?.remove(),this.link?.removeEventListener("message",this.lastCallback),Ii&&Te("USDZ Exporter disabled: "+this.name),document.getElementById("open-in-ar")?.removeEventListener("click",this.onClickedOpenInARElement),nc.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+="-"+ox(),Vn()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=Bx(this.context,G.supportsQuickLookAR())),this.customUsdzFile)return Ii&&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;Yh.beforeExport.invoke({exporter:this});const t=await this.export(this.objectToExport).finally(()=>{Yh.afterExport.invoke({exporter:this})});return t?(Ii&&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){re.start("export-usdz",{onProgress:T=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:T}}))}}),re.report("export-usdz",{message:"Starting export",totalSteps:40,currentStep:0}),re.report("export-usdz",{message:"Load progressive textures",autoStep:5}),re.start("export-usdz-textures","export-usdz");const t=x.getComponentsInChildren(e,ci);for(const T of t)T&&T.enabled&&T.updateSprite(!0);const i=x.getComponentsInChildren(e,Ti),n=new Array;let s=0;for(const T of i){for(const O of T.sharedMeshes)if(O){const A=Ve.assignMeshLOD(O,0);A instanceof Promise&&n.push(new Promise((I,W)=>{A.then(()=>{s++,re.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:s,totalSteps:n.length}),I()}).catch(D=>W(D))}))}for(const O of T.sharedMaterials)if(O){const A=Ve.assignTextureLOD(O,0);A instanceof Promise&&n.push(new Promise((I,W)=>{A.then(()=>{s++,re.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:s,totalSteps:n.length}),I()}).catch(D=>W(D))}))}}Ii&&Te("Progressive Loading: "+n.length),await Promise.all(n),Ii&&Te("Progressive Loading: done"),re.end("export-usdz-textures");const r=Jt.Global.Mask;Jt.Global.Set(Qn.AR);const a=new cx,l=new qu(this.quickLookCompatible);let c;const h=[];this.interactive&&(h.push(new dy),h.push(new ca),globalThis.NEEDLE_USE_RAPIER&&x.getComponentsInChildren(e,Ye).length>0&&(this.physics?(c=new uy,h.push(c)):E()&&console.warn("USDZExporter: Physics export is disabled, but there are active Rigidbody components in the scene. They will not be exported.")),h.push(new np),h.push(new Sy));const d=[l,...h,...this.extensions],p={self:this,exporter:a,extensions:d,object:e};re.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,re.report("export-usdz","auto export animations and audio sources");const g=new Array;this.autoExportAnimations&&g.push(...SE(e,l)),d.find(T=>T.extensionName==="Audio")&&this.autoExportAudioSources&&g.push(...CE(e)),a.debug=Ii,a.pruneUnusedNodes=!kE;const f=ha.instance.objs.map(T=>T.batchedMesh);a.keepObject=T=>{let O=!0;const A=x.getComponent(T,Ti);return A&&!A.enabled&&(O=!1),O&&f.includes(T)&&(O=!1),O&&x.getComponentInParent(T,Ic)&&(O=!1),O&&x.getComponentInParent(T,Hn)&&(O=!1),Ii&&!O&&console.log("USDZExporter: Discarding object",T),O},a.beforeWritingDocument=()=>{if(E()&&l&&c){const T=l.animatedRoots;for(const O of T){const A=x.getComponentsInChildren(O,Ye).filter(W=>W.enabled),I=x.getComponents(O,ai).filter(W=>W.enabled&&!W.isTrigger);(A.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 m=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(T=>{T.visible||m.push(T)});const y=d.find(T=>T.extensionName==="Behaviour");this.interactive&&y&&m.length>0&&y.addBehavior(PE(m));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"),re.report("export-usdz","Invoking exporter.parse");const v=await a.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:d,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:_}),P=new Blob([v],{type:"model/vnd.usdz+zip"});this.revertWebARSessionRoot(),this.context.time.timeScale=this._previousTimeScale,re.report("export-usdz","Invoking after-export"),this.dispatchEvent(new CustomEvent("after-export",{detail:p}));for(const T of g)x.destroy(T);return Jt.Global.Set(r),re.end("export-usdz"),P}openInQuickLook(e,t){const i=e instanceof Blob?URL.createObjectURL(e):e,n=this.buildQuicklookOverlay();Ii&&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){Yh.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"){Ii&&ge("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");Ii&&Te("Quicklook url: "+n),n&&(Vn()?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),Vn()||(console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing"),e.callToAction="Close",e.checkoutTitle="\u{1F335} Made with Needle",e.checkoutSubtitle="_"),(e.callToAction?.length||e.checkoutTitle?.length||e.checkoutSubtitle?.length)&&(e.callToAction?.length||(e.callToAction="\0"),e.checkoutTitle?.length||(e.checkoutTitle="\0"),e.checkoutSubtitle?.length||(e.checkoutSubtitle="\0")),this.dispatchEvent(new CustomEvent("quicklook-overlay",{detail:e})),e}static invertForwardMatrix=new J().makeRotationY(Math.PI);static invertForwardQuaternion=new U().setFromEuler(new nt(0,Math.PI,0));_rootSessionRootWasAppliedTo=null;_rootPositionBeforeExport=new b;_rootRotationBeforeExport=new U;_rootScaleBeforeExport=new b;getARScaleAndTarget(){if(!this.objectToExport)return{scale:1,_invertForward:!1,target:this.gameObject,sessionRoot:null};const e=x.findObjectOfType(Ju);let t=x.getComponentInParent(this.objectToExport,Ui);t||(t=x.getComponentInChildren(this.objectToExport,Ui));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(Yh.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=Zs.getOrCreate().createQuicklookButton();return e.parentNode||this.context.menu.appendChild(e),e}};kt([u(k)],hi.prototype,"objectToExport"),kt([u()],hi.prototype,"autoExportAnimations"),kt([u()],hi.prototype,"autoExportAudioSources"),kt([u()],hi.prototype,"exportFileName"),kt([u(URL)],hi.prototype,"customUsdzFile"),kt([u(Wr)],hi.prototype,"customBranding"),kt([u()],hi.prototype,"anchoringType"),kt([u()],hi.prototype,"maxTextureSize"),kt([u()],hi.prototype,"planeAnchoringAlignment"),kt([u()],hi.prototype,"interactive"),kt([u()],hi.prototype,"physics"),kt([u()],hi.prototype,"allowCreateQuicklookButton"),kt([u()],hi.prototype,"quickLookCompatible");let io=hi;var ME=Object.defineProperty,RE=Object.getOwnPropertyDescriptor,Cy=(o,e,t,i)=>{for(var n=RE(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ME(e,t,n),n};class gl extends M{get fog(){return this._fog||(this._fog=new D0(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)}}Cy([u()],gl.prototype,"near"),Cy([u()],gl.prototype,"far"),Cy([u(ne)],gl.prototype,"color");var TE=Object.defineProperty,Py=(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&&TE(e,t,n),n};class Vr extends M{objectBounds=!1;color;isGizmo=!0;_gizmoObject=null;_boxHelper=null;onEnable(){this.isGizmo&&!dc||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new KS(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=hg(this.color??16776960))),this.objectBounds?(this.scene.add(this._gizmoObject),this._boxHelper=this._gizmoObject,this.startCoroutine(this.syncObjectBounds(),we.OnBeforeRender)):this.gameObject.add(this._gizmoObject))}onDisable(){this._gizmoObject&&this.gameObject.remove(this._gizmoObject)}*syncObjectBounds(){for(;this._boxHelper;)this._boxHelper?.update(),yield}}Py([u()],Vr.prototype,"objectBounds"),Py([u(ne)],Vr.prototype,"color"),Py([u()],Vr.prototype,"isGizmo");var EE=Object.defineProperty,Oy=(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 fl extends M{isGizmo=!1;color0;color1;gridHelper;size;divisions;offset;onEnable(){if(this.isGizmo&&!dc)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new em(e,t,this.color0??new ne(.4,.4,.4),this.color1??new ne(.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)}}Oy([u()],fl.prototype,"isGizmo"),Oy([u(ne)],fl.prototype,"color0"),Oy([u(ne)],fl.prototype,"color1");var AE=Object.defineProperty,ky=(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};class My extends M{connectedBody;get rigidBody(){return this._rigidBody}_rigidBody=null;onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(Ye)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}ky([u(Ye)],My.prototype,"connectedBody");class Ry extends My{createJoint(e,t){this.context.physics.engine?.addFixedJoint(e,t)}}class th extends My{anchor;axis;createJoint(e,t){this.axis&&this.anchor&&this.context.physics.engine?.addHingeJoint(e,t,this.anchor,this.axis)}}ky([u(b)],th.prototype,"anchor"),ky([u(b)],th.prototype,"axis");var IE=Object.defineProperty,LE=Object.getOwnPropertyDescriptor,no=(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&&IE(e,t,n),n};function Ty(o){return o*Math.PI/180}const Fx=300,Ds=w("debuglights");class di extends M{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 ne(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}Ds&&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 ne(this.color??16777215),Ds&&console.log(this.name,this)}onEnable(){Ds&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Ds&&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(),we.LateUpdate))}onDisable(){Ds&&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,Ui)??void 0}onLeaveXR(e){}createLight(){const e=this.selfIsLight;if(e&&!this.light)switch(this.light=this.gameObject,this.light.name=this.name,this._intensity=this.light.intensity,this.type){case 1:this.setDirectionalLight(this.light);break}else if(!this.light)switch(this.type){case 1:const t=new tm(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-Fx*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),ar(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Ds){const r=new eC(this.light,.2,this.color);this.context.scene.add(r)}break;case 0:const i=new JS(this.color,this.intensity*Math.PI,this.range,Ty(this.spotAngle/2),1-Ty(this.innerSpotAngle/2)/Ty(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 im(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),Ds&&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=Fx*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,Ds&&this.context.scene.add(new tC(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)}}no([u()],di.prototype,"type",2),no([u(ne)],di.prototype,"color",1),no([u()],di.prototype,"shadowNearPlane",1),no([u()],di.prototype,"shadowBias",1),no([u()],di.prototype,"shadowNormalBias",1),no([u()],di.prototype,"shadows",1),no([u()],di.prototype,"lightmapBakeType",2),no([u()],di.prototype,"intensity",1),no([u()],di.prototype,"shadowDistance",1),no([u()],di.prototype,"shadowResolution",1),new b(0,0,0);var jE=Object.defineProperty,ih=(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&&jE(e,t,n),n};const Ey=w("debuglods"),DE=w("nolods");class yl{screenRelativeTransitionHeight;distance;renderers}ih([u()],yl.prototype,"screenRelativeTransitionHeight"),ih([u()],yl.prototype,"distance"),ih([u(Ti)],yl.prototype,"renderers");class BE{model;get renderers(){return this.model.renderers}constructor(e){this.model=e}}class nh extends M{fadeMode=0;localReferencePoint=void 0;lodCount=0;size=0;animateCrossFading=!1;lodModels;_lods=[];_settings=[];_lodsHandler;start(){if(Ey&&console.log("LODGROUP",this.name,this.lodModels,this),!DE&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const i of this.lodModels){const n=new BE(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;Ey&&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}Ey&&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}}}}ih([u(b)],nh.prototype,"localReferencePoint"),ih([u(yl)],nh.prototype,"lodModels");var FE=Object.defineProperty,Ux=(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&&FE(e,t,n),n};const op=w("debugnestedgltf");class oh extends M{filePath;loaded=new he;loadAssetInParent=!0;_isLoadingOrDoneLoading=!1;listenToProgress(e){this.filePath?.beginListenDownload(e)}preload(){return this.filePath?.preload()||null}async start(){if(this._isLoadingOrDoneLoading)return;op&&console.log(this,this.guid);const e=this.gameObject.parent;if(e&&this.filePath){this._isLoadingOrDoneLoading=!0;const t=new An;t.idProvider=new At(this.hash(this.guid)),t.parent=this.loadAssetInParent!==!1?e:this.gameObject,this.gameObject.updateMatrix();const i=this.gameObject.matrix;op&&console.log("Load nested:",this.filePath?.url??this.filePath,this.gameObject.position);const n=await this.filePath?.instantiate?.call(this.filePath,t);op&&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})),op&&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}}Ux([u(te)],oh.prototype,"filePath"),Ux([u(he)],oh.prototype,"loaded");var UE=Object.defineProperty,Ay=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&UE(e,t,n),n};const zE=w("debugnet"),sp=class R0 extends M{url=null;urlParameterName=null;localhost=null;awake(){zE&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?R0.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const i=w(this.urlParameterName);i&&typeof i=="string"&&(e=i)}if(!e)return null;const t=new RegExp("(((https?)|(?<socket_prefix>wss?))://)?(www.)?(?<url>.+)","gm").exec(e);return t?.groups?t?.groups.socket_prefix?e:"wss://"+t?.groups.url:null}static GetUrl(e,t){let i=e;const n=R0.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 Vi(e)}};Ay([u()],sp.prototype,"url"),Ay([u()],sp.prototype,"urlParameterName"),Ay([u()],sp.prototype,"localhost");let Iy=sp;var NE=Object.defineProperty,rp=(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&&NE(e,t,n),n};class $r extends M{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=Z(this.from),t=be(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 nr(this.gameObject.up,0),l=Z(this.referenceSpace);a.setFromNormalAndCoplanarPoint(this.gameObject.up,l);const c=new b(0,0,0);a.projectPoint(e,c),e.copy(c)}this.affectPosition&&mt(this.gameObject,e);const n=new nt(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),s=new U().setFromEuler(n);this.affectRotation&&mn(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)}}rp([u(x)],$r.prototype,"referenceSpace"),rp([u(x)],$r.prototype,"from"),rp([u(b)],$r.prototype,"positionOffset"),rp([u(b)],$r.prototype,"rotationOffset");var WE=Object.defineProperty,Bs=(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 ui{time=0;value=0;inTangent=1/0;inWeight;outTangent=1/0;outWeight;weightedMode;constructor(e=0,t=0){this.time=e,this.value=t}}Bs([u()],ui.prototype,"time"),Bs([u()],ui.prototype,"value"),Bs([u()],ui.prototype,"inTangent"),Bs([u()],ui.prototype,"inWeight"),Bs([u()],ui.prototype,"outTangent"),Bs([u()],ui.prototype,"outWeight"),Bs([u()],ui.prototype,"weightedMode");const zx=class Zh{static linearFromTo(e,t,i){const n=new Zh,s=new ui;s.time=0,s.value=e;const r=new ui;return r.time=i,r.value=t,n.keys.push(s,r),n}static constant(e){const t=new Zh,i=new ui;return i.time=0,i.value=e,t.keys.push(i),t}keys=[];clone(){const e=new Zh;return e.keys=this.keys?.map(t=>{const i=new ui;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:Zh.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,g=((r+c)*h-2*(l-s))/p,f=(3*(l-s)-(c+2*r)*h)/d,m=r,y=s,_=e-n,v=_*_,P=v*_;return g*P+f*v+m*_+y}};Bs([u(ui)],zx.prototype,"keys");let sh=zx;var VE=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&&VE(e,t,n),n};const ap=w("debugparticles");var zo=(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))(zo||{});class Hr{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=j.remap(e,s.time,a.time,0,1);t.r=j.lerp(s.color.r,a.color.r,l),t.g=j.lerp(s.color.g,a.color.g,l),t.b=j.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=j.remap(e,i.time,a.time,0,1);t.alpha=j.lerp(i.alpha,a.alpha,l)}else t.alpha=i.alpha;return t}}S([u()],Hr.prototype,"alphaKeys"),S([u()],Hr.prototype,"colorKeys");var rh=(o=>(o[o.Local=0]="Local",o[o.World=1]="World",o[o.Custom=2]="Custom",o))(rh||{}),lp=(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))(lp||{});const No=class Kh{static constant(e){const t=new Kh;return t.setConstant(e),t}static betweenTwoConstants(e,t){const i=new Kh;return i.setMinMaxConstant(e,t),i}static curve(e,t=1){const i=new Kh;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 Kh;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=j.clamp01(e),this.curve.evaluate(e)*this.curveMultiplier;case 2:case"TwoCurves":const n=e*this.curveMin.duration,s=e*this.curveMax.duration;return j.lerp(this.curveMin.evaluate(n),this.curveMax.evaluate(s),i%1)*this.curveMultiplier;case 3:case"TwoConstants":return j.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()],No.prototype,"mode"),S([u()],No.prototype,"constant"),S([u()],No.prototype,"constantMin"),S([u()],No.prototype,"constantMax"),S([u(sh)],No.prototype,"curve"),S([u(sh)],No.prototype,"curveMin"),S([u(sh)],No.prototype,"curveMax"),S([u()],No.prototype,"curveMultiplier");let Q=No;const Fs=class Tt{static constant(e){const t=new Tt;return t.constant(e),t}static betweenTwoColors(e,t){const i=new Tt;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,Tt._temp),Tt._temp;case 2:case"TwoColors":return Tt._temp.lerpColors(this.colorMin,this.colorMax,i);case 3:case"TwoGradients":return this.gradientMin.evaluate(e,Tt._temp),this.gradientMax.evaluate(e,Tt._temp2),Tt._temp.lerp(Tt._temp2,i);case 4:case"RandomColor":const n=Math.random();return this.gradientMin.evaluate(e,Tt._temp),this.gradientMax.evaluate(e,Tt._temp2),Tt._temp.lerp(Tt._temp2,n)}return Tt._temp.set(16777215),Tt._temp.alpha=1,Tt._temp}};S([u()],Fs.prototype,"mode"),S([u(se)],Fs.prototype,"color"),S([u(se)],Fs.prototype,"colorMin"),S([u(se)],Fs.prototype,"colorMax"),S([u(Hr)],Fs.prototype,"gradient"),S([u(Hr)],Fs.prototype,"gradientMin"),S([u(Hr)],Fs.prototype,"gradientMax");let Gr=Fs;var Ly=(o=>(o[o.Hierarchy=0]="Hierarchy",o[o.Local=1]="Local",o[o.Shape=2]="Shape",o))(Ly||{});class Ft{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(Q)],Ft.prototype,"gravityModifier"),S([u(Gr)],Ft.prototype,"startColor"),S([u(Q)],Ft.prototype,"startDelay"),S([u(Q)],Ft.prototype,"startLifetime"),S([u(Q)],Ft.prototype,"startRotation"),S([u(Q)],Ft.prototype,"startRotationX"),S([u(Q)],Ft.prototype,"startRotationY"),S([u(Q)],Ft.prototype,"startRotationZ"),S([u(Q)],Ft.prototype,"startSize"),S([u(Q)],Ft.prototype,"startSizeX"),S([u(Q)],Ft.prototype,"startSizeY"),S([u(Q)],Ft.prototype,"startSizeZ"),S([u(Q)],Ft.prototype,"startSpeed");class cp{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=j.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=j.lerp(this.count.curveMin.evaluate(n),this.count.curveMax.evaluate(n),Math.random());break}}return t}}class Wo{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()],Wo.prototype,"enabled"),S([u()],Wo.prototype,"bursts"),S([u(Q)],Wo.prototype,"rateOverTime"),S([u()],Wo.prototype,"rateOverTimeMultiplier"),S([u(Q)],Wo.prototype,"rateOverDistance"),S([u()],Wo.prototype,"rateOverDistanceMultiplier");class hp{enabled;color}S([u(Gr)],hp.prototype,"color");class qr{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(Q)],qr.prototype,"size"),S([u(Q)],qr.prototype,"x"),S([u(Q)],qr.prototype,"y"),S([u(Q)],qr.prototype,"z");const Ke=class Jh{get type(){return lp[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 Jh}shapeType=5;enabled=!0;alignToDirection=!1;angle=0;arc=360;arcSpread;arcSpeedMultiplier;arcMode;boxThickness;position;rotation;_rotation=new nt;scale;radius;radiusThickness;sphericalDirectionAmount;randomDirectionAmount;randomPositionAmount;meshShapeType;meshRenderer;_meshObj;_meshGeometry;setMesh(e){this.meshRenderer=e,e?(this._meshObj=e.sharedMeshes[Math.floor(Math.random()*e.sharedMeshes.length)],this._meshGeometry=this._meshObj.geometry):(this._meshObj=void 0,this._meshGeometry=void 0)}system;_space;_worldSpaceMatrix=new J;_worldSpaceMatrixInverse=new J;constructor(){ap&&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=j.toRadians(this.rotation.x),this._rotation.y=j.toRadians(this.rotation.y),this._rotation.z=j.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 nC;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:ap&&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,g=d*3+1,f=d*3+2;p=l.getX(p),g=l.getX(g),f=l.getX(f);const m=a.getAttribute("position");this._triangle.a.fromBufferAttribute(m,p),this._triangle.b.fromBufferAttribute(m,g),this._triangle.c.fromBufferAttribute(m,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),E()&&!globalThis.__particlesystem_shapetype_unsupported&&(console.warn("ParticleSystem ShapeType is not supported:",lp[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)),ap&&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),g=a.getAttribute("position"),f=$(),m=$(),y=$();f.fromBufferAttribute(g,h),m.fromBufferAttribute(g,d),y.fromBufferAttribute(g,p),f.sub(m),y.sub(m),f.cross(y),this._dir.copy(f).multiplyScalar(-1);const _=be(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),ap&&(F.DrawSphere(t,.01,8925952,.5,!0),F.DrawDirection(t,this._dir,8925952,.5,!0)),this._dir}static _randomQuat=new U;static _tempVec=new b;randomizePosition(e,t){if(t<=0)return;const i=Jh._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=Jh._randomQuat,n=Jh._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=j.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)),g=e.z+this.scale.z*(h*Math.cos(c));s.x=d,s.y=p,s.z=g}randomCirclePoint(e,t,i,n,s){const r=Math.random(),a=2*Math.PI*r*(n/360),l=j.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%=j.toRadians(s);break}const d=Math.acos(2*c-1),p=j.lerp(1,1-Math.pow(1-Math.random(),Math.PI),n)*i,g=e.x+-p*Math.sin(d)*Math.cos(h),f=e.y+p*Math.sin(d)*Math.sin(h),m=e.z;a.x=g*this.scale.x,a.y=f*this.scale.y,a.z=m*this.scale.z}};S([u()],Ke.prototype,"shapeType"),S([u()],Ke.prototype,"enabled"),S([u()],Ke.prototype,"alignToDirection"),S([u()],Ke.prototype,"angle"),S([u()],Ke.prototype,"arc"),S([u()],Ke.prototype,"arcSpread"),S([u()],Ke.prototype,"arcSpeedMultiplier"),S([u()],Ke.prototype,"arcMode"),S([u(b)],Ke.prototype,"boxThickness"),S([u(b)],Ke.prototype,"position"),S([u(b)],Ke.prototype,"rotation"),S([u(b)],Ke.prototype,"scale"),S([u()],Ke.prototype,"radius"),S([u()],Ke.prototype,"radiusThickness"),S([u()],Ke.prototype,"sphericalDirectionAmount"),S([u()],Ke.prototype,"randomDirectionAmount"),S([u()],Ke.prototype,"randomPositionAmount"),S([u()],Ke.prototype,"meshShapeType"),S([u(Fc)],Ke.prototype,"meshRenderer");let jy=Ke;class _e{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=WC(()=>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()],_e.prototype,"damping"),S([u()],_e.prototype,"enabled"),S([u()],_e.prototype,"frequency"),S([u()],_e.prototype,"octaveCount"),S([u()],_e.prototype,"octaveMultiplier"),S([u()],_e.prototype,"octaveScale"),S([u(Q)],_e.prototype,"positionAmount"),S([u()],_e.prototype,"quality"),S([u(Q)],_e.prototype,"remap"),S([u()],_e.prototype,"remapEnabled"),S([u()],_e.prototype,"remapMultiplier"),S([u(Q)],_e.prototype,"remapX"),S([u()],_e.prototype,"remapXMultiplier"),S([u(Q)],_e.prototype,"remapY"),S([u()],_e.prototype,"remapYMultiplier"),S([u(Q)],_e.prototype,"remapZ"),S([u()],_e.prototype,"remapZMultiplier"),S([u()],_e.prototype,"scrollSpeedMultiplier"),S([u()],_e.prototype,"separateAxes"),S([u()],_e.prototype,"strengthMultiplier"),S([u(Q)],_e.prototype,"strengthX"),S([u()],_e.prototype,"strengthXMultiplier"),S([u(Q)],_e.prototype,"strengthY"),S([u()],_e.prototype,"strengthYMultiplier"),S([u(Q)],_e.prototype,"strengthZ"),S([u()],_e.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(Gr)],Fe.prototype,"colorOverLifetime"),S([u(Gr)],Fe.prototype,"colorOverTrail"),S([u()],Fe.prototype,"dieWithParticles"),S([u()],Fe.prototype,"inheritParticleColor"),S([u(Q)],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(Q)],Fe.prototype,"widthOverTrail"),S([u()],Fe.prototype,"widthOverTrailMultiplier"),S([u()],Fe.prototype,"worldSpace");class We{enabled;space=0;orbitalX;orbitalY;orbitalZ;orbitalXMultiplier;orbitalYMultiplier;orbitalZMultiplier;orbitalOffsetX;orbitalOffsetY;orbitalOffsetZ;speedModifier;speedModifierMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;_system;update(e){this._system=e}_temp=new b;_temp2=new b;_temp3=new b;_hasOrbital=!1;_index=0;_orbitalMatrix=new J;init(e){this._index==0&&(e.debug=!0),this._index+=1,e.orbitx=this.orbitalX.evaluate(Math.random()),e.orbity=this.orbitalY.evaluate(Math.random()),e.orbitz=this.orbitalZ.evaluate(Math.random()),this._hasOrbital=e.orbitx!=0||e.orbity!=0||e.orbitz!=0}apply(e,t,i,n,s,r,a){if(!this.enabled)return;const l=r/a,c=this.speedModifier.evaluate(l)*this.speedModifierMultiplier,h=this.x.evaluate(l),d=this.y.evaluate(l),p=this.z.evaluate(l);if(this._temp.set(-h,d,p),this._system&&this._system.main.simulationSpace===1&&this._temp.applyQuaternion(this._system.worldQuaternion),this._hasOrbital&&this._system?.worldPos){const g=this._temp2.set(i.x,i.y,i.z),f=this.orbitalXMultiplier,m=this.orbitalYMultiplier,y=this.orbitalZMultiplier,_=c*Math.PI*2*10,v=Math.cos(_*f),P=Math.sin(_*f),T=Math.cos(_*m),O=Math.sin(_*m),A=Math.cos(_*y),I=Math.sin(_*y),W=g.x*(T*A)+g.y*(T*I)+g.z*-O,D=g.x*(P*O*A-v*I)+g.y*(P*O*I+v*A)+g.z*(P*T),q=g.x*(v*O*A+P*I)+g.y*(v*O*I-P*A)+g.z*(v*T),ie=this._temp3.set(g.x-W,g.y-D,g.z-q);ie.normalize(),ie.multiplyScalar(.2/s*Math.max(this.orbitalXMultiplier,this.orbitalYMultiplier,this.orbitalZMultiplier)),n.x+=ie.x,n.y+=ie.y,n.z+=ie.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()],We.prototype,"enabled"),S([u()],We.prototype,"space"),S([u(Q)],We.prototype,"orbitalX"),S([u(Q)],We.prototype,"orbitalY"),S([u(Q)],We.prototype,"orbitalZ"),S([u()],We.prototype,"orbitalXMultiplier"),S([u()],We.prototype,"orbitalYMultiplier"),S([u()],We.prototype,"orbitalZMultiplier"),S([u()],We.prototype,"orbitalOffsetX"),S([u()],We.prototype,"orbitalOffsetY"),S([u()],We.prototype,"orbitalOffsetZ"),S([u(Q)],We.prototype,"speedModifier"),S([u()],We.prototype,"speedModifierMultiplier"),S([u(Q)],We.prototype,"x"),S([u()],We.prototype,"xMultiplier"),S([u(Q)],We.prototype,"y"),S([u()],We.prototype,"yMultiplier"),S([u(Q)],We.prototype,"z"),S([u()],We.prototype,"zMultiplier");class Ut{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()],Ut.prototype,"animation"),S([u()],Ut.prototype,"enabled"),S([u()],Ut.prototype,"cycleCount"),S([u(Q)],Ut.prototype,"frameOverTime"),S([u()],Ut.prototype,"frameOverTimeMultiplier"),S([u()],Ut.prototype,"numTilesX"),S([u()],Ut.prototype,"numTilesY"),S([u(Q)],Ut.prototype,"startFrame"),S([u()],Ut.prototype,"startFrameMultiplier"),S([u()],Ut.prototype,"rowMode"),S([u()],Ut.prototype,"rowIndex"),S([u()],Ut.prototype,"spriteCount"),S([u()],Ut.prototype,"timeMode");class On{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()],On.prototype,"enabled"),S([u()],On.prototype,"separateAxes"),S([u(Q)],On.prototype,"x"),S([u()],On.prototype,"xMultiplier"),S([u(Q)],On.prototype,"y"),S([u()],On.prototype,"yMultiplier"),S([u(Q)],On.prototype,"z"),S([u()],On.prototype,"zMultiplier");class nn{enabled;range;separateAxes;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t){if(!this.enabled)return 0;if(!this.separateAxes){const i=j.lerp(this.range.x,this.range.y,t);return this.z.evaluate(i)*-1}return 0}}S([u()],nn.prototype,"enabled"),S([u()],nn.prototype,"range"),S([u()],nn.prototype,"separateAxes"),S([u(Q)],nn.prototype,"x"),S([u()],nn.prototype,"xMultiplier"),S([u(Q)],nn.prototype,"y"),S([u()],nn.prototype,"yMultiplier"),S([u(Q)],nn.prototype,"z"),S([u()],nn.prototype,"zMultiplier");class lt{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=j.lerp(t.x,this._temp.x,c),t.y=j.lerp(t.y,this._temp.y,c),t.z=j.lerp(t.z,this._temp.z,c),i.x=j.lerp(i.x,this._temp.x,c),i.y=j.lerp(i.y,this._temp.y,c),i.z=j.lerp(i.z,this._temp.z,c)}}}}S([u()],lt.prototype,"enabled"),S([u()],lt.prototype,"dampen"),S([u(Q)],lt.prototype,"drag"),S([u()],lt.prototype,"dragMultiplier"),S([u(Q)],lt.prototype,"limit"),S([u()],lt.prototype,"limitMultiplier"),S([u()],lt.prototype,"separateAxes"),S([u(Q)],lt.prototype,"limitX"),S([u()],lt.prototype,"limitXMultiplier"),S([u(Q)],lt.prototype,"limitY"),S([u()],lt.prototype,"limitYMultiplier"),S([u(Q)],lt.prototype,"limitZ"),S([u()],lt.prototype,"limitZMultiplier"),S([u()],lt.prototype,"multiplyDragByParticleSize"),S([u()],lt.prototype,"multiplyDragByParticleVelocity"),S([u()],lt.prototype,"space");const ah=class Y1{enabled;curve;curveMultiplier;mode;clone(){const e=new Y1;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()],ah.prototype,"enabled"),S([u(Q)],ah.prototype,"curve"),S([u()],ah.prototype,"curveMultiplier"),S([u()],ah.prototype,"mode");let Dy=ah;class pi{enabled;range;separateAxes;size;sizeMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t,i,n){const s=e.length(),r=j.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()],pi.prototype,"enabled"),S([u(K)],pi.prototype,"range"),S([u()],pi.prototype,"separateAxes"),S([u(Q)],pi.prototype,"size"),S([u()],pi.prototype,"sizeMultiplier"),S([u(Q)],pi.prototype,"x"),S([u()],pi.prototype,"xMultiplier"),S([u(Q)],pi.prototype,"y"),S([u()],pi.prototype,"yMultiplier"),S([u(Q)],pi.prototype,"z"),S([u()],pi.prototype,"zMultiplier");class bl{enabled;range;color;evaluate(e,t,i){const n=e.length(),s=j.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()],bl.prototype,"enabled"),S([u(K)],bl.prototype,"range"),S([u(Gr)],bl.prototype,"color"),new b(1,1,1),new b(0,0,1);class By{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 wi(()=>new bm,s)}type="NeedleParticleSubEmitter";emitterType;emitterProbability;q_=new U;v_=new b;v2_=new b;_emitterMatrix=new bm;_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===Fy.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===Fy.Death){let n=e.life;if(e[_l]!==void 0&&(n=e[_l]),!(e.age+t*1.2>=n))return;const s=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=s}const i=new bm;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 $E=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&&$E(e,t,n),n};const Us=w("debugparticles"),HE=w("noprogressive"),GE=w("debugprogressive");var Fy=(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))(Fy||{});class on extends M{renderMode;particleMaterial;trailMaterial;particleMesh;maxParticleSize;minParticleSize;velocityScale;cameraVelocityScale;lengthScale;start(){if(this.maxParticleSize!==.5&&this.minParticleSize!==0&&E()){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"){Us&&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=go,t.map.premultiplyAlpha=!1);const i=new xe;i.copy(t),e?this.trailMaterial=i:this.particleMaterial=i}t.map&&(t.map.colorSpace=go,t.map.premultiplyAlpha=!1),e&&t.side===ls&&(t=t.clone(),t.side=pd,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!HE&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,GE&&console.log("Load material LOD",t.name),Ve.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof H&&(t=this.particleMesh.geometry),t===null)){t=new Ln(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()],on.prototype,"renderMode"),Ue([u(ve)],on.prototype,"particleMaterial"),Ue([u(ve)],on.prototype,"trailMaterial"),Ue([u()],on.prototype,"maxParticleSize"),Ue([u()],on.prototype,"minParticleSize"),Ue([u()],on.prototype,"velocityScale"),Ue([u()],on.prototype,"cameraVelocityScale"),Ue([u()],on.prototype,"lengthScale");class dp{_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 Uy{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 qE extends Uy{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class XE extends Uy{_lastPosition=new b;_lastDistance=0;update(){const e=Z(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 j.clamp(e,0,i/this.system.deltaTime)}}class QE extends Uy{genValue(){return this.system.isPlaying,0}}class zs{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 YE extends zs{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 Nx=Symbol("particleRotation");class ZE extends zs{type="NeedleRotation";initialize(e){e[Nx]=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[Nx])*t:this.system.renderer.renderMode===zo.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const n=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(i,n)*t}}}const Wx=Symbol("sizeLerpFactor"),KE=new b;class JE extends zs{type="NeedleSize";_minSize=0;_maxSize=1;initialize(e){e[Wx]=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[Wx]).x);let s=1;this.system.renderer.renderMode!==zo.Mesh&&(s=this.system.worldScale.x/this.system.cameraScale);const r=$(e.startSize).multiplyScalar(n*s);if(e.size.set(r.x,r.y,r.z),this.system.localspace){const a=qx(this.system,KE);e.size.x*=a.x,e.size.y*=a.y,e.size.z*=a.z}}}const _l=Symbol("particleLife"),zy=Symbol("trailLifetime"),Vx=Symbol("trailStartLength"),Ny=Symbol("trailWidthRandom");class eA extends zs{type="NeedleTrail";initialize(e){e instanceof sb&&(e[_l]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[zy]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[zy]),e[Vx]=e.length,e[Ny]=Math.random())}update(e){if(this.system.trails?.enabled&&e instanceof sb){const t=e,i=e.age/e[_l],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[Ny]);c.x=h,c.y=h,c.z=h}a.size=this.system.trails.getWidth(c.x,i,l,t[Ny]),a.color.copy(e.color),this.system.trails.getColor(a.color,i,l)}if(e.age>e[_l]){e.velocity.set(0,0,0);const r=(e.age-e[_l])/e[zy];t.length=j.lerp(e[Vx],0,r)}}}}const up=Symbol("startVelocity"),$x=Symbol("gravityModifier"),Wy=Symbol("gravitySpeed"),pp=Symbol("velocity lerp factor"),Vy=new b;class tA extends zs{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[up]?e[up].copy(e.velocity):e[up]=e.velocity.clone();const n=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[$x]=n*t,e[Wy]=n*t*.5,e[pp]=Math.random(),this.system.velocityOverLifetime?.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===rh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){const i=e[up],n=e[$x];if(n!==0){const d=n*e[Wy];Vy.copy(this._gravityDirection).multiplyScalar(d),e[Wy]+=t*.05,i.add(Vy)}e.velocity.copy(i);const s=e.age/e.life;this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,s,e[pp]);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[pp],e.size));const l=this.system.colorBySpeed;l?.enabled&&l.evaluate(e.velocity,e[pp],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 Hx=Symbol("colorLerpFactor"),Gx=new se(1,1,1,1),Xr=new se(1,1,1,1);class iA extends zs{type="NeedleColor";initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;Xr.copy(this.system.main.startColor.evaluate(Math.random())),t?.color&&(Gx.copy(t.color),Xr.multiply(Gx)),Xr.convertLinearToSRGB(),e.startColor.set(Xr.r,Xr.g,Xr.b,Xr.alpha),e.color.copy(e.startColor),e[Hx]=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[Hx]);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 nA{system;emission;get anim(){return this.system.textureSheetAnimation}constructor(e){this.system=e,this.emission=new XE(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 dp(this.system.main.startLifetime)}get startSpeed(){return new dp(this.system.main.startSpeed)}get startRotation(){return new dp(this.system.main.startRotation)}get startSize(){return new dp(this.system.main.startSize)}startLength;get startColor(){return new HC(new GC(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new QE(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 _o.Trail;switch(this.system.renderer.renderMode){case zo.Billboard:return _o.BillBoard;case zo.Stretch:return _o.StretchedBillBoard;case zo.HorizontalBillboard:return _o.HorizontalBillBoard;case zo.VerticalBillboard:return _o.VerticalBillBoard;case zo.Mesh:return _o.Mesh}return _o.BillBoard}rendererEmitterSettings={startLength:new qC(220),followLocalOrigin:!1};get speedFactor(){let e=this.system.main.simulationSpeed;return this.system.renderer?.renderMode===zo.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=go,this.clonedTexture.original=t,this.clonedTexture.clone=i}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=Ug(new se(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new qE(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??oC}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===rh.World}}class oA{burstParticleIndex=0;burstParticleCount=0;isBursting=!1;travelDistance=0;previousWorldPos;burstIndex=0;burstWaveIndex=0;time=0;waitEmiting=0}const zt=class Xp extends M{play(e=!1){e&&x.foreachComponent(this.gameObject,t=>{t instanceof Xp&&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 Xp&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&x.foreachComponent(this.gameObject,i=>{i instanceof Xp&&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 oA),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===rh.World}get localspace(){return this.main.simulationSpace===rh.Local}__worldQuaternion=new U;get worldQuaternion(){return this.__worldQuaternion}_worldQuaternionInverted=new U;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,Z(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof zs&&(e.system=this),Us&&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&&((E()||Us)&&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 cp)){const n=new cp;La(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;La(n,i),e[t]=n}}Us&&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(on),!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 VC,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new nA(this),this._particleSystem=new $C(this._interface),this._particleSystem.addBehavior(new JE(this)),this._particleSystem.addBehavior(new iA(this)),this._particleSystem.addBehavior(new YE(this)),this._particleSystem.addBehavior(new ZE(this)),this._particleSystem.addBehavior(new tA(this)),this._particleSystem.addBehavior(new eA(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),Us&&(console.log(this),this.gameObject.add(new _i(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof H&&this._interface.renderMode==_o.Mesh&&Ve.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==_o.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();Us&&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=$e(e);this._cameraScale=n.x}const t=!this.worldspace,i=this.gameObject;if(be(i,this.__worldQuaternion),this._worldQuaternionInverted.copy(this.__worldQuaternion).invert(),$e(this.gameObject,this._worldScale),t&&this._container&&this.gameObject?.parent){const n=qx(this,Vy);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():E()&&console.warn("SubParticleSystem serialization issue(?)",e.particleSystem,e));const t=e.particleSystem?._particleSystem;if(t){e.particleSystem._isUsedAsSubsystem=!0;const i=new By(this,this._particleSystem,e.particleSystem,t);i.emitterType=e.type,i.emitterProbability=e.emitProbability,this._particleSystem.addBehavior(i)}else Us&&console.warn("Could not add SubParticleSystem",e,this)}}};Ue([u(hp)],zt.prototype,"colorOverLifetime"),Ue([u(Ft)],zt.prototype,"main"),Ue([u(Wo)],zt.prototype,"emission"),Ue([u(qr)],zt.prototype,"sizeOverLifetime"),Ue([u(jy)],zt.prototype,"shape"),Ue([u(_e)],zt.prototype,"noise"),Ue([u(Fe)],zt.prototype,"trails"),Ue([u(We)],zt.prototype,"velocityOverLifetime"),Ue([u(lt)],zt.prototype,"limitVelocityOverLifetime"),Ue([u(Dy)],zt.prototype,"inheritVelocity"),Ue([u(bl)],zt.prototype,"colorBySpeed"),Ue([u(Ut)],zt.prototype,"textureSheetAnimation"),Ue([u(On)],zt.prototype,"rotationOverLifetime"),Ue([u(nn)],zt.prototype,"rotationBySpeed"),Ue([u(pi)],zt.prototype,"sizeBySpeed");let lh=zt;class mp{particleSystem;emitProbability=1;properties;type;_deserialize(e,t){const i=this.particleSystem;if(i instanceof lh)return;let n="";i&&typeof i.guid=="string"&&(n=i.guid,this.particleSystem=x.findByGuid(n,t)),Us&&!(this.particleSystem instanceof lh)&&console.warn("Could not find particle system for sub emitter",n,t,this)}}function qx(o,e){if(e.set(1,1,1),o.gameObject.parent&&o.localspace)switch(o.main.scalingMode){case Ly.Local:e=$e(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 "+Ly[o.main.scalingMode]+" is not supported";E()&&ge(t),console.warn(t,o.name,o)}e=$e(o.gameObject,e);break}return e}var sA=Object.defineProperty,$y=(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 vl extends M{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))})}}$y([u()],vl.prototype,"strength"),$y([u()],vl.prototype,"radius"),$y([u(Ye)],vl.prototype,"targets");class Dl extends M{_didAssignPlayerColor=!1;onEnable(){this.context.connection.beginListen(ee.JoinedRoom,this.tryAssignColor),this._didAssignPlayerColor||this.startCoroutine(this.waitForConnection())}onDisable(){this.context.connection.stopListen(ee.JoinedRoom,this.tryAssignColor)}*waitForConnection(){for(;!this.destroyed&&this.activeAndEnabled&&(yield Bg(.2),!this.tryAssignColor()););}tryAssignColor=()=>{const e=x.getComponentInParent(this.gameObject,Sn);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=x.getComponentInParent(this.gameObject,Le);return t?.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1};assignUserColor(e){const t=Dl.hashCode(e),i=Dl.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 ne(t/255,i/255,n/255)}}const ch=w("debugpost");let Hy=null;function rA(o){Hy=o}function Xx(o){let e=o.gameObject;for(;e;){for(const t of tu(e))if(t.isPostProcessingManager===!0)return t;e=e.parent}return null}function aA(o){let e=Xx(o);if(!e)if(Hy){ch&&console.warn("Adding postprocessing manager to the scene.");const t=o.scene;e=_n(t,Hy)}else E()&&console.warn("No post processing manager found");return e}const ct={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 Je=null;function lA(o){ch==="verbose"&&console.debug("Before ordering effects",[...o]),Je||(Je=new Map,Je.set(R.POSTPROCESSING.MODULE.NormalPass,ct.NormalPass),Je.set(R.POSTPROCESSING.MODULE.DepthDownsamplingPass,ct.DepthDownsamplingPass),Je.set(R.POSTPROCESSING.MODULE.SMAAEffect,ct.SMAA),Je.set(R.POSTPROCESSING.MODULE.SSAOEffect,ct.SSAO),Je.set(R.POSTPROCESSING_AO.MODULE.N8AOPostPass,ct.SSAO),Je.set(R.POSTPROCESSING_AO.MODULE.N8AOPass,ct.SSAO),Je.set(R.POSTPROCESSING.MODULE.TiltShiftEffect,ct.TiltShift),Je.set(R.POSTPROCESSING.MODULE.DepthOfFieldEffect,ct.DepthOfField),Je.set(R.POSTPROCESSING.MODULE.ChromaticAberrationEffect,ct.ChromaticAberration),Je.set(R.POSTPROCESSING.MODULE.BloomEffect,ct.Bloom),Je.set(R.POSTPROCESSING.MODULE.SelectiveBloomEffect,ct.Bloom),Je.set(R.POSTPROCESSING.MODULE.VignetteEffect,ct.Vignette),Je.set(R.POSTPROCESSING.MODULE.PixelationEffect,ct.Pixelation),Je.set(R.POSTPROCESSING.MODULE.ToneMappingEffect,ct.ToneMapping),Je.set(R.POSTPROCESSING.MODULE.HueSaturationEffect,ct.HueSaturation),Je.set(R.POSTPROCESSING.MODULE.BrightnessContrastEffect,ct.BrightnessContrast)),o.sort((e,t)=>{const i=typeof e.priority=="number"?e.priority:Je.get(e.effect.constructor)??Number.NEGATIVE_INFINITY,n=typeof t.priority=="number"?t.priority:Je.get(t.effect.constructor)??Number.NEGATIVE_INFINITY;return i===Number.NEGATIVE_INFINITY?(ch&&console.warn("Unknown effect found: ",e.constructor.name,e),1):n===Number.NEGATIVE_INFINITY?(ch&&console.warn("Unknown effect found: ",t.constructor.name,t),-1):i-n}),ch==="verbose"&&console.debug("After ordering effects",[...o])}var cA=Object.defineProperty,hA=Object.getOwnPropertyDescriptor,Qx=(o,e,t,i)=>{for(var n=hA(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&cA(e,t,n),n};const dA=w("debugpost");class B{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;dA&&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}}Qx([u()],B.prototype,"overrideState"),Qx([u()],B.prototype,"value");class uA extends Qi{constructor(){super([B])}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 B),typeof e=="object"&&"value"in e){const r=e.value;s.initialize(r),s.overrideState=e.overrideState}else s.value=e;return s}}new uA;var pA=Object.defineProperty,mA=(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};const Gy=w("debugpost");class et extends M{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 B?n.initialize(i):n!==void 0&&(this[t]=i)}}active=!0;_manager=null;onEnable(){super.onEnable(),Gy&&console.warn("Enable",this.constructor.name+(this.__internalDidAwakeAndStart?"":" (awake)")),this.__internalDidAwakeAndStart&&(this.active=!0),this.onEffectEnabled()}onDisable(){super.onDisable(),Gy&&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=aA(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(){Gy&&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 B&&i.__init()}}onEditorModification(e){const t=e.propertyName;if(this[t]instanceof B){const i=e.value;return this[t].value=i,!0}}}mA([u()],et.prototype,"active");var gA=Object.defineProperty,fA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&gA(e,t,n),n};const yA=w("debugpost"),qy={};function sn(o,e){qy[o]=e}function bA(o){return o.__type in qy?qy[o.__type]:(yA&&o.__type&&console.warn("Unknown postprocessing type",o.__type,o),et)}class gp{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)}}fA([Qe([o=>bA(o),et])],gp.prototype,"components");var _A=Object.defineProperty,vA=(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 wA=w("debugpost");class hh extends et{get typeName(){return"Antialiasing"}preset=new B(2);onCreateEffect(){const e=new R.POSTPROCESSING.MODULE.SMAAEffect({preset:this.preset?.value??R.POSTPROCESSING.MODULE.SMAAPreset.HIGH,edgeDetectionMode:R.POSTPROCESSING.MODULE.EdgeDetectionMode.LUMA});return this.preset.onValueChanged=t=>{wA&&console.log("Antialiasing preset changed to",t),e.applyPreset(t)},e}}vA([u(B)],hh.prototype,"preset"),sn("Antialiasing",hh);var xA=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&&xA(e,t,n),n};const fp=class Z1 extends et{static useSelectiveBloom=!1;get typeName(){return"Bloom"}threshold=new B(.9);intensity=new B(1);scatter=new B(.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=Z1.useSelectiveBloom),this.selectiveBloom){const t=e=new R.POSTPROCESSING.MODULE.SelectiveBloomEffect(this.context.scene,this.context.mainCamera,{blendFunction:R.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 R.POSTPROCESSING.MODULE.BloomEffect({blendFunction:R.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=mo.lerp(.1,.9,t))},e}};Xy([u(B)],fp.prototype,"threshold"),Xy([u(B)],fp.prototype,"intensity"),Xy([u(B)],fp.prototype,"scatter");let yp=fp;sn("Bloom",yp);var SA=Object.defineProperty,CA=(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 dh extends et{get typeName(){return"ChromaticAberration"}intensity=new B(0);onCreateEffect(){const e=new R.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new K(0,0),e.radialModulation=!0,e.modulationOffset=.15,this.intensity.valueProcessor=t=>t*.02,this.intensity.onValueChanged=t=>{e.offset.x=-t,e.offset.y=t},e}}CA([u(B)],dh.prototype,"intensity"),sn("ChromaticAberration",dh);var uh=(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))(uh||{});const Yx=new Map;function Qy(o){switch(o){case 0:return um;case 1:return dm;case 2:return hd;case 3:return cd;case 4:return _a;default:return Yx.has(o)||(Yx.set(o,!0),console.warn("[Postprocessing] Unknown tone mapping mode",o)),_a}}function PA(o){switch(o){case um:return 0;case hd:return 2;case cd:return 3;case _a:return 1;case dm:return 1;default:return 0}}function bp(o){switch(o){case um:return R.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case hd:return R.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case cd:return R.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case _a:return R.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case dm:return R.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return R.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}var OA=Object.defineProperty,Zx=(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&&OA(e,t,n),n};const Yy=w("debugpost");class Ns extends et{get typeName(){return"ToneMapping"}mode=new B(void 0);exposure=new B(1);setMode(e){const t=uh[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=Xx(this);e&&super.onEffectEnabled(e)}_tonemappingEffect=null;onCreateEffect(){if(this.mode.isInitialized==!1){const i=PA(this.context.renderer.toneMapping);Yy&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+i),this.mode.initialize(i)}this._tonemappingEffect?.dispose();const e=Qy(this.mode.value),t=this._tonemappingEffect=new R.POSTPROCESSING.MODULE.ToneMappingEffect({mode:bp(e)});return this.mode.onValueChanged=i=>{if(typeof i=="string")i=$v(i),t.mode=bp(i);else{const n=Qy(i);t.mode=bp(n)}t.name="ToneMapping ("+uh[i]+")",Yy&&console.log("[PostProcessing] ToneMapping mode changed to",uh[i],e,t.mode)},Yy&&console.log("[PostProcessing] Use ToneMapping",uh[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=Qy(this.mode.value)),this.exposure.overrideState&&this.exposure.value!==void 0)){const e=Math.max(0,this.exposure.value);this.context.renderer.toneMappingExposure=e}}}Zx([u(B)],Ns.prototype,"mode"),Zx([u(B)],Ns.prototype,"exposure"),sn("Tonemapping",Ns);var kA=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&&kA(e,t,n),n};class Ws extends et{get typeName(){return"ColorAdjustments"}remap=!0;postExposure=new B(1);contrast=new B(0);hueShift=new B(0);saturation=new B(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 Ns);t||(t=new Ns,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 R.POSTPROCESSING.MODULE.BrightnessContrastEffect;this.contrast.onValueChanged=s=>i.contrast=s;const n=new R.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}}_p([u(B)],Ws.prototype,"postExposure"),_p([u(B)],Ws.prototype,"contrast"),_p([u(B)],Ws.prototype,"hueShift"),_p([u(B)],Ws.prototype,"saturation"),sn("ColorAdjustments",Ws);var MA=Object.defineProperty,Qr=(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 RA=w("debugpost");class kn extends et{get typeName(){return"DepthOfField"}mode;focusDistance=new B(1);focalLength=new B(.2);aperture=new B(20);gaussianMaxRadius=new B;resolutionScale=new B(1/window.devicePixelRatio);bokehScale=new B;init(){this.focalLength.valueProcessor=t=>{const i=t/300;return j.lerp(2,.01,i)};const e=20;this.aperture.valueProcessor=t=>{const i=1-t/32;return j.lerp(1,e,i)}}onCreateEffect(){if(this.mode===0){RA&&console.warn("DepthOfField: Mode is set to Off");return}const e=new R.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(){}}Qr([u()],kn.prototype,"mode"),Qr([u(B)],kn.prototype,"focusDistance"),Qr([u(B)],kn.prototype,"focalLength"),Qr([u(B)],kn.prototype,"aperture"),Qr([u(B)],kn.prototype,"gaussianMaxRadius"),Qr([u(B)],kn.prototype,"resolutionScale"),Qr([u(B)],kn.prototype,"bokehScale"),sn("DepthOfField",kn);class ph extends et{effect;constructor(e){super(),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var TA=Object.defineProperty,EA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&TA(e,t,n),n};class mh extends et{get typeName(){return"PixelationEffect"}granularity=new B(10);onCreateEffect(){const e=new R.POSTPROCESSING.MODULE.PixelationEffect;return this.granularity.onValueChanged=t=>{e.granularity=t},e}}EA([u(B)],mh.prototype,"granularity"),sn("PixelationEffect",mh);var AA=Object.defineProperty,gh=(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};class Vo extends et{get typeName(){return"ScreenSpaceAmbientOcclusion"}intensity=new B(2);falloff=new B(1);samples=new B(9);color=new B(new ne(0,0,0));luminanceInfluence=new B(.7);onBeforeRender(){if(this._ssao&&this.context.mainCamera instanceof ce){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 R.POSTPROCESSING.MODULE.NormalPass(this.context.scene,e),i=new R.POSTPROCESSING.MODULE.DepthDownsamplingPass({normalBuffer:t.texture,resolutionScale:.5}),n=this._ssao=new R.POSTPROCESSING.MODULE.SSAOEffect(e,t.texture,{normalDepthBuffer:i.texture,worldDistanceThreshold:1,worldDistanceFalloff:1,worldProximityThreshold:.1,worldProximityFalloff:2,intensity:1,blendFunction:R.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 ne),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}}gh([u(B)],Vo.prototype,"intensity"),gh([u(B)],Vo.prototype,"falloff"),gh([u(B)],Vo.prototype,"samples"),gh([u(B)],Vo.prototype,"color"),gh([u(B)],Vo.prototype,"luminanceInfluence"),sn("ScreenSpaceAmbientOcclusion",Vo);var IA=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&&IA(e,t,n),n};const LA=w("debugN8AO");var Zy=(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))(Zy||{});class Mn extends et{get typeName(){return"ScreenSpaceAmbientOcclusionN8"}get pass(){return this._ssao}gammaCorrection=!0;aoRadius=new B(1);falloff=new B(1);intensity=new B(1);color=new B(new ne(0,0,0));screenspaceRadius=!1;quality=2;_ssao;onValidate(){this._ssao&&(this._ssao.setQualityMode(Zy[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 R.POSTPROCESSING_AO.MODULE.N8AOPostPass(this.context.scene,e,t,i);n.name="SSAO_N8";const s=Zy[this.quality];n.setQualityMode(s),n.configuration.transparencyAware=!1;const r=new Dn(t,i);return n.configuration.beautyRenderTarget=r,n.configuration.autoRenderBeauty=!1,n.configuration.gammaCorrection=this.gammaCorrection,n.configuration.screenSpaceRadius=this.screenspaceRadius,LA&&(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 ne),n.configuration.color.copy(a)},n}}Yr([Pt(),u()],Mn.prototype,"gammaCorrection"),Yr([u(B)],Mn.prototype,"aoRadius"),Yr([u(B)],Mn.prototype,"falloff"),Yr([u(B)],Mn.prototype,"intensity"),Yr([u(B)],Mn.prototype,"color"),Yr([Pt(),u()],Mn.prototype,"screenspaceRadius"),Yr([Pt(),u()],Mn.prototype,"quality"),sn("ScreenSpaceAmbientOcclusionN8",Mn);var jA=Object.defineProperty,DA=Object.getOwnPropertyDescriptor,Kx=(o,e,t,i)=>{for(var n=DA(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jA(e,t,n),n};class fh extends et{get typeName(){return"Sharpening"}order=ct.Sharpening;_effect;onCreateEffect(){return this._effect??=new(BA()),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}Kx([u()],fh.prototype,"amount"),Kx([u()],fh.prototype,"radius");function BA(){const o=`
1284
+ void mainSupport() {
1285
+ vUv = uv;
1286
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
1287
+ }
1288
+ `,e=`
1289
+ uniform sampler2D tDiffuse;
1290
+ uniform float amount;
1291
+ uniform float radius;
1292
+
1293
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
1294
+ float tx = 1.0 / resolution.x;
1295
+ float ty = 1.0 / resolution.y;
1296
+ vec2 texelSize = vec2(tx, ty);
1297
+
1298
+ vec4 blurred = vec4(0.0);
1299
+ float total = 0.0;
1300
+
1301
+ for (float x = -radius; x <= radius; x++) {
1302
+ for (float y = -radius; y <= radius; y++) {
1303
+ vec2 offset = vec2(x, y) * texelSize;
1304
+ vec4 diffuse = texture2D(tDiffuse, uv + offset);
1305
+ float weight = exp(-length(offset) * amount);
1306
+ blurred += diffuse * weight;
1307
+ total += weight;
1308
+ }
1309
+ }
1310
+
1311
+ if (total > 0.0) {
1312
+ blurred /= total;
1313
+ }
1314
+
1315
+ // Calculate the sharpened color using inputColor
1316
+ vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
1317
+ // Keep original alpha
1318
+ sharp.a = inputColor.a;
1319
+
1320
+ // Ensure the sharp color does not go below 0 or above 1
1321
+ // This means: sharpening must happen AFTER tonemapping.
1322
+ sharp = clamp(sharp, 0.0, 1.0);
1323
+
1324
+ outputColor = sharp;
1325
+ }
1326
+
1327
+ `;class t extends R.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:o,blendFunction:R.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new Ni(1)],["radius",new Ni(1)]]),attributes:KC.CONVOLUTION})}}return t}var FA=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&&FA(e,t,n),n};class oo extends et{get typeName(){return"TiltShiftEffect"}offset=new B(0);rotation=new B(0);focusArea=new B(.4);feather=new B(.3);kernelSize=new B(2);resolutionScale=new B(1/window.devicePixelRatio);init(){this.offset.defaultValue=0,this.rotation.defaultValue=0,this.focusArea.defaultValue=.4,this.feather.defaultValue=.3,this.kernelSize.defaultValue=R.POSTPROCESSING.MODULE.KernelSize.MEDIUM,this.resolutionScale.defaultValue=1/window.devicePixelRatio}onCreateEffect(){const e=new R.POSTPROCESSING.MODULE.TiltShiftEffect({kernelSize:R.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}}wl([u(B)],oo.prototype,"offset"),wl([u(B)],oo.prototype,"rotation"),wl([u(B)],oo.prototype,"focusArea"),wl([u(B)],oo.prototype,"feather"),wl([u(B)],oo.prototype,"kernelSize"),wl([u(B)],oo.prototype,"resolutionScale"),sn("TiltShiftEffect",oo);var UA=Object.defineProperty,Ky=(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&&UA(e,t,n),n};class Zr extends et{get typeName(){return"Vignette"}color=new B({r:0,g:0,b:0,a:1});intensity=new B(0);center=new B({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 R.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}}Ky([u(B)],Zr.prototype,"color"),Ky([u(B)],Zr.prototype,"intensity"),Ky([u(B)],Zr.prototype,"center"),sn("Vignette",Zr),globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const $o=w("debugpost"),Jy=Symbol("needle:postprocessing-handler"),yh=Symbol("needle:previous-autoclear-state"),bh=Symbol("needle:previous-tone-mapping");class e0{_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($o&&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[Jy]===this&&(delete t[Jy],typeof t.renderer[yh]=="boolean"&&(t.renderer.autoClear=t.renderer[yh]),typeof t.renderer[bh]=="number"&&(t.renderer.toneMapping=t.renderer[bh])),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([R.POSTPROCESSING.load(),R.POSTPROCESSING_AO.load()]),e[Jy]=this,$o&&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 R.POSTPROCESSING.MODULE.Effect||h instanceof R.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:
1328
+ - 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&&ge("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[yh]=="boolean"&&(i.autoClear=i[yh]),i[yh]=i.autoClear,typeof i[bh]=="number"&&(i.toneMapping=i[bh]),i[bh]=i.toneMapping,i.toneMapping!=dd&&!this._effects.find(h=>h instanceof R.POSTPROCESSING.MODULE.ToneMappingEffect)){const h=new R.POSTPROCESSING.MODULE.ToneMappingEffect;h.name=`ToneMapping (${i.toneMapping})`,h.mode=bp(i.toneMapping),this._effects.push({typeName:"ToneMapping",effect:h,priority:ct.ToneMapping})}this._composer||(this._composer=new R.POSTPROCESSING.MODULE.EffectComposer(i,{frameBufferType:pm,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 R.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,g,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!==pm)&&(this._customInputBuffer?.dispose(),this._customInputBuffer=new Dn(d.width,d.height,{format:d.texture.format,type:pm,depthBuffer:d.depthBuffer,depthTexture:d.depthTexture?new U0(d.width,d.height):void 0,stencilBuffer:d.stencilBuffer,samples:Math.max(0,this._multisampling),minFilter:d.texture.minFilter??md,magFilter:d.texture.magFilter??md,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),$o&&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,g,f),Ks.blit(this._customInputBuffer.texture,d,{renderer:h,depthTexture:this._customInputBuffer.depthTexture,depthWrite:!0,depthTest:!0}))};try{lA(this._effects);let h=!1,d=null;for(let f=this._effects.length-1;f>=0;f--){const m=this._effects[f].effect;if(m instanceof R.POSTPROCESSING.MODULE.ToneMappingEffect){if(h){$o&&console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${m.name} and ${d?.name}. Only the last one added will be used.`),this._effects.splice(f,1);continue}d=m,h=!0}}const p=[];let g=!1;for(let f=0;f<this._effects.length;f++){const m=this._effects[f].effect;if(m instanceof R.POSTPROCESSING.MODULE.SMAAEffect?this._hasSmaaEffect=!0:m instanceof R.POSTPROCESSING.MODULE.NormalPass&&(this._anyPassHasNormal=!0),!(m instanceof R.POSTPROCESSING.MODULE.ToneMappingEffect&&d!==m))if(m instanceof R.POSTPROCESSING.MODULE.Effect){const y=m.getAttributes(),_=R.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;y&_&&($o&&console.log("[PostProcessing] Convolution effect: "+m.name),g&&($o&&console.log("[PostProcessing] \u2192 Merging effects ["+p.map(v=>v.name).join(", ")+"]"),this.createPassForMergeableEffects(p,r,s,n)),g=!0),p.push(m)}else m instanceof R.POSTPROCESSING.MODULE.Pass?(g=!1,this.createPassForMergeableEffects(p,r,s,n),m.renderToScreen=!1,r.addPass(m)):(g=!1,this.createPassForMergeableEffects(p,r,s,n),r.addPass(m))}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,g=!1;d.enabled&&(c||(p=!0,g=!0),c=!0),d.renderToScreen=g,d?.configuration!==void 0?d.configuration.gammaCorrection=p:"autosetGamma"in d&&(d.autosetGamma=p),this._anyPassHasDepth||=d.needsDepthTexture}this.handleDevicePixelRatio(),$o&&console.log("[PostProcessing] Passes \u2192",[...r.passes],`
1329
+ ---------------------------------
1330
+ \u2022 `+r.passes.map(h=>h.name||h.constructor.name+"*").join(`
1331
+ \u2022 `)+`
1332
+ `),$o&&this._onCreateEffectsDebug(this._composer,s)}createPassForMergeableEffects(e,t,i,n){if(e.length>0){const s=new R.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($o==="passes"){const i=new R.POSTPROCESSING.MODULE.DepthEffect({blendFunction:R.POSTPROCESSING.MODULE.BlendFunction.NORMAL,inverted:!0});i.name="Depth Effect";const n=new R.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 zA=Object.defineProperty,Jx=(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&&zA(e,t,n),n};const Kr=w("debugpost");class xl extends M{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 et||(t=new ph(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 et?t=this._effects.indexOf(e):t=this._effects.findIndex(i=>i instanceof ph&&i.effect===e),t!==-1)return this._effects.splice(t,1),this._isDirty=!0,e;if(e instanceof et){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(){Kr&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",e=>{e.key==="p"&&(this.enabled=!this.enabled,Te("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,(Kr||E())&&console.log(`[PostProcessing] multisampling is disabled because it's set to 'auto' on your PostprocessingManager/Volume component that also has an SMAA effect.
1333
+
1334
+ 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),Kr&&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),Kr&&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(Kr&&console.log(`Apply PostProcessing "${this.name||"unnamed"}"`),E()&&(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 e0(this.context)),this._postprocessing.apply(this._activeEffects)?.then(()=>{this.activeAndEnabled&&(this._applyPostQueue(),this._postprocessing?(this.multisampling==="auto"?this._postprocessing.multisampling=G.isMobileDevice()?2:4:this._postprocessing.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples)),Kr&&console.debug(`[PostProcessing] Set multisampling to ${this._postprocessing.multisampling} (Is Mobile: ${G.isMobileDevice()})`)):Kr&&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(!vp.has(i)){const r=new Array;vp.set(i,r);const a=Object.keys(s);for(const l of a)s[l]instanceof B&&r.push(l)}if(vp.has(i)){const r=n.toLowerCase(),a=vp.get(i);for(const l of a)if(l.toLowerCase()===r){const c=s[l];c instanceof B&&(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)}}Jx([Qe(gp)],xl.prototype,"sharedProfile"),Jx([Qe()],xl.prototype,"multisampling");const vp=new Map;rA(xl);async function t0(o){const{NeedleEngineWebComponent:e}=await Promise.resolve().then(()=>PI);e.observedAttributes.includes(o)||e.observedAttributes.push(o)}var NA=Object.defineProperty,vt=(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};const Nt=w("debugsceneswitcher"),WA=w("sceneswitcher:clearscene"),wp="scene";t0(wp);const Vs=Promise.resolve(!1);class qe extends M{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 he;sceneLoadingProgress=new he;sceneLoaded=new he;_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);Nt&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Ee.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Ee.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Ee.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===wp){const i=this.context.domElement.getAttribute(wp);i!==null&&this.trySelectSceneFromValue(i)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new VA(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(wp);try{(e===null||!await this.trySelectSceneFromValue(e))&&this._currentIndex===-1&&this.select(0)}finally{}}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(Ee.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Ee.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Ee.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);Nt&&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 te(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(Nt&&console.log("select",e),typeof e=="object"&&console.warn('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=te.getOrCreate(this.sourceId??"",e,this.context);return this.switchScene(n)}if(i)e=this.scenes?.indexOf(i);else return Vs}if(!this.scenes?.length)return Vs;if(e<0){if(this.clamp)return Vs;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return Vs;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 te)){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 te(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){Nt&&console.log("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{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(Nt){const a=r.loaded/r.total,l="["+"=".repeat(Math.floor(a*20))+"-".repeat(20-Math.floor(a*20))+"]";console.debug(`[SceneSwitcher] Download ${(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 Nt&&console.warn("Adding loaded scene prevented:",e,n),!1;if(!e.asset)return Nt&&console.warn("Failed loading scene:",e),!1;if(this._currentIndex===t){if(Nt&&console.log("ADD",e.url),this._currentScene=e,WA){const a=this.context.mainCameraComponent?.gameObject||this.context.mainCamera;a?.removeFromParent();const l=this.gameObject.removeFromParent();Ci(this.context.scene,!0,!0),this.context.scene=new yi,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=fo,this.context.scene.background=a):Nt&&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=e1(e.url))),this.queryParameterName?.length)Vl(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}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 te)return t.preload()}return Vs}tryLoadFromQueryParam(){if(!this.queryParameterName?.length)return Vs;const e=w(this.queryParameterName);return typeof e=="boolean"?Vs: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:e1(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 Vi()&&console.warn('Can not find scene: "'+e+'"',this),Vs}_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)){Nt&&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){Nt&&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}}vt([u()],qe.prototype,"autoLoadFirstScene"),vt([u(te)],qe.prototype,"scenes"),vt([u(te)],qe.prototype,"loadingScene"),vt([u()],qe.prototype,"queryParameterName"),vt([u()],qe.prototype,"useSceneName"),vt([u()],qe.prototype,"clamp"),vt([u()],qe.prototype,"useHistory"),vt([u()],qe.prototype,"useKeyboard"),vt([u()],qe.prototype,"useSwipe"),vt([u()],qe.prototype,"useSceneLighting"),vt([u()],qe.prototype,"useSceneBackground"),vt([u()],qe.prototype,"preloadNext"),vt([u()],qe.prototype,"preloadPrevious"),vt([u()],qe.prototype,"preloadConcurrent"),vt([u()],qe.prototype,"createMenuButtons"),vt([u(he)],qe.prototype,"sceneLoadingStart"),vt([u(he)],qe.prototype,"sceneLoadingProgress"),vt([u(he)],qe.prototype,"sceneLoaded");function e1(o){const e=o.split("/").pop()?.split(".").shift();return e?.length?e:o}class VA{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;Nt&&console.log("Preload begin",{delay:e}),this._isRunning=!0;let t=-10,i,n;const s=this._switcher.scenes,r=Date.now()+e,a=setInterval(()=>{if(this.allLoaded()&&(Nt&&console.log("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];Nt&&console.log("Preload scene",{roomIndex:h,searchForward:l,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},d?.url),new $A(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 $A{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()&&(Nt&&console.log("Preload start: "+this.asset.url,this.index),await this.asset.preload(),Nt&&console.log("Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}function HA(){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 GA(o){await HA(),o()}var qA=Object.defineProperty,XA=Object.getOwnPropertyDescriptor,Li=(o,e,t,i)=>{for(var n=i>1?void 0:i?XA(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&&qA(e,t,n),n};const wt=w("debugvideo");var t1=(o=>(o[o.None=0]="None",o[o.AdjustHeight=1]="AdjustHeight",o[o.AdjustWidth=2]="AdjustWidth",o))(t1||{}),i1=(o=>(o[o.VideoClip=0]="VideoClip",o[o.Url=1]="Url",o))(i1||{}),n1=(o=>(o[o.CameraFarPlane=0]="CameraFarPlane",o[o.CameraNearPlane=1]="CameraNearPlane",o[o.RenderTexture=2]="RenderTexture",o[o.MaterialOverride=3]="MaterialOverride",o))(n1||{});class ht extends M{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&&E()&&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(){wt&&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,wt&&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(){wt&&console.log("VideoPlayer.onEnable",i1[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(),GA(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],w("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}play(){if(this._videoElement||this.create(!1),!this._videoElement){wt&&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}wt&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(e=>{console.log(e),wt&&console.error("Error playing video",e,"CODE="+e.code,this.videoElement?.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),wt&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),wt&&console.log("STOP",this))}pause(){this.time=this._videoElement?.currentTime??0,this._isPlaying=!1,this._videoElement?.pause(),wt&&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||(wt&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(wt&&console.log("Set Video src",t),this._videoElement.src=t):(wt&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new sC(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=yo,e&&this.handleBeginPlaying(e),wt&&console.log("Video: handle playing done...",t,e),!0):(wt&&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 QA(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),wt&&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,Ti)?.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,n1[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=$e(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):(wt&&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=()=>{wt&&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(),wt&&console.log("HLS: loaded",this.clip))}}Li([u()],ht.prototype,"playOnAwake",2),Li([u()],ht.prototype,"aspectMode",2),Li([u(URL)],ht.prototype,"clip",2),Li([u()],ht.prototype,"source",2),Li([u(URL)],ht.prototype,"url",1),Li([u()],ht.prototype,"renderMode",2),Li([u()],ht.prototype,"targetMaterialProperty",2),Li([u(Ti)],ht.prototype,"targetMaterialRenderer",2),Li([u(Re)],ht.prototype,"targetTexture",2),Li([u()],ht.prototype,"time",2),Li([u()],ht.prototype,"playbackSpeed",1),Li([u()],ht.prototype,"isLooping",1),Li([u()],ht.prototype,"audioOutputMode",1);class QA{context;constructor(e){this.context=e,this._input=new YA(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=gr.createPrimitive(mr.Quad,{material:new ZA(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 YA{_onResizeScreenFn;_onKeyUpFn;_onMouseWheelFn;context;overlay;constructor(e){this.overlay=e,this.context=e.context}_material;enable(e){this._material=e,window.addEventListener("resize",this._onResizeScreenFn=()=>{this.overlay.updateScreenspaceMaterialUniforms()}),window.addEventListener("keyup",this._onKeyUpFn=n=>{n.key==="Escape"&&this.overlay.stop()}),window.addEventListener("wheel",this._onMouseWheelFn=n=>{this.overlay.enabled&&(e.zoom+=n.deltaY*5e-4,n.preventDefault())},{passive:!1});const t=new K;window.addEventListener("mousemove",n=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const s=new K(n.movementX,n.movementY);s.x/=this.context.domElement.clientWidth,s.y/=this.context.domElement.clientHeight,t.set(s.x,s.y),t.multiplyScalar(e.zoom/-this.context.time.deltaTime*.01),e.offset=e.offset.add(t)}}),window.addEventListener("pointermove",n=>{this.overlay.enabled&&this.context.input.getPointerPressed(0)&&this.context.input.getTouchesPressedCount()===1&&(t.set(n.movementX,n.movementY),t.multiplyScalar(e.zoom*-this.context.time.deltaTime*.05),e.offset=e.offset.add(t))});let i=0;window.addEventListener("touchstart",n=>{if(n.touches.length<2){this.context.time.time-i<.3&&this.overlay.stop(),i=this.context.time.time;return}this._isPinching=!0,this._lastPinch=0}),window.addEventListener("touchmove",n=>{if(!this._isPinching||!this._material)return;const s=n.touches[0],r=n.touches[1],a=s.clientX-r.clientX,l=s.clientY-r.clientY,c=Math.sqrt(a*a+l*l);if(this._lastPinch!==0){const h=c-this._lastPinch;this._material.zoom-=h*.004}this._lastPinch=c}),window.addEventListener("touchend",()=>{this._isPinching=!1})}_isPinching=!1;_lastPinch=0;disable(){this._onResizeScreenFn&&(window.removeEventListener("resize",this._onResizeScreenFn),this._onResizeScreenFn=void 0),this._onKeyUpFn&&(window.removeEventListener("keyup",this._onKeyUpFn),this._onKeyUpFn=void 0),this._onMouseWheelFn&&(window.removeEventListener("wheel",this._onMouseWheelFn),this._onMouseWheelFn=void 0)}}class ZA extends jn{set screenAspect(e){this.uniforms.screenAspect.value=e,this.needsUpdate=!0}set offset(e){const t=this.uniforms.offsetScale.value;t.x=e.x,t.y=e.y,this.uniforms.offsetScale.value=t,this.needsUpdate=!0}_offset=new K;get offset(){const e=this.uniforms.offsetScale.value;return this._offset.set(e.x,e.y),this._offset}set zoom(e){const t=this.uniforms.offsetScale.value;e<.001&&(e=.001),t.z=e,this.needsUpdate=!0}get zoom(){return this.uniforms.offsetScale.value.z}reset(){this.offset=this.offset.set(0,0),this.zoom=1,this.needsUpdate=!0}constructor(e){super(),this.uniforms={map:{value:e},screenAspect:{value:1},offsetScale:{value:new pe(0,0,1,1)}},this.vertexShader=`
1335
+ uniform sampler2D map;
1336
+ uniform float screenAspect;
1337
+ uniform vec4 offsetScale;
1338
+ varying vec2 vUv;
1339
+
1340
+ void main() {
1341
+
1342
+ gl_Position = vec4( position , 1.0 );
1343
+ vUv = uv;
1344
+ vUv.y = 1. - vUv.y;
1345
+
1346
+ // fit into screen
1347
+ ivec2 res = textureSize(map, 0);
1348
+ float videoAspect = float(res.x) / float(res.y);
1349
+ float aspect = videoAspect / screenAspect;
1350
+ if(aspect >= 1.0)
1351
+ {
1352
+ vUv.y = vUv.y * aspect;
1353
+ float offset = (1. - aspect) * .5;
1354
+ vUv.y = vUv.y + offset;
1355
+ }
1356
+ else
1357
+ {
1358
+ vUv.x = vUv.x / aspect;
1359
+ float offset = (1. - 1. / aspect) * .5;
1360
+ vUv.x = vUv.x + offset;
1361
+ }
1362
+
1363
+ vUv.x -= .5;
1364
+ vUv.y -= .5;
1365
+
1366
+ vUv.x *= offsetScale.z;
1367
+ vUv.y *= offsetScale.z;
1368
+ vUv.x += offsetScale.x;
1369
+ vUv.y += offsetScale.y;
1370
+
1371
+ vUv.x += .5;
1372
+ vUv.y += .5;
1373
+ }
1374
+
1375
+ `,this.fragmentShader=`
1376
+ uniform sampler2D map;
1377
+ varying vec2 vUv;
1378
+ void main() {
1379
+ if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
1380
+ gl_FragColor = vec4(0., 0., 0., 1.);
1381
+ else
1382
+ {
1383
+ vec4 texcolor = texture2D(map, vUv);
1384
+ gl_FragColor = texcolor;
1385
+ }
1386
+ }
1387
+ `}}var KA=Object.defineProperty,JA=Object.getOwnPropertyDescriptor,_h=(o,e,t,i)=>{for(var n=i>1?void 0:i?JA(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&&KA(e,t,n),n};const Mt=w("debugscreensharing");var o1=(o=>(o[o.Screen=0]="Screen",o[o.Camera=1]="Camera",o[o.Canvas=2]="Canvas",o[o.Microphone=3]="Microphone",o))(o1||{});class $s extends M{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=o1[this.device]),Mt&&console.log("Screensharing",this.name,this),Mi.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new td(this)}onEnable(){this._net?.enable(),this._net?.addEventListener(qn.StreamReceived,this.onReceiveStream),this._net?.addEventListener(qn.StreamEnded,this.onCallEnded),this.context.connection.beginListen(ee.JoinedRoom,this.onJoinedRoom),this.autoConnect&&Bn(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){this._net?.removeEventListener(qn.StreamReceived,this.onReceiveStream),this._net?.removeEventListener(qn.StreamEnded,this.onCallEnded),this.context.connection.stopListen(ee.JoinedRoom,this.onJoinedRoom),this._net?.disable(),this.close()}onJoinedRoom=async()=>{await Bn(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()};_ensureVideoPlayer(){const e=new ht;e.aspectMode=t1.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"),E()&&ge("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,ht)??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):Xn(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):Xn(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&&(Mt&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),this._net?.stopSendingStream(this._currentStream),Xn(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 Mi,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),n||(Mt&&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",()=>{Mt&&console.log("Track ended",s),this.close()}),Mt&&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=>{Mt&&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");Mt&&console.log(`Request camera. These are your kind:videoinput devices:
1388
+ `,i);let n=!1;for(const s of i)try{if(!this._requestOpen){Mt&&console.log("Camera selection cancelled");break}if(s.kind!=="videoinput"){Mt&&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){Mt&&console.log("Skipping device due to options.deviceId: "+s.label+"; "+s.deviceId);continue}if(t?.deviceFilter&&t.deviceFilter(s)===!1){Mt&&console.log("Skipping device due to options.deviceFilter: "+s.label+"; "+s.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(s)===!1){Mt&&console.log("Skipping device due to ScreenShare.deviceFilter: "+s.label+"; "+s.deviceId);continue}else Mt&&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){Mt&&console.log("Skipping device due to ScreenShare.deviceName: "+s.label+"; "+s.deviceId);continue}else Mt&&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),Mt&&console.log("Selected camera",s)):(Xn(a),Mt&&console.log("Camera selection cancelled"));break}catch(r){if(r.message==="Failed to allocate videosource"||r.message==="Could not start video source"){ge("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&&E()&&(ge("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))}}_h([u()],$s.prototype,"allowStartOnClick",2),_h([u()],$s.prototype,"autoConnect",2),_h([u(ht)],$s.prototype,"videoPlayer",1),_h([u()],$s.prototype,"device",2),_h([u()],$s.prototype,"deviceName",2);var e2=Object.defineProperty,s1=(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&&e2(e,t,n),n};class vh extends M{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=gr.createPrimitive(mr.Quad,{name:"ShadowCatcher",material:new ut({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=$0,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
1389
+ // diffuse-only lighting with overdrive to somewhat compensate
1390
+ // for the loss of indirect lighting and to make it more visible.
1391
+ vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
1392
+ float max = max(direct.r, max(direct.g, direct.b));
1393
+
1394
+ // early out - we're simply returning direct lighting and some alpha based on it so it can
1395
+ // be blended onto the scene.
1396
+ gl_FragColor = vec4(direct, max);
1397
+ return;
1398
+ `)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new I0;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 xe;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)}}s1([u()],vh.prototype,"mode"),s1([u(se)],vh.prototype,"shadowColor");const xp=new Map;function r1(o,e){if(xp.has(o))return xp.get(o);const t=new URL(o,window.location.href),i=t2(t,e);return xp.set(o,i),i.finally(()=>{xp.delete(o)}),i}async function t2(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 gm;else if(s)a=new Y0;else if(r){const{ktx2Loader:c}=mm(e);a=c}else a=new Nl;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=H0),a instanceof Nl&&(c.colorSpace=yo)}return c}).catch(c=>(console.warn("Failed to load texture from url:",o),null))}var i2=Object.defineProperty,wh=(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 mi=w("debugskybox");t0("background-image"),t0("environment-image");function a1(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 Cp;s.allowDrop=!1,s.allowNetworking=!1,s.background=t,s.environment=i,x.addComponent(o.scene,s);const r=a=>{typeof a=="string"&&(mi&&console.log(n,"CHANGED TO",a),s.setSkybox(a))};return vb(o.domElement,n,r),s.addEventListener("destroy",()=>{mi&&console.log("Destroyed attribute remote skybox",n),wb(o.domElement,n,r)}),s.setSkybox(e)}const Sp=new Array;ue.registerCallback(de.ContextCreationStart,o=>{const e=o.context,t=e.domElement.getAttribute("background-image"),i=e.domElement.getAttribute("environment-image");if(t){mi&&console.log("Creating RemoteSkybox to load background "+t);const n=a1(e,t,!0,!1,"background-image");n&&Sp.push(n)}if(i){mi&&console.log("Creating RemoteSkybox to load environment "+i);const n=a1(e,i,!1,!0,"environment-image");n&&Sp.push(n)}}),ue.registerCallback(de.ContextCreationStart,()=>Promise.all(Sp).finally(()=>{Sp.length=0}));const Jr=class extends M{url;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,si.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):mi&&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=n2(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")),mi&&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 r1(o,this.context.renderer);return t?!this.enabled||this.destroyed?(mi&&console.warn("RemoteSkybox: Component is disabled or destroyed"),!1):this._prevUrl!==o?(mi&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1):(this.url=o,this._prevLoadedEnvironment=t,this.apply(),!0):(mi&&console.warn("RemoteSkybox: Failed to load texture from url",o),!1)}apply(){const o=this._prevLoadedEnvironment;if(o&&(o instanceof rC||o instanceof aC||o.mapping==H0||(o.mapping=lC,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),mi&&console.log("Set RemoteSkybox ("+(this.environment&&this.background?"environment and background":this.environment?"environment":this.background?"background":"none")+")",this.url,!si.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=o),this.background&&!si.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(mi&&console.log(e),e==="text/uri-list"){const t=o.dataTransfer.getData(e);mi&&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),mi&&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(mi&&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}}}};wh([ry(Jr.prototype.urlChangedSyncField),u(URL)],Jr.prototype,"url"),wh([u()],Jr.prototype,"allowDrop"),wh([u()],Jr.prototype,"background"),wh([u()],Jr.prototype,"environment"),wh([u()],Jr.prototype,"allowNetworking");let Cp=Jr;function n2(o,e,t){if(o==null)return null;const i=e&&!t;switch(o.toLowerCase()){case"studio":return i?"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.pmrem4x4.ktx2?pmrem";case"blurred-skybox":return i?"https://cdn.needle.tools/static/skybox/blurred-skybox-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/blurred-skybox.pmrem4x4.ktx2?pmrem";case"quicklook-ar":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.pmrem4x4.ktx2?pmrem";case"quicklook":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.pmrem4x4.ktx2?pmrem"}return o}var o2=Object.defineProperty,Pp=(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 xh=class K1 extends M{target=null;followFactor=.1;rotateFactor=.1;positionAxes=Va.All;flipForward=!1;static _invertForward=new U().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=Z(this.target),i=this._firstUpdate||e?1:j.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&Va.X&&(n.x=j.lerp(n.x,t.x,i)),this.positionAxes&Va.Y&&(n.y=j.lerp(n.y,t.y,i)),this.positionAxes&Va.Z&&(n.z=j.lerp(n.z,t.z,i)),this.worldPosition=n}if(this.rotateFactor>0){const t=be(this.target);this.flipForward&&t.premultiply(K1._invertForward);const i=this._firstUpdate||e?1:j.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(t,i)}this._firstUpdate=!1}}};Pp([u(k)],xh.prototype,"target"),Pp([u()],xh.prototype,"followFactor"),Pp([u()],xh.prototype,"rotateFactor"),Pp([u()],xh.prototype,"positionAxes");let Op=xh;var s2=Object.defineProperty,Sh=(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};const Ch=w("debugspatialtrigger"),l1=new os,c1=new os;function r2(o,e){return l1.mask=o,c1.mask=e,l1.test(c1)}class so extends M{triggerMask=0;onEnter;onStay;onExit;start(){Ch&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of kp.triggers)r2(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){Ch&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){Ch&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}Sh([u()],so.prototype,"triggerMask"),Sh([u(he)],so.prototype,"onEnter"),Sh([u(he)],so.prototype,"onStay"),Sh([u(he)],so.prototype,"onExit");const h1=class Qp extends M{static triggers=[];triggerMask;boxHelper;start(){Ch&&console.log(this.name,this.triggerMask,this)}onEnable(){Qp.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,xt),this.boxHelper?.showHelper(null,Ch))}onDisable(){Qp.triggers.splice(Qp.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 so&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof so&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof so&&t.onExitTrigger(this)},!1)}};Sh([u()],h1.prototype,"triggerMask");let kp=h1;var a2=Object.defineProperty,l2=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&a2(e,t,n),n};const ji=w("debugspectator");class Mp extends M{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 d2(this.context,this),this._networking=new m2(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,si),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new c2(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|MacOS/.test(e),i=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!i}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(ji&&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,fs.Headset),this.target=this.context.players.getPlayerView(this.localId)),ji&&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){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 ne(1,1,1));e.setRenderTarget(null),e.xr.enabled=!1;const a=this.cam?.threeCamera;this.context.updateAspect(a);const l=e.xr.isPresenting;e.xr.isPresenting=!1,e.setSize(this.context.domWidth,this.context.domHeight),e.render(this.context.scene,a),e.xr.isPresenting=l,e.xr.enabled=t,i?e.setRenderTarget(i):s.bindXRFramebuffer&&s.bindXRFramebuffer(n),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of Le.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=Qn.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?Qn.FirstPerson:Qn.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const s of n)s.UpdateVisible(i)}}resetAvatarFlags(){for(const e of Le.instances)if(e.avatar&&"flags"in e.avatar){const t=e.avatar.flags;if(!t)continue;for(const i of t)"isLocalAvatar"in e.avatar&&e.avatar?.isLocalAvatar?i.UpdateVisible(Qn.FirstPerson):i.UpdateVisible(Qn.ThirdPerson)}}}l2([u()],Mp.prototype,"useKeys");class c2{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,Op)),this.target||(this.target=new k),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,ji&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){ji&&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){ji&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(ji&&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!==fs.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!==fs.Browser?i.quaternion.copy(h2):i.quaternion.identity()}}}const h2=new U().setFromAxisAngle(new b(0,1,0),Math.PI);class d2{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(Ee.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(Ee.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 ps;e.setMask(16777215);const t=this.context.physics.raycast(e);if(ji&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,s=x.getComponentInParent(n,Le),r=s?.connectionId;if(r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,ji&&console.log("spectate",r,s);break}}}}class u2{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class p2{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class m2{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(ee.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(ee.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(ji&&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 u2(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",s)}}onRequestFollowMe(e=!1){if(ji&&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 p2(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){w("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(ji&&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 ji&&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):(ji&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}var g2=Object.defineProperty,f2=Object.getOwnPropertyDescriptor,Sl=(o,e,t,i)=>{for(var n=i>1?void 0:i?f2(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&&g2(e,t,n),n};const d1=w("debugsplines");class ro{position=new b;rotation=new U;tangentIn=new b;tangentOut=new b}Sl([Qe(b)],ro.prototype,"position",2),Sl([Qe(U)],ro.prototype,"rotation",2),Sl([Qe(b)],ro.prototype,"tangentIn",2),Sl([Qe(b)],ro.prototype,"tangentOut",2);class ea extends M{addKnot(e){if(e instanceof ro)this.spline.push(e),this._isDirty=!0;else{const t=new ro;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(j.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(j.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(){d1&&(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=y2(this.spline,this.closed),this.buildDebugCurve()}}buildDebugCurve(){if(d1&&this.spline&&this._curve){this._debugLine?.removeFromParent(),this._debugLine=null;const e=new nm({color:6684927}),t=this.spline.length*10,i=this._curve.getPoints(t),n=new pn().setFromPoints(i);this._debugLine=new ya(n,e),this.gameObject?.add(this._debugLine)}}}Sl([Qe()],ea.prototype,"closed",1),Sl([Qe(ro)],ea.prototype,"spline",2);function y2(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=j.remap(i,0,.3,0,.5);return new cC(t,e,"catmullrom",n)}var b2=Object.defineProperty,_2=Object.getOwnPropertyDescriptor,ta=(o,e,t,i)=>{for(var n=i>1?void 0:i?_2(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&&b2(e,t,n),n};class Rn extends M{spline=null;object=void 0;lookAt=null;clamp=!1;get position01(){return this._position01}set position01(e){this._position01=e,this.updateFromPosition()}reset(){this._position01=0}autoRun=!0;duration=10;_position01=0;start(){this.object===void 0&&(this.object=this.gameObject),this.updateFromPosition()}update(){this.autoRun&&(this._position01+=this.context.time.deltaTime/this.duration,this.updateFromPosition())}updateFromPosition(){if(!this.spline||!this.spline.curve||!this.object)return;this.clamp?this._position01=j.clamp01(this._position01):this._position01=this._position01%1;const e=this._position01>=1?1:this._position01%1,t=this.spline.getPointAt(e);if(this.object.worldPosition=t,this.lookAt)this.object.lookAt(this.lookAt.worldPosition);else{const i=this.spline.getTangentAt(e);this.object.lookAt(t.add(i))}}}ta([Qe(ea)],Rn.prototype,"spline",2),ta([Qe(k)],Rn.prototype,"object",2),ta([Qe(k)],Rn.prototype,"lookAt",2),ta([Qe()],Rn.prototype,"clamp",2),ta([Qe()],Rn.prototype,"position01",1),ta([Qe()],Rn.prototype,"autoRun",2),ta([Qe()],Rn.prototype,"duration",2);class uo{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new uo).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+ob),(t||new uo).__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 Mr).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new Mr).__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 v2=Object.defineProperty,w2=(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};const Rp="SCAM";eg(Rp,uo.getRootAsSyncedCameraModel);const Di=new ym;class x2{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Di.clear();const i=Di.createString(this.guid),n=Di.createString(this.userId);uo.startSyncedCameraModel(Di),uo.addGuid(Di,i),uo.addUserId(Di,n);const s=Z(e),r=Sd(e);uo.addPos(Di,Mr.createVec3(Di,s.x,s.y,s.z)),uo.addRot(Di,Mr.createVec3(Di,r.x,r.y,r.z));const a=uo.endSyncedCameraModel(Di);Di.finish(a,Rp),t.sendBinary(Di.asUint8Array())}}}const u1=class T0 extends M{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(Rp,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Rp,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){E()&&console.log("Remote cam timeout",n),s?.obj&&x.destroy(s.obj),delete this.remoteCams[n],s&&delete this.userToCamMap[s.userId],T0.instances.push(s),this.context.players.removePlayerView(s.userId,fs.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 x2(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=Z(e),i=be(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,fs.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 An;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,T0.instances.push(n);const h=x.getOrAddComponent(c,Le);h.connectionId=i,h.avatar=c}else return;const s=n.obj;this.context.players.setPlayerView(i,s,fs.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,ln.markDirty(s);const r=e.pos();r&&ar(s,r.x(),r.y(),r.z());const a=e.rot();a&&Xl(s,a.x(),a.y(),a.z())}};w2([u([k,te])],u1.prototype,"cameraPrefab");let i0=u1;var S2=Object.defineProperty,C2=Object.getOwnPropertyDescriptor,Hs=(o,e,t,i)=>{for(var n=i>1?void 0:i?C2(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&&S2(e,t,n),n};const n0="view",o0=w("debugsyncedroom");class Tn extends M{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){return w(n0)||w(this.urlParameterName)}_lastJoinedRoom;set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}_roomPrefix="";awake(){this.joinRandomRoom===void 0&&this.roomName?.length<=0&&(this.joinRandomRoom=!0),o0&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=w(n0);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=w(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=bb(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?((o0||E())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
1399
+ 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.
1400
+ Please choose one of the following options to fix this:
1401
+ A) Set a room name in the SyncedRoom component
1402
+ B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
1403
+ C) Set "joinRandomRoom" to true`),!1):(o0&&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()):E()&&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(n0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=Wl(),t=this.generateRoomName();w(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Sm(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&&Vl(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=w(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Vl(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Ct("group"),this._roomButtonIconLeave=Ct("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(ee.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(ee.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(ee.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(ee.LeftRoom,this.updateRoomButtonState)}_viewOnlyButton;onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(ee.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(ee.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){this.context.connection.stopListen(ee.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),Te("View only URL copied to clipboard")):ge("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(Ct("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)}}Hs([u()],Tn.prototype,"roomName",2),Hs([u()],Tn.prototype,"urlParameterName",2),Hs([u()],Tn.prototype,"joinRandomRoom",2),Hs([u()],Tn.prototype,"requireRoomParameter",2),Hs([u()],Tn.prototype,"autoRejoin",2),Hs([u()],Tn.prototype,"createJoinButton",2),Hs([u()],Tn.prototype,"createViewOnlyButton",2),Hs([u()],Tn.prototype,"roomPrefix",1);function P2(){const o=w("testwindowcount")||0;o&&o>0&&O2(o)}function O2(o){if(w("testwindow"))return null;const e=new URL(window.location.href);xm(e.searchParams,xR,1),xm(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 g=i[p];g!==d&&g.close()}i.length=0}}}return i}class s0 extends M{awake(){P2()}}class r0 extends M{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Oc,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new k2(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 ym(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=yw(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 k2{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 M2=Object.defineProperty,Tp=(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&&M2(e,t,n),n};const R2=w("debugsignals");class Ep{guid}Tp([u()],Ep.prototype,"guid");class Ph{signal;reaction}Tp([u(Ep)],Ph.prototype,"signal"),Tp([u(he)],Ph.prototype,"reaction");const p1=class Ko extends M{static receivers={};static invoke(e){if(Ko.receivers[e]){const t=Ko.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){R2&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)Ko.receivers[e.signal.guid]||(Ko.receivers[e.signal.guid]=[]),Ko.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(Ko.receivers[e.signal.guid]){const t=Ko.receivers[e.signal.guid].indexOf(this);t>=0&&Ko.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)}}};Tp([u(Ph)],p1.prototype,"events");let Oh=p1;var Bi=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(Bi||{}),ao=(o=>(o[o.None=0]="None",o[o.Hold=1]="Hold",o[o.Loop=2]="Loop",o[o.PingPong=3]="PingPong",o[o.Continue=4]="Continue",o))(ao||{}),a0=(o=>(o.Signal="SignalEmitter",o))(a0||{});const lo=w("debugtimeline");class kh{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 T2{clip;rootPositionOffset;rootQuaternionOffset;get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}rootStartPosition;rootEndPosition;rootStartQuaternion;rootEndQuaternion;constructor(e){const t=e.getClip();this.clip=t;const i=e.getRoot(),n=i.name+".position",s=i.name+".quaternion";lo&&console.log(t.name,t.tracks,n);for(const r of t.tracks)if(!(r.times.length<=0)){if(r.name.endsWith(n))this.rootStartPosition=new b().fromArray(r.values,0),this.rootEndPosition=new b().fromArray(r.values,r.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),lo&&console.log(this.rootPositionOffset);else if(r.name.endsWith(s)&&(this.rootStartQuaternion=new U().fromArray(r.values,0),this.rootEndQuaternion=new U().fromArray(r.values,r.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),lo)){const a=new nt().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class Ap extends kh{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&&dw(this._animator.gameObject,this,this.director.isPlaying)}createHooks(e,t){if(t.tracks?.length<=0){console.warn("No tracks in AnimationClip",t);return}const i=t.tracks[0].name.split("."),n=i[i.length-2],s=n+".position",r=n+".quaternion";let a=!1,l=!1;for(const c of t.tracks)c.name.endsWith(s)?(a=!0,this.createPositionInterpolant(t,e,c)):c.name.endsWith(r)&&(l=!0,this.createRotationInterpolant(t,e,c));if(!a||!l){const c=this.mixer?.getRoot(),h=t.tracks[0],d=h.name.lastIndexOf("."),p=h.name.substring(0,d),g=p.substring(p.lastIndexOf(".")+1),f=c.getObjectByName(g);if(f)if(a){if(!l){const m=t.tracks[0].name.substring(0,d)+".quaternion";lo&&console.warn("Create quaternion track",g,f);const y=f.quaternion,_=new dC(m,[0,t.duration],[y.x,y.y,y.z,y.w,y.x,y.y,y.z,y.w]);t.tracks.push(_),this.createRotationInterpolant(t,e,_)}}else{const m=p+".position";lo&&console.warn("Create position track",g,f);const y=f.position,_=new hC(m,[0,t.duration],[y.x,y.y,y.z,y.x,y.y,y.z]);t.tracks.push(_),this.createPositionInterpolant(t,e,_)}}}bind(){if(!this._didBind){this._didBind=!0,lo&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new T2(e);this._actionOffsets.push(t)}this.target&&(this._animator=x.getComponent(this.target,ft)??null,this._animator&&dw(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 U(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 U(t.x,t.y,t.z,t.w)))}}_useclipOffsets=!0;_totalOffsetPosition=new b;_totalOffsetRotation=new U;_totalOffsetPosition2=new b;_totalOffsetRotation2=new U;_summedPos=new b;_tempPos=new b;_summedRot=new U;_tempRot=new U;_clipRotQuat=new U;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,g=l.postExtrapolationMode,f=a<this.clips.length-1?this.models[a+1]:null;let m=d,y=!1;if(!m&&!n&&l.end<e&&g!==ao.None?(!f||f.start>e)&&(m=!0,n=!0):a==0&&!m&&!s&&l.start>e&&p!==ao.None&&(!f||f.start<e)&&(m=!0,y=!0,s=!0),m){let _=this.weight;_*=this.evaluateWeight(e,a,this.models,m),_*=this.director.weight;let v=d;if(y)switch(p){case ao.Hold:break;case ao.Loop:e+=l.start,v=!0;break;default:e+=l.start,v=!0;break}let P=this.getClipTime(e,l),T=0;const O=h.duration;if(y&&p===ao.Hold&&(P=0),v){if(h.loop)for(T+=Math.floor(P/(O+1e-6));P>O;)P-=O}else if(!d&&n)switch(g){case ao.Hold:P=this.getClipTime(l.end,l);break;case ao.Loop:P%=O;break;case ao.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 A=Math.max(0,_);if(c.weight=A,r+=A,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 D=this._summedPos.set(0,0,0),q=this._tempPos.set(0,0,0),ie=this._summedRot.identity(),L=this._tempRot.identity(),V=h.rotation;V&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp(V,_));const N=this._actionOffsets[a];if(N.hasOffsets)for(let oe=0;oe<T;oe++)N.rootPositionOffset?q.copy(N.rootPositionOffset):q.set(0,0,0),q.applyQuaternion(ie),this._clipRotQuat&&q.applyQuaternion(this._clipRotQuat),N.rootQuaternionOffset&&(L.copy(N.rootQuaternionOffset),ie.multiply(L)),D.add(q);this._clipRotQuat&&W.multiply(this._clipRotQuat),W.multiply(ie),h.position&&D.add(h.position),I.add(D)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(lo||E())&&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 U;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(g=>g.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 g of this.director.animationCallbackReceivers)g?.onTimelinePosition?.call(g,this.director,this.target,d,s);return p[0]=s.x,p[1]=s.y,p[2]=s.z,p},c}}}const E2=w("mutetimeline");class is extends kh{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return cs(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 uC(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(E2||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),Mi.userInteractionRegistered!==!1&&!(a===null||!a.buffer))if(a.playbackRate=this.director.context.time.timeScale*this.director.speed,a.loop=l.loop,e>=r.start&&e<=r.end&&e<this.director.duration){if(!a.isPlaying||!this.director.isPlaying)(i||!r._didTriggerPlay&&this.lastTime<e)&&(r.duration*r.timeScale>.3?a.offset=r.clipIn+(e-r.start)*r.timeScale:a.offset=0,lo&&console.log("Timeline Audio ("+this.track.name+") play with offset "+a.offset+" - "+r.asset.clip),a.play(n),r._didTriggerPlay=!0);else{const h=r.clipIn+(e-r.start)*r.timeScale,d=a.context.currentTime-a._startedAt+a.offset;Math.abs(h-d)>.3&&(a.offset=h,a.stop(),a.play(n))}let c=l.volume;if(this.track.volume!==void 0&&(c*=this.track.volume),t&&(c=0),r.easeInDuration>0){const h=Math.min((e-r.start)/r.easeInDuration,1);c*=h}if(r.easeOutDuration>0){const h=Math.min((r.end-e)/r.easeOutDuration,1);c*=h}a.setVolume(c*this.director.weight)}else r._didTriggerPlay=!1,this.director.isPlaying&&a.isPlaying&&a.stop()}this.lastTime=e}loadAudio(e,t=0,i=0){let n=null;const s=e-i,r=e+t;for(const a of this.models)if(this.isInTimeRange(a,s,r)){const l=this.audio[this.models.indexOf(a)],c=this.handleAudioLoading(a,l);c!==null&&(n===null&&(n=[]),n.push(c))}return n!==null?Promise.all(n):null}isInTimeRange(e,t,i){return t<=e.start&&i>=e.end||t>=e.start&&t<=e.end||i>=e.start&&i<=e.end}static _audioBuffers=new Map;static dispose(){is._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new lm);const i=this.getAudioFilePath(e.asset.clip);if(is._audioBuffers.get(i)){const s=is._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}lo&&console.warn("LOAD audio track",i,this.director.sourceId);const n=new Promise((s,r)=>{this._audioLoader.load(i,a=>{t.setBuffer(a),s(a)},void 0,a=>{console.error("Error loading audio",a),s(null)})});return is._audioBuffers.set(i,n),n}}class Mh extends kh{models=[];didTrigger=[];receivers=[];evaluate(e){if(this.track.muted)return;const t=this.director.context.time.deltaTime*1.5;for(let i=0;i<this.models.length;i++){const n=this.models[i],s=this.didTrigger[i],r=n.time-e;let a=!1;if(n.retroActive)a=r<=1e-6;else{const l=Math.abs(r);(l===0||l>=1e-5&&l<t)&&(a=!0)}if(a){if(!s)if(lo&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)Oh.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class Ip extends kh{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,ia);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 A2=Object.defineProperty,m1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&A2(e,t,n),n};const Ho=w("debugtimeline"),l0=class E0 extends M{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:(Ho||Vi())&&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(){Ho&&console.log(this,this.playableAsset?.tracks),this.rebuildGraph(),!this.isValid()&&(Ho||E())&&(Ho?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(){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(){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&&!Mi.userInteractionRegistered&&this.waitForAudio;)await Bn(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),we.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}_guidsMap;resolveGuids(e){this._guidsMap=e}_isPlaying=!1;_internalUpdateRoutine;_isPaused=!1;_isStopping=!1;_time=0;_duration=0;_weight=1;_animationTracks=[];_audioTracks=[];_signalTracks=[];_controlTracks=[];_customTracks=[];_allTracks=[this._animationTracks,this._audioTracks,this._signalTracks,this._controlTracks,this._customTracks];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 Bi.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,Ho&&console.warn(this.name,"set ActivationTrack-"+s,l.name,a,i))}}break}if(!this._isStopping)for(const n of this._animationTracks)n.evaluate(i);for(const n of this._audioTracks)n.evaluate(i);for(const n of this._signalTracks)n.evaluate(i);for(const n of this._controlTracks)n.evaluate(i);for(const n of this._customTracks)n.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=$l(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)):(Ho&&console.log("Resolved binding",n,"to",s),t.outputs[i]=s)}else if(n===null){if(t.outputs.splice(i,1),E0.createTrackFunctions[t.type])continue;t.type!==Bi.Audio&&t.type!==Bi.Control&&t.type!==Bi.Marker&&t.type!==Bi.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===Bi.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):(Ho&&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(Ro,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=E0.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===Bi.Animation){if(!t.clips||t.clips.length<=0){Ho&&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,ft);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new Ap;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 g=p;if((typeof g=="string"||typeof g=="number")&&(g=a.find(m=>m.name===p)),Ho&&console.log(d,p,"\u2192",g),!g){console.warn("Could not find animationClip for model",h,t.name,this.name,this.playableAsset?.name,a,r);continue}r instanceof ft&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new am(r.gameObject),this.context.animations.registerAnimationMixer(l.mixer)),l.clips.push(g),l.mixer.uncacheAction(g),l.createHooks(h.asset,g);const f=l.mixer.clipAction(g);l.actions.push(f),l.models.push(h)}this._animationTracks.push(l)}}}else if(t.type===Bi.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new is;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Mi),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Ro)),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===Bi.Marker){const s=new Mh;if(s.director=this,s.track=t,t.markers)for(const r of t.markers)switch(r.type){case a0.Signal:s.models.push(r),s.didTrigger.push(!1);break}if(s!==null&&s.models.length>0){const r=x.getComponent(this.gameObject,Oh);r&&(s.receivers.push(r),this._signalTracks.push(s))}}else if(t.type===Bi.Signal){const s=new Mh;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===Bi.Control){const s=new Ip;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)}};m1([u()],l0.prototype,"playOnAwake"),m1([u()],l0.prototype,"extrapolationMode");let ia=l0;var I2=Object.defineProperty,Lp=(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};class na extends M{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!dc)&&this.context.mainCamera&&(this._control||(this._control=new LC(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(mo.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(wn);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(wn);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=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}}}Lp([u()],na.prototype,"isGizmo"),Lp([u()],na.prototype,"translationSnap"),Lp([u()],na.prototype,"rotationSnapAngle"),Lp([u()],na.prototype,"scaleSnap");var L2=Object.defineProperty,j2=Object.getOwnPropertyDescriptor,jp=(o,e,t,i)=>{for(var n=i>1?void 0:i?j2(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&&L2(e,t,n),n};class c0{texture=null;rect}jp([u(Re)],c0.prototype,"texture",2);let Cl=class extends Jc{set image(o){this.sprite||(this.sprite=new c0),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))}};jp([u(c0)],Cl.prototype,"sprite",1),jp([u()],Cl.prototype,"pixelsPerUnitMultiplier",2);class Dp extends Jc{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))}}jp([u(Re)],Dp.prototype,"mainTexture",1);var D2=Object.defineProperty,B2=Object.getOwnPropertyDescriptor,Fi=(o,e,t,i)=>{for(var n=i>1?void 0:i?B2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&D2(e,t,n),n};const oa=w("debugbutton");class Gs{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}Fi([u()],Gs.prototype,"colorMultiplier",2),Fi([u(se)],Gs.prototype,"disabledColor",2),Fi([u()],Gs.prototype,"fadeDuration",2),Fi([u(se)],Gs.prototype,"highlightedColor",2),Fi([u(se)],Gs.prototype,"normalColor",2),Fi([u(se)],Gs.prototype,"pressedColor",2),Fi([u(se)],Gs.prototype,"selectedColor",2);class F2{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class Go extends M{click(){this.onClick?.invoke()}onClick=new he;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),oa&&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),oa&&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){oa&&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){oa&&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===Td.Mouse)&&(oa&&(console.warn("Button Click",this.onClick),Te("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),oa))){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(),oa&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent($a)||this.gameObject.addComponent(wu)}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,Cl),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()}}Fi([u(he)],Go.prototype,"onClick",2),Fi([u(Gs)],Go.prototype,"colors",2),Fi([u()],Go.prototype,"transition",2),Fi([u(F2)],Go.prototype,"animationTriggers",2),Fi([u(ft)],Go.prototype,"animator",2),Fi([u()],Go.prototype,"interactable",1);var U2=Object.defineProperty,Bp=(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 qs=w("debuginputfield"),Rh=class X extends M{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 X.active===this}textComponent;placeholder;onValueChanged;onEndEdit;static active=null;static activeTime=-1;static htmlField=null;static htmlFieldFocused=!1;inputEventFn;_iosEventFn;start(){qs&&console.log(this.name,this)}onEnable(){X.htmlField||(X.htmlField=document.createElement("input"),X.htmlField.style.width="0px",X.htmlField.style.height="0px",X.htmlField.style.padding="0px",X.htmlField.style.border="none",X.htmlField.style.overflow="hidden",X.htmlField.style.caretColor="transparent",X.htmlField.style.outline="none",X.htmlField.classList.add("ar"),X.htmlField.onfocus=()=>X.htmlFieldFocused=!0,X.htmlField.onblur=()=>X.htmlFieldFocused=!1,document.body.append(X.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),X.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&this.textComponent?.text.length&&x.setActive(this.placeholder.gameObject,!1),G.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){X.htmlField?.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){X.active===this&&X.htmlField?(X.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){qs&&console.log("CLICK",e,X.active),X.activeTime=this.context.time.time,X.active!==this&&this.startCoroutine(this.activeLoop(),we.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();X.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-X.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){if(X.active!==this&&(qs&&console.log("Select",this.name,this,X.htmlField,this.context.isInXR,this.context.arOverlayElement,this.textComponent?.text,X.htmlField?.value),X.active?.onDeselected(),X.active=this,this.placeholder&&x.setActive(this.placeholder.gameObject,!1),X.htmlField)){if(X.htmlField.value=this.textComponent?.text||"",qs&&console.log("set input field value",X.htmlField.value),this.context.isInXR){const e=this.context.arOverlayElement;e&&e.append(X.htmlField)}this.selectInputField()}}onDeselected(){X.active===this&&(X.active=null,qs&&console.log("Deselect",this.name,this),X.htmlField&&(X.htmlField.blur(),document.body.append(X.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&x.setActive(this.placeholder.gameObject,!0),X.htmlField&&this.onEndEdit?.invoke(X.htmlField.value))}update(){X.active===this&&this.textComponent?.markDirty()}onInput(e){if(X.active===this){if(qs&&console.log(e.code,e,X.htmlField?.value,this.textComponent?.text),e.code==="Escape"||e.code==="Enter"){this.onDeselected();return}X.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&x.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){if(this.textComponent&&X.htmlField){const e=this.textComponent.text,t=X.htmlField.value,i=this.textComponent.text!==X.htmlField.value;this.textComponent.text=X.htmlField.value,i&&(qs&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){X.htmlField&&(qs&&console.log("Focus Inputfield",X.htmlFieldFocused),X.htmlField.setSelectionRange(X.htmlField.value.length,X.htmlField.value.length),G.isiOS()?X.htmlField.focus({preventScroll:!0}):setTimeout(()=>X.htmlField?.focus(),1))}processInputOniOS(){const e=this.context.physics.raycast();if(!e.length)return;const t=e[0].object,i=of(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};Bp([u(Bt)],Rh.prototype,"textComponent"),Bp([u(Bt)],Rh.prototype,"placeholder"),Bp([u(he)],Rh.prototype,"onValueChanged"),Bp([u(he)],Rh.prototype,"onEndEdit");let h0=Rh;var z2=Object.defineProperty,g1=(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&&z2(e,t,n),n};class Th extends M{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 jC;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new DC(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=Sd(this.gameObject).clone();Xl(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new bi;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()}}g1([u()],Th.prototype,"id"),g1([u()],Th.prototype,"keepAspect");/* @license
1404
+ * Copyright 2021 Google LLC. All Rights Reserved.
1405
+ * Licensed under the Apache License, Version 2.0 (the 'License');
1406
+ * you may not use this file except in compliance with the License.
1407
+ * You may obtain a copy of the License at
1408
+ *
1409
+ * http://www.apache.org/licenses/LICENSE-2.0
1410
+ *
1411
+ * Unless required by applicable law or agreed to in writing, software
1412
+ * distributed under the License is distributed on an 'AS IS' BASIS,
1413
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1414
+ * See the License for the specific language governing permissions and
1415
+ * limitations under the License.
1416
+ */const N2={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]}]},W2={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 Fp extends yi{constructor(e){super(),this.position.y=-3.5;const t=new fa;t.deleteAttribute("uv");const i=new ut({metalness:0,side:pd}),n=new ut({metalness:0}),s=e=="legacy"?N2:W2,r=new im(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 xe;return t.color.setScalar(e),t}}var V2=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&&V2(e,t,n),n};const Eh=class J1 extends M{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new U().setFromAxisAngle(new b(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),ql(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(J1.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=it.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new J().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new J().makeRotationZ(-Math.PI/2*a)))}const s=new Et("lookat "+this.name,Dt.sceneStartTrigger(),me.lookAtCameraAction(n,void 0,this.invertForward?dn.back:dn.forward,this.keepUpDirection?dn.up:dn.zero));e.addBehavior(s)}}};Up([u(k)],Eh.prototype,"target"),Up([u()],Eh.prototype,"invertForward"),Up([u()],Eh.prototype,"keepUpDirection"),Up([u()],Eh.prototype,"copyTargetRotation");let d0=Eh;var $2=Object.defineProperty,u0=(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};class Pl extends M{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),E()&&Te("Open URL: "+e),this.mode){case 0:G.isSafari(),globalThis.open(e,"_blank");break;case 1:G.isSafari()&&G.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:G.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(ki)||this.gameObject.addComponent(ki)}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.")&&(E()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}u0([u()],Pl.prototype,"url"),u0([u()],Pl.prototype,"mode"),u0([u()],Pl.prototype,"clickable"),du(o=>{const e=o.domElement.getAttribute("clickthrough");e!==null&&e!=="0"&&e!=="false"&&o.scene.addComponent(zp)});class zp extends M{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),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("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")};onTouchEnd=e=>{setTimeout(()=>{this.context.domElement.style.pointerEvents="all"},100)}}var H2=Object.defineProperty,f1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&H2(e,t,n),n};class Ah extends M{damping=0;keepDistance=!0;awake(){this._distance=-1}_distance=-1;updateDistance(){this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}update(){this.updateDistance();const e=this.context.input.mousePositionRC,t=this.context.mainCamera,i=t.worldPosition,n=$(e.x,e.y,1).unproject(t);n.sub(i).normalize();const s=n.multiplyScalar(this._distance).add(i);if(this.damping>0){const r=this.gameObject.worldPosition;r.lerp(s,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=r}else this.gameObject.worldPosition=s}}f1([u()],Ah.prototype,"damping"),f1([u()],Ah.prototype,"keepDistance");var G2=Object.defineProperty,q2=Object.getOwnPropertyDescriptor,Ol=(o,e,t,i)=>{for(var n=i>1?void 0:i?q2(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&&G2(e,t,n),n};let co=class extends M{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=gs.emptyClip()),this.hovered||(this.hovered=gs.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Lt),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})}};Ol([u()],co.prototype,"type",2),Ol([u()],co.prototype,"duration",2),Ol([u()],co.prototype,"scaleFactor",2),Ol([u(Wi)],co.prototype,"hovered",2),Ol([u(Wi)],co.prototype,"idle",2),co=Ol([nv],co);var X2=Object.defineProperty,kl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&X2(e,t,n),n};const sa=class A0 extends M{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new he;get currentValue(){return this.current_value}current_value=0;target_value=0;applied_value=-1;onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this.applied_value=-1}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){if(this.updateCurrentScrollValue(),this.damping>0?this.current_value=j.lerp(this.current_value,this.target_value,this.context.time.deltaTime/this.damping):this.current_value=this.target_value,this.current_value!==this.applied_value){this.applied_value=this.current_value;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&&A0.applyScroll(i,t)):this.target&&A0.applyScroll(this.target,t)}}}_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),(isNaN(this.target_value)||!isFinite(this.target_value))&&(this.target_value=0);break}}else this.target_value=window.scrollY/(document.body.scrollHeight-window.innerHeight);(isNaN(this.target_value)||!isFinite(this.target_value))&&(this.target_value=0);break}};static applyScroll(e,t){if(e)if(e instanceof ia)e.time=t*e.duration,e.isPlaying||e.evaluate();else if(e instanceof ft)e.setFloat("scroll",t);else if(e instanceof Lt)e.time=t*e.duration;else if(e instanceof Mi){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof Rn)e.position01=t;else if(e instanceof di)e.intensity=t;else if(e instanceof k){e["needle:scrollbounds"]===void 0&&(e["needle:scrollbounds"]=Vt(e)||null);const i=e["needle:scrollbounds"];i&&(e.position.y=-i.min.y-t*(i.max.y-i.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}};kl([u([M,k])],sa.prototype,"target"),kl([u()],sa.prototype,"damping"),kl([u()],sa.prototype,"invert"),kl([u()],sa.prototype,"htmlSelector"),kl([u()],sa.prototype,"mode"),kl([u(he)],sa.prototype,"changed");let p0=sa;var Q2=Object.defineProperty,Ml=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&Q2(e,t,n),n};class qo extends M{get activeAndEnabled(){return!0}side="none";controller=!0;hands=!1;controlVisibility=!0;useGripSpace=!1;resetTransformAfterXRSession=!0;_startPosition=new b;_startRotation=new U;_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=$(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=$(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))}}Ml([u()],qo.prototype,"side"),Ml([u()],qo.prototype,"controller"),Ml([u()],qo.prototype,"hands"),Ml([u()],qo.prototype,"controlVisibility"),Ml([u()],qo.prototype,"useGripSpace"),Ml([u()],qo.prototype,"resetTransformAfterXRSession");function y1(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.
1417
+
1418
+ Example to request camera-access in global scope:
1419
+ NeedleXRSession.onSessionRequestStart(evt => {
1420
+ evt.init.optionalFeatures = evt.init.optionalFeatures || [];
1421
+ evt.init.optionalFeatures.push('camera-access');
1422
+ });
1423
+ `),E()&&Zl("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){Y2(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 b1=new WeakMap;function Y2(o,e){const t=b1.get(e)||new WeakSet;if(t.has(o))return;t.add(o),b1.set(e,t),console.debug("Initialize texture for camera feed");const i=new xe,n=new Ln,s=new yi;s.add(new H(n,i));const r=new ce;i.map=e,o.render(s,r)}function Z2(o,e,t,i="image/webp",n){return m0({context:o,width:e,height:t,mimeType:i,camera:n})}function m0(o){o||(o={});const{transparent:e=!1}=o;let{mimeType:t,context:i,width:n,height:s,camera:r}=o;if(!i&&(i=ue.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!=we.EarlyUpdate)return console.warn("Screenshot: defer to access XR frame"),new Promise(A=>{Co(I=>{const W=m0(o);A(W)},we.EarlyUpdate,{once:!0})});const c=a.domElement,h=c.width,d=c.height;n||(n=h),s||(s=d);const p=n,g=s;let f=window.devicePixelRatio||1,m=1;i.devicePixelRatio==="auto"||i.devicePixelRatio==="manual"?m=1:m=i.devicePixelRatio/window.devicePixelRatio,f*=m,n/=f,s/=f,n=Math.floor(n),s=Math.floor(s),a.xr.isPresenting&&a.xr.getFrame();const y=a.xr.enabled;a.xr.enabled=!1,a.xr.isPresenting=!1,c.style.width=`${n}px`,c.style.height=`${s}px`;const _=a.getRenderTarget(),v=a.getClearColor(new ne),P=a.getClearAlpha(),T=i.scene.background,O="aspect"in r?r.aspect:null;try{const A=o.render_events!==!1,I=new Array;A&&(ja(i.scene,Ti,I),I.forEach(L=>{if(L?.onBeforeRender(),L.isInstancingActive&&L.instances)for(let V=0;V<L.instances?.length;V++){const N=L.instances[V];Oo(N.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 ce&&(r.aspect=n/s,r.updateProjectionMatrix());const W="type"in o&&o.type==="texture";let D=null;W&&(D=new Dn(n,s,{wrapS:q0,wrapT:q0,format:1023}),a.setRenderTarget(D));let q=c;if(l?(D&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),q=Lh.compositeWithCameraImage({width:p,height:g,scene:i.scene,camera:r,renderer:a})):i.renderNow(r||null),r instanceof ce&&O!=null&&(r.aspect=O,r.updateProjectionMatrix()),A&&I.forEach(L=>L.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 L=K2(q);L&&(q=L)}if("type"in o){if(o.type==="texture")return D?(o.target&&(o.target.image=D?.texture.image,o.target.needsUpdate=!0),D.texture.offset.set(0,-1),D.texture.needsUpdate=!0,D.texture):(console.error("No target texture found"),null);if(o.type==="blob")return new Promise((L,V)=>{q.toBlob(N=>{L(N)},t)});if(o.type==="share")return new Promise((L,V)=>{q.toBlob(N=>{if(N&&"share"in navigator){let oe="file_type"in o&&o.file_type||t;t||(oe="image/png");const le=oe?.split("/")[1]||"png",ye=new File([N],"filename"in o?o.filename||`screenshot.${le}`:`screenshot.${le}`,{type:oe});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:[ye]}).catch(Se=>{console.warn("User cancelled share",Se.message)}).finally(()=>{L({blob:N,shared:!0})})}return{blob:N,shared:!1}},t)})}const ie=q.toDataURL(t);if("download_filename"in o&&o.download_filename){let L=o.download_filename;if(G.isMobileDevice()&&typeof window<"u"){const V=L+"_screenshots",N=L.split("."),oe=N.pop()?.toLowerCase();let le=0;localStorage.getItem(V)&&(le=parseInt(sessionStorage.getItem(V)||"0")),le>0&&(L=`${N.join()}-${le}.${oe}`),le+=1,sessionStorage.setItem(V,le.toString())}_1(ie,L)}return ie}finally{a.setRenderTarget(_),i.scene.background=T,a.setSize(h,d,!1),a.setClearColor(v,P),O!=null&&r instanceof ce&&(r.aspect=O,r.updateProjectionMatrix()),a.xr.enabled=y,a.xr.isPresenting=l,l||i.updateSize(!0)}return null}function K2(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 m=0;m<i;m++){const y=(f*i+m)*4;s[y+3]!==0&&(m<a&&(a=m),m>c&&(c=m),f<r&&(r=f),f>l&&(l=f))}const h=c-a+1,d=l-r+1,p=document.createElement("canvas"),g=p.getContext("2d");return g?(p.width=h,p.height=d,g.drawImage(e,a,r,h,d,0,0,h,d),p):null}let Ih=null;function _1(o,e){if(o){if(!o.startsWith("data:image")){console.error("Can not save image: Data url is not an image",o);return}Ih||(Ih=document.createElement("a")),Ih.href=o,Ih.download=e,Ih.click()}}var Lh;(o=>{let e=null,t=null,i=null,n=null,s=null;function r(c){const{renderer:h,width:d,height:p}=c,g=h.xr.enabled,f=h.getRenderTarget(),m=h.autoClear,y=d,_=p,v=d/p;(!i||i.width!==y||i.height!==_)&&(i??=new Dn(y,_,{colorSpace:yo}),i.width=y,i.height=_,i.samples=4,i.texture.repeat.y=-1,i.texture.offset.y=1),(!s||s.width!==y||s.height!==_)&&(s=document.createElement("canvas"),s.width=y,s.height=_,s.style.position="fixed",s.style.top="0px",s.style.right="0px",s.style.width="300px",s.style.height=`${300/v}px`,s.style.zIndex="1000",s.style.pointerEvents="none",s.style.opacity="1.0",s.style.willChange="contents"),e||(e=l({defines:{DECODE_VIDEO_TEXTURE:!0}})),t||(t=l()),n||(n=new Re),h.xr.updateCamera(c.camera),h.xr.enabled=!1,h.autoClear=!1,h.clear(),h.setSize(y,_),h.setRenderTarget(i),y1(c.renderer,n)||console.error("Could not update texture from XR frame");const P=x.findObjectOfType(jh);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=g,h.autoClear=m,s}o.compositeWithCameraImage=r;const a=`
1424
+ uniform sampler2D t2D;
1425
+ varying vec2 vUv;
1426
+
1427
+ void main() {
1428
+
1429
+ vec4 texColor = texture2D( t2D, vUv );
1430
+
1431
+ #ifdef DECODE_VIDEO_TEXTURE
1432
+
1433
+ // inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
1434
+ 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 );
1435
+
1436
+ #endif
1437
+
1438
+ gl_FragColor = texColor;
1439
+ #include <tonemapping_fragment>
1440
+ #include <colorspace_fragment>
1441
+ }
1442
+ `;function l(c){const h=c?.material||new jn({name:"BackgroundMaterial",uniforms:G0.clone(gd.background.uniforms),vertexShader:gd.background.vertexShader,fragmentShader:a,defines:c?.defines,side:ls,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(h,"map",{get:function(){return this.threeTexture}});const d=new H(new Ln(2,2),h);return wd(d,!1),d.geometry.deleteAttribute("normal"),d.renderOrder=-1e6,d.setTexture=function(p){h.uniforms.t2D.value=p},d}o.makeFullscreenPlane=l})(Lh||(Lh={}));var J2=Object.defineProperty,eI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&J2(e,t,n),n};const v1=w("debugarcamera");class jh extends M{onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),v1&&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 xe,t=new Ln,i=new yi;i.add(new H(t,e));const n=new ce;return function(s,r){e.map=r,s.render(i,n),v1&&console.warn("Force texture initialization")}}();preRender=()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new Re,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=Lh.makeFullscreenPlane({material:new jn({name:"BackgroundMaterial",uniforms:{...G0.clone(gd.background.uniforms),tint:{value:new pe(e.r,e.g,e.b,e.a)}},vertexShader:gd.background.vertexShader,fragmentShader:tI,side:vi,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof jn&&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"&&(y1(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)}}eI([u(se)],jh.prototype,"backgroundTint");const tI=`
1443
+ uniform sampler2D t2D;
1444
+ uniform vec4 tint;
1445
+
1446
+ varying vec2 vUv;
1447
+
1448
+ void main() {
1449
+
1450
+ vec4 texColor = texture2D( t2D, vUv );
1451
+ texColor.w = 1.0;
1452
+
1453
+ // inline sRGB decode
1454
+ 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 );
1455
+
1456
+ gl_FragColor = texColor * tint;
1457
+
1458
+ #include <tonemapping_fragment>
1459
+ #include <colorspace_fragment>
1460
+ }
1461
+ `;var iI=Object.defineProperty,Xs=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&iI(e,t,n),n};const Np=w("debugimagetracking");class Bl{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 wi(()=>new b,20);static _rotationBuffer=new wi(()=>new U,20);_position;_rotation;ensureTransformData(){if(!this._position){this._position=Bl._positionBuffer.get(),this._rotation=Bl._rotationBuffer.get();const e=this._pose.transform,t=Y.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 Xo{constructor(e){this.image=e.url,this.widthInMeters=e.widthInMeters,e.object instanceof k?this.object=new te({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}}Xs([u(URL)],Xo.prototype,"image"),Xs([u()],Xo.prototype,"widthInMeters"),Xs([u(te)],Xo.prototype,"object"),Xs([u()],Xo.prototype,"createObjectInstance"),Xs([u()],Xo.prototype,"imageDoesNotMove"),Xs([u()],Xo.prototype,"hideWhenTrackingIsLost");class nI{constructor(e,t){this.exporter=e,this.component=t,Np&&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&&(Np||E())&&(ge("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=G.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=Bh.get(t.image),n=await(await(await gx(i)).convertToBlob({type:"image/png"})).arrayBuffer();e.files["image_tracking/"+this.filename]=new Uint8Array(n)}onExportObject(e,t,i){if(!this.shouldExport)return;const n=this.component;if(!n||!n.trackedImages?.length||!n.activeAndEnabled)return;const s=n.trackedImages[0];if(s.object?.asset===e){this.imageModel=s,this.filename=s.getNameFromUrl()||"marker.png";const{scale:r,target:a}=this.exporter.getARScaleAndTarget();let l=e;const c=new J;if(e!==a)for(;l&&l.parent&&l.parent!==a;)l=l.parent,c.premultiply(l.matrix);const h=c.clone().invert();t.setMatrix(h.scale(new b(r,r,r)))}}}class Dh extends M{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),w1(e.image)),t&&this.setPrimaryImage(e)}trackedImages=[];smooth=!0;trackedImageIndexMap=new Map;get supported(){return this._supported}_supported=!0;awake(){if(Np&&console.log(this),!!this.trackedImages)for(const e of this.trackedImages)e.image&&w1(e.image)}onEnable(){io.beforeExport.addEventListener(this.onBeforeUSDZExport)}onDisable(){io.beforeExport.removeEventListener(this.onBeforeUSDZExport)}onBeforeUSDZExport=e=>{this.activeAndEnabled&&this.trackedImages?.length&&e.exporter.extensions.push(new nI(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=Bh.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&&G.isAndroidDevice()&&ge(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 Bl(this,c,r.image,r.measuredSize,a,h);this.currentImages.push(d)}else Np&&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,ge(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=Y.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(Ti))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))}}}}Xs([u(Xo)],Dh.prototype,"trackedImages"),Xs([u()],Dh.prototype,"smooth");const Bh=new Map,Wp=new Map;async function w1(o){if(Bh.has(o))return Wp.has(o)?Wp.get(o):Promise.resolve(!0);const e=new Promise(t=>{Bh.set(o,null);const i=document.createElement("img");i.src=o,i.addEventListener("load",async()=>{const n=await createImageBitmap(i);Bh.set(o,n),t(!0)})});return Wp.set(o,e),e.finally(()=>{Wp.delete(o)}),e}var oI=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&&oI(e,t,n),n};const ra=w("debugplanetracking");class Qo extends M{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),ra){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()+`
1462
+ `+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new bi;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),ra&&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()):ra&&console.warn("No normals helper found for mesh",i.mesh)}),Ci(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 g=this.createGeometry(a);if(d.mesh instanceof H)d.mesh.geometry.dispose(),d.mesh.geometry=g,this.makeOccluder(d.mesh,d.mesh.material);else if(d.mesh instanceof rs)for(const f of d.mesh.children)f instanceof H&&(f.geometry.dispose(),f.geometry=g,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()}ra&&(console.log("Plane updated, id="+d.id,d),d.mesh.traverse(f=>{if(!(f instanceof H))return;const m=f.userData.normalsHelper;m&&m.update()}))}const p=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:d}});this.dispatchEvent(p)}}else{if(!this.dataTemplate){const d=new H;ra?d.material=new pC:this.occluder?(d.material=new xe,this.makeOccluder(d,d.material,!0)):d.material=new xe({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new te("","",d)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const d=x.instantiate(this.dataTemplate.asset);if(d.name="xr-tracked-plane",h=d,zm(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 rs)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(Cs);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 g={id:this._dataId++,xrData:a,timestamp:a.lastChangedTime,mesh:d,collider:p};s.set(a,g),ra&&console.log("New plane detected, id="+g.id,g,{hasCollider:!!p,isGroup:d instanceof rs});try{const f=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:g}});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,ra&&h.traverse(d=>{if(d instanceof H)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new BC(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new J().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new bi;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 pn}_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 pn;n.setIndex(new pt(t,1)),n.setAttribute("position",new pt(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 pt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new pn,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 pt(new Float32Array(i),3)),t.setAttribute("uv",new pt(new Float32Array(n),2)),t.setAttribute("normal",new pt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Rl([u(te)],Qo.prototype,"dataTemplate"),Rl([u()],Qo.prototype,"occluder"),Rl([u()],Qo.prototype,"initiateRoomCaptureIfNoData"),Rl([u()],Qo.prototype,"usePlaneData"),Rl([u()],Qo.prototype,"useMeshData"),Rl([u()],Qo.prototype,"runInVR");var sI=Object.defineProperty,rI=(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&&sI(e,t,n),n};const x1=w("debugwebxr");class Vp extends M{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Y.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(x1){const e=new k;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(Vr);t&&(t.isGizmo=!1);const i=new _i(.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),x1&&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)}}rI([u()],Vp.prototype,"priority");class aI extends M{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}C.add("AlignmentConstraint",Sc),C.add("Animation",Lt),C.add("Animator",ft),C.add("AudioListener",Ro),C.add("AudioSource",Mi),C.add("Avatar_Brain_LookAt",Tc),C.add("Avatar_MouthShapes",Ec),C.add("Avatar_MustacheShake",df),C.add("AvatarBlink_Simple",Er),C.add("AvatarEyeLook_Rotation",pf),C.add("AxesHelper",qa),C.add("BasicIKConstraint",gf),C.add("BoxHelperComponent",xt),C.add("Camera",si),C.add("CharacterController",Ar),C.add("CharacterControllerInput",Ao),C.add("Collider",ai),C.add("SphereCollider",Xa),C.add("BoxCollider",ku),C.add("MeshCollider",Cs),C.add("CapsuleCollider",To),C.add("ContactShadows",Ic),C.add("LogStats",bf),C.add("DeleteBox",er),C.add("Deletable",vf),C.add("DeviceFlag",Mu),C.add("DragControls",jr),C.add("DropListener",Io),C.add("Duplicatable",Of),C.add("EventListEvent",bu),C.add("EventTrigger",Au),C.add("GltfExportBox",Ff),C.add("GltfExport",zf),C.add("VariantAction",Yf),C.add("ChangeTransformOnClick",Ur),C.add("ChangeMaterialOnClick",Kf),C.add("SetActiveOnClick",Jf),C.add("HideOnStart",hn),C.add("EmphasizeOnClick",rl),C.add("PlayAudioOnClick",Ms),C.add("PlayAnimationOnClick",Wc),C.add("PreliminaryAction",al),C.add("PreliminaryTrigger",Vc),C.add("VisibilityAction",$c),C.add("TapGestureTrigger",ty),C.add("USDZExporter",io),C.add("Fog",gl),C.add("BoxGizmo",Vr),C.add("GridHelper",fl),C.add("GroundProjectedEnv",Hn),C.add("UsageMarker",Lc),C.add("Interactable",_f),C.add("FixedJoint",Ry),C.add("HingeJoint",th),C.add("Light",di),C.add("LODGroup",nh),C.add("LookAtConstraint",kr),C.add("NeedleMenu",eo),C.add("NestedGltf",oh),C.add("Networking",Iy),C.add("OffsetConstraint",$r),C.add("CameraTargetReachedEvent",Rc),C.add("OrbitControls",fe),C.add("ParticleSystemRenderer",on),C.add("ParticleSystem",lh),C.add("Attractor",vl),C.add("PlayerColor",Dl),C.add("Antialiasing",hh),C.add("BloomEffect",yp),C.add("ChromaticAberration",dh),C.add("ColorAdjustments",Ws),C.add("DepthOfField",kn),C.add("EffectWrapper",ph),C.add("PixelationEffect",mh),C.add("ScreenSpaceAmbientOcclusion",Vo),C.add("ScreenSpaceAmbientOcclusionN8",Mn),C.add("SharpeningEffect",fh),C.add("TiltShiftEffect",oo),C.add("ToneMappingEffect",Ns),C.add("Vignette",Zr),C.add("Volume",xl),C.add("ReflectionProbe",Bc),C.add("Renderer",Ti),C.add("MeshRenderer",Fc),C.add("SkinnedMeshRenderer",Bf),C.add("Rigidbody",Ye),C.add("SceneSwitcher",qe),C.add("ScreenCapture",$s),C.add("ShadowCatcher",vh),C.add("RemoteSkybox",Cp),C.add("SmoothFollow",Op),C.add("SpatialTriggerReceiver",so),C.add("SpatialTrigger",kp),C.add("SpectatorCamera",Mp),C.add("SplineContainer",ea),C.add("SplineWalker",Rn),C.add("SpriteRenderer",ci),C.add("SyncedCamera",i0),C.add("SyncedRoom",Tn),C.add("SyncedTransform",wn),C.add("TestRunner",s0),C.add("TestSimulateUserData",r0),C.add("PlayableDirector",ia),C.add("SignalReceiver",Oh),C.add("AnimationTrackHandler",Ap),C.add("AudioTrackHandler",is),C.add("SignalTrackHandler",Mh),C.add("ControlTrackHandler",Ip),C.add("TransformGizmo",na),C.add("BaseUIComponent",an),C.add("UIRootComponent",Qc),C.add("Button",Go),C.add("Canvas",ml),C.add("CanvasGroup",js),C.add("EventSystem",ei),C.add("Graphic",Kc),C.add("MaskableGraphic",Jc),C.add("Image",Cl),C.add("RawImage",Dp),C.add("InputField",h0),C.add("VerticalLayoutGroup",by),C.add("HorizontalLayoutGroup",_y),C.add("GridLayoutGroup",vy),C.add("Outline",ul),C.add("ObjectRaycaster",ki),C.add("GraphicRaycaster",wu),C.add("SpatialGrabRaycaster",la),C.add("RectTransform",Pn),C.add("SpatialHtml",Th),C.add("Text",Bt),C.add("EnvironmentScene",Fp),C.add("LookAt",d0),C.add("OpenURL",Pl),C.add("VideoPlayer",ht),C.add("Voip",Ss),C.add("ClickThrough",zp),C.add("CursorFollow",Ah),C.add("HoverAnimation",co),C.add("ScrollFollow",p0),C.add("Avatar",Ts),C.add("XRControllerFollow",qo),C.add("XRControllerModel",Fo),C.add("XRControllerMovement",Ei),C.add("TeleportTarget",Ku),C.add("WebARCameraBackground",jh),C.add("WebARSessionRoot",Ui),C.add("WebXR",Ju),C.add("AvatarMarker",Le),C.add("WebXRImageTracking",Dh),C.add("WebXRPlaneTracking",Qo),C.add("XRRig",Vp),C.add("XRFlag",Ki),C.add("PlayerSync",ay),C.add("PlayerState",Sn),C.add("PresentationMode",aI);const Fh=gt,lI=w("debugtypestore");lI&&console.log(C);function cI(o,e){const t=lv(o,e);return t!==void 0?t:null}const hI=new Sk,g0=Symbol("deserialize-queue");async function dI(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 At(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new Rg(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=hI;let c=o[g0];if(c||(c=o[g0]=[]),t.scenes)for(const h of t.scenes)await b0(l,h,c,s,0);if(t.children)for(const h of t.children)await b0(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[g0];if(h){for(const d of h)uI(d,l);h.length=0}if(r){const d={},p=[];y0(t,r,d,p);for(const g of t.scenes)y0(g,r,d,p);for(const g of p)g.resolveGuids(d)}})}const f0=Symbol("original-component-name"),Tl=new Map;function y0(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&(Tl.has(s)||(Fh&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),Tl.set(s,new At(s))));const r=s&&Tl.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?Tl.has(l)||(Fh&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[f0]),Tl.set(l,new At(l))):Fh&&console.warn("Can not create IdProvider: component "+a[f0]+" has no guid",a.guid);const c=Tl.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)y0(a,e,t,i)}const Uh=[];async function b0(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,La(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[Jl]=a.guid),c[f0]=a.name,_r(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 Fh&&console.debug("unknown component: "+a.name),Uh.includes(a.name)||Uh.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await b0(o,r,t,i,n+1);if(Uh.length>0&&n===0){const r=Uh.join(", ");console.warn(`Unknown components in scene: ${r}`),Uh.length=0,Vi()&&Te(`<strong>Unknown components in scene</strong>:
1463
+
1464
+ ${r}
1465
+
1466
+ This could mean you forgot to add a npmdef to your ExportInfo
1467
+ <a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,xi.Warn)}}function uI(o,e){const{instance:t,compData:i,obj:n}=o;e.object=n,e.target=t,Xd(t,i,e),Fh&&console.debug("add "+i.name,i,t)}class S1{createBuiltinComponents(e,t,i,n,s){return dI(e,t,i,n,s)}writeBuiltinComponentData(e,t){return cI(e,t)}parseSync(e,t,i,n){return O1(e,t,i,n)}loadSync(e,t,i,n,s){return _0(e,t,i,n,s)}}Gm(S1);const C1=w("printGltf")||w("printgltf"),pI=w("debugfileformat");async function P1(o,e){const t=await Uw(o,{useExtension:!0})||"unknown";pI&&console.debug(`Determined file type: '${t}' for url '${o}'`,{registeredModelLoaderCallbacks:Ya});for(const i of Ya){const{callback:n}=i,s=n({context:e,url:o,mimetype:t});if(s instanceof Promise&&await s,s)return console.debug(`Using custom loader (${i.name||"unnamed"}) for ${t} at '${o}'`),s}switch(t){case"unsupported":return null;default:case"unknown":{console.warn(`Unknown file type (${t}). Needle Engine will fallback to the GLTFLoader - To support more model formats please create a Needle loader plugin.
1468
+ Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,o);const i=new bo;return await Du(i,e,o),i}case"model/fbx":case"model/vnd.autodesk.fbx":return new eb;case"model/obj":return new fm;case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usda+zip":return console.warn(t.toUpperCase()+" files are not supported."),null;case"model/gltf+json":case"model/gltf-binary":case"model/vrm":{const i=new bo;return await Du(i,e,o),i}}}function mI(o,e){return _0(e?.context||z.Current,o,o,e?.seed||null,e?.onprogress)}async function O1(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=""),C1&&console.log("Parse glTF",t);const n=await P1(t,o);if(!n)return;const{componentsExtension:s}=k1(n,o);if(n instanceof fm){typeof e!="string"&&(e=new TextDecoder().decode(e));const r=n.parse(e);return await zh(n,o,t,r,i,s)}if(!(n instanceof bo)){if(n.parse===void 0){console.error("Loader does not support parse");return}const r=n.parse(e,t);return await zh(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 zh(n,o,t,h,i,s);r(d)},h=>{console.error('Loading asset at "'+t+`" failed
1469
+ `,h),r(void 0)})}catch(l){console.error(l),a(l)}})}async function _0(o,e,t,i,n){fI(e);const s=await P1(e,o);if(!s)return;const{componentsExtension:r}=k1(s,o);if(!(s instanceof bo)){const a=await s.loadAsync(e,n);return await zh(s,o,e,a,i,r)}return new Promise((a,l)=>{try{s.load(e,async c=>{const h=await zh(s,o,t,c,i,r);a(h)},c=>{n?.call(s,c)},c=>{console.error('Loading asset at "'+e+`" failed
1470
+ `,c),a(void 0)})}catch(c){console.error(c),l(c)}})}function k1(o,e){const t=If(o);return o instanceof bo&&Zg(o,e),{componentsExtension:t}}async function zh(o,e,t,i,n,s){if(C1&&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 pn){const r=new ut({color:new ne(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]),yI(o,i),Sw(i)&&(Xw(t,i,e),await fn().createBuiltinComponents(e,t,i,n,s||void 0)),await gI(i.scene,e,e.mainCamera),i}async function gI(o,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(o,t,e.scene).catch(i=>{console.warn(i.message)}):ck(o,e)}catch(i){console.warn(i?.message||i)}}function fI(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.
1471
+ 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>`;Te(e),console.warn(e)}}function yI(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 eb||o instanceof fm){let t=e;t instanceof k||(t=e.scene||e.scenes.find(i=>i)),t.traverse(i=>{const n=i;n?.isMesh&&Nm(n,n.material)})}}const Nh=w("debugoverlay"),M1="ar",bI="quit-ar";class _I{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,G.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,G.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;Nh&&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),Nh&&!G.isMobileDevice()&&this.ensureQuitARButton(t),t}onRequestedEndAR(){this.currentSession&&(this.currentSession.end(),this.currentSession=null)}ensureQuitARButton(e){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(`.${bI}`);if(i){i.addEventListener("click",this.requestEndAR),Nh&&i.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),Nh&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const n=document.createElement("div");n.style.cssText=`
1472
+ position: fixed;
1473
+ top: 0;
1474
+ right: 0;
1475
+ z-index: 600;
1476
+ pointer-events: all;
1477
+ `,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=`
1478
+ background: rgba(255, 255, 255, .4);
1479
+ -webkit-backdrop-filter: blur(8px);
1480
+ backdrop-filter: blur(8px);
1481
+ border-radius: 50%;
1482
+ box-shadow: 0 0 5px rgba(0,0,0,.3);
1483
+ outline: 1px solid rgba(255, 255, 255, .6);
1484
+ display: flex;
1485
+ justify-content: center;
1486
+ align-items: center;
1487
+ `,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=`
1488
+ /**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
1489
+ `,s.appendChild(r),Nh&&console.log("Created fallback close button",s,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const aa=w("debugloading"),Wh=w("debugloadingrendering"),R1=w("debuglicense");class vI{className;additionalClasses}let Vh=0,T1;function v0(o){aa&&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?(T1!==o.name&&(Vh=0),T1=o.name,Vh+=(1-Vh)*.001,aa&&ge("Loading "+o.name+" did not report total size")):Vh=o.progress.loaded/t;const i=o.index/e+Vh/e;return j.clamp01(i)}class id{static LoadingContainerClassName="loading";loadingProgress=0;_element;_progress=0;_allowCustomLoadingElement=!0;_loadingElement;_loadingTextContainer=null;_loadingBar=null;_messageContainer=null;_loadingElementOptions;constructor(e,t){this._element=e,this._loadingElementOptions=t}async onLoadingBegin(e){const t=this._element.shadowRoot||this._element;if(aa&&console.warn("Begin Loading"),!this._loadingElement){for(let i=0;i<t.children.length;i++){const n=t.children[i];if(n.classList.contains(id.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){aa&&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=v0(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=i,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){aa&&console.warn("Finished Loading"),Wh||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}_progressLoop;smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;Wh&&(e=1/500,typeof Wh=="number"&&(e*=Wh)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!Wh&&(e=.9),this._progress=j.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){if(this._loadingElement){aa&&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+"%"),this._loadingTextContainer&&(this._loadingTextContainer.textContent=t)}createLoadingElement(e){aa&&!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=Vn();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 m=this._element.getAttribute("loading-background");m?this._loadingElement.style.background=m: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??id.LoadingContainerClassName;if(this._loadingElement.classList.add(n),this._loadingElementOptions?.additionalClasses)for(const m of this._loadingElementOptions.additionalClasses)this._loadingElement.classList.add(m);const s=document.createElement("div");s.style.cssText=`
1490
+ position: relative;
1491
+ display: flex;
1492
+ flex-direction: column;
1493
+ align-items: center;
1494
+ justify-content: center;
1495
+ width: 100%;
1496
+ height: 100%;
1497
+ pointer-events: none;
1498
+ `,this._loadingElement.appendChild(s);const r=this._element.getAttribute("poster");if(r!==null&&r!=="0"){const m=document.createElement("div"),y=r?.length?"0px":"50px";m.style.cssText=`
1499
+ position: absolute;
1500
+ left: 0;
1501
+ top: 0;
1502
+ bottom: 0;
1503
+ right: 0;
1504
+ z-index: -1;
1505
+ overflow: hidden;
1506
+
1507
+ margin: -${y};
1508
+ background: url('${r?.length?r:"/include/poster.webp"}') center center no-repeat;
1509
+ background-size: cover;
1510
+ filter: blur(${y});
1511
+ `,this._loadingElement.appendChild(m)}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=db,i&&this._element){const m=this._element.getAttribute("loading-logo-src");m&&(a.src=m,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=`
1512
+ display: flex;
1513
+ flex-direction: column;
1514
+ align-items: center;
1515
+ justify-content: center;
1516
+ width: 100%;
1517
+ opacity: 0;
1518
+ transition: opacity 1s ease-in-out 4s;
1519
+ `,setTimeout(()=>{d.style.opacity="1"},1),this._loadingElement.appendChild(d);const p=document.createElement("div"),g=100;p.style.display="flex",p.style.width=g+"%",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);const f=function(m){return j.lerp(0,g,m)+"%"};if(this._loadingBar.style.backgroundAttachment="fixed",this._loadingBar.style.background="#c4c4c4ab",this._loadingBar.style.width="0%",this._loadingBar.style.height="100%",i&&this._element){const m=this._element.getAttribute("primary-color"),y=this._element.getAttribute("secondary-color");m&&y?this._loadingBar.style.background=`linear-gradient(90deg, ${m} ${f(0)}, ${y} ${f(1)})`:m?this._loadingBar.style.background=m:y&&(this._loadingBar.style.background=y)}return this.handleRuntimeLicense(this._loadingElement),this._loadingElement}async handleRuntimeLicense(e){let t=$n();if(t)return;R1&&console.log("Loading UI has commercial license?",t);const i=document.createElement("div");i.style.paddingTop=".6em",i.style.fontSize=".8em",i.style.textTransform="uppercase",i.innerText=`NEEDLE ENGINE NON COMMERCIAL VERSION
1520
+ CLICK HERE TO GET A LICENSE`,i.style.cursor="pointer",i.style.userSelect="none",i.style.textAlign="center",i.style.pointerEvents="all",i.addEventListener("click",()=>window.open("https://needle.tools/pricing","_self")),i.style.opacity="0",e.appendChild(i),!E()&&Wa&&(R1&&console.log("Waiting for runtime license check"),await Wa,t=$n()),!t&&(i.style.transition="opacity .5s ease-in-out",i.style.opacity="1")}}Gm(S1);const ke=w("debugwebcomponent"),E1="needle-engine",A1="vr",I1="desktop",wI=[M1,A1,I1],$h="ar-session-active",Hh="desktop-session-active",xI=["public-key","version","hash","src","camera-controls","loadstart","progress","loadfinished","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","tone-mapping","tone-mapping-exposure","background-blurriness","background-color","environment-intensity"];class w0 extends HTMLElement{static get observedAttributes(){return xI}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 _I,this.addEventListener("ready",this.onReady),Gv(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
1521
+ @import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
1522
+
1523
+ :host {
1524
+ position: absolute;
1525
+ display: block;
1526
+ width: max(600px, 100%);
1527
+ height: max(300px, 100%);
1528
+ touch-action: none;
1529
+
1530
+ -webkit-tap-highlight-color: transparent;
1531
+ }
1532
+
1533
+ @media (max-width: 600px) {
1534
+ :host {
1535
+ width: 100%;
1536
+ }
1537
+ }
1538
+ @media (max-height: 300px) {
1539
+ :host {
1540
+ height: 100%;
1541
+ }
1542
+ }
1543
+
1544
+ :host > div.canvas-wrapper {
1545
+ width: 100%;
1546
+ height: 100%;
1547
+ }
1548
+
1549
+ :host canvas {
1550
+ position: absolute;
1551
+ user-select: none;
1552
+ -webkit-user-select: none;
1553
+
1554
+ /** allow touch panning but no pinch zoom **/
1555
+ /** but this doesnt work yet:
1556
+ * touch-action: pan-x, pan-y;
1557
+ **/
1558
+
1559
+ -webkit-touch-callout: none;
1560
+ -webkit-user-drag: none;
1561
+ -webkit-user-modify: none;
1562
+
1563
+ left: 0;
1564
+ top: 0;
1565
+ }
1566
+ :host .content {
1567
+ position: absolute;
1568
+ top: 0;
1569
+ width: 100%;
1570
+ height: 100%;
1571
+ visibility: visible;
1572
+ z-index: 500; /* < must be less than the webxr buttons element */
1573
+ pointer-events: none;
1574
+ }
1575
+ :host .overlay-content {
1576
+ position: absolute;
1577
+ user-select: auto;
1578
+ pointer-events: all;
1579
+ }
1580
+ :host slot[name="quit-ar"]:hover {
1581
+ cursor: pointer;
1582
+ }
1583
+ :host .quit-ar-button {
1584
+ position: absolute;
1585
+ // top: env(titlebar-area-y); /** this doesnt work **/
1586
+ top: 60px; /** camera access needs a bit more space **/
1587
+ right: 20px;
1588
+ z-index: 9999;
1589
+ }
1590
+ </style>
1591
+ <div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
1592
+ <canvas></canvas>
1593
+ </div>
1594
+ <div class="content">
1595
+ <slot class="overlay-content"></slot>
1596
+ </div>
1597
+ `,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new z({domElement:this}),this.addEventListener("error",this.onError)}async connectedCallback(){if(ke&&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"];ke&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(ke&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}ke&&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";ke&&console.warn('<needle-engine> disconnected, keep-alive: "'+e+'"',typeof e,"Dispose=",t),t?(ke&&console.warn("<needle-engine> dispose"),this._context?.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):ke&&console.warn("<needle-engine> is not disposed because keep-alive is set")}attributeChangedCallback(e,t,i){switch(ke&&console.log("attributeChangedCallback",e,t,i),e){case"src":ke&&console.warn(`<needle-engine src>
1598
+ 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&&(ke&&console.log(e+" attribute changed",i),this.registerEventFromAttribute(e,i));break;case"dracoDecoderPath":ke&&console.log("dracoDecoderPath",i),iw(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(ke&&console.log("dracoDecoderType",i),nw(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":ke&&console.log("ktx2DecoderPath",i),ow(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!=Ca&&this.setPublicKey();break}case"version":{i!=gn&&this.setVersion();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||(ke&&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&&(ke&&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)&&(ke&&console.warn("Clear scene",e),this._context.clear(),t!==this._loadId))return;const i=this.getAttribute("alias");this.classList.add("loading");const n=$n();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&&(E()||(s=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),E()&&ge('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 id(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)),ke&&console.warn(`--------------
1599
+ Needle Engine: Begin loading `+t+`
1600
+ `,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(ke&&console.debug("Loading progress: ",f),h.signal.aborted)return;const m=f.index;!c[m]&&f.name&&(c[m]=SI(f.name)),f.name=c[m],s&&this._loadingView?.onLoadingUpdate(f),a.name=f.name,a.progress=f.progress,this._loadingProgress01=v0(f),a.totalProgress01=this._loadingProgress01,this.dispatchEvent(l)},onLoadingFinished:(f,m,y)=>{ke&&console.debug(`Finished loading "${m}" (aborted? ${h.signal.aborted})`),!h.signal.aborted&&y&&r.push({src:m,file:y})}};CI(this);const p=this.getAttribute("hash");p!=null&&(this._context.hash=p),this._context.alias=i,this._createContextPromise=this._context.create(d);const g=await this._createContextPromise;if(this.applyAttributes(),ke&&console.warn(`--------------
1601
+ Needle Engine: finished loading `+t+`
1602
+ `,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&&g&&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=$v(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&&typeof i=="string"&&i.length>0){const n=se.fromColorRepresentation(i);ke&&console.debug("<needle-engine> background-color changed, str:",i,"\u2192",n),this._context.renderer.setClearColor(n,n.alpha),this.context.scene.background=null}}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:
1603
+ `,n)}}setPublicKey(){Ca&&Ca.length>0&&this.setAttribute("public-key",Ca)}setVersion(){gn.length>0&&this.setAttribute("version",gn)}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($h),this.classList.remove(Hh);const e=this.getAROverlayContainer();ke&&console.warn("onSetupAR:",e),e&&(e.classList.add($h),e.classList.remove(Hh)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,M1))}onSetupVR(){this.classList.remove($h),this.classList.remove(Hh),this.foreachHtmlElement(e=>this.setupElementsForMode(e,A1))}onSetupDesktop(){this.classList.remove($h),this.classList.add(Hh);const e=this.getAROverlayContainer();e&&(e.classList.remove($h),e.classList.add(Hh)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,I1))}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 wI)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&&(ke&&console.log("using custom draco decoder path",e),iw(e));const t=this.getAttribute("dracoDecoderType");t&&(ke&&console.log("using custom draco decoder type",t),nw(t));const i=this.getAttribute("ktx2DecoderPath");i&&(ke&&console.log("using custom ktx2 decoder path",i),ow(i))}}typeof window<"u"&&!window.customElements.get(E1)&&window.customElements.define(E1,w0);function SI(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 E()&&t!==a&&console.debug('Generated display name: "'+t+'" \u2192 "'+a+'"'),a.trim()}return E()&&console.debug("Loading: use default name",t),t}function CI(o){du(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 PI=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:w0},Symbol.toStringTag,{value:"Module"}));function OI(){En.registerWaitForInteraction(()=>{const o=mC.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(OI,1e3);const tt=w("debugphysics"),x0=w("debugcolliderplacement"),S0=w("debugcollisions"),kI=w("showcolliders"),$p=w("debugraycasts"),gi=Symbol("needle component"),Zt=Symbol("physics body"),L1=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,tt&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),ue.registerCallback(de.ContextCreationStart,o=>{tt&&console.log("Register rapier physics backend"),o.context.physics.engine=new Fl(o.context)});class Fl{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if(!e)return;this.validate();const t=e[Zt];if(e[Zt]=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 R.RAPIER_PHYSICS.MODULE.Collider){const s=n;this.world?.removeCollider(s,!0);const r=s.parent();r&&r.numColliders()<=0&&(r[gi]||this.world?.removeRigidBody(r))}else n instanceof R.RAPIER_PHYSICS.MODULE.RigidBody&&(n.numColliders()<=0?this.world?.removeRigidBody(n):E()&&(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[Zt];s&&this.syncPhysicsBody(n.gameObject,s,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[Zt];i&&(this.internalUpdateColliderProperties(t,i),t.sharedMaterial&&this.updatePhysicsMaterial(t))}else{const t=e,i=this.internal_getRigidbody(t);i&&this.internalUpdateRigidbodyProperties(t,i)}}addForce(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.addForce(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply force (does your object with the Rigidbody have a collider?)")}addImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}getLinearVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.linvel():null}getAngularVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.angvel():null}resetForces(e,t){this.validate(),this.internal_getRigidbody(e)?.resetForces(t)}resetTorques(e,t){this.validate(),this.internal_getRigidbody(e)?.resetTorques(t)}applyImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}wakeup(e){this.validate();const t=this.internal_getRigidbody(e);t?t.wakeUp():this._isInitialized&&console.warn("Rigidbody doesn't exist: can not wake up (does your object with the Rigidbody have a collider?)")}isSleeping(e){return this.validate(),this.internal_getRigidbody(e)?.isSleeping()}setAngularVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setAngvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set angular velocity (does your object with the Rigidbody have a collider?)")}setLinearVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setLinvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set linear velocity (does your object with the Rigidbody have a collider?)")}context;_initializePromise;_isInitialized=!1;constructor(e){this.context=e}get isInitialized(){return this._isInitialized}async initialize(){return this._initializePromise||(this._initializePromise=this.internalInitialization()),this._initializePromise}async internalInitialization(){return w("__nophysics")?(console.warn("Physics are disabled"),!1):(tt&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,R.RAPIER_PHYSICS.MAYBEMODULE==null&&(tt&&console.trace("Loading rapier physics engine"),await(await R.RAPIER_PHYSICS.load()).init()),tt&&console.log("Physics engine initialized, creating world..."),this._world=new R.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new R.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,tt&&console.log("Physics world created"),!0))}validate(){this._isInitialized||tt&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new wi(()=>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||$p)&&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[gi];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[gi]}}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||$p)&&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[gi];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[gi]}}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)&&(tt&&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=Z(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 R.RAPIER_PHYSICS.MODULE.Ball(t),this.rapierSphere.radius=t,(this.debugRenderRaycasts||$p)&&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 R.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||$p)&&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[gi],r=new kw(s.gameObject,s);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[gi].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}enabled=!1;get world(){return this._world}_tempPosition=new b;_tempQuaternion=new U;_tempScale=new b;_tempMatrix=new J;static _didLoadPhysicsEngine=!1;_isUpdatingPhysicsWorld=!1;get isUpdating(){return this._isUpdatingPhysicsWorld}_world;_hasCreatedWorld=!1;eventQueue;collisionHandler;objects=[];bodies=[];_meshCache=new Map;_gravity={x:0,y:-9.81,z:0};get gravity(){return this.world?.gravity??this._gravity}set gravity(e){this.world?this.world.gravity=e:this._gravity=e}clearCaches(){this._meshCache.clear(),this.eventQueue?.raw&&this.eventQueue?.free(),this.world?.bodies&&this.world?.free()}async addBoxCollider(e,t){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){tt&&console.warn("Physics are disabled");return}const i=e.gameObject,n=$e(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=R.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){tt&&console.warn("Physics are disabled");return}const t=R.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){tt&&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=j.clamp(t*.5*n.y-i*n.x,0,Number.MAX_SAFE_INTEGER),a=R.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(r,s);this.createCollider(e,a)}async addMeshCollider(e,t,i,n){let s=t.geometry;if(!s){tt&&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=FC(s));let r=null;const a=s.getAttribute("position");if(a instanceof F0){const d=a.count;r=new Float32Array(d*3);for(let p=0;p<d;p++){const g=a.getX(p),f=a.getY(p),m=a.getZ(p);r[p*3]=g,r[p*3+1]=f,r[p*3+2]=m}}else r=a.array;if(await this.initialize(),!this.enabled){tt&&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))tt&&console.warn("Use cached mesh collider"),r=this._meshCache.get(d);else{(tt||E())&&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 g=0;g<r.length;g+=3)p[g]=r[g]*c.x,p[g+1]=r[g+1]*c.y,p[g+2]=r[g+2]*c.z;r=p,this._meshCache.set(d,p)}}const h=i?R.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(r):R.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(r,l);h&&this.createCollider(e,h)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,i=e[Zt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case yt.Average:i.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case yt.Maximum:i.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case yt.Minimum:i.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case yt.Multiply:i.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&i.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case yt.Average:i.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case yt.Maximum:i.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case yt.Minimum:i.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case yt.Multiply:i.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[Zt]:null}getComponent(e){return e?e[gi]: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):(tt&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(be(e.gameObject)),i.setPosition(Z(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 yt.Average:t.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case yt.Maximum:t.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case yt.Minimum:t.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case yt.Multiply:t.setRestitutionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(s.dynamicFriction!==void 0&&t.setFriction(s.dynamicFriction),s.frictionCombine!==void 0)switch(s.frictionCombine){case yt.Average:t.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case yt.Maximum:t.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case yt.Minimum:t.setFrictionCombineRule(R.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case yt.Multiply:t.setFrictionCombineRule(R.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[gi]=e,e[Zt]=r,r.setActiveEvents(R.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),r.setActiveCollisionTypes(R.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(r),this.updateColliderCollisionGroups(e),r}catch(r){return console.error('Error creating collider "'+e.name+`"
1604
+ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[Zt],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[Zt],!i){const s=n.isKinematic&&!x0;tt&&console.log("Create rigidbody",s);const r=s?R.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():R.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),a=Z(e.attachedRigidbody.gameObject);r.setTranslation(a.x,a.y,a.z),r.setRotation(be(e.attachedRigidbody.gameObject)),r.centerOfMass=new R.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[gi]=n,n[Zt]=i,this.internalUpdateRigidbodyProperties(n,i),this.getRigidbodyRelativeMatrix(e.gameObject,n.gameObject,t),e[L1]=i}else{const n=R.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),s=Z(e.gameObject);n.setTranslation(s.x,s.y,s.z),n.setRotation(be(e.gameObject)),i=this.world.createRigidBody(n),t.identity(),i[gi]=null}return i}internal_getRigidbody(e){return e.isCollider===!0?e[L1]:e[Zt]}internalUpdateColliderProperties(e,t){const i=t.shape;let n=!1;switch(i.type){case R.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const p=i,g=e,f=e.gameObject,m=$e(f,this._tempPosition),y=Math.abs(g.radius*m.x);n=p.radius!==y,p.radius=y,n&&t.setShape(p);break}case R.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const s=i,r=e,a=e.gameObject,l=$e(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!==fu.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(R.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(R.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}lines;step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new R.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else if(e!==void 0){const t=j.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 MI(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){if(tt||x0||kI||this.debugRenderColliders===!0){if(!this.lines){const i=new nm({color:7855479,fog:!1}),n=new pn;this.lines=new B0(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 pt(t.vertices,3)),this.lines.geometry.setAttribute("color",new pt(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(!x0)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&&E()&&(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=$e(t.gameObject);l.multiply(c),s.x-=l.x,s.y-=l.y,s.z-=l.z}ar(t.gameObject,s.x,s.y,s.z),Bm(t.gameObject,r.x,r.y,r.z,r.w)}}syncPhysicsBody(e,t,i,n){if(t instanceof R.RAPIER_PHYSICS.MODULE.RigidBody){const s=Z(e,this._tempPosition),r=be(e,this._tempQuaternion);switch(t.bodyType()){case R.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case R.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case R.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 R.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[gi];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 U;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,$e(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(be(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=Fl._matricesBuffer,n.length=0),e===t){const s=$e(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[Zt],n=t[Zt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const s=R.RAPIER_PHYSICS.MODULE.JointData.fixed(Fl.centerConnectionPos,Fl.centerConnectionRot,this._tempPosition,this._tempQuaternion),r=this.world.createImpulseJoint(s,i,n,!0);tt&&console.log("ADD FIXED JOINT",r)}addHingeJoint(e,t,i,n){if(!this.world){console.error("Physics world not initialized");return}const s=e[Zt],r=t[Zt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const a=R.RAPIER_PHYSICS.MODULE.JointData.revolute(i,this._tempPosition,n),l=this.world.createImpulseJoint(a,s,r,!0);tt&&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 MI{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[gi],a=s[gi];S0&&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)Sr(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)=>{Sr(r,c=>{if(c.destroyed)return;const h=c.onCollisionEnter||c.onCollisionStay||c.onCollisionExit;if(h||S0){if(!s){const d=[],p=a.normal();i instanceof Cs&&i.convex&&(p.x=-p.x,p.y=-p.y,p.z=-p.z);for(let g=0;g<a.numSolverContacts();g++){const f=a.solverContactPoint(g),m=a.contactImpulse(g);if(f){const y=a.contactDist(g),_=a.solverContactFriction(g),v=a.solverContactTangentVelocity(g),P=new Pw(f,y,p,m,_,v);d.push(P),S0&&F.DrawDirection(f,p,16711680,3,!0)}}s=new Ow(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 RI{static async createComparisonScene(e){const{files:t}=e,i=await Promise.all(t.map(f=>new te(f).loadAssetAsync())),n=new yi;let s=0;for(const f of i)if(f instanceof k){f.position.y=s,n.add(f);const m=Vt([f]);s+=m.getSize(new b).y,s+=.1}const r=new ce(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 m=(await import("./three-examples-BivkhnvN.min.js").then(y=>y.RGBELoader$1)).RGBELoader;f=new m}else if(a.endsWith(".exr")){const m=(await import("./three-examples-BivkhnvN.min.js").then(y=>y.EXRLoader$1)).EXRLoader;f=new m}if(f){const m=await f.loadAsync(a).catch(y=>(console.error(y),null));m&&(m.mapping=fo,m.needsUpdate=!0,n.background=m,n.environment=m,n.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",a)}const l=Vt(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 Z0(r,e.domElement||document.body);p.target=c,p.update();const g=(e.domElement||document.body).getBoundingClientRect();return r.aspect=g.width/g.height,r.updateProjectionMatrix(),{scene:n,camera:r}}}let C0=0;function j1(o){o?C0++:C0--}function TI(){return C0>0}const EI={binary:!0,animations:!0};async function AI(o){if(!o.context)throw new Error("No context provided to exportAsGLTF");o.scene||(o.scene=o.context.scene);const e={...EI,...o},{context:t}=e,i=new K0;i.register(a=>new Qw(a)),i.register(a=>new XR(a)),i.register(a=>new Ww(a)),Lf(i,e.context);const n={binary:e.binary,animations:LI(t,e.scene,[])},s=new II;console.debug("Exporting GLTF",n),s.onBeforeExport(e),j1(!0);const r=await i.parseAsync(e.scene,n).catch(a=>(console.error(a),null));if(j1(!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 D1=Symbol("needle:weight");class II{_undo=[];onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const i=gs.tryGetActionsFromMixer(t);if(i)for(let n=0;n<i.length;n++){const s=i[n];s[D1]=s.weight,s.weight=0,this._undo.push(()=>{s.weight=s[D1]})}t.update(0)}),e.context.scene.traverse(t=>{if(!Rf(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 LI(o,e,t){o.animations.mixers.forEach(n=>{const s=gs.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)gs.tryGetAnimationClipsFromObjectHierarchy(n,t);const i=new Set(t);return Array.from(i)}const B1="needle-button",P0=E();class F1 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 Zs,this.#e=this.#i.createARButton();else if(this.getAttribute("vr")!=null)this.#i??=new Zs,this.#e=this.#i.createVRButton();else if(this.getAttribute("quicklook")!=null)this.#i??=new Zs,this.#e=this.#i.createQuicklookButton();else{P0?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=`
1605
+ button {
1606
+ all: initial;
1607
+ cursor: inherit;
1608
+ color: inherit;
1609
+ font-family: inherit;
1610
+ gap: inherit;
1611
+ white-space: nowrap;
1612
+ }
1613
+ `,this.getAttribute("unstyled")!=null||(this.#o.innerHTML+=`
1614
+ :host {
1615
+ display: inline-block;
1616
+ background: rgba(255, 255, 255, .8);
1617
+ backdrop-filter: blur(10px);
1618
+ width: fit-content;
1619
+ transition: background .2s;
1620
+
1621
+ cursor: pointer;
1622
+ padding: 0.4rem .5rem;
1623
+ border-radius: 0.8rem;
1624
+ color: black;
1625
+ background: rgba(245, 245, 245, .8);
1626
+ outline: rgba(0,0,0,.05) 1px solid;
1627
+ }
1628
+ :host(:hover) {
1629
+ background: rgba(255, 255, 255, 1);
1630
+ transition: background .2s;
1631
+ }
1632
+ slot {
1633
+ display: flex;
1634
+ align-items: center;
1635
+ justify-content: center;
1636
+ gap: .5rem;
1637
+ }
1638
+ `),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),au(Vg,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#l()),this.#s.observe(this.#e,{attributes:!0}),P0&&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=>{P0&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(B1)&&window.customElements.define(B1,F1);const Gh=w("debugavatar");class O0{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 U1{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 An;i=x.instantiate(wa(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(Gh&&console.log("[Custom Avatar] valid config",t,Gh?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,Gh?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(Gh&&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 fn().parseSync(e,s,null,0))?.scene??null:null}const i=new bo;return Zg(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await fn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{Gh&&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 bi().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 O0(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 z1{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class N1{}const jI=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:me,ActionCollection:Cx,ActionModel:fi,AlignmentConstraint:Sc,Animation:Lt,AnimationCurve:sh,AnimationExtension:qu,AnimationTrackHandler:Ap,Animator:ft,AnimatorController:cn,Antialiasing:hh,Attractor:vl,AudioExtension:ca,AudioListener:Ro,AudioSource:Mi,AudioTrackHandler:is,Avatar:Ts,AvatarBlink_Simple:Er,AvatarEyeLook_Rotation:pf,AvatarLoader:U1,AvatarMarker:Le,AvatarModel:O0,Avatar_Brain_LookAt:Tc,Avatar_MouthShapes:Ec,Avatar_MustacheShake:df,Avatar_POI:Tr,AxesHelper:qa,BaseUIComponent:an,BasicIKConstraint:gf,BehaviorExtension:dy,BehaviorModel:Et,BloomEffect:yp,BoxCollider:ku,BoxGizmo:Vr,BoxHelperComponent:xt,Button:Go,CallInfo:Mo,Camera:si,CameraTargetReachedEvent:Rc,Canvas:ml,CanvasGroup:js,CapsuleCollider:To,ChangeMaterialOnClick:Kf,ChangeTransformOnClick:Ur,CharacterController:Ar,CharacterControllerInput:Ao,ChromaticAberration:dh,ClickThrough:zp,Collider:ai,ColorAdjustments:Ws,ColorBySpeedModule:bl,ColorOverLifetimeModule:hp,ContactShadows:Ic,ControlTrackHandler:Ip,CursorFollow:Ah,CustomBranding:Wr,Deletable:vf,DeleteBox:er,DepthOfField:kn,DeviceFlag:Mu,DocumentExtension:z1,DragControls:jr,DropListener:Io,Duplicatable:Of,EffectWrapper:ph,EmissionModule:Wo,EmphasizeOnClick:rl,EnvironmentScene:Fp,EventList:he,EventListEvent:bu,EventSystem:ei,EventTrigger:Au,FieldWithDefault:ix,FixedJoint:Ry,Fog:gl,GltfExport:zf,GltfExportBox:Ff,Gradient:Hr,Graphic:Kc,GraphicRaycaster:wu,GridHelper:fl,GridLayoutGroup:vy,GroundProjectedEnv:Hn,GroupActionModel:Fr,HideOnStart:hn,HingeJoint:th,HorizontalLayoutGroup:_y,get HoverAnimation(){return co},Image:Cl,InheritVelocityModule:Dy,InputField:h0,InstanceHandle:ma,InstancingHandler:ha,Interactable:_f,Keyframe:ui,LODGroup:nh,LODModel:yl,Light:di,LimitVelocityOverLifetimeModule:lt,LogStats:bf,LookAt:d0,LookAtConstraint:kr,MainModule:Ft,MaskableGraphic:Jc,MeshCollider:Cs,MeshRenderer:Fc,MinMaxCurve:Q,MinMaxGradient:Gr,NeedleMenu:eo,NestedGltf:oh,Networking:Iy,NoiseModule:_e,ObjectRaycaster:ki,OffsetConstraint:$r,OpenURL:Pl,OrbitControls:fe,Outline:ul,Padding:Nr,ParticleBurst:cp,ParticleSubEmitter:By,ParticleSystem:lh,ParticleSystemRenderer:on,PhysicsExtension:uy,PixelationEffect:mh,PlayAnimationOnClick:Wc,PlayAudioOnClick:Ms,PlayableDirector:ia,PlayerColor:Dl,PointerEventData:ed,PostProcessingHandler:e0,PreliminaryAction:al,PreliminaryTrigger:Vc,RawImage:Dp,Rect:Ex,RectTransform:Pn,ReflectionProbe:Bc,RegisteredAnimationInfo:tr,RemoteSkybox:Cp,Renderer:Ti,RendererLightmap:Bu,Rigidbody:Ye,RotationBySpeedModule:nn,RotationOverLifetimeModule:On,SceneSwitcher:qe,ScreenCapture:$s,ScreenSpaceAmbientOcclusion:Vo,ScreenSpaceAmbientOcclusionN8:Mn,ScrollFollow:p0,SetActiveOnClick:Jf,ShadowCatcher:vh,ShapeModule:jy,SharpeningEffect:fh,SignalAsset:Ep,SignalReceiver:Oh,SignalReceiverEvent:Ph,SignalTrackHandler:Mh,Size:Tx,SizeBySpeedModule:pi,SizeOverLifetimeModule:qr,SkinnedMeshRenderer:Bf,SmoothFollow:Op,SpatialGrabRaycaster:la,SpatialHtml:Th,SpatialTrigger:kp,SpatialTriggerReceiver:so,SpectatorCamera:Mp,SphereCollider:Xa,SplineContainer:ea,SplineData:ro,SplineWalker:Rn,Sprite:Bo,SpriteData:cl,SpriteRenderer:ci,SpriteSheet:ll,SubEmitterSystem:mp,SyncedCamera:i0,SyncedRoom:Tn,SyncedTransform:wn,TapGestureTrigger:ty,TeleportTarget:Ku,TestRunner:s0,TestSimulateUserData:r0,Text:Bt,TextBuilder:yy,TextExtension:np,TextureSheetAnimationModule:Ut,TiltShiftEffect:oo,ToneMappingEffect:Ns,TrailModule:Fe,TransformData:Ne,TransformGizmo:na,TriggerBuilder:Dt,TriggerModel:Ys,UIRaycastUtils:nf,UIRootComponent:Qc,USDZExporter:io,USDZText:pl,USDZUIExtension:Sy,UsageMarker:Lc,VariantAction:Yf,VelocityOverLifetimeModule:We,VerticalLayoutGroup:by,VideoPlayer:ht,Vignette:Zr,VisibilityAction:$c,Voip:Ss,Volume:xl,VolumeParameter:B,VolumeProfile:gp,WebARCameraBackground:jh,WebARSessionRoot:Ui,WebXR:Ju,WebXRImageTracking:Dh,WebXRImageTrackingModel:Xo,WebXRPlaneTracking:Qo,WebXRTrackedImage:Bl,XRControllerFollow:qo,XRControllerModel:Fo,XRControllerMovement:Ei,XRFlag:Ki,XRRig:Vp,XRState:Jt,__Ignore:N1},Symbol.toStringTag,{value:"Module"})),Hp=w("debugmissingcamera");ue.registerCallback(de.MissingCamera,o=>{Hp&&console.warn("Creating missing camera");const e=o.context.scene,t=new ce;t.name="Default Fallback Camera",e.add(t);const i=new si;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Rr.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Rr.Skybox;else{if(i.clearFlags=Rr.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 ne(s)}if(!e.environment){const s=new gC(o.context.renderer),r=new Fp("neutral");e.environment=s.fromScene(r,.025).texture}}const n=_r(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&W1(o.context,n),n}),ue.registerCallback(de.ContextCreated,o=>{if(!o.context.mainCamera){Hp&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(Tb(o.context.mainCamera)?.isCameraController==!0){Hp&&console.log("Will not auto-fit because a camera controller exists");return}W1(o.context)}});function W1(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(Hp&&console.log("Creating default camera controls",e?.name),t){const i=uc(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,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")}ue.registerCallback(de.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 Lt&&i.playAutomatically||i instanceof ft||i instanceof ia&&i.playOnAwake===!0)return!0;if(i instanceof Lt)return i.playAutomatically=!0,!0;if(i instanceof ia)return i.playOnAwake=!0,!0}},!0)!==!0&&gs.autoplayAnimations(t.file)});var k0;(o=>{function e(t,i=!1,n=.75){const s=new ea,r=1-j.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 ro;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(k0||(k0={}));class DI extends XC{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-2qGLkQjg.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,g=QC.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 m=new pt(d.index,1,!1);t.setIndex(m)}f.setBoundingBox&&(t.boundingBox=g.getBoundingBox(new bi)),i.onProgress&&i.onProgress(h.progress),n(g),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 BI=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:DI},Symbol.toStringTag,{value:"Module"}));export{bR as $physicsKey,me as ActionBuilder,Cx as ActionCollection,fi as ActionModel,Rv as Addressables,Sc as AlignmentConstraint,Na as AmbientMode,Lt as Animation,sh as AnimationCurve,qu as AnimationExtension,Ap as AnimationTrackHandler,gs as AnimationUtils,ft as Animator,_s as AnimatorConditionMode,cn as AnimatorController,Jg as AnimatorControllerParameterType,Cc as AnimatorStateInfo,hh as Antialiasing,En as Application,L_ as AssetDatabase,te as AssetReference,vl as Attractor,ca as AudioExtension,Ro as AudioListener,Mi as AudioSource,is as AudioTrackHandler,Ts as Avatar,Er as AvatarBlink_Simple,pf as AvatarEyeLook_Rotation,U1 as AvatarLoader,Le as AvatarMarker,O0 as AvatarModel,Tc as Avatar_Brain_LookAt,Ec as Avatar_MouthShapes,df as Avatar_MustacheShake,Tr as Avatar_POI,Va as Axes,qa as AxesHelper,Hm as BUILD_TIME,an as BaseUIComponent,gf as BasicIKConstraint,dy as BehaviorExtension,Et as BehaviorModel,Cr as BlobStorage,yp as BloomEffect,ku as BoxCollider,Vr as BoxGizmo,xt as BoxHelperComponent,Go as Button,In as ButtonsFactory,Rw as CallDirection,Mo as CallInfo,si as Camera,Rc as CameraTargetReachedEvent,ml as Canvas,js as CanvasGroup,To as CapsuleCollider,Kf as ChangeMaterialOnClick,Ur as ChangeTransformOnClick,Ar as CharacterController,Ao as CharacterControllerInput,dh as ChromaticAberration,wi as CircularBuffer,Rr as ClearFlags,zp as ClickThrough,ao as ClipExtrapolation,ai as Collider,Ow as Collision,fu as CollisionDetectionMode,Ws as ColorAdjustments,bl as ColorBySpeedModule,hp as ColorOverLifetimeModule,OM as Component,M as Component$1,Nd as ComponentLifecycleEvents,jI as Components,__ as ConnectionEvents,Pw as ContactPoint,Ic as ContactShadows,z as Context,dM as ContextArgs,de as ContextEvent,ue as ContextRegistry,Ip as ControlTrackHandler,Ah as CursorFollow,Wr as CustomBranding,Me as CustomShader,su as DefaultReflectionMode,vf as Deletable,er as DeleteBox,kn as DepthOfField,Mu as DeviceFlag,G as DeviceUtilities,z1 as DocumentExtension,jr as DragControls,xf as DragMode,Io as DropListener,Of as Duplicatable,ph as EffectWrapper,Wo as EmissionModule,rl as EmphasizeOnClick,id as EngineLoadingView,Fp as EnvironmentScene,he as EventList,bu as EventListEvent,ei as EventSystem,Au as EventTrigger,ix as FieldWithDefault,pa as FileReference,Ev as FileReferenceSerializer,NR as FileSpawnModel,Bw as File_Event,Ry as FixedJoint,gl as Fog,we as FrameEvent,Od as GENERATOR,x as GameObject,F as Gizmos,zf as GltfExport,Ff as GltfExportBox,Hr as Gradient,Kc as Graphic,wu as GraphicRaycaster,Ks as Graphics,fl as GridHelper,vy as GridLayoutGroup,Hn as GroundProjectedEnv,Fr as GroupActionModel,Cu as HideFlags,hn as HideOnStart,th as HingeJoint,_y as HorizontalLayoutGroup,uk as HostData,co as HoverAnimation,Cl as Image,ua as ImageReference,Tv as ImageReferenceSerializer,Dy as InheritVelocityModule,r_ as Input,ii as InputEventQueue,Ee as InputEvents,h0 as InputField,ma as InstanceHandle,ha as InstancingHandler,ln as InstancingUtil,Q_ as InstantiateEvent,At as InstantiateIdProvider,An as InstantiateOptions,_f as Interactable,Lh as InternalScreenshotUtils,DO as JoinedRoomResponse,PO as KeyEventArgs,ui as Keyframe,nh as LODGroup,yl as LODModel,BO as LeftRoomResponse,di as Light,Uv as LightData,lt as LimitVelocityOverLifetimeModule,vI as LoadingElementOptions,bf as LogStats,xi as LogType,d0 as LookAt,kr as LookAtConstraint,R as MODULES,Ft as MainModule,a0 as MarkerType,Jc as MaskableGraphic,j as Mathf,Cs as MeshCollider,Fc as MeshRenderer,Q as MinMaxCurve,Gr as MinMaxGradient,lc as NEEDLE_ENGINE_FEATURE_FLAGS,ec as NEKeyboardEvent,xo as NEPointerEvent,F1 as NeedleButtonElement,Cf as NeedleEngineModelLoader,w0 as NeedleEngineWebComponent,eo as NeedleMenu,Md as NeedlePatchesKey,Ym as NeedleXRController,Y as NeedleXRSession,x_ as NeedleXRSync,M_ as NeedleXRUtils,oh as NestedGltf,w_ as NetworkConnection,qn as NetworkedStreamEvents,td as NetworkedStreams,Iy as Networking,Z_ as NewInstanceModel,_e as NoiseModule,ki as ObjectRaycaster,gr as ObjectUtils,$r as OffsetConstraint,_d as OneEuroFilter,Em as OneEuroFilterXYZ,Pl as OpenURL,fe as OrbitControls,ul as Outline,v_ as OwnershipEvent,ig as OwnershipModel,Ca as PUBLIC_KEY,Nr as Padding,cp as ParticleBurst,By as ParticleSubEmitter,lh as ParticleSystem,zs as ParticleSystemBaseBehaviour,on as ParticleSystemRenderer,lp as ParticleSystemShapeType,ts as PeerHandle,y_ as PeerNetworking,Ll as Physics,uy as PhysicsExtension,yt as PhysicsMaterialCombine,mh as PixelationEffect,Wc as PlayAnimationOnClick,Ms as PlayAudioOnClick,ia as PlayableDirector,Dl as PlayerColor,Sn as PlayerState,Mx as PlayerStateEvent,ay as PlayerSync,Lv as PlayerView,jv as PlayerViewManager,ed as PointerEventData,Td as PointerType,et as PostProcessingEffect,ct as PostProcessingEffectOrder,e0 as PostProcessingHandler,al as PreliminaryAction,Vc as PreliminaryTrigger,Os as PreviewHelper,mr as PrimitiveType,re as Progress,Om as PromiseAllWithErrors,Pm as PromiseErrorResult,se as RGBAColor,Fl as RapierPhysics,Dp as RawImage,ps as RaycastOptions,Ex as Rect,Pn as RectTransform,Bc as ReflectionProbe,tr as RegisteredAnimationInfo,Cp as RemoteSkybox,po as RenderTexture,_w as RenderTextureSerializer,Ti as Renderer,Fv as RendererData,Bu as RendererLightmap,Ye as Rigidbody,Ge as RigidbodyConstraints,ee as RoomEvents,nn as RotationBySpeedModule,On as RotationOverLifetimeModule,Lu as SceneLightSettings,qe as SceneSwitcher,$s as ScreenCapture,Vo as ScreenSpaceAmbientOcclusion,Mn as ScreenSpaceAmbientOcclusionN8,p0 as ScrollFollow,yn as SendQueue,Rg as SerializationContext,Jf as SetActiveOnClick,vh as ShadowCatcher,jy as ShapeModule,kw as ShapeOverlapResult,fh as SharpeningEffect,Ep as SignalAsset,Oh as SignalReceiver,Ph as SignalReceiverEvent,Mh as SignalTrackHandler,Tx as Size,pi as SizeBySpeedModule,qr as SizeOverLifetimeModule,Bf as SkinnedMeshRenderer,Op as SmoothFollow,la as SpatialGrabRaycaster,Th as SpatialHtml,kp as SpatialTrigger,so as SpatialTriggerReceiver,Mp as SpectatorCamera,Xa as SphereCollider,ug as SphereIntersection,ea as SplineContainer,ro as SplineData,k0 as SplineUtils,Rn as SplineWalker,Bo as Sprite,cl as SpriteData,ci as SpriteRenderer,ll as SpriteSheet,AM as StateMachineBehaviour,cf as StreamEndedEvent,Mw as StreamReceivedEvent,mp as SubEmitterSystem,i0 as SyncedCamera,Tn as SyncedRoom,wn as SyncedTransform,ty as TapGestureTrigger,Ku as TeleportTarget,s0 as TestRunner,RI as TestSceneUtils,r0 as TestSimulateUserData,Bt as Text,yy as TextBuilder,np as TextExtension,Ut as TextureSheetAnimationModule,oo as TiltShiftEffect,Nv as Time,Ns as ToneMappingEffect,kh as TrackHandler,Bi as TrackType,Fe as TrailModule,Ne as TransformData,na as TransformGizmo,Dt as TriggerBuilder,Ys as TriggerModel,C as TypeStore,nf as UIRaycastUtils,Qc as UIRootComponent,Nf as USDDocument,it as USDObject,lx as USDWriter,io as USDZExporter,cx as USDZExporter$1,pl as USDZText,Sy as USDZUIExtension,vw as UriSerializer,Lc as UsageMarker,FO as UserJoinedOrLeftRoomModel,gn as VERSION,Yf as VariantAction,We as VelocityOverLifetimeModule,by as VerticalLayoutGroup,ht as VideoPlayer,fs as ViewDevice,Zr as Vignette,$c as VisibilityAction,Ss as Voip,xl as Volume,B as VolumeParameter,gp as VolumeProfile,$k as WaitForFrames,Av as WaitForPromise,Bg as WaitForSeconds,Jo as Watch,jh as WebARCameraBackground,Ui as WebARSessionRoot,Ju as WebXR,Zs as WebXRButtonFactory,Dh as WebXRImageTracking,Xo as WebXRImageTrackingModel,Qo as WebXRPlaneTracking,Bl as WebXRTrackedImage,qo as XRControllerFollow,Fo as XRControllerModel,Ei as XRControllerMovement,Ki as XRFlag,Vp as XRRig,Jt as XRState,Qn as XRStateFlag,N1 as __Ignore,tk as __internalNotifyObjectDestroyed,wo as activeInHierarchyFieldName,vb as addAttributeChangeCallback,_n as addComponent,cT as addCustomExtensionPlugin,_r as addNewComponent,kd as addPatch,Yd as apply,PM as applyHMRChanges,mv as applyPrototypeExtensions,Y_ as beginListenDestroy,J_ as beginListenInstantiate,Jm as binaryIdentifierCasts,hM as build_scene_functions,ur as builtinComponentKeyName,v0 as calculateProgress01,jP as clearMessages,QM as colorSerializer,ov as compareAssociation,_u as componentSerializer,Wb as copyTexture,uw as createMotion,ni as debugNet,tc as debugOwner,mx as decompressGpuTexture,$l as deepClone,Bn as delay,Hl as delayForFrames,Xd as deserializeObject,Ci as destroy,bv as destroyComponentInstance,Fw as determineMimeTypeFromExtension,Pe as disposeObjectResources,Xn as disposeStream,Jl as editorGuidKeyName,cr as enableSpatialConsole,ZM as euler,tR as eventListSerializer,AI as exportAsGLTF,Ig as findByGuid,Da as findObjectOfType,wv as findObjectsOfType,pg as findResourceUsers,gw as fitCamera,$b as fitObjectIntoVolume,Sr as foreachComponent,tu as foreachComponentEnumerator,KP as forward,xb as generateQRCode,K_ as generateSeed,Vt as getBoundingBox,Tb as getCameraController,vr as getComponent,mc as getComponentInChildren,gc as getComponentInParent,pc as getComponents,ja as getComponentsInChildren,Qd as getComponentsInParent,ox as getFormattedDate,Ct as getIconElement,Wg as getIconTexture,fn as getLoader,uc as getOrAddComponent,w as getParam,tO as getParentHierarchyPath,uP as getPath,AO as getPeerOptions,g_ as getPeerjsInstance,nk as getResourceUserCount,Ib as getTempColor,ti as getTempQuaternion,$ as getTempVector,Wl as getUrlParams,Vb as getVisibleInCustomShadowRendering,Bb as getWorldDirection,Fm as getWorldEuler,Z as getWorldPosition,be as getWorldQuaternion,Sd as getWorldRotation,$e as getWorldScale,$n as hasCommercialLicense,vc as hasIndieLicense,yu as hasPointerEventComponent,Vn as hasProLicense,Qb as hideDebugConsole,gx as imageToCanvas,Ua as instantiate,Xw as invokeLoadedImportPluginHooks,s_ as invokeXRSessionEnd,o_ as invokeXRSessionStart,xv as isActiveInHierarchy,Ba as isActiveSelf,bP as isAndroidDevice,Nb as isAnimationAction,Cw as isComponent,lP as isDebugMode,mP as isDesktop,xr as isDestroyed,E as isDevEnvironment,ek as isDisposed,TI as isExporting,Sw as isGLTFModel,hb as isHostedOnGlitch,Kg as isHotReloadEnabled,SM as isHotReloading,fP as isIPad,Hv as isIconElement,Vi as isLocalNetwork,vP as isMacOS,gP as isMobileDevice,_P as isMozillaXR,SP as isQuest,D_ as isResourceTrackingEnabled,xP as isSafari,Kd as isUsingInstancing,wP as isiOS,yP as isiPad,mI as loadAsset,r1 as loadPMREM,_0 as loadSync,Cd as logHierarchy,$P as lookAtInverse,ql as lookAtObject,HP as lookAtScreenPoint,hP as makeId,yb as makeIdFromRandomWords,Ji as makeNameSafe,Sv as markAsInstancedRendered,CP as microphonePermissionsGranted,aP as nameof,pb as nameofFactory,bw as objectSerializer,CO as offXRSessionEnd,SO as offXRSessionStart,wM as onAfterRender,vM as onBeforeRender,bM as onClear,_M as onDestroy,Jv as onInitialized,du as onStart,ew as onUpdate,Qm as onXRSessionEnd,Rd as onXRSessionStart,O1 as parseSync,Hb as placeOnSurface,Nm as postprocessFBXMaterials,VM as prefix,mb as pushState,dP as randomNumber,eg as registerBinaryType,cu as registerComponent,If as registerComponentExtension,sn as registerCustomEffectType,Lf as registerExportExtensions,Du as registerExtensions,rw as registerHotReloadType,Gm as registerLoader,tv as registerPrefabProvider,gv as registerPrototypeExtensions,nv as registerType,_b as relativePathPrefix,wb as removeAttributeChangeCallback,Ag as removeComponent,hT as removeCustomImportExtensionType,wO as removePatch,cs as resolveUrl,bb as sanitizeString,_1 as saveImage,Z2 as screenshot,m0 as screenshot2,xg as sendDestroyed,u as serializable,lv as serializeObject,Qe as serializeable,fc as setActive,Pb as setAllowBalloonMessages,EP as setAllowOverlayMessages,wd as setAutoFitEnabled,Am as setCameraController,Pv as setDestroyed,cO as setDevEnvironment,F_ as setDisposable,Fa as setDontDestroy,xm as setOrAddParamsToUrl,cP as setParam,Vl as setParamWithoutReload,IO as setPeerOptions,JO as setResourceTrackingEnabled,Sm as setState,zm as setVisibleInCustomShadowRendering,Um as setWorldEuler,mt as setWorldPosition,ar as setWorldPositionXYZ,mn as setWorldQuaternion,Bm as setWorldQuaternionXYZW,zb as setWorldRotation,Xl as setWorldRotationXYZ,Sa as setWorldScale,Zl as showBalloonError,Te as showBalloonMessage,ge as showBalloonWarning,$m as showDebugConsole,VP as slerp,hc as syncDestroy,ry as syncField,Sg as syncInstantiate,iO as textureToCanvas,p_ as tryCastBinary,zw as tryDetermineMimetypeFromBinary,Uw as tryDetermineMimetypeFromURL,wa as tryFindObject,m_ as tryGetGuid,aw as unregisterHotReloadType,Cm as unwatchWrite,Eb as useForAutoFit,Pt as validate,yd as watchWrite};