@needle-tools/engine 4.6.1 → 4.6.2

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 (103) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/generateMeshBVH.worker-BaNp_Xtp.js +25 -0
  3. package/dist/{gltf-progressive-Bm9eEfgu.min.js → gltf-progressive-Bl4okF1b.min.js} +1 -1
  4. package/dist/{gltf-progressive-GjIqwSG3.js → gltf-progressive-DSpdn0QT.js} +2 -2
  5. package/dist/{gltf-progressive-Dn6o99rH.umd.cjs → gltf-progressive-P8b8a0qY.umd.cjs} +1 -1
  6. package/dist/needle-engine.bundle-D0XWaCQs.min.js +1575 -0
  7. package/dist/{needle-engine.bundle-BVg46UWZ.js → needle-engine.bundle-DGcStTA7.js} +9715 -9555
  8. package/dist/needle-engine.bundle-DmYMLdWP.umd.cjs +1575 -0
  9. package/dist/needle-engine.js +352 -351
  10. package/dist/needle-engine.min.js +1 -1
  11. package/dist/needle-engine.umd.cjs +1 -1
  12. package/dist/{postprocessing-CRQa6Qxn.umd.cjs → postprocessing-CjW23fio.umd.cjs} +18 -18
  13. package/dist/{postprocessing-D6W1EyZ-.js → postprocessing-DYLNOL3W.js} +4 -3
  14. package/dist/{postprocessing-DF8AlRgW.min.js → postprocessing-xYQWCHFu.min.js} +26 -26
  15. package/dist/{three-DMrv-4ar.umd.cjs → three-B_hneGZr.umd.cjs} +4 -4
  16. package/dist/{three-Bz6X1mrw.js → three-DrqIzZTH.js} +4198 -4198
  17. package/dist/{three-Boa-jOq-.min.js → three-DuDKwKB8.min.js} +33 -33
  18. package/dist/{three-examples-GggCDHv0.js → three-examples-B50TT3Iu.js} +5 -5
  19. package/dist/{three-examples-DuVhxqft.min.js → three-examples-DaDLBuy6.min.js} +14 -14
  20. package/dist/{three-examples-C7ryg8vN.umd.cjs → three-examples-X3OadjXB.umd.cjs} +3 -3
  21. package/dist/{three-mesh-ui-CY6Izc7C.min.js → three-mesh-ui-B3p3gyUz.min.js} +1 -1
  22. package/dist/{three-mesh-ui-CwlN0FUC.umd.cjs → three-mesh-ui-CQiIQIlA.umd.cjs} +1 -1
  23. package/dist/{three-mesh-ui-CLNOfsWn.js → three-mesh-ui-CxuWt7m-.js} +1 -1
  24. package/dist/{vendor-zxXa3Dmr.min.js → vendor-BlSxe9JJ.min.js} +3 -3
  25. package/dist/{vendor-BSD1RQIh.js → vendor-BmYIgaS1.js} +3 -3
  26. package/dist/{vendor-DHr4aqIZ.umd.cjs → vendor-Cavtu3CP.umd.cjs} +3 -3
  27. package/lib/engine/engine_context.d.ts +4 -1
  28. package/lib/engine/engine_context.js +9 -2
  29. package/lib/engine/engine_context.js.map +1 -1
  30. package/lib/engine/engine_three_utils.d.ts +17 -14
  31. package/lib/engine/engine_three_utils.js +106 -53
  32. package/lib/engine/engine_three_utils.js.map +1 -1
  33. package/lib/engine/engine_tonemapping.d.ts +4 -0
  34. package/lib/engine/engine_tonemapping.js +21 -18
  35. package/lib/engine/engine_tonemapping.js.map +1 -1
  36. package/lib/engine/engine_utils.js.map +1 -1
  37. package/lib/engine/engine_utils_screenshot.d.ts +1 -1
  38. package/lib/engine/engine_utils_screenshot.js +11 -2
  39. package/lib/engine/engine_utils_screenshot.js.map +1 -1
  40. package/lib/engine/webcomponents/needle-engine.d.ts +4 -1
  41. package/lib/engine/webcomponents/needle-engine.extras.js +3 -3
  42. package/lib/engine/webcomponents/needle-engine.extras.js.map +1 -1
  43. package/lib/engine/webcomponents/needle-engine.js +11 -21
  44. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  45. package/lib/engine-components/CameraUtils.js.map +1 -1
  46. package/lib/engine-components/postprocessing/Effects/Antialiasing.js +3 -1
  47. package/lib/engine-components/postprocessing/Effects/Antialiasing.js.map +1 -1
  48. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +2 -2
  49. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +5 -2
  50. package/lib/engine-components/postprocessing/Effects/BloomEffect.js.map +1 -1
  51. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +8 -0
  52. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +27 -8
  53. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
  54. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +1 -0
  55. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js.map +1 -1
  56. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +1 -0
  57. package/lib/engine-components/postprocessing/Effects/Sharpening.js +4 -0
  58. package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
  59. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +2 -9
  60. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +23 -71
  61. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  62. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -0
  63. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +52 -0
  64. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js.map +1 -0
  65. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +18 -0
  66. package/lib/engine-components/postprocessing/PostProcessingEffect.js +22 -3
  67. package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
  68. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +20 -4
  69. package/lib/engine-components/postprocessing/PostProcessingHandler.js +209 -112
  70. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  71. package/lib/engine-components/postprocessing/Volume.d.ts +2 -1
  72. package/lib/engine-components/postprocessing/Volume.js +51 -33
  73. package/lib/engine-components/postprocessing/Volume.js.map +1 -1
  74. package/lib/engine-components/postprocessing/index.d.ts +1 -0
  75. package/lib/engine-components/postprocessing/index.js +1 -0
  76. package/lib/engine-components/postprocessing/index.js.map +1 -1
  77. package/lib/engine-components/postprocessing/utils.d.ts +43 -0
  78. package/lib/engine-components/postprocessing/utils.js +82 -0
  79. package/lib/engine-components/postprocessing/utils.js.map +1 -1
  80. package/package.json +1 -1
  81. package/src/engine/engine_context.ts +13 -4
  82. package/src/engine/engine_three_utils.ts +134 -58
  83. package/src/engine/engine_tonemapping.ts +23 -24
  84. package/src/engine/engine_utils.ts +2 -2
  85. package/src/engine/engine_utils_screenshot.ts +13 -3
  86. package/src/engine/webcomponents/needle-engine.extras.ts +3 -3
  87. package/src/engine/webcomponents/needle-engine.ts +14 -25
  88. package/src/engine-components/CameraUtils.ts +3 -3
  89. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +3 -1
  90. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +6 -4
  91. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +24 -13
  92. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +1 -0
  93. package/src/engine-components/postprocessing/Effects/Sharpening.ts +5 -0
  94. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +26 -80
  95. package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -0
  96. package/src/engine-components/postprocessing/PostProcessingEffect.ts +23 -3
  97. package/src/engine-components/postprocessing/PostProcessingHandler.ts +239 -119
  98. package/src/engine-components/postprocessing/Volume.ts +54 -38
  99. package/src/engine-components/postprocessing/index.ts +2 -1
  100. package/src/engine-components/postprocessing/utils.ts +102 -2
  101. package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
  102. package/dist/needle-engine.bundle-AOXFIsYk.umd.cjs +0 -1563
  103. package/dist/needle-engine.bundle-Dt52m2jf.min.js +0 -1563
@@ -1,1563 +0,0 @@
1
- var fC=Object.defineProperty,gv=n=>{throw TypeError(n)},yC=(n,e,t)=>e in n?fC(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,a=(n,e,t)=>yC(n,typeof e!="symbol"?e+"":e,t),gm=(n,e,t)=>e.has(n)||gv("Cannot "+t),fe=(n,e,t)=>(gm(n,e,"read from private field"),t?t.call(n):e.get(n)),Fs=(n,e,t)=>e.has(n)?gv("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),Us=(n,e,t,s)=>(gm(n,e,"write to private field"),s?s.call(n,t):e.set(n,t),t),sd=(n,e,t)=>(gm(n,e,"access private method"),t);import{Vector2 as re,Vector3 as S,Vector4 as ye,Quaternion as H,PlaneGeometry as zs,PerspectiveCamera as we,Scene as bi,ShaderMaterial as gs,Uniform$1 as ao,Mesh as X,WebGLRenderer as hr,Texture as je,Box3 as _i,ShadowMaterial as fv,Euler as It,Color as ae,MeshStandardMaterial as ft,Box3Helper as vC,GridHelper as fm,Object3D as A,Material as Pe,Matrix3 as yv,Matrix4 as se,Layers as lo,Ray as co,MathUtils as _n,AxesHelper as wi,MeshBasicMaterial as Me,DoubleSide as xi,BufferGeometry as Ns,Group as ho,CylinderGeometry as vv,SphereGeometry as nd,BoxGeometry as ga,SpriteMaterial as bC,Sprite as _C,Shape as wC,ExtrudeGeometry as xC,Fog as bv,DirectionalLight as ym,PointLight as vm,EdgesGeometry as SC,LineSegments as _v,LineBasicMaterial as wv,Line as zl,BufferAttribute as yt,Raycaster as od,Sphere as rd,ArrayCamera as CC,Plane as dr,SkinnedMesh as wn,InterleavedBufferAttribute as xv,Skeleton as PC,Bone as OC,Source as kC,WebGLCubeRenderTarget as MC,CubeCamera as RC,AnimationClip as uo,FileLoader as bm,TextureLoader as fa,PropertyBinding as ya,LinearSRGBColorSpace as xn,ShaderChunk as Ht,UniformsLib as TC,DataTexture as _m,RGBAFormat as ad,EquirectangularReflectionMapping as Sn,SRGBColorSpace as Cn,Clock as EC,NoToneMapping as va,PCFSoftShadowMap$1 as AC,BasicNodeLibrary as IC,WebGLRenderTarget as Pn,DepthTexture as LC,NearestFilter as ld,LoopRepeat as jC,LoopOnce as wm,AnimationMixer as xm,CompressedTexture as DC,FrontSide as po,Camera as BC,Frustum as Sv,OrthographicCamera as Sm,AudioListener as FC,PositionalAudio as UC,AudioLoader as Cm,EventDispatcher as Pm,BackSide as cd,MeshDepthMaterial as zC,CustomBlending as NC,MaxEquation as WC,AmbientLight as VC,HemisphereLight as HC,AlwaysStencilFunc as $C,GreaterEqualStencilFunc as GC,NotEqualStencilFunc as qC,GreaterStencilFunc as XC,LessEqualStencilFunc as QC,EqualStencilFunc as YC,LessStencilFunc as KC,NeverStencilFunc as Cv,InvertStencilOp as ZC,DecrementWrapStencilOp as JC,IncrementWrapStencilOp as eP,DecrementStencilOp as tP,IncrementStencilOp as iP,ReplaceStencilOp as sP,ZeroStencilOp as nP,KeepStencilOp as oP,RawShaderMaterial as Pv,GLSL3 as rP,AlwaysDepth as aP,GreaterEqualDepth as lP,GreaterDepth as cP,LessEqualDepth as hP,LessDepth as dP,NotEqualDepth as uP,EqualDepth as pP,BatchedMesh as Ov,MeshPhysicalMaterial as Om,LinearFilter as kv,UnsignedByteType as mP,RingGeometry as gP,Line3 as fP,AdditiveBlending as Mv,BoxHelper as yP,SpotLight as vP,DirectionalLightHelper as bP,CameraHelper as _P,LOD as wP,Triangle as xP,NormalBlending as SP,ReinhardToneMapping as km,NeutralToneMapping as Nl,AgXToneMapping as hd,ACESFilmicToneMapping as Mm,LinearToneMapping as dd,HalfFloatType as CP,VideoTexture as PP,CubeTexture as OP,CompressedCubeTexture as kP,EquirectangularRefractionMapping as MP,VectorKeyframeTrack as RP,QuaternionKeyframeTrack as TP,Audio as EP,ShaderLib as ud,UniformsUtils as Rv,MirroredRepeatWrapping as Tv,MeshNormalMaterial as AP,AudioContext as IP,PMREMGenerator$1 as LP}from"./three-Boa-jOq-.min.js";import{createLoaders as Rm,getRaycastMesh as Ev,LODsManager as ba,NEEDLE_progressive as Xe,addDracoAndKTX2Loaders as jP,configureLoader as DP,setKTX2TranscoderLocation as BP,setDracoDecoderLocation as FP}from"./gltf-progressive-Bm9eEfgu.min.js";import{GroundedSkybox as _a,Font as UP,TextGeometry as zP,FontLoader as NP,GLTFLoader as On,TransformControlsGizmo as Av,EXRLoader as pd,RGBELoader as Tm,Stats as WP,nodeFrame as VP,OrbitControls as Iv,PositionalAudioHelper as HP,HorizontalBlurShader as $P,VerticalBlurShader as GP,GLTFExporter as Lv,strToU8 as jv,zipSync as qP,XRControllerModelFactory as XP,XRHandMeshModel as QP,Line2 as YP,LineGeometry as KP,LineMaterial as ZP,KTX2Loader as JP,TransformControls as eO,InteractiveGroup as tO,HTMLMesh as iO,VertexNormalsHelper as sO,OBJLoader as Em,FBXLoader as Dv,mergeVertices as nO}from"./three-examples-DuVhxqft.min.js";import{fetchProfile as oO,MotionController as rO,$70d766613f57b014$export$2e2bcd8739ae039 as Bv,ByteBuffer as aO,v5 as Fv,md5 as Uv,SIZE_PREFIX_LENGTH as zv,Builder as Am,createNoise4D as lO,Matrix4 as Im,BatchedParticleRenderer as cO,ParticleSystem as hO,RenderMode as kn,ConstantColor as dO,Vector4 as uO,ConstantValue as pO,TrailParticle as Nv,WorkerBase as mO,MeshBVH as gO}from"./vendor-zxXa3Dmr.min.js";import{__webpack_exports__default as Re,__webpack_exports__Text as Wv,__webpack_exports__Block as Vv,__webpack_exports__update as fO,SimpleStateBehavior as yO,__webpack_exports__Inline as Lm,__webpack_exports__FontLibrary as Hv,ThreeMeshUI as $v}from"./three-mesh-ui-CY6Izc7C.min.js";const jm=new Map;function $t(n=(e=>(e=globalThis.location)==null?void 0:e.hostname)()){if(jm.has(n))return jm.get(n);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(n);return jm.set(n,e),e===!0}function Gv(){return window.location.hostname.includes("glitch.me")}const vO='<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>',bO=btoa(vO),_O="data:image/svg+xml;base64,"+bO,qv=_O,wO=`<?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(wO);const xO='<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>',SO=btoa(xO),CO="data:image/svg+xml;charset=utf-8;base64,"+SO,PO=CO,Xv=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var me=(n=>(n.ContextRegistered="ContextRegistered",n.ContextCreationStart="ContextCreationStart",n.ContextCreated="ContextCreated",n.ContextFirstFrameRendered="ContextFirstFrameRendered",n.ContextDestroying="ContextDestroying",n.ContextDestroyed="ContextDestroyed",n.MissingCamera="MissingCamera",n.ContextClearing="ContextClearing",n.ContextCleared="ContextCleared",n))(me||{});class pe{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static register(e){this.Registered.indexOf(e)===-1&&(Xv&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(Xv&&console.warn("Unregistering context"),this.Registered.splice(t,1))}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 s=this._callbacks[e].indexOf(t);s!==-1&&this._callbacks[e].splice(s,1)}static dispatchCallback(e,t,s){if(!this._callbacks[e])return!0;const o={event:e,context:t};if(s)for(const l in s)o[l]=s[l];const r=new Array;return this._callbacks[e].forEach(l=>{const c=l(o);c instanceof Promise&&r.push(c)}),Promise.all(r)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}a(pe,"Registered",[]),a(pe,"_callbacks",{});const Qv=()=>n=>n;function OO(n){return Qv()(n)}function kO(){return!!C("debug")}class Si{constructor(e,t){a(this,"_factory"),a(this,"_cache",[]),a(this,"_maxSize"),a(this,"_index",0),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 ur=!1;const Dm=new Array;typeof window<"u"&&setTimeout(()=>{if(ur){const n={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const s=t.toString().replace(/=$|=(?=&)/g,"");for(const r of Dm){const l=new URL(e);l.searchParams.append(r,""),n[r]=l.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: ${s} will show an onscreen console window.`);const o=ur===!0?"":` (containing "${ur}")`;console.group("Available URL parameters:"+o);for(const r of Object.keys(n).sort())typeof ur=="string"&&!r.toLowerCase().includes(ur.toLowerCase())||(console.groupCollapsed(r),console.log("Reload with this flag enabled:"),console.log(n[r]),console.groupEnd());console.groupEnd()}},100);function Wl(){var n;return new URLSearchParams((n=globalThis.location)==null?void 0:n.search)}function C(n){ur&&!Dm.includes(n)&&Dm.push(n);const e=Wl();if(e.has(n)){const t=e.get(n);if(t){const s=Number(t);return isNaN(s)?t:s}else return!0}return!1}ur=C("help");function MO(n,e){const t=Wl();t.has(n)?t.set(n,e):t.append(n,e),document.location.search=t.toString()}function Vl(n,e,t=!0){const s=Wl();s.has(n)?e===null?s.delete(n):s.set(n,e):e!==null&&s.append(n,e),t?Yv(n,s):Fm(n,s)}function Bm(n,e,t){n.has(e)?n.set(e,t.toString()):n.append(e,t.toString())}function Yv(n,e,t){window.history.pushState(t,n,"?"+e.toString())}function Fm(n,e,t){window.history.replaceState(t,n,"?"+e.toString())}function RO(n){for(var e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",s=t.length,o=0;o<n;o++)e+=t.charAt(Math.floor(Math.random()*s));return e}function TO(n,e){return Math.floor(Math.random()*(e-n+1))+n}const Kv=["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"],Zv=["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 Jv(){const n=Kv[Math.floor(Math.random()*Kv.length)],e=Zv[Math.floor(Math.random()*Zv.length)];return n+"_"+e}function eb(n){return n=n.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),n.trim()}function wa(n,e,t=!0,s=!1){var o;if(e==null)return null;if(e.userData&&e.userData.guid===n||e.guid==n)return e;if(s&&(o=e.userData)!=null&&o.components){for(const r of e.userData.components)if(r.guid===n)return r}if(t){if(e.scenes)for(const r in e.scenes){const l=e.scenes[r],c=wa(n,l,t,s);if(c)return c}if(e.children)for(const r in e.children){const l=e.children[r],c=wa(n,l,t,s);if(c)return c}}}function Hl(n,e){if(n!=null&&typeof n=="object"){let t;Array.isArray(n)?t=[]:(t=Object.create(n),Object.assign(t,n));for(const s of Object.keys(n)){const o=n[s];e&&!e(n,s,o)?t[s]=o:o?.clone!==void 0&&typeof o.clone=="function"?t[s]=o.clone():t[s]=Hl(o,e)}return t}return n}function fs(n){return new Promise((e,t)=>{setTimeout(e,n)})}function $l(n,e){if(n<=0)return Promise.resolve();if(e||(e=pe.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+n;return new Promise((s,o)=>{if(!e)return o("No context");const r=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(r),1),s())};e.pre_update_callbacks.push(r)})}const md=C("debugresolveurl"),tb="rel:";function EO(n,e){return mo(n,e)}function mo(n,e){if(e===void 0)return md&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return md&&console.warn("getPath: uri is absolute, returning uri",e),e;if(n===void 0)return md&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(tb)&&(e=e.substring(4));const t=n.lastIndexOf("/");if(t>=0){const s=n.substring(0,t+1);for(;s.endsWith("/")&&e.startsWith("/");)e=e.substring(1);const o=s+e;return md&&console.log("source:",n,`changed uri
4
- from`,e,`
5
- to `,o,`
6
- basePath: `+s),o}return e}class AO{constructor(e,t){a(this,"writeCallbacks",[]),a(this,"_applied",!1),a(this,"_object"),a(this,"_prop"),a(this,"_wrapperProp"),this._object=e,this._prop=t,this._wrapperProp=Symbol("$"+t),this.apply()}subscribeWrite(e){this.writeCallbacks.push(e)}unsubscribeWrite(e){const t=this.writeCallbacks.indexOf(e);t!==-1&&this.writeCallbacks.splice(t,1)}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 s=e[t];e[this._wrapperProp]=s,Object.defineProperty(e,t,{get:()=>e[this._wrapperProp],set:o=>{e[this._wrapperProp]=o;for(const r of this.writeCallbacks)r(o,this._prop)}})}revoke(){if(!this._applied||!this._object)return;this._applied=!1;const e=this._object,t=this._prop;Reflect.deleteProperty(e,t);const s=e[this._wrapperProp];e[t]=s,Reflect.deleteProperty(e,this._wrapperProp)}dispose(){this.revoke(),this.writeCallbacks.length=0,this._object=null}}class oo{constructor(e,t){if(a(this,"_watches",[]),Array.isArray(t))for(const s of t)this._watches.push(new oo(e,s));else this._watches.push(new AO(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 gd(n,e){if(!n[xa])if(n instanceof re)n[xa]=new oo(n,["x","y"]);else if(n instanceof S)n[xa]=new oo(n,["x","y","z"]);else if(n instanceof ye||n instanceof H)n[xa]=new oo(n,["x","y","z","w"]);else return!1;return n[xa].subscribeWrite(e),!0}function Um(n,e){if(!n)return;const t=n[xa];t&&t.unsubscribeWrite(e)}var Y;(n=>{let e;function t(){if(e!==void 0)return e;const U=window.navigator.userAgent,$=/Windows|MacOS|Mac OS/.test(U),te=/Windows NT/.test(U)&&/Edg/.test(U)&&!/Win64/.test(U);return e=$&&!te&&!w()}n.isDesktop=t;let s;function o(){return s!==void 0?s:typeof window.orientation<"u"||navigator.userAgent.indexOf("IEMobile")!==-1?s=!0:s=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent)}n.isMobileDevice=o;function r(){return c()}n.isIPad=r;let l;function c(){return l!==void 0?l:l=/iPad/.test(navigator.userAgent)}n.isiPad=c;let h;function d(){return h!==void 0?h:h=/Android/.test(navigator.userAgent)}n.isAndroidDevice=d;let u;function p(){return u!==void 0?u:u=/WebXRViewer\//i.test(navigator.userAgent)}n.isMozillaXR=p;let g;function f(){if(g!==void 0)return g;if(navigator.userAgentData)return g=navigator.userAgentData.platform==="macOS";{const U=navigator.userAgent.toLowerCase();return g=U.includes("mac os x")||U.includes("macintosh")}}n.isMacOS=f;let y;function v(){return y!==void 0?y:y=f()&&"xr"in navigator}n.isVisionOS=v;let b;const _=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function w(){return b!==void 0?b:b=_.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}n.isiOS=w;let x;function M(){return x!==void 0||(x=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),x}n.isSafari=M;let k;function T(){return k!==void 0?k:k=navigator.userAgent.includes("OculusBrowser")}n.isQuest=T;let L;function B(){return L!==void 0||(L=document.createElement("a").relList.supports("ar")),L}n.supportsQuickLookAR=B;async function z(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(U){return console.error("Error querying `microphone` permissions.",U),!1}}n.microphonePermissionsGranted=z;let j;function V(){if(j!==void 0)return j;const U=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(U&&(j=U[1].replace("_",".")),!j){const $=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);$&&(j=$[1])}return j||(j=null),j}n.getiOSVersion=V;let G;function E(){if(G!==void 0)return G;const U=navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);return U?G=U[1].replace("_","."):G=null,G}n.getChromeVersion=E})(Y||(Y={}));function IO(){return Y.isDesktop()}function LO(){return Y.isMobileDevice()}function jO(){return Y.isiPad()}function DO(){return Y.isiPad()}function BO(){return Y.isAndroidDevice()}function FO(){return Y.isMozillaXR()}function UO(){return Y.isMacOS()}function zO(){return Y.isiOS()}function NO(){return Y.isSafari()}function WO(){return Y.isQuest()}async function VO(){return Y.microphonePermissionsGranted()}const go=new WeakMap;function ib(n,e,t){if(!go.get(n)){const o=new MutationObserver(r=>{HO(n,r)});go.set(n,{observer:o,attributeChangedListeners:new Map}),o.observe(n,{attributes:!0})}const s=go.get(n).attributeChangedListeners;s.has(e)||s.set(e,[]),s.get(e).push(t)}function sb(n,e,t){if(!go.get(n))return;const s=go.get(n).attributeChangedListeners;if(!s.has(e))return;const o=s.get(e),r=o.indexOf(t);if(r!==-1&&(o.splice(r,1),o.length<=0)){s.delete(e);const l=go.get(n);l?.observer.disconnect(),go.delete(n)}}function HO(n,e){const t=go.get(n).attributeChangedListeners;for(const s of e)if(s.type==="attributes"){const o=s.attributeName,r=n.getAttribute(o);if(t.has(o))for(const l of t.get(o))l(r)}}class zm{constructor(e){a(this,"reason"),this.reason=e}}async function Nm(n){const e=await Promise.allSettled(n).catch(o=>[new zm(o.message)]);let t=!1;const s=e.map(o=>"value"in o?o.value:(t=!0,new zm(o.reason)));return{anyFailed:t,results:s}}async function nb(n){var e;if(!globalThis.QRCode){const d="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs@gh-pages/qrcode.min.js";let u=document.head.querySelector(`script[src="${d}"]`);u||(u=document.createElement("script"),u.src=d,document.head.appendChild(u)),await new Promise((p,g)=>{u.addEventListener("load",()=>{p(!0)})})}const t=globalThis.QRCode,s=n.domElement??document.createElement("div"),o=new t(s,{width:n.width??256,height:n.height??256,colorDark:"#000000",colorLight:"#ffffff",correctLevel:n.showLogo?t.CorrectionLevel.H:t.CorrectLevel.M,...n}),r=o?._oQRCode.moduleCount||0,l=(e=o?._oDrawing)==null?void 0:e._elCanvas;let c=.25;r<40?c=Math.floor(r/4)/r:c=Math.floor(r/6)/r;const h=Math.floor(r/20)/r;try{const d=await $O(l,{showLogo:n.showLogo,logoSize:c,logoPadding:h}).catch(u=>{});d&&(s.innerHTML="",s.append(d))}catch{}if(n.showUrl!==!1&&n.text){const d=s.querySelector(".qr-code-link-label");let u=n.text.replace(/^(https?:\/\/)?(www\.)?/,"").replace(/\/+$/,"").replace(/\?+$/,"");if(u="Scan to visit "+u,d)d.textContent=u;else{const p=document.createElement("div");p.classList.add("qr-code-link-label"),n.text=u,p.textContent=n.text,p.addEventListener("click",g=>{g.stopImmediatePropagation()}),p.style.textAlign="center",p.style.fontSize="0.8em",p.style.marginTop="0.1em",p.style.color="#000000",p.style.fontFamily="'Roboto Flex', sans-serif",p.style.opacity="0.5",p.style.wordBreak="break-all",p.style.wordWrap="break-word",p.style.marginBottom="0.3em",s.style.width="calc(210px + 20px)",s.appendChild(p)}}return s}async function $O(n,e){if(!n)return;const t=8,s=20,o=e.logoPadding||1/32,r="transparent",l=0,c=new Image,h=document.querySelector("needle-engine"),d=h?.getAttribute("loading-logo-src")||qv;if(!d)return;let u=!1;e.showLogo!==!1&&(c.src=d,u=await new Promise((w,x)=>{c.onload=()=>w(!0),c.onerror=M=>{console.error("Error loading favicon image for QR code",M),w(!1)}}));const p=document.createElement("canvas");p.width=n.width+t,p.height=n.height+t;const g=p.getContext("2d");if(!g)return;g.fillStyle="#ffffff",g.fillRect(0,0,p.width,p.height),g.drawImage(n,t/2,t/2),g.imageSmoothingEnabled=!0,g.imageSmoothingQuality="high",g.mozImageSmoothingEnabled=!0,g.webkitImageSmoothingEnabled=!0,g.globalCompositeOperation="lighten";const f=g.createLinearGradient(0,0,0,p.height);f.addColorStop(0,"rgb(45, 45, 45)"),f.addColorStop(1,"rgb(45, 45, 45)"),g.fillStyle=f,g.fillRect(0,0,p.width,p.height),g.globalCompositeOperation="source-over";let y=Math.min(n.width,n.height)*(e.logoSize||.25),v=y;if(u){const w=c.width/c.height;w>1?v=y/w:y=v*w;const x=o*n.width,M=Math.max(y,v),k=Math.round(M+x),T=Math.round(M+x),L=(p.width-M)/2,B=(p.height-M)/2;g.shadowColor=r,g.shadowBlur=s;const z=l,j=Math.round(L-x/2),V=Math.round(B-x/2);g.beginPath(),g.moveTo(j+z,V),g.lineTo(j+k-z,V),g.quadraticCurveTo(j+k,V,j+k,V+z),g.lineTo(j+k,V+T-z),g.quadraticCurveTo(j+k,V+T,j+k-z,V+T),g.lineTo(j+z,V+T),g.quadraticCurveTo(j,V+T,j,V+T-z),g.lineTo(j,V+z),g.quadraticCurveTo(j,V,j+z,V),g.fillStyle="#ffffff",g.closePath(),g.fill(),g.clip(),g.shadowColor="transparent";const G=(p.width-y)/2,E=(p.height-v)/2;g.drawImage(c,G,E,y,v)}const b=p.toDataURL("image/png"),_=document.createElement("img");return _.src=b,_.style.width="100%",_.style.height="auto",_}const ob=C("debugdebug");let Gl=!1;(C("noerrors")||C("nooverlaymessages"))&&(Gl=!0);const Wm="needle_engine_global_error_container";var Ci=(n=>(n[n.Log=0]="Log",n[n.Warn=1]="Warn",n[n.Error=2]="Error",n))(Ci||{});function Vm(){return cb}const Hm=new Array;function GO(n){Hm.push(n)}let $m=!1;function qO(...n){if(!$m){$m=!0;try{for(let e=0;e<Hm.length;e++)Hm[e](...n)}catch(e){console.error(e)}$m=!1}}const rb=console.error,ab=function(...n){rb.apply(console,n),YO(n),Ws(2,n),Gm(...n)};function lb(n){Gl=!n,n?console.error=ab:console.error=rb}function XO(n){return lb(n)}function QO(){Gl||(ob&&console.warn("Patch console",window.location.hostname),console.error=ab,window.addEventListener("error",n=>{if(!n)return;const e=n.error;if(e===void 0){$t()&&console.warn("Received unknown error",n,n.target);return}Ws(2,e,n.filename,n.lineno),Gm(n)},!0),window.addEventListener("unhandledrejection",n=>{Gl||n&&(n.reason?Ws(2,n.reason.message,n.reason.stack):Ws(2,"unhandled rejection"),Gm(n))}))}let cb=0;function Gm(...n){cb+=1,qO(...n)}function YO(n){if(Array.isArray(n))for(let e=0;e<n.length;e++){const t=n[e];typeof t=="string"&&t.startsWith("THREE.PropertyBinding: Trying to update node for track:")&&(n[e]="Some animated objects couldn't be found: see console for details")}}function Ws(n,e,t,s){if(Gl)return;const o=pe.Current,r=o?.domElement??document.querySelector("needle-engine");if(r){if(Array.isArray(e)){let l="";for(let c=0;c<e.length;c++){let h=e[c];h instanceof Error&&(h=h.message),typeof h!="object"&&(c>0&&(l+=" "),l+=h)}e=l}!e||e.length<=0||KO(n,r,e)}}const ql=new Map;function KO(n,e,t){if(t==null)return;const s=ek(e);if(s.childElementCount>=20){const c=s.lastElementChild;db(c)}t.length>400&&(t=t.substring(0,400)+"...");const o=t;if(ql.has(o))return;const r=tk(n,t);s.prepend(r);const l=()=>{ql.delete(o),db(r)};ql.set(o,l),setTimeout(l,1e4)}function ZO(){ob&&console.log("Clearing messages");for(const n of ql.values())n?.call(n);ql.clear()}const JO=`
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 ek(n){globalThis[Wm]||(globalThis[Wm]=new Map);const e=globalThis[Wm];if(e.has(n))return e.get(n);{const t=document.createElement("div");e.set(n,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
- `,n.shadowRoot?n.shadowRoot.appendChild(t):n.appendChild(t);const s=document.createElement("style");return s.innerHTML=JO,t.appendChild(s),t}}const hb=Symbol("logtype"),fd=new Map;function db(n){n.remove();const e=n[hb],t=fd.get(e)??[];t.push(n),fd.set(e,t)}function tk(n,e){if(fd.has(n)){const s=fd.get(n);if(s.length>0){const o=s.pop();return o.innerHTML=e,o}}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[hb]=n,n){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 ik{constructor(){a(this,"Rad2Deg",180/Math.PI),a(this,"Deg2Rad",Math.PI/180),a(this,"Epsilon",1e-5)}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,s=1){e.x=this.random(t,s),e.y=this.random(t,s),e.z=this.random(t,s)}clamp(e,t,s){return e<t?t:e>s?s:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,s){return s=s<0?0:s,s=s>1?1:s,e+(t-e)*s}inverseLerp(e,t,s){return(s-e)/(t-e)}remap(e,t,s,o,r){return o+(r-o)*(e-t)/(s-t)}moveTowards(e,t,s){return e+=s,(s<0&&e<t||s>0&&e>t)&&(e=t),e}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,s=Number.EPSILON){for(const o of sk){const r=e[o],l=t[o];if(r===void 0||l===void 0)break;if(Math.abs(r-l)>s)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const sk=["x","y","z","w"],W=new ik;class ub{constructor(e){a(this,"y"),a(this,"s"),a(this,"alpha",0),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 s;return this.y?s=this.alpha*e+(1-this.alpha)*this.s:s=e,this.y=e,this.s=s,s}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class yd{constructor(e,t=1,s=0,o=1){if(a(this,"freq"),a(this,"minCutOff"),a(this,"beta"),a(this,"dCutOff"),a(this,"x"),a(this,"dx"),a(this,"lasttime"),e<=0||t<=0||o<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=s,this.dCutOff=o,this.x=new ub(this.alpha(this.minCutOff)),this.dx=new ub(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 s=this.x.lastValue(),o=s?(e-s)*this.freq:0,r=this.dx.filter(o,this.alpha(this.dCutOff)),l=this.minCutOff+this.beta*Math.abs(r);return this.x.filter(e,this.alpha(l))}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 qm{constructor(e,t=1,s=0,o=1){a(this,"x"),a(this,"y"),a(this,"z"),this.x=new yd(e,t,s,o),this.y=new yd(e,t,s,o),this.z=new yd(e,t,s,o)}filter(e,t,s=null){t.x=this.x.filter(e.x,s),t.y=this.y.filter(e.y,s),t.z=this.z.filter(e.z,s)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const vd="needle:cameraController";function pb(n){return n[vd]}function Xm(n,e,t){t?n[vd]=e:n[vd]===e&&(n[vd]=null)}const Qm="needle:autofit";function mb(n){return n[Qm]===void 0?!0:n[Qm]!==!1}function bd(n,e){n[Qm]=e}function nk(n,e,t){const s=n.length(),o=e.length(),r=W.lerp(s,o,t);return n.lerp(e,t).normalize().multiplyScalar(r)}const Ym=new H,gb=new H().setFromAxisAngle(new S(0,1,0),Math.PI);function ok(n,e){n.lookAt(e),n.quaternion.multiply(gb)}function Xl(n,e,t=!0,s=!1){if(n===e)return;Ym.copy(n.quaternion);const o=ee(e),r=ee(n);if(s){if(Gi(n,Se(e)),t){const l=r.y,c=r.sub(_b(n));c.y=l,n.lookAt(c),n.quaternion.multiply(gb)}Number.isNaN(n.quaternion.x)&&n.quaternion.copy(Ym);return}t&&(o.y=r.y),n.lookAt(o),Number.isNaN(n.quaternion.x)&&n.quaternion.copy(Ym)}function rk(n,e,t,s=1){if(t){const o=Q(0,0,0),r=e.x/window.innerWidth*2-1,l=-(e.y/window.innerHeight)*2+1;o.set(r,l,0),o.unproject(t);const c=t.worldPosition,h=n.worldPosition.distanceTo(c),d=o.sub(c);d.multiplyScalar(s*3.6*h);const u=t.worldPosition.add(d);return n.lookAt(u),u}return null}const ak=new Si(()=>new S,100);function Q(n,e,t){const s=ak.get();return s.set(0,0,0),n instanceof S?s.copy(n):Array.isArray(n)?s.set(n[0],n[1],n[2]):n instanceof DOMPointReadOnly?s.set(n.x,n.y,n.z):typeof n=="number"?(s.x=n,s.y=e!==void 0?e:s.x,s.z=t!==void 0?t:s.x):typeof n=="object"&&(s.x=n.x,s.y=n.y,s.z=n.z),s}const lk=new Si(()=>new ae,30);function fb(n){const e=lk.get();return n?e.copy(n):e.set(0,0,0),e}const ck=new Si(()=>new H,100);function ys(n){const e=ck.get();return e.identity(),n instanceof H?e.copy(n):n instanceof DOMPointReadOnly&&e.set(n.x,n.y,n.z,n.w),e}const Km=new Si(()=>new S,100),yb=Symbol("lastMatrixWorldUpdateKey");function ee(n,e=null,t=!0){const s=e??Km.get();return n?n.parent?(t&&n.updateWorldMatrix(!0,!1),n.matrixWorldNeedsUpdate&&n[yb]!==Date.now()&&(n[yb]=Date.now(),n.updateMatrixWorld()),s.setFromMatrixPosition(n.matrixWorld),s):s.copy(n.position):s.set(0,0,0)}function at(n,e){if(!n)return n;const t=Km.get();return e!==t&&t.copy(e),(n?.parent??n).worldToLocal(t),n.position.set(t.x,t.y,t.z),n}function pr(n,e,t,s){const o=Km.get();return o.set(e,t,s),at(n,o),n}const _d=new Si(()=>new H,100),mr=new H,Zm=new H;function Se(n,e=null){if(!n)return _d.get().identity();const t=e??_d.get();return n.parent?(n.getWorldQuaternion(t),t):t.copy(n.quaternion)}function Gi(n,e){if(!n)return;e!==mr&&mr.copy(e);const t=mr,s=n?.parent;s?.getWorldQuaternion(Zm),Zm.invert();const o=Zm.multiply(t);n.quaternion.set(o.x,o.y,o.z,o.w)}function Jm(n,e,t,s,o){mr.set(e,t,s,o),Gi(n,mr)}const hk=new Si(()=>new S,100),dk=new S;function Ge(n,e=null){return e||(e=hk.get()),n?n.parent?(n.getWorldScale(e),e):e.copy(n.scale):e.set(0,0,0)}function Sa(n,e){if(!n)return;if(!n.parent){n.scale.copy(e);return}const t=dk;n.parent.getWorldScale(t),n.scale.copy(e),n.scale.divide(t)}const uk=new S,vb=new H;function pk(n){return Se(n,vb),uk.set(0,0,1).applyQuaternion(vb)}const mk=new Si(()=>new S,100),bb=new H;function _b(n,e){return e||(e=mk.get().set(0,0,1)),Se(n,bb),e.applyQuaternion(bb)}const wb=new It,xb=new It,gk=new S;function eg(n){const e=_d.get();return n.getWorldQuaternion(e),xb.setFromQuaternion(e),xb}function tg(n,e){const t=_d.get();Gi(n,t.setFromEuler(e))}function wd(n){const e=eg(n),t=gk;return t.set(e.x,e.y,e.z),t.x=W.toDegrees(t.x),t.y=W.toDegrees(t.y),t.z=W.toDegrees(t.z),t}function Sb(n,e){Ql(n,e.x,e.y,e.z,!0)}function Ql(n,e,t,s,o=!0){o&&(e=W.toRadians(e),t=W.toRadians(t),s=W.toRadians(s)),wb.set(e,t,s),mr.setFromEuler(wb),Gi(n,mr)}function xd(n,e=!0){n&&(e?function t(s){console.groupCollapsed((s.name?s.name:"(no name : "+s.type+")")+" %o",s),s.children.forEach(t),console.groupEnd()}(n):n.traverse(function(t){for(var s="|___",o=t;o.parent!==null;)s=" "+s,o=o.parent;console.log(s+t.name+" <"+t.type+">")}))}function fk(n){let e=n?.name||"";if(!n)return e;let t=n.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function Cb(n){if(n){const e=n;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class qi{static createBlitMaterial(e){return new gs({uniforms:{map:new ao(null)},vertexShader:this.vertex,fragmentShader:e})}static copyTexture(e,t){this.blitMaterial||(this.blitMaterial=new gs({uniforms:{map:new ao(null)},vertexShader:this.vertex,fragmentShader:this.fragment}));const s=t||this.blitMaterial;s.uniforms.map.value=e,s.needsUpdate=!0,s.uniformsNeedUpdate=!0;const o=s.vertexShader;s.vertexShader=this.vertex,this.mesh||(this.mesh=new X(this.planeGeometry,this.blitMaterial));const r=this.mesh;r.material=s,r.frustumCulled=!1,this.scene.children.length=0,this.scene.add(r),this.renderer||(this.renderer=new hr({antialias:!1})),this.renderer.setSize(e.image.width,e.image.height),this.renderer.clear(),this.renderer.render(this.scene,this.perspectiveCam);const l=new je(this.renderer.domElement);return l.name="Copy",l.needsUpdate=!0,s.vertexShader=o,l}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=Pb(e));const s=e.image;if(vk(s)){const o=document.createElement("canvas");o.width=s.width,o.height=s.height;const r=o.getContext("2d");return r?(r.drawImage(s,0,0,s.width,s.height,0,0,o.width,o.height),o):(console.error("Failed getting canvas 2d context"),null)}return null}}a(qi,"planeGeometry",new zs(2,2,1,1)),a(qi,"renderer"),a(qi,"perspectiveCam",new we),a(qi,"scene",new bi),a(qi,"vertex",`
58
- varying vec2 vUv;
59
- void main(){
60
- vUv = uv;
61
- gl_Position = vec4(position.xy * 1.0,0.,.999999);
62
- }`),a(qi,"fragment",`
63
- uniform sampler2D map;
64
- varying vec2 vUv;
65
- void main(){
66
- vec2 uv = vUv;
67
- uv.y = 1.0 - uv.y;
68
- gl_FragColor = texture2D( map, uv);
69
- // gl_FragColor = vec4(uv.xy, 0, 1);
70
- }`),a(qi,"blitMaterial"),a(qi,"mesh");function Pb(n){return qi.copyTexture(n)}function yk(n,e=!1){return qi.textureToCanvas(n,e)}function vk(n){return typeof HTMLImageElement<"u"&&n instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&n instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&n instanceof ImageBitmap}function bk(n){const e=n.type;return e==="Mesh"||e==="SkinnedMesh"}function ig(n,e){e?n["needle:rendercustomshadow"]=!0:n["needle:rendercustomshadow"]=!1}function Ob(n){return!!(n&&(n["needle:rendercustomshadow"]===!0||n["needle:rendercustomshadow"]==null))}function ei(n,e=void 0,t=void 0,s=void 0){const o=s||new _i;o.makeEmpty();const r=[];function l(h){let d=!0;if(h.visible&&mb(h)!==!1&&!(h.type==="TransformControlsGizmo"||h.type==="TransformControlsPlane")){if(h instanceof vC&&(d=!1),h instanceof fm&&(d=!1),h instanceof _a&&(d=!1),h.isGizmo===!0&&(d=!1),h.material instanceof fv&&(d=!1),bk(h)||(d=!1),t&&h.layers.test(t)===!1&&(d=!1),d&&(e&&Array.isArray(e)&&e!=null&&e.includes(h)||typeof e=="function"&&e(h)===!0))return;if(h.isUI!==!0){if(d){const u=h.children;h.children=r;const p=h.position,g=h.scale;if(Number.isNaN(p.x)||Number.isNaN(p.y)||Number.isNaN(p.z)){console.warn(`Object "${h.name}" has NaN values in position or scale.... will ignore it`,p,g);return}o.expandByObject(h,!0),h.children=u}for(const u of h.children)l(u)}}}let c=!1;Array.isArray(n)||(n=[n]);for(const h of n)h&&(c=!0,h.updateMatrixWorld(),l(h));return c||console.warn("No objects to fit camera to..."),o}function kb(n,e,t){const s=ei([n],t?.ignore),o=new S;s.getSize(o);const r=new S;s.getCenter(r);const l=new S;e.getSize(l);const c=new S;e.getCenter(c);const h=new S;h.set(l.x/o.x,l.y/o.y,l.z/o.z);const d=Math.min(h.x,h.y,h.z),u=t?.scale!==!1;if(u&&Sa(n,Ge(n).multiplyScalar(d)),t?.position!==!1){const p=new S;s.getCenter(p),p.y=s.min.y;const g=new S;e.getCenter(g),g.y=e.min.y;const f=g.clone().sub(p);u&&f.multiplyScalar(d),at(n,ee(n).add(f))}return{boundsBefore:s,scale:h}}function Mb(n,e){const t=ei([n]),s=new S;t.getCenter(s),s.y=t.min.y;const o=e.clone().sub(s),r=ee(n);return at(n,r.add(o)),{offset:o,bounds:t}}function sg(n,e,t,s){if(Array.isArray(e)){let l=!0;for(let c=0;c<e.length;c++)sg(n,e[c],c,e)||(l=!1);return l}if(e.type==="MeshStandardMaterial"||e.type==="MeshBasicMaterial")return!1;if(e["material:fbx"]!=null)return!0;const o=new ft;o["material:fbx"]=e;const r=e;return r&&(r.map?o.color.set(1,1,1):o.color.copyLinearToSRGB(r.color),o.emissive.copyLinearToSRGB(r.emissive),o.emissiveIntensity=r.emissiveIntensity,o.opacity=r.opacity,o.displacementScale=r.displacementScale,o.transparent=r.transparent,o.bumpMap=r.bumpMap,o.aoMap=r.aoMap,o.map=r.map,o.displacementMap=r.displacementMap,o.emissiveMap=r.emissiveMap,o.normalMap=r.normalMap,o.envMap=r.envMap,o.alphaMap=r.alphaMap,o.metalness=r.reflectivity,o.vertexColors=r.vertexColors,r.shininess&&(o.roughness=1-Math.sqrt(r.shininess)/10),o.needsUpdate=!0),t===void 0?n.material=o:s[t]=o,!0}let Sd=!1;GO((...n)=>{var e;F()&&(e=pe.Current)!=null&&e.isInXR&&(gr(!0),Rb("error",...n))});function gr(n){if(n){if(Sd)return;Sd=!0,wk()}else{if(!Sd)return;Sd=!1,xk()}}const Yl={log:void 0,warn:void 0,error:void 0};class _k{constructor(){a(this,"familyName","needle-xr"),a(this,"root",null),a(this,"context",null),a(this,"defaultFontSize",.06),a(this,"targetObject",new A),a(this,"userForwardViewPoint",new S),a(this,"oneEuroFilter",new qm(90,.8)),a(this,"_lastElementRemoveTime",0),a(this,"onBeforeRender",()=>{var e,t;const s=(e=this.context)==null?void 0:e.mainCamera;if(this.context&&s instanceof we){const o=this.getRoot();Number.isNaN(o.position.x)&&o.position.set(0,0,0),Number.isNaN(o.quaternion.x)&&o.quaternion.set(0,0,0,1),this.context.scene.add(this.targetObject);const r=((t=this.context.xr)==null?void 0:t.rigScale)??1,l=3.5*r,c=s.worldForward;c.y=0,c.normalize().multiplyScalar(l),this.userForwardViewPoint.copy(s.worldPosition).sub(c),this.targetObject.position.distanceTo(this.userForwardViewPoint)>2*r&&(this.targetObject.position.copy(this.userForwardViewPoint),Xl(this.targetObject,s,!0,!0),this.targetObject.rotateY(Math.PI)),this.oneEuroFilter.filter(this.targetObject.position,o.position,this.context.time.time);const h=this.context.time.deltaTime;if(o.quaternion.slerp(this.targetObject.quaternion,h*5),o.scale.setScalar(r),this.targetObject.removeFromParent(),this.context.scene.add(o),this.context.time.time-this._lastElementRemoveTime>.1){this._lastElementRemoveTime=this.context.time.time;const d=Date.now();for(let u=0;u<this._activeTexts.length;u++){const p=this._activeTexts[u];if(p instanceof Re.Text&&d-p._activatedTime>2e4){p.removeFromParent(),this._textBuffer.push(p),this._activeTexts.splice(u,1);break}}}}}),a(this,"textOptions",{fontSize:this.defaultFontSize,fontFamily:this.familyName,padding:.03,margin:.005,color:0,backgroundColor:16777215,backgroundOpacity:.4,borderRadius:.03,offset:.025}),a(this,"_textBuffer",[]),a(this,"_activeTexts",[]),this.ensureFont()}onEnable(){this.context=pe.Current||pe.All[0],this.context.pre_render_callbacks.push(this.onBeforeRender)}onDisable(){var e,t,s;(t=this.context)==null||t.pre_render_callbacks.splice((e=this.context)==null?void 0:e.pre_render_callbacks.indexOf(this.onBeforeRender),1),(s=this.root)==null||s.removeFromParent()}addLog(e,t){const s=this.getRoot(),o=this.getText();let r=16777215,l=0;switch(e){case"log":r=16777215,l=0;break;case"warn":r=16772761,l=4465152;break;case"error":r=16755370,l=7798784;break}t.length>1e3&&(t=t.substring(0,1e3)+"...");const c=new Date().toISOString().split("T")[1].split(".")[0];o.textContent="["+c+"] "+t,o.visible=!0,o._activatedTime=Date.now(),s.add(o),this._activeTexts.push(o),this.context&&this.context.scene.add(s),o.set({backgroundColor:r,color:l}),Re.update()}ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png");t?.addEventListener("ready",()=>{Re.update()})}}getText(){const e=this.getRoot();if(this._textBuffer.length>0){const s=this._textBuffer.pop();return s.visible=!0,setTimeout(()=>this.disableDepthTestRecursive(s),100),s}if(e.children.length>20&&this._activeTexts.length>0)return this._activeTexts.shift();const t=new Re.Text(this.textOptions);return setTimeout(()=>this.disableDepthTestRecursive(t),500),setTimeout(()=>this.disableDepthTestRecursive(t),1500),t}disableDepthTestRecursive(e,t=0){for(let o=0;o<e.children.length;o++){const r=e.children[o];r instanceof A&&this.disableDepthTestRecursive(r,t+1)}e.renderOrder=10*t,e.layers.set(2);const s=e.material;s&&(s.depthWrite=!1,s.depthTest=!1,s.transparent=!0),t===0&&Re.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 Re.Block(t),this.root}}let vs=null;function wk(){vs||(vs=new _k),vs.onEnable();for(const n in Yl){Yl[n]=console[n];let e=!1;console[n]=function(){var t;if((t=Yl[n])==null||t.apply(console,arguments),!e)try{e=!0,Rb(n,...arguments)}finally{e=!1}}}}function xk(){vs?.onDisable();for(const n in Yl)console[n]=Yl[n]}const Kl=new Map;function Rb(n,...e){try{switch(Kl.clear(),n){case"log":vs?.addLog("log",t());break;case"warn":vs?.addLog("warn",t());break;case"error":vs?.addLog("error",t());break}}catch(r){console.error("Error in spatial console",r)}finally{Kl.clear()}function t(){let r="";for(let l=0;l<e.length;l++){const c=e[l];r+=s(c),l<e.length-1&&(r+=", ")}return r}function s(r,l=0){if(typeof r=="string")return'"'+r+'"';if(typeof r=="number"){if(r%1!==0){const c=r.toFixed(5),h=c.indexOf(".");let d=c.length-1;for(;d>h&&c[d]==="0";)d--;return c.substring(0,d+1)}return r.toString()}else if(Array.isArray(r)){let c="[";for(let h=0;h<r.length;h++){const d=r[h];c+=s(d,l+1),h<r.length-1&&(c+=", ")}return c+="]",c}else{if(r===null)return"null";if(r===void 0)return"undefined";if(typeof r=="function")return r.name+"()"}if(r instanceof re)return`(${s(r.x)}, ${s(r.y)})`;if(r instanceof S)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)})`;if(r instanceof ye)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)}, ${s(r.w)})`;if(r instanceof H)return`(${s(r.x)}, ${s(r.y)}, ${s(r.z)}, ${s(r.w)})`;if(r instanceof Pe||r instanceof je)return r.name;if(r instanceof yv)return`[${r.elements.join(", ")}]`;if(r instanceof se)return`[${r.elements.join(", ")}]`;if(r instanceof lo)return r.mask.toString();if(typeof r=="object"){if(Kl.has(r))return"*";let c=`{
71
- `;c+=o(l);const h=Object.keys(r);let d="";for(let u=0;u<h.length;u++){const p=h[u],g=r[p];if(Kl.has(g)){d+="";continue}Kl.set(g,!0),d+=p+":"+s(g,l+1),u<h.length-1&&(d+=", "),d.length>=60&&(d+=`
72
- `,d+=o(l),c+=d,d="")}return c+=d,c+=`
73
- }`,c}return r}function o(r){let l="";for(let c=0;c<r;c++)l+=" ";return l}}const Sk=C("nodevlogs");function De(n,e=Ci.Log){Ws(e,n)}function be(n){De(n,Ci.Warn)}function Zl(n){De(n,Ci.Error)}let ng,og;function F(){if(Sk)return!1;if(ng!==void 0)return ng;if(og!==void 0)return og;let n=$t();return n||(n=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),og=n,n}function Ck(n){ng=n}let ti,Xi=null,Vs=null,Jl=!1,Tb=null;const Eb="terminal",ec=C("console"),Pk=C("noerrors")||C("noconsole")||window.crossOriginIsolated;if(ec&&ag(),!Pk&&(ec||$t())){if($t()&&!ec){const e=new URL(window.location.href);e.searchParams.set("console","1"),console.log('\u{1F335} Tip: You can add the "?console" query parameter to the url to show the debug console (on mobile it will automatically open in the bottom right corner when your get errors during development. In VR a spatial console will appear.)',`
74
- Open this page to get the console: `+e.toString())}const n=Y.isMobileDevice()||Y.isQuest()&&F();if((n||ec)&&(QO(),Ib(),jb(!0),n)){const e=document.querySelector("needle-engine");e?.addEventListener("enter-ar",()=>{(ec||ti||Vm()>0)&&C("noerrors")}),e?.addEventListener("exit-ar",()=>{Rk()})}}const rg=Symbol("consoleParent");function ag(){if(ti){ti.showSwitch();return}jb()}function Ab(){ti&&(ti.hide(),ti.hideSwitch())}function Ib(){Tb||(Tb=setInterval(Ok,500))}let Lb=0;function Ok(){const n=Vm(),e=n!==Lb;Lb=n,e&&kk()}function kk(){ag(),Vs&&(Vs.setAttribute("error","true"),Vs.innerText="\u{1F92C}")}function Mk(){Vs&&(Vs.removeAttribute("error"),Vs.innerText=Eb)}function Rk(){Xi&&Xi[rg]&&Xi[rg].appendChild(Xi)}function jb(n=!1){if(ti!==void 0||Jl)return;Jl=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),Jl=!1,ti=null;return}Jl=!1,Ib(),ti=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&ti.addPlugin(Tk()),Xi=Ak(),Xi&&(Xi[rg]=Xi.parentElement,Xi.style.position="absolute",Xi.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),ti.setSwitchPosition(20,30),Vs=Ek(),Vs){Vs.innerText=Eb,Vs.addEventListener("click",Mk);const s=document.createElement("style"),o=40;s.innerHTML=`
75
- #__vconsole .vc-switch {
76
- border: 1px solid rgba(255, 255, 255, .1);
77
- border-radius: 50%;
78
- width: ${o}px;
79
- height: ${o}px;
80
- padding: 0;
81
- line-height: ${o}px;
82
- font-size: ${o*.4}px;
83
- text-align: center;
84
- background: #ffffff5c;
85
- backdrop-filter: blur(16px);
86
- -webkit-backdrop-filter: blur(16px);
87
- user-select: none;
88
- pointer-events: auto;
89
- transition: transform .2s ease-in-out;
90
- box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
91
-
92
- font-family: 'Material Symbols Outlined';
93
- color: black;
94
- font-size: 2.3em;
95
- font-weight: 100;
96
- }
97
- #__vconsole .vc-switch:hover {
98
- cursor: pointer;
99
- transform: scale(1.1);
100
- transition: transform .1s ease-in-out, background .1s linear;
101
- background: rgba(245, 245, 245, .8);
102
- outline: rgba(0, 0, 0, .05) 1px solid;
103
- }
104
- #__vconsole .vc-switch[error] {
105
- background: rgba(255,0,0,.2);
106
- animation: vconsole-notify 1s ease-in-out;
107
- line-height: 35px;
108
- }
109
- @keyframes vconsole-notify {
110
- from {
111
- transform: scale(1, 1);
112
- }
113
- 10% {
114
- transform: scale(1.3, 1.3);
115
- }
116
- 70% {
117
- transform: scale(1.4, 1.4);
118
- }
119
- to {
120
- transform: scale(1, 1);
121
- }
122
- }
123
- #__vconsole .vc-panel {
124
- font-family: monospace;
125
- font-size: 11px;
126
- }
127
- #__vconsole .vc-plugin-box.vc-actived {
128
- height: 100%;
129
- }
130
- #__vconsole .vc-mask {
131
- overflow: hidden;
132
- }
133
- `,Xi?.prepend(s),n===!0&&Vm()<=0&&Ab(),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.":"")),Jl=!1,ti=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.9.1/dist/vconsole.min.js",document.body.appendChild(e)}function Tk(){if(!globalThis.VConsole)return;const n=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+n._id+" iframe");return n.on("renderTab",function(t){const s=globalThis["needle:codegen_files"];if(!s||s.length===0)return;let o=globalThis["needle:codegen_files"][0];const r=o.indexOf("?");r>-1&&(o=o.substring(0,r));const l=location.protocol+"//"+location.host+location.pathname+"/"+o,c=encodeURIComponent(l);n.fullUrl="https://viewer.needle.tools?inspect&file="+c;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),n.on("show",function(){const t=e();t&&t.src!==n.fullUrl&&(t.src=n.fullUrl)}),n.on("hide",function(){const t=e();t&&(t.src="")}),n.on("addTopBar",function(t){var s=new Array;s.push({name:"Open in new window \u2197",onClick:function(o){window.open(n.fullUrl,"_blank"),ti?.hide()}}),s.push({name:"Reload",onClick:function(o){const r=e();r&&(r.src=n.fullUrl)}}),s.push({name:"Fullscreen",onClick:function(o){const r=e();r.requestFullscreen?r.requestFullscreen():r.webkitRequestFullscreen instanceof Function&&r.webkitRequestFullscreen()}}),t(s)}),n}function Ek(){return document.querySelector("#__vconsole .vc-switch")||null}function Ak(){return document.querySelector("#__vconsole")||null}const Db=C("debugdefines");fo('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),fo('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),fo('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),fo('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),fo('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.6.1";'),fo('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),fo('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Jul 17 2025 14:25:18 GMT+0000 (Coordinated Universal Time)";'),fo('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const bs="4.6.1",Cd="undefined",lg="Thu Jul 17 2025 14:25:18 GMT+0000 (Coordinated Universal Time)";Db&&console.log(`Engine version: ${bs} (generator: ${Cd})
134
- Project built at ${lg}`);const Ca=NEEDLE_PUBLIC_KEY,Mn="needle_isActiveInHierarchy",fr="builtin_components",tc="needle_editor_guid";function fo(n){try{(0,eval)(n)}catch(e){Db&&console.error(e)}}let Bb,Fb=null;function _s(){return Bb}function cg(n){if(n==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}Fb!==n&&(Fb=n,Bb=new n)}const Pi=Symbol("shadowDomOwner"),Ik=C("debugpatch");function Pd(n,e,t,s){const o=Ik===e;if(!t&&!s)return;const r=e+"___needle";jk(n,e,t,s);const l=Object.getOwnPropertyDescriptor(n,e),c=n[e];o&&console.log("Patch",n.constructor.name,e,l,c),l?(o&&console.log("Apply patch with existing descriptor",n.constructor.name,e,l),typeof l.value=="function"&&(n[e]=zb(l.value,n,e))):(o&&console.log("Create patch with new property",n.constructor.name,e,l),Object.defineProperty(n,e,{set:function(h){if(typeof h=="function")this[r]=zb(h,n,e);else{const d=this[r];Nb(n,e,this,d,h),this[r]=h,Wb(n,e,this,d,h)}},get:function(){const h=this[r];return typeof h=="function"&&h[r]?h[r]:h}}))}function Lk(n,e,t){const s=dg(n,e);if(s)for(let o=s.length-1;o>=0;o--){const r=s[o];r.prefix===t&&(r.prefix=null),r.postfix===t&&(r.postfix=null),!r.prefix&&!r.postfix&&s.splice(o,1)}}const Ub=Symbol("Needle:Patches:WrappedFunction");function zb(n,e,t){if(n[Ub])return n;const s=function(...o){Nb(e,t,this,...o);const r=n.apply(this,o);return Wb(e,t,this,r,...o),r};return s[Ub]=!0,s}const Od="Needle:Patches";function hg(){return globalThis[Od]||(globalThis[Od]=new WeakMap),globalThis[Od]}function dg(n,e){const t=hg().get(n);return t?t.get(e):null}function jk(n,e,t,s){let o=hg().get(n);o||(o=new Map,hg().set(n,o));let r=o.get(e);r||(r=[],o.set(e,r)),r.push({prefix:t,postfix:s})}function Nb(n,e,t,...s){var o;if(!t)return;const r=dg(n,e);if(r)for(const l of r)(o=l.prefix)==null||o.call(t,...s)}function Wb(n,e,t,s,...o){var r;if(!t)return;const l=dg(n,e);if(l)for(const c of l)(r=c.postfix)==null||r.call(t,s,...o)}const Pa=[];function kd(n){Pa.indexOf(n)===-1&&Pa.push(n)}function Dk(n){const e=Pa.indexOf(n);e!==-1&&Pa.splice(e,1)}const Oa=[];function ug(n){Oa.indexOf(n)===-1&&Oa.push(n)}function Bk(n){const e=Oa.indexOf(n);e!==-1&&Oa.splice(e,1)}function Vb(n){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:n}));for(let e=0;e<Pa.length;e++)Pa[e](n)}function Hb(n){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:n}));for(let e=0;e<Oa.length;e++)Oa[e](n)}const lt=C("debuginput");var Md=(n=>(n.Mouse="mouse",n.Touch="touch",n.Controller="controller",n.Hand="hand",n))(Md||{}),Be=(n=>(n.PointerDown="pointerdown",n.PointerUp="pointerup",n.PointerMove="pointermove",n.KeyDown="keydown",n.KeyUp="keyup",n.KeyPressed="keypress",n))(Be||{});class Rn extends PointerEvent{constructor(e,t,s){super(e,s),a(this,"clientZ"),a(this,"deviceIndex"),a(this,"origin"),a(this,"source"),a(this,"mode"),a(this,"_ray"),a(this,"space"),a(this,"isClick",!1),a(this,"isDoubleClick",!1),a(this,"_used",!1),a(this,"_pointerid"),a(this,"_pointerType"),a(this,"_type"),a(this,"metadata",{}),a(this,"intersections",new Array),a(this,"_immediatePropagationStopped",!1),a(this,"_propagationStopped",!1),this.clientZ=s.clientZ,this._pointerid=s.pointerId,this._pointerType=s.pointerType,this._type=e,this.deviceIndex=s.deviceIndex,this.origin=s.origin,this.source=t,this.mode=s.mode,this._ray=s.ray,this.space=s.device}get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new co(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}get used(){return this._used}use(){this._used=!0}get pointerId(){return this._pointerid}get pointerType(){return this._pointerType}get type(){return this._type}get immediatePropagationStopped(){return this._immediatePropagationStopped}get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){var e;this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),(e=this.source)==null||e.stopImmediatePropagation()}stopPropagation(){var e;this._propagationStopped=!0,super.stopPropagation(),(e=this.source)==null||e.stopPropagation(),lt&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class ic extends KeyboardEvent{constructor(e,t,s){super(e,s),a(this,"source"),this.source=t}stopImmediatePropagation(){var e;super.stopImmediatePropagation(),(e=this.source)==null||e.stopImmediatePropagation()}}class Fk{constructor(e){a(this,"key"),a(this,"keyType"),a(this,"source"),this.key=e.key,this.keyType=e.type,this.source=e}}var ii=(n=>(n[n.Early=-100]="Early",n[n.Default=0]="Default",n[n.Late=100]="Late",n))(ii||{});class $b{constructor(e){a(this,"_eventListeners",{}),a(this,"_doubleClickTimeThreshold",.2),a(this,"_longPressTimeThreshold",1),a(this,"_setCursorTypes",[]),a(this,"context"),a(this,"_pointerDown",[!1]),a(this,"_pointerUp",[!1]),a(this,"_pointerClick",[!1]),a(this,"_pointerDoubleClick",[!1]),a(this,"_pointerPressed",[!1]),a(this,"_pointerPositions",[new re]),a(this,"_pointerPositionsLastFrame",[new re]),a(this,"_pointerPositionsDelta",[new re]),a(this,"_pointerPositionsRC",[new re]),a(this,"_pointerPositionDown",[new S]),a(this,"_pointerDownTime",[]),a(this,"_pointerUpTime",[]),a(this,"_pointerUpTimestamp",[]),a(this,"_pointerIds",[]),a(this,"_pointerTypes",[""]),a(this,"_mouseWheelChanged",[!1]),a(this,"_mouseWheelDeltaY",[0]),a(this,"_pointerEvent",[]),a(this,"_pointerEventsPressed",[]),a(this,"_pointerSpace",[]),a(this,"_pressedStack",new Map),a(this,"_htmlEventSource"),a(this,"onLostFocus",()=>{for(const t in this.keysPressed)this.keysPressed[t].pressed=!1}),a(this,"_receivedPointerMoveEventsThisFrame",new Array),a(this,"onEndOfFrame",()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let t=0;t<this._pointerUp.length;t++)this._pointerUp[t]=!1;for(let t=0;t<this._pointerDown.length;t++)this._pointerDown[t]=!1;for(let t=0;t<this._pointerClick.length;t++)this._pointerClick[t]=!1;for(let t=0;t<this._pointerDoubleClick.length;t++)this._pointerDoubleClick[t]=!1;for(const t of this._pointerPositionsDelta)t.set(0,0);for(let t=0;t<this._mouseWheelChanged.length;t++)this._mouseWheelChanged[t]=!1;for(let t=0;t<this._mouseWheelDeltaY.length;t++)this._mouseWheelDeltaY[t]=0}),a(this,"onContextMenu",t=>{this.canReceiveInput(t)!==!1&&t instanceof PointerEvent&&t.pointerType}),a(this,"keysPressed",{}),a(this,"onKeyDown",t=>{if(lt&&console.log(`key down ${t.code}, ${this.context.application.hasFocus}`,t),!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(s&&s.pressed)return;this.keysPressed[t.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:t.key,code:t.code};const o=new ic("keydown",t,t);this.onDispatchEvent(o)}),a(this,"onKeyPressed",t=>{if(!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(!s)return;s.pressed=!0,s.frame=this.context.time.frameCount+1;const o=new ic("keypress",t,t);this.onDispatchEvent(o)}),a(this,"onKeyUp",t=>{if(!this.context.application.hasFocus)return;const s=this.keysPressed[t.code];if(!s)return;s.pressed=!1,s.frame=this.context.time.frameCount+1;const o=new ic("keyup",t,t);this.onDispatchEvent(o)}),a(this,"onWheelWindow",t=>{document.pointerLockElement&&this.onMouseWheel(t)}),a(this,"onMouseWheel",t=>{if(this.canReceiveInput(t)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const s=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=s+t.deltaY}),a(this,"onPointerDown",t=>{if(this.context.isInAR||this.canReceiveInput(t)===!1)return;t.target instanceof HTMLElement&&t.target.setPointerCapture(t.pointerId);const s=this.getPointerId(t);lt&&De(`pointer down #${s}, identifier:${t.pointerId}`);const o=this.getAndUpdateSpatialObjectForScreenPosition(s,t.clientX,t.clientY),r=new Rn("pointerdown",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:s,button:t.button,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:o,pressure:t.pressure});this.onDown(r)}),a(this,"onPointerMove",t=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(t.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(t.pointerId);let s=t.button;t.pointerType==="mouse"&&(s=this.getFirstPressedButtonForPointer(0)??0);const o=this.getPointerId(t,s);s===-1&&(s=o);const r=this.getAndUpdateSpatialObjectForScreenPosition(o,t.clientX,t.clientY),l=new Rn("pointermove",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:o,button:s,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:r,pressure:t.pressure});this.onMove(l)}),a(this,"onPointerCancel",t=>{this.context.isInAR||(lt&&console.log("Pointer cancel",t),this.onPointerUp(t))}),a(this,"onPointerUp",t=>{if(this.context.isInAR)return;t.target instanceof HTMLElement&&t.target.releasePointerCapture(t.pointerId);const s=this.getPointerId(t),o=new Rn("pointerup",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:s,button:t.button,clientX:t.clientX,clientY:t.clientY,pointerType:t.pointerType,buttonName:this.getButtonName(t),device:this.getAndUpdateSpatialObjectForScreenPosition(s,t.clientX,t.clientY),pressure:t.pressure});this.onUp(o),this._pointerIds[s]=-1,lt&&console.log("ID="+s,"PointerId="+t.pointerId,"ALL:",[...this._pointerIds])}),a(this,"onTouchStart",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),c=new Rn("pointerdown",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:l,pressure:o.force});this.onDown(c)}}),a(this,"onTouchMove",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),c=new Rn("pointermove",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:l,pressure:o.force});this.onMove(c)}}),a(this,"onTouchEnd",t=>{if(this.context.isInAR)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=this.getPointerIndex(o.identifier),l=new Rn("pointerup",t,{origin:this,mode:"screen",deviceIndex:0,pointerId:r,button:0,clientX:o.clientX,clientY:o.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(r,o.clientX,o.clientY),pressure:o.force});this.onUp(l),this._pointerIds[r]=-1}}),a(this,"tempNearPlaneVector",new S),a(this,"tempFarPlaneVector",new S),a(this,"tempLookMatrix",new se),this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}addEventListener(e,t,s){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}s?s={...s}:s={};let o=0;s?.queue!=null&&(o=s.queue);const r=this._eventListeners[e],l=r.find(c=>c.priority===o);l?l.listeners.push({callback:t,options:s}):(r.push({priority:o,listeners:[{callback:t,options:s}]}),r.sort((c,h)=>c.priority-h.priority))}removeEventListener(e,t,s){if(!this._eventListeners[e]||!t)return;const o=this._eventListeners[e];if(s?.queue!=null){const r=o.find(c=>c.priority===s.queue);if(!r)return;const l=r.listeners.findIndex(c=>c.callback===t);l>=0&&r.listeners.splice(l,1)}else for(const r of o){const l=r.listeners.findIndex(c=>c.callback===t);l>=0&&r.listeners.splice(l,1)}}dispatchEvent(e){var t,s,o,r;let l=!1;if(e instanceof ic){const c=this._eventListeners[e.type];if(c)for(const h of c)for(let d=0;d<h.listeners.length;d++){const u=h.listeners[d];if((s=(t=u.options)==null?void 0:t.signal)!=null&&s.aborted){h.listeners.splice(d,1),d--;continue}u.options.once&&(h.listeners.splice(d,1),d--),u.callback(e)}}if(e instanceof Rn){const c=this._eventListeners[e.type];if(c)for(const h of c){if(l)break;for(let d=0;d<h.listeners.length;d++){const u=h.listeners[d];if((r=(o=u.options)==null?void 0:o.signal)!=null&&r.aborted){h.listeners.splice(d,1),d--;continue}if(e.immediatePropagationStopped){l=!0,lt&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(l=!0,lt&&console.log("propagationStopped",e.type));u.options.once&&(h.listeners.splice(d,1),d--),u.callback(e)}}}}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}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(){var e;((e=this._setCursorTypes)==null?void 0:e.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 s=this._pointerTypes[t];if(Array.isArray(e)){let o=!1;for(const r of e)if(s===r){o=!0;break}if(!o)continue}else if(e!==s)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]}onDownButton(e,t){let s=this._pressedStack.get(e);s||(s=[],this._pressedStack.set(e,s)),s.push(t)}onReleaseButton(e,t){const s=this._pressedStack.get(e);if(!s)return;const o=s.indexOf(t);o>=0&&s.splice(o,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 s=this.keysPressed[t];if(s.startFrame===this.context.time.frameCount)return s.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const s=this.keysPressed[t];if(s.pressed)return s.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const s=this.keysPressed[t];return s.pressed===!1&&s.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 o of t)if(this.isKeyDown(o))return!0;return!1}const s=this.keysPressed[e];return s?s.startFrame===this.context.time.frameCount&&s.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 o of t)if(this.isKeyUp(o))return!0;return!1}const s=this.keysPressed[e];return s?s.frame===this.context.time.frameCount&&s.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 o of t)if(this.isKeyPressed(o))return!0;return!1}const s=this.keysPressed[e];return s&&s.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":lt&&De("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":lt&&De("Create Pointer move"),this.onMove(e);break;case"pointerup":lt&&De("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}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(){var e,t;window.removeEventListener("contextmenu",this.onContextMenu),(e=this._htmlEventSource)==null||e.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),(t=this._htmlEventSource)==null||t.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()}canReceiveInput(e){var t;return e.target===((t=this.context.renderer)==null?void 0:t.domElement)||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&Y.isMozillaXR()?!0:(lt&&console.warn("CanReceiveInput:False for",e.target),!1)}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"}getAndUpdateSpatialObjectForScreenPosition(e,t,s){let o=this._pointerSpace[e];o||(o=new A,this._pointerSpace[e]=o),this._pointerSpace[e]=o;const r=this.context.mainCamera;if(r){const l=this.tempNearPlaneVector.set(t,s,-1);this.convertScreenspaceToRaycastSpace(l);const c=this.tempFarPlaneVector.set(l.x,l.y,1);l.unproject(r),c.unproject(r);const h=r.worldUp||Q(0,1,0).applyQuaternion(Se(r));this.tempLookMatrix.lookAt(c,l,h),o.position.set(l.x,l.y,l.z),o.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return o}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),s=e.clientX,o=e.clientY,r=s>=t.x&&s<=t.right&&o>=t.y&&o<=t.bottom;return lt&&!r&&console.log("Not in rect",t,s,o),r}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,lt?e:""),lt&&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 S);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new re);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,s=this.getPointerPressed(t);s===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!s||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){lt&&console.log(e.pointerType,"UP",t,"was not down");return}lt&&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 c=this._pointerEventsPressed.length-1;c>=0;c--)if(this._pointerEventsPressed[c].pointerId===t){this._pointerEventsPressed.splice(c,1);break}if(!this._pointerPositionDown[t]){lt&&be("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const s=this._pointerUpTime[t],o=this._pointerDownTime[t],r=this.context.time.realtimeSinceStartup,l=r-o;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=r,l<1){let c=e.clientX-this._pointerPositionDown[t].x,h=e.clientY-this._pointerPositionDown[t].y,d=0;if(e.isSpatial&&e.clientZ!=null&&(d=e.clientZ-this._pointerPositionDown[t].z,c*=200,h*=200,d*=200),Math.abs(c)<5&&Math.abs(h)<5&&Math.abs(d)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const u=r-s;lt&&console.log("CLICK",t,c,h,d,u),u<this._doubleClickTimeThreshold&&u>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 re);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new re);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new re);const s=this._pointerPositionsLastFrame[t];s.copy(this._pointerPositions[t]);const o=this._pointerPositionsDelta[t];let r=e.clientX-s.x,l=e.clientY-s.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const u=e.source;r===0&&u.movementX!==0&&(r=u.movementX||0),l===0&&u.movementY!==0&&(l=u.movementY||0)}o.x+=r,o.y+=l,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const c=e.clientX,h=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new re);const d=this._pointerPositionsRC[t];d.set(c,h),this.convertScreenspaceToRaycastSpace(d)}getPointerIndex(e){let t=-1;for(let s=0;s<this._pointerIds.length;s++){if(this._pointerIds[s]===e)return s;t===-1&&this._pointerIds[s]===-1&&(t=s)}return t!==-1?(this._pointerIds[t]=e,t):(lt&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,s){t[e]=s}setPointerStateT(e,t,s){return t[e]=s,s}onDispatchEvent(e){const t=J.Current;try{J.Current=this.context,this.dispatchEvent(e)}finally{J.Current=t}}}const ka=new se().makeRotationY(Math.PI),Qi=new H().setFromAxisAngle(new S(0,1,0),Math.PI),Uk=C("debugwebxr");class zk{constructor(){if(a(this,"priority",-1e5),a(this,"gameObject"),this.gameObject=new A,this.gameObject.name="Implicit XR Rig",Uk){const e=Eg(16733661);e.position.y+=.5,this.gameObject.add(e)}}isXRRig(){return!0}get isActive(){return this.gameObject.visible}}const Tn=C("debugwebxr"),Rd=C("debugcustomgesture"),Nk="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",Wk="generic-trigger",Vk=new H().setFromEuler(new It(_n.degToRad(0),_n.degToRad(-90),_n.degToRad(-90))),Hk=new S(.04,-.04,0);class pg{constructor(e,t,s){a(this,"xr"),a(this,"inputSource"),a(this,"index",0),a(this,"emitEvents",!0),a(this,"_connected",!0),a(this,"_isTracking",!1),a(this,"__gamepad"),a(this,"__hand"),a(this,"__side"),a(this,"_hitTestSource"),a(this,"_hasSelectEvent",!1),a(this,"_isMxInk",!1),a(this,"_isMetaQuestTouchController",!1),a(this,"_handJointPoses",new Map),a(this,"_gripMatrix",new se),a(this,"_gripPosition",new S),a(this,"_gripQuaternion",new H),a(this,"_linearVelocity",new S),a(this,"_rayPositionRaw",new S),a(this,"_rayRotationRaw",new H),a(this,"_rayMatrix",new se),a(this,"_rayPosition",new S),a(this,"_rayQuaternion",new H),a(this,"_gripWorldPosition",new S),a(this,"_gripWorldQuaternion",new H),a(this,"_rayWorldPosition",new S),a(this,"_rayWorldQuaternion",new H),a(this,"_pinchPosition",new S),a(this,"_ray"),a(this,"_hand_wristDotUp"),a(this,"_object"),a(this,"_gripSpaceObject"),a(this,"_raySpaceObject"),a(this,"model",null),a(this,"_debugAxesHelper",new wi(.15)),a(this,"_debugGripAxesHelper",new wi(.07)),a(this,"_debugRayAxesHelper",new wi(.07)),a(this,"_hitTestSourcePromise",null),a(this,"onPointerHits",o=>{}),a(this,"_needleGamepadButtons",{}),a(this,"_buttonMap",new Map),a(this,"_motioncontroller"),a(this,"_layout"),a(this,"getMotionController"),a(this,"emitPointerDownEvent",!0),a(this,"emitPointerUpEvent",!0),a(this,"emitPointerMoveEvent",!0),a(this,"pointerMoveDistanceThreshold",.03),a(this,"pointerMoveAngleThreshold",.05),a(this,"_selectButtonIndex"),a(this,"_squeezeButtonIndex"),a(this,"onSelectStart",o=>{var r,l,c,h;if(!this.emitPointerDownEvent||this.inputSource!==o.inputSource)return;this.onUpdateFrame(o.frame),this._hasSelectEvent=!0;const d=(r=this._layout)==null?void 0:r.selectComponentId,u=(h=(c=(l=this._layout)==null?void 0:l.components[d])==null?void 0:c.gamepadIndices)==null?void 0:h.button;u!==void 0&&(this._selectButtonIndex=u),!Rd&&(Tn&&q.DrawDirection(this.rayWorldPosition,Q(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Be.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,o))}),a(this,"onSelectEnd",o=>{this.emitPointerUpEvent&&(Rd||this.inputSource===o.inputSource&&this.emitPointerEvent(Be.PointerUp,this._selectButtonIndex||0,"xr-standard-trigger",!0,o))}),a(this,"onSequeezeStart",o=>{var r,l,c;this.emitPointerDownEvent&&this.inputSource===o.inputSource&&(this._squeezeButtonIndex=(c=(l=(r=this._layout)==null?void 0:r.components["xr-standard-squeeze"])==null?void 0:l.gamepadIndices)==null?void 0:c.button,this._squeezeButtonIndex!==void 0&&(Tn&&q.DrawDirection(this.rayWorldPosition,Q(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Be.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,o)))}),a(this,"onSequeezeEnd",o=>{this.emitPointerUpEvent&&this.inputSource===o.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Be.PointerUp,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,o)}),a(this,"states",{}),a(this,"_didMoveLastFrame",!1),a(this,"_lastPointerMovePosition",new S),a(this,"_lastPointerMoveQuaternion",new H),a(this,"pointerInit"),this.xr=e,this.inputSource=t,this.index=s,this._object=new A,this._object.name=`NeedleXRController_${s}`,Tn&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new A,this._raySpaceObject=new A,this._gripSpaceObject.name=`NeedleXRController_${s}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${s}_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 co,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()}get context(){return this.xr.context}get connected(){return this._connected}get isTracking(){return this._isTracking}get gamepad(){return this.__gamepad??(this.__gamepad=this.inputSource.gamepad)}get isHand(){return this.hand!=null}get hand(){return this.__hand??(this.__hand=this.inputSource.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.__side=this.inputSource.handedness)}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)}get hasSelectEvent(){return this._hasSelectEvent}getHitTest(){return this.xr.getHitTest(this)}getHandJointPose(e,t){var s;if(t=t||this.xr.frame,!this.hand||!(t!=null&&t.getJointPose)||!this.xr.referenceSpace)return null;let o=(s=this._handJointPoses)==null?void 0:s.get(e);return o||(o=t.getJointPose(e,this.xr.referenceSpace),o&&this._handJointPoses.set(e,o),o)}get gripPosition(){return Q(this._gripPosition)}get gripQuaternion(){return ys(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return Q(this._linearVelocity).applyQuaternion(Qi)}get rayPosition(){return Q(this._rayPosition)}get rayQuaternion(){return ys(this._rayQuaternion)}get gripWorldPosition(){return Q(this._gripWorldPosition)}get gripWorldQuaternion(){return ys(this._gripWorldQuaternion)}get rayWorldPosition(){return Q(this._rayWorldPosition)}updateRayWorldPosition(){var e;const t=(e=this.xr.context.mainCamera)==null?void 0:e.parent;this._rayWorldPosition.copy(this._rayPositionRaw),t&&this._rayWorldPosition.applyMatrix4(t.matrixWorld)}get rayWorldQuaternion(){return ys(this._rayWorldQuaternion)}get pinchPosition(){return Q(this._pinchPosition)}updateRayWorldQuaternion(){var e;const t=(e=this.xr.context.mainCamera)==null?void 0:e.parent,s=t?Se(t):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Qi),s&&this._rayWorldQuaternion.premultiply(s)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(Q(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}get handWristDotUp(){var e;if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const t=(e=this.handObject)==null?void 0:e.joints.wrist;if(t){const s=Q(0,1,0).applyQuaternion(t.quaternion),o=Q(0,1,0).dot(s);return this._hand_wristDotUp=o}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){var e;return this.isHandUpsideDown&&((e=this.getGesture("pinch"))==null?void 0:e.isDown)}get object(){return this._object}async getModelUrl(){var e;return(e=this.getMotionController)==null?void 0:e.then(t=>t?.assetUrl||null)}_requestHitTestSource(){var e;return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=((e=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay}))==null?void 0:e.then(t=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=t:(t.cancel(),null))))??null:null}onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){var e;q.DrawSphere(this.rayWorldPosition,.003),q.DrawDirection(this.rayWorldPosition,Q(0,0,10).applyQuaternion(this.rayWorldQuaternion));const t=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),s=this.inputSource.profiles.join(`
135
- `);let o=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
136
- C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(o+=`
137
- Pinch: ${(e=this.getGesture("pinch"))==null?void 0:e.value.toFixed(3)}`),o+=`
138
- `+s,o+=`
139
- `+(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 r=this.inputSource.gamepad;let l="[btns "+r.buttons.length+"]: "+r.buttons.map(c=>c.value.toPrecision(1)).join(",");l+=`
140
- [axes `+r.axes.length+"]: "+r.axes.map(c=>c.toPrecision(1)).join(","),o+=`
141
- `+l}q.DrawLabel(t,o,.006)}onUpdateFrame(e){var t,s,o,r,l,c,h,d,u,p,g;if(this._handJointPoses.clear(),this._hand_wristDotUp=void 0,!this.xr.referenceSpace){this._isTracking=!1;return}const f=e.getPose(this.inputSource.targetRaySpace,this.xr.referenceSpace);this._isTracking=f!=null;let y=null,v=null,b=null,_=null;if(f){const k=f.transform;this._rayMatrix.fromArray(k.matrix).premultiply(ka),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,Q(1,1,1)),b=Q(k.position),_=ys(k.orientation),this._rayPositionRaw.copy(b),this._rayRotationRaw.copy(_)}if(this.inputSource.gripSpace){const k=e.getPose(this.inputSource.gripSpace,this.xr.referenceSpace);if(k){const T=k.transform;if(y=Q(T.position),v=ys(T.orientation),this._gripMatrix.fromArray(T.matrix).premultiply(ka),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,Q(1,1,1)),"linearVelocity"in k&&k.linearVelocity){const L=k.linearVelocity;this._linearVelocity.set(L.x,L.y,L.z)}}}(t=this.xr.context.mainCamera)!=null&&t.parent&&(this._object.parent!==((s=this.xr.context.mainCamera)==null?void 0:s.parent)&&this.xr.context.mainCamera.parent.add(this._object),this._gripSpaceObject!==void 0&&((o=this._gripSpaceObject)==null?void 0:o.parent)!==((r=this.xr.context.mainCamera)==null?void 0:r.parent)&&this.xr.context.mainCamera.parent.add(this._gripSpaceObject),this._raySpaceObject!==void 0&&((l=this._raySpaceObject)==null?void 0:l.parent)!==((c=this.xr.context.mainCamera)==null?void 0:c.parent)&&this.xr.context.mainCamera.parent.add(this._raySpaceObject));const w=this.hand;if(w){let k=!1;const T=w.get("wrist"),L=T&&this.getHandJointPose(T,e);if(L){k=!0;const j=L.transform.position,V=L.transform.orientation;this._object.position.set(j.x,j.y,j.z),this._object.quaternion.set(V.x,V.y,V.z,V.w).multiply(Qi)}k||(this._object.position.copy(this._rayPosition),this._object.quaternion.copy(this._rayQuaternion).multiply(Qi));const B=w.get("middle-finger-metacarpal"),z=B&&this.getHandJointPose(B,e);z&&(this._gripMatrix.fromArray(z.transform.matrix).premultiply(ka),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,Q(1,1,1)),y=Q().copy(z.transform.position),v=ys().copy(z.transform.orientation),v.multiply(Vk),y.add(Q(Hk).applyQuaternion(v)))}else this.inputSource.gripSpace&&this.targetRayMode==="transient-pointer"&&y&&v?(this._object.position.copy(y),this._object.quaternion.copy(v).multiply(Qi)):b&&_&&(this._object.position.copy(b),this._object.quaternion.copy(_).multiply(Qi));Tn&&(b&&_&&((h=this._raySpaceObject)==null||h.position.copy(b),(d=this._raySpaceObject)==null||d.quaternion.copy(_).multiply(Qi)),y&&v&&((u=this._gripSpaceObject)==null||u.position.copy(y),(p=this._gripSpaceObject)==null||p.quaternion.copy(v).multiply(Qi)));const x=(g=this.xr.context.mainCamera)==null?void 0:g.parent,M=x?Se(x):void 0;y&&v&&(this._gripWorldPosition.copy(y),x&&this._gripWorldPosition.applyMatrix4(x.matrixWorld),this._gripWorldQuaternion.copy(v),this._gripWorldQuaternion.multiply(Qi),M&&this._gripWorldQuaternion.premultiply(M)),this.updateRayWorldPosition(),this.updateRayWorldQuaternion()}onDisconnected(){var e,t,s,o,r,l;this._connected=!1,Tn&&console.warn("Controller disconnected",this.index);for(const c of this._object.children)this.xr.context.scene.attach(c);(e=this._object)==null||e.removeFromParent(),(t=this._debugAxesHelper)==null||t.removeFromParent(),(s=this._debugGripAxesHelper)==null||s.removeFromParent(),(o=this._debugRayAxesHelper)==null||o.removeFromParent(),(r=this._gripSpaceObject)==null||r.removeFromParent(),(l=this._raySpaceObject)==null||l.removeFromParent(),this.unsubscribeEvents(),this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}getButton(e){var t;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)}if(this._buttonMap.has(e))return this.toNeedleGamepadButton(this._buttonMap.get(e),e);const s=(t=this._layout)==null?void 0:t.components[e];if(s!=null&&s.gamepadIndices)switch(s.type){case"button":case"squeeze":if(this.inputSource.gamepad){const o=s.gamepadIndices.button;return this._buttonMap.set(e,o),this.toNeedleGamepadButton(o,e)}break;default:console.warn("Unsupported component type",s.type);break}this._buttonMap.set(e,void 0)}getGesture(e){const t=this.states[e];if(!t)return null;this.states[e]=t;const s=this._needleGamepadButtons[e]||new qb(void 0,e);return s.pressed=t.pressed,s.value=t.value,s.isDown=t.isDown,s.isUp=t.isUp,this._needleGamepadButtons[e]=s,s}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}toNeedleGamepadButton(e,t){var s,o;if(!((s=this.inputSource.gamepad)!=null&&s.buttons))return;const r=(o=this.inputSource.gamepad)==null?void 0:o.buttons[e],l=this.states[e],c=this._needleGamepadButtons[e]||new qb(e,t);return r&&(c.pressed=r.pressed,c.value=r.value,c.touched=r.touched),l&&(c.isDown=l.isDown,c.isUp=l.isUp),this._needleGamepadButtons[e]=c,c}getStick(e){var t,s,o,r,l,c,h,d,u;if(!this._layout)return{x:0,y:0,z:0};if(e==="primary"){const g=((t=this.inputSource.gamepad)==null?void 0:t.axes[0])||0,f=((s=this.inputSource.gamepad)==null?void 0:s.axes[1])||0,y=((r=(o=this.inputSource.gamepad)==null?void 0:o.buttons[3])==null?void 0:r.value)||0;return{x:g,y:f,z:y}}const p=(l=this._layout)==null?void 0:l.components[e];if(p!=null&&p.gamepadIndices)switch(p.type){case"thumbstick":if(this.inputSource.gamepad){const g=p.gamepadIndices.xAxis,f=p.gamepadIndices.yAxis;let y=(c=this.inputSource.gamepad)==null?void 0:c.axes[g],v=(h=this.inputSource.gamepad)==null?void 0:h.axes[f];y*=-1,v*=-1;const b=p.gamepadIndices.button,_=(u=(d=this.inputSource.gamepad)==null?void 0:d.buttons[b])==null?void 0:u.value;return{x:y,y:v,z:_}}}return{x:0,y:0,z:0}}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=oO(this.inputSource,Nk,Wk);this.getMotionController=e.then(t=>{var s;if(!this.connected)return null;this._motioncontroller=new rO(this.inputSource,t.profile,t.assetPath||"");const o=t.profile.layouts[this.inputSource.handedness];if(this._layout=o,this._layout&&!((s=this._layout.gamepad)!=null&&s.length)){this._layout.gamepad=[];for(const r in this._layout.components){const l=this._layout.components[r];this._layout.gamepad[l.gamepadIndices.button]=r}}return this._motioncontroller}).catch(t=>(this.inputSource&&console.warn("Couldn't initialize motion controller profile for ",this.inputSource,t),null))}}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)}updateInputEvents(){var e,t,s;if((e=this.gamepad)!=null&&e.buttons){for(let o=0;o<this.gamepad.buttons.length;o++){const r=this.gamepad.buttons[o],l=this.states[o]||new Gb;let c=null;this._isMxInk&&(o===4||o===5)?(r.value>0&&!l.pressed?(c="pointerdown",l.isDown=!0,l.isUp=!1):r.value===0&&l.pressed?(c="pointerup",l.isDown=!1,l.isUp=!0):l.pressed&&(c="pointermove",l.isDown=!1,l.isUp=!1),l.pressed=r.value>0,l.value=r.value):(r.pressed&&!l.pressed?(c="pointerdown",l.isDown=!0,l.isUp=!1):!r.pressed&&l.pressed?(c="pointerup",l.isDown=!1,l.isUp=!0):(l.isDown=!1,l.isUp=!1),l.pressed=r.pressed,l.value=r.value),this.states[o]=l;const h=o!==this._selectButtonIndex&&o!==this._squeezeButtonIndex;if(c!=null&&h){let d=(t=this._layout)==null?void 0:t.gamepad[o];this._isMxInk&&o===4&&(d="stylus-touch"),this._isMxInk&&o===5&&(d="stylus-tip"),(Tn||Rd)&&console.log("Emitting pointer event",c,o,d,r.value,this.gamepad,this._layout),this.emitPointerEvent(c,o,d??"none",!1,null,r.value)}}if(this._isMetaQuestTouchController){const o=this.gamepad.buttons.length-1,r=this.states[o];if(r&&r.isDown){const l=this.context.menu;l.spatialMenuIsVisible?l.setSpatialMenuVisible(!1):this.context.menu.setSpatialMenuVisible(!0)}}}if(this.hand){const o=this.handObject;if(o){const r=o.joints["index-finger-tip"],l=o.joints["thumb-tip"];if(r&&l){const c=r.position.distanceTo(l.position);this._pinchPosition.lerpVectors(r.position,l.position,.5);const h=(s=this.xr.context.mainCamera)==null?void 0:s.parent;if(h&&this._pinchPosition.applyMatrix4(h.matrixWorld),c!==0){const d=this.states.pinch||new Gb,u=(.02+.01)*1.5;d.value=1-(c-.02)/u;const p=c<.02-.01,g=c>.02+.01;p&&!d.pressed?(Rd&&console.log("pinch start",c),d.isDown=!0,d.isUp=!1,d.pressed=!0):g&&d.pressed?(d.isDown=!1,d.isUp=!0,d.pressed=!1):(d.isDown=!1,d.isUp=!1),this.states.pinch=d}}}}}onUpdateMove(){var e,t;if(!this.emitPointerMoveEvent)return;let s=!1;if(this._lastPointerMovePosition.distanceTo(this.gripWorldPosition)>this.pointerMoveDistanceThreshold*this.xr.rigScale&&(s=!0),s||this._lastPointerMoveQuaternion.angleTo(this.gripWorldQuaternion)>this.pointerMoveAngleThreshold&&(s=!0),s){this._didMoveLastFrame=!0,this._lastPointerMovePosition.copy(this.gripWorldPosition),this._lastPointerMoveQuaternion.copy(this.gripWorldQuaternion),Tn&&q.DrawLabel(this.rayWorldPosition.add(this.object.worldForward.multiplyScalar(.1)),"move",.01);let o=this.xr.context.input.getFirstPressedButtonForPointer(this.index);o===void 0&&(o=0);const r=(t=(e=this.gamepad)==null?void 0:e.buttons[o])==null?void 0:t.value;this.emitPointerEvent("pointermove",o,"none",!1,null,r)}else this._didMoveLastFrame=!1}emitPointerEvent(e,t,s,o,r=null,l){if(!this.emitEvents){Tn&&e!==Be.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=s,this.pointerInit.isPrimary=o,this.pointerInit.mode=this.inputSource.targetRayMode,this.pointerInit.ray=this.ray,this.pointerInit.device=this.object,this.pointerInit.pressure=l,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 c=J.Current;J.Current=this.xr.context,Tn&&e!=="pointermove"&&console.warn("Pointer event",e,t,s,{...this.pointerInit}),this.xr.context.input.createInputEvent(new Rn(e,r,this.pointerInit)),J.Current=c}}}class Gb{constructor(){a(this,"isDown",!1),a(this,"isUp",!1),a(this,"pressed",!1),a(this,"value",0)}}class qb{constructor(e,t){a(this,"index"),a(this,"name"),a(this,"touched",!1),a(this,"pressed",!1),a(this,"value",0),a(this,"isDown",!1),a(this,"isUp",!1),this.index=e,this.name=t}}var mg=(n=>(n.Visible="application-visible",n.Hidden="application-hidden",n.MuteChanged="application-mutechanged",n))(mg||{});let Td=!1;const Ma=[];function yr(){if(Td)return;F()&&console.debug("User interaction registered: audio can now be played"),Td=!0;const n=[...Ma];Ma.length=0,n.forEach(e=>e())}document.addEventListener("mousedown",yr),document.addEventListener("pointerup",yr),document.addEventListener("click",yr),document.addEventListener("dragstart",yr),document.addEventListener("touchend",yr),document.addEventListener("keydown",yr);const gg=class extends EventTarget{constructor(e){super(),a(this,"_mute",!1),a(this,"context"),a(this,"_isVisible",!0),this.context=e,window.addEventListener("visibilitychange",this.onVisiblityChanged.bind(this),!1)}static get userInteractionRegistered(){return Td}static registerWaitForInteraction(e){if(e!==null){if(Td){e();return}Ma.indexOf(e)===-1&&Ma.push(e)}}static unregisterWaitForInteraction(e){const t=Ma.indexOf(e);t!==-1&&Ma.splice(t,1)}get muted(){return this._mute}set muted(e){e!==this._mute&&(this._mute=e,this.dispatchEvent(new Event("application-mutechanged")))}get hasFocus(){return document.hasFocus()}get isVisible(){return this._isVisible}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}}};a(gg,"registerWaitForAllowAudio",gg.registerWaitForInteraction);let En=gg;const Ra=new Map,Ta=new Map;let Xb=0;function An(n,e,t){if(Ra.has(e)||Ra.set(e,new Array),Ra.get(e).push({method:n,options:{once:!1,...t}}),Xb<30){const s=Ta.get(e);s&&s?.length>100&&(Xb+=1,console.warn(`You have ${s.length} methods registered for Event ${e}.
142
-
143
- This might be a performance issue!
144
- Consider unregistering the methods when they are not needed anymore!
145
-
146
- To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
147
-
148
- or by using the once option like onStart(()=>{}, { once:true }).
149
-
150
- See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function yo(n,e){const t=Ta.get(e);if(t){for(let o=0;o<t.length;o++)if(t[o].method===n){t.splice(o,1);return}}const s=Ra.get(e);if(s){for(let o=0;o<s.length;o++)if(s[o].method===n){s.splice(o,1);return}}}function Hs(n,e){e===me.ContextCreated&&fg.delete(n),Qb(n,e)}function Qb(n,e){e===Oe.Start&&Ra.get(me.ContextCreated)&&Qb(n,me.ContextCreated);const t=e===Oe.Start||e===me.ContextCreated,s=Ta.get(e);s&&s.length>0&&Kb(n,s,t);const o=Ra.get(e);if(o&&o.length>0){const r=[...o];o.length=0,Kb(n,r,t),r.length>0&&(Ta.has(e)||Ta.set(e,new Array),Ta.get(e).push(...r))}}const Ed=new Array,Yb={context:null};function Kb(n,e,t){var s,o;Ed.length=0;for(let l=0;l<e.length;l++)Ed.push(e[l]);let r=fg.get(n);for(let l=0;l<Ed.length;l++){const c=Ed[l];let h=!0;if(r&&r.has(c)&&(h=!1),h)try{Yb.context=n,(s=c.method)==null||s.call(Yb,n)}catch(d){console.error("Error in lifecycle method",d)}if((o=c.options)!=null&&o.once){for(let d=0;d<e.length;d++)if(e[d]===c){e.splice(d,1);break}}else t&&(r||(r=new Set,fg.set(n,r)),r.add(c))}}const fg=new WeakMap,yg={};function vg(n,e){yg[n]=e}function Zb(n){const e=n.getBufferIdentifier(),t=yg[e];return t(n)}function Jb(n){return typeof n.guid=="function"?n.guid():null}let bg;function $k(){return bg}function Gk(n){bg=n}function e_(n,e){return e||(e={}),e={...bg,...e},n?new Bv(n,e):new Bv(e)}async function t_(){const n=await import("./vendor-zxXa3Dmr.min.js").then(e=>e.bundler);return console.log(n),n.default===void 0?n:n.default}class i_{constructor(){a(this,"_host"),a(this,"_client"),a(this,"_clientData"),this.onEnable()}get isHost(){return this._host!==void 0}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await t_(),s=new t(e);s.on("error",o=>{console.error(o),this._host=void 0,this.trySetupClient(e)}),s.on("open",o=>{this._host=new Xk(s)})}async trySetupClient(e){const t=await t_();this._client=new t,this._client.on("error",s=>{console.error("Client error",s)}),this._client.on("open",s=>{console.log("client connected",s),this._clientData=this._client.connect(e,{metadata:{id:s}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",o=>{console.log("<<",o)})})}}class qk{constructor(e){a(this,"_peer"),this._peer=e}}class Xk extends qk{constructor(e){var t;super(e),a(this,"_connections",[]),console.log("I AM THE HOST"),(t=this._peer)==null||t.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}get isHost(){return!0}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(s=>{var o;return(o=s.metadata)==null?void 0:o.id}).filter(s=>s!==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 s=this._peer.connections[t];if(s)if(Array.isArray(s))for(const o of s)o&&o.send(e);else console.warn(s)}}}}var ws=(n=>(n[n.OnConnection=0]="OnConnection",n[n.OnRoomJoin=1]="OnRoomJoin",n[n.Queued=2]="Queued",n[n.Immediate=3]="Immediate",n))(ws||{});const s_="https://urls.needle.tools/default-networking-backend/index";let Oi="wss://networking.needle.tools/socket";const si=!!C("debugnet"),sc=!!(si||C("debugowner")),Ad=C("debugnetbin");var n_=(n=>(n.ConnectionInfo="connection-start-info",n))(n_||{}),ie=(n=>(n.Join="join-room",n.Leave="leave-room",n.JoinedRoom="joined-room",n.LeftRoom="left-room",n.UserJoinedRoom="user-joined-room",n.UserLeftRoom="user-left-room",n.RoomStateSent="room-state-sent",n))(ie||{});class Qk{constructor(){a(this,"room"),a(this,"viewId"),a(this,"allowEditing"),a(this,"inRoom")}}class Yk{constructor(){a(this,"room")}}class Kk{constructor(){a(this,"userId")}}var o_=(n=>(n.RequestHasOwner="request-has-owner",n.ResponseHasOwner="response-has-owner",n.RequestIsOwner="request-is-owner",n.ResponseIsOwner="response-is-owner",n.RequestOwnership="request-ownership",n.GainedOwnership="gained-ownership",n.RemoveOwnership="remove-ownership",n.LostOwnership="lost-ownership",n.GainedOwnershipBroadcast="gained-ownership-broadcast",n.LostOwnershipBroadcast="lost-ownership-broadcast",n))(o_||{});class _g{constructor(e,t){a(this,"guid"),a(this,"connection"),a(this,"_hasOwnership",!1),a(this,"_isOwned"),a(this,"_gainSubscription"),a(this,"_lostSubscription"),a(this,"_hasOwnerResponse"),a(this,"_isWaitingForOwnershipResponseCallback",null),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)}get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}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||(sc&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let s=0;const o=()=>{if(s++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):o()},100)};o()})}requestOwnership(){return sc&&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?(sc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(sc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class r_{constructor(e){a(this,"context"),a(this,"_peer",null),a(this,"_usersInRoomCopy",[]),a(this,"_defaultMessagesBuffer",[]),a(this,"_defaultMessagesBufferArray",[]),a(this,"netWebSocketUrlProvider"),a(this,"_listeners",{}),a(this,"_listenersBinary",{}),a(this,"connected",!1),a(this,"channelId"),a(this,"_connectionId",null),a(this,"_ws"),a(this,"_waitingForSocket",{}),a(this,"_isInRoom",!1),a(this,"_currentRoomName",null),a(this,"_currentRoomViewId",null),a(this,"_currentRoomAllowEditing",!0),a(this,"_currentInRoom",[]),a(this,"_state",{}),a(this,"_currentDelay",-1),a(this,"_connectingToWebsocketPromise",null),this.context=e}get peer(){return this._peer||(this._peer=new i_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return si}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(){var e;return((e=this._ws)==null?void 0:e.url)??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}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(),si&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},ws.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,s=ws.Queued){if(t===null&&(t={}),s===ws.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,s)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){var t;Ad&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),(t=this._ws)==null||t.send(e)}sendBufferedMessagesNow(){var e;if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const t=Object.keys(this._defaultMessagesBuffer).length;for(const o in this._defaultMessagesBuffer){const r=this._defaultMessagesBuffer[o];if(t<=1){this.sendWithWebsocket(r.key,r.value,ws.Immediate);break}const l=this.toMessage(r.key,r.value);this._defaultMessagesBufferArray.push(l)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&si&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const s=JSON.stringify(this._defaultMessagesBufferArray);(e=this._ws)==null||e.send(s)}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 s=this._listeners[e].indexOf(t);s>=0&&this._listeners[e].splice(s,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 s=this._listenersBinary[e].indexOf(t);s>=0&&this._listenersBinary[e].splice(s,1)}registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){var t;if(this.connected&&e&&e!==Oi)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 s=e||((t=this.netWebSocketUrlProvider)==null?void 0:t.getWebsocketUrl());return s?Oi=s:Gv()&&(Oi="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){var e;(e=this._ws)==null||e.close(),this._ws=void 0,Oi=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{var s,o;let r=!1;const l=p=>{r||(r=!0,e(p))};if(Oi===void 0&&(console.log("Fetch default backend url: "+s_),Oi=await(await fetch(s_)).text()),Oi===void 0){l(!1);return}console.debug(`\u22A1 Connecting to networking backend on
151
- `+Oi);const c=await import("./vendor-zxXa3Dmr.min.js").then(p=>p.index),h=((s=c.default)==null?void 0:s.WebsocketBuilder)??c.WebsocketBuilder,d=((o=c.default)==null?void 0:o.ExponentialBackoff)??c.ExponentialBackoff,u=new h(Oi).withMaxRetries(10).withBackoff(new d(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=u,this.connected=!0,F()||si?console.log(`\u229E Connected to networking backend
152
- `+Oi):console.debug("\u229E Connected to networking backend",Oi),l(!0),this.onSendQueued(ws.OnConnection)}).onClose(p=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,l(!1);let g="Websocket connection closed...";Oi!=null&&Oi.includes("/socket")||(g+=' Do you perhaps mean to connect to "/socket"?'),console.error(g)}).onError(p=>{console.error("\u22A0 Websocket connection failed..."),l(!1)}).onRetry(()=>{console.log("\u2192 Retry connecting to networking websocket")}).build();u.addEventListener(c.WebsocketEvent.message,(p,g)=>{this.onMessage(p,g)})})}onMessage(e,t){const s=t.data;try{if(typeof s!="string"){s.size&&this.handleIncomingBinaryMessage(s);return}const o=JSON.parse(s);if(Array.isArray(o))for(const r of o)this.handleIncomingStringMessage(r);else this.handleIncomingStringMessage(o);return}catch(o){si&&s==="pong"?console.log("<<",s):F()&&console.error("Failed to parse message",o)}}async handleIncomingBinaryMessage(e){Ad&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var s=new Uint8Array(t);const o=new aO(s),r=o.getBufferIdentifier(),l=this._listenersBinary[r],c=Zb(o),h=Jb(c);if(h&&typeof h=="string"&&(this._state[h]=c),!l)return;const d=c??o;for(const u of l)u(d)}handleIncomingStringMessage(e){var t,s;if(si&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const h=e.data;h&&(console.assert(h.id!==void 0&&h.id!==null&&h.id.length>0,"server did not send connection id",h.id),console.debug("Your id is: "+h.id,this.context.alias??""),this._connectionId=h.id)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(si&&console.log(e),e){this._isInRoom=!0;const h=e;this._currentRoomName=h.room,this._currentRoomViewId=h.viewId,this._currentRoomAllowEditing=h.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...h.inRoom),(Ad||F())&&console.debug("Joined Needle Engine Room: "+h.room);const d=new URL(window.location.href);d.searchParams.has("room")&&d.searchParams.delete("room"),d.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
153
- ${d.href}`)}this.onSendQueued(ws.OnRoomJoin);break;case"left-room":const l=e;l.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(Ad||F())&&console.debug("Left Needle Engine Room: "+l.room));break;case"user-joined-room":if(e.data){const h=e.data;this._currentInRoom.push(h.userId),si&&console.log(h.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const h=e.data,d=this._currentInRoom.indexOf(h.userId);d>=0&&(si&&console.log(h.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(d,1)),h.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":si&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const c=(t=e.data)==null?void 0:t.time;c&&(this._currentDelay=this.context.time.time-c),si&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+((s=this._currentInRoom)==null?void 0:s.length));break}const o=e.data;o&&(this._state[o.guid]=o);let r=this._listeners[e.key];if(r){r=[...r];for(const l of r)try{l(e.data)}catch(c){console.error('Error invoking callback for "'+e.key+'"',c)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,s=ws.OnRoomJoin){if(!this._ws){const r=this._waitingForSocket[s]||[];r.push(()=>this.sendWithWebsocket(e,t,s)),this._waitingForSocket[s]=r;return}const o=JSON.stringify(this.toMessage(e,t));si&&console.log(">>",e),this._ws.send(o)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const s of t)s();t.length=0}}}const nc=C("debugwebxr");class wg{constructor(e,t){a(this,"controllerStates",[]),a(this,"userId"),a(this,"context"),a(this,"userStateEvtName"),a(this,"onReceivedControllerState",s=>{nc&&console.log(`XRSync: Received change for ${this.userId}: ${s.type} ${s.handedness}; tracked=${s.isTracking}`);let o=!1;for(let r=0;r<this.controllerStates.length;r++)if(this.controllerStates[r].index===s.index){this.controllerStates[r]=s,o=!0;break}o||this.controllerStates.push(s)}),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)}update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const s=this.controllerStates[t];let o=!1;for(let r=0;r<e.controllers.length;r++)e.controllers[r].index===s.index&&(o=!0);o||(nc&&console.log(`XRSync: ${s.type} ${s.handedness} removed`,s.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(s))}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(s=>s.index===e.index);if(t){let s=!1;s||(s=t.isTracking!=e.isTracking),s&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const s={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(s),this.context.connection.send(this.userStateEvtName,s),nc&&console.log(`XRSync: ${s.type} ${s.handedness} added`,s.index)}}}class a_{constructor(e){a(this,"context"),a(this,"onJoinedRoom",()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(nc&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new wg(this.context.connection.connectionId,this.context)));for(const t of this.context.connection.usersInRoom())this._states.has(t)||this._states.set(t,new wg(t,this.context))}}),a(this,"onLeftRoom",()=>{if(this.context.connection.connectionId&&!this._states.has(this.context.connection.connectionId)){const t=this._states.get(this.context.connection.connectionId);t?.dispose(),this._states.delete(this.context.connection.connectionId)}}),a(this,"onOtherUserJoinedRoom",t=>{const s=t.userId;this._states.has(s)||(nc&&console.log("XRSync: Remote user joined room",s),this._states.set(s,new wg(s,this.context)))}),a(this,"onOtherUserLeftRoom",t=>{const s=t.userId;if(!this._states.has(s)){const o=this._states.get(s);o?.dispose(),this._states.delete(s)}}),a(this,"_states",new Map),this.context=e,this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const s=this._states.get(e);if(!s)return;const o=s.controllerStates.find(r=>r.handedness===t);return o?.isTracking||!1}getDeviceType(e,t){if(!e)return;const s=this._states.get(e);if(!s)return;const o=s.controllerStates.find(r=>r.handedness===t);return o?.type||"unknown"}destroy(){this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onOtherUserLeftRoom)}onUpdate(e){if(this.context.connection.isConnected&&this.context.connection.connectionId){const t=this._states.get(this.context.connection.connectionId);t?.update(e)}}onExitXR(e){if(this.context.connection.isConnected&&this.context.connection.connectionId){const t=this._states.get(this.context.connection.connectionId);t?.onExitXR(e)}}}class l_{constructor(){a(this,"_fadeToColorQuad"),a(this,"_fadeToColorMaterial"),a(this,"_requestedFadeValue",0),a(this,"_transitionPromise",null),a(this,"_transitionResolve",null),this._fadeToColorMaterial=new Me({color:0,transparent:!0,depthTest:!1,fog:!1,side:xi}),this._fadeToColorQuad=new X(new zs(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const s=this._fadeToColorQuad,o=this._fadeToColorMaterial;s.parent!==e&&o.opacity>0?e.add(s):o.opacity===0&&s.removeFromParent(),s.layers.set(2),s.material=this._fadeToColorMaterial,s.position.z=-1,s.renderOrder=1/0;const r=this._requestedFadeValue;o.opacity=W.lerp(o.opacity,r,t/.03),Math.abs(o.opacity-r)<=.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}}var vr=(n=>(n[n.Quad=0]="Quad",n[n.Cube=1]="Cube",n[n.Sphere=2]="Sphere",n[n.Cylinder=3]="Cylinder",n[n.RoundedCube=10]="RoundedCube",n))(vr||{}),Id,xg;class vo{static createText(e,t){let s=null;const o=t?.font||Jk(t?.familyFamily||null);o instanceof UP?s=sd(this,Id,xg).call(this,e,o,t):s==null&&(s=new Ns);const r=t?.color||16777215,l=new X(s,t?.material??new ft({color:r}));return this.applyDefaultObjectOptions(l,t),o instanceof Promise?o.then(c=>{l.geometry=sd(this,Id,xg).call(this,e,c,t),t!=null&&t.onGeometry&&t.onGeometry(l)}):t!=null&&t.onGeometry&&t.onGeometry(l),l}static createOccluder(e){const t=new Me({colorWrite:!1,depthWrite:!0,side:xi});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let s;const o=t?.color||16777215;switch(e){case"Quad":case 0:{const r=new zs(1,1,1,1),l=t?.material??new ft({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new X(r,l),s.name="Quad"}break;case"Cube":case 1:{const r=new ga(1,1,1),l=t?.material??new ft({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new X(r,l),s.name="Cube"}break;case 10:case"RoundedCube":{const r=Zk(1,1,1,.1,2),l=t?.material??new ft({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new X(r,l),s.name="RoundedCube"}break;case"Sphere":case 2:{const r=new nd(.5,16,16),l=t?.material??new ft({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new X(r,l),s.name="Sphere"}break;case"Cylinder":case 3:{const r=new vv(.5,.5,1,32),l=t?.material??new ft({color:o});t!=null&&t.texture&&"map"in l&&(l.map=t.texture),s=new X(r,l),s.name="Cylinder"}break;case"ShaderBall":s=new ho,s.name="ShaderBall",eM(s,t);break}return this.applyDefaultObjectOptions(s,t),s}static createSprite(e){const t=new bC({color:16777215});e!=null&&e.texture&&"map"in t&&(t.map=e.texture);const s=new _C(t);return this.applyDefaultObjectOptions(s,e),s}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t!=null&&t.name&&(e.name=t.name),t!=null&&t.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x,t.position.y,t.position.z)),t!=null&&t.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x,t.rotation.y,t.rotation.z)),t!=null&&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,t.scale.y,t.scale.z)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t!=null&&t.parent&&t.parent.add(e)}}Id=new WeakSet,xg=function(n,e,t){const s=t?.depth||.1;return new zP(n,{font:e,size:1,depth:s,height:s,bevelEnabled:t?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})},Fs(vo,Id);function Zk(n,e,t,s,o){const r=new wC,l=1e-5,c=s-l;r.absarc(l,l,l,-Math.PI/2,-Math.PI,!0),r.absarc(l,e-c*2,l,Math.PI,Math.PI/2,!0),r.absarc(n-c*2,e-c*2,l,Math.PI/2,0,!0),r.absarc(n-c*2,l,l,0,-Math.PI/2,!0);const h=new xC(r,{bevelEnabled:!0,bevelSegments:o*2,steps:1,bevelSize:c,bevelThickness:s,curveSegments:o});return h.scale(1,1,1-s),h.center(),h.computeVertexNormals(),h}const Ld=new Map;function Jk(n){let e="";switch(n){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(Ld.has(e)){const o=Ld.get(e);if(o)return o}const t=new NP,s=new Promise((o,r)=>{t.load(e,l=>{Ld.set(e,l),o(l)},void 0,r)});return Ld.set(e,s),s}let Sg=!1,Cg=null;function eM(n,e){if(Cg===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",s=new On,o=Rm(null);s.setDRACOLoader(o.dracoLoader),s.setKTX2Loader(o.ktx2Loader),Sg=!0,Cg=s.loadAsync(t).then(r=>{const l=r.scene;return l.position.y-=.5,l}).catch(r=>(console.warn("Failed to load shaderball mesh: "+r.message),h_())).finally(()=>{Sg=!1})}if(Sg){const t=h_();t.name="ShaderBall-Placeholder";const s=t.children[0];s?.type==="Mesh"&&c_(s,e),n.add(t)}Cg.then(t=>{n.children.forEach(r=>{r.name==="ShaderBall-Placeholder"&&n.remove(r)});const s=t.clone(),o=s.children[0];o?.type==="Mesh"&&c_(o,e),n.add(s)})}function c_(n,e){var t;if(e?.color||e?.material||e?.texture){const s=e?.material??((t=n.material)==null?void 0:t.clone())??new ft;e.color&&"color"in s&&s.color instanceof ae&&s.color.set(e.color),e!=null&&e.texture&&"map"in s&&(s.map=e.texture),n.material=s}}function h_(){return new ho().add(vo.createPrimitive("Sphere",{material:new Me({transparent:!0,opacity:.1})}))}const Pg=class tC{constructor(e,t,s){a(this,"_session"),a(this,"_mode"),a(this,"_init"),a(this,"_renderer"),a(this,"_camera"),a(this,"_scene"),a(this,"onEnd",()=>{var o;(o=this._session)==null||o.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()}),a(this,"_lastTime",0),a(this,"onFrame",(o,r)=>{const l=o-this._lastTime;this.update(o,l),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)}),a(this,"_objects",[]),this._mode=e,this._init=t,this._session=s,this._session.addEventListener("end",this.onEnd),this._renderer=new hr({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(s),this._renderer.xr.enabled=!0,this._camera=new we,this._scene=new bi,this._scene.fog=new bv(4473924,10,250),this._scene.add(this._camera),this.setupScene()}static get active(){return this._active}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 s=await navigator.xr.requestSession(e,t);return s.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new tC(e,t,s),this._active):(s.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 fs(100)),this._active=null}get isAR(){return this._mode==="immersive-ar"}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}async onBeforeHandoff(){await fs(1e3),this._scene.clear()}setupScene(){this._scene.background=new ae(0),this._scene.add(new fm(5,10,1118481,1118481));const e=new ym(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new ym(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const s=new vm(16777215,1,100,1);s.position.set(0,2,0),s.castShadow=!1,s.distance=200,this._scene.add(s);const o=50;for(let r=0;r<100;r++){const l=new ft({color:2236962,metalness:1,roughness:.8});this.isAR&&(l.emissive=new ae(Math.random(),Math.random(),Math.random()),l.emissiveIntensity=Math.random());const c=W.random(0,1)>.5?vr.Sphere:vr.Cube,h=vo.createPrimitive(c,{material:l});h.position.x=W.random(-o,o),h.position.y=W.random(-2,o),h.position.z=W.random(-o,o),h.rotation.x=W.random(0,Math.PI*2),h.rotation.y=W.random(0,Math.PI*2),h.rotation.z=W.random(0,Math.PI*2),h.scale.multiplyScalar(.5+Math.random()*10);const d=h.position.distanceTo(this._camera.position)-h.scale.x;d<1&&h.position.multiplyScalar(1+1/d),this._objects.push(h),this._scene.add(h)}}update(e,t){const s=e*4e-4;for(let o=0;o<this._objects.length;o++){const r=this._objects[o];r.position.y+=Math.sin(s+o*.5)*.005,r.rotateY(.002)}}};a(Pg,"_active",null),a(Pg,"_requestInFlight",!1);let jd=Pg;var oc;(n=>{const e=[];function t(){if(!(e!=null&&e.length))return!1;for(const r of e)r.exportAndOpen();return!0}n.exportAndOpen=t;function s(r){e.push(r)}n.registerExporter=s;function o(r){if(!e)return;const l=e.indexOf(r);l>=0&&e.splice(l,1)}n.unregisterExporter=o})(oc||(oc={}));const Je=C("debugwebxr"),d_=C("stats");let Og=0;function tM(n){let e=null;const t=n;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=n,e}iM();async function iM(){var n;if(C("debugasap")){let e=globalThis["needle:XRSession"];if(e instanceof Promise){delete globalThis["needle:XRSession"],pe.addContextCreatedCallback(async t=>{if(!e)return;gr(!0);const s=await e;if(s){const o=ne.getDefaultSessionInit("immersive-vr");ne.setSession("immersive-vr",s,o,t.context)}else console.error("NeedleXRSession: ASAP session was rejected");e=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}(n=navigator.xr)==null||n.addEventListener("sessiongranted",async()=>{gr(!0),console.log("Received Session Granted..."),await fs(100);const e=sessionStorage.getItem("needle_xr_session_mode"),t=sessionStorage.getItem("needle_xr_session_init")??null,s=t?JSON.parse(t):null;let o=null;if(u_()&&(await jd.start(e||"immersive-vr",s||ne.getDefaultSessionInit("immersive-vr")),await oM(),o=await jd.handoff()),o)ne.setSession(o.mode,o.session,o.init,J.Current);else if(e&&t){console.log("Session Granted: Restore last session");const r=JSON.parse(t);ne.start(e,r).catch(l=>console.warn(l))}else ne.start("immersive-vr").catch(r=>console.warn("Session Granted failed:",r))},{once:!0})}}function sM(n,e){sessionStorage.setItem("needle_xr_session_mode",n),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function nM(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const kg=new Set;pe.registerCallback(me.ContextCreationStart,async n=>{kg.add(n.context)}),pe.registerCallback(me.ContextCreated,async n=>{var e;kg.delete(n.context);const t=((e=n.context)==null?void 0:e.domElement.getAttribute("autostart"))||null;rM(t)});function u_(){return kg.size>0}function oM(){return new Promise(n=>{const e=Date.now(),t=setInterval(()=>{(!u_()||Date.now()-e>6e4)&&(clearInterval(t),n())},100)})}Y.isDesktop()&&F()&&window.addEventListener("keydown",n=>{(n.key==="x"||n.key==="Escape")&&ne.active&&ne.stop()});function rM(n){if(n)switch(n?.toLowerCase()){case"ar":En.registerWaitForInteraction(()=>{ne.start("ar")});break}}const ni=class ua{constructor(e,t,s,o){a(this,"context"),a(this,"session"),a(this,"mode"),a(this,"controllers",[]),a(this,"_rigScale",1),a(this,"_lastRigScaleUpdate",-1),a(this,"_rigs",[]),a(this,"_viewerHitTestSource",null),a(this,"_defaultRig"),a(this,"_xr_scripts"),a(this,"_xr_update_scripts",[]),a(this,"_inactive_scripts",[]),a(this,"_controllerAdded"),a(this,"_controllerRemoved"),a(this,"_originalCameraWorldPosition"),a(this,"_originalCameraWorldRotation"),a(this,"_originalCameraWorldScale"),a(this,"_originalCameraParent"),a(this,"_mainCamera",null),a(this,"onRendererSessionSet",()=>{var c;this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),(c=this.context.mainCameraComponent)==null||c.applyClearFlags())}),a(this,"onInputSourceAdded",c=>{if(c.targetRayMode==="screen")return;let h=0;for(let u=0;u<this.session.inputSources.length;u++)if(this.session.inputSources[u]===c){h=u;break}if(this.controllers.find(u=>u.inputSource===c)){console.debug("Controller already exists for input source",h);return}else if(this._newControllers.find(u=>u.inputSource===c)){console.debug("Controller already registered for input source",h);return}const d=new pg(this,c,h);this._newControllers.push(d)}),a(this,"_ended",!1),a(this,"_newControllers",[]),a(this,"onEnd",c=>{var h,d,u;if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),nM(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,yo(this.onBefore,Oe.LateUpdate);const p=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);p>=0&&this.context.pre_render_callbacks.splice(p,1);const g=this.context.post_render_callbacks.indexOf(this.onAfterRender);g>=0&&this.context.post_render_callbacks.splice(g,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{var y,v;(y=this.context.mainCameraComponent)==null||y.applyClearFlags(),(v=this.context.mainCameraComponent)==null||v.applyClippingPlane()}),Hb({session:this});for(const y of ua._xrEndListeners)y({xr:this});const f=[...this.controllers];for(let y=0;y<f.length;y++)this.disconnectInputSource(f[y].inputSource);this._newControllers.length=0,this.controllers.length=0;for(const y of this._xr_scripts)(h=y?.onLeaveXR)==null||h.call(y,{xr:this});(d=this.sync)==null||d.onExitXR(this),this.context.mainCamera&&((u=this._originalCameraParent)==null||u.add(this.context.mainCamera),this._originalCameraWorldPosition&&at(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&Gi(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&Sa(this.context.mainCamera,this._originalCameraWorldScale)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),gr(!1)}),a(this,"_didStart",!1),a(this,"onBefore",c=>{var h,d,u,p,g,f,y,v;const b=c.xrFrame;if(!b)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),((h=this.rig)==null?void 0:h.isActive)==!1&&(Je&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&(d=this._mainCamera)!=null&&d.gameObject&&((p=(u=this._mainCamera)==null?void 0:u.gameObject)==null?void 0:p.parent)!==this.rig.gameObject&&this.rig.gameObject.add((g=this._mainCamera)==null?void 0:g.gameObject),this.internalUpdateState(),this.applyCustomForward();const _={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const w=[...this.context.new_scripts_xr];for(let x=0;x<w.length;x++){const M=this.context.new_scripts_xr[x];if(!M||M.destroyed||((f=M.supportsXR)==null?void 0:f.call(M,this.mode))==!1){this.context.new_scripts_xr.splice(x,1);continue}if(!M.activeAndEnabled){this.context.new_scripts_xr.splice(x,1),this.markInactive(M);continue}if(this.addScript(M)){this.invokeCallback_EnterXR(M);for(const k of this.controllers)this.invokeCallback_ControllerAdded(M,k)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const x=ei(this.context.scene.children);if(x){const M=x.getSize(Q());if(M.length()>0){const k=this._defaultRig.gameObject;k.position.set(x.min.x+M.x*.5,x.min.y,x.max.z+M.z*.5+1.5);const T=x.getCenter(Q());T.y=k.position.y,k.lookAt(T)}}}Vb({session:this}),yr();for(const x of ua._xrStartListeners)x(_);const w=[...this._xr_scripts];Je&&console.log("NeedleXRSession start, handle scripts:",w);for(const x of w){if(x.destroyed){this._script_to_remove.push(x);continue}if(!x.activeAndEnabled){this.markInactive(x);continue}this.invokeCallback_EnterXR(x);for(const M of this.controllers)this.invokeCallback_ControllerAdded(x,M)}}this.syncCameraCullingMask();for(const w of this.controllers)w.onUpdate(b);if(this._newControllers.length>0){const w=[...this._newControllers];this._newControllers.length=0;for(const x of w){if(!x.connected){console.warn("New controller is not connected",x);continue}this.controllers.push(x);for(const M of this._xr_scripts){if(M.destroyed){this._script_to_remove.push(M);continue}M.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(M,x)}}this.controllers.sort((x,M)=>x.index-M.index)}Je&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(gr(!0),console.error("XRControllers are not added but inputSources are present"));for(const w of this._xr_update_scripts){if(w.destroyed===!0){this._script_to_remove.push(w);continue}if(w.activeAndEnabled===!1){this.markInactive(w);continue}w.onUpdateXR&&w.onUpdateXR(_)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const w=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const x of w)!x.destroyed&&this.running&&((y=x.onLeaveXR)==null||y.call(x,_)),this.removeScript(x)}(v=this.sync)==null||v.onUpdate(this),this.onRenderDebug()}),a(this,"onBeforeRender",()=>{this.context.mainCamera&&this.updateFade(this.context.mainCamera)}),a(this,"onAfterRender",()=>{if(this.onUpdateFade_PostRender(),Y.isDesktop()||!this._renderOnceOnDevice){const c=this.context.renderer;if(c.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const h=c.xr.enabled,d=c.getRenderTarget(),u=this.context.scene.background;c.xr.enabled=!1,c.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):c.render(this.context.scene,this.context.mainCamera),c.xr.enabled=h,c.setRenderTarget(d),this.context.scene.background=u}}}),a(this,"_script_to_remove",[]),a(this,"_camera"),a(this,"_cameraRenderParent",new A().rotateY(Math.PI)),a(this,"_previousCameraParent"),a(this,"_customforward",!0),a(this,"originalCameraNearPlane"),a(this,"_viewerPose"),a(this,"_transformOrientation",new H),a(this,"_transformPosition",new S),a(this,"_transition");var r,l;sM(e,o.init),this.session=t,this.mode=e,this.context=s,(Je||C("console"))&&gr(!0),this._xr_scripts=[...o.scripts],this._xr_update_scripts=this._xr_scripts.filter(c=>typeof c.onUpdateXR=="function"),this._controllerAdded=o.controller_added,this._controllerRemoved=o.controller_removed,An(this.onBefore,Oe.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),((r=o.init.optionalFeatures)!=null&&r.includes("hit-test")||(l=o.init.requiredFeatures)!=null&&l.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(c=>{var h,d;return(d=(h=t.requestHitTestSource)==null?void 0:h.call(t,{space:c}))==null?void 0:d.then(u=>this._viewerHitTestSource=u).catch(u=>console.error(u))}).catch(c=>console.error(c)),this.context.mainCamera&&(this._originalCameraWorldPosition=ee(this.context.mainCamera,new S),this._originalCameraWorldRotation=Se(this.context.mainCamera,new H),this._originalCameraWorldScale=Ge(this.context.mainCamera,new S),this._originalCameraParent=this.context.mainCamera.parent),this._defaultRig=new zk,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let c=0;c<t.inputSources.length;c++){const h=t.inputSources[c];if(!h.handedness){console.warn("Input source in xr session has no handedness - ignoring",c);continue}this.onInputSourceAdded(h)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",c=>{for(const h of c.removed)this.disconnectInputSource(h);for(const h of c.added)this.onInputSourceAdded(h)}),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):Je&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}static getXRSync(e){return this._sync||(this._sync=new a_(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static get active(){return this._activeSession}static get activeMode(){var e;return((e=this._activeSession)==null?void 0:e.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){var t;return((t=this.xrSystem)==null?void 0:t.isSessionSupported(e).catch(s=>(Je&&console.error(s),!1)))??Promise.resolve(!1)}static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static offerSession(e,t,s){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(o=>ua.setSession(e,o,t,s)).catch(o=>{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 Y.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const s=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return Y.isVisionOS()||s.push("hand-tracking"),{optionalFeatures:s};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,s){var o,r,l,c;if(Y.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return oc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(F()&&C("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await jd.start(e,t||ua.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Je||F())&&be("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(s||(s=J.Current),s||(s=pe.All[0]),!s)throw new Error("No Needle Engine Context found");switch(t||(t={}),e){case"immersive-ar":{if(await((o=this.xrSystem)==null?void 0:o.isSessionSupported("immersive-ar"))!==!0)return console.error(e+" is not supported by this browser."),null;const u=this.getDefaultSessionInit(e),p=tM(s.domElement);p&&!Y.isQuest()&&(u.domOverlay={root:p},u.optionalFeatures.push("dom-overlay")),t={...u,...t}}break;case"immersive-vr":{if(await((r=this.xrSystem)==null?void 0:r.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.optionalFeatures=[]),t.requiredFeatures??(t.requiredFeatures=[]),await jd.stop();const h=e=="immersive-ar"?s.scripts_immersive_ar:s.scripts_immersive_vr;Je?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,h):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const u of h)u.onBeforeXR&&u.onBeforeXR(e,t);for(const u of this._sessionRequestStartListeners)u({mode:e,init:t});Je&&De("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=(l=navigator.xr)==null?void 0:l.requestSession(e,t),this._currentSessionRequestMode=e;const d=await((c=this._currentSessionRequest)==null?void 0:c.catch(u=>{console.error(u,"Code: "+u.code),u.code===9&&be("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:"&&be("XR requires a secure connection (HTTPS)")}));this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const u of this._sessionRequestEndListeners)u({mode:e,init:t,newSession:d||null});return d?this.setSession(e,d,t,s):(console.warn("XR Session request was rejected"),null)}static setSession(e,t,s,o){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const r=e=="immersive-ar"?o.scripts_immersive_ar:o.scripts_immersive_vr;return this._activeSession=new ua(e,t,o,{scripts:r,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:s}),t.addEventListener("end",this.onEnd),Je?console.log(`%cStarted ${e} session`,"font-weight:bold;",r):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Je&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Je&&console.warn("[NeedleXRSession] XR Session stop already requested"))}get sync(){return ua._sync}get running(){return!this._ended&&this.session!=null}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}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")||F()&&Y.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!=null&&e.gameObject&&Pr(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}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),s=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=s?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){var e;const t=(e=this.context.mainCamera)==null?void 0:e.position;if(!t||!this.rig)return Q(0,0,0);const s=Q(t);return s.x*=-1,s.z*=-1,s.applyQuaternion(ys(this.rig.gameObject.quaternion)),s}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 s=1;s<this._rigs.length;s++){const o=this._rigs[s];if(o.isActive){if(Pr(o.gameObject)){this._rigs.splice(s,1),s--;continue}(!t||t.isActive===!1||o.priority!==void 0&&o.priority>t.priority)&&(t=o)}}if(e!==t){const s=this._rigs.indexOf(t);s>=0&&this._rigs.splice(s,1),this._rigs.unshift(t)}Je&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,s=this.frame.getHitTestResults(t);if(s.length>0){const o=s[0];return this.convertHitTestResult(o)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const s=this.frame.getHitTestResultsForTransientInput(t);for(const o of s)if(o.inputSource===e.inputSource)for(const r of o.results)return this.convertHitTestResult(r);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),s=t&&e.getPose(t);if(s){const o=Q(s.transform.position),r=ys(s.transform.orientation),l=this.context.mainCamera;if(l?.parent!==this._cameraRenderParent&&o.applyMatrix4(ka),l!=null&&l.parent){o.applyMatrix4(l.parent.matrixWorld),r.multiply(Qi);const c=Se(l.parent);c.premultiply(Qi),r.premultiply(c)}return{hit:e,position:o,quaternion:r}}return null}convertSpace(e){const t=Q(e.position);t.applyMatrix4(ka);const s=ys(e.orientation);return s.premultiply(Qi),{position:t,quaternion:s}}disconnectInputSource(e){const t=(s,o,r)=>{if(s.inputSource===e){Je&&console.log("Disconnecting controller",s.index),this.controllers.splice(r,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()}};for(let s=this.controllers.length-1;s>=0;s--){const o=this.controllers[s];t(o,this.controllers,s)}for(let s=this._newControllers.length-1;s>=0;s--){const o=this._newControllers[s];t(o,this._newControllers,s)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}onRenderDebug(){if(Je)for(const e of this.controllers)e.onRenderDebug();if((Je||d_)&&this.rig&&(Og++,Og>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const s=this.rig.gameObject.worldUp;e.add(s.multiplyScalar(2.5));let o="";if(o+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,o+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Je||d_)for(const r of this.controllers)o+=`
154
- ${r.hand?"hand":"ctrl"} ${r.inputSource.handedness}[${r.index}] con:${r.connected} tr:${r.isTracking} hts:${r.hasHitTestSource?"yes":"no"}`;Og=0,q.DrawLabel(e,o,void 0,1/60*20)}}addScript(e){return this._xr_scripts.includes(e)?!1:(Je&&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 s of this.controllers)this.invokeCallback_ControllerAdded(t,s)}}}removeScript(e,t=!0){Je&&console.log("Remove XRScript",e);const s=this._xr_scripts.indexOf(e);s>=0&&this._xr_scripts.splice(s,1);const o=this._xr_update_scripts.indexOf(e);if(o>=0&&this._xr_update_scripts.splice(o,1),t){const r=this._inactive_scripts.indexOf(e);r>=0&&this._inactive_scripts.splice(r,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(){var e;const t=this.context.xrCamera,s=(e=this.context.mainCameraComponent)==null?void 0:e.cullingMask;if(t&&s!==void 0){for(const o of t.cameras)o.layers.mask=s;t.layers.mask=s}else if(t){for(const o of t.cameras)o.layers.enableAll();t.layers.enableAll()}}invokeControllerEvent(e,t,s){for(let o=t.length-1;o>=0;o--){const r=t[o];if(r)try{r({xr:this,controller:e,change:s})}catch(l){console.error(l)}}}applyCustomForward(){var e;if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,(e=this._previousCameraParent)==null||e.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);let t=.02;if(this.rig){const s=Ge(this.rig.gameObject);t*=s.x}this._camera instanceof we&&this._camera.near>t&&(this.originalCameraNearPlane=this._camera.near,this._camera.near=t)}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof we&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane)}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)}}get transition(){return this._transition||(this._transition=new l_),this._transition}fadeTransition(){return this._transition||(this._transition=new l_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof we&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){var e;(e=this._transition)==null||e.remove()}};a(ni,"_sync",null),a(ni,"_currentSessionRequestMode",null),a(ni,"_currentSessionRequest"),a(ni,"_activeSession"),a(ni,"_sessionRequestStartListeners",[]),a(ni,"_sessionRequestEndListeners",[]),a(ni,"_xrStartListeners",[]),a(ni,"_xrEndListeners",[]),a(ni,"_controllerAddedListeners",[]),a(ni,"_controllerRemovedListeners",[]),a(ni,"$_stop_request",Symbol()),a(ni,"onEnd",()=>{Je&&console.log("XR Session ended"),ni._activeSession=null});let ne=ni;const Mg=C("debugwebxr");class p_{static tryFindAvatarObjects(e,t,s){if(s.head&&s.leftHand&&s.rightHand)return;const o=e.name.toLocaleLowerCase();!s.head&&o.includes("head")&&(Mg&&console.log("FOUND AVATAR HEAD",e.name),s.head=new le("",t,e)),o.includes("hand")&&(!s.leftHand&&o.includes("left")&&(Mg&&console.log("FOUND AVATAR LEFT HAND",e.name),s.leftHand=new le("",t,e)),!s.rightHand&&o.includes("right")&&(Mg&&console.log("FOUND AVATAR RIGHT HAND",e.name),s.rightHand=new le("",t,e)));for(let r=0;r<e.children.length;r++){if(s.head&&s.leftHand&&s.rightHand)return;const l=e.children[r];this.tryFindAvatarObjects(l,t,s)}}}const Lt=new S,m_=new S,g_=new H,aM=C("debuggizmos"),xs=8947848,Rg=32,Tg=class Ds{constructor(){}static isGizmo(e){return e[Ag]!==void 0}static setVisible(e){for(const t of Ee.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,s=.05,o=0,r,l,c){var h;if(!Ds.enabled)return null;r||(r=xs);const d=((h=ne.active)==null?void 0:h.rigScale)??1,u=Ee.getTextLabel(o,t,s*d,r,l);return c instanceof A&&c.add(u),u.position.x=e.x,u.position.y=e.y,u.position.z=e.z,u}static DrawRay(e,t,s=xs,o=0,r=!0){if(!Ds.enabled)return;const l=Ee.getLine(o),c=l.geometry.getAttribute("position");c.setXYZ(0,e.x,e.y,e.z),Lt.set(t.x,t.y,t.z).multiplyScalar(999999999),c.setXYZ(1,e.x+Lt.x,e.y+Lt.y,e.z+Lt.z),c.needsUpdate=!0,l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1}static DrawDirection(e,t,s=xs,o=0,r=!0,l=1){if(!Ds.enabled)return;const c=Ee.getLine(o),h=c.geometry.getAttribute("position");h.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(Lt.set(0,0,-l),g_.set(t.x,t.y,t.z,t.w),Lt.applyQuaternion(g_)):(Lt.set(t.x,t.y,t.z),Lt.multiplyScalar(l)),h.setXYZ(1,e.x+Lt.x,e.y+Lt.y,e.z+Lt.z),h.needsUpdate=!0,c.material.color.set(s),c.material.depthTest=r,c.material.depthWrite=!1}static DrawLine(e,t,s=xs,o=0,r=!0){if(!Ds.enabled)return;const l=Ee.getLine(o),c=l.geometry.getAttribute("position");c.setXYZ(0,e.x,e.y,e.z),c.setXYZ(1,t.x,t.y,t.z),c.needsUpdate=!0,l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1,l.material.fog=!1}static DrawCircle(e,t,s,o=xs,r=0,l=!0){if(!Ds.enabled)return;const c=Ee.getCircle(r);c.position.set(e.x,e.y,e.z),c.scale.set(s,s,s),c.quaternion.setFromUnitVectors(this._up,Lt.set(t.x,t.y,t.z).normalize()),c.material.color.set(o),c.material.depthTest=l,c.material.depthWrite=!1,c.material.fog=!1}static DrawWireSphere(e,t,s=xs,o=0,r=!0){if(!Ds.enabled)return;const l=Ee.getSphere(t,o,!0);pr(l,e.x,e.y,e.z),l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1,l.material.fog=!1}static DrawSphere(e,t,s=xs,o=0,r=!0){if(!Ds.enabled)return;const l=Ee.getSphere(t,o,!1);pr(l,e.x,e.y,e.z),l.material.color.set(s),l.material.depthTest=r,l.material.depthWrite=!1}static DrawWireBox(e,t,s=xs,o=0,r=!0){if(!Ds.enabled)return;const l=Ee.getBox(o);l.position.set(e.x,e.y,e.z),l.scale.set(t.x,t.y,t.z),l.material.color.set(s),l.material.depthTest=r,l.material.wireframe=!0,l.material.depthWrite=!1,l.material.fog=!1}static DrawWireBox3(e,t=xs,s=0,o=!0){if(!Ds.enabled)return;const r=Ee.getBox(s);r.position.copy(e.getCenter(Lt)),r.scale.copy(e.getSize(Lt)),r.material.color.set(t),r.material.depthTest=o,r.material.wireframe=!0,r.material.depthWrite=!1,r.material.fog=!1}static DrawArrow(e,t,s=xs,o=0,r=!0,l=!1){if(!Ds.enabled)return;const c=Ee.getArrowHead(o);c.position.set(t.x,t.y,t.z),c.quaternion.setFromUnitVectors(this._up.set(0,1,0),Lt.set(t.x,t.y,t.z).sub(m_.set(e.x,e.y,e.z)).normalize());const h=Lt.set(t.x,t.y,t.z).sub(m_.set(e.x,e.y,e.z)).length()*.1;c.scale.set(h,h,h),c.material.color.set(s),c.material.depthTest=r,c.material.wireframe=l,this.DrawLine(e,t,s,o,r)}static DrawWireMesh(e){const t=Ee.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??xs),t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0}};a(Tg,"enabled",!0),a(Tg,"_up",new S(0,1,0));let q=Tg;const lM=new ga(1,1,1);function Eg(n=null){const e=new ae(n??14540253),t=new SC(lM);return new _v(t,new wv({color:e}))}const Ag=Symbol("GizmoCache");class Ee{static ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png");t?.addEventListener("ready",()=>{Re.update()})}}static getTextLabel(e,t,s,o,r){this.ensureFont();let l=this.textLabelCache.pop(),c=1;r&&typeof r=="string"&&r?.length>=8&&r.startsWith("#")?(c=parseInt(r.substring(7),16)/255,r=r.substring(0,7),aM&&console.log(r,c)):typeof r=="object"&&r.a!==void 0&&(c=r.a);const h={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:s,color:o,lineHeight:1,backgroundColor:r??void 0,backgroundOpacity:c,textContent:t,borderRadius:.5*s,padding:.8*s,whiteSpace:"pre",offset:.05*s};if(l)l.set(h);else{l=new Wv(h);const d=this,u=l;u.setText=function(p){this.set({textContent:p}),d.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(J.Current,l,e,this.textLabelCache),l}static getBox(e){let t=this.boxesCache.pop();if(!t){const s=new ga(1,1,1);t=new X(s)}return this.registerTimedObject(J.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new zl;let s=t.geometry.getAttribute("position");s||(s=new yt(new Float32Array(2*3),3),t.geometry.setAttribute("position",s))}return t.frustumCulled=!1,this.registerTimedObject(J.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new zl;let s=t.geometry.getAttribute("position");if(!s){s=new yt(new Float32Array(Rg*3),3),t.geometry.setAttribute("position",s);const o=Q(0,1,0),r=Q(0,0,1),l=Q(r);l.cross(o).normalize();const c=Q(l),h=Math.PI*2/(Rg-1);for(let d=0;d<Rg+1;d++){const u=h*d;o.copy(c).multiplyScalar(Math.cos(u)*1),l.copy(r).multiplyScalar(Math.sin(u)*1);const p=o.add(l);s.setXYZ(d,p.x,p.y,p.z)}}}return t.frustumCulled=!1,this.registerTimedObject(J.Current,t,e,this.circlesCache),t}static getSphere(e,t,s){let o=this.spheresCache.pop();return o||(o=new X(new nd(1,8,8))),o.scale.set(e,e,e),o.material.wireframe=s,this.registerTimedObject(J.Current,o,t,this.spheresCache),o}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new X(new vv(0,.5,1,8))),this.registerTimedObject(J.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new X,t.material=new Me),this.registerTimedObject(J.Current,t,e,this.mesh),t}static registerTimedObject(e,t,s,o){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const r=this.contextBeforeRenderCallbacks.get(e),l=this.contextPostRenderCallbacks.get(e);if(r){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==r){const c=e.pre_render_callbacks.indexOf(r);c>=0&&e.pre_render_callbacks.splice(c,1),e.pre_render_callbacks.push(r)}}else{const c=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,c),e.pre_render_callbacks.push(c)}if(l){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==l){const c=e.post_render_callbacks.indexOf(l);c>=0&&e.post_render_callbacks.splice(c,1),e.post_render_callbacks.push(l)}}else{const c=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,c),e.post_render_callbacks.push(c)}t.traverse(c=>{c.layers.disableAll(),c.layers.enable(2)}),t.renderOrder=999999,t[Ag]=o,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(J.Current.time.realtimeSinceStartup+s),e.scene.add(t)}static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Re.update());for(let s=0;s<t.length;s++){const o=t[s];if(e.mainCamera&&o instanceof Re.MeshUIBaseElement){if(Pr(o))continue;const r=e.isInVR,l=!1,c=!r;Xl(o,e.mainCamera,l,c)}}}static onPostRender(e,t,s){const o=e.time.realtimeSinceStartup;for(let r=t.length-1;r>=0;r--){const l=t[r];o>=s[r]-1e-6&&(t.splice(r,1),s.splice(r,1),l.removeFromParent(),Pr(l)!=!0&&l[Ag].push(l))}}}a(Ee,"familyName","needle-gizmos"),a(Ee,"linesCache",[]),a(Ee,"circlesCache",[]),a(Ee,"spheresCache",[]),a(Ee,"boxesCache",[]),a(Ee,"arrowHeadsCache",[]),a(Ee,"mesh",[]),a(Ee,"textLabelCache",[]),a(Ee,"timedObjectsBuffer",new Array),a(Ee,"timesBuffer",new Array),a(Ee,"contextPostRenderCallbacks",new Map),a(Ee,"contextBeforeRenderCallbacks",new Map),a(Ee,"tmuiNeedsUpdate",!1);const ki=C("debugphysics"),f_=new lo;class $s{constructor(){a(this,"ray"),a(this,"cam"),a(this,"screenPoint"),a(this,"raycaster"),a(this,"results"),a(this,"targets"),a(this,"recursive",!0),a(this,"minDistance"),a(this,"maxDistance"),a(this,"lineThreshold"),a(this,"layerMask"),a(this,"ignore"),a(this,"testObject"),a(this,"useAcceleratedRaycast")}screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new re),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){f_.set(e),this.layerMask=f_}setMask(e){this.layerMask||(this.layerMask=new lo);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}a($s,"AllLayers",4294967295);class Ig{constructor(e,t,s){a(this,"distance"),a(this,"point"),a(this,"object"),this.object=e,this.distance=t,this.point=s}}const y_=class rv{constructor(e){a(this,"context"),a(this,"engine"),a(this,"raycaster",new od),a(this,"defaultRaycastOptions",new $s),a(this,"targetBuffer",new Array(1)),a(this,"defaultThresholds",{Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}}),a(this,"sphereResults",new Array),a(this,"sphereMask",new lo),a(this,"sphere",new rd),a(this,"tempBoundingBox",new _i),this.context=e}static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,s=1/0,o=!0){var r;return((r=this.context.physics.engine)==null?void 0:r.raycast(e,t,{maxDistance:s,solid:o}))??null}raycastPhysicsFastAndGetNormal(e,t=void 0,s=1/0,o=!0){var r;return((r=this.context.physics.engine)==null?void 0:r.raycastAndGetNormal(e,t,{maxDistance:s,solid:o}))??null}sphereOverlapPhysics(e,t){var s;return((s=this.context.physics.engine)==null?void 0:s.sphereOverlap(e,t))??null}sphereOverlap(e,t,s=!0,o=!1,r=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const l=this.sphereMask;l.enableAll(),l.disable(2);for(const c of this.context.scene.children)this.intersectSphere(c,e,t,l,this.sphereResults,s,o,r);return this.sphereResults.sort((c,h)=>c.distance-h.distance)}raycastFromRay(e,t=null){const s=t??this.defaultRaycastOptions;s.ray=e;const o=this.raycast(s);return s===this.defaultRaycastOptions&&(s.ray=void 0),o}raycast(e=null){ki&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,s=e.raycaster??this.raycaster;if(s.near=e.minDistance??0,s.far=e.maxDistance??1/0,s.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),s.params.Line={threshold:e.lineThreshold},e.ray)s.ray.copy(e.ray);else{const c=e.cam??this.context.mainCamera;if(!c)return ki&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const h=this.context.xrCamera;this.context.isInXR&&h instanceof CC&&h.cameras.length>0?s.setFromCamera(t,h.cameras[0]):s.setFromCamera(t,c)}let o=e.targets;o||(o=this.targetBuffer,o.length=1,o[0]=this.context.scene);let r=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),r||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),r=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof lo?s.layers.mask=e.layerMask.mask:s.layers.mask=e.layerMask:(s.layers.enableAll(),s.layers.disable(2)),ki&&console.time("raycast"),r.length=0,rv._raycasting++,this.intersect(this.raycaster,o,r,e),r.sort((c,h)=>c.distance-h.distance);const l=e.ignore;return l!==void 0&&l.length>0&&(r=r.filter(c=>!l.includes(c.object))),rv._raycasting--,ki&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",r!=null&&r.length?[...r]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),r}intersect(e,t,s,o){var r,l,c;for(const h of t){if(!h||h.visible===!1||q.isGizmo(h)||o.lineThreshold!==void 0&&o.lineThreshold<0&&h instanceof zl)continue;let d=!0;const u=h,p=u.geometry;if(o.testObject){const g=(r=o.testObject)==null?void 0:r.call(o,h);if(g===!1)continue;g==="continue in children"&&(d=!1)}if(d&&(p&&v_(p)||(d=!1)),d){const g=Ev(h);g&&(u.geometry=g);const f=s.length;let y=!0;if(o.precise===!1&&(y=!1),y||(y=((c=(l=p.getAttribute("position"))==null?void 0:l.array)==null?void 0:c.length)<64),u instanceof _a&&(y=!1),!y&&hM(u,e,s)||(o.useAcceleratedRaycast!==!1?Bd.runMeshBVHRaycast(e,u,s,this.context):e.intersectObject(u,!1,s)),ki&&s.length!=f){const v=s[s.length-1],b=g?8969557:7798784;q.DrawWireSphere(v.point,.1,b,1,!1),q.DrawWireMesh({mesh:h,depthTest:!1,duration:.2,color:b})}u.geometry=p}o.recursive!==!1&&this.intersect(e,h.children,s,o)}return s}intersectSphere(e,t,s,o,r,l,c,h){let d=e&&e.isMesh&&e.layers.test(o)&&!q.isGizmo(e);d&&(d=e.visible),d&&(d=!(e instanceof zl)),d&&(d=!(e instanceof _a));const u=e,p=u.geometry;if(d&&h){const g=h(e);if(g===!1)return;g==="continue in children"&&(d=!1)}if(p&&v_(p)||(d=!1),d){if(c){const g=this.sphere;g.center.copy(t),g.radius=s;const f=r.length;if(Bd.runMeshBVHRaycast(this.sphere,u,r,this.context),f!=r.length&&!l)return}else if(p.boundingBox||p.computeBoundingBox(),p.boundingBox){u.matrixWorldNeedsUpdate&&u.updateWorldMatrix(!1,!1);const g=this.tempBoundingBox.copy(p.boundingBox).applyMatrix4(u.matrixWorld),f=this.sphere;if(f.center.copy(t),f.radius=s,f.intersectsBox(g)){const y=ee(e),v=y.distanceTo(f.center),b=new Ig(e,v,y);if(r.push(b),!l)return}}}if(e.children)for(const g of e.children){const f=r.length;if(this.intersectSphere(g,t,s,o,r,l,c,h),f!=r.length&&!l)return}}};a(y_,"_raycasting",0);let Lg=y_;function v_(n){return!(n.index&&n.index.array.length<3)}const br=new rd,Dd=new dr,cM=new yv;function hM(n,e,t){const s=n._computeIntersections;if(!s)return!1;let o=n["_computeIntersections:Needle"];return o||(o=n["_computeIntersections:Needle"]=function(r,l,c){const h=this,d=h.geometry.boundingSphere;if(d){if(h instanceof _a){Dd.setFromNormalAndCoplanarPoint(Q(0,1,0),Q(0,-h.position.y,0)),Dd.applyMatrix4(h.matrixWorld,cM);const p=r.ray.intersectPlane(Dd,Q());if(p){br.copy(d),br.applyMatrix4(h.matrixWorld);const g=Q(p).sub(r.ray.origin).length(),f=br.radius*.5;g<f&&l.push({distance:g,point:p,object:h,normal:Dd.normal.clone()})}return}br.copy(d),br.applyMatrix4(h.matrixWorld);const u=r.ray.intersectSphere(br,Q());if(u){const p=Q(u).sub(r.ray.origin),g=p.length();if(g>br.radius){const f=p.clone().normalize();l.push({distance:g,point:u,object:h,normal:f})}}}}),n._computeIntersections=o,e.intersectObject(n,!1,t),n._computeIntersections=s,!0}var Bd;(n=>{function e(_,w,x,M){var k,T,L;if(!w.geometry||!w.geometry.hasAttribute("position"))return!1;const B=w.geometry;if(w!=null&&w.isSkinnedMesh){const z=w,j=z.bvhNeedsUpdate;if(!z.staticGenerator)c(),r&&(z.staticGenerator=new r(w),z.staticGenerator.applyWorldTransforms=!1,z.staticGeometry=z.staticGenerator.generate(),B.boundsTree=l?.call(z.staticGeometry),z.staticGeometryLastUpdate=performance.now()+Math.random()*200,z.autoUpdateMeshBVH===void 0&&(z.autoUpdateMeshBVH=!1));else if(B.boundsTree&&(z.autoUpdateMeshBVH===!0||j===!0)){const V=performance.now(),G=V-z.staticGeometryLastUpdate;(j||G>100)&&(z.bvhNeedsUpdate=!1,z.staticGeometryLastUpdate=V,(k=z.staticGenerator)==null||k.generate(z.staticGeometry),B.boundsTree.refit())}}else if(!B.boundsTree){d||b();let z=!0;if((M.xr||B[f]===!1||(T=B.getAttribute("position"))!=null&&T.isInterleavedBufferAttribute||B.index&&(L=B.index)!=null&&L.isInterleavedBufferAttribute)&&(z=!1),z&&p){if(B[g]===void 0){let j=null;if(v.length>0){const V=v.shift();V&&!V.running&&(j=V)}if(!j&&y.length<3&&(j=new p,y.push(j)),j!=null&&!j.running){const V=w.name;ki&&console.log("<<<< worker start",V,j),B[g]="queued",performance.mark("bvh.create.start");const G=B.clone();try{j.generate(G).then(E=>{B[g]="done",B.boundsTree=E}).catch(E=>{B[g]="failed - "+E?.message,B[f]=!1,ki&&console.error("Failed to generate mesh bvh on worker",E)}).finally(()=>{ki&&console.log(">>>>> worker done",V,{hasBoundsTre:B.boundsTree!=null}),v.push(j),G.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(E){console.error("Failed to generate mesh bvh on worker",E)}}else ki&&console.warn("No worker available")}}else(!u||!z)&&(c(),o&&(performance.mark("bvh.create.start"),B.boundsTree=new o(B),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(_ instanceof od){const z=_,j=w.raycast;B.boundsTree?(c(),s&&(w.acceleratedRaycast||(w.acceleratedRaycast=s.bind(w),ki&&console.debug(`Physics: bind acceleratedRaycast fn to "${w.name}"`)),w.raycast=w.acceleratedRaycast)):ki&&console.warn("No bounds tree found for mesh",w.name,{workerTask:B[g],hasAcceleratedRaycast:s!=null});const V=z.firstHitOnly;return z.firstHitOnly=!1,z.intersectObject(w,!1,x),z.firstHitOnly=V,w.raycast=j,!0}else if(_ instanceof rd){const z=B.boundsTree;if(z){const j=_;if(h.copy(w.matrixWorld).invert(),j.applyMatrix4(h),z.intersectsSphere(j)){const V=ee(w),G=V.distanceTo(j.center),E=new Ig(w,G,V);x.push(E)}}return!0}return!1}n.runMeshBVHRaycast=e;let t=!1,s=null,o=null,r=null,l=null;function c(){t||(t=!0,import("./vendor-zxXa3Dmr.min.js").then(_=>_.index$1).then(_=>{s=_.acceleratedRaycast,o=_.MeshBVH,r=_.StaticGeometryGenerator,l=_.computeBoundsTree}).catch(_=>{(ki||F())&&console.error("Failed to load BVH library...",_.message)}))}const h=new se;let d=!1,u=!1,p=null;const g=Symbol("Needle:MeshBVH-Worker"),f=Symbol("Needle:MeshBVH-CanUseWorker"),y=[],v=[];function b(){d=!0,u=!0,Promise.resolve().then(()=>AL).then(_=>{p=_.GenerateMeshBVHWorker}).catch(_=>{(ki||F())&&console.warn("Failed to setup mesh bvh worker")}).finally(()=>{u=!1})}})(Bd||(Bd={}));const b_=Symbol("gltf-loader-internal-usage-tracker"),dM=C("debugusers"),__=class om{constructor(e){a(this,"parser"),a(this,"_getDependency"),a(this,"_loadingId"),a(this,"_loadedObjects",new Set),this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return om._loadingProcesses>0}beforeRoot(){om._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(s,o){const r=t.call(this,s,o);return r.then(l=>(l&&(e._loadedObjects.add(l),l[b_]=e._loadingId),l)),r},null}afterRoot(e){om._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[b_],t instanceof A&&(t.parent||t instanceof X&&setTimeout(()=>{dM&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}};a(__,"_loadingProcesses",0);let w_=__;class x_{constructor(){window.addEventListener("unhandledrejection",e=>{var t;if(e.defaultPrevented)return;const s=(t=e?.reason)==null?void 0:t.path;if(s){const o=s[0];o&&o.tagName==="IMG"&&(console.warn(`Could not load image:
155
- `+o.src),e.preventDefault())}})}}const Fd=C("trackresources");function S_(){return Fd==="dispose"}let _r=!0;Fd===0&&(_r=!1);function uM(n){_r=n}function C_(){return _r}const P_=Symbol("disposable");function jg(n,e){n&&(n[P_]=e,wr&&console.warn("Set disposable",e,n))}const O_=Symbol("disposed");function pM(n){return n[O_]===!0}function Te(n){var e;if(n){if(n[P_]===!1){wr&&console.warn("Object is marked as not disposable",n);return}if(typeof n=="object"&&(n[O_]=!0),n instanceof bi)Te(n.environment),Te(n.background),Te(n.customDepthMaterial),Te(n.customDistanceMaterial);else if(n instanceof wn)Te(n.geometry),Te(n.material),Te(n.skeleton),Te(n.bindMatrix),Te(n.bindMatrixInverse),Te(n.customDepthMaterial),Te(n.customDistanceMaterial),n.geometry=null,n.material=null,n.visible=!1;else if(n instanceof X)Te(n.geometry),Te(n.material),Te(n.customDepthMaterial),Te(n.customDistanceMaterial),n.geometry=null,n.material=null,n.visible=!1;else if(n instanceof Ns){Ea(n);for(const t of Object.keys(n.attributes)){const s=n.attributes[t];Te(s)}}else if(n instanceof yt||n instanceof xv)wr&&console.warn("BufferAttribute dispose not supported",n.count);else if(n instanceof Array)for(const t of n)t instanceof Pe&&Te(t);else if(n instanceof Pe){Ea(n);for(const s of Object.keys(n)){const o=n[s];o instanceof je&&(Te(o),n[s]=null)}const t=n.uniforms;if(t)for(const s of Object.keys(t)){const o=t[s];o instanceof je?(Te(o),t[s]=null):o instanceof ao&&(Te(o.value),o.value=null)}}else n instanceof je?(Ea(n),Ea(n.source),((e=n.source)==null?void 0:e.data)instanceof ImageBitmap&&Ea(n.source.data)):n instanceof PC?(Ea(n.boneTexture),n.boneTexture=null):n instanceof OC||!(n instanceof A)&&wr&&console.warn("Unknown object type",n)}}function Ea(n){n&&((wr||S_()||Fd)&&console.warn("\u{1F9E8} FREE",n),n instanceof ImageBitmap?n.close():n instanceof kC?n.data=null:n.dispose())}function k_(n){(n instanceof X||n instanceof wn)&&(n.material=null,n.geometry=null)}const mM=new Set;function Dg(n,e,t=null,s){if(s||(s=mM,s.clear()),!n)return s;const o=n[rc];if(o)for(const r of o)s.has(r)||t?.call(null,r)!==!1&&(s.add(r),e&&Dg(r,!0,t,s));return s}function gM(n){return n[ac]}const wr=C("debugresourceusers")||C("debugmemory"),rc=Symbol("needle-resource-users"),ac=Symbol("needle-resource-users-count");function Gt(n,e){Pd(n,e,function(t,s){_r&&!Lg.raycasting&&(Ud(rc,this,t,!1),Ud(rc,this,s,!0))})}_r&&(Gt(X.prototype,"material"),Gt(X.prototype,"geometry"),Gt(Pe.prototype,"map"),Gt(Pe.prototype,"bumpMap"),Gt(Pe.prototype,"alphaMap"),Gt(Pe.prototype,"normalMap"),Gt(Pe.prototype,"displacementMap"),Gt(Pe.prototype,"roughnessMap"),Gt(Pe.prototype,"metalnessMap"),Gt(Pe.prototype,"emissiveMap"),Gt(Pe.prototype,"specularMap"),Gt(Pe.prototype,"envMap"),Gt(Pe.prototype,"lightMap"),Gt(Pe.prototype,"aoMap"),Gt(Pe.prototype,"gradientMap"));function fM(n){if(_r===!1)return;const e=n[rc];if(e)for(const t of e)Ud(rc,t,n,!1)}_r&&Pd(Pe.prototype,"dispose",function(){fM(this)});let Bg=0;function Ud(n,e,t,s){if(Bg>0)return;if(Array.isArray(t)){for(const r of t)Ud(n,e,r,s);return}if(!t)return;let o=t[n];if(o||(o=new Set),s){if(e&&!o.has(e)){o.add(e);let r=t[ac]||0;r+=1,t[ac]=r,wr&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,r,"users:",o)}}else if(e&&o.has(e)){o.delete(e);let r=t[ac]||0;r>0&&(r-=1,t[ac]=r),wr&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,r,"users:",o),r<=0&&(w_.isLoading(t)||(Fd&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),S_()&&Te(t)))}t[n]=o}try{Pd(hr.prototype,"render",function(){Bg++},function(){Bg--})}catch(n){console.warn("Could not wrap WebGLRenderer.render",n)}const M_=C("debugcomponentevents");class lc{static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let s=this.eventListeners.get(e);s||(s=[]),s.push(t),this.eventListeners.set(e,s),M_&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const s=this.eventListeners.get(e);if(!s)return;const o=s.indexOf(t);o<0||s.splice(o,1)}static dispatchComponentLifecycleEvent(e,t){const s=this.eventListeners.get(e);if(M_&&console.log("Dispatching event "+e,s),!!s)for(const o of s)o(t)}}a(lc,"eventListeners",new Map);const cc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),R_=Symbol("isUsingInstancing"),T_=Symbol("instancingRenderer"),hc=Symbol("instancingAutoUpdateBounds");class cs{static isUsingInstancing(e){return e[R_]===!0}static getRenderer(e){return e[T_]||null}setAutoUpdateBounds(e,t){const s=cs.getRenderer(e);s&&(s[hc]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[cc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const s of e.children)cs.markDirty(s,!0)}}function Aa(n,e){try{e||n()}catch(t){return console.error(t),!1}return!0}const Fg=C("debugnewscripts"),yM=C("debughierarchy"),Fe=[];function vM(){return Fe.length>0}function zd(n){if(Fg&&console.log("Register new components",n.new_scripts.length,[...n.new_scripts],n.alias?"element: "+n.alias:n.hash,n),n.new_scripts_pre_setup_callbacks.length>0){for(const e of n.new_scripts_pre_setup_callbacks)e&&e();n.new_scripts_pre_setup_callbacks.length=0}if(!(n.new_scripts.length<=0)){Fe.length=0,n.new_scripts.length>0&&Fe.push(...n.new_scripts),n.new_scripts.length=0;for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.isComponent!==!0){(F()||Fg)&&console.error(`Registered script is not a Needle Engine component.
156
- The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
157
- `,t),Fe.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
158
- Did you add and remove a component in the same frame?`),Fe.splice(e,1),e--;continue}t.context=n,dc(t.gameObject),Ug(t,n)}catch(t){console.error(t),In(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed){In(Fe[e],n),Fe.splice(e,1),e--;continue}if(t.registering)try{t.registering()}catch(s){console.error(s)}t.__internalAwake!==void 0&&(t.gameObject||console.error("Calling awake for a component without a GameObject",t,t.gameObject),dc(t.gameObject),t.activeAndEnabled&&Aa(t.__internalAwake.bind(t)))}catch(t){console.error(t),In(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed||t.enabled===!1||(dc(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,Aa(t.__internalEnable.bind(t)))}catch(t){console.error(t),In(Fe[e],n),Fe.splice(e,1),e--}for(let e=0;e<Fe.length;e++)try{const t=Fe[e];if(t.destroyed||!t.gameObject)continue;n.new_script_start.push(t)}catch(t){console.error(t),In(Fe[e],n),Fe.splice(e,1),e--}Fe.length=0;for(const e of n.new_scripts_post_setup_callbacks)e&&e();n.new_scripts_post_setup_callbacks.length=0}}function bM(n){n&&(n.__internalDisable(!0),In(n,n.context))}function E_(n,e){for(let t=0;t<n.new_script_start.length;t++)try{const s=n.new_script_start[t];if(e!==void 0&&s.gameObject!==e||s.destroyed||s.activeAndEnabled===!1)continue;Aa(s.__internalAwake.bind(s)),s.enabled&&(Aa(s.__internalEnable.bind(s)),Aa(s.__internalStart.bind(s)),n.new_script_start.splice(t,1),t--)}catch(s){console.error(s),In(n.new_script_start[t],n),n.new_script_start.splice(t,1),t--}}function Ug(n,e){e.scripts.indexOf(n)===-1&&(e.scripts.push(n),n.earlyUpdate&&e.scripts_earlyUpdate.push(n),n.update&&e.scripts_update.push(n),n.lateUpdate&&e.scripts_lateUpdate.push(n),n.onBeforeRender&&e.scripts_onBeforeRender.push(n),n.onAfterRender&&e.scripts_onAfterRender.push(n),n.onPausedChanged&&e.scripts_pausedChanged.push(n),zg(n,null)&&e.new_scripts_xr.push(n),zg(n,"immersive-vr")&&e.scripts_immersive_vr.push(n),zg(n,"immersive-ar")&&e.scripts_immersive_ar.push(n))}function In(n,e){Yi(n,e.new_scripts),Yi(n,e.new_script_start),Yi(n,e.scripts),Yi(n,e.scripts_earlyUpdate),Yi(n,e.scripts_update),Yi(n,e.scripts_lateUpdate),Yi(n,e.scripts_onBeforeRender),Yi(n,e.scripts_onAfterRender),Yi(n,e.scripts_pausedChanged),Yi(n,e.new_scripts_xr),Yi(n,e.scripts_immersive_vr),Yi(n,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(n)}function Yi(n,e){const t=e.indexOf(n);t>=0&&e.splice(t,1)}function zg(n,e){var t;if(n){const s=n;if(s.onBeforeXR||s.onEnterXR||s.onUpdateXR||s.onLeaveXR||s.onXRControllerAdded||s.onXRControllerRemoved)return!(e!=null&&((t=s.supportsXR)==null?void 0:t.call(s,e))===!1)}return!1}function Nd(n){if(n||(n=pe.Current.scene),!n){console.trace("Invalid call - no current context.");return}const e=Da(n);A_(n,e,!0)||(Fg||F()?console.error(`Error updating hierarchy
159
- Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,n):console.error('Failed to update active state in hierarchy of "'+n.name+'"',n),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 A_(n,e,t,s=0){if(s>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const o=Da(n);if(e&&(e=o,e&&n.parent)){const c=n.parent;e=c[Mn],e===void 0&&(c instanceof bi||(e=!0))}const r=n[Mn]!==e;n[Mn]=e,r&&(yM&&console.warn("ACTIVE CHANGE",n.name,o,n.visible,e,"changed?"+r,n),_M(n,c=>{e?c.enabled&&(Aa(c.__internalAwake.bind(c)),c.enabled&&c.__internalEnable()):c.__didAwake&&c.enabled&&(c.__didEnable=!1,c.onDisable())}));let l=!0;if(n.children)for(const c of n.children)A_(c,e,t,s+1)===!1&&(l=!1);return l}function dc(n){let e=!0,t=n,s=!1;for(;t&&t;){if(t.type==="Scene"&&(s=!0),!Da(t)){e=!1;break}t=t.parent}if(!n){console.error("GO is null");return}n[Mn]=e&&s}function _M(n,e){var t;if((t=n.userData)!=null&&t.components)for(const s of n.userData.components)e(s)}const Wd=new Map,I_=Symbol("prewarmFlag"),Ng=Symbol("waitingForPrewarm"),Wg=C("debugprewarm");function wM(n,e){!n||n[I_]===!0||n[Ng]===!0||(Wd.has(e)||Wd.set(e,[]),n[Ng]=!0,Wd.get(e).push(n),Wg&&console.debug("register prewarm",n.name))}let Vg=null,Hg=null;function xM(n){if(!n)return;const e=Wd.get(n);if(!(e!=null&&e.length))return;const t=n.mainCamera;if(t){Wg&&console.log("prewarm",e.length,"objects",[...e]);const s=n.renderer;if(s.compile){const o=n.scene;s.compile(o,t),Vg??(Vg=new MC(64)),Hg??(Hg=new RC(.001,9999999,Vg)),Hg.update(s,o);for(const r of e)r[I_]=!0,r[Ng]=!1;e.length=0,Wg&&console.log("prewarm done")}}}pe.registerCallback(me.ContextCreated,n=>{const e=n.context;U_(e),D_(e)});const Vd=C("debugcomponents"),L_="eff8ba80-635d-11ec-90d6-0242ac120003";class At{constructor(e){a(this,"_originalSeed"),a(this,"_seed"),typeof e=="string"&&(e=At.hash(e)),this._originalSeed=e,this._seed=e}get seed(){return this._seed}set seed(e){this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return Fv(e,L_);const t=this._seed;return this._seed-=1,Fv(t.toString(),L_)}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 s=0;s<e.length;s++)t=e.charCodeAt(s)+((t<<5)-t);return t}}var j_=(n=>(n.NewInstanceCreated="new-instance-created",n.InstanceDestroyed="instance-destroyed",n))(j_||{});class SM{constructor(e){a(this,"guid"),a(this,"dontSave"),this.guid=e}}function uc(n,e,t=!0,s){if(!n)return;const o=n;if(Ri(n,t),!e){console.warn("Can not send destroy: No networking connection provided",n.guid);return}if(!e.isConnected){F()&&console.debug("Can not send destroy: not connected",n.guid);return}let r=n.guid;if(!r&&o.uuid&&(r=o.uuid),!r){console.warn("Can not send destroy: failed to find guid",n);return}$g(r,e,s)}function $g(n,e,t){const s=new SM(n);t?.saveInRoom===!1&&(s.dontSave=!0),e.send("instance-destroyed",s,ws.Queued)}function D_(n){n.connection.beginListen("instance-destroyed",e=>{Vd&&console.log("[Remote] Destroyed",n.scene,e);const t=sf(e.guid,n.scene);t&&Ri(t)})}class CM{constructor(e,t,s){a(this,"filename"),a(this,"hash"),a(this,"size"),this.filename=e,this.hash=t,this.size=s}}class B_{constructor(e,t){a(this,"guid"),a(this,"originalGuid"),a(this,"seed"),a(this,"visible"),a(this,"hostData"),a(this,"dontSave"),a(this,"parent"),a(this,"position"),a(this,"rotation"),a(this,"scale"),a(this,"preventCreation"),a(this,"deleteStateOnDisconnect"),this.originalGuid=e,this.guid=t}}function Gg(n,e,t,s){var o,r;const l=n;if(!l.guid)return console.warn("Can not instantiate: No guid",l),null;if(e.context||(e.context=J.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const c=e?{...e}:null,{instance:h,seed:d}=PM(l,e);if(h){const u=h;if(u.guid){Vd&&console.log("[Local] new instance","gameobject:",h?.guid);const p=new B_(l.guid,u.guid);p.seed=d,e.deleteOnDisconnect===!0&&(p.deleteStateOnDisconnect=!0),c&&(c.position&&(p.position={x:c.position.x,y:c.position.y,z:c.position.z}),c.rotation&&(p.rotation={x:c.rotation.x,y:c.rotation.y,z:c.rotation.z,w:c.rotation.w}),c.scale&&(p.scale={x:c.scale.x,y:c.scale.y,z:c.scale.z})),p.position||(p.position={x:u.position.x,y:u.position.y,z:u.position.z}),p.rotation||(p.rotation={x:u.quaternion.x,y:u.quaternion.y,z:u.quaternion.z,w:u.quaternion.w}),p.scale||(p.scale={x:u.scale.x,y:u.scale.y,z:u.scale.z}),p.visible=l.visible,c!=null&&c.parent&&(typeof c.parent=="string"?p.parent=c.parent:p.parent=c.parent.guid),p.hostData=t,s===!1&&(p.dontSave=!0),!((o=e?.context)!=null&&o.connection)&&F()&&console.debug("Object will be instantiated but it will not be synced: not connected",l.guid),e.context.connection.isInRoom&&Ia.push(new WeakRef(u)),(r=e?.context)==null||r.connection.send("new-instance-created",p)}else console.warn("Missing guid, can not send new instance event",u)}return h}function F_(){return Math.random()*9999999}const Ia=new Array;function U_(n){n.connection.beginListen("new-instance-created",async e=>{const t=await OM(e.originalGuid,n.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const s=new Bs;e.position&&(s.position=new S(e.position.x,e.position.y,e.position.z)),e.rotation&&(s.rotation=new H(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(s.scale=new S(e.scale.x,e.scale.y,e.scale.z)),s.parent=e.parent,e.seed&&(s.idProvider=new At(e.seed)),s.visible=e.visible,s.context=n,Vd&&n.alias&&console.log("[Remote] instantiate in: "+n.alias);const o=Fa(t,s);Ia.push(new WeakRef(o)),o&&(e.parent==="scene"&&n.scene.add(o),Vd&&console.log("[Remote] new instance","gameobject:",o?.guid,t))}),n.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 PM(n,e){const t=F_(),s=e??new Bs;s.idProvider=new At(t);const o=Fa(n,s);return{seed:t,instance:o}}const z_={};function N_(n,e){z_[n]=e}async function OM(n,e){const t=z_[n];if(t!=null){const s=await t(n);if(s)return s}return W_(n,e)}function W_(n,e){if(e===null||!n)return null;if(e.guid===n)return e;if(e.children)for(const t of e.children){const s=W_(n,t);if(s)return s}return null}const pc=C("gizmos"),vt=C("debugextension"),qg=C("debugtypes");class kM{constructor(){a(this,"_types",new Map),qg&&console.warn("TypeStore: Created",this)}add(e,t){qg&&console.warn("ADD TYPE",e);const s=this._types.get(e);s?qg&&s!==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,s]of this._types)if(s===e)return t;return null}}const MM=Symbol("BuiltInType"),R=new kM,RM=function(n){R.get(n.name)||R.add(n.name,n)},Xg=C("debugresolvedependencies"),TM=["/extensions/","extensions/"],EM=[{prefix:"/nodes/",dependencyName:"node"},{prefix:"/meshes/",dependencyName:"mesh"},{prefix:"/materials/",dependencyName:"material"},{prefix:"/textures/",dependencyName:"texture"},{prefix:"/animations/",dependencyName:"animation"},{prefix:"nodes/",dependencyName:"node"},{prefix:"meshes/",dependencyName:"mesh"},{prefix:"materials/",dependencyName:"material"},{prefix:"textures/",dependencyName:"texture"},{prefix:"animations/",dependencyName:"animation"}];async function Qg(n,e){Xg&&console.log(n,e);const t=[];Yg(EM,n,e,t);const s=await Promise.all(t);return typeof e=="string"&&s.length===1?s[0]:s}function V_(n,e){return!n||!e?!1:n["needle:identifier"]!=null&&e["needle:identifier"]!=null?n["needle:identifier"]===e["needle:identifier"]:!1}function AM(n,e){n["needle:identifier"]=e}function Yg(n,e,t,s){if(typeof t=="object"&&t!==void 0&&t!==null)for(const o of Object.keys(t)){const r=t[o];if(typeof r=="string"){const l=H_(e,r);if(l!=null)typeof l.then=="function"?s.push(l.then(c=>t[o]=c)):t[o]=l;else{const c=$_(n,e,r);if(c){s.push(c.then(h=>(t[o]=h,h)));continue}}}else if(Array.isArray(r))for(let l=0;l<r.length;l++){const c=r[l],h=H_(e,c);if(h!==null){typeof h.then=="function"?s.push(h.then(d=>r[l]=d)):r[l]=h;continue}for(const d of n){const u=G_(d.prefix,c);if(u>=0){Xg&&console.log(d,u,d.dependencyName),s.push(e.getDependency(d.dependencyName,u).then(p=>r[l]=p));break}}typeof c=="object"&&Yg(n,e,c,s)}else typeof r=="object"&&Yg(n,e,r,s)}else if(typeof t=="string"){const o=$_(n,e,t);o&&s.push(o)}}function H_(n,e){if(n&&n.plugins&&typeof e=="string"){for(const t of TM)if(e.startsWith(t)){let s=e.substring(t.length);const o=s.indexOf("/");o>=0&&(s=s.substring(0,o));const r=n.plugins[s];if(vt&&console.log(s,r),typeof r?.resolve=="function"){const l=e.substring(t.length+s.length+1);return r.resolve(n,l)}break}}return null}function $_(n,e,t){for(const s of n){const o=G_(s.prefix,t);if(o>=0)return Xg&&console.warn("GET DEPENDENCY",s,o,s.dependencyName),e.getDependency(s.dependencyName,o)}return null}function G_(n,e){if(typeof e=="string"&&e.startsWith(n)){const t=e.substring(n.length),s=Number.parseInt(t);if(s>=0)return s}return-1}const Kg="NEEDLE_persistent_assets";function IM(n){return n?.___persistentAsset===!0}class LM{constructor(e){a(this,"parser"),this.parser=e}get name(){return Kg}async afterRoot(e){var t,s;if(!((s=(t=this.parser)==null?void 0:t.json)!=null&&s.extensions))return;const o=this.parser.json.extensions[Kg];if(!o)return;vt&&console.log(o);const r=new Array;for(const l of o?.assets){const c=Qg(this.parser,l);c&&r.push(c)}await Promise.all(r)}resolve(e,t){const s=Number.parseInt(t);if(s>=0){vt&&console.log(t);const o=e.json.extensions[Kg];if(o){const r=o?.assets[s];if(r&&typeof r=="object"){r.___persistentAsset=!0;const l=r.__type;l&&R.get(l)}return r}}return null}}const Gs=C("debugserializer");class jM{constructor(){a(this,"typeMap",new Map)}register(e,t){if(this.typeMap.has(e)){const s=this.typeMap.get(e);if(s===t)return;Gs&&console.warn("Type: "+e+" is already registered",t,s)}Gs&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){Gs&&console.log("invalid type");return}const s=e.name,o=this.getSerializer(e);if(o!==void 0)return Gs&&console.log("FOUND SERIALIZER",o?.name,e.name,e.constructor.name,"for type: "+s,o,e,this.typeMap),o;const r=Object.getPrototypeOf(e);if(r&&r!==e){const l=this.getSerializerForConstructor(r,++t);if(l){const c=r.constructor||r.prototype;Gs&&console.log("FOUND SERIALIZER(in constructor) "+c.constructor.name,c.name,c,l),this.register(c,l)}return l}Gs&&console.warn("No serializer found for "+s,e,e.name,e.constructor.name)}}const Hd=new jM;class Ki{constructor(e,t){if(a(this,"name"),this.name=t,Array.isArray(e))for(const s of e)Hd.register(s,this);else Hd.register(e,this)}}class DM{constructor(){a(this,"isDevMode",$t()),a(this,"cache",{})}registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const s=t;s.$serializedTypes&&Object.keys(s.$serializedTypes)&&this.cache[e].push(...Object.keys(s.$serializedTypes)),Gs&&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 Zg{constructor(e){a(this,"root"),a(this,"gltf"),a(this,"gltfId"),a(this,"object"),a(this,"target"),a(this,"nodeId"),a(this,"nodeToObject"),a(this,"objectToNode"),a(this,"context"),a(this,"path"),a(this,"type"),a(this,"serializable"),a(this,"implementationInformation"),this.root=e}}function q_(n,e){const t=n.$serializedTypes;if(t===void 0)return null;const s={};for(const r in t){const l=n[r];if(l!=null&&typeof l=="object"){const c=Hd.getSerializerForConstructor(l);if(c){s[r]=c.onSerialize(l,e);continue}}s[r]=l}function o(r){const l=R._types;for(const[c,h]of l)if(h===n.constructor)return c;return r.__name||r.constructor.name}return s.name=o(n),typeof n.guid=="string"&&(s.guid=n.guid),s}const $d=[];function X_(n,e){if(!n)return e;typeof n.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,n.$serializedTypes));const t=Object.getPrototypeOf(n);return X_(t,e)}function Gd(n,e,t){if(!n)return!1;if(t.target=n,n.onBeforeDeserialize!==void 0){const o=n.onBeforeDeserialize(e,t);if(typeof o=="boolean")return o}const s=X_(n);if(e){if(typeof e.guid=="string"&&(n.guid=e.guid),s)for(const o in s){let r=function(h){const d=h.type;return d?Jg(c,d,t,void 0,n[o]):Jg(c,h,t,void 0,n[o])};const l=s[o],c=e[o];if(Gs&&console.log(o,c,n,l),!(n[o]!==void 0&&c===void 0)&&(t.type=void 0,t.path=o,t.serializable=l,!(n.onBeforeDeserializeMember!==void 0&&n.onBeforeDeserializeMember(o,c,t)===!0))){if(l===null)n[o]=c;else{if(Array.isArray(l))for(let h=0;h<l.length;h++){const d=l[h],u=r(d);if(u!==void 0||h===l.length-1){n[o]=u;break}}else n[o]=r(l);$d.length=0}n.onAfterDeserializeMember!==void 0&&n.onAfterDeserializeMember(o,c,t)}}UM(n,e)}return FM(n,e,t.implementationInformation),n.onAfterDeserialize!==void 0&&n.onAfterDeserialize(e,t),!0}const BM=C("noerrors");function FM(n,e,t){var s,o;if(BM||!e||!$t()||!n||n.constructor&&n.constructor[MM]===!0)return;const r=(s=n.constructor)==null?void 0:s.name,l=Object.getOwnPropertyNames(e);for(const c of l){if(c==="sourceId")continue;const h=n[c];if(h==null)continue;const d=e[c];if(t?.getDefinedKey(r,c)===!1){const u=c.charAt(0).toUpperCase()+c.slice(1);t.getDefinedKey(r,u)&&(Ws(Ci.Warn,'<strong>Please rename</strong> "'+u+'" to "'+c+'" in '+r),console.warn('Please use lowercase for field: "'+u+'" in '+r,d,n));continue}if(d!=null){if(typeof d=="object"&&(h===void 0||!h.isObject3D)){if(typeof d.node=="number"||typeof d.guid=="string"){if(d.could_not_resolve)continue;if(!(h!==void 0&&Object.keys(h).length>1)){Ws(Ci.Warn,`<strong>Missing serialization for object reference!</strong>
160
-
161
- Please change to:
162
- @serializable(Object3D)
163
- ${c}? : Object3D;
164
-
165
- in ${r}.ts
166
- <a href="https://docs.needle.tools/serializable" target="_blank">See documentation</a>`),console.warn(r,c,n[c],n);continue}}else if(!Array.isArray(h)){const u=(o=h.constructor)==null?void 0:o.name;if(u==="Object"&&!h.constructor["did_warn:missing_serializable"]){h.constructor["did_warn:missing_serializable"]=!0;const p='You might be missing a @serializable(Type) decorator for field "'+c+'" in '+r+".ts";console.warn(p+`
167
- ${c}:`,d,u),Ws(Ci.Warn,"Dev Warning: Are you missing a type in @serializable? Please check the browser console for details")}}}if(typeof h=="string"&&typeof d=="string"&&(d.endsWith(".gltf")||d.endsWith(".glb"))){Ws(Ci.Warn,`<strong>Missing serialization for object reference!</strong>
168
-
169
- Please change to:
170
- @serializable(AssetReference)
171
- ${c}? : AssetReference;
172
-
173
- in script ${r}.ts
174
- <a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(r,c,n[c],n);continue}}}}function UM(n,e){for(const t of Object.keys(e)){const s=e[t];if(typeof s=="object"&&s!==null&&s!==void 0){const o=n[t];if(!o){Gs&&console.log(t,"is undefined on",n);continue}for(const r of Object.keys(s))if(o[r]===void 0&&Q_(s[r])&&!Q_(o)){const l=zM(o,r);if(l&&(l?.writable===void 0||l?.writable===!1)&&l.set===void 0){Gs&&console.warn('Property is not writable "'+r+'"',o,l,s[r],o[r]);continue}o[r]=s[r]}}}}function zM(n,e){for(;n;){const t=Object.getOwnPropertyDescriptor(n,e);if(t)return t;n=Object.getPrototypeOf(n)}}function Q_(n){switch(typeof n){case"number":case"string":case"boolean":return!0}return!1}function Jg(n,e,t,s,o){let r=typeof e=="function"&&e.prototype===void 0,l=e;if(r)try{if(l=e?.call(e,o),r=!1,l==null)return}catch(u){console.error("Error in callback",u,n)}if(t.type=l,!r&&o&&(o instanceof Pe||o instanceof X||o instanceof Ns||o instanceof uo))return o;if(s||(s={serializer:Hd.getSerializerForConstructor(l)}),o&&typeof o=="object"&&IM(o)){if(o.__concreteInstance)return o.__concreteInstance;const u=o;if(!u.$serializedTypes&&l.prototype.$serializedTypes&&(u.$serializedTypes=l.prototype.$serializedTypes),u.$serializedTypes&&Gd(u,n,t),o&&l!==void 0)try{let p=null;s.serializer&&(p=s.serializer.onDeserialize(n,t)),p||(p=new l,vt&&console.log("Create concrete instance for persistent asset",o,"instance:",p),La(p,o)),o.__concreteInstance=p,o=p}catch(p){console.error("Error creating instance or creating values on instance",p,o,l)}return o}if(Array.isArray(n)){const u=[];for(let p=0;p<n.length;p++){const g=n[p],f=Jg(g,e,t,s,g);u.push(f)}return u}const c=s?.serializer;if(c)return c.onDeserialize(n,t);if(o instanceof je)return o;let h;if(n&&(n.isMaterial||n.isTexture||n.isObject3D||n instanceof uo))h=n;else{if(n===void 0)return;if(n===null&&(l===Pe||l===je||l===X||l===uo))return null;try{h=new l(...NM(n))}catch(u){console.error("Error creating "+t.path,t.target,u);return}}const d=h;return d.$serializedTypes&&Gd(d,n,t),h}function NM(n){if($d.length=0,typeof n=="object"&&n!==null&&n!==void 0)for(const e of Object.keys(n))$d.push(n[e]);return $d}const ef=Symbol("assigned component properties");function La(n,e,t,s){var o;if(e==null||n==null)return;n[ef]=!0;const r=((o=n.constructor)==null?void 0:o.name)??"unknown";t?.registerDefinedKeys(r,n);for(const l of Object.keys(e)){const c=WM(n,l);if(typeof c?.value!="function"){if(!c||c.writable===!0){const h=s!=null&&s.onAssign?s.onAssign(e,l,e[l]):e[l];n[l]=h}else if(c?.set!==void 0){const h=s!=null&&s.onAssign?s.onAssign(e,l,e[l]):e[l];n[l]=h}}}delete n[ef]}function WM(n,e){let t;do t=Object.getOwnPropertyDescriptor(n,e);while(!t&&(n=Object.getPrototypeOf(n)));return t}const Y_=Symbol("customVisibilityFlag");function Ln(n,e){n.layers[Y_]=e}const K_=Symbol("DidPatchLayers");function VM(){const n=lo.prototype;if(n[K_])return;n[K_]=!0;const e=n.test;n.test=function(t){return this[Y_]===!1?!1:e.call(this,t)}}VM(),Object.defineProperty(we.prototype,"fov",{get:function(){return this._fov},set:function(n){const e=n!==this._fov;this._fov=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(we.prototype,"near",{get:function(){return this._near},set:function(n){const e=n!==this._near;this._near=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(we.prototype,"far",{get:function(){return this._far},set:function(n){const e=n!==this._far;this._far=n,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0});const Z_=new Map;function J_(n,e){if(!n)return;if(!e){console.warn("No prototype found",n,n.prototype,n.constructor);return}const t=Z_.get(e);t&&t.apply(n)}function ew(n){const e=HM(n.prototype);Z_.set(n,e)}function HM(n){return new $M(n)}class $M{constructor(e){a(this,"$symbol"),a(this,"extensions"),a(this,"descriptors"),this.$symbol=Symbol("prototype-extension"),this.extensions=Object.keys(e),this.descriptors=new Array;for(let t=0;t<this.extensions.length;t++){const s=this.extensions[t],o=Object.getOwnPropertyDescriptor(e,s);o&&this.descriptors.push(o)}}apply(e){if(!e[this.$symbol]){e[this.$symbol]=!0;for(let t=0;t<this.extensions.length;t++){const s=this.extensions[t],o=this.descriptors[t];o&&Object.defineProperty(e,s,o)}}}}const GM=C("debuggetcomponent"),tw=()=>GM||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function qM(n){return n==null||n.isObject3D?n:n.object&&n.object.isObject3D?n.object:n}function tf(n,e){if(!n||!n.userData.components)return e;const t=n.userData.components.indexOf(e);return t<0||(lc.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,n.userData.components.splice(t,1)),e}function mc(n,e,t){return Sr(n,e)||Mi(n,e,t)}const iw=new At("addComponentIdProvider");function xr(n,e,t=!0){n.userData||(n.userData={}),n.userData.components||(n.userData.components=[]),n.userData.components.push(e),e.gameObject=n,(e.guid===void 0||e.guid==="invalid")&&(e.guid=iw.generateUUID()),Xd(n),lu(e,e.context);try{t&&e.__internalAwake&&(dc(n),e.activeAndEnabled&&e.__internalAwake()),lc.dispatchComponentLifecycleEvent("component-added",e)}catch(s){console.error(s)}return e}function Mi(n,e,t,s){var o;if(typeof e=="function"){const r=new e;t&&r.__internalNewInstanceCreated(t);let l=!0;return s?.callAwake!=null&&(l=s.callAwake),xr(n,r,l)}if(e.destroyed)return console.warn("Can not move/add a destroyed component",e),e;if(e.gameObject===n)return e;if(e.gameObject&&(o=e.gameObject.userData)!=null&&o.components){const r=e.gameObject.userData.components.indexOf(e);e.gameObject.userData.components.splice(r,1)}if(n.userData||(n.userData={}),!n.userData.components)n.userData.components=[];else if(n.userData.components.includes(e))return e;return n.userData.components.push(e),e.gameObject=n,(e.guid===void 0||e.guid==="invalid")&&(e.guid=iw.generateUUID()),t&&e._internalInit(t),lu(e,e.context),e}function sw(n){if(n.gameObject&&n.gameObject.userData.components){const e=n.gameObject.userData.components.indexOf(n);n.gameObject.userData.components.splice(e,1)}n.__internalDisable&&n.__internalDisable(),In(n,n.context??J.Current),n.destroy(),n.gameObject=null}let nw=!1;function ow(n,e,t){var s;if(n==null)return null;if(!n.isObject3D)return console.error("Object is not object3D"),null;if(!((s=n?.userData)!=null&&s.components)||(typeof e=="string"&&(nw||(nw=!0,console.warn(`Accessing components by name is not supported.
175
- Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
176
-
177
- You can import other modules your main module to get access to types
178
- or if you use npmdefs you can make types available globally using globalThis:
179
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e))),tw()&&console.log("[onGetComponent] FIND",e),e==null))return null;for(let o=0;o<n.userData.components.length;o++){const r=n.userData.components[o];let l=Object.getPrototypeOf(r);for(;l;){if(l===e.prototype)if(tw()&&console.log("[onGetComponent] MATCH BY PROTOYPE",l),t)t.push(r);else return r;l=Object.getPrototypeOf(l)}}return t||null}function Sr(n,e){const t=ow(n,e);return t?Array.isArray(t)?t[0]:t:null}function gc(n,e,t,s=!0){return t||(t=[]),s&&(t.length=0),ow(n,e,t),t}function fc(n,e,t){var s;if(t===!1&&n[Mn]===!1)return null;const o=Sr(n,e);if(t===!1&&o?.enabled===!1)return null;if(o)return o;for(let r=0;r<((s=n?.children)==null?void 0:s.length);r++){const l=fc(n.children[r],e);if(l)return l}return null}function ja(n,e,t,s=!0){var o;t||(t=[]),s&&(t.length=0),gc(n,e,t,!1);for(let r=0;r<((o=n?.children)==null?void 0:o.length);r++)ja(n.children[r],e,t,!1);return t}function yc(n,e){if(!n)return null;if(Array.isArray(n)){for(let s=0;s<n.length;s++){const o=qM(n[s]),r=yc(o,e);if(r)return r}return null}return Sr(n,e)||(n.parent?yc(n.parent,e):null)}function qd(n,e,t,s=!0){return t||(t=[]),s&&(t.length=0),n?(gc(n,e,t,!1),n.parent?qd(n.parent,e,t,!1):t):t}function vc(n,e=void 0,t=!0){if(!n)return null;if(!e&&(e=J.Current,!e))return console.error("Can not search object without any needle context or scene!!!"),null;let s=e;return s.isScene||(s=e?.scene),s&&fc(s,n,t)||null}function rw(n,e,t=void 0){if(!n)return e??[];if(e||(e=[]),e.length=0,!t&&(t=J.Current,!t))return console.error("Can not search object without any needle context or scene!!!"),e;"scene"in t&&(t=t.scene);const s=t;return s&&ja(s,n,e,!1),e}function Xd(n){n&&n.isObject3D===!0&&J_(n,A)}A.prototype.SetActive=function(n){this.visible=n},A.prototype.setActive=function(n){this.visible=n},A.prototype.destroy=function(){Ri(this)},A.prototype.addComponent=function(n,e){return Mi(this,n,e)},A.prototype.addNewComponent=function(n,e){return Mi(this,n,e)},A.prototype.removeComponent=function(n){return tf(this,n)},A.prototype.getOrAddComponent=function(n,e){return mc(this,n,e)},A.prototype.getComponent=function(n){return Sr(this,n)},A.prototype.getComponents=function(n,e){return gc(this,n,e)},A.prototype.getComponentInChildren=function(n){return fc(this,n)},A.prototype.getComponentsInChildren=function(n,e){return ja(this,n,e)},A.prototype.getComponentInParent=function(n){return yc(this,n)},A.prototype.getComponentsInParent=function(n,e){return qd(this,n,e)},Object.getOwnPropertyDescriptor(A.prototype,"activeSelf")||Object.defineProperty(A.prototype,"activeSelf",{get:function(){return Da(this)},set:function(n){bc(this,n)}}),Object.getOwnPropertyDescriptor(A.prototype,"worldPosition")||Object.defineProperty(A.prototype,"worldPosition",{get:function(){return this instanceof Av?ee(this.object):ee(this)},set:function(n){at(this,n)}}),Object.getOwnPropertyDescriptor(A.prototype,"worldQuaternion")||Object.defineProperty(A.prototype,"worldQuaternion",{get:function(){return this instanceof Av?Se(this.object):Se(this)},set:function(n){Gi(this,n)}}),Object.getOwnPropertyDescriptor(A.prototype,"worldRotation")||Object.defineProperty(A.prototype,"worldRotation",{get:function(){return wd(this)},set:function(n){Sb(this,n)}}),Object.getOwnPropertyDescriptor(A.prototype,"worldScale")||Object.defineProperty(A.prototype,"worldScale",{get:function(){return Ge(this)},set:function(n){Sa(this,n)}}),Object.getOwnPropertyDescriptor(A.prototype,"worldForward")||Object.defineProperty(A.prototype,"worldForward",{get:function(){return Q().set(0,0,1).applyQuaternion(Se(this))}}),Object.getOwnPropertyDescriptor(A.prototype,"worldRight")||Object.defineProperty(A.prototype,"worldRight",{get:function(){return Q().set(1,0,0).applyQuaternion(Se(this))}}),Object.getOwnPropertyDescriptor(A.prototype,"worldUp")||Object.defineProperty(A.prototype,"worldUp",{get:function(){return Q().set(0,1,0).applyQuaternion(Se(this))}}),ew(A);class ce extends ae{constructor(e,t,s,o){super(),a(this,"alpha",1),typeof e=="number"&&typeof t=="number"&&typeof s=="number"?(this.set(e,t,s),this.alpha=typeof o=="number"?o:1):e!==void 0&&(this.set(e),this.alpha=1)}get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}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 s=e;return s.alpha!=null&&(this.alpha=W.lerp(this.alpha,s.alpha,t)),super.lerp(e,t)}lerpColors(e,t,s){const o=e,r=t;return o.alpha!=null&&r.alpha!=null&&(this.alpha=W.lerp(o.alpha,r.alpha,s)),super.lerpColors(e,t,s)}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 ce(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),s=t>>24&255,o=t>>16&255,r=t>>8&255,l=t>>0&255;return new ce(s/255,o/255,r/255,l/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),s=t>>16&255,o=t>>8&255,r=t>>0&255;return new ce(s/255,o/255,r/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new ce(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 ce(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new ce(e[0],e[1],e[2],e[3]);if(e.length===3)return new ce(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new ce(e)}}const Qd=C("debuggetcomponent"),Cr=C("debuginstantiate");class Bs{constructor(){a(this,"idProvider"),a(this,"parent"),a(this,"keepWorldPosition"),a(this,"position"),a(this,"rotation"),a(this,"scale"),a(this,"visible"),a(this,"context"),a(this,"components")}clone(){var e,t,s;const o=new Bs;return o.idProvider=this.idProvider,o.parent=this.parent,o.keepWorldPosition=this.keepWorldPosition,o.position=(e=this.position)==null?void 0:e.clone(),o.rotation=(t=this.rotation)==null?void 0:t.clone(),o.scale=(s=this.scale)==null?void 0:s.clone(),o.visible=this.visible,o.context=this.context,o.components=this.components,o}cloneAssign(e){var t,s,o;this.idProvider=e.idProvider,this.parent=e.parent,this.keepWorldPosition=e.keepWorldPosition,this.position=(t=e.position)==null?void 0:t.clone(),this.rotation=(s=e.rotation)==null?void 0:s.clone(),this.scale=(o=e.scale)==null?void 0:o.clone(),this.visible=e.visible,this.context=e.context,this.components=e.components}}function Da(n){return n.visible}function bc(n,e){return typeof e=="number"&&(e=e>.5),n.visible=e,n.visible}function aw(n){return n[Mn]||Yd(n)}function lw(n,e){n[R_]=e}function Yd(n){return cs.isUsingInstancing(n)}function sf(n,e){return wa(n,e,!0,!0)}const cw=Symbol("isDestroyed");function Pr(n){return n[cw]}function hw(n,e){n[cw]=e}const nf=Symbol("isDontDestroy");function Ba(n,e=!0){n[nf]=e}const Kd=[],Zd=[];function Ri(n,e=!0,t=!1){Kd.length=0,Zd.length=0,of(n,e,!0);for(const s of Kd)s.gameObject=null,s.context=null;for(const s of Zd)hw(s,!0),t&&Te(s),k_(s);Zd.length=0,Kd.length=0}function of(n,e=!0,t=!0){var s;if(n==null)return;const o=n;if(o.isComponent){if(o[nf])return;Kd.push(o);const c=o.gameObject;o.__internalDisable(),o.__internalDestroy(),o.gameObject=c;return}if(n[nf])return;const r=n;Qd&&console.log(r),Zd.push(r);const l=(s=r.userData)==null?void 0:s.components;if(l!=null&&Array.isArray(l)){let c=l.length;for(let h=0;h<l.length;h++){const d=l[h];of(d,e,!1),l.length<c&&(c=l.length,h--)}}if(e&&r.children)for(const c of r.children)of(c,e,!1);t&&r.removeFromParent()}function Or(n,e,t=!0){return dw(n,e,t)}function*Jd(n,e,t=!1,s=999,o=0){if(n!=null&&n.userData.components&&!(o>s)){for(const r of n.userData.components)e&&r?.isComponent===!0&&r instanceof e?yield r:yield r;if(t===!0)for(const r of n.children)yield*Jd(r,e,!0,s,o+1)}}function dw(n,e,t,s=0){var o;if(n){if(n.isObject3D,s>1e3){console.warn("Failed to iterate components: too many levels");return}if((o=n.userData)!=null&&o.components)for(let r=0;r<n.userData.components.length;r++){const l=n.userData.components[r];if(l?.isComponent===!0){const c=e(l);if(c!==void 0)return c}}if(t&&n.children){const r=s+1;for(let l=0;l<n.children.length;l++){const c=n.children[l];if(!c)continue;const h=dw(c,e,t,r);if(h!==void 0)return h}}}}function Fa(n,e){if("isAssetReference"in n)return n.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new Bs,t.position=e):t=e);let s=J.Current;t!=null&&t.context&&(s=t.context),Qd&&s.alias&&console.log("context",s.alias),t&&!t.idProvider&&(t.idProvider=new At(Date.now()));const o=[],r={},l={},c=uw(s,n,t,o,r,l);c&&(QM(r),XM(l,r)),Qd&&(xd(n,!0),xd(c,!0));const h={};if(t?.components!==!1){for(const d in o){const u=o[d],p=u.guid;t&&t.idProvider&&(u.guid=t.idProvider.generateUUID(),h[p]=u.guid,Qd&&console.log(u.name,u.guid)),lu(u,s),u.__internalNewInstanceCreated&&u.__internalNewInstanceCreated()}for(const d in o){const u=o[d];u.resolveGuids&&u.resolveGuids(h),u.enabled!==!1&&(u.enabled=!0)}zd(s)}return c}function uw(n,e,t,s,o,r){var l;if(!e||e[Pi])return null;const c=e.userData;e.userData={};const h=e.children;e.children=[];const d=e.clone(!1);if(Xd(d),e.userData=c,e.children=h,o[e.uuid]={original:e,clone:d},Cr&&console.log("ADD",e,d),e.type==="SkinnedMesh"&&(r[e.uuid]={original:e,clone:d}),t?.visible!==void 0&&(d.visible=t.visible),t!=null&&t.idProvider){d.uuid=t.idProvider.generateUUID();const p=d;p&&(p.guid=d.uuid)}e.animations&&e.animations.length>0&&(d.animations=[...e.animations]);const u=e.parent;if(u&&u.add(d),t!=null&&t.position?at(d,t.position):d.position.copy(e.position),t!=null&&t.rotation?Gi(d,t.rotation):d.quaternion.copy(e.quaternion),t!=null&&t.scale?d.scale.copy(t.scale):d.scale.copy(e.scale),t!=null&&t.parent&&t.parent!=="scene"){let p=null;if(typeof t.parent=="string"?p=wa(t.parent,n.scene,!0):p=t.parent,p){const g=t.keepWorldPosition===!0?p.attach:p.add;g?g.call(p,d):console.error("Invalid parent object",p,"received when instantiating:",e)}else console.warn("could not find parent:",t.parent)}for(const[p,g]of Object.entries(e.userData))p!=="components"&&(d.userData[p]=g);if((l=e.userData)!=null&&l.components){const p=e.userData.components,g=[];d.userData.components=g;for(let f=0;f<p.length;f++){const y=p[f],v=new y.constructor;La(v,y,void 0,{}),y[tc]!==void 0&&(v[tc]=y[tc]),g.push(v),v.gameObject=d,s.push(v),o[y.guid]={original:y,clone:v},lc.dispatchComponentLifecycleEvent("component-added",v)}}t&&(t.position=void 0,t.rotation=void 0,t.scale=void 0,t.parent=void 0,t.visible=void 0);for(const p in e.children){const g=e.children[p],f=uw(n,g,t,s,o,r);f&&(o[f.uuid]={original:g,clone:f},d.add(f))}return d}function XM(n,e){for(const t in n){const s=n[t],o=s.original,r=o.skeleton,l=s.clone;if(!r){console.warn("Skinned mesh has no skeleton?",s);continue}const c=r.bones,h=l.skeleton.clone();l.skeleton=h,l.bindMatrix.clone().copy(o.bindMatrix),l.bindMatrixInverse.copy(o.bindMatrixInverse);const d=[];h.bones=d;for(let u=0;u<c.length;u++){const p=c[u],g=e[p.uuid].clone;d.push(g)}}for(const t in n){const s=n[t].clone;s.skeleton.update(),s.bind(s.skeleton,s.bindMatrix),s.updateMatrixWorld(!0)}}function QM(n){var e;for(const t in n){const s=n[t].clone;if(s!=null&&s.isObject3D&&(e=s?.userData)!=null&&e.components)for(let o=0;o<s.userData.components.length;o++){const r=s.userData.components[o],l=Object.entries(r);for(const[c,h]of l)if(Array.isArray(h)){const d=[];r[c]=d;for(let u=0;u<h.length;u++){const p=h[u];if(typeof p!="object"){d.push(p);continue}const g=pw(r,c,p,n);g!==void 0?(Cr&&console.log("Found new instance for",c,p,"->",g),d.push(g)):(Cr&&console.warn("Could not find new instance for",c,p),d.push(p))}}else if(typeof h=="object"){const d=pw(r,c,h,n);d!==void 0?r[c]=d:Cr&&console.warn("Could not find new instance for",c,h)}}}}function pw(n,e,t,s){var o,r;if(t!=null)if(t.isComponent===!0){const l=t.gameObject;if(l){const c=l.uuid,h=(o=s[c])==null?void 0:o.clone;if(!h){Cr&&console.log("reference did not change",e,n,t);return}const d=l.userData.components.indexOf(t);if(d>=0&&h.isObject3D)return Cr&&console.log(e,c),h.userData.components[d];console.warn("could not find component",e,t)}}else if(t.isObject3D===!0){if(e==="gameObject")return;const l=t;if(l){const c=l.uuid,h=(r=s[c])==null?void 0:r.clone;if(h)return Cr&&console.log(e,"old",t,"new",h),h}}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(s)}}var kr;(n=>{n.baseUrl="https://networking.needle.tools";function e(h){return Uv(new Uint8Array(h))}n.hashMD5=e;function t(h){const d=Uv(new Uint8Array(h),{encoding:"binary",asBytes:!0});return btoa(String.fromCharCode(...d))}n.hashMD5_Base64=t;function s(h){const d=new Uint8Array(h);return crypto.subtle.digest("SHA-256",d).then(u=>btoa(String.fromCharCode(...new Uint8Array(u))))}n.hashSha256=s;function o(h){const d=h.filesize/1024/1024;return Qs()?d<50:d<5}n.canUpload=o;async function r(h,d){var u;const p=n.baseUrl;if(p){if(!h.name)return console.error("Upload: file name is missing"),null}else return console.error("Blob storage base url is not set"),null;let g=null;h instanceof File?g=await h.arrayBuffer():g=h.data;const f=g.byteLength,y=f/1024/1024;if(y>50)return d?.silent!==!0&&be(`File (${y.toFixed(1)}MB) is too large for uploading (see console for details)`),console.warn(`Your file is too large for uploading (${y.toFixed(1)}MB). Max allowed size is 50MB`),null;if(!Qs()&&y>5)return d?.silent!==!0&&be('File is too large for uploading. Please get a <a href="https://needle.tools/pricing" target="_blank">commercial license</a> to upload files larger than 5MB'),console.warn(`Your file is too large for uploading (${y.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(f<1)return console.warn(`Your file is too small for uploading (${y.toFixed(1)}MB). Min size is 1 byte`),null;const v=t(g),b={filename:h.name,"Content-Md5":v,"Content-Type":h.type||"application/octet-stream",FileSize:f.toString(),"Content-Disposition":`attachment; filename="${h.name}"`,"x-amz-server-side-encryption":"AES256"},_=await fetch(p+"/api/needle/blob",{method:"POST",headers:b,signal:d?.abort}).then(w=>w.json()).catch(w=>(console.error(w),null));if(_==null)return console.warn("Upload failed..."),null;if("error"in _)return console.error(_.error),null;if("upload"in _&&_.upload){let w=function(k){var T;return(T=d?.onProgress)==null||T.call(null,{progress01:0,state:"inprogress"}),fetch(k,{method:"PUT",headers:b,body:g,signal:d?.abort}).then(L=>{var B;return(B=d?.onProgress)==null||B.call(null,{progress01:1,state:"finished"}),L}).catch(L=>L)};console.debug("Uploading file",_.upload);let x=!1,M=null;for(let k=0;k<3;k++)try{if(x)break;if((u=d?.abort)!=null&&u.aborted)return console.debug("Aborted upload"),null;const T=await w(_.upload);T instanceof Error?(M=T,await fs(1e3*k)):T.ok&&(console.debug("File uploaded successfully"),x=!0)}catch(T){console.error(T)}if(!x)return console.error(M?.message||"Failed to upload file"),null}if("download"in _){const w=p+_.download;return console.debug("File found in blob storage",w),{key:_.key,success:!0,download_url:w}}return null}n.upload=r;function l(h){return`${n.baseUrl}/api/needle/blob/${h}`}n.getBlobUrlForKey=l;async function c(h,d){const u=new bm;u.setResponseType("arraybuffer");const p=await u.loadAsync(h,g=>{d&&d.call(null,g)});return p instanceof ArrayBuffer?new Uint8Array(p):(console.error("Download failed, no arraybuffer returned"),null)}n.download=c})(kr||(kr={}));const bo=C("debugaddressables");class mw{constructor(e){a(this,"_context"),a(this,"_assetReferences",{}),a(this,"preUpdate",()=>{}),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){const s=this._assetReferences[t];s?.unload()}this._assetReferences={}}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 rf=Symbol("assetReference"),gw=class Al{constructor(e,t,s=null){a(this,"_loading"),a(this,"_asset"),a(this,"_glbRoot"),a(this,"_url"),a(this,"_urlName"),a(this,"_progressListeners",[]),a(this,"_hash"),a(this,"_hashedUri"),a(this,"_isLoadingRawBinary",!1),a(this,"_rawBinary"),this._url=e;const o=e.lastIndexOf("/");if(o>=0){this._urlName=e.substring(o+1);const r=this._urlName.lastIndexOf(".");r>=0&&(this._urlName=this._urlName.substring(0,r))}else this._urlName=e;this._hash=t,e.includes("?v=")?this._hashedUri=e:this._hashedUri=t?e+"?v="+t:e,s!==null&&(this.asset=s),N_(this._url,this.onResolvePrefab.bind(this))}static getOrCreateFromUrl(e,t){if(!t&&(t=J.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 s=t.addressables,o=s.findAssetReference(e);if(o)return o;const r=new Al(e,t.hash);return s.registerAssetReference(r),r}static getOrCreate(e,t,s){if(typeof e=="string"){if(!s&&(s=J.Current,!s))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 s=e.context,e=e.sourceId;const o=mo(e,t);bo&&console.log("GetOrCreate Addressable from",e,t,"FinalPath=",o);const r=s.addressables,l=r.findAssetReference(o);if(l)return l;const c=new Al(o,s.hash);return r.registerAssetReference(c),c}get isAssetReference(){return!0}get asset(){return this._glbRoot??this._asset}set asset(e){this._asset=e}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("/"))}get rawAsset(){return this._asset}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||Pr(this.asset)===!0}isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(bo&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Ri(this.asset.scene,!0,!0),Ri(this.asset,!0,!0)),this.asset=null,this._rawBinary=void 0,this._glbRoot=null,this._loading=void 0,J.Current&&J.Current.addressables.unregisterAssetReference(this)}async preload(){if(!this.mustLoad||this._isLoadingRawBinary)return null;if(this._rawBinary!==void 0)return this._rawBinary;this._isLoadingRawBinary=!0,bo&&console.log("Preload",this._hashedUri);const e=await kr.download(this._hashedUri,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(bo&&console.log("loadAssetAsync",this.url),!this.mustLoad)return this.asset;if(e&&this._progressListeners.push(e),this._loading!==void 0)return this._loading.then(o=>this.asset);const t=J.Current;if(this._rawBinary){if(!(this._rawBinary instanceof ArrayBuffer))return console.error("Invalid raw binary data",this._rawBinary),null;this._loading=_s().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else bo&&console.log("Load async",this.url),this._loading=_s().loadSync(t,this._hashedUri,this.url,null,o=>{this.raiseProgressEvent(o)});const s=await this._loading;return this._progressListeners.length=0,this._glbRoot=this.tryGetActualGameObjectRoot(s),this._loading=void 0,s?(s[rf]=this,this._glbRoot&&(this._glbRoot[rf]=this),this.asset&&(this.asset[rf]=this),zd(t),s.scene!==void 0&&(this.asset=s),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)}async onInstantiate(e,t=!1,s){const o=J.Current,r=new Bs;if(e instanceof A?r.parent=e:e&&(Object.assign(r,e),r.cloneAssign(e)),r.parent===void 0&&(r.parent=o.scene),this.mustLoad&&await this.loadAssetAsync(),bo&&console.log("Instantiate",this.url,"parent:",e),this.asset){bo&&console.log("Add to scene",this.asset);let l=Al.currentlyInstantiating.get(this.url);if(l!==void 0&&l>=1e4)return console.error("Recursive or too many instantiations of "+this.url+" in the same frame ("+l+")"),null;try{if(l===void 0&&(l=0),l+=1,Al.currentlyInstantiating.set(this.url,l),t){r.context=o;const c=this.asset;c.guid=this.url;const h=Gg(c,r,void 0,s);if(h)return h}else{const c=Fa(this.asset,r);if(c)return c}}finally{o.post_render_callbacks.push(()=>{l===void 0||l<0?l=0:l-=1,Al.currentlyInstantiating.set(this.url,l)})}}else bo&&console.warn("Failed to load asset",this.url);return null}tryGetActualGameObjectRoot(e){if(e&&e.scene){const t=e.scene;return t.isGroup&&t.children.length===1&&t.children[0].name+"glb"===t.name?t.children[0]:t}return null}};a(gw,"currentlyInstantiating",new Map);let le=gw;class YM extends Ki{constructor(){super([le],"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?le.getOrCreate(t.gltfId,e,t.context):(console.error("Missing source id"),null):(console.error("Missing context"),null);if(e instanceof A){if(!t.context)return console.error("Missing context"),null;if(!t.gltfId)return console.error("Missing source id"),null;const s=e,o=t.context,r=s.guid??s.uuid,l=o.addressables.findAssetReference(r);if(l)return l;const c=new le(r,void 0,s);return o.addressables.registerAssetReference(c),c}return null}}new YM;const KM=Promise.resolve(null),fw=class rm{constructor(e){a(this,"url"),a(this,"_bitmap"),a(this,"_bitmapObject"),a(this,"loader",null),this.url=e}static getOrCreate(e){let t=rm.imageReferences.get(e);return t||(t=new rm(e),rm.imageReferences.set(e,t)),t}dispose(){this._bitmapObject&&this._bitmapObject.close(),this._bitmap=void 0}createHTMLImage(){const e=new Image;return e.src=this.url,e}createTexture(){return this.url?(this.loader||(this.loader=new fa),this.loader.setCrossOrigin("anonymous"),this.loader.loadAsync(this.url).then(e=>{var t;return e&&!((t=e.name)!=null&&t.length)&&(e.name=this.url.split("/").pop()??this.url),e})):(console.error("Can not load texture without url"),KM)}getBitmap(){return this._bitmap?this._bitmap:(this._bitmap=new Promise((e,t)=>{const s=document.createElement("img");s.addEventListener("load",()=>{this._bitmap=createImageBitmap(s).then(o=>(this._bitmapObject=o,e(o),o))}),s.addEventListener("error",o=>{console.error("Failed to load image:"+this.url,o),e(null)}),s.src=this.url}),this._bitmap)}};a(fw,"imageReferences",new Map);let af=fw;class yw extends Ki{constructor(){super([af],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const s=mo(t.gltfId,e);return af.getOrCreate(s)}}}new yw;const vw=class am{constructor(e){a(this,"url"),a(this,"res"),this.url=e}static getOrCreate(e){let t=am.cache.get(e);return t||(t=new am(e),am.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())}};a(vw,"cache",new Map);let lf=vw;class bw extends Ki{constructor(){super([lf],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const s=mo(t.gltfId,e);return lf.getOrCreate(s)}}}new bw;class ZM{constructor(e){a(this,"context"),a(this,"mixers",[]),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 Ua{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 s of e.children)this.tryGetAnimationClipsFromObjectHierarchy(s,t);return t}static assignAnimationsFromFile(e,t){if(!e||!e.animations){console.debug("No animations found in file");return}for(let o=0;o<e.animations.length;o++){const r=e.animations[o];if(!r.tracks||r.tracks.length<=0){console.warn("Animation has no tracks");continue}for(const l in r.tracks){const c=r.tracks[l],h=ya.parseTrackName(c.name);let d=ya.findNode(e.scene,h.nodeName);if(!d){const p=c.__objectName??c.name.substring(0,c.name.indexOf("."));if(d=e.scene.getObjectByProperty("uuid",p),!d)continue}let u=s(d);if(!u){if(!(t!=null&&t.createAnimationComponent)){console.warn("No AnimationComponent found in parent hierarchy of object and no 'createAnimationComponent' callback was provided in options.");continue}u=t.createAnimationComponent(e.scene,r)}u.addClip&&u.addClip(r)}}function s(o){var r;if(!o)return null;const l=(r=o.userData)==null?void 0:r.components;if(l&&l.length>0){for(let c=0;c<l.length;c++)if(l[c].isAnimationComponent===!0)return o}return s(o.parent)}}}function*cf(n,e=null){const t=e?e.time:J.Current.time,s=t.time;for(;t.time-s<n;)yield}function*JM(n){for(let e=0;e<n;e++)yield}function*_w(n){let e=!0;for(n.then(()=>e=!1),n.catch(()=>e=!1);e;)yield}const ww="NEEDLE_lightmaps",_c=C("debuglightmapsextension")||C("debuglightmaps");var _o=(n=>(n[n.Lightmap=0]="Lightmap",n[n.Skybox=1]="Skybox",n[n.Reflection=2]="Reflection",n))(_o||{});class eR{constructor(e,t,s){a(this,"parser"),a(this,"registry"),a(this,"source"),this.parser=e,this.registry=t,this.source=s}get name(){return ww}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[ww];if(s){const o=s.textures;return o!=null&&o.length?(_c&&console.log(s),new Promise(async(r,l)=>{const c=[];for(const d of o)if(d.pointer){_c&&console.log(d);let u=null;if(d.pointer.startsWith("/textures/"))_c&&console.log("Load texture from gltf",d.pointer),u=Qg(this.parser,d.pointer).then(p=>this.resolveTexture(d,p));else if(typeof d.pointer=="string"){_c&&console.log("Load texture from path",d.pointer);const p=mo(this.source,d.pointer);let g;p.endsWith(".exr")?g=new pd(this.parser.options.manager):p.endsWith(".hdr")?g=new Tm(this.parser.options.manager):g=new fa(this.parser.options.manager),u=g.loadAsync(p,void 0).then(f=>this.resolveTexture(d,f))}else d.pointer;u&&c.push(u)}const h=await Nm(c);h!=null&&h.anyFailed&&F()&&console.error("Failed to load lightmap extension",h),r()})):null}}return null}resolveTexture(e,t){const s=t;_c&&console.log("Lightmap loaded:",s),s!=null&&s.isTexture&&(this.registry?(s.colorSpace=xn,this.registry.registerTexture(this.source,e.type,s,e.index)):console.log(_o[e.type],e.pointer,s))}}const xw=!!C("debuglightmaps");class tR{constructor(e){a(this,"_context"),a(this,"_lightmaps",new Map),this._context=e}clear(){this._lightmaps.clear()}registerTexture(e,t,s,o){xw&&console.log("Registering ",_o[t]+' "'+e+'"',s),this._lightmaps.has(e)||this._lightmaps.set(e,new Map);const r=this._lightmaps.get(e),l=r?.get(t)??[];l.length<o&&(l.length=o+1),l[o]=s,r?.set(t,l)}tryGetLightmap(e,t=0){return this.tryGet(e,_o.Lightmap,t)}tryGetSkybox(e){return this.tryGet(e,_o.Skybox,0)}tryGetReflection(e){return this.tryGet(e,_o.Reflection,0)}tryGet(e,t,s){if(!e)return xw&&console.warn("Missing source id"),null;const o=this._lightmaps.get(e);if(!o)return null;const r=o.get(t);return r===void 0||!(r!=null&&r.length)||r.length<=s?null:r[s]}}Ht.lights_fragment_maps=Ht.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
180
- vec2 lUv = vLightMapUv.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
181
- vec4 lightMapTexel = texture2D( lightMap, lUv);
182
- // 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.
183
- lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
184
- lightMapTexel.a = 1.;
185
- lightMapTexel = conv_sRGBToLinear(lightMapTexel);
186
- `),Ht.lightmap_pars_fragment=`
187
- #ifdef USE_LIGHTMAP
188
- uniform sampler2D lightMap;
189
- uniform float lightMapIntensity;
190
- uniform vec4 lightmapScaleOffset;
191
-
192
- // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
193
- vec4 conv_sRGBToLinear( in vec4 value ) {
194
- 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 );
195
- }
196
- #endif
197
- `,Ht.lights_fragment_begin=Ht.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
198
- #if defined(USE_LIGHTMAP)
199
- irradiance += 0.;
200
- #else
201
- irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
202
- #endif`),TC.lightmap.lightmapScaleOffset={value:new ye(1,1,0,0)};const hf=C("debugprogressive"),eu=new _i,tu=new rd;class iR{constructor(e){a(this,"context"),a(this,"_lodsManager"),this.context=e}get manager(){return this._lodsManager}get targetTriangleDensity(){var e;return((e=this._lodsManager)==null?void 0:e.targetTriangleDensity)??-1}set targetTriangleDensity(e){this._lodsManager&&(this._lodsManager.targetTriangleDensity=e)}setRenderer(e){var t;(t=this._lodsManager)==null||t.disable(),ba.removePlugin(this),ba.addPlugin(this),ba.debugDrawLine=q.DrawLine,this._lodsManager=ba.get(e),this._lodsManager.enable()}disable(){var e;(e=this._lodsManager)==null||e.disable(),ba.removePlugin(this)}onAfterUpdatedLOD(e,t,s,o,r){hf&&this.onRenderDebug(s,o,r)}onRenderDebug(e,t,s){var o,r,l;if(!t.geometry||!Xe.hasLODLevelAvailable(t.geometry)&&!Xe.hasLODLevelAvailable(t.material))return;const c=ba.getObjectLODState(t);if(!c)return;let h=s.mesh_lod;const d=s.mesh_lod!=c.lastLodLevel_Mesh||s.texture_lod!=c.lastLodLevel_Texture;if(hf&&t.geometry.boundingSphere){const u=t.geometry.boundingSphere;tu.copy(u),tu.applyMatrix4(t.matrixWorld);const p=tu.center,g=tu.radius,f=["#76c43e","#bcc43e","#c4ac3e","#c4673e","#ff3e3e"];if(d)q.DrawWireSphere(p,g,f[h],.1);else{const y=((o=t.geometry.index)==null?void 0:o.count)??0,v=(r=Xe.getMeshLODInformation(t.geometry))==null?void 0:r.lods;h=v?Math.min(v?.length-1,h):0;let b="";if(v&&c.lastScreenCoverage>0)for(let x=0;x<v.length;x++){const M=v[x].density,k=x==v.length-1;b+=M.toFixed(0)+">"+(M/c.lastScreenCoverage).toFixed(0)+(k?"":",")}const _=v?(l=v[h])==null?void 0:l.density:-1;let w="LOD "+s.mesh_lod+`
203
- TEX `+s.texture_lod;if(hf=="density"&&(w+=`
204
- `+y+` tris
205
- `+(_/c.lastScreenCoverage).toFixed(0)+` dens
206
- `+(c.lastScreenCoverage*100).toFixed(1)+`% cov
207
- `+(c.lastCentrality*100).toFixed(1)+`% centr
208
- `+(eu.min.x.toFixed(2)+"-"+eu.max.x.toFixed(2)+"x"+eu.min.y.toFixed(2)+"-"+eu.max.y.toFixed(2))+" scr"),c.lastScreenCoverage>.1){const x=e,M=x.worldForward,k=x.worldPosition,T=Q(M).multiplyScalar(g*.7).add(p),L=T.distanceTo(k),B=f[Math.min(f.length-1,Math.max(0,h))]+"88",z=this.context.domHeight>0?screen.height/this.context.domHeight:1,j=e.isPerspectiveCamera?Math.tan(e.fov*Math.PI/180/2):1;q.DrawLabel(T,w,L*.012*z*j,void 0,16777215,B)}}}}}const sR=C("debugplayerview");var wo=(n=>(n.Browser="browser",n.Headset="headset",n.Handheld="handheld",n))(wo||{});class Sw{constructor(e,t){a(this,"userId"),a(this,"context"),a(this,"viewDevice","browser"),a(this,"removed",!1),a(this,"_object"),this.userId=e,this.context=t}get currentObject(){return this._object}set currentObject(e){this._object=e}get isConnected(){return this.context.connection.userIsInRoom(this.userId)}}class Cw{constructor(e){a(this,"context"),a(this,"playerViews",new Map),this.context=e}setPlayerView(e,t,s){let o=this.playerViews.get(e);o||(o=new Sw(e,this.context),this.playerViews.set(e,o)),o.viewDevice=s,o.currentObject=t,o.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 s=this.playerViews.get(e);s?.viewDevice===t&&(sR&&console.log("REMOVE",e),s.removed=!0,this.playerViews.delete(e))}}new bm;const wc=new Uint8Array(4);wc[0]=255,wc[1]=255,wc[2]=255,wc[3]=255;const nR=new _m(wc,1,1,ad);function df(n,e=1){const t="alpha"in n,s=e*e,o=new Uint8Array(4*s),r=Math.floor(n.r*255),l=Math.floor(n.g*255),c=Math.floor(n.b*255);for(let d=0;d<s;d++){const u=d*4;o[u+0]=r,o[u+1]=l,o[u+2]=c,t?o[u+3]=Math.floor(n.alpha*255):o[u+3]=255}const h=new _m(o,e,e);return h.needsUpdate=!0,h}function oR(n,e,t,s=1,o=3){const r=s*o,l=[n,e,t],c=l.length,h=new Uint8Array(4*c*r),d=new ae;for(let p=0;p<o;p++){const g=Math.floor(p/o*c),f=W.clamp(g+1,0,c-1),y=l[g],v=l[f],b=p/o*c%1;d.lerpColors(y,v,b);const _=Math.floor(d.r*255),w=Math.floor(d.g*255),x=Math.floor(d.b*255);for(let M=0;M<s;M++){const k=(p*s+M)*4;h[k+0]=_,h[k+1]=w,h[k+2]=x,h[k+3]=255}}const u=new _m(h,s,o);return u.needsUpdate=!0,u}function iu(n,e){const t=n.elements;e||(e=[]),e.length=0;for(let s=0;s<16;s+=4){const o=t[s],r=t[s+1],l=t[s+2],c=t[s+3],h=new ye(o,r,l,c);e.push(h)}return e}const uf=[],Pw=[];function rR(n,e){if(uf.length===0)for(let t=0;t<27;t++)uf.push(0);e||(e=uf);for(let t=0;t<27;t++)Pw[t]=e[t];e=Pw,n.unity_SHAr={value:new ye(e[9],e[3],e[6],e[0])},n.unity_SHBr={value:new ye(e[12],e[15],e[18],e[21])},n.unity_SHAg={value:new ye(e[10],e[4],e[7],e[1])},n.unity_SHBg={value:new ye(e[13],e[16],e[19],e[22])},n.unity_SHAb={value:new ye(e[11],e[5],e[8],e[2])},n.unity_SHBb={value:new ye(e[14],e[17],e[20],e[23])},n.unity_SHC={value:new ye(e[24],e[25],e[26],1)}}class aR{constructor(e,t,s){a(this,"vertexShader"),a(this,"fragmentShader"),a(this,"technique"),this.vertexShader=e,this.fragmentShader=t,this.technique=s}}async function lR(n,e){if(!n)return console.error("Can not find technique: no shader data"),null;const t=n.programs[e],s=t.vertexShader,o=t.fragmentShader;if(s!==void 0&&o!==void 0){const r=n.shaders[s],l=n.shaders[o];if(r.uri&&l.uri||r.code&&l.code){if(!r.code&&r.uri&&await Ow(r),!l.code&&l.uri&&await Ow(l),!r.code||!l.code)return null;const c=n.techniques[e];return new aR(r.code,l.code,c)}}return console.error("Shader technique not found",e),null}async function Ow(n){const e=n.uri;if(e)if(e.endsWith(".glsl")){const t=await new bm().loadAsync(e);n.code=t.toString()}else n.code=cR(n.uri)}function cR(n){return decodeURIComponent(Array.prototype.map.call(atob(n),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const Ss=C("debugenvlight");var za=(n=>(n[n.Skybox=0]="Skybox",n[n.Trilight=1]="Trilight",n[n.Flat=3]="Flat",n[n.Custom=4]="Custom",n))(za||{}),su=(n=>(n[n.Skybox=0]="Skybox",n[n.Custom=1]="Custom",n))(su||{});class kw{constructor(e){a(this,"context"),a(this,"_currentLightSettingsId"),a(this,"_sceneLightSettings"),a(this,"_timevec4",new ye),a(this,"__currentReflectionId",null),a(this,"_lighting",{}),this.context=e,this.context.pre_update_callbacks.push(this.preUpdate.bind(this))}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}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(){var e;return(e=this._sceneLightSettings)==null?void 0:e.values()}enable(e){var t;e instanceof le&&(e=e.url);const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);return s?(Ss&&console.log("Enable scene light settings",e,s),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,s.enabled=!0,!0):(Ss&&console.warn("No light settings found for",e),!1)}disable(e){var t;if(e instanceof le&&(e=e.url),e==null)return!1;const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);return s?(Ss&&console.log("Disable scene light settings",e,s),s.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}Ss&&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}Ss&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){Ss&&console.log("Register reflection",e,t);const s=new Mw(this.context,t,1);this._lighting[e]=s}internalGetReflection(e){return this._lighting[e]}internalEnableReflection(e){var t;this.__currentReflectionId=e;const s=(t=this._sceneLightSettings)==null?void 0:t.get(e);switch(Ss&&console.log("Enable reflection",e,s?za[s.ambientMode]:"Unknown ambient mode",s),s?.ambientMode){case 0:case 4:const o=this.internalGetReflection(e);if(o&&o.Source){Ss&&console.log("Setting environment reflection",o);const r=this.context.scene,l=o.Source;l.mapping=Sn,r.environment=l;return}else Ss&&console.warn("Could not find reflection for source",e);break}if(s?.environmentReflectionSource===1)switch(s?.ambientMode){case 1:if(s.ambientTrilight){const o=s.ambientTrilight,r=oR(o[0],o[1],o[2],64,64);r.colorSpace=Cn,r.mapping=Sn,this.context.scene.environment=r}else console.error("Missing ambient trilight",s.sourceId);return;case 3:if(s.ambientLight){const o=df(s.ambientLight,64);o.colorSpace=Cn,o.mapping=Sn,this.context.scene.environment=o}else console.error("Missing ambientlight",s.sourceId);return;default:return}}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){Ss&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}Ss&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}}class Mw{constructor(e,t,s=1){a(this,"_source"),this._source=t,t.mapping=Sn}get Source(){return this._source}}const Rw=C("timescale");let pf=1;typeof Rw=="number"&&(pf=Rw);class Tw{constructor(){a(this,"_time",0),a(this,"_deltaTime",0),a(this,"_deltaTimeUnscaled",0),a(this,"timeScale",1),a(this,"_frame",0),a(this,"clock",new EC),a(this,"_smoothedFps",0),a(this,"_smoothedDeltaTime",0),a(this,"_fpsSamples",[]),a(this,"_fpsSampleIndex",0),typeof pf=="number"&&(this.timeScale=pf)}get time(){return this._time}set time(e){this._time=e}get deltaTime(){return this._deltaTime}set deltaTime(e){this._deltaTime=e}get deltaTimeUnscaled(){return this._deltaTimeUnscaled}get frame(){return this._frame}set frame(e){this._frame=e}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}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 Ew=!1;function Aw(n){Ew||(Ew=!0,hR(),dR())}Aw();function hR(){const n=`
209
- float startCompression = 0.8;
210
- float desaturation = 0.5;
211
- // Patched tonemapping function
212
- vec3 NeutralToneMapping( vec3 color ) {
213
- color *= toneMappingExposure;
214
-
215
- float d = 1. - startCompression;
216
- // float peak = dot(color, vec3(0.299, 0.587, 0.114));
217
- float peak = max(color.r, max(color.g, color.b));
218
- if (peak < startCompression) return color;
219
- float newPeak = 1. - d * d / (peak + d - startCompression);
220
- float invPeak = 1. / peak;
221
-
222
- float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
223
-
224
- color *= newPeak * invPeak;
225
- float g = 1. - 3. / (desaturation * extraBrightness + 3.);
226
- return mix(color, vec3(1, 1, 1), g);
227
- }
228
- `,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
229
- }`,s=Ht.tonemapping_pars_fragment.indexOf(e),o=Ht.tonemapping_pars_fragment.indexOf(t,s);if(s>=0&&o>=0){const r=Ht.tonemapping_pars_fragment.substring(s,o+t.length);Ht.tonemapping_pars_fragment=Ht.tonemapping_pars_fragment.replace(r,n)}else F()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function dR(){const n=`
230
- // 0: Default, 1: Golden, 2: Punchy
231
- #define AGX_LOOK 0
232
-
233
- vec3 userSlope = vec3(1.0);
234
- vec3 userOffset = vec3(0.0);
235
- vec3 userPower = vec3(1.0);
236
- float userSaturation = 1.0;
237
-
238
- // Mean error^2: 3.6705141e-06
239
- vec3 _agxDefaultContrastApprox(vec3 x) {
240
- vec3 x2 = x * x;
241
- vec3 x4 = x2 * x2;
242
-
243
- return + 15.5 * x4 * x2
244
- - 40.14 * x4 * x
245
- + 31.96 * x4
246
- - 6.868 * x2 * x
247
- + 0.4298 * x2
248
- + 0.1191 * x
249
- - 0.00232;
250
- }
251
-
252
- vec3 _agx(vec3 val) {
253
- const mat3 agx_mat = mat3(
254
- 0.842479062253094, 0.0423282422610123, 0.0423756549057051,
255
- 0.0784335999999992, 0.878468636469772, 0.0784336,
256
- 0.0792237451477643, 0.0791661274605434, 0.879142973793104);
257
-
258
- const float min_ev = -12.47393;
259
- const float max_ev = 4.026069;
260
-
261
- // val = pow(val, vec3(2.2));
262
-
263
- // Input transform (inset)
264
- val = agx_mat * val;
265
-
266
- // Log2 space encoding
267
- val = clamp(log2(val), min_ev, max_ev);
268
- val = (val - min_ev) / (max_ev - min_ev);
269
-
270
- // Apply sigmoid function approximation
271
- val = _agxDefaultContrastApprox(val);
272
-
273
- return val;
274
- }
275
-
276
- vec3 _agxEotf(vec3 val) {
277
- const mat3 agx_mat_inv = mat3(
278
- 1.19687900512017, -0.0528968517574562, -0.0529716355144438,
279
- -0.0980208811401368, 1.15190312990417, -0.0980434501171241,
280
- -0.0990297440797205, -0.0989611768448433, 1.15107367264116);
281
-
282
- // Inverse input transform (outset)
283
- val = agx_mat_inv * val;
284
-
285
- // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
286
- // NOTE: We're linearizing the output here. Comment/adjust when
287
- // *not* using a sRGB render target
288
- val = pow(val, vec3(2.2));
289
-
290
- return val;
291
- }
292
-
293
- vec3 _agxLook(vec3 val) {
294
- const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
295
- float luma = dot(val, lw);
296
-
297
- // Default
298
- vec3 offset = vec3(0.0);
299
- vec3 slope = vec3(1.0);
300
- vec3 power = vec3(1.0);
301
- float sat = 1.0;
302
-
303
- #if AGX_LOOK == 1
304
- // Golden
305
- slope = vec3(1.0, 0.9, 0.5);
306
- power = vec3(0.8);
307
- sat = 0.8;
308
- #elif AGX_LOOK == 2
309
- // Punchy
310
- slope = vec3(1.0);
311
- power = vec3(1.35, 1.35, 1.35);
312
- sat = 1.4;
313
- #endif
314
-
315
- // Needle
316
- slope = vec3(1.05);
317
- power = vec3(1.10, 1.10, 1.10);
318
- sat = 1.15;
319
-
320
- // User
321
- // slope = userSlope;
322
- // offset = userOffset;
323
- // power = userPower;
324
- // sat = userSaturation;
325
-
326
- // ASC CDL
327
- val = pow(val * slope + offset, power);
328
- return luma + sat * (val - luma);
329
- }
330
-
331
-
332
- vec3 AgXToneMapping( vec3 color ) {
333
- // apply AGX
334
- color *= toneMappingExposure;
335
- color = _agx(color);
336
- color = _agxLook(color); // Optional
337
- color = _agxEotf(color);
338
- return color;
339
- `,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",s=Ht.tonemapping_pars_fragment.indexOf(e),o=Ht.tonemapping_pars_fragment.indexOf(t,s);if(s>=0&&o>=0){const r=Ht.tonemapping_pars_fragment.substring(s,o+t.length);Ht.tonemapping_pars_fragment=Ht.tonemapping_pars_fragment.replace(r,n)}else F()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function Pt(n){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=n,e}function Iw(n){var e;return((e=n.classList)==null?void 0:e.contains("material-symbols-outlined"))||!1}const nu=new Map;async function mf(n){const e="Material Symbols Outlined";if(document.fonts.check(`1em '${e}'`)||(console.log("Font not loaded yet"),await document.fonts.ready),nu.has(n))return nu.get(n);const t=document.createElement("canvas"),s=48;t.width=s,t.height=s;const o=t.getContext("2d");if(o){o.font=`${s}px '${e}'`,o.fillStyle="black",o.fillText(n,0,s);const r=t.toDataURL(),l=new je;return l.name=n+" icon",l.image=new Image,l.image.src=r,l.needsUpdate=!0,nu.set(n,l),l}return nu.set(n,null),null}const Lw=class av{constructor(){a(this,"_fullscreenButton"),a(this,"_muteButton"),a(this,"_qrButton"),a(this,"_customQRButtonUrl")}static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new av),this._instance}static create(){return new av}get fullscreenButton(){return this._fullscreenButton}createFullscreenButton(e){if(this._fullscreenButton)return this._fullscreenButton;if(!document.fullscreenEnabled)return F()&&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 s=Pt("fullscreen"),o=Pt("fullscreen_exit");return t.appendChild(s),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?(s.remove(),t.appendChild(o),t.title="Click to enter fullscreen mode"):(o.remove(),t.appendChild(s),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}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 s=Pt("volume_off"),o=Pt("volume_up");return e.application.muted?t.appendChild(s):t.appendChild(o),t.onclick=()=>{e.application.muted?(s.remove(),t.appendChild(o),e.application.muted=!1):(o.remove(),t.appendChild(s),e.application.muted=!0)},t}get qrButton(){return this._qrButton}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(Pt("qr_code")),t.title="Scan this QR code with your phone to open this page",this.hideElementDuringXRSession(t);const s=document.createElement("div");s.style.cssText=`
340
- position: fixed;
341
- display: inline-block;
342
- padding: 0.5rem;
343
- background-color: white;
344
- border-radius: 0.4rem;
345
- cursor: pointer;
346
- z-index: 1000;
347
- box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
348
- `;const o=document.createElement("div");o.classList.add("qr-code-container"),s.appendChild(o),t.addEventListener("click",()=>{if(s.parentNode)return l();F()&&window.location.href.includes("://localhost")&&be("To access your website from another device in the same local network you have to use the IP address instead of localhost. The IP address is logged in your development server console when you start the server."),r()});async function r(){await c(),document.body.appendChild(s);const h=o.getBoundingClientRect(),d=t.getBoundingClientRect();s.style.left=d.left+d.width*.5-h.width*.5+"px";const u=d.top<h.height,p="1.3rem";u?s.style.top=`calc(${d.bottom}px + ${s.style.padding} + 0.0rem)`:s.style.top=`calc(${d.top-h.height}px - ${s.style.padding} - ${p})`,s.style.opacity="0",s.style.pointerEvents="all",s.style.transition="opacity 0.2s ease-in-out",setTimeout(()=>{s.style.opacity="1",window.addEventListener("click",l,{once:!0})}),window.addEventListener("resize",l),window.addEventListener("scroll",l),document.fullscreenElement?document.fullscreenElement.appendChild(s):document.body.appendChild(s)}function l(){s.style.pointerEvents="none",s.style.transition="opacity 0.2s",s.style.opacity="0",setTimeout(()=>{var h;return(h=s.parentNode)==null?void 0:h.removeChild(s)},500),window.removeEventListener("click",l),window.removeEventListener("resize",l),window.removeEventListener("scroll",l)}async function c(){const h=await nb({text:e.qrButtonUrl,width:200,height:200});o.innerHTML="",o.appendChild(h)}return t.addEventListener("pointerenter",()=>{c()},{once:!0}),t}hideElementDuringXRSession(e){kd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),ug(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}};a(Lw,"_instance");let xo=Lw;function ou(n,e){const t=e?.element||document.head,s=Array.from(t.querySelectorAll(`link[rel=stylesheet][href*='${n}']`));if(s.length<=0){const o=document.createElement("link");o.href=n,o.rel="stylesheet",t.appendChild(o),s.push(o)}if(e!=null&&e.loadedCallback)for(let o=0;o<s.length;o++)e!=null&&e.loadedCallback&&s[o].addEventListener("load",e.loadedCallback)}function jw(){ou("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap")}const gf="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block",ru="needle-logo-element";class Dw extends HTMLElement{constructor(){super(),a(this,"_root"),a(this,"wrapper"),a(this,"logoElement",document.createElement("img")),a(this,"textElement",document.createElement("span")),this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
349
- :host {
350
- position: relative;
351
- min-width: fit-content;
352
- /* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
353
- display: flex;
354
- }
355
-
356
- .wrapper {
357
- position: relative;
358
- display: grid;
359
- grid-template-columns: auto auto;
360
- padding: .1rem;
361
- }
362
- .wrapper:hover {
363
- cursor: pointer;
364
- }
365
- img {
366
- width: 95px;
367
- height: 100%;
368
- align-self: end;
369
- margin-left: 0.6rem;
370
- }
371
- span {
372
- font-size: 1rem;
373
- white-space: nowrap;
374
- }
375
- </style>
376
- <div class="wrapper">
377
- <img class="logo" src=${PO} />
378
- </div>
379
- `,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")}static get elementName(){return ru}static create(){return document.createElement(ru)}setLogoVisible(e){this.logoElement.style.display=e?"block":"none"}}customElements.get(ru)||customElements.define(ru,Dw);const ff=C("debugspatialmenu");class uR{constructor(e,t){a(this,"_context"),a(this,"needleMenu"),a(this,"htmlButtonsMap",new Map),a(this,"enabled",!0),a(this,"userRequestedMenu",!1),a(this,"uiisDirty",!1),a(this,"_showNeedleLogo"),a(this,"_wasInXR",!1),a(this,"preRender",()=>{var r;if(!this.enabled){(r=this.menu)==null||r.removeFromParent();return}ff&&Y.isDesktop()&&this.updateMenu();const l=this._context.xr;if(!(l!=null&&l.running)){this._wasInXR&&(this._wasInXR=!1,this.onExitXR());return}this._wasInXR||(this._wasInXR=!0,this.onEnterXR()),this.updateMenu()}),a(this,"_menuTarget",new A),a(this,"positionFilter",new qm(90,.5)),a(this,"familyName","Needle Spatial Menu"),a(this,"menu"),a(this,"_poweredByNeedleElement");var s;this._context=e,this._context.pre_render_callbacks.push(this.preRender),this.needleMenu=t;const o=(s=this.needleMenu.shadowRoot)==null?void 0:s.querySelector(".options");o?new MutationObserver(r=>{if(this.enabled&&!(this._context.isInXR==!1&&!ff))for(const l of r)l.type==="childList"&&(l.addedNodes.forEach(c=>{this.createButtonFromHTMLNode(c)}),l.removedNodes.forEach(c=>{const h=c,d=this.htmlButtonsMap.get(h);d&&(this.htmlButtonsMap.delete(h),d.remove(),Re.update())}))}).observe(o,{childList:!0}):console.error("Could not find options container in needle menu")}setEnabled(e){var t;this.enabled=e,e||(t=this.menu)==null||t.removeFromParent()}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)}markDirty(){this.uiisDirty=!0}showNeedleLogo(e){this._showNeedleLogo=e}onEnterXR(){var e;const t=(e=this.needleMenu.shadowRoot)==null?void 0:e.querySelector(".options");t&&t.childNodes.forEach(s=>{this.createButtonFromHTMLNode(s)})}onExitXR(){var e;(e=this.menu)==null||e.removeFromParent()}createButtonFromHTMLNode(e){const t=this.getMenu(),s=this.htmlButtonsMap.get(e);if(s){s.add();return}if(e instanceof HTMLButtonElement){const o=this.createButton(t,e);this.htmlButtonsMap.set(e,o),o.add()}else e instanceof HTMLSlotElement&&e.assignedNodes().forEach(o=>{this.createButtonFromHTMLNode(o)})}updateMenu(){var e,t;const s=this.getMenu();this.handleNeedleWatermark(),this._context.scene.add(s);const o=this._context.mainCamera,r=this._context.xr,l=r?.rigScale||1;if(o){const c=o.worldPosition,h=o.worldForward.multiplyScalar(-1),d=h.y>.6,u=h.y>.4,p=(s.visible?u:d)||this.userRequestedMenu,g=!s.visible&&p;s.visible=p||Y.isDesktop()&&ff,h.multiplyScalar(3*l),c.add(h),g&&(s.position.copy(this._menuTarget.position),s.position.y+=.25,this._menuTarget.position.copy(s.position),this.positionFilter.reset(s.position),s.quaternion.copy(this._menuTarget.quaternion),this.markDirty());const f=this._menuTarget.position.distanceTo(c);(g||f>1.5*l)&&(this.ensureRenderOnTop(this.menu),this._menuTarget.position.copy(c),this._context.scene.add(this._menuTarget),Xl(this._menuTarget,this._context.mainCamera,!0,!0),this._menuTarget.removeFromParent()),this.positionFilter.filter(this._menuTarget.position,s.position,this._context.time.time),(e=this.menu)==null||e.quaternion.slerp(this._menuTarget.quaternion,this._context.time.deltaTime*5),(t=this.menu)==null||t.scale.setScalar(l)}this.uiisDirty&&(this.uiisDirty=!1,Re.update())}ensureRenderOnTop(e,t=0){e instanceof X&&(e.material.depthTest=!1,e.material.depthWrite=!1),e.renderOrder=1e3+t*2;for(const s of e.children)this.ensureRenderOnTop(s,t+1)}get isVisible(){var e;return(e=this.menu)==null?void 0:e.visible}getMenu(){if(this.menu)return this.menu;this.ensureFont(),this.menu=new Re.Block({boxSizing:"border-box",fontFamily:this.familyName,height:"auto",fontSize:.1,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:.55,borderRadius:1,whiteSpace:"pre-wrap",flexDirection:"row",alignItems:"center",padding:new ye(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=R.get("ObjectRaycaster");return e&&xr(this.menu,new e),this.menu}handleNeedleWatermark(){var e;if(!this._poweredByNeedleElement){this._poweredByNeedleElement=new Re.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 t=new Bw(this._context,()=>globalThis.open("https://needle.tools","_self"));xr(this._poweredByNeedleElement,t);const s=new Re.Text({textContent:"Powered by",width:"auto",height:"auto"}),o=new Re.Text({textContent:"needle",width:"auto",height:"auto",fontSize:.07,margin:new ye(0,0,0,.02)});this._poweredByNeedleElement.add(s),this._poweredByNeedleElement.add(o),(e=this.menu)==null||e.add(this._poweredByNeedleElement),this.markDirty(),new fa().load("./include/needle/poweredbyneedle.webp",r=>{var l;t.allowModifyUI=!1,s.removeFromParent(),o.removeFromParent();const c=r.image.width/r.image.height;(l=this._poweredByNeedleElement)==null||l.set({backgroundImage:r,backgroundOpacity:1,width:.1*c,height:.1}),this.markDirty()})}if(this.menu){const t=this.menu.children.indexOf(this._poweredByNeedleElement);if(!this._showNeedleLogo&&Xs())t>=0&&(this._poweredByNeedleElement.removeFromParent(),this.markDirty());else{this._poweredByNeedleElement.visible=!0,this.menu.add(this._poweredByNeedleElement);const s=this.menu.children.indexOf(this._poweredByNeedleElement);t!==s&&this.markDirty()}}}ensureFont(){let e=Re.FontLibrary.getFontFamily(this.familyName);if(!e){e=Re.FontLibrary.addFontFamily(this.familyName);const t=e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png");t?.addEventListener("ready",()=>{this.markDirty()})}}createButton(e,t){const s=new Re.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}),o=new Re.Text({textContent:"",width:"auto",justifyContent:"center",alignItems:"center",backgroundOpacity:0,backgroundColor:16777215,fontFamily:this.familyName,color:0,borderRadius:.02,padding:.01});s.add(o),s["needle:use_eventsystem"]=!0;const r=new Bw(this._context,()=>t.click());return xr(s,r),new pR(this,e,t,s,o)}}class pR{constructor(e,t,s,o,r){a(this,"menu"),a(this,"root"),a(this,"htmlbutton"),a(this,"spatialContainer"),a(this,"spatialText"),a(this,"spatialIcon"),a(this,"_lastText",""),a(this,"_lastTexture"),this.menu=e,this.root=t,this.htmlbutton=s,this.spatialContainer=o,this.spatialText=r,new MutationObserver(l=>{for(const c of l)c.type==="attributes"?c.attributeName==="style"&&this.updateVisible():c.type==="childList"&&this.updateText()}).observe(s,{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()}updateText(){let e="",t="";this.htmlbutton.childNodes.forEach(s=>{s.nodeType===Node.TEXT_NODE?e+=s.textContent:s instanceof HTMLElement&&Iw(s)&&s.textContent&&(t=s.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)}async createIcon(e){var t;if(!this.spatialIcon){const o=await mf(e);if(o&&!this.spatialIcon){const r=new Re.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:o,backgroundOpacity:1,margin:new ye(0,.005,0,0)});this.spatialIcon=r,this.spatialContainer.add(r),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const o=await mf(e);o&&((t=this.spatialIcon)==null||t.set({backgroundImage:o}),this.menu.markDirty())}const s=this.spatialContainer.children.indexOf(this.spatialIcon);s>0&&(this.spatialContainer.children.splice(s,1),this.spatialContainer.children.unshift(this.spatialIcon),this.menu.markDirty())}}class Bw{constructor(e,t){a(this,"isComponent",!0),a(this,"enabled",!0),a(this,"gameObject"),a(this,"allowModifyUI",!0),a(this,"context"),a(this,"onclick"),this.context=e,this.onclick=t}get activeAndEnabled(){return!0}__internalAwake(){}__internalEnable(){}__internalDisable(){}__internalStart(){}onEnable(){}onDisable(){}get element(){return this.gameObject}onPointerEnter(){this.context.input.setCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:1}),Re.update())}onPointerExit(){this.context.input.unsetCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:0}),Re.update())}onPointerDown(e){e.use()}onPointerUp(e){e.use()}onPointerClick(e){e.use(),this.onclick()}}const Mr="needle-menu",xc=C("debugmenu"),Fw=C("debugnoncommercial");let mR=class{constructor(n){a(this,"_context"),a(this,"_menu"),a(this,"_spatialMenu"),a(this,"onPostMessage",e=>{if(e.origin===globalThis.location.origin&&typeof e.data=="object"){const t=e.data,s=t.type;if(s==="needle:menu"){const o=t.button;if(o){if(!o.label)return console.error("NeedleMenu: buttoninfo.label is required");if(!o.onclick)return console.error("NeedleMenu: buttoninfo.onclick is required");const r=document.createElement("button");if(r.textContent=o.label,o.icon){const l=Pt(o.icon);r.prepend(l)}o.priority&&r.setAttribute("priority",o.priority.toString()),r.onclick=()=>{if(o.onclick){const l=o.onclick.startsWith("http")||o.onclick.startsWith("www."),c=o.target||"_blank";l?globalThis.open(o.onclick,c):console.error("NeedleMenu: onclick is not a valid link",o.onclick)}},this._menu.appendChild(r)}else xc&&console.error("NeedleMenu: unknown postMessage event",t)}else xc&&console.warn("NeedleMenu: unknown postMessage type",s,t)}}),a(this,"onStartXR",e=>{e.session.isScreenBasedAR&&(this._menu.previousParent=this._menu.parentNode,this._context.arOverlayElement.appendChild(this._menu),e.session.session.addEventListener("end",this.onExitXR),this._menu.closeFoldout())}),a(this,"onExitXR",()=>{this._menu.previousParent&&(this._menu.previousParent.appendChild(this._menu),delete this._menu.previousParent)}),a(this,"_muteButton"),a(this,"_fullscreenButton"),this._menu=Uw.getOrCreate(n.domElement,n),this._context=n,this._spatialMenu=new uR(n,this._menu),window.addEventListener("message",this.onPostMessage),kd(this.onStartXR)}onDestroy(){window.removeEventListener("message",this.onPostMessage),this._menu.remove(),this._spatialMenu.onDestroy()}setPosition(n){this._menu.setPosition(n)}setVisible(n){this._menu.setVisible(n)}showNeedleLogo(n){var e;this._menu.showNeedleLogo(n),(e=this._spatialMenu)==null||e.showNeedleLogo(n)}get logoIsVisible(){return this._menu.logoIsVisible}showSpatialMenu(n){this._spatialMenu.setEnabled(n)}setSpatialMenuVisible(n){this._spatialMenu.setDisplay(n)}get spatialMenuIsVisible(){return this._spatialMenu.isVisible}showQRCodeButton(n){if(n==="desktop-only"&&(n=!Y.isMobileDevice()),n){const e=xo.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=xo.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(n){var e;if(!n){(e=this._muteButton)==null||e.remove();return}this._muteButton=xo.getOrCreate().createMuteButton(this._context),this._muteButton.setAttribute("priority","100"),this._menu.appendChild(this._muteButton)}showFullscreenOption(n){var e;if(!n){(e=this._fullscreenButton)==null||e.remove();return}this._fullscreenButton=xo.getOrCreate().createFullscreenButton(this._context),this._fullscreenButton&&(this._fullscreenButton.setAttribute("priority","150"),this._menu.appendChild(this._fullscreenButton))}appendChild(n){return this._menu.appendChild(n)}};var au;const gR=class iC extends HTMLElement{constructor(){var e,t,s,o,r,l;super(),a(this,"_domElement",null),a(this,"_context",null),a(this,"_sizeChangeInterval"),Fs(this,au,v=>{if(!v.defaultPrevented&&v.target==this._domElement&&v instanceof PointerEvent&&v.button===0&&this.root.classList.contains("open")){const b=this.foldout.getBoundingClientRect(),_=v;_.clientX>b.left&&_.clientX<b.right&&_.clientY>b.top&&_.clientY<b.bottom||this.root.classList.toggle("open",!1)}}),a(this,"_userRequestedLogoVisible"),a(this,"_userRequestedMenuVisible"),a(this,"root"),a(this,"wrapper"),a(this,"options"),a(this,"logoContainer"),a(this,"compactMenuButton"),a(this,"foldout"),a(this,"_isHandlingChange",!1),a(this,"_didSort",new Map),a(this,"_lastAvailableWidthChange",0),a(this,"_timeoutHandle",0),a(this,"handleSizeChange",(v,b)=>{if(!this._domElement)return;const _=this._domElement.clientWidth;if(_<100){clearTimeout(this._timeoutHandle),this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style");return}const w=20*2,x=_-w;if(!b&&Math.abs(x-this._lastAvailableWidthChange)<1)return;this._lastAvailableWidthChange=x,clearTimeout(this._timeoutHandle),this._timeoutHandle=setTimeout(()=>{const T=k();T<0?(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")):T>0&&(this.root.classList.remove("compact"),this.foldout.classList.remove("floating-panel-style"),k()<0&&(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")))},5);const M=()=>this.options.clientWidth+this.logoContainer.clientWidth,k=()=>x-M()});const c=document.createElement("template");c.innerHTML=`<style>
380
-
381
- #root {
382
- position: absolute;
383
- width: auto;
384
- max-width: 95%;
385
- left: 50%;
386
- transform: translateX(-50%);
387
- top: min(20px, 10vh);
388
- padding: 0.3rem;
389
- display: flex;
390
- visibility: visible;
391
- flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
392
- pointer-events: all;
393
- z-index: 1000;
394
- }
395
-
396
- /** hide the menu if it's empty **/
397
- #root.has-no-options.logo-hidden {
398
- display: none;
399
- }
400
-
401
- /** using a div here because then we can change the class for placement **/
402
- #root.bottom {
403
- top: auto;
404
- bottom: min(30px, 10vh);
405
- }
406
- #root.top {
407
- top: calc(.7rem + env(safe-area-inset-top));
408
- }
409
-
410
- .wrapper {
411
- position: relative;
412
- display: flex;
413
- flex-direction: row;
414
- justify-content: center;
415
- align-items: stretch;
416
- gap: 0px;
417
- padding: 0 0rem;
418
- }
419
-
420
- .wrapper > *, .options > button, .options > select, ::slotted(*) {
421
- position: relative;
422
- border: none;
423
- border-radius: 0;
424
- outline: 1px solid rgba(0,0,0,0);
425
- display: flex;
426
- justify-content: center;
427
- align-items: center;
428
- max-height: 2.3rem;
429
- max-width: 100%;
430
-
431
- /** basic font settings for all entries **/
432
- font-size: 1rem;
433
- font-family: 'Roboto Flex', sans-serif;
434
- font-optical-sizing: auto;
435
- font-weight: 500;
436
- font-weight: 200;
437
- font-variation-settings: "wdth" 100;
438
- color: rgb(20,20,20);
439
- }
440
-
441
- .options > select[multiple]:hover {
442
- max-height: 300px;
443
- }
444
-
445
- .floating-panel-style {
446
- background: rgba(255, 255, 255, .4);
447
- outline: rgb(0 0 0 / 5%) 1px solid;
448
- border: 1px solid rgba(255, 255, 255, .1);
449
- box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
450
- border-radius: 1.5rem;
451
- /**
452
- * to make nested background filter work
453
- * https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
454
- **/
455
- &::before {
456
- content: '';
457
- position: absolute;
458
- width: 100%;
459
- height: 100%;
460
- top: 0;
461
- left: 0;
462
- z-index: -1;
463
- border-radius: 1.5rem;
464
- -webkit-backdrop-filter: blur(8px);
465
- backdrop-filter: blur(8px);
466
- }
467
- }
468
-
469
- a {
470
- color: inherit;
471
- text-decoration: none;
472
- }
473
-
474
- .options {
475
- display: flex;
476
- flex-direction: row;
477
- align-items: center;
478
- }
479
-
480
- .options > *, ::slotted(*) {
481
- max-height: 2.25rem;
482
- padding: .4rem .5rem;
483
- }
484
-
485
- :host .options > *, ::slotted(*) {
486
- background: transparent;
487
- border: none;
488
- white-space: nowrap;
489
- transition: all 0.1s linear .02s;
490
- border-radius: 1.5rem;
491
- user-select: none;
492
- }
493
- :host .options > *:hover, ::slotted(*:hover) {
494
- cursor: pointer;
495
- color: black;
496
- background: rgba(245, 245, 245, .8);
497
- box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
498
- outline: rgba(0,0,0,.1) 1px solid;
499
- }
500
- :host .options > *:active, ::slotted(*:active) {
501
- background: rgba(255, 255, 255, .8);
502
- 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);
503
- transition: all 0.05s linear;
504
- }
505
- :host .options > *:focus, ::slotted(*:focus) {
506
- outline: rgba(255,255,255,.5) 1px solid;
507
- }
508
- :host .options > *:focus-visible, ::slotted(*:focus-visible) {
509
- outline: rgba(0,0,0,.5) 1px solid;
510
- }
511
-
512
- :host .options > *:disabled, ::slotted(*:disabled) {
513
- background: rgba(0,0,0,.05);
514
- color: rgba(60,60,60,.7);
515
- pointer-events: none;
516
- }
517
-
518
- button, ::slotted(button) {
519
- gap: 0.3rem;
520
- }
521
-
522
- /** XR button animation **/
523
- :host button.this-mode-is-requested {
524
- background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
525
- background-size: 200% auto;
526
- background-position: 0 100%;
527
- animation: AnimationName .7s ease infinite forwards;
528
- }
529
- :host button.other-mode-is-requested {
530
- opacity: .5;
531
- }
532
-
533
- @keyframes AnimationName {
534
- 0% { background-position: 0% 0 }
535
- 100% { background-position: -200% 0 }
536
- }
537
-
538
-
539
-
540
-
541
- .logo {
542
- cursor: pointer;
543
- padding-left: 0.6rem;
544
- padding-bottom: .02rem;
545
- margin-right: 0.5rem;
546
- }
547
- .logo-hidden {
548
- .logo {
549
- display: none;
550
- }
551
- }
552
- :host .has-options .logo {
553
- border-left: 1px solid rgba(40,40,40,.4);
554
- margin-left: 0.3rem;
555
- margin-right: 0.5rem;
556
- }
557
-
558
- .logo > span {
559
- white-space: nowrap;
560
- }
561
-
562
-
563
-
564
- /** COMPACT */
565
-
566
- /** Hide the menu button normally **/
567
- .compact-menu-button { display: none; }
568
- /** And show it when we're in compact mode **/
569
- .compact .compact-menu-button {
570
- position: relative;
571
- display: block;
572
- background: none;
573
- border: none;
574
- border-radius: 2rem;
575
-
576
- margin: 0;
577
- padding: 0 .3rem;
578
- padding-top: .2rem;
579
-
580
- z-index: 100;
581
-
582
- color: #000;
583
-
584
- &:hover {
585
- background: rgba(255,255,255,.2);
586
- cursor: pointer;
587
- }
588
- &:focus {
589
- outline: 1px solid rgba(255,255,255,.5);
590
- }
591
- &:focus-visible {
592
- outline: 1px solid rgba(0,0,0,.5);
593
- }
594
- & .expanded-click-area {
595
- position: absolute;
596
- left: 0;
597
- right: 0;
598
- top: 10%;
599
- bottom: 10%;
600
- transform: scale(1.8);
601
- }
602
- }
603
- .has-no-options .compact-menu-button {
604
- display: none;
605
- }
606
- .open .compact-menu-button {
607
- background: rgba(255,255,255,.2);
608
- }
609
- .logo-visible .compact-menu-button {
610
- margin-left: .2rem;
611
- }
612
-
613
- /** Open and hide menu **/
614
- .compact .foldout {
615
- display: none;
616
- }
617
- .open .options, .open .foldout {
618
- display: flex;
619
- justify-content: center;
620
- }
621
- .compact .wrapper {
622
- padding: 0;
623
- }
624
- .compact .wrapper, .compact .options {
625
- height: auto;
626
- max-height: initial;
627
- flex-direction: row;
628
- gap: .12rem;
629
- }
630
- .compact .options {
631
- flex-wrap: wrap;
632
- gap: .3rem;
633
- }
634
- .compact .top .options {
635
- height: auto;
636
- flex-direction: row;
637
- }
638
- .compact .bottom .wrapper {
639
- height: auto;
640
- flex-direction: column;
641
- }
642
-
643
- .compact .foldout {
644
- max-height: min(100ch, calc(100vh - 100px));
645
- overflow: auto;
646
- overflow-x: hidden;
647
- align-items: center;
648
-
649
- position: fixed;
650
- bottom: calc(100% + 5px);
651
- z-index: 100;
652
- width: auto;
653
- left: .2rem;
654
- right: .2rem;
655
- padding: .2rem;
656
-
657
- }
658
- .compact.logo-hidden .foldout {
659
- /** for when there's no logo we want to center the foldout **/
660
- min-width: 24ch;
661
- margin-left: 50%;
662
- transform: translateX(calc(-50% - .2rem));
663
- }
664
-
665
- .compact.top .foldout {
666
- top: calc(100% + 5px);
667
- bottom: auto;
668
- }
669
-
670
- ::-webkit-scrollbar {
671
- max-width: 7px;
672
- background: rgba(100,100,100,.2);
673
- border-radius: .2rem;
674
- }
675
- ::-webkit-scrollbar-thumb {
676
- background: rgba(255, 255, 255, .3);
677
- border-radius: .2rem;
678
- }
679
- ::-webkit-scrollbar-thumb:hover {
680
- background: rgb(150,150,150);
681
- }
682
-
683
- .compact .options > *, .compact .options > ::slotted(*) {
684
- font-size: 1.2rem;
685
- padding: .6rem .5rem;
686
- width: 100%;
687
- }
688
- .compact.has-options .logo {
689
- border: none;
690
- padding-left: 0;
691
- margin-left: 1rem;
692
- margin-bottom: .02rem;
693
- }
694
- .compact .options {
695
- /** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
696
- max-width: 100%;
697
-
698
- & > button, & > select {
699
- display: flex;
700
- flex-basis: 100%;
701
- min-height: 3rem;
702
- }
703
- & > button.row2 {
704
- //border: 1px solid red !important;
705
- display: flex;
706
- flex: 1;
707
- flex-basis: 30%;
708
- }
709
- }
710
-
711
- /** If there's really not enough space then just hide all options **/
712
- @media (max-width: 100px) or (max-height: 100px){
713
- .foldout {
714
- display: none !important;
715
- }
716
- .compact-menu-button {
717
- display: none !important;
718
- }
719
- }
720
-
721
- /* dark mode */
722
- /*
723
- @media (prefers-color-scheme: dark) {
724
- :host {
725
- background: rgba(0,0,0, .6);
726
- }
727
- :host button {
728
- color: rgba(200,200,200);
729
- }
730
- :host button:hover {
731
- background: rgba(100,100,100, .8);
732
- }
733
- }
734
- */
735
-
736
- </style>
737
-
738
- <div id="root" class="logo-hidden floating-panel-style bottom">
739
- <div class="wrapper">
740
- <div class="foldout">
741
- <div class="options" part="options">
742
- <slot></slot>
743
- </div>
744
- <div class="options" part="options">
745
- <slot name="end"></slot>
746
- </div>
747
- </div>
748
- <div style="user-select:none" class="logo">
749
- <span class="madewith notranslate">powered by</span>
750
- </div>
751
- </div>
752
- <button class="compact-menu-button">
753
- <div class="expanded-click-area"></div>
754
- </button>
755
- </div>
756
- `;const h=this.attachShadow({mode:"open"});jw(),ou(gf,{loadedCallback:()=>{this.handleSizeChange()}}),ou(gf,{element:h});const d=c.content.cloneNode(!0);h?.appendChild(d),this.root=h.querySelector("#root"),this.wrapper=(e=this.root)==null?void 0:e.querySelector(".wrapper"),this.options=(t=this.root)==null?void 0:t.querySelector(".options"),this.logoContainer=(s=this.root)==null?void 0:s.querySelector(".logo"),this.compactMenuButton=(o=this.root)==null?void 0:o.querySelector(".compact-menu-button"),this.compactMenuButton.append(Pt("more_vert")),this.foldout=(r=this.root)==null?void 0:r.querySelector(".foldout"),(l=this.root)==null||l.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const u=Dw.create();u.style.minHeight="1rem",this.logoContainer.append(u),this.logoContainer.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")});try{window.requestAnimationFrame(()=>xR(v=>{if(v==!0&&Qs()&&!Fw){let b=this._userRequestedLogoVisible;b===void 0&&(b=!1),this.___onSetLogoVisible(b)}else this.___onSetLogoVisible(!0)}))}catch(v){console.error("[Needle Menu] License check failed.",v)}this.compactMenuButton.addEventListener("click",v=>{v.preventDefault(),this.root.classList.toggle("open")});let p=this._context;setTimeout(()=>p=this._context);let g=0;const f=(v,b)=>{var _,w,x;xc&&console.log("Set menu visible",b),p!=null&&p.isInAR&&p.arOverlayElement?v!=p.arOverlayElement&&p.arOverlayElement.appendChild(this):this.parentNode!=((_=this._domElement)==null?void 0:_.shadowRoot)&&((x=(w=this._domElement)==null?void 0:w.shadowRoot)==null||x.appendChild(this)),this.style.display=b?"flex":"none",this.style.visibility="visible",this.style.opacity="1"};let y=!1;new MutationObserver(v=>{var b;if(!y)try{y=!0,this.onChangeDetected(v);const _=this==null?void 0:this.parentNode;if((this.style.display!="flex"||this.style.visibility!="visible"||this.style.opacity!="1"||_!=((b=this._domElement)==null?void 0:b.shadowRoot))&&!Qs()){const w=g++;$t()&&this._userRequestedMenuVisible===!1?(w===0&&f(_,this._userRequestedMenuVisible),w===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.")):w===0?f(_,!0):setTimeout(()=>f(_,!0),5)}}finally{y=!1}}).observe(this.root,{childList:!0,subtree:!0,attributes:!0}),xc&&this.___insertDebugOptions()}static create(){return document.createElement(Mr,{is:Mr})}static getOrCreate(e,t){let s=e.querySelector(Mr);return!s&&e.shadowRoot&&(s=e.shadowRoot.querySelector(Mr)),s||(s=window.document.body.querySelector(Mr)),s||(s=iC.create(),e.shadowRoot?e.shadowRoot.appendChild(s):e.appendChild(s)),s._domElement=e,s._context=t,s}connectedCallback(){window.addEventListener("resize",this.handleSizeChange),this.handleMenuVisible(),this._sizeChangeInterval=setInterval(()=>this.handleSizeChange(void 0,!0),5e3),setTimeout(()=>{var e,t;(e=this._domElement)==null||e.addEventListener("resize",this.handleSizeChange),(t=this._domElement)==null||t.addEventListener("click",fe(this,au))},1)}disconnectedCallback(){var e,t;window.removeEventListener("resize",this.handleSizeChange),clearInterval(this._sizeChangeInterval),(e=this._domElement)==null||e.removeEventListener("resize",this.handleSizeChange),(t=this._context)==null||t.domElement.removeEventListener("click",fe(this,au))}showNeedleLogo(e){this._userRequestedLogoVisible=e,!(!e&&(!Qs()||Fw)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!$t()))&&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)}setVisible(e){this._userRequestedMenuVisible=e,this.style.display=e?"flex":"none"}closeFoldout(){this.root.classList.remove("open")}append(...e){for(const t of e)if(typeof t=="string"){const s=document.createTextNode(t);this.options.appendChild(s)}else this.options.appendChild(t)}appendChild(e){var t;if(!(e instanceof Node)){const s=document.createElement("button");if(s.textContent=e.label,s.onclick=e.onClick,s.setAttribute("priority",((t=e.priority)==null?void 0:t.toString())??"0"),e.title&&(s.title=e.title),e.icon){const o=Pt(e.icon);e.iconSide==="right"?s.appendChild(o):s.prepend(o)}e.class&&s.classList.add(e.class),e=s}return this.options.appendChild(e)}prepend(...e){for(const t of e)if(typeof t=="string"){const s=document.createTextNode(t);this.options.prepend(s)}else this.options.prepend(t)}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((o,r)=>{const l=parseInt(o.getAttribute("priority")||"0"),c=parseInt(r.getAttribute("priority")||"0");return l-c});let s=!1;for(let o=0;o<t.length;o++){const r=this.options.children[o],l=t[o];if(r!==l){s=!0;break}}if(s)for(const o of t)this.options.appendChild(o)}}handleMenuVisible(){xc&&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 s=t.assignedNodes();for(const o of s)if(o instanceof HTMLElement&&o.style.display!="none")return!0}else if(t.style.display!="none")return!0}return!1}___insertDebugOptions(){window.addEventListener("keydown",s=>{s.key==="p"&&this.setPosition(this.root.classList.contains("top")?"bottom":"top")});const e=document.createElement("button");e.textContent="Hide Buttons",e.onclick=()=>{const s=new Array(this.options.children.length);for(let o=0;o<this.options.children.length;o++)s[o]=this.options.children[o];for(const o of s)this.options.removeChild(o);setTimeout(()=>{for(const o of s)this.options.appendChild(o)},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)}};au=new WeakMap;let Uw=gR;customElements.get(Mr)||customElements.define(Mr,Uw);const et=C("debugcontext"),fR=C("stats"),yR=C("debugactive"),vR=C("debugframerate"),bR=C("debugcoroutine"),_R={};class wR{constructor(){a(this,"name"),a(this,"alias"),a(this,"hash"),a(this,"runInBackground"),a(this,"domElement"),a(this,"renderer"),a(this,"camera"),a(this,"scene")}}var Oe=(n=>(n[n.Start=-1]="Start",n[n.EarlyUpdate=0]="EarlyUpdate",n[n.Update=1]="Update",n[n.LateUpdate=2]="LateUpdate",n[n.OnBeforeRender=3]="OnBeforeRender",n[n.OnAfterRender=4]="OnAfterRender",n[n.PrePhysicsStep=9]="PrePhysicsStep",n[n.PostPhysicsStep=10]="PostPhysicsStep",n[n.Undefined=-1]="Undefined",n))(Oe||{});function lu(n,e){if(!n)return;if(!n.isComponent){(F()||et)&&console.error(`Registered script is not a Needle Engine component.
757
- The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
758
- `,n);return}e||(e=J.Current,et&&console.warn("> Registering component without context"));const t=e?.new_scripts;t.includes(n)||t.push(n)}const yf=class Le{constructor(e){a(this,"name"),a(this,"alias"),a(this,"isManagedExternally",!1),a(this,"isPaused",!1),a(this,"runInBackground",!1),a(this,"targetFrameRate"),a(this,"physicsSteps",1),a(this,"hash"),a(this,"domElement"),a(this,"_resolutionScaleFactor",1),a(this,"_boundingClientRectFrame",-1),a(this,"_boundingClientRect",null),a(this,"_domX"),a(this,"_domY"),a(this,"xr",null),a(this,"_xrFrame",null),a(this,"_currentFrameEvent",-1),a(this,"scene"),a(this,"renderer"),a(this,"composer",null),a(this,"scripts",[]),a(this,"scripts_pausedChanged",[]),a(this,"scripts_earlyUpdate",[]),a(this,"scripts_update",[]),a(this,"scripts_lateUpdate",[]),a(this,"scripts_onBeforeRender",[]),a(this,"scripts_onAfterRender",[]),a(this,"scripts_WithCorroutines",[]),a(this,"scripts_immersive_vr",[]),a(this,"scripts_immersive_ar",[]),a(this,"coroutines",{}),a(this,"post_setup_callbacks",[]),a(this,"pre_update_callbacks",[]),a(this,"pre_render_callbacks",[]),a(this,"post_render_callbacks",[]),a(this,"pre_update_oneshot_callbacks",[]),a(this,"new_scripts",[]),a(this,"new_script_start",[]),a(this,"new_scripts_pre_setup_callbacks",[]),a(this,"new_scripts_post_setup_callbacks",[]),a(this,"new_scripts_xr",[]),a(this,"mainCameraComponent"),a(this,"_mainCamera",null),a(this,"_fallbackCamera",null),a(this,"application"),a(this,"animations"),a(this,"time"),a(this,"input"),a(this,"physics"),a(this,"connection"),a(this,"assets"),a(this,"mainLight",null),a(this,"sceneLighting"),a(this,"addressables"),a(this,"lightmaps"),a(this,"players"),a(this,"lodsManager"),a(this,"menu"),a(this,"_needsUpdateSize",!1),a(this,"_isCreated",!1),a(this,"_isCreating",!1),a(this,"_isVisible",!1),a(this,"_stats",fR?new WP:null),a(this,"_intersectionObserver",null),a(this,"_disposeCallbacks",[]),a(this,"maxRenderResolution"),a(this,"_devicePixelRatio","auto"),a(this,"_originalCreationArgs"),a(this,"onUnhandledRejection",o=>{this.onError(o.reason)}),a(this,"_cameraStack",[]),a(this,"_onBeforeRenderListeners",new Map),a(this,"_onAfterRenderListeners",new Map),a(this,"_requireDepthTexture",!1),a(this,"_requireColorTexture",!1),a(this,"_renderTarget"),a(this,"_isRendering",!1),a(this,"_createId",0),a(this,"_renderlooperrors",0),a(this,"_lastTimestamp",0),a(this,"_accumulatedTime",0),a(this,"_dispatchReadyAfterFrame",!1),a(this,"_contextRestoreTries",0),a(this,"_wasPaused",!1),this.name=e?.name||"",this.alias=e?.alias,this.domElement=e?.domElement||document.body,this.hash=e?.hash,e!=null&&e.renderer&&(this.renderer=e.renderer,this.isManagedExternally=!0),e?.runInBackground!==void 0&&(this.runInBackground=e.runInBackground),e!=null&&e.scene?this.scene=e.scene:this.scene=new bi,e!=null&&e.camera&&(this._mainCamera=e.camera),this.application=new En(this),this.time=new Tw,this.input=new $b(this),this.physics=new Lg(this),this.connection=new r_(this),this.assets=new x_,this.sceneLighting=new kw(this),this.addressables=new mw(this),this.lightmaps=new tR(this),this.players=new Cw(this),this.menu=new mR(this),this.lodsManager=new iR(this),this.animations=new ZM(this);const t=()=>this._needsUpdateSize=!0;window.addEventListener("resize",t),this._disposeCallbacks.push(()=>window.removeEventListener("resize",t));const s=new ResizeObserver(o=>this._needsUpdateSize=!0);s.observe(this.domElement),this._disposeCallbacks.push(()=>s.disconnect()),this._intersectionObserver=new IntersectionObserver(o=>{this._isVisible=o[0].isIntersecting}),this._disposeCallbacks.push(()=>{var o;return(o=this._intersectionObserver)==null?void 0:o.disconnect()}),pe.register(this)}static get DefaultTargetFrameRate(){return Le._defaultTargetFramerate.value}static set DefaultTargetFrameRate(e){Le._defaultTargetFramerate.value=e}static get DefaultWebGLRendererParameters(){return Le._defaultWebglRendererParameters}get version(){return bs}static get Current(){return pe.Current}static set Current(e){pe.Current=e}static get All(){return pe.All}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()}}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(){var e,t;return((t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.isPresenting)||!1}get xrSessionMode(){var e;return(e=this.xr)==null?void 0:e.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(){var e,t;return(t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.getSession()}get xrFrame(){return this._xrFrame}get xrCamera(){var e,t;return this.renderer.xr.isPresenting?(t=(e=this.renderer)==null?void 0:e.xr)==null?void 0:t.getCamera():void 0}get arOverlayElement(){const e=this.domElement;return typeof e.getAROverlayContainer=="function"?e.getAROverlayContainer():this.domElement}get currentFrameEvent(){return this._currentFrameEvent}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 we(75,this.domWidth/this.domHeight,.1,1e3)),this._fallbackCamera}set mainCamera(e){this._mainCamera=e}get rendererData(){return this.sceneLighting}get isCreated(){return this._isCreated}createNewRenderer(e){var t,s,o;if((t=this.renderer)==null||t.dispose(),e={...Le.DefaultWebGLRendererParameters,...e},!e.canvas){const r=(o=(s=this.domElement)==null?void 0:s.shadowRoot)==null?void 0:o.querySelector("canvas");r&&(e.canvas=r,et&&console.log("Using canvas from shadow root",r))}return et&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new hr(e),this.renderer.debug.checkShaderErrors=F()||C("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=va,this.renderer.setClearColor(new ae("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=AC,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=Cn,this.renderer.nodes={library:new IC,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),this.renderer}internalOnUpdateVisible(){var e,t;(e=this._intersectionObserver)==null||e.disconnect(),(t=this._intersectionObserver)==null||t.observe(this.domElement)}requestSizeUpdate(){this._needsUpdateSize=!0}get devicePixelRatio(){return this._devicePixelRatio}set devicePixelRatio(e){e!==this._devicePixelRatio&&(this._devicePixelRatio=e,this._needsUpdateSize=!0)}updateSize(e=!1){var t,s,o;if(e||!this.isManagedExternally&&((t=this.renderer.xr)==null?void 0:t.isPresenting)===!1){this._needsUpdateSize=!1;const r=this.resolutionScaleFactor;let l=this.domWidth*r,c=this.domHeight*r;this.maxRenderResolution&&(this.maxRenderResolution.x=Math.max(1,this.maxRenderResolution.x),l=Math.min(this.maxRenderResolution.x,l),this.maxRenderResolution.y=Math.max(1,this.maxRenderResolution.y),c=Math.min(this.maxRenderResolution.y,c));const h=this.mainCamera;this.updateAspect(h),this.renderer.setSize(l,c,!0),this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%";const d=typeof this.devicePixelRatio=="number"?this.devicePixelRatio:this.devicePixelRatio==="auto"?window.devicePixelRatio:void 0;d!==void 0&&this.renderer.setPixelRatio(d),this.composer&&((s=this.composer.setSize)==null||s.call(this.composer,l,c),d!==void 0&&"setPixelRatio"in this.composer&&typeof this.composer.setPixelRatio=="function"&&((o=this.composer.setPixelRatio)==null||o.call(this.composer,window.devicePixelRatio)))}}updateAspect(e,t,s){if(!e)return;t===void 0&&(t=this.domWidth),s===void 0&&(s=this.domHeight);const o=t/s;if(e.isPerspectiveCamera){const r=e,l=r.aspect;r.aspect=o,l!==r.aspect&&e.updateProjectionMatrix()}else if(e.isOrthographicCamera){const r=e,l=r.top-r.bottom,c=l*o/2,h=l/2;(r.left!=-c||r.top!=h)&&(r.left=-c,r.right=c,r.top=h,r.bottom=-h,e.updateProjectionMatrix())}}recreate(){this.clear(),this.create(this._originalCreationArgs)}async onCreate(e){return this.create(e)}async create(e){try{this._isCreating=!0,e!==this._originalCreationArgs&&(this._originalCreationArgs=Hl(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}}onError(e){this.domElement.dispatchEvent(new CustomEvent("error",{detail:e}))}clear(){var e,t,s,o;pe.dispatchCallback(me.ContextClearing,this),Hs(this,me.ContextClearing),Ri(this.scene,!0,!0),this.scene=new bi,(e=this.addressables)==null||e.dispose(),(t=this.lightmaps)==null||t.clear(),(o=(s=this.physics)==null?void 0:s.engine)==null||o.clearCaches(),this.lodsManager.disable(),this._onBeforeRenderListeners.clear(),this._onAfterRenderListeners.clear(),this.isManagedExternally||this.renderer&&(this.renderer.renderLists.dispose(),this.renderer.state.reset(),this.renderer.resetState()),pe.dispatchCallback(me.ContextCleared,this)}dispose(){this.internalOnDestroy()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){var e,t;Le.Current=this,pe.dispatchCallback(me.ContextDestroying,this),Hs(this,me.ContextDestroying),this.clear(),(e=this.renderer)==null||e.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(et&&console.log("Disposing renderer"),this.renderer.dispose())),this.scene=null,this.renderer=null,this.input.dispose(),this.menu.onDestroy(),this.animations.onDestroy();for(const s of this._disposeCallbacks)try{s()}catch(o){console.error("Error in on dispose callback:",o,s)}(t=this.domElement)!=null&&t.parentElement&&this.domElement.parentElement.removeChild(this.domElement),this._isCreated=!1,pe.dispatchCallback(me.ContextDestroyed,this),Hs(this,me.ContextDestroyed),pe.unregister(this),Le.Current===this&&(Le.Current=null)}registerCoroutineUpdate(e,t,s){return typeof t?.next!="function"?(console.error("Registered invalid coroutine function from "+e.name+`
759
- Coroutine functions must be generators: "*myCoroutine() {...}"
760
- Start a coroutine from a component by calling "this.startCoroutine(myCoroutine())"`),t):(this.coroutines[s]||(this.coroutines[s]=[]),this.coroutines[s].push({comp:e,main:t}),t)}unregisterCoroutineUpdate(e,t){if(!this.coroutines[t])return;const s=this.coroutines[t].findIndex(o=>o.main===e);s>=0&&this.coroutines[t].splice(s,1)}stopAllCoroutinesFrom(e){for(const t in this.coroutines){const s=this.coroutines[t];for(let o=s.length-1;o>=0;o--)s[o].comp===e&&s.splice(o,1)}}setCurrentCamera(e){var t;if(!e)return;if(e.threeCamera||e.buildCamera(),!e.threeCamera){console.warn("Camera component is missing camera",e);return}const s=this._cameraStack.indexOf(e);s>=0&&this._cameraStack.splice(s,1),this._cameraStack.push(e),this.mainCameraComponent=e;const o=e.threeCamera;o.isPerspectiveCamera&&this.updateAspect(o),(t=this.mainCameraComponent)==null||t.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 s=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(s)}}addBeforeRenderListener(e,t){if(!this._onBeforeRenderListeners.has(e.uuid)){const s=[];this._onBeforeRenderListeners.set(e.uuid,s),e.onBeforeRender=this._createRenderCallbackWrapper(s)}this._onBeforeRenderListeners.get(e.uuid).push(t)}removeBeforeRenderListener(e,t){if(this._onBeforeRenderListeners.has(e.uuid)){const s=this._onBeforeRenderListeners.get(e.uuid),o=s.indexOf(t);o>=0&&s.splice(o,1)}}addAfterRenderListener(e,t){var s;if(!this._onAfterRenderListeners.has(e.uuid)){const o=[];this._onAfterRenderListeners.set(e.uuid,o),e.onAfterRender=this._createRenderCallbackWrapper(o)}(s=this._onAfterRenderListeners.get(e.uuid))==null||s.push(t)}removeAfterRenderListener(e,t){if(this._onAfterRenderListeners.has(e.uuid)){const s=this._onAfterRenderListeners.get(e.uuid),o=s.indexOf(t);o>=0&&s.splice(o,1)}}_createRenderCallbackWrapper(e){return(t,s,o,r,l,c)=>{for(let h=0;h<e.length;h++){const d=e[h];d(t,s,o,r,l,c)}}}get isRendering(){return this._isRendering}setRequireDepth(e){this._requireDepthTexture=e}setRequireColor(e){this._requireColorTexture=e}get depthTexture(){var e;return((e=this._renderTarget)==null?void 0:e.depthTexture)||null}get opaqueColorTexture(){var e;return((e=this._renderTarget)==null?void 0:e.texture)||null}get isVisibleToUser(){if(this.isInXR)return!0;if(!this._isVisible)return!1;const e=getComputedStyle(this.domElement);return e.visibility!=="hidden"&&e.display!=="none"&&e.opacity!=="0"}async internalOnCreate(e){var t,s,o,r,l,c,h,d;const u=++this._createId;et&&console.log("Creating context",this.name,e);const p=globalThis["needle:dependencies:ready"];p instanceof Promise&&(et&&console.log("Waiting for dependencies to be ready"),await p.catch(_=>{if(et||F()){if(Zl("Needle Engine dependencies failed to load. Please check the console for more details"),_ instanceof ReferenceError){let w="YourComponentName";const x=_.message.indexOf("'");if(x>0){const M=_.message.indexOf("'",x+1);if(M>0){const k=_.message.substring(x+1,M);k.length>3&&(w=k)}}console.error(`Needle Engine dependencies failed to load:
761
-
762
- # Make sure you don't have circular imports in your scripts!
763
-
764
- Possible solutions:
765
- \u2192 Replace @serializable(${w}) in your script with @serializable(Behaviour)
766
- \u2192 If you only need type information try importing the type only, e.g: import { type ${w} }
767
-
768
- ---`,_);return}console.error("Needle Engine dependencies failed to load",_)}}).then(()=>{et&&console.log("Needle Engine dependencies are ready")})),this.clear();const g=this.renderer,f=!g||g.isDisposed===!0;this.isManagedExternally===!1&&f?this.createNewRenderer():this.lodsManager.setRenderer(this.renderer),(t=this.renderer)==null||t.setAnimationLoop(null),await fs(1),Le.Current=this,await pe.dispatchCallback(me.ContextCreationStart,this);let y=!0,v;try{Le.Current=this,e?v=await this.internalLoadInitialContent(u,e):v=[]}catch(_){console.error(_),y=!1}if(!y)return this.onError("Failed to load initial content"),!1;if(u!==this._createId||(s=e?.abortSignal)!=null&&s.aborted)return!1;if(this.internalOnUpdateVisible(),!this.renderer)return et&&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),Le.Current=this,Le.Current=this;for(let _=0;_<this.new_scripts.length;_++){const w=this.new_scripts[_];if(w.gameObject!==void 0&&w.gameObject!==null){w.gameObject.userData===void 0&&(w.gameObject.userData={}),w.gameObject.userData.components===void 0&&(w.gameObject.userData.components=[]);const x=w.gameObject.userData.components;x.includes(w)||x.push(w)}}if(this.post_setup_callbacks)for(let _=0;_<this.post_setup_callbacks.length;_++)Le.Current=this,await this.post_setup_callbacks[_](this);if(!this._mainCamera){Le.Current=this;let _=null;Or(this.scene,w=>{const x=w;if(x!=null&&x.isCamera){if(dc(x.gameObject),!x.activeAndEnabled)return;if(x.tag==="MainCamera")return _=x,!0;_=x}}),_?this.setCurrentCamera(_):!pe.dispatchCallback(me.MissingCamera,this,{files:v})&&!this.mainCamera&&!this.isManagedExternally&&console.warn("Missing camera in main scene",this)}this.input.bindEvents(),Le.Current=this,zd(this),this.physics.engine&&((o=this.physics.engine)==null||o.step(0),(r=this.physics.engine)==null||r.postStep()),!this.isManagedExternally&&this.composer&&this.mainCamera,this._needsUpdateSize=!0,this._stats&&(this._stats.showPanel(0),this._stats.dom.style.position="absolute",(l=this.domElement.shadowRoot)==null||l.appendChild(this._stats.dom)),et&&xd(this.scene,!0),this.targetFrameRate===void 0?(et&&console.warn("No target framerate set, using default",Le.DefaultTargetFrameRate),this.targetFrameRate=Le._defaultTargetFramerate):et&&console.log("Target framerate set to",this.targetFrameRate),this._dispatchReadyAfterFrame=!0;const b=pe.dispatchCallback(me.ContextCreated,this,{files:v});return b&&("internalSetLoadingMessage"in this.domElement&&typeof this.domElement.internalSetLoadingMessage=="function"&&((c=this.domElement)==null||c.internalSetLoadingMessage("finish loading")),await b),(h=e?.abortSignal)!=null&&h.aborted?!1:(Hs(this,me.ContextCreated),et&&console.log("Context Created...",this.renderer,this.renderer.domElement),this._isCreating=!1,!this.isManagedExternally&&!((d=e?.abortSignal)!=null&&d.aborted)&&this.restartRenderLoop(),!0)}async internalLoadInitialContent(e,t){var s,o,r,l;const c=new Array;if(t.files.length===0)return c;const h=[...t.files],d={name:"",progress:null,index:0,count:h.length},u=_s(),p=0;for(let g=0;g<h.length;g++){if((s=t.abortSignal)!=null&&s.aborted){et&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){et&&console.log("Aborting loading because create id changed",e,this._createId);break}const f=h[g];(o=t?.onLoadingStart)==null||o.call(this,g,f),et&&console.log("Context Load "+f);const y=await u.loadSync(this,f,f,p,v=>{var b,_;(b=t.abortSignal)!=null&&b.aborted||(d.name=f,d.progress=v,d.index=g,d.count=h.length,(_=t.onLoadingProgress)==null||_.call(this,d))});(r=t?.onLoadingFinished)==null||r.call(this,g,f,y??null),y?c.push({src:f,file:y}):console.warn("Could not load file: "+f)}if(e!==this._createId||(l=t.abortSignal)!=null&&l.aborted){et&&console.log("Aborting loading because create id changed or abort signal was set",e,this._createId);for(const g of c)if(g&&g.file)for(const f of g.file.scenes)Ri(f,!0,!0)}else{let g=!1;for(const f of c)f&&f.file&&(f.file.scene?(g=!0,this.scene.add(f.file.scene)):console.warn("No scene found in loaded file"));if(!g){for(const f of c)if(f&&f.file&&"parser"in f.file){let y=0;if(!Array.isArray(f.file.parser.json.materials))continue;for(let v=0;v<f.file.parser.json.materials.length;v++){const b=await f.file.parser.getDependency("material",v),_=new A;_.position.x=v*1.1,_.position.y=y,this.scene.add(_),vo.createPrimitive("ShaderBall",{parent:_,material:b})}y+=1}}}return c}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)}update(e,t){if(t===void 0&&(t=null),F()||et||vM())try{this.internalStep(e,t),this._renderlooperrors=0}catch(s){this._renderlooperrors+=1,(F()||et)&&(s instanceof Error||s instanceof TypeError)&&De("Caught unhandled exception during render-loop - see console for details.",Ci.Error),console.error("Frame #"+this.time.frame+`
769
- `,s),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null)),this.domElement.dispatchEvent(new CustomEvent("error",{detail:s}))}else this.internalStep(e,t)}updatePhysics(e){this.internalUpdatePhysics(e)}internalStep(e,t){this.internalOnBeforeRender(e,t)!==!1&&(this.internalOnRender(),this.internalOnAfterRender())}internalOnBeforeRender(e,t){var s;this.renderer.info.autoReset=!!t,this.renderer.info.autoReset===!1&&this.renderer.info.reset();const o=t!==null&&this._xrFrame===null;if(this._xrFrame=t,o&&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 r=this.targetFrameRate;if(typeof r=="object"&&(r=r.value),this._accumulatedTime<1/(r+1))return!1;this._accumulatedTime=0}if((s=this._stats)==null||s.begin(),Le.Current=this,this.onHandlePaused())return!1;for(Le.Current=this,this.time.update(),vR&&console.log("FPS",this.time.smoothedFps.toFixed(0)),zd(this),Nd(this.scene),E_(this),Hs(this,-1);this._cameraStack.length>0&&(!this.mainCameraComponent||this.mainCameraComponent.destroyed);){this._cameraStack.splice(this._cameraStack.length-1,1);const r=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(r)}if(this.pre_update_oneshot_callbacks){for(const r in this.pre_update_oneshot_callbacks)this.pre_update_oneshot_callbacks[r]();this.pre_update_oneshot_callbacks.length=0}if(this.pre_update_callbacks)for(const r in this.pre_update_callbacks)this.pre_update_callbacks[r]();this._currentFrameEvent=0;for(let r=0;r<this.scripts_earlyUpdate.length;r++){const l=this.scripts_earlyUpdate[r];l.activeAndEnabled&&l.earlyUpdate!==void 0&&(Le.Current=this,l.earlyUpdate())}if(this.executeCoroutines(0),Hs(this,0),this.onHandlePaused())return!1;this._currentFrameEvent=1;for(let r=0;r<this.scripts_update.length;r++){const l=this.scripts_update[r];l.activeAndEnabled&&l.update!==void 0&&(Le.Current=this,l.update())}if(this.executeCoroutines(1),Hs(this,1),this.onHandlePaused())return!1;this._currentFrameEvent=2;for(let r=0;r<this.scripts_lateUpdate.length;r++){const l=this.scripts_lateUpdate[r];l.activeAndEnabled&&l.lateUpdate!==void 0&&(Le.Current=this,l.lateUpdate())}if(this.executeCoroutines(2),Hs(this,2),this.onHandlePaused()||(this.physicsSteps===void 0&&(this.physicsSteps=1),this.physics.engine&&this.physicsSteps>0&&this.internalUpdatePhysics(this.physicsSteps),this.onHandlePaused()))return!1;if(this.isVisibleToUser||this.runInBackground){this._currentFrameEvent=3;for(let r=0;r<this.scripts_onBeforeRender.length;r++){const l=this.scripts_onBeforeRender[r];l.activeAndEnabled&&l.onBeforeRender!==void 0&&(Le.Current=this,l.onBeforeRender(t))}if(this.executeCoroutines(3),Hs(this,3),this._needsUpdateSize&&this.updateSize(),this.pre_render_callbacks)for(const r in this.pre_render_callbacks)this.pre_render_callbacks[r](t)}return!0}internalUpdatePhysics(e){if(!this.physics.engine)return!1;const t=e,s=this.time.deltaTime/t;for(let o=0;o<t;o++)this._currentFrameEvent=9,this.executeCoroutines(9),this.physics.engine.step(s),this._currentFrameEvent=10,this.executeCoroutines(10);return this.physics.engine.postStep(),!0}internalOnRender(){this.isManagedExternally||(xM(this),this._currentFrameEvent=-1,VP.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&&(Le.Current=this,t.onAfterRender())}if(this.executeCoroutines(4),Hs(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",`
770
- Render:`,{...this.renderer.info.render},`
771
- Memory:`,{...this.renderer.info.memory},`
772
- Target Framerate: `+this.targetFrameRate)),this._dispatchReadyAfterFrame&&(this._dispatchReadyAfterFrame=!1,this.domElement.dispatchEvent(new CustomEvent("ready")),pe.dispatchCallback(me.ContextFirstFrameRendered,this))}renderNow(e){var t;return!e&&(e=this.mainCamera,!e)?!1:(this.handleRendererContextLost(),this._isRendering=!0,this.renderRequiredTextures(),this.renderer.toneMapping!==va&&Aw(),this.composer&&!this.isInXR?(e&&"setMainCamera"in this.composer&&((t=this.composer.passes[0])==null?void 0:t.mainCamera)!=e&&this.composer.setMainCamera(e),this.composer.render(this.time.deltaTime)):e&&(this.isInXR&&Y.isMacOS()&&this.renderer.clearDepth(),this.renderer.render(this.scene,e)),this._isRendering=!1,!0)}handleRendererContextLost(){this.time.frame%10&&this.renderer.getContext().isContextLost()&&this._contextRestoreTries++<100&&(console.warn("Attempting to recover WebGL context..."),this.renderer.forceContextRestore())}onHandlePaused(){const e=this.evaluatePaused();if(this._wasPaused!==e){yR&&console.log("Paused?",e,"context:"+this.alias);for(let t=0;t<this.scripts_pausedChanged.length;t++){const s=this.scripts_pausedChanged[t];s.activeAndEnabled&&s.onPausedChanged!==void 0&&(Le.Current=this,s.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 Pn(this.domWidth,this.domHeight),this._requireDepthTexture){const s=new LC(this.domWidth,this.domHeight);this._renderTarget.depthTexture=s}this._requireColorTexture&&(this._renderTarget.texture=new je,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=ld,this._renderTarget.texture.magFilter=ld,this._renderTarget.texture.format=ad)}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){var t;if(this.coroutines[e]){const o=this.coroutines[e];for(let r=0;r<o.length;r++)try{const l=o[r];if(!l.comp||l.comp.destroyed||!l.main||l.comp.enabled===!1){bR&&console.log("Removing coroutine",l.comp,l.comp.enabled),o.splice(r,1),--r;continue}const c=l.chained;if(c&&c.length>0){const u=c[c.length-1].next();if(u.done&&c.pop(),s(u)&&(l.chained||(l.chained=[]),l.chained.push(u.value)),!u.done)continue}const h=l.main.next();if(h.done===!0){o.splice(r,1),--r;continue}const d=h.value;if(s(d)){if(d.next().done)continue;l.chained||(l.chained=[]),l.chained.push(d)}else if(d instanceof Promise){const u=d;l.chained||(l.chained=[]);const p=_w(u);(t=l.chained)==null||t.push(p);continue}}catch(l){console.error(l)}}function s(o){return!!(o&&o.next&&o.return)}}};a(yf,"_defaultTargetFramerate",{value:90,toString(){return this.value}}),a(yf,"_defaultWebglRendererParameters",{antialias:!0,alpha:!1,powerPreference:Y.isiOS()||Y.isMacOS()?"default":"high-performance",stencil:!0});let J=yf;const Ti=C("debuglicense"),zw=[];let qs="basic";Ti&&console.log("License Type: "+qs);function Xs(){switch(qs){case"pro":case"enterprise":return!0}return!1}function Sc(){switch(qs){case"indie":return!0}return!1}function vf(){switch(qs){case"edu":return!0}return!1}function Qs(){return Xs()||Sc()||vf()}function xR(n){if(Xs()||Sc()||vf())return n(!0);zw.push(n)}function cu(n){for(const e of zw)try{e(n)}catch{}}pe.registerCallback(me.ContextRegistered,n=>{PR(n.context),CR(n.context),setTimeout(()=>kR(n.context),2e3)});let Rr,bf=!1,hu="";async function SR(){if(Rr)return Rr;if(qs==="basic")try{const n="https://engine.needle.tools/licensing/check?location="+encodeURIComponent(window.location.href)+"&version="+bs+"&generator="+encodeURIComponent(Cd),e=await fetch(n,{method:"GET"}).catch(t=>{Ti&&console.error("License check failed",t)});e?.status===200?(bf=!1,Ti&&console.log("License check succeeded"),qs="pro",cu(!0)):e?.status===403?(cu(!1),bf=!0,hu=await e.text()):(cu(!1),Ti&&console.log("License check failed with status "+e?.status))}catch(n){cu(!1),Ti&&console.error("License check failed",n)}else Ti&&console.log('Runtime license check is skipped because license is already applied as "'+qs+'"')}Rr=SR();async function CR(n){function e(){const o=document.createElement("div");o.className="needle-forbidden",o.style.cssText=`
773
- position: fixed;
774
- top: 0;
775
- left: 0;
776
- width: 100%;
777
- height: 100%;
778
- pointer-events: all;
779
- zIndex: 2147483647;
780
- line-height: 1.5;
781
- backdrop-filter: blur(15px);
782
- -webkit-backdrop-filter: blur(15px);
783
- `;const r=o.style.cssText,l=document.createElement("div");o.appendChild(l),l.style.cssText=`
784
- position: absolute;
785
- left: 0;
786
- right: 0;
787
- top:0;
788
- bottom: 0;
789
- padding: 10%;
790
- color: white;
791
- font-size: 20px;
792
- font-family: sans-serif;
793
- text-align: center;
794
- pointer-events: all;
795
- display: flex;
796
- justify-content: center;
797
- align-items: center;
798
- background-color: rgba(0,0,0,.3);
799
- text-shadow: 0 0 2px black;
800
- `;const c=l.style.cssText,h=hu?.length>1?hu:"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 l.innerHTML=h,setInterval(()=>{l.innerHTML!==h&&(l.innerHTML=h),l.parentNode!==o&&o.appendChild(l),o.style.cssText!==r&&(o.style.cssText=r),l.style.cssText!==c&&(l.style.cssText=c)},500),o}let t=e();const s=t.style.cssText;setInterval(()=>{var o;bf===!0&&(t.style.cssText!==s&&(t=e()),n.domElement.shadowRoot?t.parentNode!==n.domElement.shadowRoot&&((o=n.domElement.shadowRoot)==null||o.appendChild(t)):t.parentNode!=document.body&&document.body.appendChild(t))},500)}async function PR(n){try{if(!Xs()&&!Sc())return _f(n)}catch(e){return Ti&&console.log("License check failed",e),_f(n)}Ti&&_f(n)}async function _f(n){let e=!1;n.domElement.addEventListener("ready",()=>e=!0),await Rr?.catch(()=>{}),!(Xs()||Sc())&&(Qs()===!1&&OR(),e?wf(n):n.domElement.addEventListener("ready",()=>{wf(n)}))}function wf(n){var e;const t=`
801
- position: relative;
802
- display: block;
803
- background-size: 20px;
804
- background-position: 10px 5px;
805
- background-repeat:no-repeat;
806
- background-image:url('${Nw}');
807
- background-max-size: 40px;
808
- padding: 10px;
809
- padding-left: 30px;
810
- `;if(qs==="edu")console.log("%c This project is supported by Needle for Education \u2013 https://needle.tools",t);else return;const s=document.createElement("div");s.className="needle-non-commercial-use",s.innerHTML="Made with Needle for Education",(e=n.domElement.shadowRoot)==null||e.appendChild(s);let o=`
811
- position: absolute;
812
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
813
- font-size: 12px;
814
- color: rgb(100, 100, 100);
815
- /*mix-blend-mode: difference;*/
816
- background-color: transparent;
817
- z-index: 10000;
818
-
819
- cursor: pointer;
820
- user-select: none;
821
- opacity: 0;
822
-
823
- bottom: 6px;
824
- right: 12px;
825
- transform: translateY(0px);
826
- transition: all .5s ease-in-out 1s;
827
- `;s.style.cssText=o,s.addEventListener("click",()=>{window.open("https://needle.tools","_blank")});let r=s.style.cssText;setTimeout(()=>{o=o.replace("opacity: 0","opacity: 1"),o=o.replace("transform: translateY(10px)","transform: translateY(0)"),s.style.cssText=o,r=s.style.cssText},100);const l=setInterval(()=>{const c=n.domElement.shadowRoot||n.domElement;s.parentNode!==c&&c.appendChild(s),r!=s.style.cssText&&(s.style.cssText=o,r=s.style.cssText)},1e3);vf()&&setTimeout(()=>{clearInterval(l),s?.remove(),setTimeout(()=>{n.domElement.parentNode&&wf(n)},1e3*60*5)},2e4)}const Nw="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let Ww=0;async function OR(n){var e;const t=Date.now();if(t-Ww<2e3)return;Ww=t;const s=`
828
- position: relative;
829
- display: block;
830
- font-size: 18px;
831
- background-size: 20px;
832
- background-position: 10px 5px;
833
- background-repeat:no-repeat;
834
- background-image:url('${Nw}');
835
- background-max-size: 40px;
836
- margin-bottom: 5px;
837
- margin-top: .3em;
838
- margin-bottom: .5em;
839
- padding: .2em;
840
- padding-left: 25px;
841
- border-radius: .5em;
842
- border: 2px solid rgba(160,160,160,.3);
843
- `,o=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${bs}`;(e=J.Current)!=null&&e.xr?console.log(o):console.log("%c "+o,s)}async function kR(n){var e,t;if(!window.crossOriginIsolated){if(qs==="pro"){const s=(e=n?.domElement)==null?void 0:e.getAttribute("no-telemetry");if(s===""||s==="true"||s==="1"){Ti&&console.debug("Telemetry is disabled");return}Ti&&console.debug("Telemetry attribute: "+s)}try{const s="https://needle-engine-analytics-v2-r26roub2hq-lz.a.run.app";if(s){const o=window.location.href.split("?")[0];let r="api/v2/new/request";s.endsWith("/")||(r="/"+r);const l=qs,c=`${s}${r}`;Ti&&console.debug("Sending beacon");const h={license:l,url:o,hostname:window.location.hostname,pathname:window.location.pathname,version:bs,generator:Cd,build_time:lg,public_key:Ca},d=(t=navigator.sendBeacon)==null?void 0:t.call(navigator,c,JSON.stringify(h));Ti&&console.debug("Sent beacon: "+d)}}catch(s){Ti&&console.log("Failed to send non-commercial usage message to analytics backend",s)}}}const MR=C("debugdecoders");let xf=null;function Vw(){if(!xf){const n=Rm(null);xf={dracoLoader:n.dracoLoader,ktx2Loader:n.ktx2Loader,meshoptDecoder:n.meshoptDecoder}}return xf}function Hw(n){n!==void 0&&typeof n=="string"&&FP(n)}function $w(n){if(n!==void 0&&typeof n=="string"&&n!=="js"){const e=Vw();MR&&console.log("Setting draco decoder type to",n),e.dracoLoader.setDecoderConfig({type:n})}}function Gw(n){n!==void 0&&typeof n=="string"&&BP(n)}function Sf(n,e){const t=Vw();return e.renderer?t.ktx2Loader.detectSupport(e.renderer):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail"),jP(n),n.dracoLoader||n.setDRACOLoader(t.dracoLoader),n.ktx2Loader||n.setKTX2Loader(t.ktx2Loader),n.meshoptDecoder||n.setMeshoptDecoder(t.meshoptDecoder),DP(n,{progressive:!0}),n}const Tr=function(n){return m(n)},m=function(n){if(n===void 0&&(n=null),!Array.isArray(n))n=qw(n);else for(let e=0;e<n.length;e++){const t=n[e];n[e]=qw(t)}return function(e,t){if(!e){console.error("Found @serializable decorator without a target");return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const s=e.$serializedTypes=e.$serializedTypes||{};s[t]=n}};function qw(n){var e,t;switch((t=(e=n?.prototype)==null?void 0:e.constructor)==null?void 0:t.name){case"Number":case"String":case"Boolean":return null}return n}const So=C("debughotreload");let Cc=!1;const Pc=new Map;function RR(){return Cc}function Cf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function Xw(n){var e;if(Cc){So&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",n);return}So&&console.log("[Needle Engine] Registering hot reload instance",n);const t=n.constructor.name;Pc.has(t)?(e=Pc.get(t))==null||e.push(n):Pc.set(t,[n])}function Qw(n){if(Cc){So&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",n);return}So&&console.log("[Needle Engine] Unregistering hot reload instance",n);const e=n.constructor.name,t=Pc.get(e);if(!t)return;const s=t.indexOf(n);s!==-1&&t.splice(s,1)}let Yw=!1;function TR(){if(So||Yw)return;Yw=!0;const n=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}}n.apply(console,e)}}function ER(n){So&&console.log("[HMR] Apply changes",n,Object.keys(n)),TR();for(const e of Object.keys(n))try{Cc=!0;const t=R.get(e);if(!t){So&&console.log("[HMR] Type not found: "+e);continue}const s=n[e],o=Pc.get(s.name);let r="[Needle Engine] Updating type: "+e;const l=o?.length??-1;l>0?r+=" x"+l:r+=" (No instances registered)",console.log(r);const c=Object.getOwnPropertyNames(t.prototype),h=Object.getOwnPropertyDescriptors(s.prototype);for(const d in h)h[d].writable&&(t.prototype[d]=n[e].prototype[d]);for(const d of c)h[d]||delete t.prototype[d];if(o){const d=new s,u=Object.getOwnPropertyDescriptors(d);for(const p of o){const g=p,f=g.isComponent===!0,y=f?g.activeAndEnabled:!0,v=f?g.context:void 0;try{if(f&&v&&In(g,v),f&&y&&(g.enabled=!1),p.onBeforeHotReloadFields&&p.onBeforeHotReloadFields()===!1)continue;for(const b in u)if(u[b].writable){if(p[b]===void 0)p[b]=d[b];else if(typeof p[b]=="function"&&!p[b].prototype){const _=p[b],w=_.name,x="bound ";if(w===x)continue;const M=_.name.substring(x.length),k=s.prototype[M];k&&(p[b]=k.bind(p))}}p.onAfterHotReloadFields&&p.onAfterHotReloadFields()}finally{f&&v&&Ug(g,v),f&&y&&(g.enabled=!0)}}}}catch(t){if(So)console.error(t);else return!1}finally{Cc=!1,Ws(Ci.Log,"Script changes applied (HMR)")}return!0}class P extends A{constructor(){super(...arguments),a(this,"guid")}static isDestroyed(e){return Pr(e)}static setActive(e,t,s=!0){e&&(bc(e,t),Nd(e),t&&s&&E_(J.Current,e))}static isActiveSelf(e){return Da(e)}static isActiveInHierarchy(e){return aw(e)}static markAsInstancedRendered(e,t){lw(e,t)}static isUsingInstancing(e){return Yd(e)}static foreachComponent(e,t,s=!0){return Or(e,t,s)}static instantiateSynced(e,t){return e?Gg(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,Fa(e,t)}static destroySynced(e,t,s=!0){if(!e)return;const o=e;t=t??J.Current,uc(o,t.connection,s)}static destroy(e,t=!0){return Ri(e,t)}static add(e,t,s){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}s||(s=J.Current),t.add(e),bc(e,!0),Nd(e),s?P.foreachComponent(e,o=>{Ug(o,s),!o.__internalDidAwakeAndStart&&s.new_script_start.includes(o)===!1&&s.new_script_start.push(o)},!0):console.warn("Missing context")}}static remove(e){var t;e&&((t=e.parent)==null||t.remove(e),bc(e,!1),Nd(e),P.foreachComponent(e,s=>{bM(s)},!0))}static invokeOnChildren(e,t,...s){this.invoke(e,t,!0,s)}static invoke(e,t,s=!1,...o){e&&this.foreachComponent(e,r=>{const l=r[t];l&&typeof l=="function"&&l?.call(r,...o)},s)}static addNewComponent(e,t,s,o=!0){return Mi(e,t,s,{callAwake:o})}static addComponent(e,t,s,o){return Mi(e,t,s,o)}static moveComponent(e,t){return Mi(e,t)}static removeComponent(e){return tf(e.gameObject,e),e}static getOrAddComponent(e,t){return mc(e,t)}static getComponent(e,t){return e===null?null:Sr(e,t)}static getComponents(e,t,s=null){return e===null?s??[]:gc(e,t,s)}static findByGuid(e,t){return sf(e,t)}static findObjectOfType(e,t,s=!0){return vc(e,t??J.Current,s)}static findObjectsOfType(e,t){const s=[];return rw(e,s,t),s}static getComponentInChildren(e,t){return fc(e,t)}static getComponentsInChildren(e,t,s=null){return ja(e,t,s??void 0)}static getComponentInParent(e,t){return yc(e,t)}static getComponentsInParent(e,t,s=null){return qd(e,t,s)}static getAllComponents(e){var t;const s=(t=e.userData)==null?void 0:t.components;return s?[...s]:[]}static*iterateComponents(e){var t;const s=(t=e?.userData)==null?void 0:t.components;if(s&&Array.isArray(s))for(let o=0;o<s.length;o++)yield s[o]}}const du=class lm{constructor(e){a(this,"__context"),a(this,"__name"),a(this,"gameObject"),a(this,"guid","invalid"),a(this,"sourceId"),a(this,"__didAwake",!1),a(this,"__didStart",!1),a(this,"__didEnable",!1),a(this,"__isEnabled"),a(this,"__destroyed",!1),a(this,"_eventListeners",new Map),this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),Cf()&&Xw(this)}get isComponent(){return!0}get context(){return this.__context??J.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){var e,t;return(t=(e=this.gameObject)==null?void 0:e.userData)==null?void 0:t.layer}get name(){var e,t;return(e=this.gameObject)!=null&&e.name?this.gameObject.name:(t=this.gameObject)==null?void 0:t.userData.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(){var e;return(e=this.gameObject)==null?void 0:e.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){var e;return(e=this.gameObject)==null?void 0:e.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[Mn];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[Mn]=e)}awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=Oe.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=Oe.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}__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 s=e[t];typeof s!="function"&&(this[t]=s)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(F()&&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(){var e;this.__destroyed||(this.__destroyed=!0,this.__didAwake&&((e=this.onDestroy)==null||e.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),sw(this),Cf()&&Qw(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){F()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return ee(this.gameObject)}set worldPosition(e){at(this.gameObject,e)}setWorldPosition(e,t,s){pr(this.gameObject,e,t,s)}get worldQuaternion(){return Se(this.gameObject)}set worldQuaternion(e){Gi(this.gameObject,e)}setWorldQuaternion(e,t,s,o){Jm(this.gameObject,e,t,s,o)}get worldEuler(){return eg(this.gameObject)}set worldEuler(e){tg(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,s,o=!0){Ql(this.gameObject,e,t,s,o)}get forward(){return lm._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}get right(){return lm._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}get up(){return lm._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const s=this._eventListeners[e].indexOf(t);s>=0&&this._eventListeners[e].splice(s,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let s=0;s<t.length;s++)t[s](e);return!1}};a(du,"_forward",new S),a(du,"_right",new S),a(du,"_up",new S);let I=du;const AR=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:I,Component:I,GameObject:P},Symbol.toStringTag,{value:"Module"}));var IR=Object.defineProperty,Kw=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&IR(e,t,o),o};class Oc extends I{constructor(){super(...arguments),a(this,"from"),a(this,"to"),a(this,"width",0),a(this,"centered",!0),a(this,"_centerPos")}awake(){this._centerPos=new S}update(){if(!this.from||!this.to)return;const e=ee(this.from).clone(),t=ee(this.to).clone(),s=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),at(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(ee(this.to).clone()),this.gameObject.scale.set(this.width,this.width,s)}}Kw([m(P)],Oc.prototype,"from"),Kw([m(P)],Oc.prototype,"to");var LR=Object.defineProperty,jR=Object.getOwnPropertyDescriptor,Er=(n,e,t,s)=>{for(var o=s>1?void 0:s?jR(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&LR(e,t,o),o};const Co=C("debuganimation");let Zw=class{constructor(){a(this,"x"),a(this,"y")}};class jt extends I{constructor(){super(...arguments),a(this,"playAutomatically",!0),a(this,"randomStartTime",!0),a(this,"minMaxSpeed"),a(this,"minMaxOffsetNormalized"),a(this,"loop",!0),a(this,"clampWhenFinished",!1),a(this,"_tempAnimationClipBeforeGameObjectExisted",null),a(this,"_tempAnimationsArray"),a(this,"mixer"),a(this,"_actions"),a(this,"_handles")}get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.push(e)}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 clip(){var e;return(e=this.animations)!=null&&e.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){Co&&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}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||[]}get actions(){return this._actions}set actions(e){this._actions=e}awake(){this.mixer=void 0,Co&&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(){var e;if(this.playAutomatically&&((e=this.animations)==null?void 0:e.length)>0){const t=Math.floor(Math.random()*this.animations.length),s=this.animations[t];this.play(t,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*s.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){var t;return((t=this.actions)==null?void 0:t.find(s=>s.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!=null&&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){Co&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(o=>o.name===e));if(!e){console.error("Could not find clip",e);return}const s=this.actions.find(o=>o.getClip()===e);if(!s){console.error("Could not find action",e);return}t!=null&&t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop()}pause(e,t=!1){if(e===void 0){for(const o of this.actions)o.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){Co&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(o=>o.name===e));if(!e){console.error("Could not find clip",e);return}const s=this.actions.find(o=>o.getClip()===e);if(!s){console.error("Could not find action",e);return}s.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(Co&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){Co&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let s=e;if(typeof e=="number"){if(e>=this.animations.length){Co&&console.log("No animation at index",e);return}s=this.animations[e]}else typeof e=="string"&&(s=this.animations.find(r=>r.name===e));if(!s){console.error("Could not find clip",e);return}t||(t={});for(const r of this.actions)if(r.getClip()===s)return this.internalOnPlay(r,t);if(!s.tracks){console.warn("Clip is no AnimationClip",s);return}const o=this.mixer.clipAction(s);return this.actions.push(o),this.internalOnPlay(o,t)}internalOnPlay(e,t){var s=this.actions.find(r=>r===e);if(s===e&&s.isRunning()&&s.time<s.getClip().duration){const r=this.tryFindHandle(e);if(s.paused&&(s.paused=!1),r)return r.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 r of this.actions)r!=s&&(t.fadeDuration?r.fadeOut(t.fadeDuration):r.stop());if(t!=null&&t.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t!=null&&t.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const r=e.getClip();e.time=W.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*r.duration}else e.time>=e.getClip().duration&&(e.time=0);t!=null&&t.minMaxSpeed?e.timeScale=W.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?jC:wm:e.loop=wm,t!=null&&t.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),Co&&console.log("PLAY",e.getClip().name,e);const o=new DR(e,this.mixer,t,r=>{this._handles.splice(this._handles.indexOf(o),1)});return this._handles.push(o),o.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new xm(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Er([m()],jt.prototype,"playAutomatically",2),Er([m()],jt.prototype,"randomStartTime",2),Er([m(Zw)],jt.prototype,"minMaxSpeed",2),Er([m(Zw)],jt.prototype,"minMaxOffsetNormalized",2),Er([m()],jt.prototype,"loop",2),Er([m()],jt.prototype,"clampWhenFinished",2),Er([m(uo)],jt.prototype,"clips",1);class DR{constructor(e,t,s,o){a(this,"mixer"),a(this,"action"),a(this,"promise",null),a(this,"_options"),a(this,"_resolveCallback",null),a(this,"_resolvedOrRejectedCallback"),a(this,"onFinished",r=>{r.action===this.action&&this.onResolve()}),this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=o,this._options=s}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(){var e,t;this.dispose(),(e=this._resolvedOrRejectedCallback)==null||e.call(this,this),(t=this._resolveCallback)==null||t.call(this,this.action)}dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}const uu=Symbol("objectIsAnimatedData");function Jw(n,e,t){if(!n)return;if(n[uu]===void 0){if(!t)return;n[uu]=new Set}const s=n[uu];t?s.add(e):s.has(e)&&s.delete(e)}function BR(n){if(!n)return!1;const e=n[uu];return e!==void 0&&e.size>0}class FR{constructor(){a(this,"_context")}get context(){return this._context??J.Current}get isStateMachineBehaviour(){return!0}}class kc{constructor(e,t,s,o){a(this,"name"),a(this,"nameHash"),a(this,"normalizedTime"),a(this,"length"),a(this,"speed"),a(this,"action"),a(this,"hasTransitions");var r;this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=s,this.speed=o,this.action=e.motion.action||null,this.hasTransitions=((r=e.transitions)==null?void 0:r.length)>0||!1}}function ex(n,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??_n.generateUUID(),index:-1,clip:new uo(n,0,[])}}var Po=(n=>(n[n.If=1]="If",n[n.IfNot=2]="IfNot",n[n.Greater=3]="Greater",n[n.Less=4]="Less",n[n.Equals=6]="Equals",n[n.NotEqual=7]="NotEqual",n))(Po||{}),Pf=(n=>(n[n.Float=1]="Float",n[n.Int=3]="Int",n[n.Bool=4]="Bool",n[n.Trigger=9]="Trigger",n))(Pf||{});const ct=C("debuganimatorcontroller"),pu=C("debugrootmotion");class hs{constructor(e){a(this,"_speed",1),a(this,"normalizedStartOffset",0),a(this,"animator"),a(this,"model"),a(this,"_mixer"),a(this,"_activeState"),a(this,"_activeStates",[]),a(this,"_heldActions",[]),a(this,"rootMotionHandler"),this.model=e,ct&&console.log(this)}static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const s=[];for(let r=0;r<e.length;r++){const l=e[r],c=[];if(t.autoTransition!==!1){const d=t.transitionDuration??0,u=d/l.duration;let p=r;(t.autoTransition===void 0||t.autoTransition===!0)&&(p=(r+1)%e.length),c.push({exitTime:1-u,offset:0,duration:d,hasExitTime:!0,destinationState:p,conditions:[]})}const h={name:l.name,hash:r,motion:{name:l.name,clip:l,isLooping:t?.looping??!1},transitions:c,behaviours:[]};s.push(h)}const o={name:"AnimatorController",guid:new At(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:s}}]};return new hs(o)}play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const r=this.model.layers[t].stateMachine;for(const l of r.states)if(l.name===e||l.hash===e){ct&&console.log("transition to ",l),this.transitionTo(l,o,s);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){var s,o;const r=typeof e=="string"?"name":"hash";return(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(l=>l[r]===e).forEach(l=>l.value=t)}getBool(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??!1}setFloat(e,t){var s,o;const r=typeof e=="string"?"name":"hash",l=(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(c=>c[r]===e);return l.forEach(c=>c.value=t),l?.length>0}getFloat(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??0}setInteger(e,t){var s,o;const r=typeof e=="string"?"name":"hash";return(o=(s=this.model)==null?void 0:s.parameters)==null?void 0:o.filter(l=>l[r]===e).forEach(l=>l.value=t)}getInteger(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??0}setTrigger(e){var t,s;ct&&console.log("SET TRIGGER",e);const o=typeof e=="string"?"name":"hash";return(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.filter(r=>r[o]===e).forEach(r=>r.value=!0)}resetTrigger(e){var t,s;const o=typeof e=="string"?"name":"hash";return(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.filter(r=>r[o]===e).forEach(r=>r.value=!1)}getTrigger(e){var t,s,o;const r=typeof e=="string"?"name":"hash";return((o=(s=(t=this.model)==null?void 0:t.parameters)==null?void 0:s.find(l=>l[r]===e))==null?void 0:o.value)??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}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 s of t.stateMachine.states)if(s.name===e||s.hash==e)return s}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,s=t<=0?0:Math.abs(e.time/t);return new kc(this._activeState,s,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}get context(){var e;return(e=this.animator)==null?void 0:e.context}get mixer(){return this._mixer}dispose(){var e;if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const t of this._activeStates)t.motion.clip&&this.mixer.uncacheAction(t.motion.clip,this.animator.gameObject)}(e=this.context)==null||e.animations.unregisterAnimationMixer(this._mixer)}bind(e){var t,s;e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),(t=this.context)==null||t.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new xm(this.animator.gameObject),(s=this.context)==null||s.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;ct&&console.warn("AnimatorController clone()",this.model);const e=Hl(this.model,(t,s,o)=>o==null?!0:!(o.type==="Object3D"||o.isObject3D===!0||Cb(o)||o.tracks!==void 0||o instanceof hs));return console.assert(e!==this.model),new hs(e)}update(e){var t,s;if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const o=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&((t=this.rootMotionHandler)==null||t.onBeforeUpdate(e)),this._mixer.update(o),this.animator.applyRootMotion&&((s=this.rootMotionHandler)==null||s.onAfterUpdate(e))}get activeState(){return this._activeState}updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const s=this._activeStates[t],o=s.motion;if(!o.action)this._activeStates.splice(t,1),t--;else{const r=o.action;r.weight=e,r.getEffectiveWeight()<=0&&!r.isRunning()&&(ct&&console.debug("REMOVE",s.name,r.getEffectiveWeight(),r.isRunning(),r.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){var e;this.model.layers.length>1&&(ct||F())&&console.warn("Multiple layers are not supported yet "+((e=this.animator)==null?void 0:e.name));for(const t of this.model.layers){const s=t.stateMachine;s.defaultState===void 0&&(ct&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",t),s.defaultState=0);const o=s.states[s.defaultState];this.transitionTo(o,0,this.normalizedStartOffset);break}}evaluateTransitions(){var e;let t=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;t=!0}const s=this._activeState,o=s.motion.action;for(const l of s.transitions){if(!l.hasExitTime&&l.conditions.length<=0)continue;let c=!0;for(const h of l.conditions)if(!this.evaluateCondition(h)){c=!1;break}if(c)if(o){const h=s.motion.clip.duration,d=h<=0?1:Math.abs(o.time/h);let u=l.exitTime;o.timeScale<0&&(u=1-u);let p=!1;if(l.hasExitTime?o.timeScale>0?p=d>=l.exitTime:o.timeScale<0&&(p=1-d>=l.exitTime):p=!0,p){for(const g of l.conditions){const f=this.model.parameters.find(y=>y.name===g.parameter);f?.type===Pf.Trigger&&f.value&&(f.value=!1)}if(o.clampWhenFinished=!0,ct){const g=this.getState(l.destinationState,0);console.log(`Transition to ${l.destinationState} / ${g?.name}`,l,`
844
- Timescale: `+o.timeScale,`
845
- Normalized time: `+d.toFixed(3),`
846
- Exit Time: `+u,l.hasExitTime)}this.transitionTo(l.destinationState,l.duration,l.offset);return}}else{this.transitionTo(l.destinationState,l.duration,l.offset);return}}o&&this.setTimescale(o,s);let r=!1;if(s.motion.isLooping&&o&&(o.time>=o.getClip().duration?(r=!0,o.reset(),o.time=0,o.play()):o.time<=0&&o.timeScale<0&&(r=!0,o.reset(),o.time=o.getClip().duration,o.play())),!r&&s&&!t&&o&&this.animator&&s.behaviours){const l=o?.getClip().duration,c=o.time/l,h=new kc(this._activeState,c,l,this._speed);for(const d of s.behaviours)d.instance&&((e=d.instance.onStateUpdate)==null||e.call(d.instance,this.animator,h,0))}}setTimescale(e,t){let s=t.speed??1;t.speedParameter&&(s*=this.getFloat(t.speedParameter)),s!==void 0&&(e.timeScale=s*this._speed)}getState(e,t){return typeof e=="number"&&(e==-1&&(e=this.model.layers[t].stateMachine.defaultState,e===void 0&&(ct&&console.warn("AnimatorController default state is undefined: ",this.model,"Layer: "+t),e=0)),e=this.model.layers[t].stateMachine.states[e]),e}releaseHeldActions(e){for(const t of this._heldActions)t.fadeOut(e);this._heldActions.length=0}transitionTo(e,t,s){var o,r,l,c,h,d,u,p;if(!this.animator)return;const g=0;if(e=this.getState(e,g),!(e!=null&&e.motion)||!e.motion.clip||!(e.motion.clip instanceof uo))return;const f=this._activeState===e;if(f){const w=e.motion;if(!w.action_loopback&&w.clip){const x=this.rootMotionHandler?this.animator.gameObject.matrix.clone():null;this._mixer.uncacheAction(w.clip,this.animator.gameObject),x&&x.decompose(this.animator.gameObject.position,this.animator.gameObject.quaternion,this.animator.gameObject.scale),w.action_loopback=this.createAction(w.clip)}}if((o=this._activeState)!=null&&o.behaviours&&this._activeState.motion.action){const w=(r=this._activeState)==null?void 0:r.motion.clip.duration,x=this._activeState.motion.action.time/w,M=new kc(this._activeState,x,w,this._speed);for(const k of this._activeState.behaviours)(c=(l=k.instance)==null?void 0:l.onStateExit)==null||c.call(k.instance,this.animator,M,g)}const y=(h=this._activeState)==null?void 0:h.motion.action;f&&(e.motion.action=e.motion.action_loopback,e.motion.action_loopback=y);const v=this._activeState;this._activeState=e;const b=(d=e.motion)==null?void 0:d.action,_=e.motion.clip;if(_?.duration<=0&&_.tracks.length<=0?y&&this._heldActions.push(y):y&&(y.fadeOut(t),this.releaseHeldActions(t)),b){if(s=Math.max(0,Math.min(1,s)),e.cycleOffsetParameter){let x=this.getFloat(e.cycleOffsetParameter);typeof x=="number"?(x<0&&(x+=1),s+=x,s%=1):ct&&console.warn("AnimatorController cycle offset parameter is not a number",e.cycleOffsetParameter)}else typeof e.cycleOffset=="number"&&(s+=e.cycleOffset,s%=1);b.isRunning()&&b.stop(),b.reset(),b.enabled=!0,this.setTimescale(b,e);const w=e.motion.clip.duration;if(b.time=f?0:s*w,b.timeScale<0&&(b.time=w-b.time),b.clampWhenFinished=!0,b.setLoop(wm,0),t>0?b.fadeIn(t):b.weight=1,b.play(),this.rootMotionHandler&&this.rootMotionHandler.onStart(b),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const x=new kc(e,s,w,this._speed);for(const M of this._activeState.behaviours)(p=(u=M.instance)==null?void 0:u.onStateEnter)==null||p.call(M.instance,this.animator,x,g)}}else ct&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));ct&&console.log("TRANSITION FROM "+v?.name+" TO "+e.name,t,y,b,b?.getEffectiveTimeScale(),b?.getEffectiveWeight(),b?.isRunning(),b?.isScheduled(),b?.paused)}createAction(e){var t,s;if(this._mixer.existingAction(e)&&this._mixer.uncacheAction(e,(t=this.animator)==null?void 0:t.gameObject),(s=this.animator)!=null&&s.applyRootMotion){this.rootMotionHandler||(this.rootMotionHandler=new zR(this));const o=this.animator.gameObject;return this.rootMotionHandler.createClip(this._mixer,o,e)}else return this._mixer.clipAction(e)}evaluateCondition(e){const t=this.model.parameters.find(s=>s.name===e.parameter);if(!t)return!1;switch(e.mode){case Po.If:return t.value===!0;case Po.IfNot:return t.value===!1;case Po.Greater:return t.value>e.threshold;case Po.Less:return t.value<e.threshold;case Po.Equals:return t.value===e.threshold;case Po.NotEqual:return t.value!==e.threshold}return!1}createActions(e){var t,s,o,r;ct&&console.log("AnimatorController createActions",this.model);for(const l of this.model.layers){const c=l.stateMachine;for(let h=0;h<c.states.length;h++){const d=c.states[h];d.transitions||(d.transitions=[]);for(const u of d.transitions)u.conditions||(u.conditions=[]);if(d.motion||(ct&&console.warn("No motion",d),d.motion=ex(d.name)),this.animator&&d.motion.clips){const u=(t=d.motion.clips)==null?void 0:t.find(p=>{var g,f;return p.node.name===((f=(g=this.animator)==null?void 0:g.gameObject)==null?void 0:f.name)});u?d.motion.clip=u.clip:(ct||F())&&console.warn('Could not find clip for animator "'+((o=(s=this.animator)==null?void 0:s.gameObject)==null?void 0:o.name)+'"',d.motion.clips.map(p=>p.node.name))}if(!d.motion.clip){ct&&console.warn("No clip assigned to state",d);const u=new uo(void 0,void 0,[]);d.motion.clip=u}if((r=d.motion)!=null&&r.clip){const u=d.motion.clip;if(u instanceof uo){const p=this.createAction(u);d.motion.action=p}else(ct||F())&&console.warn("No valid animationclip assigned",d)}if(d.behaviours&&Array.isArray(d.behaviours))for(const u of d.behaviours){if(!(u!=null&&u.typeName))continue;const p=R.get(u.typeName);if(p){const g=new p;g.isStateMachineBehaviour&&(g._context=this.context??void 0,La(g,u.properties),u.instance=g),ct&&console.log("Created animator controller behaviour",d.name,u.typeName,u.properties,g)}else(ct||F())&&console.warn("Could not find AnimatorBehaviour type: "+u.typeName)}}}}*enumerateActions(){if(this.model.layers)for(const e of this.model.layers){const t=e.stateMachine;for(let s=0;s<t.states.length;s++){const o=t.states[s];o!=null&&o.motion&&(o.motion.action&&(yield o.motion.action),o.motion.action_loopback&&(yield o.motion.action_loopback))}}}}class tx{constructor(e,t){a(this,"track"),a(this,"createdInterpolant"),a(this,"originalEvaluate"),a(this,"customEvaluate"),this.track=e;const s=e,o=s.createInterpolant.bind(e);s.createInterpolant=()=>(s.createInterpolant=o,this.createdInterpolant=o(),this.originalEvaluate=this.createdInterpolant.evaluate.bind(this.createdInterpolant),this.customEvaluate=r=>{if(!this.originalEvaluate)return;const l=this.originalEvaluate(r);return t(r,l)},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}}const Oo=class Ct{constructor(e,t,s,o,r){if(a(this,"_action"),a(this,"root"),a(this,"clip"),a(this,"positionWrapper",null),a(this,"rotationWrapper",null),a(this,"context"),a(this,"positionChange",new S),a(this,"rotationChange",new H),a(this,"_prevTime",0),this.context=e,this.root=t,this.clip=s,Ct.firstKeyframeRotation[this.cacheId]||(Ct.firstKeyframeRotation[this.cacheId]=new H),r){const l=r.values;Ct.firstKeyframeRotation[this.cacheId].set(l[0],l[1],l[2],l[3])}Ct.spaceRotation[this.cacheId]||(Ct.spaceRotation[this.cacheId]=new H),Ct.effectiveSpaceRotation[this.cacheId]||(Ct.effectiveSpaceRotation[this.cacheId]=new H),Ct.clipOffsetRotation[this.cacheId]=new H,r&&Ct.clipOffsetRotation[this.cacheId].set(r.values[0],r.values[1],r.values[2],r.values[3]).invert(),this.handlePosition(s,o),this.handleRotation(s,r)}set action(e){this._action=e}get action(){return this._action}get cacheId(){return this.root.uuid}onStart(e){if(e.getClip()!==this.clip)return;Ct.lastObjRotation[this.cacheId]||(Ct.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=Ct.lastObjRotation[this.cacheId];if(Ct.spaceRotation[this.cacheId].copy(t),pu){const s=new It().setFromQuaternion(t);console.log("START",this.clip.name,W.toDegrees(s.y),this.root.position.z)}}getClipRotationOffset(){return Ct.clipOffsetRotation[this.cacheId]}handlePosition(e,t){if(t){const s=this.root;pu&&s.add(new wi),Ct.lastObjPosition[this.cacheId]||(Ct.lastObjPosition[this.cacheId]=this.root.position.clone());const o=new S,r=new S;this.positionWrapper=new tx(t,(l,c)=>{const h=this.action.getEffectiveWeight();return pu&&s.position.length()>8&&s.position.set(0,s.position.y,0),l>this._prevTime&&(o.set(c[0],c[1],c[2]),o.sub(r),o.multiplyScalar(h),o.applyQuaternion(this.getClipRotationOffset()),o.applyQuaternion(s.quaternion),this.positionChange.copy(o)),r.fromArray(c),this._prevTime=l,c[0]=0,c[1]=0,c[2]=0,c})}}handleRotation(e,t){if(t){if(pu){const l=t.values,c=new It().setFromQuaternion(new H(l[0],l[1],l[2],l[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",W.toDegrees(c.y));const h=t.values.length-4,d=new H().set(l[h],l[h+1],l[h+2],l[h+3]),u=new It().setFromQuaternion(d);console.log(e.name,t.name,"LAST ROTATION IN TRACK",W.toDegrees(u.y))}let s=0;const o=new H,r=new H;this.rotationWrapper=new tx(t,(l,c)=>(l>s&&(r.set(c[0],c[1],c[2],c[3]),o.invert(),r.multiply(o),this.rotationChange.copy(r)),o.fromArray(c),s=l,c[0]=0,c[1]=0,c[2]=0,c[3]=1,c))}}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(Ct.identityQuaternion,1-e),!0)}};a(Oo,"lastObjPosition",{}),a(Oo,"lastObjRotation",{}),a(Oo,"firstKeyframeRotation",{}),a(Oo,"spaceRotation",{}),a(Oo,"effectiveSpaceRotation",{}),a(Oo,"clipOffsetRotation",{}),a(Oo,"identityQuaternion",new H);let UR=Oo;class zR{constructor(e){a(this,"controller"),a(this,"handler",[]),a(this,"root"),a(this,"basePosition",new S),a(this,"baseQuaternion",new H),a(this,"baseRotation",new It),a(this,"summedPosition",new S),a(this,"summedRotation",new H),this.controller=e}createClip(e,t,s){this.root=t,t&&"name"in t&&t.name;const o=this.findRootTrack(s,".position"),r=this.findRootTrack(s,".quaternion"),l=new UR(this.controller.context,t,s,o,r);this.handler.push(l);const c=e.clipAction(s);return l.action=c,c}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)}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 s=e.tracks;if(!s)return null;for(const o of s)if(o.name.endsWith(t))return o;return null}}class NR extends Ki{onSerialize(e,t){}onDeserialize(e,t){if(t.type===hs&&e?.__type==="AnimatorController")return new hs(e)}}new NR(hs);var WR=Object.defineProperty,VR=Object.getOwnPropertyDescriptor,mu=(n,e,t,s)=>{for(var o=s>1?void 0:s?VR(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&WR(e,t,o),o};const Zi=C("debuganimator");class Ot extends I{constructor(){super(...arguments),a(this,"applyRootMotion",!1),a(this,"hasRootMotion",!1),a(this,"keepAnimatorControllerStateOnDisable",!1),a(this,"_parametersAreDirty",!1),a(this,"_isDirty",!1),a(this,"_speed",1),a(this,"_normalizedStartOffset",0),a(this,"_animatorController",null),a(this,"_initializeWithRuntimeAnimatorController")}get isAnimationComponent(){return!0}set runtimeAnimatorController(e){var t;this._animatorController&&this._animatorController.model===e||(e?e instanceof hs?(e.animator&&e.animator!==this&&(console.warn("AnimatorController can not be bound to multiple animators",(t=e.model)==null?void 0:t.name),e.model||console.error("AnimatorController has no model"),e=new hs(e.model)),this._animatorController=e,this._animatorController.bind(this)):(Zi&&console.log("Assign animator controller",e,this),this._animatorController=new hs(e),this.__didAwake&&this._animatorController.bind(this)):this._animatorController=null)}get runtimeAnimatorController(){return this._animatorController}getCurrentStateInfo(){var e;return(e=this.runtimeAnimatorController)==null?void 0:e.getCurrentStateInfo()}get currentAction(){var e;return((e=this.runtimeAnimatorController)==null?void 0:e.currentAction)||null}get parametersAreDirty(){return this._parametersAreDirty}get isDirty(){return this._isDirty}Play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){this.play(e,t,s,o)}play(e,t=-1,s=Number.NEGATIVE_INFINITY,o=0){var r;(r=this.runtimeAnimatorController)==null||r.play(e,t,s,o),this._isDirty=!0}Reset(){this.reset()}reset(){var e;(e=this._animatorController)==null||e.reset(),this._isDirty=!0}SetBool(e,t){this.setBool(e,t)}setBool(e,t){var s,o;Zi&&console.log("setBool",e,t),((s=this.runtimeAnimatorController)==null?void 0:s.getBool(e))!==t&&(this._parametersAreDirty=!0),(o=this.runtimeAnimatorController)==null||o.setBool(e,t)}GetBool(e){return this.getBool(e)}getBool(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getBool(e))??!1;return Zi&&console.log("getBool",e,s),s}toggleBool(e){this.setBool(e,!this.getBool(e))}SetFloat(e,t){this.setFloat(e,t)}setFloat(e,t){var s,o;((s=this.runtimeAnimatorController)==null?void 0:s.getFloat(e))!==t&&(this._parametersAreDirty=!0),Zi&&console.log("setFloat",e,t),(o=this.runtimeAnimatorController)==null||o.setFloat(e,t)}GetFloat(e){return this.getFloat(e)}getFloat(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getFloat(e))??-1;return Zi&&console.log("getFloat",e,s),s}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){var s,o;((s=this.runtimeAnimatorController)==null?void 0:s.getInteger(e))!==t&&(this._parametersAreDirty=!0),Zi&&console.log("setInteger",e,t),(o=this.runtimeAnimatorController)==null||o.setInteger(e,t)}GetInteger(e){return this.getInteger(e)}getInteger(e){var t;const s=((t=this.runtimeAnimatorController)==null?void 0:t.getInteger(e))??-1;return Zi&&console.log("getInteger",e,s),s}SetTrigger(e){this.setTrigger(e)}setTrigger(e){var t;this._parametersAreDirty=!0,Zi&&console.log("setTrigger",e),(t=this.runtimeAnimatorController)==null||t.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){var t;this._parametersAreDirty=!0,Zi&&console.log("resetTrigger",e),(t=this.runtimeAnimatorController)==null||t.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){var t;const s=(t=this.runtimeAnimatorController)==null?void 0:t.getTrigger(e);return Zi&&console.log("getTrigger",e,s),s}IsInTransition(){return this.isInTransition()}isInTransition(){var e;return((e=this.runtimeAnimatorController)==null?void 0:e.isInTransition())??!1}SetSpeed(e){return this.setSpeed(e)}setSpeed(e){var t;e!==this._speed&&(Zi&&console.log("setSpeed",e),this._speed=e,((t=this._animatorController)==null?void 0:t.animator)==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){var t;this._speed=W.lerp(e.x,e.y,Math.random()),((t=this._animatorController)==null?void 0:t.animator)==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){var t;this._normalizedStartOffset=W.lerp(e.x,e.y,Math.random()),((t=this.runtimeAnimatorController)==null?void 0:t.animator)==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}awake(){Zi&&console.log("ANIMATOR",this.name,this),this.gameObject&&this.initializeRuntimeAnimatorController()}initializeRuntimeAnimatorController(e=!1){const t=e||this.runtimeAnimatorController!==this._initializeWithRuntimeAnimatorController;if(this.runtimeAnimatorController&&t){const s=this.runtimeAnimatorController.clone();this._initializeWithRuntimeAnimatorController=s,s?(console.assert(this.runtimeAnimatorController!==s),this.runtimeAnimatorController=s,console.assert(this.runtimeAnimatorController===s),this.runtimeAnimatorController.bind(this),this.runtimeAnimatorController.setSpeed(this._speed),this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset):console.warn("Could not clone animator controller",this.runtimeAnimatorController)}}onDisable(){var e;this.keepAnimatorControllerStateOnDisable||(e=this._animatorController)==null||e.reset()}onBeforeRender(){this._isDirty=!1,this._parametersAreDirty=!1,!BR(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}mu([m()],Ot.prototype,"applyRootMotion",2),mu([m()],Ot.prototype,"hasRootMotion",2),mu([m()],Ot.prototype,"keepAnimatorControllerStateOnDisable",2),mu([m()],Ot.prototype,"runtimeAnimatorController",1);const ix=Symbol("previous-visibility"),sx=class Qh extends Pn{render(e,t,s){if("addPass"in s)this._unsupported_effectcomposer_warning||(console.warn("RenderTexture.render() does not yet support EffectComposer"),this._unsupported_effectcomposer_warning=!0);else if(s instanceof hr){this.onBeforeRender();const o=s.getRenderTarget(),r=s.xr.enabled;s.xr.enabled=!1,s.setRenderTarget(this),s.clear(!0,!0,!0),s.render(e,t),s.setRenderTarget(o),s.xr.enabled=r,this.onAfterRender()}}onBeforeRender(){Qh._userSet.clear();const e=Dg(this.texture,!0,null,Qh._userSet);for(const t of e)t instanceof X&&(t[ix]=t.visible,t.visible=!1)}onAfterRender(){for(const e of Qh._userSet)e instanceof X&&(e.visible=e[ix]);Qh._userSet.clear()}};a(sx,"_userSet",new Set);let Mc=sx;var HR=Object.defineProperty,$R=Object.getOwnPropertyDescriptor,Rc=(n,e,t,s)=>{for(var o=s>1?void 0:s?$R(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&HR(e,t,o),o};const gu=C("debuggroundprojection");class Ys extends I{constructor(){super(...arguments),a(this,"applyOnAwake",!1),a(this,"autoFit",!0),a(this,"_radius",50),a(this,"_height",3),a(this,"_arblending",0),a(this,"_lastBackground"),a(this,"_lastRadius"),a(this,"_lastHeight"),a(this,"_projection"),a(this,"_watcher"),a(this,"_needsTextureUpdate",!1),a(this,"_blurrynessShader",null),a(this,"_lastBlurriness",-1)}set radius(e){this._radius=e,this._projection&&this.updateProjection()}get radius(){return this._radius}set height(e){this._height=e,this._projection&&this.updateProjection()}get height(){return this._height}set arBlending(e){this._arblending=e,this._needsTextureUpdate=!0}get arBlending(){return this._arblending}awake(){this.applyOnAwake&&this.updateAndCreate()}onEnable(){this.context.time.frameCount>0&&this.applyOnAwake&&this.updateAndCreate(),this._watcher||(this._watcher=new oo(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{gu&&console.log("Background changed",this.context.scene.background),this._needsTextureUpdate=!0}))}onDisable(){var e,t;(e=this._watcher)==null||e.revoke(),(t=this._projection)==null||t.removeFromParent()}onEnterXR(){this.activeAndEnabled&&(this._needsTextureUpdate=!0,this.updateProjection())}async onLeaveXR(){this.activeAndEnabled&&(await $l(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 je&&this.updateBlurriness(this.context.scene.background,this.context.scene.backgroundBlurriness)}updateAndCreate(){var e;this.updateProjection(),(e=this._watcher)==null||e.apply()}updateProjection(){var e,t,s,o,r,l;if(!this.context.scene.background){(e=this._projection)==null||e.removeFromParent();return}const c=this.context.scene.background;if(!(c instanceof je)){(t=this._projection)==null||t.removeFromParent();return}if(((s=this.context.xr)!=null&&s.isPassThrough||(o=this.context.xr)!=null&&o.isAR)&&this.arBlending===0){(r=this._projection)==null||r.removeFromParent();return}if(!this.gameObject||this.destroyed)return;let h=!0;const d=0,u=c!==this._lastBackground||this._height!==this._lastHeight||this._radius!==this._lastRadius;if(!this._projection||u){gu&&console.log("Create/Update Ground Projection",c.name),(l=this._projection)==null||l.removeFromParent();try{this._projection=new _a(c,this._height,this._radius,64)}catch(p){console.error("Error creating three GroundProjection",p);return}this._projection.position.y=this._height-d,this._projection.name="GroundProjection",ig(this._projection,!1)}else h=!1;if(this._projection.parent||this.gameObject.add(this._projection),this.autoFit&&h){this._projection.updateWorldMatrix(!0,!0);const p=ei(this.context.scene.children,[this._projection]),g=p.min.y;if(g<1/0){const f=Q();f.x=p.min.x+(p.max.x-p.min.x)*.5;const y=Ge(this.gameObject).x;f.y=g+this._height*y-d,f.z=p.min.z+(p.max.z-p.min.z)*.5,at(this._projection,f)}gu&&q.DrawWireBox3(p,65280,5)}this.context.scene.backgroundBlurriness>.001&&this._needsTextureUpdate&&this.updateBlurriness(c,this.context.scene.backgroundBlurriness),this._lastBackground=c,this._lastHeight=this._height,this._lastRadius=this._radius,this._needsTextureUpdate=!1}updateBlurriness(e,t){var s;if(this._projection){if(!e)return}else return;this._needsTextureUpdate=!1,gu&&console.log("Update Blurriness",t),this._blurrynessShader??(this._blurrynessShader=new gs({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:GR,fragmentShader:qR})),this._blurrynessShader.depthWrite=!1,this._blurrynessShader.uniforms.map.value=e,this._blurrynessShader.uniforms.blurriness.value=t,this._lastBlurriness=t,e.needsUpdate=!0;const o=this._projection.material.transparent;this._projection.material.transparent=(((s=this.context.xr)==null?void 0:s.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,o!==this._projection.material.transparent&&(this._projection.material.needsUpdate=!0),this._projection.material.map=qi.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}Rc([m()],Ys.prototype,"applyOnAwake",2),Rc([m()],Ys.prototype,"autoFit",2),Rc([m()],Ys.prototype,"radius",1),Rc([m()],Ys.prototype,"height",1),Rc([m()],Ys.prototype,"arBlending",1);const GR=`
847
- varying vec2 vUv;
848
-
849
- void main() {
850
- vUv = uv;
851
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
852
- }
853
- `,qR=`
854
- uniform sampler2D map;
855
- uniform float blurriness;
856
- uniform float alphaFactor;
857
- uniform float blending;
858
- varying vec2 vUv;
859
-
860
- const float PI = 3.14159265359;
861
-
862
- // Gaussian function
863
- float gaussian(float x, float sigma) {
864
- return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
865
- }
866
-
867
- // Custom smoothstep function for desired falloff
868
- float customSmoothstep(float edge0, float edge1, float x) {
869
- float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
870
- return t * t * (3.0 - 2.0 * t);
871
- }
872
-
873
- void main() {
874
- vec2 center = vec2(0.0, 0.0);
875
- vec2 pos = vUv;
876
- pos.x = 0.0; // Only consider vertical distance
877
- float distance = length(pos - center);
878
-
879
- // Calculate blur amount based on custom falloff
880
- float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
881
- blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
882
-
883
- // Gaussian blur
884
- vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
885
- vec4 color = vec4(0.0);
886
- float totalWeight = 0.0;
887
- int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
888
- float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
889
-
890
- for (int x = -blurSize; x <= blurSize; x++) {
891
- for (int y = -blurSize; y <= blurSize; y++) {
892
- vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
893
- float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
894
- color += textureLod(map, vUv + offset, lodLevel) * weight;
895
- totalWeight += weight;
896
- }
897
- }
898
-
899
- color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
900
-
901
- gl_FragColor = color;
902
-
903
- float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
904
- float stepFactor = blending - brightness * .1;
905
- gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
906
- gl_FragColor.a *= alphaFactor;
907
- // gl_FragColor.rgb = vec3(1.0);
908
-
909
- // #include <tonemapping_fragment>
910
- // #include <colorspace_fragment>
911
-
912
- // Uncomment to visualize blur amount
913
- // gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
914
- }
915
- `;var XR=Object.defineProperty,Of=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&XR(e,t,o),o};class Ar extends I{constructor(){super(...arguments),a(this,"constraintActive",!0),a(this,"locked",!1),a(this,"sources",[])}}Of([m()],Ar.prototype,"constraintActive"),Of([m()],Ar.prototype,"locked"),Of([m(A)],Ar.prototype,"sources");function nx(n,e){return An(n,me.ContextCreated,e),()=>yo(n,me.ContextCreated)}function QR(n,e){return An(n,me.ContextClearing,e),()=>yo(n,me.ContextClearing)}function YR(n,e){return An(n,me.ContextDestroying,e),()=>yo(n,me.ContextDestroying)}function ox(n,e){return An(n,Oe.Start,e),()=>yo(n,Oe.Start)}function rx(n,e){return An(n,Oe.Update,e),()=>yo(n,Oe.Update)}function KR(n,e){return An(n,Oe.OnBeforeRender,e),()=>yo(n,Oe.OnBeforeRender)}function ZR(n,e){return An(n,Oe.OnAfterRender,e),()=>yo(n,Oe.OnAfterRender)}let Ir=class{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(n,e){return this.bb_pos=n,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(n,e,t,s){return n.prep(4,12),n.writeFloat32(s),n.writeFloat32(t),n.writeFloat32(e),n.offset()}};class ax{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new Ir).__init(this.bb_pos,this.bb)}rotation(e){return(e||new Ir).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new Ir).__init(this.bb_pos+24,this.bb)}static sizeOf(){return 36}static createTransform(e,t,s,o,r,l,c,h,d,u){return e.prep(4,36),e.prep(4,12),e.writeFloat32(u),e.writeFloat32(d),e.writeFloat32(h),e.prep(4,12),e.writeFloat32(c),e.writeFloat32(l),e.writeFloat32(r),e.prep(4,12),e.writeFloat32(o),e.writeFloat32(s),e.writeFloat32(t),e.offset()}}class ro{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new ro).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+zv),(t||new ro).__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 ax).__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 D;(n=>{(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./rapier-CyWhltHY.min.js");return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.RAPIER_PHYSICS||(n.RAPIER_PHYSICS={})),(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./postprocessing-DF8AlRgW.min.js").then(l=>l.index);return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.POSTPROCESSING||(n.POSTPROCESSING={})),(e=>{e.MAYBEMODULE=null;const t=[];function s(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(r=>{t.push(r)})}e.ready=s;async function o(){if(e.MODULE)return e.MODULE;const r=await import("./postprocessing-DF8AlRgW.min.js").then(l=>l.N8AO);return e.MODULE=r,e.MAYBEMODULE=r,t.forEach(l=>l(r)),t.length=0,r}e.load=o})(n.POSTPROCESSING_AO||(n.POSTPROCESSING_AO={}))})(D||(D={}));var bt=(n=>(n[n.Average=0]="Average",n[n.Multiply=1]="Multiply",n[n.Minimum=2]="Minimum",n[n.Maximum=3]="Maximum",n))(bt||{}),fu=(n=>(n[n.Discrete=0]="Discrete",n[n.Continuous=1]="Continuous",n))(fu||{}),Qe=(n=>(n[n.None=0]="None",n[n.FreezePositionX=2]="FreezePositionX",n[n.FreezePositionY=4]="FreezePositionY",n[n.FreezePositionZ=8]="FreezePositionZ",n[n.FreezePosition=14]="FreezePosition",n[n.FreezeRotationX=16]="FreezeRotationX",n[n.FreezeRotationY=32]="FreezeRotationY",n[n.FreezeRotationZ=64]="FreezeRotationZ",n[n.FreezeRotation=112]="FreezeRotation",n[n.FreezeAll=126]="FreezeAll",n))(Qe||{}),Na=(n=>(n[n.None=0]="None",n[n.X=2]="X",n[n.Y=4]="Y",n[n.Z=8]="Z",n[n.All=-1]="All",n))(Na||{});const kt=function(n,e){return function(t,s,o){JR(t,s,o,n,e)}};function JR(n,e,t,s,o){if(!o&&!s&&!n.onValidate)return;if(t!==void 0){console.error("Invalid usage of validate decorator. Only fields can be validated.",n,e,t),De("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,Ci.Error);return}let r="";if(typeof e=="string"?r=e:r=e.name,n.__internalAwake){const l=Symbol(r),c=n.__internalAwake;n.__internalAwake=function(){var h;if(!this.onValidate){F()&&console.warn('Usage of @validate decorate detected but there is no onValidate method in your class: "'+((h=n.constructor)==null?void 0:h.name)+'"');return}if(this[l]===void 0){this[l]=this[r];const d=this[r];if(d instanceof re||d instanceof S||d instanceof ye||d instanceof H){const u=this[r];gd(u,()=>{this.onValidate(r)})}Object.defineProperty(this,r,{set:function(u){var p;if(this[ef]===!0)this[l]=u;else{s?.call(this,u);const g=this[l];this[l]=u,(p=this.onValidate)==null||p.call(this,r,g)}},get:function(){return o?.call(this),this[l]}})}c.call(this)}}}const eT=function(n){return function(e,t,s){let o="";typeof t=="string"?o=t:o=t.name;const r=n.prototype,l=Object.getOwnPropertyDescriptor(r,o);if(!(l!=null&&l.value)){console.warn("Can not apply prefix: type does not have method named",t,n);return}const c=l.value,h=e[o];Object.defineProperty(r,o,{value:function(...d){const u=h?.call(this,...d);if(u instanceof Promise){u.then(p=>{if(p!==!1)return c.call(this,...d)});return}if(u!==!1)return c.call(this,...d)}})}};var tT=Object.defineProperty,iT=Object.getOwnPropertyDescriptor,Ei=(n,e,t,s)=>{for(var o=s>1?void 0:s?iT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&tT(e,t,o),o};class sT{constructor(e,t){a(this,"positionChanged",!1),a(this,"rotationChanged",!1),a(this,"position"),a(this,"quaternion"),a(this,"_positionKeys",["x","y","z"]),a(this,"_quaternionKeys",["_x","_y","_z","_w"]),a(this,"mute",!1),a(this,"context"),a(this,"obj"),a(this,"_positionWatch"),a(this,"_rotationWatch"),this.context=t,this.obj=e}get isDirty(){return this.positionChanged||this.rotationChanged}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]}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)}}start(e,t){this.reset(),e&&(this._positionWatch||(this._positionWatch=new oo(this.obj.position,["x","y","z"])),this._positionWatch.apply(),this.position={},this._positionWatch.subscribeWrite((r,l)=>{var c;if((c=this.context.physics.engine)!=null&&c.isUpdating||this.mute)return;const h=this.position[l];Math.abs(h-r)<1e-5||(this.position[l]=r,this.positionChanged=!0)})),t&&(this._rotationWatch||(this._rotationWatch=new oo(this.obj.quaternion,["_x","_y","_z","_w"])),this._rotationWatch.apply(),this.quaternion={},this._rotationWatch.subscribeWrite((r,l)=>{var c;if((c=this.context.physics.engine)!=null&&c.isUpdating||this.mute)return;const h=this.quaternion[l];Math.abs(h-r)<1e-5||(this.quaternion[l]=r,this.rotationChanged=!0)}));const s=this.obj.matrixWorld.multiplyMatrices.bind(this.obj.matrixWorld),o=new se;this.obj.matrixWorld.multiplyMatrices=(r,l)=>{var c;return(c=this.context.physics.engine)!=null&&c.isUpdating||this.mute||o.equals(r)||(this.positionChanged=!0,this.rotationChanged=!0,o.copy(r)),s(r,l)}}stop(){var e,t;(e=this._positionWatch)==null||e.revoke(),(t=this._rotationWatch)==null||t.revoke()}}var Wa;const oi=(Wa=class extends I{constructor(){super(...arguments),a(this,"autoMass",!0),a(this,"_mass",0),a(this,"useGravity",!0),a(this,"centerOfMass",new S(0,0,0)),a(this,"constraints",Qe.None),a(this,"isKinematic",!1),a(this,"drag",0),a(this,"angularDrag",1),a(this,"detectCollisions",!0),a(this,"sleepThreshold",.01),a(this,"collisionDetectionMode",fu.Discrete),a(this,"_gravityScale",1),a(this,"dominanceGroup",0),a(this,"_propertiesChanged",!1),a(this,"_currentVelocity",new S),a(this,"_smoothedVelocity",new S),a(this,"_smoothedVelocityGetter",new S),a(this,"_lastPosition",new S),a(this,"_watch")}get isRigidbody(){return!0}set mass(n){n!==this._mass&&(this._mass=n,this._propertiesChanged=!0,this.__didAwake&&(this.autoMass=!1))}get mass(){var n,e;return this.autoMass?((e=(n=this.context.physics.engine)==null?void 0:n.getBody(this))==null?void 0:e.mass())??-1:this._mass}get lockPositionX(){return(this.constraints&Qe.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Qe.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Qe.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Qe.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Qe.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Qe.FreezeRotationZ)!==0}set lockPositionX(n){n?this.constraints|=Qe.FreezePositionX:this.constraints&=~Qe.FreezePositionX}set lockPositionY(n){n?this.constraints|=Qe.FreezePositionY:this.constraints&=~Qe.FreezePositionY}set lockPositionZ(n){n?this.constraints|=Qe.FreezePositionZ:this.constraints&=~Qe.FreezePositionZ}set lockRotationX(n){n?this.constraints|=Qe.FreezeRotationX:this.constraints&=~Qe.FreezeRotationX}set lockRotationY(n){n?this.constraints|=Qe.FreezeRotationY:this.constraints&=~Qe.FreezeRotationY}set lockRotationZ(n){n?this.constraints|=Qe.FreezeRotationZ:this.constraints&=~Qe.FreezeRotationZ}set gravityScale(n){this._gravityScale=n}get gravityScale(){return this._gravityScale}awake(){this._watch=void 0,this._propertiesChanged=!1}onEnable(){this._watch||(this._watch=new sT(this.gameObject,this.context)),this._watch.start(!0,!0),this.startCoroutine(this.beforePhysics(),Oe.LateUpdate),F()&&(globalThis.NEEDLE_USE_RAPIER?D.RAPIER_PHYSICS.ready().then(async()=>{var n;await $l(3),(n=this.context.physics.engine)!=null&&n.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(){var n,e;(n=this._watch)==null||n.stop(),(e=this.context.physics.engine)==null||e.removeBody(this)}onDestroy(){var n;(n=this.context.physics.engine)==null||n.removeBody(this)}onValidate(){this._propertiesChanged=!0}*beforePhysics(){for(var n,e,t,s;;)this._propertiesChanged&&(this._propertiesChanged=!1,(n=this.context.physics.engine)==null||n.updateProperties(this)),(e=this._watch)!=null&&e.isDirty?(this._watch.mute=!0,this._watch.applyValues(),(t=this.context.physics.engine)==null||t.updateBody(this,this._watch.positionChanged,this._watch.rotationChanged),this._watch.reset()):(s=this._watch)==null||s.syncValues(),this.captureVelocity(),yield}teleport(n,e=!0){var t;(t=this._watch)==null||t.reset(!0),e?this.gameObject.position.set(n.x,n.y,n.z):this.setWorldPosition(n.x,n.y,n.z),this.resetForcesAndTorques(),this.resetVelocities()}resetForces(n=!0){var e;(e=this.context.physics.engine)==null||e.resetForces(this,n)}resetTorques(n=!0){var e;(e=this.context.physics.engine)==null||e.resetTorques(this,n)}resetVelocities(){this.setVelocity(0,0,0),this.setAngularVelocity(0,0,0)}resetForcesAndTorques(){this.resetForces(),this.resetTorques()}wakeUp(){var n;(n=this.context.physics.engine)==null||n.wakeup(this)}get isSleeping(){var n;return(n=this.context.physics.engine)==null?void 0:n.isSleeping(this)}updateProperties(){var n;return this._propertiesChanged=!1,(n=this.context.physics.engine)==null?void 0:n.updateProperties(this)}applyForce(n,e,t=!0){var s;this._propertiesChanged&&this.updateProperties(),(s=this.context.physics.engine)==null||s.addForce(this,n,t)}applyImpulse(n,e=!0){var t;this._propertiesChanged&&this.updateProperties(),(t=this.context.physics.engine)==null||t.applyImpulse(this,n,e)}setForce(n,e,t,s=!0){var o,r,l;(o=this.context.physics.engine)==null||o.resetForces(this,s),typeof n=="number"?(e??(e=0),t??(t=0),(r=this.context.physics.engine)==null||r.addForce(this,{x:n,y:e,z:t},s)):(l=this.context.physics.engine)==null||l.addForce(this,n,s)}getVelocity(){var n;const e=(n=this.context.physics.engine)==null?void 0:n.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(n,e,t,s=!0){var o,r;if(n instanceof S){const l=n;(o=this.context.physics.engine)==null||o.setLinearVelocity(this,l,s);return}e===void 0||t===void 0||(r=this.context.physics.engine)==null||r.setLinearVelocity(this,{x:n,y:e,z:t},s)}getAngularVelocity(){var n;const e=(n=this.context.physics.engine)==null?void 0:n.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(n,e,t,s=!0){var o,r;if(typeof n=="object"){const l=n;(o=this.context.physics.engine)==null||o.setAngularVelocity(this,l,s);return}if(e===void 0||t===void 0||typeof e=="boolean"){console.warn("setAngularVelocity expects either a Vec3 or 3 numbers");return}(r=this.context.physics.engine)==null||r.setAngularVelocity(this,{x:n,y:e,z:t},s)}setTorque(n,e,t){typeof n=="number"?this.setAngularVelocity(n,e,t):this.setAngularVelocity(n)}get smoothedVelocity(){return this._smoothedVelocityGetter.copy(this._smoothedVelocity),this._smoothedVelocityGetter.multiplyScalar(1/this.context.time.deltaTime)}setBodyFromGameObject(n=null){}captureVelocity(){const n=this.gameObject.matrixWorld;Wa.tempPosition.setFromMatrixPosition(n);const e=Wa.tempPosition.sub(this._lastPosition);this._lastPosition.copy(Wa.tempPosition),this._smoothedVelocity.lerp(e,this.context.time.deltaTime/.1)}},a(Wa,"tempPosition",new S),Wa);Ei([kt()],oi.prototype,"autoMass",2),Ei([m()],oi.prototype,"mass",1),Ei([kt(),m()],oi.prototype,"useGravity",2),Ei([m(S)],oi.prototype,"centerOfMass",2),Ei([kt(),m()],oi.prototype,"constraints",2),Ei([kt(),m()],oi.prototype,"isKinematic",2),Ei([kt(),m()],oi.prototype,"drag",2),Ei([kt(),m()],oi.prototype,"angularDrag",2),Ei([kt(),m()],oi.prototype,"detectCollisions",2),Ei([kt(),m()],oi.prototype,"sleepThreshold",2),Ei([kt(),m()],oi.prototype,"collisionDetectionMode",2),Ei([kt()],oi.prototype,"_gravityScale",2),Ei([kt()],oi.prototype,"dominanceGroup",2);let ht=oi;new S,new S;const ko=C("debugsync"),Tc="STRS";vg(Tc,ro.getRootAsSyncedTransformModel);const Ks=new Am;function lx(n,e,t=!0){Ks.clear();const s=Ks.createString(n);ro.startSyncedTransformModel(Ks),ro.addGuid(Ks,s),ro.addFast(Ks,t);const o=e.worldPosition,r=e.worldEuler,l=e.gameObject.scale;ro.addTransform(Ks,ax.createTransform(Ks,o.x,o.y,o.z,r.x,r.y,r.z,l.x,l.y,l.z));const c=ro.endSyncedTransformModel(Ks);return Ks.finish(c,Tc),Ks.asUint8Array()}let kf=0,Ec=0;rx(n=>{var e;const t=(e=n.connection.currentServerUrl)!=null&&e.includes("glitch")?10:40;Ec=Math.floor(kf/t),kf=0,ko&&Ec>0&&console.log("Sync Transform Fast Interval",Ec)});class Zs extends I{constructor(){super(...arguments),a(this,"overridePhysics",!0),a(this,"interpolatePosition",!0),a(this,"interpolateRotation",!0),a(this,"fastMode",!1),a(this,"syncDestroy",!1),a(this,"_model",null),a(this,"_needsUpdate",!0),a(this,"rb",null),a(this,"_wasKinematic",!1),a(this,"_receivedDataBefore",!1),a(this,"_targetPosition"),a(this,"_targetRotation"),a(this,"_receivedFastUpdate",!1),a(this,"_shouldRequestOwnership",!1),a(this,"joinedRoomCallback",null),a(this,"receivedDataCallback",null),a(this,"tempEuler",new It),a(this,"receivedUpdate",!1),a(this,"lastPosition"),a(this,"lastRotation"),a(this,"lastScale")}requestOwnership(){ko&&console.log("Request ownership"),this._model?this._model.requestOwnership():(this._shouldRequestOwnership=!0,this._needsUpdate=!0)}freeOwnership(){var e;(e=this._model)==null||e.freeOwnership()}hasOwnership(){var e;return((e=this._model)==null?void 0:e.hasOwnership)??void 0}isOwned(){var e;return(e=this._model)==null?void 0:e.isOwned}awake(){ko&&console.log("new instance",this.guid,this),this._receivedDataBefore=!1,this._targetPosition=new S,this._targetRotation=new H,this.lastPosition=new S,this.lastRotation=new H,this.lastScale=new S,this.rb=P.getComponentInChildren(this.gameObject,ht),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new _g(this.context.connection,this.guid),this.context.connection.isConnected&&this.tryGetLastState(),this.joinedRoomCallback=this.tryGetLastState.bind(this),this.context.connection.beginListen(ie.JoinedRoom,this.joinedRoomCallback),this.receivedDataCallback=this.onReceivedData.bind(this),this.context.connection.beginListenBinary(Tc,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&$g(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(ie.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(Tc,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}onReceivedData(e){var t;if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){ko&&console.log("new data",this.context.connection.connectionId,this.context.time.frameCount,this.guid,e),this.receivedUpdate=!0,this._receivedFastUpdate=e.fast();const s=e.transform();if(s){cs.markDirty(this.gameObject,!0);const o=s.position();o&&(this.interpolatePosition&&((t=this._targetPosition)==null||t.set(o.x(),o.y(),o.z())),(!this.interpolatePosition||!this._receivedDataBefore)&&this.setWorldPosition(o.x(),o.y(),o.z()));const r=s.rotation();r&&(this.tempEuler.set(r.x(),r.y(),r.z()),this.interpolateRotation&&this._targetRotation.setFromEuler(this.tempEuler),(!this.interpolateRotation||!this._receivedDataBefore)&&tg(this.gameObject,this.tempEuler));const l=s.scale();l&&this.gameObject.scale.set(l.x(),l.y(),l.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()}onBeforeRender(){if(!this.activeAndEnabled||!this.context.connection.isConnected)return;if(!this.context.connection.isInRoom||!this._model){ko&&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,s=this.gameObject.scale;if(this._model.isOwned&&!this.receivedUpdate){const l=this._model.hasOwnership||this.fastMode?1e-4:.001;(e.distanceTo(this.lastPosition)>l||t.angleTo(this.lastRotation)>l||s.distanceTo(this.lastScale)>l)&&(this._model.hasOwnership?this._needsUpdate=!0:(ko&&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),cs.markDirty(this.gameObject,!0),this._needsUpdate=!1))}if(this._model&&!this._model.hasOwnership&&this._model.isOwned&&this._receivedDataBefore){const l=this._receivedFastUpdate||this.fastMode?.5:.3;let c=!1;if(this.interpolatePosition&&this._targetPosition){const h=this.worldPosition;h.lerp(this._targetPosition,l),this.worldPosition=h,c=!0}if(this.interpolateRotation&&this._targetRotation){const h=this.worldQuaternion;h.slerp(this._targetRotation,l),this.worldQuaternion=h,c=!0}c&&cs.markDirty(this.gameObject,!0)}if(this.receivedUpdate=!1,this.lastPosition.copy(e),this.lastRotation.copy(t),this.lastScale.copy(s),!this._model||!this._model||this._model.hasOwnership===void 0||!this._model.hasOwnership)return;this.rb&&this.overridePhysics&&this._wasKinematic!==void 0&&(ko&&console.log("reset kinematic",this.rb.name,this._wasKinematic),this.rb.isKinematic=this._wasKinematic);const o=10,r=this.rb||this.fastMode;if(this._needsUpdate&&(this.context.time.frameCount%o===0||r)){if(kf++,r&&Ec>0&&this.context.time.frameCount%Ec!==0)return;ko&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const l=lx(this.guid,this,!!r);this.context.connection.sendBinary(l)}}}class td{constructor(e,t){a(this,"event"),a(this,"button"),a(this,"buttonName"),a(this,"_used",!1),a(this,"_propagationStopped",!1),a(this,"z__pointer_ctured",!1),a(this,"z__pointer_cture_rleased",!1),a(this,"inputSource"),a(this,"object"),a(this,"point"),a(this,"normal"),a(this,"face"),a(this,"distance"),a(this,"instanceId"),a(this,"intersection"),a(this,"isDown"),a(this,"isUp"),a(this,"isPressed"),a(this,"isClick"),a(this,"isDoubleClick"),a(this,"input"),this.event=t,this.input=e,this.button=t.button}get deviceIndex(){return this.event.deviceIndex}get pointerId(){return this.event.pointerId}get pressure(){return this.event.pressure}get used(){return this._used}use(){this._used||(this._used=!0,this.event.use())}get propagationStopped(){return this._propagationStopped}stopPropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}stopImmediatePropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}setPointerCapture(){this.z__pointer_ctured=!0}releasePointerCapture(){this.z__pointer_cture_rleased=!0}get mode(){return this.event.mode}clone(){const e=new td(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function yu(n,e){return P.foreachComponent(n,t=>{if(!t.enabled)return;const s=t;if(e)switch(e){case"pointerdown":if(s.onPointerDown)return!0;break;case"pointerup":if(s.onPointerUp||s.onPointerClick)return!0;break;case"pointermove":if(s.onPointerEnter||s.onPointerExit||s.onPointerMove)return!0;break}else if(s.onPointerDown||s.onPointerUp||s.onPointerEnter||s.onPointerExit||s.onPointerClick)return!0},!1)===!0}const jn=new Array;class Dn{constructor(e,t,s,o){a(this,"enabled",!0),a(this,"target"),a(this,"methodName"),a(this,"arguments"),this.target=e,this.methodName=t||null,this.arguments=s,o!=null&&(this.enabled=o)}get canClone(){return this.target instanceof Object}invoke(...e){if(this.enabled!==!1){if(typeof this.target=="function")this.arguments?(jn.length=0,e!==void 0&&e.length>0&&jn.push(...e),jn.push(...this.arguments),this.target(...this.arguments),jn.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?(jn.length=0,e!==void 0&&e.length>0&&jn.push(...e),jn.push(...this.arguments),t.call(this.target,...jn),jn.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 nT=n=>/^[A-Z]*$/.test(n);class vu extends Event{constructor(){super(...arguments),a(this,"args")}}class xe{constructor(e){if(a(this,"isEventList",!0),a(this,"target"),a(this,"key"),a(this,"_isInvoking",!1),a(this,"methods",[]),a(this,"_methodsCopy",[]),this.methods=[],Array.isArray(e))for(const t of e)t instanceof Dn?this.methods.push(t):typeof t=="function"&&this.methods.push(new Dn(t));else typeof e=="function"&&this.methods.push(new Dn(e))}__internalOnInstantiate(e){var t;const s=new Array;for(let o=0;o<this.methods.length;o++){const r=this.methods[o];if(!(r.target instanceof Function)){const l=r.target;let c=l?.uuid;if(l&&(c=l.guid),c){const h=e[c];if(h){const d=(t=r.arguments)==null?void 0:t.map(u=>u instanceof Object&&u.uuid?e[u.uuid]:u!=null&&u.isComponent?e[u.guid]:u);s.push(new Dn(h.clone,r.methodName,d,r.enabled))}else F()&&console.warn("Could not find target for event listener")}}}return new xe(s)}setEventTarget(e,t){if(this.key=e,this.target=t,this.key!==void 0){let s="",o=!1;for(const r of this.key)o&&nT(r)&&(s+="-"),o=!0,s+=r.toLowerCase();this.key=s}}get listenerCount(){var e;return((e=this.methods)==null?void 0:e.length)??0}get isInvoking(){return this._isInvoking}static from(...e){return new xe(e)}invoke(...e){var t;if(this._isInvoking)return console.warn("Circular event invocation detected. Please check your event listeners for circular references.",this),!1;if(((t=this.methods)==null?void 0:t.length)<=0)return!1;this._isInvoking=!0;try{this._methodsCopy.length=0,this._methodsCopy.push(...this.methods);for(const s of this._methodsCopy)s.invoke(...e);if(typeof this.target=="object"&&typeof this.key=="string"){const s=this.target.dispatchEvent;if(typeof s=="function"){const o=new vu(this.key);o.args=e,s.call(this.target,o)}}}finally{this._isInvoking=!1,this._methodsCopy.length=0}return!0}addEventListener(e){return this.methods.push(new Dn(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 oT extends Ki{constructor(){super([ae,ce],"ColorSerializer")}onDeserialize(e){if(e!=null)return e.a!==void 0?new ce(e.r,e.g,e.b,e.a):e.alpha!==void 0?new ce(e.r,e.g,e.b,e.alpha):new ae(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 rT=new oT;class aT extends Ki{constructor(){super([It],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new It(e.x,e.y,e.z,e.order);if(e.x!=null)return new It(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const lT=new aT;class cT extends Ki{constructor(){super(A,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const s=t.objectToNode[e.uuid];return vt&&console.log(s,e.name,e.uuid),{node:s}}}onDeserialize(e,t){var s,o,r;if(typeof e=="string"){if(e.endsWith(".glb")||e.endsWith(".gltf")){if(t.serializable instanceof Array&&t.serializable.includes(le))return;F()&&be("Detected wrong usage of @serializable with Object3D or GameObject. Instead you should use AssetReference here! Please see the console for details.");const l=(o=(s=t.target)==null?void 0:s.constructor)==null?void 0:o.name;console.warn(`Wrong usage of @serializable detected in your script "${l}"
916
-
917
- It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
918
-
919
- To fix this please change your code to:
920
-
921
- @serializable(AssetReference)
922
- ${t.path}! : AssetReference;
923
- \0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const l=t.nodeToObject[e.node];return vt&&console.log("Deserialized object reference?",e,l,t?.nodeToObject),l||console.warn("Did not find node: "+e.node,t.nodeToObject,t.object),l}else if(e.guid){if(!t.context){console.error("Missing context");return}let l;const c=(r=t.gltf)==null?void 0:r.scene;return c&&(l=P.findByGuid(e.guid,c)),l||(l=P.findByGuid(e.guid,t.context.scene)),l?(l&&l.isComponent===!0&&(vt&&console.warn("Deserialized object reference is a component"),l=l.gameObject),vt&&console.log("Deserialized object reference?",e,l,t?.nodeToObject)):((F()||vt)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),l}}}}const cx=new cT;class hT extends Ki{constructor(){super([I,I],"ComponentSerializer")}onSerialize(e,t){if(e!=null&&e.guid)return{guid:e.guid}}onDeserialize(e,t){var s;if(e!=null&&e.guid){if(e.___persistentAsset){vt&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const o=t.path;vt&&console.log(e.guid,t.root,t.object,t.target);let r=this.findObjectForGuid(e.guid,t.root);if(r||t.context&&(r=this.findObjectForGuid(e.guid,(s=t.context)==null?void 0:s.scene),r))return r;(F()||vt)&&console.warn('Could not resolve component reference: "'+o+'" using guid '+e.guid,t.target),e.could_not_resolve=!0;return}}findObjectForGuid(e,t){if(t.guid===e)return t;const s=P.foreachComponent(t,o=>{if(o.guid===e)return o},!1);if(s!==void 0)return s;for(let o=0;o<t.children.length;o++){const r=t.children[o],l=this.findObjectForGuid(e,r);if(l)return l}}}const bu=new hT;class dT extends Ki{constructor(){super([xe])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){var s,o,r;if(typeof e=="function")return new xe([new Dn(e,null,[],!0)]);if(e&&e.type==="EventList"){vt&&console.log("DESERIALIZE EVENT",e);const l=new Array;if(e.calls&&Array.isArray(e.calls))for(const d of e.calls){let u=function(f){if(typeof f=="object"){let y=cx.onDeserialize(f,t);if(y||(y=bu.onDeserialize(f,t)),y)return y}return f};vt&&console.log(d);let p=bu.findObjectForGuid(d.target,t.root);!p&&(s=t.context)!=null&&s.scene&&(p=bu.findObjectForGuid(d.target,(o=t.context)==null?void 0:o.scene));const g=((r=d.method)==null?void 0:r.length)>0;if(p&&g){const f=()=>{const y=d.method[0].toUpperCase()+d.method.slice(1);if(typeof p[y]=="function"){console.warn(`EventList method:
924
- Could not find method ${d.method} on object ${p.name}. Please rename ${d.method} to ${y}?
925
- `,p[y],`
926
- in script: `,p),be("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
927
- Could not find method ${d.method} on object ${p.name}`,p,typeof p[d.method])};if(typeof p[d.method]!="function"){let y=!1,v=p;for(;v;){const b=Object.getOwnPropertyDescriptor(v,d.method);if(b&&(b.writable===!0||b.set)){y=!0;break}v=Object.getPrototypeOf(v)}!y&&(F()||vt)&&f()}}if(p){let f=d.argument;if(f!==void 0?f=u(f):d.arguments!==void 0&&(f=d.arguments.map(u)),!p[d.method])console.warn(`EventList method not found: "${d.method}" on ${p?.name}`);else{f!==void 0&&!Array.isArray(f)&&(f=[f]);const y=new Dn(p,d.method,f,d.enabled);l.push(y)}}else F()&&console.warn("[Debug] EventList: Could not find event listener in scene",d,t.object,e)}const c=new xe(l);vt&&console.log(c);const h=t.target;return h!==void 0&&t.path!==void 0&&c.setEventTarget(t.path,h),c}}}const uT=new dT,_u=new WeakMap,pT=je.prototype.clone;je.prototype.clone=function(){const n=pT.call(this);return _u.has(n)||_u.set(n,this),n};class hx extends Ki{constructor(){super([Mc,Pn])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof je&&t.type===Mc){let s=e;_u.has(s)&&(s=_u.get(s)),s.isRenderTargetTexture=!0,s.flipY=!0,s.offset.y=1,s.repeat.y=-1,s.needsUpdate=!0,s.mipmaps=[],s instanceof DC&&(s.isCompressedTexture=!1,s.format=ad);const o=new Mc(s.image.width,s.image.height,{colorSpace:xn});return o.texture=s,o}}}new hx;class dx extends Ki{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return mo(t.gltfId,e)}}new dx;var mT=Object.defineProperty,gT=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&mT(e,t,o),o};class Va extends I{awake(){Jt.createIfNoneExists(this.context)}onEnable(){var e;(e=Jt.get(this.context))==null||e.register(this)}onDisable(){var e;(e=Jt.get(this.context))==null||e.unregister(this)}}class Ai extends Va{constructor(){super(...arguments),a(this,"targets",null),a(this,"raycastHits",[]),a(this,"ignoreSkinnedMeshes",!1)}start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??(e=new $s),e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=o=>o instanceof wn?"continue in children":t?t(o):!0);const s=this.context.physics.raycast(e);return e.testObject=t,s}}gT([m()],Ai.prototype,"ignoreSkinnedMeshes");class wu extends Ai{constructor(){super(),this.ignoreSkinnedMeshes=!0}}const ux=class sC extends Va{performRaycast(e){if(!ne.active||!sC.allow||!(e!=null&&e.ray))return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}};a(ux,"allow",!0);let Ac=ux;class Mf{static getObject(e){const t=e[Pi];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 s=this.tryFindCanvasGroup(e);if(s?.isCanvasGroup===!0&&(t&&(t.canvasGroup=s),s.blocksRaycasts===!1||s.interactable===!1))return!1;const o=Or(e,r=>{if(r.isGraphic===!0)return r},!1);return t&&o?.isGraphic===!0&&(t.graphic=o),!(o?.raycastTarget===!1||o?.layer===2)}static tryFindCanvasGroup(e){if(!e)return null;const t=Or(e,s=>{const o=s;if(o.blocksRaycasts!==void 0&&o.interactable!==void 0)return o},!1);return t!==void 0?t:this.tryFindCanvasGroup(e.parent)}}function Rf(n){return n[Pi]||(n.parent?Rf(n.parent):null)}function fT(n){return n.isUI===!0||typeof n[Pi]=="object"}function xu(n,e){if(!n)return;const t=n.material;if(t?.isMaterial===!0){const s=n.parent;s&&s.isText,t.side=e.doubleSided??!0?xi:po,t.shadowSide=e.doubleSided?xi:po,n.castShadow=e.castShadows?e.castShadows:!1,n.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const s of n.children)xu(s,e)}function Ha(n,e,t){n[e]===void 0&&console.warn("Field",e,"is undefined on",n);const s=Proxy.revocable(n[e],{set(l,c,h,d){const u=l[c],p=Reflect.set(l,c,h,d);return t(h,u),p}}),o=s.revoke,r=n[e];return s.revoke=()=>{n[e]=r,o()},n[e]=s.proxy,s}const px=Symbol("Scheduled action");function yT(n,e,t=Oe.OnBeforeRender){let s=n[px];s||(s=n[px]={});const o=e.name;s[t]||(s[t]={});const r=s[t];if(r[o])return;function*l(){e?.call(n),r[o]=null}const c=n.startCoroutine(l(),t);r[o]=c}const Mo=C("debugeventsystem");var Tf=(n=>(n.BeforeHandleInput="BeforeHandleInput",n.AfterHandleInput="AfterHandleInput",n))(Tf||{});nx(n=>{Jt.createIfNoneExists(n)});class Jt extends I{constructor(){super(...arguments),a(this,"raycaster",[]),a(this,"pressedByID",new Map),a(this,"hoveredByID",new Map),a(this,"onPointerEvent",e=>{if(e===void 0||e.propagationStopped||e.defaultPrevented||e.used)return;const t=new td(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==Be.PointerDown,t.isUp=e.type==Be.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId),Mo&&(t.isDown?console.log("DOWN",t.pointerId):t.isUp&&console.log("UP",t.pointerId),t.isClick&&console.log("CLICK",t.pointerId));const s=new $s;e.hasRay?s.ray=e.ray:s.screenPoint=this.context.input.getPointerPositionRC(e.pointerId);const o=this.performRaycast(s);if(o){for(const l of o)l.event=e,e.intersections.push(l);e.origin.onPointerHits&&e.origin.onPointerHits({sender:this,event:e,hits:o})}Mo&&t.isClick&&De("EventSystem: "+t.pointerId+" - "+this.context.time.frame+" - Up:"+t.isUp+", Down:"+t.isDown);const r={sender:this,args:t,hasActiveUI:this.currentActiveMeshUIComponents.length>0};this.dispatchEvent(new CustomEvent("BeforeHandleInput",{detail:r})),this.handleIntersections(o,t),this.dispatchEvent(new CustomEvent("AfterHandleInput",{detail:r}))}),a(this,"_sortedHits",[]),a(this,"_testObjectsCache",new Map),a(this,"_currentlyActiveRaycaster",null),a(this,"_currentPointerEventName",null),a(this,"shouldRaycastObject",e=>{var t;const s=e&&"getComponent"in e?e.getComponent(Va):null;if(s&&s!=this._currentlyActiveRaycaster)return!1;let o=null;if(fT(e)&&(o=(t=e[Pi])==null?void 0:t.gameObject),this._testObjectsCache.has(e)||o&&this._testObjectsCache.has(o))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let r=yu(e,this._currentPointerEventName);if(!r&&o&&(r=yu(o,this._currentPointerEventName)),r){this._testObjectsCache.set(e,!0);for(const l of e.children)this.shouldRaycastObject_AddToYesCache(l);return!0}return this._testObjectsCache.set(e,!1),"continue in children"}}),a(this,"_sortingBuffer",[]),a(this,"_noDepthTestingResults",[]),a(this,"out",{}),a(this,"_capturedPointer",{}),a(this,"pointerEnterSymbol",Symbol("pointerEnter")),a(this,"pointerExitSymbol",Symbol("pointerExit")),a(this,"currentActiveMeshUIComponents",[])}static ensureUpdateMeshUI(e,t,s=!1){Ro.update(e,t,s)}static markUIDirty(e){Ro.markDirty()}static createIfNoneExists(e){e.scene.getComponent(Jt)||e.scene.addComponent(Jt)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(Jt)}static get instance(){return this.get(J.Current)}register(e){var t;e&&this.raycaster&&!this.raycaster.includes(e)&&((t=this.raycaster)==null||t.push(e))}unregister(e){var t,s;const o=(t=this.raycaster)==null?void 0:t.indexOf(e);o!==void 0&&o!==-1&&((s=this.raycaster)==null||s.splice(o,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(Va)||this.context.scene.addComponent(Ai)}onEnable(){this.context.input.addEventListener(Be.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Be.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Be.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Be.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Be.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Be.PointerMove,this.onPointerEvent)}onBeforeRender(){this.resetMeshUIStates()}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||(e=new $s),e.testObject=this.shouldRaycastObject;for(const t of this.raycaster){if(!t.activeAndEnabled)continue;this._currentlyActiveRaycaster=t;const s=t.performRaycast(e);this._currentlyActiveRaycaster=null,s&&s.length>0&&this._sortedHits.push(...s)}return this._sortedHits.sort((t,s)=>t.distance-s.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){var s;if(e!=null&&e.length){e=this.sortCandidates(e);for(const r of e){if(t.event.immediatePropagationStopped)return!1;if(this.assignHitInformation(t,r),this.handleEventOnObject(r.object,t))return!0}}this.assignHitInformation(t,e?.[0]),this.invokePointerCapture(t);const o=this.hoveredByID.get(t.pointerId);return o&&this.propagatePointerExit(o.obj,o.data,null),this.hoveredByID.delete(t.pointerId),t.isUp&&((s=this.pressedByID.get(t.pointerId))==null||s.handlers.forEach(r=>this.invokeOnPointerUp(t,r)),this.pressedByID.delete(t.pointerId)),!1}sortCandidates(e){this._sortingBuffer.length=0,this._noDepthTestingResults.length=0;for(let t=0;t<e.length;t++){const s=e[t],o=s.object;if(o.material&&o.material.depthTest===!1){this._noDepthTestingResults.push(s);continue}this._sortingBuffer.push(s)}for(const t of this._sortingBuffer)this._noDepthTestingResults.push(t);return this._noDepthTestingResults}handleEventOnObject(e,t){if(!this.testIsVisible(e))return t.isClick&&Mo&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return Mo&&console.error("Event without pointer can't be handled",t),!1;t.object=e;const s=e.parent,o=t.isClick??!1;let r=null;if(s&&s.isUI){const d=(t.isPressed||t.isClick)??!1;if(s[Pi]){const u=s[Pi].gameObject;if(u){if(!Mf.isInteractable(u,this.out))return!1;r=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,d),e=u}}}o&&Mo&&console.log(this.context.time.frame,e);const l=this.hoveredByID.get(t.pointerId),c=l?.obj;c!==e&&c&&this.propagatePointerExit(c,l.data,e);const h=this.hoveredByID.get(t.pointerId);if(h?(h.obj=e,h.data=t):this.hoveredByID.set(t.pointerId,{obj:e,data:t}),t.isDown){const d=this.pressedByID.get(t.pointerId);d?(d.obj=e,d.data=t):this.pressedByID.set(t.pointerId,{obj:e,data:t,handlers:new Set})}return(r===null||r.interactable)&&this.handleMainInteraction(e,t,c??null),!0}propagate(e,t){for(;e;)P.foreachComponent(e,s=>{t(s)},!1),e=e.parent}handleMainInteraction(e,t,s){const o=this.pressedByID.get(t.pointerId),r=s!==e;let l=!0;switch(t.event.pointerType){case"mouse":case"touch":const c=this.context.input.getPointerPositionLastFrame(t.pointerId),h=this.context.input.getPointerPosition(t.pointerId);l=c&&!W.approximately(c,h);break}this.propagate(e,c=>{var h;const d=c;d.interactable!==!1&&(!d.activeAndEnabled||!d.enabled||(d.onPointerEnter&&r&&this.handlePointerEnter(d,t),t.isDown&&d.onPointerDown&&(d.onPointerDown(t),o?.handlers.add(d),this.handlePointerCapture(t,d)),d.onPointerMove&&(l&&d.onPointerMove(t),this.handlePointerCapture(t,d)),t.isUp&&(d.onPointerUp&&(this.invokeOnPointerUp(t,d),o?.handlers.delete(d)),d.onPointerExit&&((h=t.event)==null?void 0:h.pointerType)===Md.Touch&&(this.handlePointerExit(d,t),this.hoveredByID.delete(t.pointerId))),t.isClick&&d.onPointerClick&&d.onPointerClick(t)))}),t.isUp&&(o?.handlers.forEach(c=>{this.invokeOnPointerUp(t,c)}),this.pressedByID.delete(t.pointerId))}propagatePointerExit(e,t,s){this.propagate(e,o=>{if(!o.gameObject||o.destroyed)return;const r=o;if(r.onPointerExit||r.onPointerEnter){if(s&&this.isChild(s,o.gameObject))return;this.handlePointerExit(r,t)}})}invokeOnPointerUp(e,t){var s;(s=t.onPointerUp)==null||s.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,s,o){let r=e[s];if(o)return r&&r.includes(t)?!1:(r=r||[],r.push(t),e[s]=r,!0);{if(!r||!r.includes(t))return!1;const l=r.indexOf(t);return l!==-1&&r.splice(l,1),!0}}handlePointerCapture(e,t){if(e.z__pointer_ctured){e.z__pointer_ctured=!1;const s=e.pointerId;if(t.onPointerMove){const o=this._capturedPointer[s]||[];o.push(t),this._capturedPointer[s]=o}else F()&&!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 s=e.pointerId;if(this._capturedPointer[s]){const o=this._capturedPointer[s].indexOf(t);o!==-1&&(this._capturedPointer[s].splice(o,1),Mo&&console.log("released pointer capture",s,t,this._capturedPointer))}}invokePointerCapture(e){var t;if(e.event.type===Be.PointerMove){const s=e.pointerId,o=this._capturedPointer[s];if(o){Mo&&console.log("Captured",s,o);for(let r=0;r<o.length;r++){const l=o[r];if(l.destroyed){o.splice(r,1),r--;continue}(t=l.onPointerMove)==null||t.call(l,e)}}}}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)}handleMeshUIIntersection(e,t){const s=Ro.updateState(e,t);return s&&this.currentActiveMeshUIComponents.push(s),s!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&Ro.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];Ro.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?P.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class Ro{static markDirty(){this.needsUpdate=!0}static update(e,t,s=!1){if(s){e.update();return}const o=t.time.frameCount;for(const r of this.lastUpdateFrame)if(r.context===t){if(o===r.frame)return;r.frame=o;let l=this.needsUpdate||o<1;r.nextUpdate<=o&&(l=!0),l&&(Mo&&console.log("Update threemeshui"),this.needsUpdate=!1,r.nextUpdate=o+60,e.update());return}this.lastUpdateFrame=[{context:t,frame:o,nextUpdate:o+60}],e.update(),this.needsUpdate=!1}static updateState(e,t){let s=null;if(e&&(s=this.findBlockOrTextInParent(e),s&&s!==this.lastSelected)){if(s.interactable===!1)return null;this.needsUpdate=!0}return s}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}}a(Ro,"lastSelected",null),a(Ro,"lastUpdateFrame",[]),a(Ro,"needsUpdate",!1);var vT=Object.defineProperty,Ue=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&vT(e,t,o),o};const Ji=C("debugorbit"),Ef=C("freecam"),Ic=C("debugcamerafit"),Su=C("smoothcam"),bT={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let Af;class Lc extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class _e extends I{constructor(){super(...arguments),a(this,"autoTarget",!0),a(this,"autoFit",!1),a(this,"enableRotate",!0),a(this,"autoRotate",!1),a(this,"autoRotateSpeed",1),a(this,"minAzimuthAngle",1/0),a(this,"maxAzimuthAngle",1/0),a(this,"minPolarAngle",0),a(this,"maxPolarAngle",Math.PI),a(this,"enableKeys",!1),a(this,"enableDamping",!0),a(this,"dampingFactor",.1),a(this,"enableZoom",!0),a(this,"minZoom",0),a(this,"maxZoom",1/0),a(this,"zoomSpeed",1),a(this,"zoomToCursor",!1),a(this,"enablePan",!0),a(this,"lookAtConstraint",null),a(this,"lookAtConstraint01",1),a(this,"allowInterrupt",!0),a(this,"middleClickToFocus",!0),a(this,"doubleClickToFocus",!0),a(this,"clickBackgroundToFitScene",2),a(this,"debugLog",!1),a(this,"targetLerpDuration",1),a(this,"_controls",null),a(this,"_cameraObject",null),a(this,"_lookTargetLerpActive",!1),a(this,"_lookTargetStartPosition",new S),a(this,"_lookTargetEndPosition",new S),a(this,"_lookTargetLerp01",0),a(this,"_lookTargetLerpDuration",0),a(this,"_cameraLerpActive",!1),a(this,"_cameraStartPosition",new S),a(this,"_cameraEndPosition",new S),a(this,"_cameraLerp01",0),a(this,"_cameraLerpDuration",0),a(this,"_fovLerpActive",!1),a(this,"_fovLerpStartValue",0),a(this,"_fovLerpEndValue",0),a(this,"_fovLerp01",0),a(this,"_fovLerpDuration",0),a(this,"_inputs",0),a(this,"_enableTime",0),a(this,"_startedListeningToKeyEvents",!1),a(this,"_eventSystem"),a(this,"_afterHandleInputFn"),a(this,"_camera",null),a(this,"_syncedTransform"),a(this,"_didSetTarget",0),a(this,"targetElement",null),a(this,"_activePointerEvents"),a(this,"_lastTimeClickOnBackground",-1),a(this,"_clickOnBackgroundCount",0),a(this,"_onPointerDown",e=>{this._activePointerEvents.push(e)}),a(this,"_onPointerDownLate",e=>{e.used&&this._controls&&(this._controls.enabled=!1)}),a(this,"_onPointerUp",e=>{for(let t=this._activePointerEvents.length-1;t>=0;t--){const s=this._activePointerEvents[t];if(s.pointerId===e.pointerId&&s.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.fitCamera(this.context.scene.children,{immediate:!1})):this._clickOnBackgroundCount=0}Ji&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}}),a(this,"_onPointerUpLate",e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()}),a(this,"_orbitStartAngle",0),a(this,"onControlsChangeStarted",()=>{this._controls&&(this._orbitStartAngle=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()),this._syncedTransform&&this._syncedTransform.requestOwnership()}),a(this,"onControlsChangeEnded",()=>{if(this._controls&&this.autoTarget){const e=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()-this._orbitStartAngle;Math.abs(e)<.01?(Ji&&console.debug("OrbitControls: No movement detected, updating target now"),this.updateTargetNow()):Ji&&console.debug("OrbitControls: Movement detected",e)}}),a(this,"_shouldDisable",!1),a(this,"__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}))}),a(this,"_haveAttachedKeyboardEvents",!1)}get isCameraController(){return!0}get controls(){return this._controls}get controllerObject(){return this._cameraObject}onStartInteraction(e){var t;(t=this.controls)==null||t.addEventListener("start",e)}get targetLerpSpeed(){return 5}set targetLerpSpeed(e){this.targetLerpDuration=1/e}awake(){Ji&&console.debug("OrbitControls",this),this._didSetTarget=0,this._startedListeningToKeyEvents=!1}start(){this._eventSystem=Jt.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(Tf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){var e,t;(e=this._controls)==null||e.dispose(),(t=this._eventSystem)==null||t.removeEventListener(Tf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._enableTime=this.context.time.time;const e=P.getComponent(this.gameObject,ri);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof we&&(t=this.gameObject),t&&Xm(t,this,!0),!this._controls&&t instanceof A){this._cameraObject=t;const s=this.targetElement??this.context.renderer.domElement,o=t?.quaternion.clone();this._controls=new Iv(t,s),t?.quaternion.copy(o),Af===void 0&&(Af={...this._controls.keys});const r=ee(t),l=this.gameObject.worldForward,c=r.clone().sub(l.multiplyScalar(2.5));this._controls.target.copy(c)}if(this._controls)if(Ef&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,Y.isMobileDevice()&&(this.doubleClickToFocus=!0)),this._controls.addEventListener("start",this.onControlsChangeStarted),this._controls.addEventListener("end",this.onControlsChangeEnded),!this._startedListeningToKeyEvents&&this.enableKeys)this._startedListeningToKeyEvents=!0,this._controls.listenToKeyEvents(this.context.domElement);else try{this._controls.stopListenToKeyEvents()}catch{}this._syncedTransform=P.getComponent(this.gameObject,Zs)??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(){var e;if((e=this._camera)!=null&&e.threeCamera&&Xm(this._camera.threeCamera,this,!1),this._controls){this._controls.enabled=!1,this._controls.autoRotate=!1,this._controls.removeEventListener("start",this.onControlsChangeStarted),this._controls.removeEventListener("end",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)}updateTargetNow(){var e,t,s;const o=new co((e=this._cameraObject)==null?void 0:e.worldPosition,(t=this._cameraObject)==null?void 0:t.worldForward.multiplyScalar(-1)),r=this.context.physics.raycastFromRay(o),l=r.length>0?r[0]:void 0;l&&l.distance>this.minZoom&&l.distance<this.maxZoom&&(Ji&&q.DrawWireSphere(l.point,.1,16711680,2),(s=this._controls)==null||s.target.copy(r[0].point))}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))}onBeforeRender(){var e,t,s,o;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)&&(e=this.context.input.getPointerPositionDelta(0))!=null&&e.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 r=P.getComponent(this.gameObject,ri);if(r&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const l=ee(r.threeCamera),c=Math.max(.01,l.length()),h=new S(0,0,-c).applyMatrix4(r.threeCamera.matrixWorld);Ji&&q.DrawLine(l,h,5592575,10),this.setLookTargetPosition(h,!0)}if(!this.setLookTargetFromConstraint()){const l=new $s;l.screenPoint=new re(0,0),l.lineThreshold=.1;const c=this.context.physics.raycast(l);c.length>0&&this.setLookTargetPosition(c[0].point,!0),Ic&&console.log("OrbitControls hits",...c)}}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 Lc(this,"camera"));else{const r=W.easeInOutCubic(this._cameraLerp01);this._cameraObject.position.lerpVectors(this._cameraStartPosition,this._cameraEndPosition,r)}if(this._lookTargetLerpActive)if(this._lookTargetLerp01+=this.context.time.deltaTime/this._lookTargetLerpDuration,this._lookTargetLerp01>=1)this._controls.target.copy(this._lookTargetEndPosition),this._lookTargetLerpActive=!1,this.dispatchEvent(new Lc(this,"lookat"));else{const r=W.easeInOutCubic(this._lookTargetLerp01);this._controls.target.lerpVectors(this._lookTargetStartPosition,this._lookTargetEndPosition,r)}if(this._fovLerpActive&&this._cameraObject){const r=this._cameraObject;if(this._fovLerp01+=this.context.time.deltaTime/this._fovLerpDuration,this._fovLerp01>=1)r.fov=this._fovLerpEndValue,this._fovLerpActive=!1;else{const l=W.easeInOutCubic(this._fovLerp01);r.fov=W.lerp(this._fovLerpStartValue,this._fovLerpEndValue,l)}r.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(r=>r.used),this._controls.keys=this.enableKeys?Af:bT,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,Ef||(((s=(t=this._camera)==null?void 0:t.threeCamera)==null?void 0:s.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 r=typeof Su=="number"?Su:.99;this._controls.dampingFactor=Math.max(.001,1-Math.min(1,r))}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||(!Ef&&(o=this.lookAtConstraint)!=null&&o.locked&&this.setLookTargetFromConstraint(0,this.lookAtConstraint01),this._controls.update(this.context.time.deltaTime),Ji&&q.DrawWireSphere(this._controls.target,.1,65280))}}}setCameraAndLookTarget(e,t=!1){if(!e)return(F()||Ji)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof A)&&!(e instanceof ri))return(F()||Ji)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof ri&&(e=e.gameObject);const s=e.worldPosition,o=e.worldForward;e instanceof BC&&(Ji&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),o.multiplyScalar(-1));const r=new co(s,o);return Ji&&q.DrawRay(r.origin,r.direction,16711680,10),this.setTargetFromRaycast(r,t)||this.setLookTargetPosition(r.at(2,Q()),t),this.setCameraTargetPosition(s,t),!0}setCameraTargetPosition(e,t=!1){var s;e&&(e instanceof A&&(e=ee(e)),this._cameraEndPosition||(this._cameraEndPosition=new S),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((s=this._cameraObject)==null?void 0:s.position),typeof t=="number"?this._cameraLerpDuration=t:this._cameraLerpDuration=this.targetLerpDuration))}get cameraLerpActive(){return this._cameraLerpActive}stopCameraLerp(){this._cameraLerpActive=!1}setFieldOfView(e,t=!1){var s;if(!this._controls||typeof e!="number")return;const o=(s=this._camera)==null?void 0:s.threeCamera;o&&(t===!0?o.fov=e:(this._fovLerpActive=!0,this._fovLerp01=0,this._fovLerpStartValue=o.fov,this._fovLerpEndValue=e,typeof t=="number"?this._fovLerpDuration=t:this._fovLerpDuration=this.targetLerpDuration))}setLookTargetPosition(e=null,t=!1){this._controls&&e&&(e instanceof A&&(e=ee(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,Ji&&(console.warn("OrbitControls: setLookTargetPosition",e,t),q.DrawWireSphere(this._lookTargetEndPosition,.2,16711680,2)),t===!0?this._controls.target.copy(this._lookTargetEndPosition):(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){var s,o;if(!this._controls||((s=this.lookAtConstraint)==null?void 0:s.enabled)===!1)return!1;const r=(o=this.lookAtConstraint)==null?void 0:o.sources;if(r&&r.length>0){const l=r[e];if(l)return l.getWorldPosition(this._lookTargetEndPosition),this.lerpLookTarget(this._lookTargetEndPosition,t),!0}return!1}lerpTarget(e,t){return this.lerpLookTarget(e,t)}lerpLookTarget(e,t){this._controls&&(t>=1?this._controls.target.copy(e):this._controls.target.lerp(e,t))}setTargetFromRaycast(e,t=!1){if(!this.controls)return!1;const s=e?this.context.physics.raycastFromRay(e):this.context.physics.raycast();for(const o of s)if(o.distance>0&&P.isActiveInHierarchy(o.object)){const r=Rf(o.object);if(r){const l=r.canvas;if(l!=null&&l.screenspace)break}return this.setLookTargetPosition(o.point,t),!0}return!1}fitCamera(e,t){var s,o;if(this.context.isInXR)return;let r;if(Array.isArray(e)?r=e:e&&"type"in e?r=e.children:e&&typeof e=="object"&&!(e instanceof A)&&!Array.isArray(e)&&(t=e,r=t.objects),r&&!Array.isArray(r)&&(r=r.children),(!Array.isArray(r)||r&&r.length<=0)&&(r=this.context.scene.children),!Array.isArray(r)||r.length<=0){console.warn("No objects to fit camera to...");return}const l=this._cameraObject,c=this._controls;if(!l||!c){console.warn("No camera or controls found to fit camera to objects...");return}t||(t={});const{immediate:h=!1,centerCamera:d="y",cameraNearFar:u="auto",fitOffset:p=1.1,fov:g=l?.fov}=t,f=new S,y=new S,v=ei(r,void 0,(o=(s=this._camera)==null?void 0:s.threeCamera)==null?void 0:o.layers),b=v.clone();l.updateMatrixWorld(),l.updateProjectionMatrix(),v.getCenter(y);const _=new S;if(v.getSize(_),v.applyMatrix4(l.matrixWorldInverse),v.getSize(f),v.setFromCenterAndSize(y,f),Number.isNaN(f.x)||Number.isNaN(f.y)||Number.isNaN(f.z)){console.warn("Camera fit size resultet in NaN",l,v,[...r]);return}if(f.length()<=1e-10){Ic&&console.warn("Camera fit size is zero",v,[...r]);return}const w=t.fov||l.fov,x=2*Math.atan(Math.tan(w*Math.PI/360/2)*l.aspect)/Math.PI*360,M=f.y/(2*Math.atan(Math.PI*w/360)),k=f.x/(2*Math.atan(Math.PI*x/360)),T=p*Math.max(M,k)+f.z/2;Ic&&console.log("Fit camera to objects",{fitHeightDistance:M,fitWidthDistance:k,distance:T,verticalFov:w,horizontalFov:x}),this.maxZoom=T*10,this.minZoom=T*.01;const L=.05,B=y.clone();if(B.y-=f.y*L,this.setLookTargetPosition(B,h),this.setFieldOfView(t.fov,h),u==null||u=="auto"){const E=P.findObjectOfType(Ys),U=E?E.radius:0,$=Math.max(_.x,_.y,_.z,U);l.near=T/100,l.far=$+T*10,E&&(this.maxZoom=Math.max(Math.min(this.maxZoom,U*.5),T))}const z=c.getDistance();z<this.minZoom&&(this.minZoom=z*.9),z>this.maxZoom&&(this.maxZoom=z*1.1),l.updateMatrixWorld(),l.updateProjectionMatrix();const j=ee(l),V=y.clone();V.sub(j),d==="y"&&(V.y=0),V.normalize(),V.multiplyScalar(T),d==="y"&&(V.y+=-L*4*T);let G=y.clone().sub(V);l.parent&&(G=l.parent.worldToLocal(G)),this.setCameraTargetPosition(G,h),(Ic||t.debug)&&(q.DrawWireBox3(v,16777011,10),q.DrawWireBox3(b,65280,10),!this._haveAttachedKeyboardEvents&&Ic&&(this._haveAttachedKeyboardEvents=!0,document.body.addEventListener("keydown",E=>{if(E.code==="KeyF"){let U;this._cameraObject instanceof we&&(U=Math.random()*Math.random()*170+10),this.fitCamera({objects:r,fitOffset:p,immediate:!1,fov:U})}E.code==="KeyV"&&this._cameraObject instanceof we&&(this._cameraObject.fov=60)}))),this.onBeforeRender()}}Ue([m()],_e.prototype,"autoTarget"),Ue([m()],_e.prototype,"autoFit"),Ue([m()],_e.prototype,"enableRotate"),Ue([m()],_e.prototype,"autoRotate"),Ue([m()],_e.prototype,"autoRotateSpeed"),Ue([m()],_e.prototype,"minAzimuthAngle"),Ue([m()],_e.prototype,"maxAzimuthAngle"),Ue([m()],_e.prototype,"minPolarAngle"),Ue([m()],_e.prototype,"maxPolarAngle"),Ue([m()],_e.prototype,"enableKeys"),Ue([m()],_e.prototype,"enableDamping"),Ue([m()],_e.prototype,"dampingFactor"),Ue([m()],_e.prototype,"enableZoom"),Ue([m()],_e.prototype,"minZoom"),Ue([m()],_e.prototype,"maxZoom"),Ue([m()],_e.prototype,"zoomSpeed"),Ue([m()],_e.prototype,"enablePan"),Ue([m(Ar)],_e.prototype,"lookAtConstraint"),Ue([m()],_e.prototype,"lookAtConstraint01"),Ue([m()],_e.prototype,"allowInterrupt"),Ue([m()],_e.prototype,"middleClickToFocus"),Ue([m()],_e.prototype,"doubleClickToFocus"),Ue([m()],_e.prototype,"clickBackgroundToFitScene"),Ue([m()],_e.prototype,"targetLerpDuration");var _T=Object.defineProperty,wT=Object.getOwnPropertyDescriptor,qt=(n,e,t,s)=>{for(var o=s>1?void 0:s?wT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&_T(e,t,o),o},To=(n=>(n[n.None=0]="None",n[n.Skybox=1]="Skybox",n[n.SolidColor=2]="SolidColor",n[n.Uninitialized=4]="Uninitialized",n))(To||{});const Eo=C("debugcam"),mx=C("debugscreenpointtoray");var Ao;const Dt=(Ao=class extends I{constructor(){super(...arguments),a(this,"_nearClipPlane",.1),a(this,"_farClipPlane",1e3),a(this,"orthographic",!1),a(this,"orthographicSize",5),a(this,"ARBackgroundAlpha",0),a(this,"_cullingMask",4294967295),a(this,"_backgroundBlurriness"),a(this,"_backgroundIntensity"),a(this,"_backgroundRotation"),a(this,"_environmentIntensity"),a(this,"_targetTexture",null),a(this,"_backgroundColor"),a(this,"_fov"),a(this,"_cam",null),a(this,"_clearFlags",2),a(this,"_skybox"),a(this,"_frustum"),a(this,"_projScreenMatrix",new se)}get isCamera(){return!0}get aspect(){return this._cam instanceof we?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(n){this._cam instanceof we&&this._cam.aspect!==n&&(this._cam.aspect=n,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof we?this._cam.fov:this._fov}set fieldOfView(n){const e=this.fieldOfView!=n;if(this._fov=n,e&&this._cam&&this._cam instanceof we){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(n){const e=this._nearClipPlane!=n;this._nearClipPlane=n,this._cam&&(e||this._cam.near!=n)&&(this._cam.near=n,this._cam.updateProjectionMatrix())}get farClipPlane(){return this._farClipPlane}set farClipPlane(n){const e=this._farClipPlane!=n;this._farClipPlane=n,this._cam&&(e||this._cam.far!=n)&&(this._cam.far=n,this._cam.updateProjectionMatrix())}applyClippingPlane(){this._cam&&(this._cam.near=this._nearClipPlane,this._cam.far=this._farClipPlane,this._cam.updateProjectionMatrix())}get clearFlags(){return this._clearFlags}set clearFlags(n){if(typeof n=="string")switch(n){case"skybox":n=1;break;case"solidcolor":n=2;break;default:n=0;break}n!==this._clearFlags&&(this._clearFlags=n,this.applyClearFlagsIfIsActiveCamera())}set cullingMask(n){this._cullingMask=n,this._cam&&(this._cam.layers.mask=n)}get cullingMask(){return this._cam?this._cam.layers.mask:this._cullingMask}set cullingLayer(n){this.cullingMask=(1<<n|0)>>>0}set backgroundBlurriness(n){n!==this._backgroundBlurriness&&(n===void 0?this._backgroundBlurriness=void 0:this._backgroundBlurriness=Math.min(Math.max(n,0),1),this.applyClearFlagsIfIsActiveCamera())}get backgroundBlurriness(){return this._backgroundBlurriness}set backgroundIntensity(n){n!==this._backgroundIntensity&&(n===void 0?this._backgroundIntensity=void 0:this._backgroundIntensity=Math.min(Math.max(n,0),10),this.applyClearFlagsIfIsActiveCamera())}get backgroundIntensity(){return this._backgroundIntensity}set backgroundRotation(n){n!==this._backgroundRotation&&(n===void 0?this._backgroundRotation=void 0:this._backgroundRotation=n,this.applyClearFlagsIfIsActiveCamera())}get backgroundRotation(){return this._backgroundRotation}set environmentIntensity(n){this._environmentIntensity=n}get environmentIntensity(){return this._environmentIntensity}get backgroundColor(){return this._backgroundColor??null}set backgroundColor(n){n&&(this._backgroundColor||(this._backgroundColor=new ce(1,1,1,1)),this._backgroundColor.copy(n),(!("alpha"in n)||n.alpha===void 0)&&(this._backgroundColor.alpha=1),this.applyClearFlagsIfIsActiveCamera())}set targetTexture(n){this._targetTexture=n}get targetTexture(){return this._targetTexture}get cam(){return this.threeCamera}get threeCamera(){return this.activeAndEnabled&&this.buildCamera(),this._cam}screenPointToRay(n,e,t){const s=this.threeCamera,o=Ao._origin;o.set(n,e,-1),this.context.input.convertScreenspaceToRaycastSpace(o),mx&&console.log("screenPointToRay",n.toFixed(2),e.toFixed(2),"now:",o.x.toFixed(2),o.y.toFixed(2),"isInXR:"+this.context.isInXR),o.z=-1,o.unproject(s);const r=Ao._direction.set(o.x,o.y,o.z),l=ee(s);return r.sub(l),r.normalize(),t?(t.set(l,r),t):new co(l.clone(),r.clone())}getFrustum(){return this._frustum||(this._frustum=new Sv,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new Sv),this._frustum.setFromProjectionMatrix(this.getProjectionScreenMatrix(this._projScreenMatrix,!0),this.context.renderer.coordinateSystem)}getProjectionScreenMatrix(n,e){return e&&this._projScreenMatrix.multiplyMatrices(this.threeCamera.projectionMatrix,this.threeCamera.matrixWorldInverse),n===this._projScreenMatrix?n:n.copy(this._projScreenMatrix)}awake(){mx&&window.addEventListener("pointerdown",n=>{const e=n.clientX,t=n.clientY;console.log("touch",e.toFixed(2),t.toFixed(2));const s=this.screenPointToRay(e,t),o="#"+Math.floor(Math.random()*16777215).toString(16);q.DrawRay(s.origin,s.direction,o,10)})}onEnable(){Eo&&console.log(`Camera enabled: "${this.name}". ClearFlags=${To[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),ST(this)),this.applyClearFlagsIfIsActiveCamera({applySkybox:!0})}onDisable(){this.context.removeCamera(this)}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 n=this.context.renderer;if(n){const e=this.context.mainCameraComponent;this.applyClearFlags(),this._targetTexture.render(this.context.scene,this._cam,n),e?.applyClearFlags()}}}buildCamera(){if(this._cam)return;const n=this.gameObject.isCamera;let e=null;if(n?(e=this.gameObject,e?.layers.enableAll(),e instanceof we&&(this._fov=e.fov)):e=this.gameObject.children[0],e&&e.isCamera)e instanceof we&&(this._fov&&(e.fov=this._fov),e.near=this._nearClipPlane,e.far=this._farClipPlane,e.updateProjectionMatrix());else if(!this.orthographic)e=new we(this.fieldOfView,window.innerWidth/window.innerHeight,this._nearClipPlane,this._farClipPlane),this.fieldOfView&&(e.fov=this.fieldOfView),this.gameObject.add(e);else{const t=this.orthographicSize*100;e=new Sm(window.innerWidth/-t,window.innerWidth/t,window.innerHeight/t,window.innerHeight/-t,this._nearClipPlane,this._farClipPlane),this.gameObject.add(e)}this._cam=e,this._cam.layers.mask=this._cullingMask,this.tag=="MainCamera"&&this.context.setCurrentCamera(this)}applyClearFlagsIfIsActiveCamera(n){this.context.mainCameraComponent===this&&this.applyClearFlags(n)}applyClearFlags(n){var e;if(!this._cam){Eo&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this._fov,Eo){const s=`[Camera] Apply ClearFlags: ${To[this._clearFlags]} - "${this.name}"`;console.debug(s)}const t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color")||this.context.domElement.getAttribute("skybox-image");switch(this._clearFlags){case 0:return;case 1:if(Ao.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||n?.applySkybox===!0)&&this.applySceneSkybox(),this._backgroundBlurriness!==void 0&&!this.context.domElement.getAttribute("background-blurriness")?this.context.scene.backgroundBlurriness=this._backgroundBlurriness:Eo&&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:Eo&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let s=this._backgroundColor.alpha;Ao.backgroundShouldBeTransparent(this.context)&&(s=this.ARBackgroundAlpha??0),this.context.scene.background=null,(e=this.context.xr)!=null&&e.isVR?this.context.renderer.setClearColor(fb(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,s)}else this._backgroundColor||Eo&&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 xT(this)),this._skybox.apply()}static backgroundShouldBeTransparent(n){var e,t,s,o;const r=(e=n.renderer.xr)==null?void 0:e.getSession();if(!r)return!1;if(typeof r._transparent=="boolean")return r._transparent;const l=r.environmentBlendMode;Eo&&De("Environment blend mode: "+l+" on "+navigator.userAgent);let c=l==="additive"||l==="alpha-blend";return n.isInAR&&l==="opaque"&&((t=navigator.userAgent)!=null&&t.includes("OculusBrowser")||(s=navigator.userAgent)!=null&&s.includes("Mozilla")&&(o=navigator.userAgent)!=null&&o.includes("Mobile WebXRViewer/v2"))&&(c=!0),r._transparent=c,c}},a(Ao,"_origin",new S),a(Ao,"_direction",new S),Ao);qt([m()],Dt.prototype,"aspect",1),qt([m()],Dt.prototype,"fieldOfView",1),qt([m()],Dt.prototype,"nearClipPlane",1),qt([m()],Dt.prototype,"farClipPlane",1),qt([m()],Dt.prototype,"clearFlags",1),qt([m()],Dt.prototype,"orthographic",2),qt([m()],Dt.prototype,"orthographicSize",2),qt([m()],Dt.prototype,"ARBackgroundAlpha",2),qt([m()],Dt.prototype,"cullingMask",1),qt([m()],Dt.prototype,"backgroundBlurriness",1),qt([m()],Dt.prototype,"backgroundIntensity",1),qt([m(It)],Dt.prototype,"backgroundRotation",1),qt([m()],Dt.prototype,"environmentIntensity",1),qt([m(ce)],Dt.prototype,"backgroundColor",1),qt([m(Mc)],Dt.prototype,"targetTexture",1);let ri=Dt;class xT{constructor(e){a(this,"_camera"),a(this,"_skybox"),this._camera=e}get context(){var e;return(e=this._camera)==null?void 0:e.context}apply(){var e;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 t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color")||this.context.domElement.getAttribute("skybox-image");Eo&&console.debug(`[Camera] Apply Skybox ${(e=this._skybox)==null?void 0:e.name} ${t} - "${this._camera.name}"`),t!=null&&t.length||(this._skybox.mapping=Sn,this.context.scene.background=this._skybox)}}}function ST(n){C("freecam")&&n.context.mainCameraComponent===n&&P.getOrAddComponent(n.gameObject,_e)}class Bn extends I{constructor(){super(...arguments),a(this,"_listener",null),a(this,"onInteraction",()=>{this.destroyed||this.listener==null||this.addListenerIfItExists()})}get listener(){return this._listener==null&&(this._listener=new FC),this._listener}onEnable(){En.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){En.unregisterWaitForInteraction(this.onInteraction),this.removeListenerIfItExists()}addListenerIfItExists(){const e=this._listener;if(!e||e!=null&&e.parent)return;const t=this.context.mainCameraComponent||P.getComponentInParent(this.gameObject,ri);t!=null&&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 CT=Object.defineProperty,PT=Object.getOwnPropertyDescriptor,Cs=(n,e,t,s)=>{for(var o=s>1?void 0:s?PT(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&CT(e,t,o),o};const Mt=C("debugaudio"),es=class ar extends I{constructor(){super(...arguments),a(this,"clip",""),a(this,"playOnAwake",!1),a(this,"preload",!0),a(this,"playInBackground",!0),a(this,"_spatialBlend",0),a(this,"_minDistance",1),a(this,"_maxDistance",100),a(this,"_volume",1),a(this,"rollOffMode",0),a(this,"_loop",!1),a(this,"sound",null),a(this,"helper",null),a(this,"wasPlaying",!1),a(this,"audioLoader",null),a(this,"shouldPlay",!1),a(this,"_lastClipStartedLoading",null),a(this,"_audioElement",null),a(this,"onVisibilityChanged",()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||Y.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":Mt&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,ar.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&ar.userInteractionRegistered&&this.wasPlaying&&this.play();break}}),a(this,"onApplicationMuteChanged",()=>{var e,t;this.context.application.muted?(e=this.sound)==null||e.setVolume(0):(t=this.sound)==null||t.setVolume(this.volume)}),a(this,"createAudio",e=>{if(this.destroyed){Mt&&console.warn("AudioSource destroyed, not creating audio",this.name);return}Mt&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){Mt&&console.warn("Failed getting sound?",this.name);return}t.isPlaying&&t.stop(),e&&t.setBuffer(e),t.loop=this._loop,this.context.application.muted?t.setVolume(0):t.setVolume(this.volume),t.autoplay=this.shouldPlay&&ar.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),ar.registerWaitForAllowAudio(this.__onAllowAudioCallback)}),a(this,"__onAllowAudioCallback",()=>{this.shouldPlay&&this.play()}),a(this,"_lastContextTime",0),a(this,"_hasEnded",!0),a(this,"_needUpdateSpatialDistanceSettings",!1)}static get userInteractionRegistered(){return En.userInteractionRegistered}static registerWaitForAllowAudio(e){En.registerWaitForInteraction(e)}get isPlaying(){var e;return((e=this.sound)==null?void 0:e.isPlaying)??!1}get duration(){var e,t;return(t=(e=this.sound)==null?void 0:e.buffer)==null?void 0:t.duration}get time01(){var e;const t=this.duration;return t&&this.sound?((e=this.sound)==null?void 0:e.context.currentTime)/t:0}set time01(e){const t=this.duration;t&&this.sound&&(this.time=e*t)}get time(){var e,t;return(e=this.sound)!=null&&e.source?((t=this.sound.source)==null?void 0:t.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)}get volume(){return this._volume}set volume(e){this._volume=e,this.sound&&!this.context.application.muted&&(Mt&&console.log(this.name,"audio set volume",e),this.sound.setVolume(e))}set pitch(e){this.sound&&this.sound.setPlaybackRate(e)}get pitch(){return this.sound?this.sound.getPlaybackRate():1}get Sound(){var e;if(!this.sound&&ar.userInteractionRegistered){let t=this.gameObject.getComponent(Bn)??this.context.mainCamera.getComponent(Bn)??vc(Bn,this.context,!1);!t&&this.context.mainCamera&&(t=this.context.mainCamera.addComponent(Bn)),t!=null&&t.listener?(this.sound=new UC(t.listener),(e=this.gameObject)==null||e.add(this.sound)):Mt&&console.warn("No audio listener found in scene - can not play audio")}return this.sound}get ShouldPlay(){return this.shouldPlay}get audioContext(){var e;return(e=this.sound)==null?void 0:e.context}awake(){Mt&&console.log("[AudioSource]",this),this.audioLoader=new Cm,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),ar.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():ar.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(mg.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(mg.MuteChanged,this.onApplicationMuteChanged),this.pause()}applySpatialDistanceSettings(){const e=this.sound;if(!e)return;this._needUpdateSpatialDistanceSettings=!1;const t=W.lerp(10*this._maxDistance/Math.max(1e-4,this.spatialBlend),this._minDistance,this.spatialBlend);switch(Mt&&console.log(this.name,this._minDistance,this._maxDistance,this.spatialBlend,"Ref distance="+t),e.setRefDistance(t),e.setMaxDistance(Math.max(.01,this._maxDistance)),this.rollOffMode){case 0:e.setDistanceModel("exponential");break;case 1:e.setDistanceModel("linear");break;case 2:console.warn("Custom rolloff for AudioSource is not supported: "+this.name);break}this.spatialBlend>0?Mt&&!this.helper&&(this.helper=new HP(e,e.getRefDistance()),e.add(this.helper)):this.helper&&this.helper.parent&&this.helper.removeFromParent()}async onNewClip(e){if(e&&(this.clip=e),typeof e=="string")if(Mt&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new Cm),this.shouldPlay=!0,this._lastClipStartedLoading===e){Mt&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,Mt&&console.log("load audio",e);const t=await this.audioLoader.loadAsync(e).catch(console.error);if(this.destroyed)return;this._lastClipStartedLoading===e&&(this._lastClipStartedLoading=null),t&&this.createAudio(t)}else console.warn("Unsupported audio clip type",e);else this.shouldPlay=!0,this.createAudio()}play(e=void 0){var t,s,o;!e&&this.clip&&(e=this.clip),e!==void 0&&typeof e!="string"&&!(e instanceof MediaStream)&&(F()&&console.warn("Called play on AudioSource with unknown argument type:",e+`
928
- Using the assigned clip instead:`,this.clip),e=this.clip);let r=!this.sound||e&&e!==this.clip;if(typeof e=="string"&&!this.audioLoader&&(r=!0),(e instanceof MediaStream||typeof e=="string")&&(this.clip=e),r){this.shouldPlay=!0,this.onNewClip(e);return}if(this.shouldPlay=!0,this._hasEnded=!1,Mt&&console.log("play",(t=this.sound)==null?void 0:t.getVolume(),this.sound),this.sound&&!this.sound.isPlaying){const l=this.context.application.muted;l&&this.sound.setVolume(0),(s=this.gameObject)==null||s.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||(o=this.context.domElement.shadowRoot)==null||o.append(this._audioElement),this._audioElement.srcObject=this.clip,this._audioElement.autoplay=!1):(this._audioElement&&this._audioElement.remove(),this.sound.play(l?.1:0))}}pause(){var e,t;Mt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.isPlaying&&this.sound.source&&(this._lastContextTime=(e=this.sound)==null?void 0:e.context.currentTime,this.sound.pause()),(t=this._audioElement)==null||t.remove()}stop(){var e,t;Mt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=(e=this.sound)==null?void 0:e.context.currentTime,Mt&&console.log(this._lastContextTime),this.sound.stop()),(t=this._audioElement)==null||t.remove()}update(){this.helper&&(this.isPlaying&&this.helper.update(),this.helper.visible=this.isPlaying),this._needUpdateSpatialDistanceSettings&&this.applySpatialDistanceSettings(),this.sound&&!this.sound.isPlaying&&this.shouldPlay&&!this._hasEnded&&(this._hasEnded=!0,Mt&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};Cs([m(URL)],es.prototype,"clip",2),Cs([m()],es.prototype,"playOnAwake",2),Cs([m()],es.prototype,"preload",2),Cs([m()],es.prototype,"playInBackground",2),Cs([m()],es.prototype,"loop",1),Cs([m()],es.prototype,"spatialBlend",1),Cs([m()],es.prototype,"minDistance",1),Cs([m()],es.prototype,"maxDistance",1),Cs([m()],es.prototype,"volume",1),Cs([m()],es.prototype,"pitch",1),Cs([m()],es.prototype,"rollOffMode",2);let ts=es;const OT=C("debugavatar"),Cu=class yn extends I{constructor(){super(...arguments),a(this,"connectionId"),a(this,"avatar")}static getAvatar(e){return e>=0&&e<yn.instances.length?yn.instances[e]:null}static onAvatarMarkerCreated(e){return yn._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return yn._onAvatarMarkerDestroyed.push(e),e}awake(){yn.instances.push(this),OT&&console.log(this);for(const e of yn._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){yn.instances.splice(yn.instances.indexOf(this),1);for(const e of yn._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}};a(Cu,"instances",[]),a(Cu,"_onNewAvatarMarkerAdded",[]),a(Cu,"_onAvatarMarkerDestroyed",[]);let ai=Cu;class Fn{static Add(e,t,s=null){if(t){for(const o of this.Pois)if(o.obj===t)return;this.Pois.push({obj:t,avatar:s}),this.LastChangeTime=e.time.time}}static Remove(e,t){var s;if(t){for(const o of this.Pois)if(o.obj===t){this.Pois.splice(this.Pois.indexOf(o),1),this.LastChangeTime=e?.time.time??((s=J.Current)==null?void 0:s.time.time);return}}}}a(Fn,"Pois",[]),a(Fn,"LastChangeTime",0);class kT{constructor(){a(this,"guid"),a(this,"position",new S)}}class jc extends I{constructor(){super(...arguments),a(this,"target",null),a(this,"avatar",null),a(this,"_model",null),a(this,"_targetModel",new kT),a(this,"_currentTargetObject",null),a(this,"_lastUpdateTime",0),a(this,"_lookDuration",0),a(this,"_lastPoiChangedTime",0)}set controlledTarget(e){this.target=e;const t=R.get("MoveRandom");if(t&&this.target){const s=P.getComponent(this.target,t);s&&s.destroy()}}awake(){if(this.avatar=P.getComponentInParent(this.gameObject,ai),this.avatar){const e=P.getComponentInParent(this.gameObject,ai);this._model=new _g(this.context.connection,this.guid),e!=null&&e.isLocalAvatar&&this._model.requestOwnership()}this.context.connection.beginListen("avatar-look-target-changed",e=>{var t;this.target&&e&&e.guid===((t=this.avatar)==null?void 0:t.guid)&&at(this.target,e.position)})}update(){var e;if((!this.context.connection.isConnected||(e=this._model)!=null&&e.hasOwnership)&&(Fn.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=Fn.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const t=ee(this._currentTargetObject);at(this.target,t),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(t))}}selectTarget(){if(this.context.time.time-this._lastUpdateTime>this._lookDuration){this._lastUpdateTime=this.context.time.time,this._lookDuration=Math.random()*.5+.2;const e=Fn.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 gx(n){const e=n;return!!(e.parser&&e.parser.json)}var Pu=(n=>(n[n.None=0]="None",n[n.DontExport=1]="DontExport",n))(Pu||{});function fx(n){return n&&n.isComponent}const MT=Symbol("object"),If=new Si(()=>new S,20);class yx{constructor(e,t,s,o,r,l){a(this,"_point"),a(this,"_normal"),a(this,"_tangentVelocity"),a(this,"distance"),a(this,"impulse"),a(this,"friction"),this._point=e,this.distance=t,this._normal=s,this.impulse=o,this.friction=r,this._tangentVelocity=l}get point(){return If.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return If.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return If.get().set(this._tangentVelocity.x,this._tangentVelocity.y,this._tangentVelocity.z)}}class vx{constructor(e,t,s){a(this,"contacts"),a(this,"me"),a(this,"_collider"),a(this,"_gameObject"),this.me=e,this._collider=t,this._gameObject=t.gameObject,this.contacts=s}get collider(){return this._collider}get gameObject(){return this._gameObject}get rigidBody(){var e;return(e=this.collider)==null?void 0:e.attachedRigidbody}}class bx{constructor(e,t){a(this,"object"),a(this,"collider"),this.object=e,this.collider=t}}const Ye=C("debugnetworkingstreams");var Js=(n=>(n.Connected="peer-user-connected",n.StreamReceived="receive-stream",n.StreamEnded="call-ended",n.Disconnected="peer-user-disconnected",n.UserJoined="user-joined",n))(Js||{});class Lf{constructor(e,t){a(this,"type","call-ended"),a(this,"userId"),a(this,"direction"),this.userId=e,this.direction=t}}class _x{constructor(e,t,s){a(this,"type","receive-stream"),a(this,"userId"),a(this,"stream"),a(this,"target"),this.userId=e,this.stream=t,this.target=s}}class RT{constructor(e,t){a(this,"guid"),a(this,"peerId"),a(this,"dontSave",!0),this.guid=e.id,this.peerId=t}}var wx=(n=>(n.Incoming="incoming",n.Outgoing="outgoing",n))(wx||{});class TT extends Pm{constructor(e,t,s,o=null){super(),a(this,"peerId"),a(this,"userId"),a(this,"direction"),a(this,"call"),a(this,"_stream",null),a(this,"_isDisposed",!1),this.peerId=t.peer,this.userId=e,this.call=t,this.direction=s,this._stream=o,t.on("stream",r=>{if(Ye&&console.log("Receive stream",`
929
- Audio:`,r.getAudioTracks(),`
930
- Video:`,r.getVideoTracks()),this._stream=r,s==="incoming"){const l=new _x(e,r,this);this.dispatchEvent(l)}}),t.on("close",()=>{this.dispatchEvent(new Lf(e,s))})}get stream(){return this._stream}close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),en(this._stream))}get isOpen(){var e;return((e=this.call.peerConnection)==null?void 0:e.connectionState)==="connected"}get isOpening(){var e;return((e=this.call.peerConnection)==null?void 0:e.connectionState)==="connecting"}get isClosed(){return!this.isOpen||this._isDisposed}}function xx(n){return n=n.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1"),n}const Sx=class Yh extends Pm{constructor(e,t){super(),a(this,"updateCalls",()=>{var s;for(let o=this._incomingCalls.length-1;o>=0;o--){const r=this._incomingCalls[o];r.isClosed&&!r.isOpening&&this._incomingCalls.splice(o,1)}for(let o=this._outgoingCalls.length-1;o>=0;o--){const r=this._outgoingCalls[o];let l=!1;r.isClosed&&!r.isOpening&&((s=r.stream)!=null&&s.active?Ye&&console.warn("!!! Stream is still active, don't remove call",r.userId,"Your id: "+this.context.connection.connectionId):(Ye&&console.warn("!!! Remove closed call",r.userId),l=!0)),this.context.connection.userIsInRoom(r.userId)===!1&&(Ye&&console.warn("!!! User is not in room anymore, remove call",r.userId),l=!0),l&&(r.close(),this._outgoingCalls.splice(o,1))}}),a(this,"id"),a(this,"context"),a(this,"_incomingCalls",[]),a(this,"_outgoingCalls",[]),a(this,"_peer"),a(this,"_enabled",!1),a(this,"_enabledPeer",!1),a(this,"onConnectRoomFn",this.onConnectRoom.bind(this)),a(this,"onPeerConnect",s=>{if(Ye&&console.log("PEER opened as",s),s===null){console.error("Peer connection failed",s);return}this.context.connection.send("peer-user-connected",new RT(this,s))}),a(this,"onPeerClose",()=>{Ye&&console.log("PEER closed"),this.updateCalls()}),a(this,"onPeerDisconnected",()=>{Ye&&console.log("PEER disconnected"),this.updateCalls()}),a(this,"onPeerError",s=>{Ye&&console.error("PEER error",s)}),a(this,"onPeerReceivingCall",s=>{s.answer(void 0,{sdpTransform:o=>xx(o)}),this.registerCall(s,"incoming",null)}),this.context=e,this.id=t,this.setupPeer(),navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia}static getOrCreate(e,t){if(Yh.instances.has(t))return Yh.instances.get(t);const s=new Yh(e,t);return Yh.instances.set(t,s),s}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){var s;if(!(t!=null&&t.id)){Ye?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 o={metadata:{userId:this.context.connection.connectionId,streamId:t.id},sdpTransform:l=>xx(l)},r=(s=this._peer)==null?void 0:s.call(e,t,o);if(r){const l=this.registerCall(r,"outgoing",t);return Ye&&console.warn(`\u{1F4DE} CALL ${e}`,`
931
- Outgoing:`,this._outgoingCalls,`
932
- Incoming:`,this._incomingCalls),l}else Ye&&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()}get peer(){return this._peer}get incomingCalls(){return this._incomingCalls}enable(){this._enabled||(this._enabled=!0,this.context.connection.beginListen(ie.JoinedRoom,this.onConnectRoomFn),this.subscribePeerEvents())}disable(){this._enabled&&(this._enabled=!1,this.context.connection.stopListen(ie.JoinedRoom,this.onConnectRoomFn),this.unsubscribePeerEvents())}onConnectRoom(){this.setupPeer()}setupPeer(){if(this.context.connection.connectionId&&!this._enabledPeer){if(this._enabledPeer=!0,!this._peer){const e=this.getMyPeerId();e?this._peer=e_(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))}registerCall(e,t,s){const o=e.metadata;(!o||!o.userId)&&console.error("Missing call metadata",e);const r=o.userId;t==="incoming"&&Ye?console.warn("\u2190 Receive call from",e.metadata,e.connectionId):Ye&&console.warn("\u2192 Make call to",e.metadata);const l=t==="incoming"?this._incomingCalls:this._outgoingCalls,c=new TT(r,e,t,s);return l.push(c),e.on("error",h=>{console.error("Call error",h)}),e.on("close",()=>{Ye&&console.log("Call ended",e.metadata);const h=l.indexOf(c);h!==-1&&l.splice(h,1),c.close(),this.dispatchEvent(new Lf(r,t))}),c.addEventListener("call-ended",h=>{this.dispatchEvent(h)}),t==="incoming"&&(c.addEventListener("receive-stream",h=>{this.dispatchEvent(h)}),e.on("stream",()=>{Ye&&console.log("Received stream for call",e.metadata);let h=0;const d=setInterval(()=>{const u=h===0;!c.isOpen&&u&&(Ye&&console.warn("Close call because stream is not active",e.metadata),h+=1,clearInterval(d),c.close())},2e3)})),c}};a(Sx,"instances",new Map);let Ou=Sx;class id extends Pm{constructor(e,t){if(super(),a(this,"context"),a(this,"peer"),a(this,"_sendingStreams",new Map),a(this,"debug",!1),a(this,"_enabled",!1),a(this,"_tickIntervalId"),a(this,"tick",()=>{this.updateSendingCalls()}),a(this,"onJoinedRoom",s=>{this._sendingStreams.size>0&&(this.debug&&console.warn(`${s!=null&&s.userId?`User ${s.userId}`:"You"} joined room`,s,this._sendingStreams.size),this.updateSendingCalls())}),a(this,"onLeftRoom",s=>{this.debug&&console.warn(`${s?.userId||"You"} left room`,s),this.stopCallsToUsersThatAreNotInTheRoomAnymore(),this.peer.closeAll()}),a(this,"onCallStreamReceived",s=>{this.debug&&console.log("Call with "+s.userId+" started"),this.dispatchEvent({type:"receive-stream",target:this,stream:s.stream,userId:s.userId}),this.debug&&this.debugLogCurrentState()}),a(this,"onCallEnded",s=>{this.debug&&console.log("Call with "+s.userId+" ended"),this.dispatchEvent(s),this.debug&&this.debugLogCurrentState()}),a(this,"onUserConnected",s=>{if(this.peer.id===s.guid){this.debug&&console.log("PEER USER CONNECTED",s.guid,s,this._sendingStreams.size);const o=this._sendingStreams.keys().next().value;this.peer.makeCall(s.peerId,o)}else Ye&&console.log("Unknown user connected",s.guid,s.peerId)}),a(this,"onUserLeft",s=>{this.debug&&console.log("User left room: "+s.userId),this.stopCallsToUsersThatAreNotInTheRoomAnymore()}),fx(e)){const s=e;e=s.context,t=Ou.getOrCreate(s.context,s.guid)}else typeof t=="string"&&(t=Ou.getOrCreate(e,t));if(e){if(!(e instanceof J))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,Ye&&(this.debug=!0)}static create(e,t){const s=Ou.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new id(e.context,s)}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 s of t)s.close();t.length=0}this._sendingStreams.delete(e),t&&this.debug&&this.debugLogCurrentState()}this.updateSendingCalls()}get enabled(){return this._enabled}enable(){this._enabled||(this._enabled=!0,this.peer.enable(),this.peer.addEventListener("receive-stream",this.onCallStreamReceived),this.peer.addEventListener("call-ended",this.onCallEnded),this.context.connection.beginListen("peer-user-connected",this.onUserConnected),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId=setInterval(this.tick,5e3))}disable(){this._enabled&&(this._enabled=!1,this.peer.disable(),this.peer.removeEventListener("receive-stream",this.onCallStreamReceived),this.peer.removeEventListener("call-ended",this.onCallEnded),this.context.connection.stopListen("peer-user-connected",this.onUserConnected),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserJoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeft),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this._tickIntervalId!=null&&(clearInterval(this._tickIntervalId),this._tickIntervalId=void 0))}updateSendingCalls(){const e=this.context.connection.connectionId;for(const t of this._sendingStreams.keys()){const s=this._sendingStreams.get(t)||[];for(const o of this.context.connection.usersInRoom()){if(o===e)continue;const r=this.peer.getPeerIdFromUserId(o);if(s.find(l=>{var c;return l.peerId===r&&l.direction==="outgoing"&&!l.isClosed&&((c=l.stream)==null?void 0:c.active)}))Ye&&console.debug("Already have a call with user "+o+" / peer "+r);else{const l=this.peer.makeCall(r,t);l&&s.push(l)}}this._sendingStreams.set(t,s)}this.stopCallsToUsersThatAreNotInTheRoomAnymore()}stopCallsToUsersThatAreNotInTheRoomAnymore(){for(const e of this._sendingStreams.keys()){const t=this._sendingStreams.get(e);if(t)for(let s=t.length-1;s>=0;s--){const o=t[s];this.context.connection.userIsInRoom(o.userId)?Ye&&(this.context.connection.connectionId===o.userId?console.warn(`You are still in the room [${s}] ${o.userId}`):console.log(`User is still in room [${s}] ${o.userId}`)):(Ye&&console.log(`Remove call ${[s]} to user that is not in room anymore ${o.userId}`),o.close(),t.splice(s,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 en(n){if(n&&n instanceof MediaStream)for(const e of n.getTracks())e.stop()}var ET=Object.defineProperty,jf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&ET(e,t,o),o};const AT="noVoip",IT=C("debugvoip");class Io extends I{constructor(){super(...arguments),a(this,"autoConnect",!0),a(this,"runInBackground",!0),a(this,"createMenuButton",!0),a(this,"debug",!1),a(this,"_net"),a(this,"_menubutton"),a(this,"_allowSending",!0),a(this,"_outputStream",null),a(this,"onJoinedRoom",async()=>{this.debug&&console.log("VOIP: Joined room"),await fs(300),this.autoConnect&&!this.isSending&&this._allowSending&&this.connect()}),a(this,"onLeftRoom",()=>{this.debug&&console.log("VOIP: Left room"),this.disconnect();for(const e of this._incomingStreams.values())en(e.srcObject);this._incomingStreams.clear()}),a(this,"_incomingStreams",new Map),a(this,"onReceiveStream",e=>{const t=e.target.userId,s=e.stream;let o=this._incomingStreams.get(t);o||(o=new Audio,this._incomingStreams.set(t,o)),o.srcObject=s,o.setAttribute("autoplay","true"),En.registerWaitForInteraction(()=>{o?.play().catch(r=>{console.error("VOIP: Failed to play audio",r)})})}),a(this,"onStreamEnded",e=>{const t=this._incomingStreams.get(e.userId);en(t?.srcObject),this._incomingStreams.delete(e.userId)}),a(this,"onEnabledChanged",()=>{for(const e of this._incomingStreams){const t=e[1];t.muted=!this.enabled}}),a(this,"onVisibilityChanged",()=>{if(this.runInBackground)return;const e=document.visibilityState!=="visible";this.setMuted(e);for(const t of this._incomingStreams){const s=t[1];s.muted=e}})}awake(){IT&&(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=id.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(Js.StreamReceived,this.onReceiveStream),this._net.addEventListener(Js.StreamEnded,this.onStreamEnded),this._net.enable(),this.autoConnect&&this.context.connection.isConnected&&this.connect(),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.addEventListener("visibilitychange",this.onVisibilityChanged)}onDisable(){var e;this._net&&(this._net.stopSendingStream(this._outputStream),this._net.removeEventListener(Js.StreamReceived,this.onReceiveStream),this._net.removeEventListener(Js.StreamEnded,this.onStreamEnded),(e=this._net)==null||e.disable()),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.removeEventListener("visibilitychange",this.onVisibilityChanged)}onDestroy(){var e;(e=this._menubutton)==null||e.remove(),this._menubutton=void 0}get isSending(){return this._outputStream!=null&&this._outputStream.active}async connect(e){var t,s;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 Y.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,(t=this._net)==null||t.stopSendingStream(this._outputStream),en(this._outputStream),this._outputStream=await this.getAudioStream(e),this._outputStream?(this.debug&&console.log("VOIP: Got audio stream"),(s=this._net)==null||s.startSendingStream(this._outputStream),this.updateButton(),!0):(this.updateButton(),await Y.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||F())&&console.log("VOIP: Failed to get audio stream"),!1)}disconnect(e){var t;e!=null&&e.remember&&(this._allowSending=!1),(t=this._net)==null||t.stopSendingStream(this._outputStream),en(this._outputStream),this._outputStream=null,this.updateButton()}setMuted(e){var t;const s=(t=this._outputStream)==null?void 0:t.getAudioTracks();if(s)for(const o of s)o.enabled=!e}get isMuted(){var e;if(this._outputStream===null)return!1;const t=(e=this._outputStream)==null?void 0:e.getAudioTracks();if(t){for(const s of t)if(!s.enabled)return!0}return!1}async updateButton(){var e;if(this.createMenuButton){if(this._menubutton||(this._menubutton=document.createElement("button"),this._menubutton.addEventListener("click",()=>{this.isSending?this.disconnect({remember:!0}):this.connect(),Y.microphonePermissionsGranted().then(t=>{t||be("<strong>Microphone permissions not granted</strong>. Please allow your browser to use the microphone to be able to talk. Click on the button on the left side of your browser's address bar to allow microphone permissions.")})})),this._menubutton){this.context.menu.appendChild(this._menubutton),this.activeAndEnabled?this._menubutton.style.display="":this._menubutton.style.display="none",this._menubutton.title=this.isSending?"Click to disable your microphone":"Click to enable your microphone";let t=(this.isSending,""),s=this.isSending?"mic":"mic_off";await Y.microphonePermissionsGranted()||(t="No Permission",s="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=t,this._menubutton.prepend(Pt(s)),this.context.connection.isConnected==!1?this._menubutton.setAttribute("disabled",""):this._menubutton.removeAttribute("disabled")}}else this.activeAndEnabled||(e=this._menubutton)==null||e.remove()}getFrequency(e){return this.unsupported_getfrequency||(this.unsupported_getfrequency=!0,F()&&be("VOIP: getFrequency is currently not supported"),console.warn("VOIP: getFrequency is currently not supported")),null}async getAudioStream(e){if(!navigator.mediaDevices.getUserMedia)return console.error("No getDisplayMedia support"),null;const t=async o=>await navigator.mediaDevices.getUserMedia({audio:o??!0,video:!1}).catch(r=>(console.warn("VOIP failed getting audio stream",r),null)),s=await t(e);if(!s)return null;if(Y.isiOS()&&e?.deviceId===void 0){const o=(await navigator.mediaDevices.enumerateDevices()).find(r=>(r.kind==="audioinput"||r.kind==="audiooutput")&&!r.label.includes("iPhone"));if(o){const r=Object.assign({},e);return r.deviceId=o.deviceId,await t(r)}}return s}}jf([m()],Io.prototype,"autoConnect"),jf([m()],Io.prototype,"runInBackground"),jf([m()],Io.prototype,"createMenuButton");var LT=Object.defineProperty,Cx=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&LT(e,t,o),o};const jT=C("debugmouth");class Dc extends I{constructor(){super(...arguments),a(this,"idle",[]),a(this,"talking",[]),a(this,"marker",null),a(this,"voip",null),a(this,"lastMouthChangeTime",0),a(this,"mouthChangeLength",0)}awake(){setTimeout(()=>{this.voip=P.findObjectOfType(Io,this.context),this.marker||(this.marker=P.getComponentInParent(this.gameObject,ai))},3e3)}update(){var e;if(!this.voip||this.context.time.frameCount%10!==0)return;let t=((e=this.marker)==null?void 0:e.connectionId)??null;if(!t){jT&&(t=null);return}const s=this.voip.getFrequency(t)??0;this.updateLips(s)}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(s=>s.visible=!1):this.talking.map(s=>s.visible=!1);for(let s=0;s<e.length;s++){const o=e[s];o&&(o.visible=s===t)}}}}Cx([m(A)],Dc.prototype,"idle"),Cx([m(A)],Dc.prototype,"talking");class Df extends I{constructor(){super(...arguments),a(this,"voip",null),a(this,"marker",null),a(this,"_startPosition",null)}awake(){this.voip=P.findObjectOfType(Io,this.context),this.marker=P.getComponentInParent(this.gameObject,ai)}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 s=t/100;this.gameObject.position.y=this._startPosition.y+s*.07}}var DT=Object.defineProperty,BT=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&DT(e,t,o),o};const $a=C("debugxrflags"),Px=C("disablexrflags");Px&&console.warn("XRFlags are disabled");var tn=(n=>(n[n.Never=0]="Never",n[n.Browser=1]="Browser",n[n.AR=2]="AR",n[n.VR=4]="VR",n[n.FirstPerson=8]="FirstPerson",n[n.ThirdPerson=16]="ThirdPerson",n[n.All=4294967295]="All",n))(tn||{});const Bf=class{constructor(){a(this,"Mask",17)}Has(e){return(this.Mask&e)!==0}Set(e){$a&&console.warn("Set XR flag state to",e),this.Mask=e,is.Apply()}Enable(e){this.Mask|=e,is.Apply()}Disable(e){this.Mask&=~e,is.Apply()}Toggle(e){this.Mask^=e,is.Apply()}EnableAll(){this.Mask=-1,is.Apply()}DisableAll(){this.Mask=0,is.Apply()}};a(Bf,"Global",new Bf);let Ii=Bf;var Li;const Ox=(Li=class extends I{constructor(){super(...arguments),a(this,"visibleIn")}static Apply(){for(const n of this.registry)n.UpdateVisible(Ii.Global)}awake(){Li.registry.push(this)}onEnable(){Li.firstApply?this.UpdateVisible(Ii.Global):(Li.firstApply=!0,Li.Apply())}onDestroy(){const n=Li.registry.indexOf(this);n>=0&&Li.registry.splice(n,1)}get isOn(){return this.gameObject.visible}UpdateVisible(n=null){if(Px)return;let e;const t=n;if(t&&typeof t=="number"&&(console.assert(typeof t=="number","XRFlag.UpdateVisible: state must be a number",t),$a&&console.log(t),Li.buffer.Mask=t,n=Li.buffer),n instanceof Ii?($a&&console.warn(this.name,"use passed in mask",n.Mask,this.visibleIn),e=n.Has(this.visibleIn)):($a&&console.log(this.name,"use global mask"),Ii.Global.Has(this.visibleIn)),e!==void 0)if(e)$a&&console.log(this.name,"is visible",this.gameObject.uuid),P.setActive(this.gameObject,!0);else{if($a&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}},a(Li,"registry",[]),a(Li,"firstApply"),a(Li,"buffer",new Ii),Li);BT([m()],Ox.prototype,"visibleIn");let is=Ox;var FT=Object.defineProperty,ku=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&FT(e,t,o),o};class Lr extends I{constructor(){super(...arguments),a(this,"eyes",[]),a(this,"lastBlinkTime",0),a(this,"blinkLength",0),a(this,"eyesOpen",!0),a(this,"state",null)}awake(){this.state=P.getComponentInParent(this.gameObject,is)}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)}}}ku([m(A)],Lr.prototype,"eyes"),ku([m()],Lr.prototype,"lastBlinkTime"),ku([m()],Lr.prototype,"blinkLength"),ku([m()],Lr.prototype,"eyesOpen");var UT=Object.defineProperty,Ff=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&UT(e,t,o),o},Mu;const Ru=(Mu=class extends I{constructor(){super(...arguments),a(this,"head",null),a(this,"eyes",null),a(this,"target",null),a(this,"brain",null),a(this,"vec",new S),a(this,"currentTargetPoint",new S)}awake(){this.brain||(this.brain=P.getComponentInParent(this.gameObject,jc)),this.brain||(this.brain=P.addComponent(this.gameObject,jc)),this.brain&&this.target&&(this.brain.controlledTarget=this.target)}update(){const n=this.target;if(n&&this.head){const e=this.eyes;if(e){const t=ee(n);this.currentTargetPoint.lerp(t,this.context.time.deltaTime/.1);const s=ee(this.head),o=this.vec.copy(this.currentTargetPoint).sub(s).normalize();if(o.length()<.1)return;const r=Mu.forward;if(r.set(0,0,1),r.applyQuaternion(Se(this.head)),r.dot(o)>.45)for(let l=0;l<e.length;l++)e[l].lookAt(this.currentTargetPoint)}}}},a(Mu,"forward",new S(0,0,1)),Mu);Ff([m(A)],Ru.prototype,"head"),Ff([m(A)],Ru.prototype,"eyes"),Ff([m(A)],Ru.prototype,"target");let Uf=Ru;var zT=Object.defineProperty,zf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&zT(e,t,o),o};class Ga extends I{constructor(){super(...arguments),a(this,"length",1),a(this,"depthTest",!0),a(this,"isGizmo",!1),a(this,"_axes",null)}onEnable(){if(this.isGizmo&&!pc)return;this._axes||(this._axes=new wi(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)}}zf([m()],Ga.prototype,"length"),zf([m()],Ga.prototype,"depthTest"),zf([m()],Ga.prototype,"isGizmo");class Nf extends I{constructor(){super(...arguments),a(this,"from"),a(this,"to"),a(this,"hint"),a(this,"desiredDistance",1)}onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=ee(this.to).clone(),t=ee(this.from).clone(),s=e.distanceTo(t),o=e.clone();o.sub(t);const r=t.clone();r.add(e),r.multiplyScalar(.5);const l=ee(this.hint).clone();l.sub(r);const c=new S;c.crossVectors(l,o),c.crossVectors(o,c),c.normalize();const h=s*.5,d=Math.max(this.desiredDistance,h),u=Math.sqrt(d*d-h*h),p=c.clone();p.multiplyScalar(u),p.add(r),at(this.gameObject,p);const g=r.clone();g.sub(c),this.gameObject.lookAt(g)}}const NT=C("gizmos"),WT=C("debugboxhelper"),Bc=class vn extends I{constructor(){super(...arguments),a(this,"box",null),a(this,"_lastMatrixUpdateFrame",-1),a(this,"_helper",null),a(this,"_color",null)}isInBox(e){var t;if(!e)return;if(this.box||(this.box=new _i),ei([e],void 0,void 0,vn.testBox),vn.testBox.isEmpty()){const o=ee(e,vn._position);vn.testBox.setFromCenterAndSize(o,vn._emptyObjectSize)}this.updateBox();const s=(t=this.box)==null?void 0:t.intersectsBox(vn.testBox);return s&&WT&&q.DrawWireBox3(vn.testBox,16711680,5),s}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new _i),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const s=t,o=ee(this.gameObject,vn._position,s),r=Ge(this.gameObject,vn._size);this.box.setFromCenterAndSize(o,r)}return this.box}awake(){this._helper=null,this._color=null,this.box=null}showHelper(e=null,t=!1){var s;if(!(!NT&&!t)){if(this._helper){e&&((s=this._color)==null||s.set(e)),this.gameObject.add(this._helper);return}this._helper=Eg(e),this.gameObject.add(this._helper)}}};a(Bc,"testBox",new _i),a(Bc,"_position",new S),a(Bc,"_size",new S(.01,.01,.01)),a(Bc,"_emptyObjectSize",new S(.01,.01,.01));let Lo=Bc;var VT=Object.defineProperty,li=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&VT(e,t,o),o};class ci extends I{constructor(){super(...arguments),a(this,"attachedRigidbody",null),a(this,"isTrigger",!1),a(this,"sharedMaterial"),a(this,"membership",[0]),a(this,"filter"),a(this,"updateProperties",()=>{var e;(e=this.context.physics.engine)==null||e.updateProperties(this)})}get isCollider(){return!0}awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(ht))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(ht))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(ht))}onDisable(){var e;(e=this.context.physics.engine)==null||e.removeBody(this)}get body(){var e;return(e=this.context.physics.engine)==null?void 0:e.getBody(this)}updatePhysicsMaterial(){var e;(e=this.context.physics.engine)==null||e.updatePhysicsMaterial(this)}}li([m(ht)],ci.prototype,"attachedRigidbody"),li([m()],ci.prototype,"isTrigger"),li([m()],ci.prototype,"sharedMaterial"),li([m()],ci.prototype,"membership"),li([m()],ci.prototype,"filter");class qa extends ci{constructor(){super(...arguments),a(this,"radius",.5),a(this,"center",new S(0,0,0))}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addSphereCollider(this),gd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Um(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}li([kt(),m()],qa.prototype,"radius"),li([m(S)],qa.prototype,"center");const Wf=class nC extends ci{constructor(){super(...arguments),a(this,"size",new S(1,1,1)),a(this,"center",new S(0,0,0))}static add(e,t){const s=Mi(e,nC);return s.autoFit(),t?.rigidbody===!0&&Mi(e,ht,{isKinematic:!1}),s}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addBoxCollider(this,this.size),gd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Um(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}autoFit(e){const t=this.gameObject,s=t.position.clone(),o=t.quaternion.clone(),r=t.scale.clone(),l=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 c=ei([t]);t.position.copy(s),t.quaternion.copy(o),t.scale.copy(r),t.parent=l,e?.debug===!0&&q.DrawWireBox3(c,16768256,20),this.size=c.getSize(new S)||new S(1,1,1),this.center=c.getCenter(new S)||new S(0,0,0),this.size.length()<=0&&this.size.set(.01,.01,.01)}};li([kt(),m(S)],Wf.prototype,"size"),li([m(S)],Wf.prototype,"center");let Tu=Wf;class jo extends ci{constructor(){super(...arguments),a(this,"sharedMesh"),a(this,"convex",!1)}onEnable(){var e,t,s;if(super.onEnable(),!this.context.physics.engine)return;(e=this.sharedMesh)!=null&&e.isMesh||(this.gameObject instanceof X||this.gameObject instanceof ho)&&(this.sharedMesh=this.gameObject);const o=0;if((t=this.sharedMesh)!=null&&t.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),Xe.assignMeshLOD(this.sharedMesh,o).then(r=>{r&&this.activeAndEnabled&&this.context.physics.engine&&this.sharedMesh&&(this.context.physics.engine.removeBody(this),this.sharedMesh.geometry=r,this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex))});else{const r=this.sharedMesh;if(r!=null&&r.isGroup){console.warn(`MeshCollider mesh is a group "${((s=this.sharedMesh)==null?void 0:s.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 l=new Array;for(const c in r.children){const h=r.children[c];h.isMesh&&(this.context.physics.engine.addMeshCollider(this,h,this.convex),l.push(Xe.assignMeshLOD(h,o)))}Promise.all(l).then(c=>{var h,d;if(c.some(p=>p)==!1)return;(h=this.context.physics.engine)==null||h.removeBody(this);const u=new X;for(const p of c)p&&this.activeAndEnabled&&(u.geometry=p,(d=this.context.physics.engine)==null||d.addMeshCollider(this,u,this.convex))})}else(F()||C("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)}}}li([m(X)],jo.prototype,"sharedMesh"),li([m()],jo.prototype,"convex");class Un extends ci{constructor(){super(...arguments),a(this,"center",new S(0,0,0)),a(this,"radius",.5),a(this,"height",2)}onEnable(){var e;super.onEnable(),(e=this.context.physics.engine)==null||e.addCapsuleCollider(this,this.height,this.radius)}}li([m(S)],Un.prototype,"center"),li([m()],Un.prototype,"radius"),li([m()],Un.prototype,"height");var HT=Object.defineProperty,zn=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&HT(e,t,o),o};const kx=C("debugcharactercontroller");class jr extends I{constructor(){super(...arguments),a(this,"center",new S(0,0,0)),a(this,"radius",.5),a(this,"height",2),a(this,"_rigidbody",null),a(this,"_activeGroundCollisions"),a(this,"_contactVelocity",new S)}get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(ht),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(ht)),this.rigidbody)}awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(Un);t||(t=this.gameObject.addComponent(Un)),t.center.copy(this.center),t.radius=this.radius,t.height=this.height;const s=new S(0,0,1),o=new S(1,0,0),r=new S(0,1,0),l=this.gameObject.getWorldDirection(new S);l.y=0;const c=o.dot(l)<0?-1:1,h=s.angleTo(l)*c;this.gameObject.setRotationFromAxisAngle(r,h),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),kx&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),kx&&console.log(`Collision(${this._activeGroundCollisions.size}) - ${this.isGrounded}`)}get isGrounded(){return this._activeGroundCollisions.size>0}get contactVelocity(){var e;this._contactVelocity.set(0,0,0);for(const t of this._activeGroundCollisions){const s=(e=this.context.physics.engine)==null?void 0:e.getLinearVelocity(t.collider);s&&(this._contactVelocity.x+=s.x,this._contactVelocity.y+=s.y,this._contactVelocity.z+=s.z)}return this._contactVelocity}}zn([m(S)],jr.prototype,"center"),zn([m()],jr.prototype,"radius"),zn([m()],jr.prototype,"height");class Nn extends I{constructor(){super(...arguments),a(this,"controller"),a(this,"movementSpeed",2),a(this,"rotationSpeed",2),a(this,"jumpForce",1),a(this,"doubleJumpForce",2),a(this,"animator"),a(this,"lookForward",!0),a(this,"lookInput",new re(0,0)),a(this,"moveInput",new re(0,0)),a(this,"jumpInput",!1),a(this,"_currentSpeed",new S(0,0,0)),a(this,"_currentAngularSpeed",new S(0,0,0)),a(this,"_temp",new S(0,0,0)),a(this,"_jumpCount",0),a(this,"_currentRotation"),a(this,"_raycastOptions",new $s)}awake(){this._currentRotation=new H}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||(this.jumpInput=e.isKeyDown("Space"))}move(e){this.moveInput.add(e)}look(e){this.lookInput.add(e)}jump(){this.jumpInput=!0}onBeforeRender(){this.handleInput(this.moveInput,this.lookInput,this.jumpInput),this.lookInput.set(0,0),this.moveInput.set(0,0),this.jumpInput=!1}handleInput(e,t,s){var o,r,l,c,h,d,u,p,g,f,y;if((o=this.controller)!=null&&o.isGrounded&&(this._jumpCount=0,this.doubleJumpForce>0&&((r=this.animator)==null||r.setBool("doubleJump",!1))),this._currentSpeed.z+=e.y*this.movementSpeed*this.context.time.deltaTime,(l=this.animator)==null||l.setBool("running",e.length()>.01),(h=this.animator)==null||h.setBool("jumping",((c=this.controller)==null?void 0:c.isGrounded)===!0&&s),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+=W.toRadians(-t.x*this.rotationSpeed)*this.context.time.deltaTime,this.lookForward&&Math.abs(this._currentAngularSpeed.y)<.01){const v=this.context.mainCameraComponent.forward;v.y=0,v.normalize(),this._currentRotation.setFromUnitVectors(new S(0,0,1),v),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&&s&&this.jumpForce>0){let v=(d=this.controller)==null?void 0:d.isGrounded;if(this.doubleJumpForce>0&&!((u=this.controller)!=null&&u.isGrounded)&&this._jumpCount===1&&(v=!0,(p=this.animator)==null||p.setBool("doubleJump",!0)),v){this._jumpCount+=1;const b=this.controller.rigidbody,_=this._jumpCount===2?this.doubleJumpForce:this.jumpForce;b.applyImpulse(new S(0,1,0).multiplyScalar(_))}}if(this.controller){const v=(g=this.controller)==null?void 0:g.rigidbody.getVelocity().y;if(v<-1){this._raycastOptions.ray||(this._raycastOptions.ray=new co),this._raycastOptions.ray.origin.copy(ee(this.gameObject)),this._raycastOptions.ray.direction.set(0,-1,0);const b=this.layer;this.gameObject.layers.disableAll(),this.gameObject.layers.set(2);const _=this.context.physics.raycast(this._raycastOptions);this.gameObject.layers.set(b),(_.length&&_[0].distance>2||v<-10)&&((f=this.animator)==null||f.setBool("falling",!0))}else(y=this.animator)==null||y.setBool("falling",!1)}}}zn([m(jr)],Nn.prototype,"controller"),zn([m()],Nn.prototype,"movementSpeed"),zn([m()],Nn.prototype,"rotationSpeed"),zn([m()],Nn.prototype,"jumpForce"),zn([m()],Nn.prototype,"doubleJumpForce"),zn([m(Ot)],Nn.prototype,"animator");var $T=Object.defineProperty,Xa=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$T(e,t,o),o};const Fc=C("debugcontactshadows");ox(n=>{const e=n.domElement.getAttribute("contactshadows")||n.domElement.getAttribute("contact-shadows");if(e!=null&&e!="0"&&e!="false"){console.debug("Auto-creating ContactShadows because of `contactshadows` attribute");const t=Uc.auto(n),s=parseFloat(e);isNaN(s)||(t.opacity=s,t.darkness=s)}});var Dr;const Br=(Dr=class extends I{constructor(){super(...arguments),a(this,"autoFit",!1),a(this,"darkness",.5),a(this,"opacity",.5),a(this,"blur",4),a(this,"occludeBelowGround",!1),a(this,"backfaceShadows",!0),a(this,"minSize"),a(this,"manualUpdate",!1),a(this,"_needsUpdate",!1),a(this,"shadowsRoot",new A),a(this,"shadowCamera"),a(this,"shadowGroup",new ho),a(this,"renderTarget"),a(this,"renderTargetBlur"),a(this,"plane"),a(this,"occluderMesh"),a(this,"blurPlane"),a(this,"depthMaterial"),a(this,"horizontalBlurMaterial"),a(this,"verticalBlurMaterial"),a(this,"textureSize",512)}static auto(n){if(n||(n=J.Current),!n)throw new Error("No context provided and no current context set.");let e=this._instances.get(n);if(!e||e.destroyed){const t=new A;e=Mi(t,Dr,{autoFit:!1,occludeBelowGround:!1}),this._instances.set(n,e)}return n.scene.add(e.gameObject),e.fitShadows(),e}set needsUpdate(n){this._needsUpdate=n}get needsUpdate(){return this._needsUpdate}fitShadows(){Fc&&console.warn("Fitting shadows to scene"),bd(this.shadowsRoot,!1);const n=ei(this.context.scene.children,[this.shadowsRoot]),e=Math.max(1,this.blur/32),t=n.max.x-n.min.x,s=n.max.z-n.min.z;n.expandByVector(new S(e*t,0,e*s)),Fc&&q.DrawWireBox3(n,16776960,60),this.gameObject.parent&&n.applyMatrix4(this.gameObject.parent.matrixWorld.clone().invert());const o=n.min,r=Math.max(1e-5,(n.max.y-o.y)*.002);n.max.y+=r,this.shadowsRoot.position.set((o.x+n.max.x)/2,o.y-r,(o.z+n.max.z)/2),this.shadowsRoot.scale.set(n.max.x-o.x,n.max.y-o.y,n.max.z-o.z),this.applyMinSize(),this.shadowsRoot.matrixWorldNeedsUpdate=!0,Fc&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){Dr._instances.set(this.context,this),this.shadowsRoot.hideFlags=Pu.DontExport,bd(this.shadowsRoot,!1)}start(){Fc&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new Pn(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new Pn(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const n=new zs(1,1).rotateX(Math.PI/2);this.gameObject instanceof X&&(console.warn("ContactShadows can not be added to a Mesh. Please add it to a Group or an empty Object"),Ln(this.gameObject,!1));const e=new Me({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:po});this.plane=new X(n,e),this.plane.scale.y=-1,this.plane.layers.set(2),this.shadowsRoot.add(this.plane),this.plane&&(this.plane.renderOrder=1),this.occluderMesh=new X(this.plane.geometry,new Me({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:cd})).translateY(-1e-4),this.occluderMesh.renderOrder=-100,this.occluderMesh.layers.set(2),this.shadowsRoot.add(this.occluderMesh),this.blurPlane=new X(n),this.blurPlane.visible=!1,this.shadowGroup.add(this.blurPlane);const t=0,s=1;this.shadowCamera=new Sm(-1/2,1/2,1/2,-1/2,t,s),this.shadowCamera.layers.enableAll(),this.shadowCamera.rotation.x=Math.PI/2,this.shadowGroup.add(this.shadowCamera),this.depthMaterial=new zC,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=NC,this.depthMaterial.blendEquation=WC,this.depthMaterial.onBeforeCompile=o=>{this.depthMaterial&&(o.uniforms.darkness=this.depthMaterial.userData.darkness,o.fragmentShader=`
933
- uniform float darkness;
934
- ${o.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) );")}
935
- `)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new gs($P),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new gs(GP),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){var n,e,t,s,o,r,l,c;Dr._instances.get(this.context)===this&&Dr._instances.delete(this.context),(n=this.renderTarget)==null||n.dispose(),(e=this.renderTargetBlur)==null||e.dispose(),(t=this.depthMaterial)==null||t.dispose(),(s=this.horizontalBlurMaterial)==null||s.dispose(),(o=this.verticalBlurMaterial)==null||o.dispose(),(r=this.blurPlane)==null||r.geometry.dispose(),(l=this.plane)==null||l.geometry.dispose(),(c=this.occluderMesh)==null||c.geometry.dispose()}onBeforeRender(n){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){Fc&&console.error("ContactShadows: not initialized yet");return}const e=this.context.scene,t=this.context.renderer,s=t.getRenderTarget();this.shadowGroup.visible=!0,this.occluderMesh&&(this.occluderMesh.visible=!1);const o=this.plane.visible;this.plane.visible=!1,this.gameObject instanceof X&&Ln(this.gameObject,!1);const r=e.background;e.background=null,e.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=xi:this.depthMaterial.side=po;const l=t.getClearAlpha();t.setClearAlpha(0);const c=t.xr.enabled;t.xr.enabled=!1;const h=this.context.scene.matrixWorldAutoUpdate;this.context.scene.matrixWorldAutoUpdate=!1;const d=t.renderLists.get(e,0),u=d.transparent;Mx.length=0,d.transparent=Mx,Vf.length=0;for(const g of d.opaque){if(!g.object.visible)continue;const f=g.material;let y=g.material.colorWrite==!1||f.wireframe===!0||Ob(g.object)===!1;!y&&g.material.isLineMaterial&&(y=!0),!y&&g.material.isPointsMaterial&&(y=!0),y&&(Vf.push(g.object),g.object["needle:visible"]=g.object.visible,g.object.visible=!1)}t.setRenderTarget(this.renderTarget),t.clear(),t.render(e,this.shadowCamera),d.transparent=u;for(const g of Vf)g["needle:visible"]!=null&&(g.visible=g["needle:visible"]);e.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=o,t.setRenderTarget(s),t.setClearAlpha(l),e.background=r,t.xr.enabled=c,this.context.scene.matrixWorldAutoUpdate=h}blurShadow(n){if(!this.blurPlane||!this.shadowCamera||!this.renderTarget||!this.renderTargetBlur||!this.horizontalBlurMaterial||!this.verticalBlurMaterial)return;this.blurPlane.visible=!0;const e=this.shadowsRoot.worldScale,t=(e.x+e.z)/2,s=e.z/t,o=e.x/t;this.blurPlane.material=this.horizontalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTarget.texture,this.horizontalBlurMaterial.uniforms.h.value=n*1/this.textureSize*s;const r=this.context.renderer,l=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=n*1/this.textureSize*o,r.setRenderTarget(this.renderTarget),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.visible=!1,r.setRenderTarget(l)}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))}},a(Dr,"_instances",new Map),Dr);Xa([m()],Br.prototype,"autoFit"),Xa([m()],Br.prototype,"darkness"),Xa([m()],Br.prototype,"opacity"),Xa([m()],Br.prototype,"blur"),Xa([m()],Br.prototype,"occludeBelowGround"),Xa([m()],Br.prototype,"backfaceShadows");let Uc=Br;const Mx=[],Vf=new Array,GT=C("logstats");class Hf extends I{onEnable(){console.log(this),GT&&this.startCoroutine(this.run(),Oe.OnAfterRender)}*run(){for(;this.enabled;){const e=this.context.renderer.info;console.log(e.memory,e.render,e.programs),yield}}}class zc extends I{constructor(){super(...arguments),a(this,"isUsed",!0),a(this,"usedBy",null)}}class $f extends I{}const Rx=C("debugdeletable"),Tx=class cm extends Lo{onEnable(){cm._instances.push(this)}onDisable(){const e=cm._instances.indexOf(this);e>=0&&cm._instances.splice(e,1)}};a(Tx,"_instances",[]);let Eu=Tx;class Gf extends I{update(){for(const e of Eu._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const s=P.getComponentInParent(this.gameObject,zc);if(s)Rx&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,s);else{if(Rx)try{if(e.box){const o=e.box,r=Lo.testBox;q.DrawWireBox3(o,16711680,5),q.DrawWireBox3(r,255,5),console.log("DeleteBox: Destroying",this.gameObject,{deleteBoxArea:o,deletedObjectArea:r})}else console.log("DeleteBox: Destroying",this.gameObject)}catch{}uc(this.gameObject,this.context.connection)}}}}}var qT=Object.defineProperty,XT=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&qT(e,t,o),o};class Au extends I{constructor(){super(...arguments),a(this,"visibleOn")}onEnable(){this.apply()}apply(){this.test()||P.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:Y.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}XT([m()],Au.prototype,"visibleOn");var QT=Object.defineProperty,Fr=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&QT(e,t,o),o};const sn=C("debugdrag"),qf=[];var Xf=(n=>(n[n.XZPlane=0]="XZPlane",n[n.Attached=1]="Attached",n[n.HitNormal=2]="HitNormal",n[n.DynamicViewAngle=3]="DynamicViewAngle",n[n.SnapToSurfaces=4]="SnapToSurfaces",n[n.None=5]="None",n))(Xf||{}),Bt;const Do=(Bt=class extends I{constructor(){super(...arguments),a(this,"dragMode",3),a(this,"snapGridResolution",0),a(this,"keepRotation",!0),a(this,"xrDragMode",1),a(this,"xrKeepRotation",!1),a(this,"xrDistanceDragFactor",1),a(this,"showGizmo",!1),a(this,"_rigidbody",null),a(this,"_targetObject",null),a(this,"_dragHelper",null),a(this,"_draggingRigidbodies",[]),a(this,"_potentialDragStartEvt",null),a(this,"_dragHandlers",new Map),a(this,"_totalMovement",new S),a(this,"_marker",null),a(this,"_isDragging",!1),a(this,"_didDrag",!1)}static get HasAnySelected(){return this._active>0}static get CurrentlySelected(){qf.length=0;for(const n of this._instances)n._isDragging&&qf.push(n);return qf}get draggedObject(){return this._targetObject}setTargetObject(n){var e,t;this._targetObject=n;for(const o of this._dragHandlers.values())o.setTargetObject(n);const s="_rigidbody-was-kinematic";((e=this._rigidbody)==null?void 0:e[s])===!1&&(this._rigidbody.isKinematic=!1,this._rigidbody[s]=void 0),this._rigidbody=null,n&&(this._rigidbody=P.getComponentInChildren(n,ht),((t=this._rigidbody)==null?void 0:t.isKinematic)===!1&&(this._rigidbody.isKinematic=!0,this._rigidbody[s]=!1))}awake(){this._potentialDragStartEvt=null,this._dragHandlers=new Map,this._totalMovement=new S,this._marker=null,this._isDragging=!1,this._didDrag=!1,this._dragHelper=null,this._draggingRigidbodies=[]}start(){this.gameObject.getComponentInParent(Ai)||this.gameObject.addComponent(Ai)}onEnable(){Bt._instances.push(this)}onDisable(){Bt._instances=Bt._instances.filter(n=>n!==this)}allowEdit(n=null){return this.context.connection.allowEditing}onPointerEnter(n){if(!this.allowEdit(this.gameObject)||n.mode!=="screen"||(n.event.mode==="tracked-pointer"||n.event.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)return;const e=P.getComponentInParent(n.object,Bt);!e||e!==this||(Bt.lastHovered=n.object,this.context.domElement.style.cursor="pointer")}onPointerMove(n){(this._isDragging||this._potentialDragStartEvt!==null)&&n.use()}onPointerExit(n){this.allowEdit(this.gameObject)&&n.mode==="screen"&&Bt.lastHovered===n.object&&(this.context.domElement.style.cursor="auto")}onPointerDown(n){if(!(!this.allowEdit(this.gameObject)||n.used||(n.mode==="tracked-pointer"||n.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)&&(Bt.lastHovered=n.object,n.button===0)){this._dragHandlers.size===0&&(this._didDrag=!1,this._totalMovement.set(0,0,0),this._potentialDragStartEvt=n),this._targetObject||this.setTargetObject(this.gameObject),Bt._active+=1;const e=new Qf(this,this._targetObject);if(this._dragHandlers.set(n.event.space,e),e.onDragStart(n),this._dragHandlers.size===2){const t=this._dragHandlers.values(),s=t.next().value,o=t.next().value;if(s instanceof Qf&&o instanceof Qf){const r=new YT(this,this._targetObject,s,o);this._dragHandlers.set(this.gameObject,r),r.onDragStart(n)}else console.error("Attempting to construct a MultiTouchDragHandler with invalid DragPointerHandlers. This is likely a bug.",{a:s,b:o})}n.use()}}onPointerUp(n){if(sn&&q.DrawLabel(n.point??this.gameObject.worldPosition,"POINTERUP:"+n.pointerId+", "+n.button,.03,3),!this.allowEdit(this.gameObject)||n.button!==0)return;this._potentialDragStartEvt=null;const e=this._dragHandlers.get(n.event.space),t=this._dragHandlers.get(this.gameObject);t&&(t.handlerA===e||t.handlerB===e)&&(this._dragHandlers.delete(this.gameObject),t.onDragEnd(n)),e&&(Bt._active>0&&(Bt._active-=1),this.setTargetObject(null),e.onDragEnd&&e.onDragEnd(n),this._dragHandlers.delete(n.event.space),this._dragHandlers.size===0&&this.onLastDragEnd(n),n.use())}update(){for(const n of this._dragHandlers.values())n.collectMovementInfo&&n.collectMovementInfo(),n.getTotalMovement&&this._totalMovement.add(n.getTotalMovement());if(this._potentialDragStartEvt){if(!this._didDrag)if(this._totalMovement.length()>3e-4)this._didDrag=!0;else return;const n=this._potentialDragStartEvt;this._potentialDragStartEvt=null,this.onFirstDragStart(n)}for(const n of this._dragHandlers.values())n.onDragUpdate&&n.onDragUpdate(this._dragHandlers.size);this._dragHelper&&this._dragHelper.hasSelected&&this.onAnyDragUpdate()}onFirstDragStart(n){if(!n||!n.object)return;const e=P.getComponentInParent(n.object,Bt);if(!e||e!==this&&e._isDragging)return;const t=this._targetObject||this.gameObject;if(!t)return;this._isDragging=!0;const s=P.getComponentInChildren(t,Zs);sn&&console.log("DRAG START",s,t),s&&(s.fastMode=!0,s?.requestOwnership()),this._marker=P.addComponent(t,zc),this._draggingRigidbodies.length=0;const o=P.getComponentsInChildren(t,ht);o&&this._draggingRigidbodies.push(...o)}onAnyDragUpdate(){if(!this._dragHelper)return;this._dragHelper.showGizmo=this.showGizmo,this._dragHelper.onUpdate(this.context);for(const e of this._draggingRigidbodies)e.wakeUp(),e.resetVelocities(),e.resetForcesAndTorques();const n=this._targetObject||this.gameObject;cs.markDirty(n)}onLastDragEnd(n){if(!this||!this._isDragging)return;this._isDragging=!1;for(const t of this._draggingRigidbodies)t.setVelocity(t.smoothedVelocity);if(this._draggingRigidbodies.length=0,this._targetObject=null,n!=null&&n.object){const t=P.getComponentInChildren(n.object,Zs);t&&(t.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const e=this._dragHelper.selected;sn&&console.log("DRAG END",e,e?.visible),this._dragHelper.setSelected(null,this.context)}},a(Bt,"_active",0),a(Bt,"_instances",[]),a(Bt,"lastHovered"),Bt);Fr([m()],Do.prototype,"dragMode"),Fr([m()],Do.prototype,"snapGridResolution"),Fr([m()],Do.prototype,"keepRotation"),Fr([m()],Do.prototype,"xrDragMode"),Fr([m()],Do.prototype,"xrKeepRotation"),Fr([m()],Do.prototype,"xrDistanceDragFactor"),Fr([m()],Do.prototype,"showGizmo");let Ur=Do;class YT{constructor(e,t,s,o){a(this,"handlerA"),a(this,"handlerB"),a(this,"context"),a(this,"settings"),a(this,"gameObject"),a(this,"_handlerAAttachmentPoint",new S),a(this,"_handlerBAttachmentPoint",new S),a(this,"_followObject"),a(this,"_manipulatorObject"),a(this,"_deviceMode"),a(this,"_followObjectStartWorldQuaternion",new H),a(this,"_manipulatorPosOffset",new S),a(this,"_manipulatorRotOffset",new H),a(this,"_manipulatorScaleOffset",new S),a(this,"_tempVec1",new S),a(this,"_tempVec2",new S),a(this,"_tempVec3",new S),a(this,"tempLookMatrix",new se),a(this,"_initialScale",new S),a(this,"_initialDistance",0);var r,l;this.context=e.context,this.settings=e,this.gameObject=t,this.handlerA=s,this.handlerB=o,this._followObject=new A,this._manipulatorObject=new A,this.context.scene.add(this._manipulatorObject);const c=(l=(r=ne.active)==null?void 0:r.rig)==null?void 0:l.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),c&&(c.worldToLocal(this._tempVec1),c.worldToLocal(this._tempVec2)),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.02?(sn&&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),sn){this._followObject.add(new wi(2)),this._manipulatorObject.add(new wi(5));const h=d=>`${d.x.toFixed(2)}, ${d.y.toFixed(2)}, ${d.z.toFixed(2)}`;q.DrawLine(this._tempVec1,this._tempVec2,65535,0,!1),q.DrawLabel(this._tempVec3,"A:B "+this._initialDistance.toFixed(2)+`
936
- `+h(this._tempVec1)+`
937
- `+h(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()}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),sn&&(q.DrawLabel(this._tempVec3.clone().add(new S(0,.2,0)),"A:B "+t.toFixed(2),.03),q.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 s=this.gameObject,o=this._followObject;if(!s){console.error("MultiTouchDragHandler has no dragged object. This is likely a bug.");return}o.updateMatrix(),o.updateMatrixWorld(!0);const r=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrKeepRotation:this.settings.keepRotation;if(this.settings.snapGridResolution>0){const u=this._followObject.worldPosition,p=this.settings.snapGridResolution;u.x=Math.round(u.x/p)*p,u.y=Math.round(u.y/p)*p,u.z=Math.round(u.z/p)*p,this._followObject.worldPosition=u,this._followObject.updateMatrix()}r&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const l=W.clamp01(this.context.time.deltaTime*e*t),c=s.worldPosition;c.lerp(o.worldPosition,l),s.worldPosition=c;const h=s.worldQuaternion;h.slerp(o.worldQuaternion,l),s.worldQuaternion=h;const d=s.worldScale;d.lerp(o.worldScale,l),s.worldScale=d}setTargetObject(e){this.gameObject=e}}class Qf{constructor(e,t){a(this,"context"),a(this,"gameObject"),a(this,"settings"),a(this,"_lastRig"),a(this,"_followObject"),a(this,"_totalMovement",new S),a(this,"_totalMovementAlongRayDirection",0),a(this,"_grabStartDistance",0),a(this,"_deviceMode"),a(this,"_followObjectStartPosition",new S),a(this,"_followObjectStartQuaternion",new H),a(this,"_followObjectStartWorldQuaternion",new H),a(this,"_lastDragPosRigSpace"),a(this,"_tempVec",new S),a(this,"_tempMat",new se),a(this,"_hitPointInLocalSpace",new S),a(this,"_hitNormalInLocalSpace",new S),a(this,"_bottomCenter",new S),a(this,"_backCenter",new S),a(this,"_backBottomCenter",new S),a(this,"_bounds",new _i),a(this,"_dragPlane",new dr(new S(0,1,0))),a(this,"_draggedOverObject",null),a(this,"_draggedOverObjectLastSetUp",null),a(this,"_draggedOverObjectLastNormal",new S),a(this,"_draggedOverObjectDuration",0),a(this,"_hasLastSurfaceHitPoint",!1),a(this,"_lastSurfaceHitPoint",new S),this.settings=e,this.context=e.context,this.gameObject=t,this._followObject=new A}getTotalMovement(){return this._totalMovement}get followObject(){return this._followObject}get hitPointInLocalSpace(){return this._hitPointInLocalSpace}setTargetObject(e){this.gameObject=e}recenter(){var e,t;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 s=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),s.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 o=this._hitPointInLocalSpace.clone();this.gameObject.localToWorld(o),this._grabStartDistance=o.distanceTo(s.worldPosition);const r=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject,l=r?.worldScale.x||1;this._grabStartDistance/=l,this._totalMovementAlongRayDirection=0,this._lastDragPosRigSpace=void 0,sn&&(q.DrawLine(o,s.worldPosition,65280,.5,!1),q.DrawLabel(s.worldPosition.add(new S(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 f=e.event.space,y=f.worldPosition;this.gameObject.worldToLocal(y),this._hitPointInLocalSpace.copy(y);const v=f.worldUp;this._tempMat.copy(this.gameObject.matrixWorld).invert(),v.transformDirection(this._tempMat),this._hitNormalInLocalSpace.copy(v)}this.recenter(),this._totalMovement.set(0,0,0),this._deviceMode=e.mode;const t=this._followObject.parent.worldForward,s=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrDragMode:this.settings.dragMode,o=this._hitPointInLocalSpace.clone();switch(this.gameObject.localToWorld(o),s){case 0:const f=new S(0,1,0);this.gameObject.parent&&f.transformDirection(this.gameObject.parent.matrixWorld.clone().invert()),this._dragPlane.setFromNormalAndCoplanarPoint(f,o);break;case 2:const y=this._hitNormalInLocalSpace.clone();y.transformDirection(this.gameObject.matrixWorld),this._dragPlane.setFromNormalAndCoplanarPoint(y,o);break;case 1:this._dragPlane.setFromNormalAndCoplanarPoint(t,o);break;case 3:this.setPlaneViewAligned(o,!0);break;case 4:this.setPlaneViewAligned(o,!1);break}const r=this.gameObject.parent,l=this.gameObject.position.clone(),c=this.gameObject.quaternion.clone(),h=this.gameObject.scale.clone(),d=this.gameObject.matrixWorld.clone();r&&r.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 u=ei([this.gameObject]);u.expandByPoint(this.gameObject.worldPosition);const p=new S;u.getCenter(p);const g=new S;u.getSize(g),this._bottomCenter.copy(p.clone().add(new S(0,-g.y/2,0))),this._backCenter.copy(p.clone().add(new S(0,0,g.z/2))),this._backBottomCenter.copy(p.clone().add(new S(0,-g.y/2,g.z/2))),this._bounds.copy(u),r&&r.add(this.gameObject),this.gameObject.position.copy(l),this.gameObject.quaternion.copy(c),this.gameObject.scale.copy(h),this.gameObject.matrixWorld.copy(d),this._draggedOverObject=null,this._draggedOverObjectLastSetUp=null,this._draggedOverObjectLastNormal.set(0,1,0),this._draggedOverObjectDuration=0}collectMovementInfo(){var e,t;if(!this._followObject.parent)return;const s=this._followObject.parent;this._followObject.updateMatrix();const o=s.worldPosition,r=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject;r&&r.worldToLocal(o),(this._lastDragPosRigSpace===void 0||r!=this._lastRig)&&(this._lastDragPosRigSpace=o.clone(),this._lastRig=r),this._tempVec.copy(o).sub(this._lastDragPosRigSpace);const l=s.worldForward;if(r&&(this._tempMat.copy(r.matrixWorld).invert(),l.transformDirection(this._tempMat)),this._totalMovementAlongRayDirection+=l.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(o),sn){let c=o;r&&(c=c.clone(),c.transformDirection(r.matrixWorld)),q.DrawRay(c,l,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 s=this._followObject.parent;if(!s){console.warn("Warning: DragPointerHandler doesn't have a drag source. This is likely a bug.");return}this._followObject.updateMatrix();const o=s.worldPosition,r=s.worldForward,l=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer",c=l?this.settings.xrKeepRotation:this.settings.keepRotation,h=l?this.settings.xrDragMode:this.settings.dragMode;if(h===5)return;const d=10;c&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);let u=1,p=2;if(l&&this._grabStartDistance>.5){const w=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);u=Math.max(0,w),u=u*u*u}else this._grabStartDistance<=.5&&(p=3);this._followObject.position.copy(this._followObjectStartPosition),c||this._followObject.quaternion.copy(this._followObjectStartQuaternion),this._followObject.position.multiplyScalar(u),this._followObject.updateMatrix();const g=this._hasLastSurfaceHitPoint;this._hasLastSurfaceHitPoint=!1;const f=new co(o,r);if(h==4){const w=this.context.physics.raycastFromRay(f,{testObject:x=>x!==this.followObject&&x!==s&&x!==t});if(w.length>0){const x=w[0];if(this._draggedOverObject===x.object?this._draggedOverObjectDuration+=this.context.time.deltaTime:(this._draggedOverObject=x.object,this._draggedOverObjectDuration=0),x.face){this._hasLastSurfaceHitPoint=!0,this._lastSurfaceHitPoint.copy(x.point);const M=this._draggedOverObjectDuration>=.15,k=this._totalMovement.length()>=.001,T=Q(x.normal||x.face.normal).applyQuaternion(x.object.worldQuaternion);if((M||k)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(T)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(x.face.normal);const L=Q(),B=Q();this._bounds.getCenter(L),this._bounds.getSize(B),L.sub(B.multiplyScalar(.5).multiply(T)),this._hitPointInLocalSpace.copy(L),this._hitNormalInLocalSpace.copy(x.face.normal),this._bounds.getCenter(L),this._bounds.getSize(B),L.add(B.multiplyScalar(.5).multiply(x.face.normal));const z=Q(this._hitPointInLocalSpace).add(L);this._followObject.localToWorld(z);const j=x.point;this._dragPlane.setFromNormalAndCoplanarPoint(T,j)}else if(!(M||k))return}}else g&&this.gameObject&&this.setPlaneViewAligned(this.gameObject.worldPosition,!1)}if(h!==1&&f.intersectPlane(this._dragPlane,this._tempVec)){this._followObject.worldPosition=this._tempVec,this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const w=Q(this._hitPointInLocalSpace);this._followObject.localToWorld(w),sn&&q.DrawLine(w,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(w),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const w=this._followObject.worldPosition,x=this.settings.snapGridResolution;w.x=Math.round(w.x/x)*x,w.y=Math.round(w.y/x)*x,w.z=Math.round(w.z/x)*x,this._followObject.worldPosition=w,this._followObject.updateMatrix()}c&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const y=W.clamp01(this.context.time.deltaTime*d*p),v=W.clamp01(this.context.time.deltaTime*d*.5*p),b=t.worldPosition;b.lerp(this._followObject.worldPosition,y),t.worldPosition=b;const _=t.worldQuaternion;if(_.slerp(this._followObject.worldQuaternion,v),t.worldQuaternion=_,sn){const w=this._hitPointInLocalSpace.clone();t.localToWorld(w),q.DrawSphere(w,.02,16711680);const x=this._hitNormalInLocalSpace.clone();x.applyQuaternion(_),q.DrawRay(w,x,16711680),q.DrawLabel(b.add(new S(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
938
-
939
- Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
940
-
941
- Session: ${!!ne.active}
942
-
943
- Device: ${this._deviceMode}
944
-
945
- `,.03);const M=this._bottomCenter.clone(),k=this._backCenter.clone(),T=this._backBottomCenter.clone();t.localToWorld(M),t.localToWorld(k),t.localToWorld(T),q.DrawSphere(M,.01,65280,0,!1),q.DrawSphere(k,.01,255,0,!1),q.DrawSphere(T,.01,16711935,0,!1),q.DrawLine(M,T,65535,0,!1),q.DrawLine(T,k,65535,0,!1)}}onDragEnd(e){console.assert(this._followObject.parent===e.event.space,"Drag end: _followObject is not parented to the space object"),this._followObject.removeFromParent(),this._followObject.destroy(),this._lastDragPosRigSpace=void 0}setPlaneViewAligned(e,t){if(!this._followObject.parent)return!1;const s=this._followObject.parent.worldForward,o=Q(0,1,0),r=s,l=o.angleTo(r),c=.5;return t&&(l>Math.PI/2+c||l<Math.PI/2-c)?this._dragPlane.setFromNormalAndCoplanarPoint(o,e):this._dragPlane.setFromNormalAndCoplanarPoint(s,e),!0}}const Ex=class oC{constructor(e){a(this,"showGizmo",!0),a(this,"useViewAngle",!0),a(this,"_selected",null),a(this,"_context",null),a(this,"_camera"),a(this,"_cameraPlane",new dr),a(this,"_hasGroundPlane",!1),a(this,"_groundPlane",new dr),a(this,"_groundOffset",new S),a(this,"_groundOffsetFactor",0),a(this,"_groundDistance",0),a(this,"_groundPlanePoint",new S),a(this,"_raycaster",new od),a(this,"_cameraPlaneOffset",new S),a(this,"_intersection",new S),a(this,"_worldPosition",new S),a(this,"_inverseMatrix",new se),a(this,"_rbs",[]),a(this,"_groundLine"),a(this,"_groundMarker"),a(this,"_groundOffsetVector",new S(0,1,0)),a(this,"_requireUpdateGroundPlane",!0),a(this,"_didDragOnGroundPlaneLastFrame",!1),this._camera=e;const t=new zl(oC.geometry),s=t.material;s.color=new ae(.4,.4,.4),t.layers.set(2),t.name="line",t.scale.y=1,this._groundLine=t;const o=new nd(.5,22,22),r=new Me({color:s.color}),l=new X(o,r);l.visible=!1,l.layers.set(2),this._groundMarker=l}get hasSelected(){return this._selected!==null&&this._selected!==void 0}get selected(){return this._selected}setSelected(e,t){if(this._selected&&t)for(const s of this._rbs)s.wakeUp(),s.setVelocity(0,0,0);if(this._selected&&Fn.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}Fn.Add(t,this._selected,null),this._groundOffsetFactor=0,this._hasGroundPlane=!0,this._groundOffset.set(0,0,0),this._requireUpdateGroundPlane=!0,this.onUpdateScreenSpacePlane()}}onUpdate(e){this._selected}onUpdateWorldPosition(e,t,s){if(this._selected){if(s){const o=ee(this._selected);o.y=e.y,e=o}if(at(this._selected,e),at(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 o=ee(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(o,o,o),at(this._groundMarker,t)}}}onUpdateScreenSpacePlane(){if(!this._selected||!this._context)return;const e=this._context.input.getPointerPositionRC(0);e&&(this._raycaster.setFromCamera(e,this._camera),this._cameraPlane.setFromNormalAndCoplanarPoint(this._camera.getWorldDirection(this._cameraPlane.normal),this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld)),this._raycaster.ray.intersectPlane(this._cameraPlane,this._intersection)&&this._selected.parent&&(this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert(),this._cameraPlaneOffset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))))}onUpdateGroundPlane(){if(!this._selected||!this._context)return;const e=ee(this._selected),t=new co(Q(0,.1,0).add(e),Q(0,-1,0)),s=new $s;s.testObject=r=>r!==this._selected;const o=this._context.physics.raycastFromRay(t,s);for(let r=0;r<o.length;r++){const l=o[r];if(!l.face||this.contains(this._selected,l.object))continue;const c=Q(0,1,0);this._groundPlane.setFromNormalAndCoplanarPoint(c,l.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 s of e.children)if(this.contains(s,t))return!0}return!1}};a(Ex,"geometry",new Ns().setFromPoints([new S(0,0,0),new S(0,-1,0)]));let zL=Ex;var Ax=(n=>(n.File_Spawned="file-spawned",n))(Ax||{});class KT{constructor(e,t,s,o,r,l,c,h,d){a(this,"guid"),a(this,"file_name"),a(this,"file_hash"),a(this,"file_size"),a(this,"position"),a(this,"scale"),a(this,"seed"),a(this,"sender"),a(this,"downloadUrl"),a(this,"parentGuid"),a(this,"boundsSize"),this.seed=t,this.guid=s,this.file_name=o,this.file_hash=r,this.file_size=l,this.position=c,this.scale=h,this.sender=e,this.downloadUrl=d}}var Bo;(n=>{const e=new Map;function t(o){var r;e.has(o.guid)&&s(o.guid);const l=new A;e.set(o.guid,l);const c=new A;c.position.y=-.5,l.add(c);const h=new X(new ga(1,1,1,1,1,1),new Me({color:14540253,wireframe:!0,transparent:!0,opacity:.3}));h.position.y=.5,c.add(h);const d=new A;c.add(d);const u=new X(new ga(1,1,1,1,1,1),new Me({color:12307660,transparent:!0,opacity:.4}));u.position.y=.5,d.scale.y=.01,d.add(u);const p=new X(new zs(1,1,1,1),new Me({color:34,transparent:!0,opacity:.05,depthTest:!1}));return p.rotateX(-Math.PI/2),p.position.y=.51,u.add(p),o.parent.add(l),l.rotateY(Math.PI/2),o.position&&((r=l.position)==null||r.copy(o.position)),o.size&&(l.worldScale=new S().copy(o.size)),l.position.y=l.scale.y/2,{object:l,onProgress:g=>{d instanceof A&&d.scale.set(1,g,1)}}}n.addPreview=t;function s(o){const r=e.get(o);r&&(e.delete(o),r.removeFromParent())}n.removePreview=s})(Bo||(Bo={}));const Qa=[],Iu=[];var Yf;(n=>{function e(s,o){const r={name:o?.name,priority:o?.priority??0,callback:s};return Qa.push(r),Qa.sort((l,c)=>l.priority===c.priority?0:l.priority>c.priority?-1:1),()=>{const l=Qa.indexOf(r);l>=0&&Qa.splice(l,1)}}n.onCreateCustomModelLoader=e;function t(s){return Iu.push(s),()=>{const o=Iu.indexOf(s);o>=0&&Iu.splice(o,1)}}n.onDetermineModelMimetype=t})(Yf||(Yf={}));const Nc=C("debugfileformat");function Ix(n){switch((n.split(".").pop()||n).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 Lx(n,e){var t;const{useExtension:s=!0}=e;if(s){const l=n,c=new URL(l,globalThis.location.href);let h=null;const d=c.searchParams.get("filetype");switch(d&&(h=d.toUpperCase()),h!=null&&h.length||(h=(t=c.pathname.split(".").pop())==null?void 0:t.toUpperCase()),Nc&&console.warn(`[Needle Engine] Try to use file extension to determine type: '${h}'`),h){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 o=n;if(!n.startsWith("blob:")){const l=new URL(n,globalThis.location.href);l.searchParams.append("range","true"),n=l.toString()}const r=await fetch(n,{method:"GET",headers:{range:"bytes=0-32"}}).catch(l=>null);if(r!=null&&r.ok){const l=await r.arrayBuffer(),c=jx(o,l,r);return Nc&&console.log("[Needle Engine] Determined file type from header: "+c),c}return"unknown"}function jx(n,e,t){if(e.byteLength<4)return"unknown";const s=new Uint8Array(e);if(Nc&&console.warn(`[Needle Engine] Trying to determine file type from binary data
946
- `,'"'+new TextDecoder().decode(e)+`"
947
- `,s),s[0]==103&&s[1]==108&&s[2]==84&&s[3]==70&&(s[4]==10||s[4]===2))return console.debug("GLTF detected"),"model/gltf+json";if(s[0]==103&&s[1]==108&&s[2]==84&&s[3]==70&&s[4]==98)return console.debug("GLB detected"),"model/gltf-binary";if(s[0]==80&&s[1]==75&&s[2]==3&&s[3]==4)return console.debug("USDZ detected"),"model/vnd.usdz+zip";if(s[0]==80&&s[1]==88&&s[2]==82&&s[3]==45&&s[4]==85&&s[5]==83&&s[6]==68&&s[7]==67)return console.debug("Binary USD detected"),"model/vnd.usd";if(s[0]==35&&s[1]==117&&s[2]==115&&s[3]==100&&s[4]==97)return console.debug("ASCII USD detected"),"model/vnd.usda";if(s[0]==75&&s[1]==97&&s[2]==121&&s[3]==100&&s[4]==97&&s[5]==114&&s[6]==97&&s[7]==32)return console.debug("Binary FBX detected"),"model/fbx";if(s[0]==59&&s[1]==32&&s[2]==70&&s[3]==66&&s[4]==88&&s[5]==32)return console.debug("ASCII FBX detected"),"model/fbx";if(s[0]==35&&s[1]==32&&s[2]==66&&s[3]==108&&s[4]==101&&s[5]==110&&s[6]==100&&s[7]==101&&s[8]==114&&s[9]==32||s[0]==35&&s[1]==32&&s[2]==65&&s[3]==108&&s[4]==105&&s[5]==97&&s[6]==115&&s[7]==32&&s[8]==79&&s[9]==66&&s[10]==74)return console.debug("OBJ detected"),"model/obj";if(t.headers.has("content-type")){const o=t.headers.get("content-type");if(o!=null&&o.startsWith("image/"))return console.debug("Image detected, not a model file"),"unsupported";switch(console.debug("Content-Type: "+o),o){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 o}}if(s[0]==118&&s[1]==32||s[0]==102&&s[1]==32)return console.debug("OBJ detected (the file has no header and starts with vertex or face)"),"obj";if(s[0]==35&&s[1]==32&&s[2]==70&&s[3]==105&&s[4]==108&&s[5]==101&&s[6]==32&&s[7]==101&&s[8]==120&&s[9]==112&&s[10]==111&&s[11]==114&&s[12]==116&&s[13]==101&&s[14]==100&&s[15]==32&&s[16]==98&&s[17]==121&&s[18]==32&&s[19]==90&&s[20]==66&&s[21]==114&&s[22]==117&&s[23]==115&&s[24]==104)return console.debug("OBJ detected (exported by ZBrush)"),"obj";if(s[0]==109&&s[1]==116&&s[2]==108&&s[3]==108&&s[4]==105&&s[5]==98)return console.debug("OBJ detected (mtllib)"),"obj";for(const o of Iu){const r=o({url:n,response:t,contentType:t.headers.get("content-type"),bytes:s});if(r)return Nc&&console.debug(`Mimetype callback returned: ${r}`),r}if(F()||Nc){const o=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));console.warn(`Could not determine file type.
948
-
949
- Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
950
-
951
- Content-Type: "${t.headers.get("content-type")}
952
- "Text: "${o}"
953
- Binary:`,s)}else console.debug("Could not determine file type from binary data");return"unknown"}var ZT=Object.defineProperty,Ya=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&ZT(e,t,o),o};const ji=C("debugdroplistener");class JT extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const eE="blob";class Wn extends I{constructor(){super(...arguments),a(this,"useNetworking",!0),a(this,"dropArea"),a(this,"fitIntoVolume",!1),a(this,"fitVolumeSize",new S(1,1,1)),a(this,"placeAtHitPosition",!0),a(this,"onDropped",new xe),a(this,"onNetworkEvent",e=>{var t;if(!this.useNetworking){ji&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if((t=e.guid)!=null&&t.startsWith(this.guid)){const s=e.url;if(console.debug("[DropListener] Received networked event",e),s)if(Array.isArray(s))for(const o of s)this.addFromUrl(o,{screenposition:new re,point:e.point,size:e.size},!0);else this.addFromUrl(s,{screenposition:new re,point:e.point,size:e.size},!0)}}),a(this,"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 s={screenposition:new re(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(s)&&this.addFromUrl(t,s,!1)}}).catch(console.warn)}),a(this,"onDrag",e=>{this.context.connection.allowEditing!==!1&&e.preventDefault()}),a(this,"onDrop",async e=>{if(this.context.connection.allowEditing===!1||(ji&&console.log(e),!(e!=null&&e.dataTransfer))||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new re(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const s=e.dataTransfer.items;if(!s)return;const o=[];for(const r in s){const l=s[r];if(l.kind==="file"){const c=l.getAsFile();if(!c)continue;o.push(c)}else l.kind==="string"&&l.type=="text/plain"&&l.getAsString(c=>{this.addFromUrl(c,t,!1)})}o.length>0&&await this.addDroppedFiles(o,t)}),a(this,"_abort",null),a(this,"_addedObjects",new Array),a(this,"_addedModels",new Array)}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)}loadFromURL(e,t){this.addFromUrl(e,{screenposition:new re,point:t?.point,size:t?.size},!0)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}async addFromUrl(e,t,s){ji&&console.log("dropped url",e);try{if(e.startsWith("https://github.com/")){const l=e.split("/"),c=l[3],h=l[4],d=l[6],u=l.slice(7).join("/");e=`https://raw.githubusercontent.com/${c}/${h}/${d}/${u}`}else e.startsWith("https://polyhaven.com/a")&&(e=tE(e));if(!e)return null;const o=e.toLowerCase();if(o.endsWith(".hdr")||o.endsWith(".hdri")||o.endsWith(".exr")||o.endsWith(".png")||o.endsWith(".jpg")||o.endsWith(".jpeg"))return null;this.removePreviouslyAddedObjects();const r=await Lu.loadFileFromURL(new URL(e),{guid:this.guid,context:this.context,parent:this.gameObject,point:t.point,size:t.size});if(r&&this._addedObjects.length<=0)return t.url=e,this.addObject(r,t,s)}catch{console.warn("String is not a valid URL",e)}return null}async addDroppedFiles(e,t){var s,o;if(ji&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),Vl(eE,null),(s=this._abort)==null||s.abort("New files dropped"),this._abort=new AbortController;for(const r of e){if(!r)continue;if(r.type.startsWith("image/")){ji&&console.warn("Ignoring dropped image file",r.name,r.type);continue}else if(r.name.endsWith(".bin")){ji&&console.warn("Ignoring dropped binary file",r.name,r.type);continue}console.debug("Load file "+r.name+" + "+r.type);const l=await Lu.loadFile(r,this.context,{guid:this.guid});if(l){this.dispatchEvent(new CustomEvent("file-dropped",{detail:r})),t.file=r;const c=this.addObject(l,t,!1);c&&this.context.connection.isConnected&&this.useNetworking&&(console.debug("Uploading dropped file to blob storage"),kr.upload(r,{abort:(o=this._abort)==null?void 0:o.signal}).then(h=>{h!=null&&h.download_url&&this._addedObjects.includes(c)&&this.sendDropEvent(h.download_url,c,l.contentMD5)}).catch(console.warn));break}}}}removePreviouslyAddedObjects(e=!0){if(e)for(const t of this._addedObjects)t.parent===this.gameObject&&Ri(t,!0,!0);this._addedObjects.length=0,this._addedModels.length=0}addObject(e,t,s){var o,r;const{model:l,contentMD5:c}=e;if(ji&&console.log(`Dropped ${this.gameObject.name}`,l),!(l!=null&&l.scene))return console.warn("No object specified to add to scene",l),null;this.removePreviouslyAddedObjects();const h=l.scene;this.gameObject.attach(h),h.position.set(0,0,0),h.quaternion.identity(),this._addedObjects.push(h),this._addedModels.push(l);const d=new _i().setFromCenterAndSize(new S(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(ji&&q.DrawWireBox3(d,255,5),this.fitIntoVolume&&kb(h,d,{position:!this.placeAtHitPosition}),this.placeAtHitPosition&&t&&t.screenposition){h.visible=!1;const p=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(h.visible=!0,p&&p.length>0)for(const g of p){const f=g.point.clone();ji&&console.log("Place object at hit",g),Mb(h,f);break}}Ua.assignAnimationsFromFile(l,{createAnimationComponent:p=>Mi(p,jt)});const u=new JT({sender:this,gltf:l,model:l,object:h,contentMD5:c,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(u),(o=this.onDropped)==null||o.invoke(u.detail),!s&&(r=t.url)!=null&&r.startsWith("http")&&this.context.connection.isConnected&&h&&this.sendDropEvent(t.url,h,c),h}async sendDropEvent(e,t,s){if(!this.useNetworking){ji&&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 o=ei([t]),r={name:t.name,guid:this.guid,url:e,point:t.worldPosition.clone(),size:o.getSize(new S),contentMD5:s};this.context.connection.send("droplistener",r)}}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:s=>!this._addedObjects.includes(s)}).length)return F()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1}return!0}}Ya([m()],Wn.prototype,"useNetworking"),Ya([m(A)],Wn.prototype,"dropArea"),Ya([m()],Wn.prototype,"fitIntoVolume"),Ya([m(S)],Wn.prototype,"fitVolumeSize"),Ya([m()],Wn.prototype,"placeAtHitPosition"),Ya([m(xe)],Wn.prototype,"onDropped");function tE(n){if(!n.startsWith("https://polyhaven.com/"))return n;const e="https://dl.polyhaven.org/file/ph-assets/Models/gltf/4k/",t=new URL(n).pathname.split("/").pop(),s=`${e}${t}/${t}_4k.gltf`;return console.log("Resolved polyhaven asset url",n,"\u2192",s),s}var Lu;(n=>{async function e(s,o,r){const l=r.guid,c=new At(l),h=new Blob([s],{type:s.type||Ix(s.name)||void 0}),d=URL.createObjectURL(h),u=await _s().loadSync(o,d,s.name,c).catch(p=>(console.error(`Failed to load file "${s.name}" (${s.type}):`,p),null));return URL.revokeObjectURL(d),u?new Promise((p,g)=>{const f=new FileReader;f.readAsArrayBuffer(s),f.onloadend=async y=>{const v=f.result,b=kr.hashMD5(v);return p({model:u,contentMD5:b})}}):(console.warn(`Failed to load "${s.name}" (${s.type})`),null)}n.loadFile=e;async function t(s,o){return new Promise(async(r,l)=>{const c=new At(o.guid),h=s.toString();ji&&q.DrawWireSphere(o.point,.1,16711680,3);const d=Bo.addPreview({guid:o.guid,parent:o.parent,position:o?.point,size:o?.size}),u=await _s().loadSync(o.context,h,h,c,p=>{d.onProgress(p.loaded/p.total)}).catch(console.warn);if(u){const p=await fetch(h).then(f=>f.arrayBuffer()),g=kr.hashMD5(p);ji?setTimeout(()=>Bo.removePreview(o.guid),3e3):Bo.removePreview(o.guid),r({model:u,contentMD5:g})}else ji?setTimeout(()=>Bo.removePreview(o.guid),3e3):Bo.removePreview(o.guid),console.warn("Unsupported file type: "+s.toString())})}n.loadFileFromURL=t})(Lu||(Lu={}));var iE=Object.defineProperty,Kf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&iE(e,t,o),o};const ju=class rC extends I{constructor(){super(...arguments),a(this,"parent",null),a(this,"object",null),a(this,"limitCount",60),a(this,"_currentCount",0),a(this,"_startPosition",null),a(this,"_startQuaternion",null),a(this,"_forwardPointerEvents",new Map)}start(){var e,t;if(this._currentCount=0,this._startPosition=null,this._startQuaternion=null,this.object||(this.object=this.gameObject),this.object){if(this.object===this.gameObject){const o=new At(this.guid);this.object=P.instantiate(this.object,{idProvider:o,keepWorldPosition:!1});const r=P.getComponent(this.object,rC);r?.destroy();let l=this.object.getComponentInChildren(Ur);l||(l=this.object.addComponent(Ur,{dragMode:Xf.SnapToSurfaces}),l.guid=o.generateUUID());let c=P.getComponent(l.gameObject,Zs);c||(c=l.gameObject.addComponent(Zs),c.guid=o.generateUUID())}this.object.visible=!1;const s=this.gameObject.getComponent(Ur);s&&(s.enabled=!1),this._startPosition=((e=this.object.position)==null?void 0:e.clone())??new S(0,0,0),this._startQuaternion=((t=this.object.quaternion)==null?void 0:t.clone())??new H(0,0,0,1)}this.gameObject.getComponentInParent(Ai)||this.gameObject.addComponent(Ai)}onEnable(){this.startCoroutine(this.cloneLimitIntervalFn())}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 s=P.getComponent(t,Ur);s?(s.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,s)):console.warn("Duplicated object does not have DragControls",t)}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 cf(1)}handleDuplication(){var e;if(!this.object||this.limitCount>0&&this._currentCount>=this.limitCount||this.object===this.gameObject)return null;if(P.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 t=new Bs;this.parent||(this.parent=this.gameObject.parent),this.parent&&(t.parent=this.parent.guid??((e=this.parent.userData)==null?void 0:e.guid),t.keepWorldPosition=!0),t.position=this.worldPosition,t.rotation=this.worldQuaternion,t.context=this.context,this._currentCount+=1;const s=P.instantiateSynced(this.object,t);return console.assert(s!==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),s}};Kf([m(A)],ju.prototype,"parent"),Kf([m(A)],ju.prototype,"object"),Kf([m()],ju.prototype,"limitCount");let Zf=ju;var Vn=(n=>(n[n.PointerEnter=0]="PointerEnter",n[n.PointerExit=1]="PointerExit",n[n.PointerDown=2]="PointerDown",n[n.PointerUp=3]="PointerUp",n[n.PointerClick=4]="PointerClick",n[n.Drag=5]="Drag",n[n.Drop=6]="Drop",n[n.Scroll=7]="Scroll",n[n.UpdateSelected=8]="UpdateSelected",n[n.Select=9]="Select",n[n.Deselect=10]="Deselect",n[n.Move=11]="Move",n[n.InitializePotentialDrag=12]="InitializePotentialDrag",n[n.BeginDrag=13]="BeginDrag",n[n.EndDrag=14]="EndDrag",n[n.Submit=15]="Submit",n[n.Cancel=16]="Cancel",n))(Vn||{}),sE=Object.defineProperty,Jf=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&sE(e,t,o),o};class e0{constructor(){a(this,"eventID"),a(this,"callback",new xe)}}Jf([m()],e0.prototype,"eventID"),Jf([m(xe)],e0.prototype,"callback");class Du extends I{constructor(){super(...arguments),a(this,"triggers",[])}invoke(e){var t;if(this.triggers)for(const s of this.triggers)s.eventID===e&&((t=s.callback)==null||t.invoke())}hasTrigger(e){var t;return((t=this.triggers)==null?void 0:t.some(s=>s.eventID===e))??!1}shouldChangeCursor(){return this.hasTrigger(Vn.PointerClick)||this.hasTrigger(Vn.PointerDown)||this.hasTrigger(Vn.PointerUp)}onPointerClick(e){this.invoke(Vn.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(Vn.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(Vn.PointerExit)}onPointerDown(e){this.invoke(Vn.PointerDown)}onPointerUp(e){this.invoke(Vn.PointerUp)}}Jf([m(e0)],Du.prototype,"triggers");class Dx{constructor(e){a(this,"writer"),this.writer=e}writeNode(e){}}class nE extends Dx{beforeWriteNode(e,t){q.isGizmo(e)&&(t.keep=!1)}}class Bx extends Dx{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=df(new ce(1,1,1,0)))}}function t0(n){const e=Pu.DontExport;return!(n.hideFlags&e)}const i0=C("debugexr");class oE{constructor(e){a(this,"parser"),this.parser=e,i0&&console.log(e)}get name(){return"EXT_texture_exr"}loadTexture(e){const t=this.name,s=this.parser,o=s.json.textures[e];if(i0&&console.log("EXT_texture_exr.loadTexture",e,o),!o.extensions||!o.extensions[t])return null;const r=o.extensions[t],l=new pd(s.options.manager);return i0&&console.log("EXT_texture_exr.loadTexture",r),s.loadTextureImage(e,r.source,l)}}typeof window<"u"&&window.addEventListener("unhandledrejection",n=>{});const Hn=vt,Bu="$___Export_Components",rE="NEEDLE_components";var Fx;Fx=fr;class aE{constructor(){a(this,Fx)}}class lE{constructor(e,t,s){a(this,"node"),a(this,"nodeIndex"),a(this,"nodeDef"),this.node=e,this.nodeIndex=t,this.nodeDef=s}}class Ux{constructor(){a(this,"parser"),a(this,"nodeToObjectMap",{}),a(this,"gltf",null),a(this,"exportContext"),a(this,"objectToNodeMap",{}),a(this,"context"),a(this,"writer")}get name(){return rE}registerExport(e){e.register(t=>{if("serializeUserData"in t){const s=t.serializeUserData.bind(t);this.writer=t,t.serializeUserData=(o,r)=>{try{this.serializeUserData(o,r)&&(t.extensionsUsed[this.name]=!0),s(o,r)}finally{this.afterSerializeUserData(o,r)}}}return this})}beforeParse(){this.exportContext={},this.objectToNodeMap={}}serializeUserData(e,t){var s;const o=(s=e.userData)==null?void 0:s.components;return!o||o.length<=0?!1:(delete e.userData.components,e[Bu]=o,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&Hn&&console.log("DONE",JSON.stringify(t)),e[Bu]===void 0)return;const s=e[Bu];delete e[Bu],s!==null&&(e.userData.components=s)}writeNode(e,t){const s=this.writer.json.nodes.length;Hn&&console.log(e.name,s,e.uuid);const o=new lE(e,s,t);this.exportContext[s]=o,this.objectToNodeMap[e.uuid]=s}afterParse(e){var t;Hn&&console.log("AFTER",e);for(const s in this.exportContext){const o=this.exportContext[s],r=o.node,l=o.nodeDef,c=o.nodeIndex,h=(t=r.userData)==null?void 0:t.components;if(!h||h.length<=0)continue;const d=new aE;l.extensions=l.extensions||{},l.extensions[this.name]=d,this.context.object=r,this.context.nodeId=c,this.context.objectToNode=this.objectToNodeMap;const u=[];for(const p of h){this.context.target=p;const g=_s().writeBuiltinComponentData(p,this.context);g!==null&&u.push(g)}u.length>0&&(d[fr]=u,Hn&&console.log("DID WRITE",r,"nodeIndex",c,u))}}beforeRoot(){return Hn&&console.log("BEGIN LOAD"),this.nodeToObjectMap={},null}async afterRoot(e){this.gltf=e;const t=e.parser,s=t?.extensions;if(!s)return;const o=s[this.name];Hn&&console.log("After root",e,this.parser,s);const r=[];if(o===!0){const l=t.json.nodes;if(l){for(let c=0;c<l.length;c++){const h=await t.getDependency("node",c);this.nodeToObjectMap[c]=h}for(let c=0;c<l.length;c++){const h=l[c],d=c,u=h.extensions;if(!u)continue;const p=u[this.name];if(!p)continue;Hn&&console.log("NODE",h);const g=this.nodeToObjectMap[d];if(!g){console.error("Could not find object for node index: "+d,h,t);continue}Xd(g),r.push(this.createComponents(g,p))}}}await Promise.all(r);for(const l of t.associations.keys()){const c=t.associations.get(l);if(c?.materials!=null){const h="/materials/"+c.materials;AM(l,h)}}}async createComponents(e,t){if(!t)return;const s=t[fr];if(s){const o=new Array;Hn&&console.log(e.name,s);for(const r in s){const l=s[r];Hn&&console.log("Serialized data",JSON.parse(JSON.stringify(l))),l&&this.parser&&o.push(Qg(this.parser,l).catch(c=>console.error(`Error while resolving references (see console for details)
954
- `,c,e,l))),e.userData=e.userData||{},e.userData[fr]=e.userData[fr]||[],e.userData[fr].push(l)}await Promise.all(o).catch(r=>{console.error("Error while loading components",r)})}}}const zx="NEEDLE_gameobject_data";class cE{constructor(e){a(this,"parser"),this.parser=e}get name(){return zx}afterRoot(e){var t;const s=[];for(let o=0;o<((t=this.parser.json.nodes)==null?void 0:t.length);o++){const r=this.parser.json.nodes[o];if(r&&r.extensions){const l=r.extensions[zx];if(l){const c=this.findAndApplyExtensionData(o,l);s.push(c)}}}return Promise.all(s).then(()=>null)}async findAndApplyExtensionData(e,t){const s=await this.parser.getDependency("node",e);s&&this.applyExtensionData(s,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 Nx="NEEDLE_lighting_settings",Ka=C("debugenvlight");class hE{constructor(e,t,s){a(this,"parser"),a(this,"sourceId"),a(this,"context"),this.parser=e,this.sourceId=t,this.context=s}get name(){return Nx}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[Nx];if(s){Ka&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',s);let o;if(e.scene.children.length===1){const r=e.scene.children[0];o=P.addComponent(r,Fu,{},{callAwake:!1})}else{const r=new A;r.name="LightSettings "+this.sourceId,e.scene.add(r),o=P.addComponent(r,Fu,{},{callAwake:!1})}o.sourceId=this.sourceId,o.ambientIntensity=s.ambientIntensity,o.ambientLight=new ae().fromArray(s.ambientLight),Array.isArray(s.ambientTrilight)&&(o.ambientTrilight=s.ambientTrilight.map(r=>new ae().fromArray(r))),o.ambientMode=s.ambientMode,o.environmentReflectionSource=s.environmentReflectionSource}}return null}}pe.registerCallback(me.ContextCreated,n=>{const e=n.context,t=P.findObjectOfType(Fu,e);t!=null&&t.sourceId&&(t.enabled=!0)});class Fu extends I{constructor(){super(...arguments),a(this,"ambientMode",za.Skybox),a(this,"ambientLight"),a(this,"ambientTrilight"),a(this,"ambientIntensity",1),a(this,"environmentReflectionSource",su.Skybox),a(this,"_hasReflection",!1),a(this,"_ambientLightObj"),a(this,"_hemisphereLightObj")}awake(){var e;if(this.sourceId){const s=this.environmentReflectionSource===su.Skybox?_o.Skybox:_o.Reflection,o=this.context.lightmaps.tryGet(this.sourceId,s,0);this._hasReflection=o!=null,o&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,o)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),Ka&&window.addEventListener("keydown",s=>{if(!this.destroyed)switch(s.key){case"l":this.enabled=!this.enabled;break}});const t=(e=this.gameObject.userData)==null?void 0:e.components;if(t){const s=t.indexOf(this);t.splice(s,1),t.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*W.lerp(0,1.33,t)}onEnable(){if(Ka&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==za.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new VC(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===za.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],s=this.calculateIntensityFactor(t);this._hemisphereLightObj=new HC(t,e,this.ambientIntensity*s),this.gameObject.add(this._hemisphereLightObj),Ka&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,s)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&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 s0=C("debugstencil");function dE(n,e){return(n&1<<e.layer)!=0}const uE=Symbol("stencils"),Wx=class Il{constructor(e,t){a(this,"parser"),a(this,"source"),this.parser=e,this.source=t}get name(){return"NEEDLE_render_objects"}static applyStencil(e){if(!e)return;const t=e.sourceId;if(s0&&console.log(t,Il.stencils),!t)return;const s=Il.stencils[t];if(s)for(let o=s.length-1;o>=0;o--){const r=s[o];if(dE(r.layer,e)){s0&&console.log(r),setTimeout(()=>{$t()&&Yd(e.gameObject)&&(be("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let l=0;l<e.sharedMaterials.length;l++){let c=e.sharedMaterials[l];c&&(c=c.clone(),c[uE]=!0,c.stencilWrite=!0,c.stencilWriteMask=255,c.stencilFuncMask=255,c.stencilRef=r.value,c.stencilFunc=r.compareFunc,c.stencilZPass=r.passOp,c.stencilFail=r.failOp,c.stencilZFail=r.zFailOp,e.sharedMaterials[l]=c)}e.gameObject.renderOrder=r.event*1e3+r.index*50;break}}}afterRoot(e){const t=this.parser.json.extensions;if(t){const s=t[mE];if(s){s0&&console.log(s);const o=s.stencil;if(o&&Array.isArray(o))for(const r of o){const l={...r};l.compareFunc=pE(l.compareFunc),l.passOp=n0(l.passOp),l.failOp=n0(l.failOp),l.zFailOp=n0(l.zFailOp),Il.stencils[this.source]||(Il.stencils[this.source]=[]),Il.stencils[this.source].push(l)}}}return null}};a(Wx,"stencils",{});let Vx=Wx;function n0(n){switch(n){case 0:return oP;case 1:return nP;case 2:return sP;case 3:return iP;case 4:return tP;case 6:return eP;case 7:return JC;case 5:return ZC}return 0}function pE(n){switch(n){case 1:return Cv;case 2:return KC;case 3:return YC;case 4:return QC;case 5:return XC;case 6:return qC;case 7:return GC;case 8:return $C}return Cv}const mE="NEEDLE_render_objects";var Hx=(n=>(n[n.INT=5124]="INT",n[n.FLOAT=5126]="FLOAT",n[n.FLOAT_VEC2=35664]="FLOAT_VEC2",n[n.FLOAT_VEC3=35665]="FLOAT_VEC3",n[n.FLOAT_VEC4=35666]="FLOAT_VEC4",n[n.INT_VEC2=35667]="INT_VEC2",n[n.INT_VEC3=35668]="INT_VEC3",n[n.INT_VEC4=35669]="INT_VEC4",n[n.BOOL=35670]="BOOL",n[n.BOOL_VEC2=35671]="BOOL_VEC2",n[n.BOOL_VEC3=35672]="BOOL_VEC3",n[n.BOOL_VEC4=35673]="BOOL_VEC4",n[n.FLOAT_MAT2=35674]="FLOAT_MAT2",n[n.FLOAT_MAT3=35675]="FLOAT_MAT3",n[n.FLOAT_MAT4=35676]="FLOAT_MAT4",n[n.SAMPLER_2D=35678]="SAMPLER_2D",n[n.SAMPLER_3D=35680]="SAMPLER_3D",n[n.SAMPLER_CUBE=35681]="SAMPLER_CUBE",n[n.UNKNOWN=0]="UNKNOWN",n))(Hx||{});const nn=C("debugcustomshader"),Za="NEEDLE_techniques_webgl";class gE{constructor(){a(this,"objectToWorldMatrix",new se),a(this,"worldToObjectMatrix",new se),a(this,"objectToWorld",new Array),a(this,"worldToObject",new Array)}updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),iu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),iu(this.worldToObjectMatrix,this.worldToObject)}}const on=class Ve extends Pv{constructor(e,...t){super(...t),a(this,"identifier"),a(this,"onBeforeRenderSceneCallback",this.onBeforeRenderScene.bind(this)),a(this,"_sphericalHarmonicsName","unity_SpecCube0"),a(this,"_objToWorldName","hlslcc_mtx4x4unity_ObjectToWorld"),a(this,"_worldToObjectName","hlslcc_mtx4x4unity_WorldToObject"),a(this,"_viewProjectionName","hlslcc_mtx4x4unity_MatrixVP"),a(this,"_viewMatrixName","hlslcc_mtx4x4unity_MatrixV"),a(this,"_rendererData",new gE),this.identifier=e,nn&&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)&&J.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}clone(){const e=super.clone();return Gx(e),e}dispose(){super.dispose();const e=J.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&J.Current.pre_render_callbacks.splice(e,1)}get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&J.Current.setRequireColor(!0),this.depthTextureUniform&&J.Current.setRequireDepth(!0)}onBeforeRender(e,t,s,o,r,l){o.attributes.tangent||o.computeTangents(),this.onUpdateUniforms(s,r)}onUpdateUniforms(e,t){const s=J.Current;if(e&&(Ve.viewProjection&&this.uniforms[this._viewProjectionName]&&(Ve.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),iu(Ve.viewProjection,Ve._viewProjectionValues)),Ve.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Ve.viewMatrix.copy(e.matrixWorldInverse),iu(Ve.viewMatrix,Ve._viewMatrixValues)),this.uniforms[Ve._worldSpaceCameraPosName]&&Ve._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=s.sceneLighting.timeVec4),this.uniforms._Time){const c=this.uniforms._Time.value;c.x=s.sceneLighting.timeVec4.x/20,c.y=s.sceneLighting.timeVec4.x,c.z=s.sceneLighting.timeVec4.x*2,c.w=s.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const c=this.uniforms._SinTime.value;c.x=Math.sin(s.sceneLighting.timeVec4.x/8),c.y=Math.sin(s.sceneLighting.timeVec4.x/4),c.z=Math.sin(s.sceneLighting.timeVec4.x/2),c.w=Math.sin(s.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const c=this.uniforms._CosTime.value;c.x=Math.cos(s.sceneLighting.timeVec4.x/8),c.y=Math.cos(s.sceneLighting.timeVec4.x/4),c.z=Math.cos(s.sceneLighting.timeVec4.x/2),c.w=Math.cos(s.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const c=this.uniforms.unity_DeltaTime.value;c.x=s.time.deltaTime,c.y=1/s.time.deltaTime,c.z=s.time.smoothedDeltaTime,c.w=1/s.time.smoothedDeltaTime}const o=s.mainLight;if(o){const c=ee(o.gameObject,Ve._mainLightPosition);this.uniforms._MainLightPosition={value:c.normalize()},Ve._mainLightColor.set(o.color.r,o.color.g,o.color.b,0),this.uniforms._MainLightColor={value:Ve._mainLightColor};const h=o.intensity;Ve._lightData.z=h,this.uniforms.unity_LightData={value:Ve._lightData}}if(e&&(Ve.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Ve._viewProjectionValues),Ve.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Ve._viewMatrixValues),this.uniforms[Ve._worldSpaceCameraPosName]&&(this.uniforms[Ve._worldSpaceCameraPosName]={value:Ve._worldSpaceCameraPos}),s.mainCameraComponent)){if(this.uniforms._ProjectionParams){const c=this.uniforms._ProjectionParams.value;c.x=1,c.y=s.mainCameraComponent.nearClipPlane,c.z=s.mainCameraComponent.farClipPlane,c.w=1/c.z,this.uniforms._ProjectionParams.value=c}if(this.uniforms._ZBufferParams){const c=this.uniforms._ZBufferParams.value,h=s.mainCameraComponent;c.x=1-h.farClipPlane/h.nearClipPlane,c.y=h.farClipPlane/h.nearClipPlane,c.z=c.x/h.farClipPlane,c.w=c.y/h.farClipPlane,this.uniforms._ZBufferParams.value=c}if(this.uniforms._ScreenParams){const c=this.uniforms._ScreenParams.value;c.x=s.domWidth,c.y=s.domHeight,c.z=1+1/c.x,c.w=1+1/c.y,this.uniforms._ScreenParams.value=c}if(this.uniforms._ScaledScreenParams){const c=this.uniforms._ScaledScreenParams.value;c.x=s.domWidth,c.y=s.domHeight,c.z=1+1/c.x,c.w=1+1/c.y,this.uniforms._ScaledScreenParams.value=c}}const r=this.depthTextureUniform;r&&(r.value=s.depthTexture);const l=this.opaqueTextureUniform;if(l&&(l.value=s.opaqueColorTexture),t){const c=this._rendererData;c.updateFrom(t),this.uniforms[this._worldToObjectName].value=c.worldToObject,this.uniforms[this._objToWorldName].value=c.objectToWorld}this.uniformsNeedUpdate=!0}};a(on,"viewProjection",new se),a(on,"_viewProjectionValues",[]),a(on,"viewMatrix",new se),a(on,"_viewMatrixValues",[]),a(on,"_worldSpaceCameraPosName","_WorldSpaceCameraPos"),a(on,"_worldSpaceCameraPos",new S),a(on,"_mainLightColor",new ye),a(on,"_mainLightPosition",new S),a(on,"_lightData",new ye);let $x=on;class fE{constructor(e,t){a(this,"parser"),a(this,"identifier"),this.parser=e,this.identifier=t}get name(){return Za}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return nn&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[Za])return nn&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;nn&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const s=t.extensions[Za].technique;if(s<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const o=this.parser.json.extensions[Za];if(!o)return nn?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;nn&&console.log(o);const r=o.techniques[s];return r?new Promise(async(l,c)=>{var h,d,u;const p=await lR(o,r.program),g=p?.fragmentShader,f=p?.vertexShader;if(!g||!f)return c();nn&&console.log("loadMaterial",t,p);const y={},v=r.uniforms;(f.includes("_Time")||g.includes("_Time"))&&(y._Time={value:new ye(0,0,0,0)}),(f.includes("_SinTime")||g.includes("_SinTime"))&&(y._SinTime={value:new ye(0,0,0,0)}),(f.includes("_CosTime")||g.includes("_CosTime"))&&(y._CosTime={value:new ye(0,0,0,0)}),(f.includes("unity_DeltaTime")||g.includes("unity_DeltaTime"))&&(y.unity_DeltaTime={value:new ye(0,0,0,0)});for(const w in v){const x=w;switch(x){case"_TimeParameters":const M=new ye;y[x]={value:M};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":y[x]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":y[x]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":y[x]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":y[x]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":y[x]={value:null};break}}let b=!1;if(t.extensions&&t.extensions[Za]){const w=t.extensions[Za];if(w.technique===s){nn&&console.log(t.name,"Material Properties",w);for(const x in w.values){const M=w.values[x];if(typeof M=="string"){if(M.startsWith("/textures/")){const k=M.substring(10),T=Number.parseInt(k);if(T>=0){const L=await this.parser.getDependency("texture",T);L instanceof je&&(L.colorSpace=xn,L.needsUpdate=!0),y[x]={value:L};continue}}switch(x){case"alphaMode":M==="BLEND"&&(b=!0);continue}}if(Array.isArray(M)&&M.length===4){y[x]={value:new ye(M[0],M[1],M[2],M[3])};continue}y[x]={value:M}}}}const _=new $x(this.identifier,{name:t.name??"",uniforms:y,vertexShader:f,fragmentShader:g,lights:!1});switch(_.glslVersion=rP,_.vertexShader=_.vertexShader.replace("#version 300 es",""),_.fragmentShader=_.fragmentShader.replace("#version 300 es",""),(h=y._Cull)==null?void 0:h.value){case 0:_.side=xi;break;case 1:_.side=cd;break;case 2:_.side=po;break;default:_.side=po;break}switch((d=y._ZTest)==null?void 0:d.value){case 3:_.depthTest=!0,_.depthFunc=pP;break;case 6:_.depthTest=!0,_.depthFunc=uP;break;case 2:_.depthTest=!0,_.depthFunc=dP;break;case 4:_.depthTest=!0,_.depthFunc=hP;break;case 5:_.depthTest=!0,_.depthFunc=cP;break;case 7:_.depthTest=!0,_.depthFunc=lP;break;case 8:_.depthTest=!1,_.depthFunc=aP;break}_.transparent=b,b&&(_.depthWrite=!1),rR(y),_.onUpdateUniforms();for(const w in v){const x=w,M=v[w].type;if(((u=y[x])==null?void 0:u.value)===void 0)switch(M){case Hx.SAMPLER_2D:y[x]={value:nR},console.warn("Missing/unassigned texture, fallback to white: "+x);break;default:x==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+x,v[w]);break}}nn&&console.log(_.uuid,y),Gx(_),l(_)}):null}}function Gx(n){if(n.uniforms){nn&&console.log("Uniforms:",n.uniforms);for(const t in n.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,s){Object.getOwnPropertyDescriptor(n,t)||Object.defineProperty(n,t,{get:()=>n.uniforms[s].value,set:o=>{n.uniforms[s].value=o,n.needsUpdate=!0}})}}const yE=C("debugextensions");let Uu;const vE=import("./three-examples-DuVhxqft.min.js").then(n=>n.GLTFLoaderAnimationPointer).then(async n=>(Uu=n.GLTFAnimationPointerExtension,Uu)).catch(n=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three for full KHR_animation support",n)}),zr=new Array;function bE(n){zr.includes(n)||zr.push(n)}function _E(n){const e=zr.indexOf(n);e>=0&&zr.splice(e,1)}function o0(n){if(n instanceof On){const e=new Ux;return n.register(t=>(e.parser=t,e)),e}return null}class wE{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 zu(n,e,t){const s=t.indexOf("?");s>=0&&(t=t.substring(0,s)),n.register(o=>new cE(o)),n.register(o=>new LM(o)),n.register(o=>new eR(o,e.lightmaps,t)),n.register(o=>new hE(o,t,e)),n.register(o=>new fE(o,t)),n.register(o=>new Vx(o,t)),n.register(o=>new Xe(o,t)),n.register(o=>new oE(o)),C_()&&n.register(o=>new w_(o)),await vE.catch(o=>{}),n.register(o=>{if(Uu){const r=new Uu(o);return r.setAnimationPointerResolver.bind(r)(new wE),r}else return(yE||F())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const o of zr)o.onImport&&o.onImport(n,t,e)}function r0(n,e){for(const t of zr)t.onExport&&t.onExport(n,e)}function qx(n,e,t){for(const s of zr)s.onLoaded&&s.onLoaded(n,e,t)}class Xx{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const s=this.writer,o=s.extensionsUsed,r={};t.extensions=t.extensions||{},t.extensions[this.name]=r;let l=new se;const c=new Array,h=new Array,d=new Array;for(let f=0;f<e.count;f++){e.getMatrixAt(f,l);let y=new S,v=new H,b=new S;l.decompose(y,v,b),c.push(y.x,y.y,y.z),h.push(v.x,v.y,v.z,v.w),d.push(b.x,b.y,b.z)}const u=new Float32Array(c),p=new Float32Array(h),g=new Float32Array(d);r.attributes={TRANSLATION:s.processAccessor(new yt(u,3)),ROTATION:s.processAccessor(new yt(p,4)),SCALE:s.processAccessor(new yt(g,3))},o[this.name]=!0}}var xE=Object.defineProperty,Qx=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&xE(e,t,o),o};const Wc=C("debugreflectionprobe"),Yx=C("noreflectionprobe"),a0=Symbol("reflectionProbeKey"),Kx=Symbol("original material");var ss;const l0=(ss=class extends I{constructor(){var n;super(),a(this,"_texture"),a(this,"center"),a(this,"size"),a(this,"_boxHelper"),ss._probes.has(this.context)||ss._probes.set(this.context,[]),(n=ss._probes.get(this.context))==null||n.push(this)}static isUsingReflectionProbe(n){var e;return!!(n[a0]||(e=n[Kx])!=null&&e[a0])}static get(n,e,t,s){if(!n||n.isObject3D!==!0||Yx)return null;const o=ss._probes.get(e);if(o){for(const r of o)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(s){if(r.gameObject===s)return r}else if(r.isInBox(n))return Wc&&console.log("Found reflection probe",n.name,r.name),r}}return Wc&&console.debug("Did not find reflection probe",n.name,t,n),null}set texture(n){if(n&&!(n instanceof je)){console.error("ReflectionProbe.texture must be a Texture",n);return}this._texture=n,n&&(n.mapping=Sn,n.colorSpace=xn,n.needsUpdate=!0)}get texture(){return this._texture}isInBox(n){var e;return(e=this._boxHelper)==null?void 0:e.isInBox(n)}awake(){this._boxHelper=this.gameObject.addComponent(Lo),this._boxHelper.updateBox(!0),Wc&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=Sn,this._texture.colorSpace=xn,this._texture.needsUpdate=!0)}start(){!this._texture&&F()&&(console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`),be("ReflectionProbe configuration hint: See browser console for details"))}onDestroy(){const n=ss._probes.get(this.context);if(n){const e=n.indexOf(this);e>=0&&n.splice(e,1)}}onSet(n){var e;if(Yx||!this.enabled||((e=n.sharedMaterials)==null?void 0:e.length)<=0||!this.texture)return;let t=ss._rendererMaterialsCache.get(n);t||(t=[],ss._rendererMaterialsCache.set(n,t));for(let s=0;s<n.sharedMaterials.length;s++){const o=n.sharedMaterials[s];if(!o||o.envMap===void 0||o instanceof Me)continue;let r=t[s];const l=o===r?.copy,c=!r||r.material.uuid!==o.uuid||r.copy.version!==o.version;if(!l&&c){if(Wc){let u="";r?r.material!==o?u="reference changed; cached instance?: "+l:r.copy.version!==o.version&&(u="version changed"):u="not cached",console.warn("Cloning material",o.name,o.version,"Reason:",u,`
955
- `,o.uuid,`
956
- `,r?.copy.uuid,`
957
- `,n.name)}const d=o.clone();d.version=o.version,r?(r.copy=d,r.material=o):(r={material:o,copy:d},t.push(r)),d[a0]=this,d[Kx]=o,Wc&&console.log("Set reflection",n.name,n.guid)}r&&r.copy&&(r.copy.onBeforeCompile=o.onBeforeCompile);const h=r?.copy;h.envMap=this.texture,n.sharedMaterials[s]=h}}onUnset(n){const e=ss._rendererMaterialsCache.get(n);if(e)for(let t=0;t<e.length;t++){const s=e[t];n.sharedMaterials[t]=s.material}}},a(ss,"_probes",new Map),a(ss,"_rendererMaterialsCache",new Map),ss);Qx([m(S)],l0.prototype,"center"),Qx([m(S)],l0.prototype,"size");let Vc=l0;const hi=C("debuginstancing"),Nu=class aC{constructor(){a(this,"objs",[])}setup(e,t,s,o,r,l=0){e.applySettings(t);const c=this.tryCreateOrAddInstance(t,s,r);if(c){o===null&&(o=[]),o.push(c),Xe.assignTextureLOD(c.renderer.material,0);for(let h=0;h<e.sharedMeshes.length;h++){const d=e.sharedMeshes[h],u=d.geometry;Xe.assignMeshLOD(d,0).then(p=>{p&&e.activeAndEnabled&&u!=p&&c.setGeometry(p)})}}else if(l<=0&&t.type!=="Mesh"){const h=l+1;for(const d of t.children)o=this.setup(e,d,s,o,r,h)}return l===0&&r.useMatrixWorldAutoUpdate&&o&&o.length>=0&&this.autoUpdateInstanceMatrix(t),o}tryCreateOrAddInstance(e,t,s){if(e.type==="Mesh"){const o=s.foundMeshes;if(s.foundMeshes+=1,!s.rend.enableInstancing)return null;if(s.rend.enableInstancing!==!0){if(o>=s.rend.enableInstancing.length)return hi&&console.error("Something is wrong with instance setup",e,s.rend.enableInstancing,o),null;if(!s.rend.enableInstancing[o])return null}const r=e,l=r.material;for(const u of this.objs)if(!!u.canAdd(r.geometry,l))return u.addInstance(r);let c=aC.getStartInstanceCount(e);(!c||c<0)&&(c=4);let h=e.name;h!=null&&h.length||(h=Jv());const d=new Jx(h,r.geometry,l,c,t);return this.objs.push(d),d.addInstance(r)}return null}autoUpdateInstanceMatrix(e){const t=e.matrixWorld.multiplyMatrices.bind(e.matrixWorld),s=e.matrixWorld.clone(),o=(r,l)=>{const c=t(r,l);return(e[cc]||s.equals(c)===!1)&&(s.copy(c),e[cc]=!0),c};e.matrixWorld.multiplyMatrices=o}};a(Nu,"instance",new Nu),a(Nu,"getStartInstanceCount",n=>4);let Wu=Nu;const Zx=class hm{constructor(e,t){a(this,"object"),a(this,"renderer"),a(this,"__instanceIndex",-1),a(this,"__reservedVertexRange",0),a(this,"__reservedIndexRange",0),a(this,"__geometryIndex",-1),a(this,"meshInformation"),this.__instanceIndex=-1,this.object=e,this.renderer=t,e[T_]=t,this.meshInformation=Nr(e.geometry),hm.all.push(this)}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}updateMeshInformation(){const e=Nr(this.object.geometry),t=this.meshInformation.vertexCount,s=this.meshInformation.indexCount;return Object.assign(this.meshInformation,e),t!==this.meshInformation.vertexCount||s!==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 s(`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 s(`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 s(o){return t.updateMeshInformation()&&(t.renderer.remove(t,!0),t.renderer.add(t))?!0:((F()||hi)&&console.error(o),!1)}}add(){this.__instanceIndex>=0||(this.renderer.add(this),P.markAsInstancedRendered(this.object,!0))}remove(e){if(!(this.__instanceIndex<0)&&(this.renderer.remove(this,e),P.markAsInstancedRendered(this.object,!1),e)){const t=hm.all.indexOf(this);t>=0&&hm.all.splice(t,1)}}};a(Zx,"all",[]);let c0=Zx;class Jx{constructor(e,t,s,o,r){a(this,"allowResize",!0),a(this,"name",""),a(this,"geometry"),a(this,"material"),a(this,"_context"),a(this,"_batchedMesh"),a(this,"_handles",[]),a(this,"_geometryIds",new Map),a(this,"_maxInstanceCount"),a(this,"_currentInstanceCount",0),a(this,"_currentVertexCount",0),a(this,"_currentIndexCount",0),a(this,"_maxVertexCount"),a(this,"_maxIndexCount"),a(this,"_needUpdateBounds",!1),a(this,"_debugMaterial",null),a(this,"onBeforeRender",()=>{this._batchedMesh.layers.enableAll(),this._needUpdateBounds&&this._batchedMesh[hc]===!0&&(hi==="verbose"&&console.log("Update instancing bounds",this.name,this._batchedMesh.matrixWorldNeedsUpdate),this.updateBounds())}),a(this,"onAfterRender",()=>{this._batchedMesh.layers.disableAll()}),this.name=e,this.geometry=t,this.material=s,this._context=r,this._maxInstanceCount=Math.max(2,o),hi&&(this._debugMaterial=e1());const l=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],o);this._maxVertexCount=l.vertexCount,this._maxIndexCount=l.indexCount,this._batchedMesh=new Ov(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh[hc]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),s instanceof Pv&&(s.defines.USE_INSTANCING=!0,s.needsUpdate=!0),r.pre_render_callbacks.push(this.onBeforeRender),r.post_render_callbacks.push(this.onAfterRender),hi&&console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}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}get count(){return this._currentInstanceCount}updateBounds(e=!0,t=!0){if(this._needUpdateBounds=!1,e&&this._batchedMesh.computeBoundingBox(),t&&this._batchedMesh.computeBoundingSphere(),hi&&this._batchedMesh.boundingSphere){const s=this._batchedMesh.boundingSphere;q.DrawWireSphere(s.center,s.radius,65280)}}canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}dispose(){hi&&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 c0(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(s){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()})
958
- `,s),F()){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),hi&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,Nr(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}validateGeometry(e){const t=this.geometry;for(const s in t.attributes)if(s!=="batchId"&&!e.hasAttribute(s))return F()&&console.warn(`BatchedMesh: Added geometry missing "${s}". All geometries must have consistent attributes.`),!1;return!0}markNeedsUpdate(){hi==="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=Nr(e),s=t.vertexCount,o=t.indexCount;return this._currentVertexCount+s>this._maxVertexCount||this._currentIndexCount+o>this._maxIndexCount}grow(e){var t,s;const o=Math.ceil(this._maxInstanceCount*2),r=this.tryEstimateVertexCountSize(o,[e]),l=Math.max(this._maxVertexCount,r.vertexCount),c=Math.max(this._maxIndexCount,r.indexCount,Math.ceil(this._maxVertexCount*2));if(hi){const u=Nr(e);console.warn(`[Instancing] Growing Buffer
959
- Mesh: "${this.name}${(t=e.name)!=null&&t.length?"/"+e.name:""}"
960
- ${u.vertexCount} vertices, ${u.indexCount} indices
961
- Max count ${this._maxInstanceCount} \u2192 ${o}
962
- Max vertex count ${this._maxVertexCount} -> ${l}
963
- Max index count ${this._maxIndexCount} -> ${c}`),this._debugMaterial=e1()}else F()&&console.debug(`[Instancing] Growing Buffer
964
- Mesh: "${this.name}${(s=e.name)!=null&&s.length?"/"+e.name:""}"
965
- Max count ${this._maxInstanceCount} \u2192 ${o}
966
- Max vertex count ${this._maxVertexCount} -> ${l}
967
- Max index count ${this._maxIndexCount} -> ${c}`);this._maxVertexCount=l,this._maxIndexCount=c;const h=new Ov(o,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material);h.layers=this._batchedMesh.layers,h.castShadow=this._batchedMesh.castShadow,h.receiveShadow=this._batchedMesh.receiveShadow,h.visible=this._batchedMesh.visible,h[hc]=this._batchedMesh[hc],h.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,h.matrixWorldNeedsUpdate=this._batchedMesh.matrixWorldNeedsUpdate,h.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,h.matrixWorld.copy(this._batchedMesh.matrixWorld),h.matrix.copy(this._batchedMesh.matrix),this._batchedMesh.dispose(),this._batchedMesh.removeFromParent(),this._geometryIds.clear(),this._batchedMesh=h,this._maxInstanceCount=o;const d=[...this._handles];this._handles=[];for(const u of d)u&&u.__instanceIndex>=0&&(this.addGeometry(u),this._handles[u.__instanceIndex]=u);this._context.scene.add(h)}tryEstimateVertexCountSize(e,t,s=1){const o=new Map;for(const d of this._handles)if(d&&d.__instanceIndex>=0&&d.object.geometry)if(o.has(d.object.geometry)){const u=o.get(d.object.geometry);u.count+=1}else{const u={count:1,...Nr(d.object.geometry)};o.set(d.object.geometry,u)}let r=0,l=0;for(const[d,u]of o)r+=u.vertexCount*u.count,l+=u.indexCount*u.count;let c=Math.ceil(r/Math.max(1,this._currentInstanceCount))*e,h=Math.ceil(l/Math.max(1,this._currentInstanceCount))*e*2;if(t)for(const d of t){const u=Nr(d);u!=null&&(c+=u.vertexCount*s,h+=u.indexCount*s)}return{vertexCount:c,indexCount:h}}addGeometry(e){const t=e.object.geometry;if(!t)return;let s=this._geometryIds.get(t);s==null?(hi&&console.debug(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
968
- ${this._currentInstanceCount} instances, ${e.maxVertexCount} max vertices, ${e.maxIndexCount} max indices`),s=this._batchedMesh.addGeometry(t,e.maxVertexCount,e.maxIndexCount),this._geometryIds.set(t,s)):hi==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
969
- GEOMETRY_ID=${s}
970
- ${this._currentInstanceCount} instances`),this._currentVertexCount+=e.maxVertexCount,this._currentIndexCount+=e.maxIndexCount;const o=this._batchedMesh.addInstance(s);e.__geometryIndex=s,e.__instanceIndex=o,e.__reservedVertexRange=e.maxVertexCount,e.__reservedIndexRange=e.maxIndexCount,this._batchedMesh.setMatrixAt(o,e.object.matrixWorld),hi&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
971
- GEOMETRY_ID=${s}
972
- ${this._currentInstanceCount} instances
973
- Index: ${e.__instanceIndex}`)}removeGeometry(e,t){if(e.__instanceIndex<0){console.warn("Cannot remove geometry, instance index is invalid",e.name);return}hi&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
974
- GEOMETRY_ID=${e.__geometryIndex}
975
- ${this._currentInstanceCount} instances
976
- Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}a(Jx,"nullMatrix",new se);function Nr(n){var e,t;if(!n)return F()&&console.error("Cannot get mesh information from null geometry"),{vertexCount:0,indexCount:0};let s=((t=(e=n.attributes)==null?void 0:e.position)==null?void 0:t.count)||0,o=n.index?n.index.count:0;const r=Xe.getMeshLODInformation(n);if(r){const l=r.lods[0];let c=l.vertexCount,h=l.indexCount;const d=Math.min(200,Math.ceil(c*.05));c+=d,h+=20,s=Math.max(s,c),o=Math.max(o,h)}return s=Math.ceil(s),o=Math.ceil(o),{vertexCount:s,indexCount:o}}function e1(){const n=new ft({color:new ae(Math.random(),Math.random(),Math.random())});return n.emissive=n.color,n.emissiveIntensity=.3,C("wireframe")&&(n.wireframe=!0),n}const Ja=C("debuglightmaps");class Vu{constructor(e,t){a(this,"lightmapIndex",-1),a(this,"lightmapScaleOffset",new ye(1,1,0,0)),a(this,"context"),a(this,"gameObject"),a(this,"lightmapTexture",null),a(this,"lightmapScaleOffsetUniform",{value:new ye(1,1,0,0)}),a(this,"lightmapUniform",{value:null}),a(this,"onBeforeCompile",(s,o)=>{Ja&&console.log(`Lightmaps, before compile
977
- `,s),this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,this.lightmapUniform.value=this.lightmapTexture,s.uniforms.lightmapScaleOffset=this.lightmapScaleOffsetUniform}),this.gameObject=e,this.context=t}get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.lightmapTexture&&Xe.assignTextureLOD(this.lightmapTexture,0).then(t=>{t!=null&&t.isTexture&&(this.lightmapTexture=t)}))}init(e,t,s){console.assert(this.gameObject!==void 0&&this.gameObject!==null,"Missing gameobject",this),this.lightmapIndex=e,!(this.lightmapIndex<0)&&(this.lightmapScaleOffset=t,this.lightmapTexture=s,Xe.assignTextureLOD(s,0).then(o=>{o!=null&&o.isTexture&&(this.lightmapTexture=o)}),Ja=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
978
- ScaleOffset:`,t,`
979
- Texture:`,s),this.setLightmapDebugMaterial()):Ja&&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"){Ja&&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 s=0;s<t.length;s++)t[s]=this.ensureLightmapMaterial(t[s])}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 s of t)this.assignLightmapTexture(s);else t&&this.assignLightmapTexture(t)}}ensureLightmapMaterial(e){return e.userData||(e.userData={}),e["NEEDLE:lightmap-material-version"]!=e.version&&e["NEEDLE:lightmap-material-version"]==null&&(Ja&&console.warn("Cloning material for lightmap "+e.name),e=e.clone(),e.onBeforeCompile=this.onBeforeCompile),e}assignLightmapTexture(e){!e||e instanceof Om&&e.transmission>0||!(e.lightMap!==this.lightmapTexture||e["NEEDLE:lightmap-material-version"]!==e.version)||(Ja&&console.log("Assigning lightmap",e.name,e.version),e.lightMap=this.lightmapTexture,e["NEEDLE:lightmap-material-version"]=e.version)}setLightmapDebugMaterial(){this.gameObject.material=new gs({vertexShader:`
980
- varying vec2 vUv1;
981
- void main()
982
- {
983
- vUv1 = uv1;
984
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
985
- }
986
- `,fragmentShader:`
987
- uniform sampler2D lightMap;
988
- uniform float lightMapIntensity;
989
- uniform vec4 lightmapScaleOffset;
990
- varying vec2 vUv1;
991
-
992
- // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
993
- vec4 conv_sRGBToLinear( in vec4 value ) {
994
- 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 );
995
- }
996
-
997
- void main() {
998
- vec2 lUv = vUv1.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
999
-
1000
- vec4 lightMapTexel = texture2D( lightMap, lUv);
1001
- gl_FragColor = lightMapTexel;
1002
- gl_FragColor.a = 1.;
1003
- }
1004
- `,defines:{USE_LIGHTMAP:""}})}}var SE=Object.defineProperty,$n=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&SE(e,t,o),o};const Hc=C("debugrenderer"),t1=C("debugskinnedmesh"),i1=C("noinstancing"),CE=C("wireframe");class s1{constructor(){a(this,"path",null),a(this,"asset",null),a(this,"default")}}class PE{constructor(e,t){a(this,"_renderer"),a(this,"_targets",[]),a(this,"_indexMapMaxIndex"),a(this,"_indexMap"),a(this,"_changed",!1),this._renderer=e;const s=this.setMaterial.bind(this),o=this.getMaterial.bind(this),r=e.gameObject;if(this._targets=[],r)switch(r.type){case"Group":this._targets=[...r.children];break;case"SkinnedMesh":case"Mesh":this._targets.push(r);break}let l=!1,c,h=0;for(let d=0;d<this._targets.length;d++){const u=this._targets[d];if(!u)continue;const p=u.material;if(p){p.shadowSide=p.side;for(let g=0;g<t.length;g++){const f=t[g];if(!f){l=!0;continue}if(p.name===f.name){c===void 0&&(c=new Map),c.set(g,d),h=Math.max(h,g);break}}}}if(l){this._indexMapMaxIndex=h,this._indexMap=c;const d=`Renderer ${e.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;console.warn(d),$t()&&be("Found renderer with missing materials: please check the console for details.")}return new Proxy(this,{get(d,u){if(typeof u=="string"){const p=parseInt(u);if(!isNaN(p))return o(p)}return d[u]},set(d,u,p){return typeof u=="string"&&s(p,Number.parseInt(u)),Reflect.set(d,u,p)?(p instanceof Pe&&(d.changed=!0),!0):!1}})}get changed(){return this._changed}set changed(e){e===!0&&Hc&&console.warn("SharedMaterials have changed: "+this._renderer.name,this),this._changed=e}is(e){return this._renderer===e}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 s=this._targets[t];!s||s.material===void 0||(s.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 s=t[e];return s?s.material:null}}const rn=class dm extends I{constructor(){super(...arguments),a(this,"receiveShadows",!1),a(this,"shadowCastingMode",0),a(this,"lightmapIndex",-1),a(this,"lightmapScaleOffset",new ye(1,1,0,0)),a(this,"enableInstancing"),a(this,"renderOrder"),a(this,"allowOcclusionWhenDynamic",!0),a(this,"probeAnchor"),a(this,"reflectionProbeUsage",0),a(this,"_lightmaps"),a(this,"_sharedMeshes",[]),a(this,"_sharedMaterials"),a(this,"_originalMaterials"),a(this,"_probeAnchorLastFrame"),a(this,"_lightmapTextureOverride"),a(this,"allowProgressiveLoading",!0),a(this,"_firstFrame",-1),a(this,"_isInstancingEnabled",!1),a(this,"_handles"),a(this,"_handlesTempArray",[]),a(this,"onBeforeRenderThree",(e,t,s,o,r,l)=>{var c;if(r.envMapIntensity!==void 0){const h=this.hasLightmap?Math.PI:1,d=((c=this.context.mainCameraComponent)==null?void 0:c.environmentIntensity)??1;r.envMapIntensity=Math.max(0,d*this.context.sceneLighting.environmentIntensity/h)}if(this._lightmaps)for(const h of this._lightmaps)h.updateLightmapUniforms(r),h.applyLightmap()}),a(this,"_reflectionProbe",null)}static setInstanced(e,t){const s=mc(e,dm);return s.setInstancingEnabled(t),s}static isInstanced(e){const t=Sr(e,dm);return t?t.isInstancingActive:cs.isUsingInstancing(e)}static setVisible(e,t){Ln(e,t)}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]}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}set sharedMaterials(e){if(!this._originalMaterials)this._originalMaterials=e;else if(e){let t=!1;for(let s=0;s<this._sharedMaterials.length;s++){const o=s<e.length?e[s]:null;o&&o instanceof Pe?this.sharedMaterials[s]=o:t||(t=!0,console.warn("Can not assign null as material: "+this.name,o))}}}get sharedMaterials(){return(!this._sharedMaterials||!this._sharedMaterials.is(this))&&(this._originalMaterials||(this._originalMaterials=[]),this._sharedMaterials=new PE(this,this._originalMaterials)),this._sharedMaterials}static get shouldSuppressInstancing(){return i1}get lightmap(){var e;return(e=this._lightmaps)!=null&&e.length?this._lightmaps[0].lightmap:null}set lightmap(e){var t;if(this._lightmapTextureOverride=e,e===void 0&&(e=this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex)),(t=this._lightmaps)!=null&&t.length)for(const s of this._lightmaps)s.lightmap=e}get hasLightmap(){return this.lightmap!=null}registering(){this.enabled||this.setVisibility(!1)}awake(){if(this._firstFrame=this.context.time.frame,Hc&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&Hc&&this.probeAnchor.add(new wi(.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 s=this.gameObject.children[t];if(!(!this.isMeshOrSkinnedMesh(s)||P.getComponent(s,dm))){if(this.renderOrder.length<=e){console.warn("Incorrect renderOrder element count",this,this.renderOrder.length+" but expected "+this.gameObject.children.length,"Index: "+e,"ChildElement:",s);continue}s.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(),CE)for(let e=0;e<this.sharedMaterials.length;e++){const t=this.sharedMaterials[e];t&&(t.wireframe=!0)}}applyLightmapping(){var e;if(this.lightmapIndex>=0){const t=this.gameObject.type,s=this._lightmapTextureOverride!==void 0?this._lightmapTextureOverride:this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex);if(s){if(this._lightmaps||(this._lightmaps=[]),t==="Mesh"){const o=this.gameObject.material;if(o!=null&&o.isMeshBasicMaterial)o&&console.warn("Lightmapping is not supported on MeshBasicMaterial",o.name);else{if(this._lightmaps.length<=0){const r=new Vu(this.gameObject,this.context);this._lightmaps.push(r)}this._lightmaps[0].init(this.lightmapIndex,this.lightmapScaleOffset,s)}}else if(this.isMultiMaterialObject(this.gameObject)&&this.sharedMaterials.length>0)for(let o=0;o<this.gameObject.children.length;o++){const r=this.gameObject.children[o];if(!((e=r.material)!=null&&e.isMeshBasicMaterial)){let l;o>=this._lightmaps.length?(l=new Vu(r,this.context),this._lightmaps.push(l)):l=this._lightmaps[o],l.init(this.lightmapIndex,this.lightmapScaleOffset,s)}}}else Hc&&console.warn("Lightmap not found",this.sourceId,this.lightmapIndex)}}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}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=Wu.instance.setup(this,this.gameObject,this.context,null,{rend:this,foundMeshes:0,useMatrixWorldAutoUpdate:this.useInstanceMatrixWorldAutoUpdate()}),this._handles)return P.markAsInstancedRendered(this.gameObject,!0),!0}else if(this._handles!==null){for(const t of this._handles)t.updateInstanceMatrix(!0),t.add();return P.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&&!i1&&(this.setInstancingEnabled(!0),cs.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(){var e,t,s;if(this.gameObject){if(this._probeAnchorLastFrame!==this.probeAnchor&&((e=this._reflectionProbe)==null||e.onUnset(this),this.updateReflectionProbe()),Hc==this.name&&this.gameObject instanceof X){this.gameObject.geometry.computeBoundingSphere();const o=Q(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);q.DrawWireSphere(o,this.gameObject.geometry.boundingSphere.radius,56831)}if(this.isMultiMaterialObject(this.gameObject)&&((t=this.gameObject.children)==null?void 0:t.length)>0)for(const o of this.gameObject.children)this.applySettings(o);else this.applySettings(this.gameObject);if(this.sharedMaterials.changed&&(this.sharedMaterials.changed=!1,this.applyLightmapping()),(s=this._handles)!=null&&s.length&&this.gameObject[cc]===!0){this.gameObject[cc]=!1;for(let o=this._handles.length-1;o>=0;o--)this._handles[o].updateInstanceMatrix();this.gameObject.matrixWorldNeedsUpdate=!1}if(this._handles&&this._handles.length<=0&&P.markAsInstancedRendered(this.gameObject,!1),this._isInstancingEnabled&&this._handles)for(let o=0;o<this._handles.length;o++){const r=this._handles[o];Ln(r.object,!1)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onSet(this);for(const o of this._sharedMaterials)o&&"envMap"in o&&"envMapIntensity"in o&&!Vc.isUsingReflectionProbe(o)&&(o.envMap=this.context.scene.environment)}}onAfterRender(){if(this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Ln(t.object,!0)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onUnset(this),this.static&&this.gameObject.matrixAutoUpdate&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){Vx.applyStencil(this)}applySettings(e){e.receiveShadow=this.receiveShadows,this.shadowCastingMode==1?e.castShadow=!0:e.castShadow=!1}updateReflectionProbe(){this._reflectionProbe=null,this.reflectionProbeUsage!==0&&(this.startCoroutine(this._updateReflectionProbe(),Oe.LateUpdate),this._probeAnchorLastFrame=this.probeAnchor)}*_updateReflectionProbe(){const e=this.probeAnchor||this.gameObject,t=!!this.probeAnchor;this._reflectionProbe=Vc.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Ln(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Ln(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};$n([m()],rn.prototype,"receiveShadows"),$n([m()],rn.prototype,"shadowCastingMode"),$n([m()],rn.prototype,"lightmapIndex"),$n([m(ye)],rn.prototype,"lightmapScaleOffset"),$n([m()],rn.prototype,"enableInstancing"),$n([m()],rn.prototype,"renderOrder"),$n([m()],rn.prototype,"allowOcclusionWhenDynamic"),$n([m(A)],rn.prototype,"probeAnchor"),$n([m()],rn.prototype,"reflectionProbeUsage");let Di=rn;class $c extends Di{}class h0 extends $c{constructor(){super(...arguments),a(this,"_needUpdateBoundingSphere",!1)}awake(){var e;super.awake(),t1&&console.log('SkinnedMeshRenderer for "'+this.name+'"',this),this.allowOcclusionWhenDynamic=!1;for(const t of this.sharedMeshes)(e=t.parent)==null||e.updateWorldMatrix(!1,!0),this.markBoundsDirty()}onAfterRender(){if(super.onAfterRender(),this._needUpdateBoundingSphere){for(const e of this.sharedMeshes)if(e instanceof wn){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,s=Ev(e);s&&(e.geometry=s),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(t1){for(const e of this.sharedMeshes)if(e instanceof wn&&e.boundingSphere){const t=Q(e.boundingSphere.center).applyMatrix4(e.matrixWorld);q.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var OE=Object.defineProperty,n1=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&OE(e,t,o),o};const Hu=C("debuggltfexport");class d0 extends Lo{constructor(){super(...arguments),a(this,"sceneRoot")}}const u0=class Ll extends I{constructor(){super(...arguments),a(this,"binary",!0),a(this,"objects",[]),a(this,"ext")}async exportNow(e,t){Hu&&console.log("Exporting objects as glTF",this.objects),e||(e="scene"),(!this.objects||this.objects.length<=0)&&(this.objects=[this.context.scene]);const s={binary:this.binary,pivot:Ll.calculateCenter(this.objects),...t},o=await this.export(this.objects,s).catch(r=>(console.error(r),!1));return o===!1?!1:(this.binary?e.endsWith(".glb")||(e+=".glb"):e.endsWith(".gltf")||(e+=".gltf"),this.binary?Ll.saveArrayBuffer(o,e):Ll.saveJson(o,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const s=new Lv;s.register(d=>new Xx(d)),s.register(d=>new Bx(d)),r0(s,this.context),Ll.filterTopmostParent(e);const o={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||Ll.collectAnimations(e),...t},r=new Array,l=new A;t!=null&&t.pivot&&l.position.sub(t.pivot),Hu&&console.log("EXPORT",e),e.forEach(d=>{d&&t0(d)&&(l.children.push(d),d.matrixAutoUpdate=!1,d.matrix.copy(d.matrixWorld),P.getComponentsInChildren(d,Di).forEach(u=>{P.isActiveInHierarchy(u.gameObject)&&u.setInstancingEnabled(!1)}),d.traverse(u=>{if(!t0(u)){const p=u.parent;u.removeFromParent(),r.push(()=>{p&&p.add(u)})}}))});const c=new Zg(l);return t!=null&&t.needleComponents&&(this.ext=new Ux),this.ext&&(this.ext.registerExport(s),this.ext.context=c),new Promise((d,u)=>{Hu&&console.log("Starting glTF export.");try{s?.parse(l,p=>{h(),d(p)},p=>{h(),u(p)},o)}catch(p){console.error(p),u(p)}finally{r.forEach(p=>p()),Hu&&console.log("Finished glTF export.")}});function h(){e.forEach(d=>{d&&(d.matrixAutoUpdate=!0,P.getComponentsInChildren(d,Di).forEach(u=>{P.isActiveInHierarchy(u.gameObject)&&u.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 s=document.createElement("a");s.style.display="none",document.body.appendChild(s),typeof e=="string"?s.href=e:s.href=URL.createObjectURL(e),s.download=t,s.click(),s.remove()}static collectAnimations(e,t){t=t||[];for(const s of e)s&&s.traverseVisible(o=>{o.animations&&o.animations.length>0&&t.push(...o.animations)});return t}static calculateCenter(e,t){const s=t||new S;return s.set(0,0,0),e.forEach(o=>{s.add(ee(o))}),s.divideScalar(e.length),s}static filterTopmostParent(e){if(!(e.length<=0))for(let t=0;t<e.length;t++){let s=e[t];if(!s){e.splice(t,1),t--;continue}for(;s.parent;){if(e.includes(s.parent)){e.splice(t,1),t--;break}s=s.parent}}}};n1([m()],u0.prototype,"binary"),n1([m(A)],u0.prototype,"objects");let p0=u0;typeof globalThis!==void 0&&!("OffscreenCanvas"in globalThis)&&(globalThis.OffscreenCanvas=class{constructor(n,e){return a(this,"canvas"),this.canvas=document.createElement("canvas"),this.canvas.width=n,this.canvas.height=e,this.canvas.convertToBlob=(t,s)=>new Promise(o=>{this.canvas.toBlob(o,t,s)}),this.canvas}});const kE=C("debugprogress");function o1(n){n=n||new Date;const e=n.getMonth()+1,t=n.getDate(),s=n.getHours(),o=n.getMinutes(),r=n.getSeconds(),l=(e<10?"0":"")+e,c=(t<10?"0":"")+t,h=(s<10?"0":"")+s,d=(o<10?"0":"")+o,u=(r<10?"0":"")+r;return n.getFullYear()+l+c+"-"+h+d+u}class he{static start(e,t){typeof t=="string"&&(t={parentScope:t});const s=new ME(e,t);Gc.set(e,s)}static report(e,t){const s=Gc.get(e);if(!s){console.warn("Reporting progress for non-existing scope",e);return}typeof t=="string"&&(t={message:t,autoStep:!0}),s.report(t)}static end(e){const t=Gc.get(e);t&&(t.end(),Gc.delete(e))}}const Gc=new Map;class ME{constructor(e,t){a(this,"scopeLabel"),a(this,"parentScope"),a(this,"childScopes",[]),a(this,"parentDepth",0),a(this,"lastStep",0),a(this,"lastAutoStepWeight",1),a(this,"lastTotalSteps",0),a(this,"onProgress"),a(this,"showLogs",!1),a(this,"selfProgress",0),a(this,"totalProgress",0),a(this,"selfReports",0),a(this,"totalReports",0),this.parentScope=t!=null&&t.parentScope?Gc.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??!!kE,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 o=typeof e.autoStep=="number"?e.autoStep:1;this.lastStep+=this.lastAutoStepWeight,this.lastAutoStepWeight=o,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 o=0,r=0;for(const c of this.childScopes)o+=c.selfProgress,r+=1;r>0&&(o/=r);const l=this.lastAutoStepWeight/(this.lastTotalSteps??1);this.totalProgress=this.selfProgress+o*l}else this.totalProgress=this.selfProgress;this.selfProgress=Math.min(1,this.selfProgress),this.totalProgress=Math.min(1,this.totalProgress);let s=(this.totalProgress*100).toFixed(3)+"%";this.childScopes.length>0&&(s+=" ("+(this.selfProgress*100).toFixed(3)+"% self)"),e!=null&&e.message&&(s=e.message+" \u2013 "+s),this.lastStep!==void 0&&this.lastTotalSteps!==void 0&&(s="Step "+(this.lastStep+(this.lastAutoStepWeight!=1?"\u2013"+(this.lastStep+this.lastAutoStepWeight):"")+"/"+this.lastTotalSteps)+" "+s),t?this.totalReports++:(this.selfReports++,this.totalReports++),this.showLogs&&console.timeLog(this.scopeLabel,s),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}}function Ps(n){return n=n.replace(/[^a-zA-Z0-9_]/g,""),n.match(/^[a-zA-Z_]/)||(n="_"+n),n}function r1(n){return n=n.replace('"','\\"'),n}function a1(n){if(n.length===0)return null;const e=n.map(t=>{const s=new Array;for(;t.parent;)s.unshift(t.parent),t=t.parent;return s});return e[0].findLast(t=>e.every(s=>s.includes(t)))||null}function l1(n){const e=a1(n),t=new Set;for(const s of n){let o=s.parent;for(;o&&o!==e;)n.includes(o)||t.add(o),o=o.parent}return t}const RE=new S,TE=new H,EE=new S(1,1,1),c1=class jl{constructor(e,t,s=null,o=null,r=null,l=null,c=null,h=null){a(this,"uuid"),a(this,"name"),a(this,"type"),a(this,"extraSchemas",[]),a(this,"displayName"),a(this,"visibility"),a(this,"transform",null),a(this,"_isDynamic"),a(this,"geometry"),a(this,"material"),a(this,"camera"),a(this,"parent"),a(this,"skinnedMesh"),a(this,"children",[]),a(this,"animations"),a(this,"_eventListeners"),a(this,"needsTranslate",!1),a(this,"needsOrient",!1),a(this,"needsScale",!1);var d,u,p;this.uuid=e,this.name=Ps(t),this.displayName=t,s?this.transform={position:((d=s.position)==null?void 0:d.clone())||null,quaternion:((u=s.quaternion)==null?void 0:u.clone())||null,scale:((p=s.scale)==null?void 0:p.clone())||null}:this.transform=null,this.geometry=o,this.material=r,this.camera=l,this.parent=null,this.children=[],this._eventListeners={},this._isDynamic=!1,this.skinnedMesh=c,this.animations=h}getMatrix(){if(!this.transform)return new se;const{position:e,quaternion:t,scale:s}=this.transform,o=new se;return o.compose(e||RE,t||TE,s||EE),o}setMatrix(e){if(!e||!(e instanceof se)){this.transform=null;return}const t=new S,s=new H,o=new S;e.decompose(t,s,o),this.transform={position:t,quaternion:s,scale:o}}get matrix(){return this.getMatrix()}set matrix(e){this.setMatrix(e)}get isDynamic(){return this._isDynamic}set isDynamic(e){this._isDynamic=e}static createEmptyParent(e){const t=new jl(_n.generateUUID(),e.name+"_empty_"+jl.USDObject_export_id++,e.transform),s=e.parent;return s&&s.add(t),t.add(e),t.isDynamic=!0,e.transform=null,t}static createEmpty(){const e=new jl(_n.generateUUID(),"Empty_"+jl.USDObject_export_id++);return e.isDynamic=!0,e}is(e){return e?this.uuid===e.uuid:!1}isEmpty(){return!this.geometry}clone(){const e=new jl(_n.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 s=this._eventListeners[e].indexOf(t);s>=0&&this._eventListeners[e].splice(s,1)}onSerialize(e,t){const s=this._eventListeners.serialize;s&&s.forEach(o=>o(e,t))}};a(c1,"USDObject_export_id",0);let di=c1;class m0 extends di{constructor(){super(void 0,"StageRoot",null,null,null,null),a(this,"stageLength"),this.children=[],this.stageLength=200}get isDocumentRoot(){return!0}get isDynamic(){return!1}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 s of t.children)this.traverse(e,s)}findById(e){let t=!1;function s(o){if(!t){if(o.uuid===e)return t=!0,o;if(o.children)for(const r of o.children){if(!r)continue;const l=s(r);if(l)return l}}}return s(this)}buildHeader(e){var t,s,o;const r=(t=e.extensions)==null?void 0:t.find(f=>f?.extensionName==="animation"),l=(s=e.extensions)==null?void 0:s.find(f=>f?.extensionName==="Behaviour"),c=(o=e.extensions)==null?void 0:o.find(f=>f?.extensionName==="Physics"),h=r?.getStartTimeCode()??0,d=r?.getEndTimeCode()??0;let u="";const p=r?.registeredClips;if(p)for(const f of p)u+=` # Animation: ${f.name}, start=${r.getStartTimeByClip(f)*60}, length=${f.duration*60}
1005
- `;const g=u;return`#usda 1.0
1006
- (
1007
- customLayerData = {
1008
- string creator = "Needle Engine ${bs}"
1009
- dictionary Needle = {
1010
- bool animations = ${r?1:0}
1011
- bool interactive = ${l?1:0}
1012
- bool physics = ${c?1:0}
1013
- bool quickLookCompatible = ${e.quickLookCompatible?1:0}
1014
- }
1015
- }
1016
- defaultPrim = "${Ps(this.name)}"
1017
- metersPerUnit = 1
1018
- upAxis = "Y"
1019
- startTimeCode = ${h}
1020
- endTimeCode = ${d}
1021
- timeCodesPerSecond = 60
1022
- framesPerSecond = 60
1023
- doc = """Generated by Needle Engine USDZ Exporter ${bs}"""
1024
- ${g}
1025
- )
1026
- `}}const el=`
1027
- `,Xt="</StageRoot/Materials";class h1{constructor(){a(this,"str"),a(this,"indent"),this.str="",this.indent=0}clear(){this.str="",this.indent=0}beginBlock(e=void 0,t="{",s=!0){e!==void 0?(e=this.applyIndent(e),this.str+=e,s?(this.str+=el,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=el,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+el}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=el,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+el}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=el}toString(){return this.str}applyIndent(e){let t="";for(let s=0;s<this.indent;s++)t+=" ";return t+e}}class AE{constructor(e,t,s){a(this,"root"),a(this,"exporter"),a(this,"extensions",[]),a(this,"quickLookCompatible"),a(this,"exportInvisible"),a(this,"materials"),a(this,"textures"),a(this,"files"),a(this,"document"),a(this,"output"),a(this,"animations"),this.root=e,this.exporter=t,this.quickLookCompatible=s.quickLookCompatible,this.exportInvisible=s.exportInvisible,s.extensions&&(this.extensions=s.extensions),this.materials=new Map,this.textures={},this.files={},this.document=new m0,this.output="",this.animations=[]}}class g0{constructor(){a(this,"ar",{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}}),a(this,"quickLookCompatible",!1),a(this,"extensions",[]),a(this,"maxTextureSize",4096),a(this,"exportInvisible",!1)}}let d1=class{constructor(){a(this,"debug"),a(this,"pruneUnusedNodes"),a(this,"sceneAnchoringOptions",new g0),a(this,"extensions",[]),a(this,"keepObject"),a(this,"beforeWritingDocument"),this.debug=!1,this.pruneUnusedNodes=!0}async parse(n,e=new g0){var t,s;e=Object.assign(new g0,e),this.sceneAnchoringOptions=e;const o=new AE(n,this,e);this.extensions=o.extensions;const r=o.files,l="model.usda";r[l]=null;const c=o.materials,h=o.textures;he.report("export-usdz","Invoking onBeforeBuildDocument"),await $u(o,"onBeforeBuildDocument"),he.report("export-usdz","Done onBeforeBuildDocument"),he.report("export-usdz","Reparent bones to common ancestor");const d=[],u=new Set;n?.traverse(w=>{if(!(!e.exportInvisible&&!w.visible)&&w instanceof wn){const x=w.skeleton.bones,M=a1(x);if(M){const k={object:w,originalParent:w.parent,newParent:M};d.push(k),u.add(k.object.uuid),k.newParent&&u.add(k.newParent.uuid),k.originalParent&&u.add(k.originalParent.uuid)}}});for(const w of d){const{object:x,originalParent:M,newParent:k}=w;k.add(x)}he.report("export-usdz","Traversing hierarchy"),n&&u1(n,o.document,o,this.keepObject),he.report("export-usdz","Invoking onAfterBuildDocument"),await $u(o,"onAfterBuildDocument");const p=o.extensions.find(w=>w.extensionName==="Behaviour"),g=p?.getAllTargetUuids()??new Set;if(this.pruneUnusedNodes){const w={allBehaviorTargets:g,debug:!1,boneReparentings:u,quickLookCompatible:o.quickLookCompatible};this.debug&&p1(o.document,"Hierarchy BEFORE pruning",w),m1(o.document,w),this.debug&&p1(o.document,"Hierarchy AFTER pruning")}else this.debug&&console.log("Pruning of empty nodes is disabled. This may result in a larger USDZ file.");he.report("export-usdz",{message:"Parsing document",autoStep:10}),await IE(o,()=>(he.report("export-usdz","Building materials"),NE(c,h,e.quickLookCompatible))),he.report("export-usdz","Invoking onAfterSerialize"),await $u(o,"onAfterSerialize");for(const w of d){const{object:x,originalParent:M,newParent:k}=w;M&&M.add(x)}(s=(t=o.exporter)==null?void 0:t.beforeWritingDocument)==null||s.call(t);const f=o.document.buildHeader(o)+`
1028
- `+o.output;this.debug&&console.log(f),r[l]=jv(f),o.output="",he.report("export-usdz",{message:"Exporting textures",autoStep:10}),he.start("export-usdz-textures",{parentScope:"export-usdz",logTimings:!1});const y=new hr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}),v=Object.keys(h).length;he.report("export-usdz-textures",{totalSteps:v*3,currentStep:0});const b=async w=>{const x=h[w],M=x.texture,k=P1.includes(M.format);let T={imageData:M.image};he.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const L=x.scale!==void 0&&x.scale.x!==1&&x.scale.y!==1&&x.scale.z!==1&&x.scale.w!==1;(M.isCompressedTexture||M.isRenderTargetTexture||L)&&(T=await f1(M,e.maxTextureSize,y,x.scale)),he.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const B=await jE(T.imageBitmap||T.imageData,e.maxTextureSize).catch(z=>{console.error("Error converting texture to canvas",M,z)});if(B){he.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const z=await B.convertToBlob({type:k?"image/png":"image/jpeg",quality:.95});r[`textures/${w}.${k?"png":"jpg"}`]=new Uint8Array(await z.arrayBuffer())}else console.warn("Can`t export texture: ",M)};for(const w in h)await b(w);y.dispose(),he.end("export-usdz-textures");let _=0;for(const w in r){const x=r[w],M=34+w.length;_+=M;const k=_&63;if(k!==4){const T=64-k,L=new Uint8Array(T);r[w]=[x,{extra:{12345:L}}]}_=x.length}return he.report("export-usdz","zip archive"),qP(r,{level:0})}};function u1(n,e,t,s){var o;if(!t.exportInvisible&&!n.visible)return;let r,l,c;const h={position:n.position,quaternion:n.quaternion,scale:n.scale};if(n.position.x===0&&n.position.y===0&&n.position.z===0&&(h.position=null),n.quaternion.x===0&&n.quaternion.y===0&&n.quaternion.z===0&&n.quaternion.w===1&&(h.quaternion=null),n.scale.x===1&&n.scale.y===1&&n.scale.z===1&&(h.scale=null),(n instanceof X||n instanceof wn)&&(l=n.geometry,c=n.material),s&&!s(n)&&(l=void 0,c=void 0),(n instanceof X||n instanceof wn)&&c&&(c instanceof ft||c instanceof Me||c instanceof Pe&&c.type==="MeshLineMaterial")){const d=Xu(n),u=n instanceof wn?n:null;r=new di(n.uuid,d,h,l,c,void 0,u,n.animations)}else if(n instanceof we||n instanceof Sm){const d=Xu(n);r=new di(n.uuid,d,h,void 0,void 0,n)}else{const d=Xu(n);r=new di(n.uuid,d,h,void 0,void 0,void 0,void 0,n.animations)}if(r){if(r.displayName=((o=n.userData)==null?void 0:o.name)||n.name,r.visibility=n.visible?void 0:"invisible",e&&e.add(r),e=r,t.extensions)for(const d of t.extensions)d.onExportObject&&d.onExportObject.call(d,n,r,t)}else{const d=Xu(n),u=new di(n.uuid,d,{position:n.position,quaternion:n.quaternion,scale:n.scale});e&&e.add(u),e=u}for(const d of n.children)u1(d,e,t,s)}function p1(n,e,...t){const s={};let o=0;function r(l,c){o++;let h=l.displayName||l.name;h+=" ("+l.uuid+")",(l.geometry||l.material||l.camera||l.skinnedMesh)&&(h+=" ("+(l.geometry?"geo, ":"")+(l.material?"mat, ":"")+(l.camera?"cam, ":"")+(l.skinnedMesh?"skin, ":"")+")"),c[h]={};const d={object:l};l.material&&(d.mat=!0),l.geometry&&(d.geo=!0),l.camera&&(d.cam=!0),l.skinnedMesh&&(d.skin=!0),c[h]._self=d;for(const u of l.children)u&&r(u,c[h])}r(n,s),console.log(e+" ("+o+" nodes)",s,...t)}function m1(n,e){var t;let s=!0;const o=new Array,r=new Array;if(n.children.length===0)s=!0;else{const u=[...n.children];for(const p of u)if(p){const g=m1(p,e);e.debug&&(g?o.push(p):r.push(p)),s=s&&g}}const l=e.allBehaviorTargets.has(n.uuid),c=n.geometry||n.material||n.camera&&!e.quickLookCompatible||n.skinnedMesh||!1,h=e.boneReparentings.has(n.uuid),d=s&&!l&&!c&&!h;return d?(e.debug&&console.log("Pruned object:",(n.displayName||n.name)+" ("+n.uuid+")",{isVisible:c,isBehaviorSourceOrTarget:l,allChildsWerePruned:s,isBoneReparenting:h,object:n,prunedChilds:o,keptChilds:r}),(t=n.parent)==null||t.remove(n)):e.debug&&console.log("Kept object:",(n.displayName||n.name)+" ("+n.uuid+")",{isVisible:c,isBehaviorSourceOrTarget:l,allChildsWerePruned:s,isBoneReparenting:h,object:n,prunedChilds:o,keptChilds:r}),d}async function IE(n,e){he.start("export-usdz-resources","export-usdz");const t=[];for(const h of n.document.children)g1(h,n,t);const s=t.length;for(let h=0;h<s;h++)he.report("export-usdz-resources",{totalSteps:s,currentStep:h}),await new Promise((d,u)=>{t[h](),d()});he.end("export-usdz-resources");const o=new h1,r=n.exporter.sceneAnchoringOptions.ar;o.beginBlock(`def Xform "${n.document.name}"`),o.beginBlock(`def Scope "Scenes" (
1029
- kind = "sceneLibrary"
1030
- )`),o.beginBlock('def Xform "Scene"',"(",!1),o.appendLine('apiSchemas = ["Preliminary_AnchoringAPI"]'),o.appendLine("customData = {"),o.appendLine(" bool preliminary_collidesWithEnvironment = 0"),o.appendLine(' string sceneName = "Scene"'),o.appendLine("}"),o.appendLine('sceneName = "Scene"'),o.closeBlock(")"),o.beginBlock(),o.appendLine(`token preliminary:anchoring:type = "${r.anchoring.type}"`),r.anchoring.type==="plane"&&o.appendLine(`token preliminary:planeAnchoring:alignment = "${r.planeAnchoring.alignment}"`),r.anchoring.type==="image"&&o.appendLine(`rel preliminary:imageAnchoring:referenceImage = </${n.document.name}/Scenes/Scene/AnchoringReferenceImage>`),o.appendLine();const l=h=>{if(!h)return 0;let d=1;for(const u of h.children)d+=l(u);return d},c=l(n.document);he.start("export-usdz-xforms","export-usdz"),he.report("export-usdz-xforms",{totalSteps:c,currentStep:1});for(const h of n.document.children)b1(h,o,n);he.end("export-usdz-xforms"),he.report("export-usdz","invoke onAfterHierarchy"),$u(n,"onAfterHierarchy",o),o.closeBlock(),o.closeBlock(),o.appendLine(e()),o.closeBlock(),he.report("export-usdz","write to string"),n.output+=o.toString()}function g1(n,e,t){if(!n)return;const s=n.geometry,o=n.material;if(s)if(o&&("isMeshStandardMaterial"in o&&o.isMeshStandardMaterial||"isMeshBasicMaterial"in o&&o.isMeshBasicMaterial||o.type==="MeshLineMaterial")){const r="geometries/"+y0(s,n.name)+".usda";if(!(r in e.files)){const l=()=>{var c,h;const d=FE(s,(h=(c=n.skinnedMesh)==null?void 0:c.skeleton)==null?void 0:h.bones,e.quickLookCompatible);e.files[r]=BE(d)};t.push(l)}}else console.warn("NeedleUSDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",o?.name);o&&(o.uuid in e.materials||(e.materials[o.uuid]=o));for(const r of n.children)g1(r,e,t)}async function $u(n,e,t=null){if(n.extensions){for(const s of n.extensions)if(s&&typeof s[e]=="function"){const o=s[e].call(s,n,t);o instanceof Promise&&await o}}}let Gu=null,Qt=null,f0,tl,qu;async function f1(n,e=1/0,t=null,s=void 0){f0||(f0=new zs(2,2,1,1)),tl||(tl=new gs({uniforms:{blitTexture:new ao(n),flipY:new ao(!1),scale:new ao(new ye(1,1,1,1))},vertexShader:`
1031
- varying vec2 vUv;
1032
- uniform bool flipY;
1033
- void main(){
1034
- vUv = uv;
1035
- if (flipY)
1036
- vUv.y = 1. - vUv.y;
1037
- gl_Position = vec4(position.xy * 1.0,0.,.999999);
1038
- }`,fragmentShader:`
1039
- uniform sampler2D blitTexture;
1040
- uniform vec4 scale;
1041
- varying vec2 vUv;
1042
-
1043
- void main(){
1044
- gl_FragColor = vec4(vUv.xy, 0, 1);
1045
-
1046
- #ifdef IS_SRGB
1047
- gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
1048
- #else
1049
- gl_FragColor = texture2D( blitTexture, vUv);
1050
- #endif
1051
-
1052
- gl_FragColor.rgba *= scale.rgba;
1053
- }`}));const o=tl.uniforms;o.blitTexture.value=n,o.flipY.value=!1,o.scale.value=new ye(1,1,1,1),s!==void 0&&o.scale.value.copy(s),tl.defines.IS_SRGB=n.colorSpace==Cn,tl.needsUpdate=!0,qu||(qu=new X(f0,tl),qu.frustumCulled=!1);const r=new we,l=new bi;l.add(qu),t||(t=Gu=new hr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const c=Math.min(n.image.width,e),h=Math.min(n.image.height,e);Qt&&(Qt.width!==c||Qt.height!==h)&&(Qt.dispose(),Qt=null),Qt||(Qt=new Pn(c,h,{format:ad,type:mP,minFilter:kv,magFilter:kv})),t.setRenderTarget(Qt),t.setSize(c,h),t.clear(),t.render(l,r),Gu&&(Gu.dispose(),Gu=null);const d=new Uint8ClampedArray(Qt.width*Qt.height*4);t.readRenderTargetPixels(Qt,0,0,Qt.width,Qt.height,d);const u=new ImageData(d,Qt.width,Qt.height,void 0),p=await createImageBitmap(u,{premultiplyAlpha:"none"});return{imageData:u,imageBitmap:p}}function LE(n){return typeof HTMLImageElement<"u"&&n instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&n instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&n instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&n instanceof ImageBitmap}async function jE(n,e=4096){const t=e/Math.max(n.width,n.height),s=n.width*Math.min(1,t),o=n.height*Math.min(1,t),r=new OffscreenCanvas(s,o),l={premultiplyAlpha:"none"};n.width!==s&&(l.resizeWidth=s),n.height!==o&&(l.resizeHeight=o);const c=await createImageBitmap(n,l),h=r.getContext("bitmaprenderer");return h&&h.transferFromImageBitmap(c),r}async function y1(n,e=void 0,t=!1,s=4096){if(LE(n)){const o=s/Math.max(n.width,n.height),r=new OffscreenCanvas(n.width*Math.min(1,o),n.height*Math.min(1,o)),l=r.getContext("2d",{alpha:!0,premultipliedAlpha:!1});if(!l)throw new Error("Could not get canvas 2D context");if(t===!0&&(l.translate(0,r.height),l.scale(1,-1)),l.drawImage(n,0,0,r.width,r.height),e!==void 0){const c=e.x,h=e.y,d=e.z,u=e.w,p=l.getImageData(0,0,r.width,r.height),g=p.data;for(let f=0;f<g.length;f+=4)g[f+0]=g[f+0]*c,g[f+1]=g[f+1]*h,g[f+2]=g[f+2]*d,g[f+3]=g[f+3]*u;l.putImageData(p,0,0)}return r}else throw new Error("NeedleUSDZExporter: No valid image data found. Unable to process texture.")}const Ae=7;function DE(){return`#usda 1.0
1054
- (
1055
- customLayerData = {
1056
- string creator = "Needle Engine USDZExporter"
1057
- }
1058
- metersPerUnit = 1
1059
- upAxis = "Y"
1060
- )
1061
- `}function BE(n,e){let t=DE();return t+=n,jv(t)}function Xu(n){return n.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+n.id}function v1(n){return Ps(n.name||"bone_"+n.uuid)}function y0(n,e){return Ps(n.name||"Geometry")+"_"+n.id}function v0(n){return Ps(n.name||"Material")+"_"+n.id}function il(n,e){let t=v1(n),s=n.parent;for(;s&&s!==e;)t=v1(s)+"/"+t,s=s.parent;return t}function b1(n,e,t){var s;if(n==null)return;he.report("export-usdz-xforms",{message:"buildXform "+n.displayName||n.name,autoStep:!0});const o=n.transform,r=n.geometry,l=n.material,c=n.camera,h=n.name;if(n.animations)for(const y of n.animations)t.animations.push(y);const d=r&&r.isBufferGeometry&&r.attributes.skinIndex!==void 0&&r.attributes.skinIndex.count>0,u=d?"SkelRoot":"Xform",p=new Array,g=l&&l instanceof Me&&l.color&&l.color.r===1&&l.color.g===1&&l.color.b===1&&!l.map&&l.opacity===1&&r?.attributes.color;if(r!=null&&r.attributes.color&&!g&&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.",n.displayName),e.appendLine(),r?(e.beginBlock(`def ${u} "${h}"`,"(",!1),t.quickLookCompatible&&l&&l.side===xi&&!d?e.appendLine(`prepend references = @./geometries/${y0(r)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${y0(r)}.usda@</Geometry>`),g||p.push("MaterialBindingAPI"),d&&p.push("SkelBindingAPI")):c&&!t.quickLookCompatible?e.beginBlock(`def Camera "${h}"`,"(",!1):n.type!==void 0?e.beginBlock(`def ${n.type} "${h}"`):e.beginBlock(`def Xform "${h}"`,"(",!1),n.type===void 0&&((s=n.extraSchemas)!=null&&s.length&&p.push(...n.extraSchemas),p.length&&e.appendLine(`prepend apiSchemas = [${p.map(y=>`"${y}"`).join(", ")}]`)),n.displayName&&e.appendLine(`displayName = "${r1(n.displayName)}"`),(c||n.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),r&&l){if(!g){const y=v0(l);e.appendLine(`rel material:binding = </StageRoot/Materials/${y}>`)}!t.quickLookCompatible&&l.side===xi&&(e.beginBlock('over "Geometry" '),e.appendLine("uniform bool doubleSided = 1"),e.closeBlock())}let f=!1;if(d?(e.appendLine("rel skel:skeleton = <Rig>"),e.appendLine("rel skel:animationSource = <Rig/_anim>"),f=!1):n.type===void 0&&o&&(f=f||o.position!==null||o.quaternion!==null||o.scale!==null,o.position&&(n.needsTranslate=!0,e.appendLine(`double3 xformOp:translate = (${de(o.position.x)}, ${de(o.position.y)}, ${de(o.position.z)})`)),o.quaternion&&(n.needsOrient=!0,e.appendLine(`quatf xformOp:orient = (${de(o.quaternion.w)}, ${de(o.quaternion.x)}, ${de(o.quaternion.y)}, ${de(o.quaternion.z)})`)),o.scale&&(n.needsScale=!0,e.appendLine(`double3 xformOp:scale = (${de(o.scale.x)}, ${de(o.scale.y)}, ${de(o.scale.z)})`))),n.visibility!==void 0&&e.appendLine(`token visibility = "${n.visibility}"`),c&&!t.quickLookCompatible&&("isOrthographicCamera"in c&&c.isOrthographicCamera?(e.appendLine(`float2 clippingRange = (${c.near}, ${c.far})`),e.appendLine(`float horizontalAperture = ${((Math.abs(c.left)+Math.abs(c.right))*10).toPrecision(Ae)}`),e.appendLine(`float verticalAperture = ${((Math.abs(c.top)+Math.abs(c.bottom))*10).toPrecision(Ae)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in c&&c.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${c.near.toPrecision(Ae)}, ${c.far.toPrecision(Ae)})`),e.appendLine(`float focalLength = ${c.getFocalLength().toPrecision(Ae)}`),e.appendLine(`float focusDistance = ${c.focus.toPrecision(Ae)}`),e.appendLine(`float horizontalAperture = ${c.getFilmWidth().toPrecision(Ae)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${c.getFilmHeight().toPrecision(Ae)}`))),n.onSerialize&&n.onSerialize(e,t),n.type===void 0){const y=new Array;n.needsTranslate&&y.push('"xformOp:translate"'),n.needsOrient&&y.push('"xformOp:orient"'),n.needsScale&&y.push('"xformOp:scale"'),y.length&&e.appendLine(`uniform token[] xformOpOrder = [${y.join(", ")}]`)}if(n.children){e.appendLine();for(const y of n.children)b1(y,e,t)}e.closeBlock()}function de(n){return Number.isInteger(n)?n.toString():n.toFixed(10)}function _1(n){const e=n.elements;return`( ${Qu(e,0)}, ${Qu(e,4)}, ${Qu(e,8)}, ${Qu(e,12)} )`}function Qu(n,e){return`(${de(n[e+0])}, ${de(n[e+1])}, ${de(n[e+2])}, ${de(n[e+3])})`}function FE(n,e=[],t=!0){return`
1062
- def "Geometry"
1063
- ${UE(n,e,t)}
1064
- `}function UE(n,e=[],t=!0){const s="Geometry",o=n.attributes,r=o.position.count,l=e&&e.length>0,c=[],h=[];let d=new Array,u=o.skinIndex;if(l){const g=[];for(const b of e)c.push({bone:b,index:e.indexOf(b)}),g.push(b.uuid);let f=1e4;for(;g.length<e.length&&f-- >0;)for(const b of c){const _=b.bone.children;for(const w of _)g.indexOf(w.uuid)===-1&&e.indexOf(w)!==-1&&(c.push({bone:w,index:e.indexOf(w)}),g.push(w.uuid))}f<=0&&console.error("Failed to sort bones in skinned mesh",c,e,g);for(const b of l1(e))c.push({bone:b,index:c.length});const y=c[0].bone.parent;c.sort((b,_)=>il(b.bone,y)>il(_.bone,y)?1:-1),c.map(b=>'"'+il(b.bone,y)+'"').join(", ");for(const b in c)h[c[b].index]=parseInt(b);const v=o.skinIndex;d=new Array;for(let b=0;b<v.count;b++){const _=v.getX(b),w=v.getY(b),x=v.getZ(b),M=v.getW(b);d.push(h[_],h[w],h[x],h[M])}u=new yt(new Uint16Array(d),4)}const p=o.skinWeight&&o.skinIndex;return`
1065
- {
1066
- def Mesh "${s}" ${p?`(
1067
- prepend apiSchemas = ["SkelBindingAPI"]
1068
- )`:""}
1069
- {
1070
- int[] faceVertexCounts = [${b0(n)}]
1071
- int[] faceVertexIndices = [${_0(n)}]
1072
- ${o.normal||t?`normal3f[] normals = [${Yu(o.normal,r)}] (
1073
- interpolation = "vertex"
1074
- )`:""}
1075
- point3f[] points = [${Yu(o.position,r)}]
1076
- ${o.uv?`texCoord2f[] primvars:st = [${x1(o.uv,r,!0)}] (
1077
- interpolation = "vertex"
1078
- )`:""}
1079
- ${o.uv1?w0("st1",o.uv1):""}
1080
- ${o.uv2?w0("st2",o.uv2):""}
1081
- ${o.uv3?w0("st3",o.uv3):""}
1082
- ${p?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
1083
- elementSize = 1
1084
- interpolation = "constant"
1085
- )`:""}
1086
- ${o.skinIndex?`int[] primvars:skel:jointIndices = [${w1(u,!0)}] (
1087
- elementSize = 4
1088
- interpolation = "vertex"
1089
- )`:""}
1090
- ${o.skinWeight?`float[] primvars:skel:jointWeights = [${w1(o.skinWeight)}] (
1091
- elementSize = 4
1092
- interpolation = "vertex"
1093
- )`:""}
1094
- ${o.color?`color3f[] primvars:displayColor = [${Yu(o.color,r)}] (
1095
- interpolation = "vertex"
1096
- )`:""}
1097
- uniform token subdivisionScheme = "none"
1098
- }
1099
- }
1100
- ${t?`
1101
- # This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
1102
- # geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
1103
- def "${s}_doubleSided" (
1104
- prepend references = </Geometry>
1105
- )
1106
- {
1107
- over "Geometry"
1108
- {
1109
- int[] faceVertexCounts = [${b0(n)+", "+b0(n)}]
1110
- int[] faceVertexIndices = [${_0(n)+", "+_0(n,!0)}]
1111
- }
1112
- }
1113
- `:""}
1114
- `}function b0(n){const e=n.index!==null?n.index.count:n.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function _0(n,e=!1){const t=n.index,s=[];if(t!==null)for(let o=0;o<t.count;o++){let r=o;e&&(r=o%3===0?o+2:o%3===2?o-2:o),s.push(t.getX(r))}else{const o=n.attributes.position.count;for(let r=0;r<o;r++){let l=r;e&&(l=r%3===0?r+2:r%3===2?r-2:r),s.push(l)}}return s.join(", ")}function w0(n,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${n} = [${x1(e,t,!0)}] (
1115
- interpolation = "vertex"
1116
- )`;case 3:return`texCoord3f[] primvars:${n} = [${Yu(e,t)}] (
1117
- interpolation = "vertex"
1118
- )`;case 4:return`double4[] primvars:${n} = [${zE(e,t)}] (
1119
- interpolation = "vertex"
1120
- )`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+n+"."),""}}function Yu(n,e){if(n===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 s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s);t.push(`(${o.toPrecision(Ae)}, ${r.toPrecision(Ae)}, ${l.toPrecision(Ae)})`)}return t.join(", ")}function zE(n,e){if(n===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 s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s)||0,c=n.getW(s)||0;t.push(`(${o.toPrecision(Ae)}, ${r.toPrecision(Ae)}, ${l.toPrecision(Ae)}, ${c.toPrecision(Ae)})`)}return t.join(", ")}function w1(n,e=!1){const t=[];for(let s=0;s<n.count;s++){const o=n.getX(s),r=n.getY(s),l=n.getZ(s),c=n.getW(s);t.push(`${e?o:o.toPrecision(Ae)}`),t.push(`${e?r:r.toPrecision(Ae)}`),t.push(`${e?l:l.toPrecision(Ae)}`),t.push(`${e?c:c.toPrecision(Ae)}`)}return t.join(", ")}function x1(n,e,t=!1){if(n===void 0)return console.warn("USDZExporter: UVs missing."),Array(e).fill("(0, 0)").join(", ");const s=[];for(let o=0;o<n.count;o++){const r=n.getX(o);let l=n.getY(o);t&&(l=1-l),s.push(`(${r.toPrecision(Ae)}, ${l.toPrecision(Ae)})`)}return s.join(", ")}function NE(n,e,t=!1){const s=[];for(const o in n){const r=n[o];s.push(WE(r,e,t))}return`
1121
- def "Materials"
1122
- {
1123
- ${s.join("")}
1124
- }`}function WE(n,e,t=!1){var s,o,r;const l=v0(n);if(n.colorWrite===!1||((s=n.userData)==null?void 0:s.isShadowCatcherMaterial)||((o=n.userData)==null?void 0:o.isLightBlendMaterial)){const b=n.userData.isLightBlendMaterial||n.userData.isShadowCatcherMaterial?"ND_realitykit_shadowreceiver_surfaceshader":"ND_realitykit_occlusion_surfaceshader";return`
1125
-
1126
- def Material "${l}" ${n.name?`(
1127
- displayName = "${n.name}"
1128
- )`:""}
1129
- {
1130
- token outputs:mtlx:surface.connect = ${Xt}/${l}/Occlusion.outputs:out>
1131
-
1132
- def Shader "Occlusion"
1133
- {
1134
- uniform token info:id = "${b}"
1135
- token outputs:out
1136
- }
1137
- }`}const c=" ",h=[],d=[],u=new Set;function p(b){var _;return Ps(b.name)+"_"+(((_=b.source)==null?void 0:_.id)??b.id)}function g(b,_,w=void 0,x=void 0){const M=p(b),k=M+(x!==void 0&&x!==1?"_"+x:""),T=t&&x!==void 0&&x!==1,L=T?new ye(1,1,1,x):void 0;x===void 0&&(x=1),T&&(x=1),L&&L.w<=.05&&(L.w=.05),e[k]={texture:b,scale:L};const B=b.channel>0?"st"+b.channel:"st";u.add(b.channel);const z=P1.includes(b.format),j={1e3:"repeat",1001:"clamp",1002:"mirror"},V=b.repeat.clone(),G=b.offset.clone(),E=b.rotation,U=Math.sin(E),$=Math.cos(E);G.y=1-G.y-V.y,t?(V.x===0&&(V.x=1e-4),V.y===0&&(V.y=1e-4),G.x=G.x/V.x,G.y=G.y/V.y,G.x+=U/V.x,G.y+=$-1):(G.x+=U*V.x,G.y+=(1-$)*V.y);const te=V.x!=1||V.y!=1||G.x!=0||G.y!=0||E!=0,oe=`${Xt}/${l}/${"uvReader_"+B}.outputs:result>`,ue=`${Xt}/${l}/Transform2d_${_}.outputs:result>`,ge=_!=="normal"&&w&&(w.r!==1||w.g!==1||w.b!==1||x!==1)||!1,He=_==="normal",$e=n instanceof ft&&n.normalScale?n.normalScale.x*2:2,us=$e.toFixed(Ae),ps=(-1*($e/2)).toFixed(Ae),Bl=(1-$e).toFixed(Ae);return`
1138
- ${te?`def Shader "Transform2d_${_}" (
1139
- sdrMetadata = {
1140
- string role = "math"
1141
- }
1142
- )
1143
- {
1144
- uniform token info:id = "UsdTransform2d"
1145
- float2 inputs:in.connect = ${oe}
1146
- float2 inputs:scale = ${C1(V)}
1147
- float2 inputs:translation = ${C1(G)}
1148
- float inputs:rotation = ${(E/Math.PI*180).toFixed(Ae)}
1149
- float2 outputs:result
1150
- }
1151
- `:""}
1152
- def Shader "${M}_${_}"
1153
- {
1154
- uniform token info:id = "UsdUVTexture"
1155
- asset inputs:file = @textures/${k}.${z?"png":"jpg"}@
1156
- token inputs:sourceColorSpace = "${b.colorSpace==="srgb"?"sRGB":"raw"}"
1157
- float2 inputs:st.connect = ${te?ue:oe}
1158
- ${ge?`
1159
- float4 inputs:scale = (${w?w.r+", "+w.g+", "+w.b:"1, 1, 1"}, ${x})
1160
- `:""}
1161
- ${He?`
1162
- float4 inputs:scale = (${us}, ${us}, ${us}, 1)
1163
- float4 inputs:bias = (${ps}, ${ps}, ${Bl}, 0)
1164
- `:""}
1165
- token inputs:wrapS = "${j[b.wrapS]}"
1166
- token inputs:wrapT = "${j[b.wrapT]}"
1167
- float outputs:r
1168
- float outputs:g
1169
- float outputs:b
1170
- float3 outputs:rgb
1171
- ${n.transparent||n.alphaTest>0?"float outputs:a":""}
1172
- }`}let f=n.transparent||n.alphaTest?n.opacity:1,y=!1,v=!1;if(n instanceof Om&&n.transmission!==void 0&&(f*=1-n.transmission*(1-n.roughness*.5)),n.map?(h.push(`${c}color3f inputs:diffuseColor.connect = ${Xt}/${l}/${p(n.map)}_diffuse.outputs:rgb>`),n instanceof Me&&n.transparent&&n.alphaTest==0&&t?(h.push(`${c}float inputs:opacity.connect = ${Xt}/${l}/${p(n.map)}_diffuse.outputs:a>`),y=!0,h.push(`${c}float inputs:opacityThreshold = ${1e-10}`),v=!0):n.transparent?(h.push(`${c}float inputs:opacity.connect = ${Xt}/${l}/${p(n.map)}_diffuse.outputs:a>`),y=!0):n.alphaTest>0&&(h.push(`${c}float inputs:opacity.connect = ${Xt}/${l}/${p(n.map)}_diffuse.outputs:a>`),y=!0,h.push(`${c}float inputs:opacityThreshold = ${n.alphaTest}`),v=!0),d.push(g(n.map,"diffuse",n.color,f))):h.push(`${c}color3f inputs:diffuseColor = ${S1(n.color)}`),n.alphaHash&&t&&(v?console.warn("Opacity threshold for "+n.name+" was already connected. Skipping alphaHash opacity threshold."):(h.push(`${c}float inputs:opacityThreshold = 0.0000000001`),v=!0)),n.aoMap&&(h.push(`${c}float inputs:occlusion.connect = ${Xt}/${l}/${p(n.aoMap)}_occlusion.outputs:r>`),d.push(g(n.aoMap,"occlusion"))),n.alphaMap?(h.push(`${c}float inputs:opacity.connect = ${Xt}/${l}/${p(n.alphaMap)}_opacity.outputs:r>`),h.push(`${c}float inputs:opacityThreshold = 0.0000000001`),y=!0,v=!0,d.push(g(n.alphaMap,"opacity",new ae(1,1,1),f))):(y?console.warn("Opacity for "+n.name+" was already connected. Skipping default opacity."):(h.push(`${c}float inputs:opacity = ${f}`),y=!0),n.alphaTest>0&&(v?console.warn("Opacity threshold for "+n.name+" was already connected. Skipping default opacity threshold."):(h.push(`${c}float inputs:opacityThreshold = ${n.alphaTest}`),v=!0))),n instanceof ft){if(n.emissiveMap){h.push(`${c}color3f inputs:emissiveColor.connect = ${Xt}/${l}/${p(n.emissiveMap)}_emissive.outputs:rgb>`);const b=n.emissive.clone();b.multiplyScalar(n.emissiveIntensity),d.push(g(n.emissiveMap,"emissive",b))}else if(((r=n.emissive)==null?void 0:r.getHex())>0){const b=n.emissive.clone();b.multiplyScalar(n.emissiveIntensity),h.push(`${c}color3f inputs:emissiveColor = ${S1(b)}`)}n.normalMap&&(h.push(`${c}normal3f inputs:normal.connect = ${Xt}/${l}/${p(n.normalMap)}_normal.outputs:rgb>`),d.push(g(n.normalMap,"normal"))),n.roughnessMap&&n.roughness===1?(h.push(`${c}float inputs:roughness.connect = ${Xt}/${l}/${p(n.roughnessMap)}_roughness.outputs:g>`),d.push(g(n.roughnessMap,"roughness"))):h.push(`${c}float inputs:roughness = ${n.roughness!==void 0?n.roughness:1}`),n.metalnessMap&&n.metalness===1?(h.push(`${c}float inputs:metallic.connect = ${Xt}/${l}/${p(n.metalnessMap)}_metallic.outputs:b>`),d.push(g(n.metalnessMap,"metallic"))):h.push(`${c}float inputs:metallic = ${n.metalness!==void 0?n.metalness:0}`)}return n instanceof Om&&(h.push(`${c}float inputs:clearcoat = ${n.clearcoat}`),h.push(`${c}float inputs:clearcoatRoughness = ${n.clearcoatRoughness}`),h.push(`${c}float inputs:ior = ${n.ior}`),!n.transparent&&!(n.alphaTest>0)&&n.transmissionMap&&(h.push(`${c}float inputs:opacity.connect = ${Xt}/${l}/${p(n.transmissionMap)}_transmission.outputs:r>`),d.push(g(n.transmissionMap,"transmission")))),u.size>2?console.warn("USDZExporter: Material "+n.name+" uses more than 2 UV channels. Currently, only UV0 and UV1 are supported."):u.size===2&&(!u.has(0)||!u.has(1))&&console.warn("USDZExporter: Material "+n.name+" uses UV channels other than 0 and 1. Currently, only UV0 and UV1 are supported."),`
1173
-
1174
- def Material "${l}" ${n.name?`(
1175
- displayName = "${r1(n.name)}"
1176
- )`:""}
1177
- {
1178
- token outputs:surface.connect = ${Xt}/${l}/PreviewSurface.outputs:surface>
1179
-
1180
- def Shader "PreviewSurface"
1181
- {
1182
- uniform token info:id = "UsdPreviewSurface"
1183
- ${h.join(`
1184
- `)}
1185
- int inputs:useSpecularWorkflow = ${n instanceof Me?"1":"0"}
1186
- token outputs:surface
1187
- }
1188
- ${d.length>0?`
1189
- ${u.has(0)?`
1190
- def Shader "uvReader_st"
1191
- {
1192
- uniform token info:id = "UsdPrimvarReader_float2"
1193
- token inputs:varname = "st"
1194
- float2 inputs:fallback = (0.0, 0.0)
1195
- float2 outputs:result
1196
- }
1197
- `:""}
1198
- ${u.has(1)?`
1199
- def Shader "uvReader_st1"
1200
- {
1201
- uniform token info:id = "UsdPrimvarReader_float2"
1202
- token inputs:varname = "st1"
1203
- float2 inputs:fallback = (0.0, 0.0)
1204
- float2 outputs:result
1205
- }
1206
- `:""}
1207
- ${d.join(`
1208
- `)}`:""}
1209
- }`}function S1(n){return`(${n.r}, ${n.g}, ${n.b})`}function C1(n){return`(${n.x}, ${n.y})`}const P1=[1023,33777,33778,33779,35842,35843,37496,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,36492];C("debugusdz");const O1=class lC{constructor(e,t,s){a(this,"id"),a(this,"trigger"),a(this,"action"),a(this,"exclusive",!1),this.id="Behavior_"+Ps(e)+"_"+lC.global_id++,this.trigger=t,this.action=s}makeExclusive(e){return this.exclusive=e,this}writeTo(e,t,s){if(!this.trigger||!this.action)return;s.beginBlock(`def Preliminary_Behavior "${this.id}"`);let o="";if(Array.isArray(this.trigger)){o="[";for(let r=0;r<this.trigger.length;r++){const l=this.trigger[r];o+="<"+l.id+">",r+1<this.trigger.length&&(o+=", ")}o+="]"}else o=`<${this.trigger.id}>`;if(s.appendLine(`rel triggers = ${o}`),s.appendLine(`rel actions = <${this.action.id}>`),s.appendLine(`uniform bool exclusive = ${this.exclusive?1:0}`),s.appendLine(),Array.isArray(this.trigger))for(const r of this.trigger)r.writeTo(t,s),s.appendLine();else this.trigger.writeTo(t,s);s.appendLine(),this.action.writeTo(t,s),s.closeBlock()}};a(O1,"global_id",0);let Yt=O1;const sl=new Set;function x0(n,e){var t,s;let o="";if(Array.isArray(n)){sl.clear();let r="[ ";for(let l=0;l<n.length;l++){let c=n[l];if(!c){console.warn("Invalid target object in behavior",n+". Is the object exported?");continue}if(typeof c=="string"){if(sl.has(c))continue;r+=c,sl.add(c)}else if(typeof c=="object"){if(c.isObject3D&&(c=e.findById(c.uuid),!c)){console.warn("Invalid target object in behavior",n+". Is the object exported?");continue}const h=(t=c.getPath)==null?void 0:t.call(c);if(sl.has(h))continue;r+=h,sl.add(h)}l+1<n.length&&(r+=", ")}r+=" ]",o=r,sl.clear()}else if(typeof n=="object"){const r=n;if(r.isObject3D&&(n=e.findById(r.uuid)),!n)throw console.error("Invalid target object in behavior, the target object is likely missing from USDZ export. Is the object exported?",r),new Error(`Invalid target object in behavior, the target object is likely missing from USDZ export. Please report a bug. uuid: ${r.uuid}.`);o=(s=n.getPath)==null?void 0:s.call(n)}return o}const k1=class cC{constructor(e,t){a(this,"id"),a(this,"targetId"),a(this,"tokenId"),a(this,"type"),a(this,"distance"),e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+cC.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=x0(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()}};a(k1,"global_id",0);let nl=k1;function M1(n,e={direct:!0,indirect:!0}){const t=di.createEmpty();t.name="InputTarget_"+t.name,t.displayName=void 0,t.type="RealityKitComponent",t.onSerialize=s=>{s.appendLine("bool allowsDirectInput = "+(e.direct?1:0)),s.appendLine("bool allowsIndirectInput = "+(e.indirect?1:0)),s.appendLine('uniform token info:id = "RealityKit.InputTarget"')},n.add(t)}class Rt{static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new nl(void 0,"SceneStart");return e.tokenId="SceneTransition",e.type="enter",this.__sceneStartTrigger=e,e}static tapTrigger(e,t={direct:!0,indirect:!0}){const s=new nl(e);if(Array.isArray(e)&&e.length>1)for(const o of e)o instanceof di&&M1(o,t);else e instanceof di&&M1(e,t);return s.tokenId="TapGesture",s}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const s=new nl(e);return s.tokenId="ProximityToCamera",s.distance=t,s}}a(Rt,"__sceneStartTrigger");class Fo{constructor(e,t){a(this,"id"),a(this,"actions"),a(this,"loops",0),a(this,"performCount",1),a(this,"type","serial"),a(this,"multiplePerformOperation"),this.id=e,this.actions=t}static getId(){return this.global_id++}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 s of this.actions){if(!s)continue;const o=s===this.actions[this.actions.length-1];t.appendLine("<"+s.id+">"+(o?"":", "))}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 s of this.actions)s&&(s.writeTo(e,t),t.appendLine());t.closeBlock()}}a(Fo,"global_id",0);const R1=class lv{constructor(e,t){a(this,"id"),a(this,"tokenId"),a(this,"affectedObjects"),a(this,"easeType"),a(this,"motionType"),a(this,"duration"),a(this,"moveDistance"),a(this,"style"),a(this,"type"),a(this,"front"),a(this,"up"),a(this,"start"),a(this,"animationSpeed"),a(this,"reversed"),a(this,"pingPong"),a(this,"xFormTarget"),a(this,"audio"),a(this,"gain"),a(this,"auralMode"),a(this,"multiplePerformOperation"),a(this,"velocity"),a(this,"comment"),a(this,"animationName"),e&&(this.affectedObjects=e),t?this.id=t:this.id="Action",this.id+="_"+lv.global_id++}clone(){const e=new lv,t=e.id;return Object.assign(e,this),e.id=t,e}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),this.comment&&t.appendLine(`# ${this.comment}`),this.affectedObjects&&(typeof this.affectedObjects!="string"&&(this.affectedObjects=x0(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=x0(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()}};a(R1,"global_id",0);let Os=R1;class ds{constructor(e,t,s){a(this,"x",0),a(this,"y",0),a(this,"z",0),this.x=e,this.y=t,this.z=s}static get up(){return new ds(0,1,0)}static get right(){return new ds(1,0,0)}static get forward(){return new ds(0,0,1)}static get back(){return new ds(0,0,-1)}static get zero(){return new ds(0,0,0)}}class ve{static sequence(...e){return new Fo("Group_"+Fo.getId(),e).makeSequence()}static parallel(...e){return new Fo("Group_"+Fo.getId(),e).makeParallel()}static fadeAction(e,t,s){const o=new Os(e);return o.tokenId="Visibility",o.type=s?"show":"hide",o.duration=t,o.style="basic",o.motionType="none",o.moveDistance=0,o.easeType="none",o}static startAnimationAction(e,t,s=!1,o=!1){const r=new Os(e);r.tokenId="StartAnimation";const l=t.start,c=t.duration,h=t.speed,d=t.clipName;if(r.comment=`Animation: ${d}, start=${l*60}, length=${c*60}, end=${(l+c)*60}`,r.animationName=d,r.start=l,r.duration=c,r.animationSpeed=h,r.reversed=s,r.pingPong=o,r.multiplePerformOperation="allow",s&&(r.start-=c),o){r.pingPong=!1;const u=r.clone();return u.reversed=!s,u.start=r.start,u.reversed&&(u.start-=c),ve.sequence(r,u)}return r}static waitAction(e){const t=new Os;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,s,o){const r=new Os(e);return r.tokenId="LookAtCamera",r.duration=t===void 0?9999999999999:t,r.front=s??ds.forward,r.up=o??ds.up,r}static emphasize(e,t,s="bounce",o=1,r="basic"){const l=new Os(e);return l.tokenId="Emphasize",l.duration=t,l.style=r??"basic",l.motionType=s,l.moveDistance=o,l}static transformAction(e,t,s,o,r="inout"){const l=new Os(e);return l.tokenId="Transform",l.duration=s,l.duration=Math.max(1e-6,s),l.type=o,l.easeType=s>0?r:"none",Array.isArray(t)&&console.error("Transform target must not be an array",t),l.xFormTarget=t,l}static playAudioAction(e,t,s="play",o=1,r="spatial"){const l=new Os(e);return l.tokenId="Audio",l.type=s,l.audio=t,l.gain=o,l.auralMode=r,l.multiplePerformOperation="allow",l}static impulseAction(e,t){const s=new Os(e);return s.tokenId="Impulse",s.velocity=t,s}}class VE{constructor(e){a(this,"object"),a(this,"model"),this.object=e}get id(){return this.object.uuid}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 S0 extends VE{constructor(e,t,s,o){super(e),a(this,"matrix"),a(this,"material"),a(this,"geometry"),a(this,"_enableAction"),a(this,"_disableAction"),this.matrix=t,this.material=s,this.geometry=o}onApply(e){var t,s;const o=this.model;if(!o)return;(t=o.parent)!=null&&t.isDynamic||di.createEmptyParent(o);const r=o.clone();this.matrix&&r.setMatrix(this.matrix),this.material&&(r.material=this.material),this.geometry&&(r.geometry=this.geometry),(s=o.parent)==null||s.add(r)}enable(){return this._enableAction?this._enableAction:(this._enableAction=ve.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=ve.fadeAction(this.object,0,!1),this._disableAction)}}class T1{constructor(e){a(this,"actions"),a(this,"sortedActions"),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 an=C("debugusdzanimation"),C0=C("debugusdzanimationserialization");class cr{constructor(e,t,s){a(this,"_start"),a(this,"ext"),a(this,"root"),a(this,"_nearestAnimatedRoot"),a(this,"clip"),a(this,"speed"),this.ext=e,this.root=t,this.clip=s,this._nearestAnimatedRoot=this.getNearestAnimatedRoot()}get start(){return this._start===void 0&&(this._start=this.ext.getStartTimeByClip(this.clip)),this._start}get duration(){var e;return((e=this.clip)==null?void 0:e.duration)??dt.restPoseClipDuration}get nearestAnimatedRoot(){return this._nearestAnimatedRoot}get clipName(){var e;return((e=this.clip)==null?void 0:e.name)??"rest"}static isDescendantOf(e,t){let s=t;if(!s||!e)return!1;for(;s;){if(!s)return!1;if(s===e)return!0;s=s.parent}return!1}getNearestAnimatedRoot(){var e;let t;try{for(const s of((e=this.clip)==null?void 0:e.tracks)??[]){const o=ya.parseTrackName(s.name);let r=ya.findNode(this.root,o.nodeName);if(r)if(!t)t=r;else{if(r===t||cr.isDescendantOf(t,r))continue;if(!cr.isDescendantOf(r,t)){for(;!cr.isDescendantOf(r,t)&&r.parent;)r=r.parent;cr.isDescendantOf(r,t)||console.error("USDZExporter: Animation clip targets multiple roots that are not parent/child. Please report a bug",this.root,this.clip,t,r)}t=r}}}catch(s){console.error("USDZExporter: Exception when trying to find nearest animated root. Please report a bug",s),t=void 0}return t}}const Ku=class um{constructor(e,t,s){if(a(this,"clip"),a(this,"pos"),a(this,"rot"),a(this,"scale"),a(this,"root"),a(this,"target"),a(this,"duration",0),a(this,"useRootMotion",!1),this.root=e,this.target=t,this.clip=s,s?this.duration=s.duration:this.duration=um.restPoseClipDuration,s&&s.tracks){const r=Math.max(...s.tracks.map(l=>l.times[l.times.length-1]));r!==this.duration&&(console.warn("USDZExporter: Animation clip duration does not match the maximum time value in the tracks.",s,r,this.duration),this.duration=r)}const o=P.getComponent(e,Ot);o&&(this.useRootMotion=o.applyRootMotion)}addTrack(e){var t,s;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 "+(((t=this.root)==null?void 0:t.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 "+(((s=this.root)==null?void 0:s.name)??this.target.name)+". Only .position, .rotation, .scale are supported."),F()&&be("[USDZ] Some animations can't be exported. See console for details."))}getFrames(){var e,t,s,o,r,l;return this.clip?Math.max(((t=(e=this.pos)==null?void 0:e.times)==null?void 0:t.length)??0,((o=(s=this.rot)==null?void 0:s.times)==null?void 0:o.length)??0,((l=(r=this.scale)==null?void 0:r.times)==null?void 0:l.length)??0):2}getDuration(){return this.duration}getSortedTimesArray(e=!0,t=!0,s=!0){var o,r,l;if(!this.clip)return[0,this.duration];const c=(o=this.pos)==null?void 0:o.times,h=(r=this.rot)==null?void 0:r.times,d=(l=this.scale)==null?void 0:l.times,u=[];if(e&&c)for(const p of c)u.push(p);if(t&&h)for(const p of h)u.push(p);if(s&&d)for(const p of d)u.push(p);return u.includes(0)||u.push(0),u.sort((p,g)=>p-g),[...new Set(u)]}*getValues(e,t=!0,s=!0,o=!0){var r,l,c;const h=new S,d=new H,u=new S(1,1,1),p=this.target,g=t?(r=this.pos)==null?void 0:r.createInterpolant():void 0,f=s?(l=this.rot)==null?void 0:l.createInterpolant():void 0,y=o?(c=this.scale)==null?void 0:c.createInterpolant():void 0;g||h.set(p.position.x,p.position.y,p.position.z),f||d.set(p.quaternion.x,p.quaternion.y,p.quaternion.z,p.quaternion.w),y||u.set(p.scale.x,p.scale.y,p.scale.z),g&&g.valueSize!==3&&(g.valueSize=3),f&&f.valueSize!==4&&(f.valueSize=4),y&&y.valueSize!==3&&(y.valueSize=3);const v=0;for(let b=0-v;b<e.length+v;b++){let _=0,w=0;if(b<0?(_=e[0],w=_-um.animationDurationPadding/2+1/60):b>=e.length?(_=e[e.length-1],w=_+um.animationDurationPadding/2-1/60):(_=e[b],w=_),g){const x=g.evaluate(_);h.set(x[0],x[1],x[2])}if(f){const x=f.evaluate(_);d.set(x[0],x[1],x[2],x[3])}if(y){const x=y.evaluate(_);u.set(x[0],x[1],x[2])}if(this.useRootMotion&&p===this.root){const x=new se;x.compose(h,d,u),x.multiply(p.matrix),x.decompose(h,d,u)}yield{time:w,translation:h,rotation:d,scale:u,index:b}}}};a(Ku,"frameRate",60),a(Ku,"animationDurationPadding",6/60),a(Ku,"restPoseClipDuration",6/60);let dt=Ku;class Zu{constructor(e){a(this,"dict",new Map),a(this,"rootTargetMap",new Map),a(this,"rootAndClipToRegisteredAnimationMap",new Map),a(this,"rootToRegisteredClip",new Map),a(this,"lastClipEndTime",0),a(this,"clipToStartTime",new Map),a(this,"clipToHoldClip",new Map),a(this,"serializers",[]),a(this,"injectRestPoses",!1),a(this,"injectImplicitBehaviours",!1),this.injectRestPoses=e,this.injectImplicitBehaviours=e}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}getStartTimeCode(){return!this.injectRestPoses||this.rootAndClipToRegisteredAnimationMap.size===0?0:(dt.restPoseClipDuration+dt.animationDurationPadding)*60}getEndTimeCode(){let e=0;for(const[t,s]of this.rootAndClipToRegisteredAnimationMap){const o=s.start+s.duration;o>e&&(e=o)}return e*60}getClipCount(e){var t;return((t=this.rootToRegisteredClip.get(e))==null?void 0:t.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){var s;if(!e)return null;this.rootTargetMap.has(e)||this.rootTargetMap.set(e,[]);const o=e.uuid+(t?.uuid??"-rest");if(this.rootAndClipToRegisteredAnimationMap.has(o))return this.rootAndClipToRegisteredAnimationMap.get(o);an&&console.log("registerAnimation",e,t);const r=this.injectRestPoses?1:0,l=(((s=this.rootToRegisteredClip.get(e))==null?void 0:s.length)??0)+r,c=this.rootTargetMap.get(e),h=new Set(c);if(t&&t.tracks)for(const u of t.tracks){const p=ya.parseTrackName(u.name),g=ya.findNode(e,p.nodeName);if(!g){console.warn("no object found for track",u.name,"using "+e.name+" instead");continue}this.dict.has(g)||this.dict.set(g,[]);const f=this.dict.get(g);if(!f){console.warn("no transform data found for target ",g,"at slot "+l+", this is likely a bug");continue}h.delete(g),this.injectRestPoses&&!f[0]&&(console.log("Injecting rest pose",g,t,"at slot",l),f[0]=new dt(null,g,null));let y=f[l];y||(y=new dt(e,g,t),f[l]=y),y.addTrack(u),c!=null&&c.includes(g)||c==null||c.push(g)}an&&console.log("Unregistered nodes for this clip",h,"clip",t,"at slot",l,"for root",e,"targets",c);for(const u of h){const p=this.dict.get(u);if(!p)continue;if(this.injectRestPoses&&!p[0]){console.warn("Adding rest pose for ",u,t,"at slot",l,"This is likely a bug, should have been added earlier.");const f=new dt(null,u,null);p[0]=f}let g=p[l];g||(an&&console.log("Adding padding clip for ",u,t,"at slot",l),g=new dt(e,u,t),p[l]=g)}const d=new cr(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(o,d),an&&console.log({root:e,clip:t,info:d}),t){const u=this.rootToRegisteredClip.get(e);if(u?u.push(t):this.rootToRegisteredClip.set(e,[t]),!this.clipToStartTime.get(t)){this.lastClipEndTime==null&&(this.lastClipEndTime=dt.restPoseClipDuration);let p=this.lastClipEndTime+dt.animationDurationPadding,g=p+t.duration;const f=Math.round(p*60)/60,y=Math.round(g*60)/60;Math.abs(f-p)<.01&&(p=f),Math.abs(y-g)<.01&&(g=y),p=Math.ceil(p),g=p+t.duration,this.clipToStartTime.set(t,p),this.lastClipEndTime=g}}return d}onAfterHierarchy(e){an&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){var t,s;an&&console.log("Animation data",{dict:this.dict,rootTargetMap:this.rootTargetMap,rootToRegisteredClip:this.rootToRegisteredClip});for(const o of this.rootTargetMap.keys()){const r=this.rootTargetMap.get(o);if(!r)continue;let l;const c=[];for(const h of r){const d=this.dict.get(h);if(!d){console.error("No data found for target on USDZ export \u2013 please report a bug!",h);continue}l===void 0&&(l=d?.length),l!==d?.length&&console.error("Different array lengths for targets \u2013 please report a bug!",d);for(let u=0;u<d.length;u++){let p=d[u];if(!p){const f=u-(this.injectRestPoses?1:0);d[u]=new dt(null,h,this.rootToRegisteredClip.get(o)[f]),p=d[u]}const g=p.getDuration();if(c[u]===void 0)c[u]=g;else if(c[u]!==g){console.error("Error during UDSZ export: Encountered different animation durations for animated targets. Please report a bug!",{datas:d,target:h}),c[u]=g;continue}}}}for(const o of this.serializers){const r=(t=o.model)==null?void 0:t.parent,l=r?.isDynamic===!0;C0&&console.log(l,(s=o.model)==null?void 0:s.parent),l&&o.registerCallback(r)}}onExportObject(e,t,s){P.foreachComponent(e,r=>{const l=r;typeof l.createAnimation=="function"&&l.createAnimation(this,t,s)},!1);const o=new HE(e,this);this.serializers.push(o),o.registerCallback(t)}}class HE{constructor(e,t){a(this,"model"),a(this,"object"),a(this,"animationData"),a(this,"ext"),a(this,"callback"),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)),C0&&console.log("REPARENT",e),this.model=e,this.callback&&this.model.addEventListener("serialize",this.callback)}skinnedMeshExport(e,t,s){var o;const r=this.model,l=this.animationData;if(r&&r.skinnedMesh){let c=function(E){const U=[];for(const[$,te]of E){let oe=`${$} : [`;const ue=[];for(const ge of te)ue.push(`(${de(ge.x)}, ${de(ge.y)}, ${de(ge.z)})`);oe=oe.concat(ue.join(", ")),oe=oe.concat("],"),U.push(oe)}return U},h=function(E){const U=[];for(const[$,te]of E){let oe=`${$} : [`;const ue=[];for(const ge of te)ue.push(`(${de(ge.w)}, ${de(ge.x)}, ${de(ge.y)}, ${de(ge.z)})`);oe=oe.concat(ue.join(", ")),oe=oe.concat("],"),U.push(oe)}return U},d=function(E){let U,$=!0;const te=new Map;for(const[ue,ge]of E){U===void 0&&(U=ge.length),U!==ge.length&&($=!1);let He=0;for(const $e of ge)He++,$e||(te.has(ue)||te.set(ue,[]),te.get(ue).push(He))}an&&console.log("Bone count: ",E.size,"TransformData entries per bone: ",U,"Undefined bone entries: ",te),console.assert($,"All bones should have the same number of TransformData entries",E),console.assert(te.size===0,"All TransformData entries should be set",te);const oe=[];for(const[ue,ge]of E)for(let He=0;He<ge.length;He++){const $e=ge[He],us=s.getStartTimeByClip($e.clip);oe.length<=He&&oe.push({pos:[],rot:[],scale:[],timeOffset:us});const ps=oe[He];ps.pos.push(...$e.getSortedTimesArray(!0,!1,!1)),ps.rot.push(...$e.getSortedTimesArray(!1,!0,!1)),ps.scale.push(...$e.getSortedTimesArray(!1,!1,!0))}for(const ue of oe)ue.pos.sort((ge,He)=>ge-He),ue.rot.sort((ge,He)=>ge-He),ue.scale.sort((ge,He)=>ge-He),ue.pos=[...new Set(ue.pos)],ue.rot=[...new Set(ue.rot)],ue.scale=[...new Set(ue.scale)];return oe},u=function(E,U,$){const te=new Map,oe=new Map,ue=new Map,ge=U.length;for(const He of $){const $e=E.get(He);let us;$e?console.assert($e.length===ge,"We should have the same number of TransformData entries for each bone",$e,U):us=new dt(null,He,null);for(let ps=0;ps<ge;ps++){const Bl=$e?$e[ps]:us,ma=U[ps];for(const{time:Fl,translation:Ul}of Bl.getValues(ma.pos,!0,!1,!1)){const ms=(Fl+ma.timeOffset)*60;te.has(ms)||te.set(ms,new Array),te.get(ms).push(Ul.clone())}for(const{time:Fl,rotation:Ul}of Bl.getValues(ma.rot,!1,!0,!1)){const ms=(Fl+ma.timeOffset)*60;oe.has(ms)||oe.set(ms,new Array),oe.get(ms).push(Ul.clone())}for(const{time:Fl,scale:Ul}of Bl.getValues(ma.scale,!1,!1,!0)){const ms=(Fl+ma.timeOffset)*60;ue.has(ms)||ue.set(ms,new Array),ue.get(ms).push(Ul.clone())}}}return{position:te.size==0?void 0:te,quaternion:oe.size==0?void 0:oe,scale:ue.size==0?void 0:ue}},p=function(E){const U=[];for(const $ of E)U.push(`(${de($.x)}, ${de($.y)}, ${de($.z)})`);return U.join(", ")},g=function(E){const U=[];for(const $ of E)U.push(`(${de($.w)}, ${de($.x)}, ${de($.y)}, ${de($.z)})`);return U.join(", ")},f=function(E){const U=new Map;if(an){const $=new Array;for(const[te,oe]of l)$.push(te.uuid+": "+oe.length+" "+oe.map(ue=>{var ge;return(ge=ue.clip)==null?void 0:ge.uuid.substring(0,6)}).join(" "));console.log(`getPerBoneTransformData
1210
- `+$.join(`
1211
- `))}for(const $ of E){const te=l.get($);te&&U.set($,te)}return U},y=function(E){const U=f(E),$=d(U);return u(U,$,E)};const v=r.skinnedMesh.skeleton,b=new Array,_=[],w=[];for(const E of v.bones){_.push(E),w.push(E.uuid);const U=v.boneInverses[v.bones.indexOf(E)];b.push({bone:E,inverse:U})}let x=1e4;for(;w.length<v.bones.length&&x-- >0;)for(const E of _){const U=E.children;for(const $ of U)if(w.indexOf($.uuid)===-1&&v.bones.indexOf($)!==-1){_.push($),w.push($.uuid);const te=v.boneInverses[v.bones.indexOf($)];b.push({bone:$,inverse:te})}}x<=0&&console.error("Failed to sort bones in skinned mesh",r.skinnedMesh,v.bones,w);for(const E of l1(v.bones))b.push({bone:E,inverse:E.matrixWorld.clone().invert()});const M=b[0].bone.parent;M||console.error("No bone parent found for skinned mesh during USDZ export",r.skinnedMesh),b.sort((E,U)=>il(E.bone,M)>il(U.bone,M)?1:-1);const k=t.quickLookCompatible,T=[],L=[],B=[],z=[];for(const{bone:E}of b){if(k){const U=E.scale;U.x==0&&(U.x=1e-5),U.y==0&&(U.y=1e-5),U.z==0&&(U.z=1e-5),T.push(new se().compose(E.position,E.quaternion,E.scale))}else T.push(E.matrix.clone());L.push(E.position),B.push(E.quaternion),z.push(E.scale)}const j=b.map(E=>'"'+il(E.bone,M)+'"').join(", "),V=b.map(E=>_1(E.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${V}]`),e.appendLine(`uniform token[] joints = [${j}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${T.map(E=>_1(E)).join(", ")}]`);const G=y(b.map(E=>E.bone));if(an){let E=1e7,U=0;for(const $ of((o=G.position)==null?void 0:o.keys())??[])E=Math.min(E,$),U=Math.max(U,$);console.log("Time samples",E,U,G)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${j}]`),e.appendLine(`quatf[] rotations = [${g(B)}]`),G&&G.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const E=h(G.quaternion);for(const U of E)e.appendLine(U);e.closeBlock()}if(e.appendLine(`half3[] scales = [${p(z)}]`),G&&G.scale){e.beginBlock("half3[] scales.timeSamples = {","");const E=c(G.scale);for(const U of E)e.appendLine(U);e.closeBlock()}if(e.appendLine(`float3[] translations = [${p(L)}]`),G&&G.position){e.beginBlock("float3[] translations.timeSamples = {","");const E=c(G.position);for(const U of E)e.appendLine(U);e.closeBlock()}e.closeBlock(),e.closeBlock()}}onSerialize(e,t){if(!this.model)return;const s=this.animationData.get(this.object);if(s)for(let u=0;u<s.length;u++)s[u]===void 0&&(s[u]=new dt(null,this.object,null));const o=this.ext;this.skinnedMeshExport(e,t,o);const r=this.object,l=this.model,c=this.animationData.get(r);if(!c||r.isSkinnedMesh)return;C0&&console.log("SERIALIZE",this.model.name,this.object.type,c);const h=Intl.NumberFormat("en-US",{maximumFractionDigits:3,minimumFractionDigits:0,useGrouping:!1});function d(u,p){var g;if(u.some(f=>f&&{position:f.pos,rotation:f.rot,scale:f.scale}[p])){switch(p){case"position":l.needsTranslate=!0,e.beginBlock("double3 xformOp:translate.timeSamples = {","");break;case"rotation":l.needsOrient=!0,e.beginBlock("quatf xformOp:orient.timeSamples = {","");break;case"scale":l.needsScale=!0,e.beginBlock("double3 xformOp:scale.timeSamples = {","");break}for(let f=0;f<u.length;f++){const y=u[f];if(!y)continue;const v=o.getStartTimeByClip(y.clip),b=y.getSortedTimesArray(p==="position",p==="rotation",p==="scale");if(!b||b.length===0){console.error("got an animated object but no time values?",r,y);continue}const _=!y.clip,w=p==="position"&&(y.pos||_),x=p==="rotation"&&(y.rot||_),M=p==="scale"&&(y.scale||_);if(w||x||M){const k=((g=y.clip)==null?void 0:g.name)??"rest",T=y.getDuration();an&&console.log("Write .timeSamples:",k,v,T,u),e.appendLine("# "+k+": start="+h.format(v*dt.frameRate)+", length="+h.format(T*dt.frameRate)+", frames="+y.getFrames())}if(w)for(const{time:k,translation:T}of y.getValues(b,!0,!1,!1)){const L=`${h.format((v+k)*dt.frameRate)}: (${de(T.x)}, ${de(T.y)}, ${de(T.z)}),`;e.appendLine(L)}if(x)for(const{time:k,rotation:T}of y.getValues(b,!1,!0,!1)){const L=`${h.format((v+k)*dt.frameRate)}: (${de(T.w)}, ${de(T.x)}, ${de(T.y)}, ${de(T.z)}),`;e.appendLine(L)}if(M)for(const{time:k,scale:T}of y.getValues(b,!1,!1,!0)){const L=`${h.format((v+k)*dt.frameRate)}: (${de(T.x)}, ${de(T.y)}, ${de(T.z)}),`;e.appendLine(L)}}e.closeBlock()}}d(c,"position"),d(c,"rotation"),d(c,"scale")}}const $E=C("debugusdz");class pa{constructor(){a(this,"files",new Array)}static getName(e){var t;const s=e.split(".").pop();let o=(t=e.split(".").slice(0,-1).join(".").split("/").pop())==null?void 0:t.replace(".","_");return o||(o="Audio_"+Math.random().toString(36).substring(2,15)),Ps(o)+"."+s}get extensionName(){return"Audio"}onExportObject(e,t,s){const o=P.getComponents(e,ts);if(o.length)for(const r of o){if(!r.clip||typeof r.clip!="string"||!r.playOnAwake)continue;const l=r.clip.split("/").pop()||"Audio",c=pa.getName(r.clip),h=Ps(c);if(!this.files.some(d=>d.path===r.clip)){this.files.push({path:r.clip,name:c});const d=c.toLowerCase();s.quickLookCompatible&&!d.endsWith(".mp3")&&!d.endsWith(".wav")&&!d.endsWith(".m4a")&&console.error("Audio file "+r.clip+" from "+r.name+" is not an MP3 or WAV file. QuickLook may not support playing it.")}s.quickLookCompatible||t.addEventListener("serialize",(d,u)=>{d.appendLine(),d.beginBlock(`def SpatialAudio "${h}"`,"(",!1),d.appendLine(`displayName = "${l}"`),d.closeBlock(")"),d.beginBlock(),d.appendLine(`uniform asset filePath = @audio/${c}@`),d.appendLine(`uniform token auralMode = "${r.spatialBlend>0?"spatial":"nonSpatial"}"`),d.appendLine(`uniform token playbackMode = "${r.loop?"loopFromStage":"onceFromStart"}"`),d.appendLine(`uniform float gain = ${r.volume}`),d.closeBlock()})}}async onAfterSerialize(e){for(const t of this.files){const s="audio/"+t.name;if(e.files[s]){$E&&console.warn("Audio file with name "+s+" already exists in the context. Skipping.");continue}const o=await(await(await fetch(t.path)).blob()).arrayBuffer(),r=new Uint8Array(o);e.files[s]=r}}}var GE=Object.defineProperty,ze=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&GE(e,t,o),o};const E1=C("debugusdzbehaviours");function qc(n){n&&(n.getComponentInParent(Va)||(F()&&console.debug('Raycaster on "'+n.name+'" was automatically added, because no raycaster was found in the parent hierarchy.'),n.addComponent(Ai)))}class Wr extends I{constructor(){super(...arguments),a(this,"object"),a(this,"target"),a(this,"duration",1),a(this,"relativeMotion",!1),a(this,"coroutine",null),a(this,"targetPos",new S),a(this,"targetRot",new H),a(this,"targetScale",new S)}start(){qc(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=ee(this.object).clone(),t=ee(this.target).clone(),s=Se(this.object).clone(),o=Se(this.target).clone(),r=Ge(this.object).clone(),l=Ge(this.target).clone(),c=e.distanceTo(t),h=s.angleTo(o),d=r.distanceTo(l);if(c<.01&&h<.01&&d<.01){at(this.object,t),Gi(this.object,o),Sa(this.object,l),this.coroutine=null;return}let u=0,p=0;for(;u<1;)u+=this.context.time.deltaTime/this.duration,u>1&&(u=1),p=u<.5?4*u*u*u:1-Math.pow(-2*u+2,3)/2,this.targetPos.lerpVectors(e,t,p),this.targetRot.slerpQuaternions(s,o,p),this.targetScale.lerpVectors(r,l,p),at(this.object,this.targetPos),Gi(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(),s=this.object.scale.clone(),o=this.target.position.clone(),r=this.target.quaternion.clone(),l=this.target.scale.clone();o.applyQuaternion(this.object.quaternion),this.targetPos.copy(this.object.position).add(o),this.targetRot.copy(this.object.quaternion).multiply(r),this.targetScale.copy(this.object.scale).multiply(l);let c=0,h=0;for(;c<1;)c+=this.context.time.deltaTime/this.duration,c>1&&(c=1),h=c<.5?4*c*c*c:1-Math.pow(-2*c+2,3)/2,this.object.position.lerpVectors(e,this.targetPos,h),this.object.quaternion.slerpQuaternions(t,this.targetRot,h),this.object.scale.lerpVectors(s,this.targetScale,h),yield;this.coroutine=null}beforeCreateDocument(e){var t;if(this.target&&this.object&&this.gameObject){const s=new Yt("Move to "+((t=this.target)==null?void 0:t.name),Rt.tapTrigger(this.gameObject),ve.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(s)}}}ze([m(A)],Wr.prototype,"object"),ze([m(A)],Wr.prototype,"target"),ze([m()],Wr.prototype,"duration"),ze([m()],Wr.prototype,"relativeMotion");var tt;const Ju=(tt=class extends I{constructor(){super(...arguments),a(this,"materialToSwitch"),a(this,"variantMaterial"),a(this,"fadeDuration",0),a(this,"_objectsWithThisMaterial",null),a(this,"selfModel"),a(this,"targetModels")}start(){var n;this._objectsWithThisMaterial=this.objectsWithThisMaterial,qc(this.gameObject),F()&&this._objectsWithThisMaterial.length<=0&&console.warn('ChangeMaterialOnClick: No objects found with material "'+((n=this.materialToSwitch)==null?void 0:n.name)+'"')}onPointerEnter(n){this.context.input.setCursor("pointer")}onPointerExit(n){this.context.input.unsetCursor("pointer")}onPointerClick(n){if(n.use(),!!this.variantMaterial)for(let e=0;e<this.objectsWithThisMaterial.length;e++){const t=this.objectsWithThisMaterial[e];t.material=this.variantMaterial}}get objectsWithThisMaterial(){return this._objectsWithThisMaterial!=null?this._objectsWithThisMaterial:(this._objectsWithThisMaterial=[],this.variantMaterial&&this.materialToSwitch&&this.context.scene.traverse(n=>{if(n instanceof X)if(Array.isArray(n.material)){for(const e of n.material)if(e===this.materialToSwitch){this.objectsWithThisMaterial.push(n);break}}else n.material===this.materialToSwitch?this.objectsWithThisMaterial.push(n):V_(n.material,this.materialToSwitch)&&this.objectsWithThisMaterial.push(n)}),this._objectsWithThisMaterial)}async beforeCreateDocument(n,e){this.targetModels=[],tt._materialTriggersPerId={},tt.variantSwitchIndex=0,this.materialToSwitch&&await Xe.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await Xe.assignTextureLOD(this.variantMaterial,0)}createBehaviours(n,e,t){this.objectsWithThisMaterial.find(s=>s.uuid===e.uuid)&&this.targetModels.push(e),this.gameObject.uuid===e.uuid&&(this.selfModel=e,this.materialToSwitch&&(tt._materialTriggersPerId[this.materialToSwitch.uuid]||(tt._materialTriggersPerId[this.materialToSwitch.uuid]=[]),tt._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(n,e){if(!this.materialToSwitch)return;const t=tt._materialTriggersPerId[this.materialToSwitch.uuid];if(t){const s={};for(const o of t){const r=o.createVariants();r&&r.length>0&&(s[o.selfModel.uuid]=r)}for(const o of t){const r=[];for(const l in s)l!==o.selfModel.uuid&&r.push(...s[l]);o.createAndAttachBehaviors(n,s[o.selfModel.uuid],r)}}delete tt._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(n,e,t){const s=[],o=Math.max(0,this.fadeDuration);s.push(ve.fadeAction([...this.targetModels,...t],o,!1)),s.push(ve.fadeAction(e,o,!0)),n.addBehavior(new Yt("Select_"+this.selfModel.name,Rt.tapTrigger(this.selfModel),ve.parallel(...s))),tt._parallelStartHiddenActions.push(...e),tt._startHiddenBehaviour||(tt._startHiddenBehaviour=new Yt("StartHidden_"+this.selfModel.name,Rt.sceneStartTrigger(),ve.fadeAction(tt._parallelStartHiddenActions,o,!1)),n.addBehavior(tt._startHiddenBehaviour))}static getMaterialName(n){return Ps(n.name||"Material")+"_"+n.id}createVariants(){if(!this.variantMaterial)return null;const n=[];for(const e of this.targetModels){const t=e.clone();t.name+="_Variant_"+tt.variantSwitchIndex+++"_"+tt.getMaterialName(this.variantMaterial),t.displayName=t.displayName+": Variant with material "+this.variantMaterial.name,t.material=this.variantMaterial,t.geometry=e.geometry,t.transform=e.transform,(!e.parent||!e.parent.isEmpty())&&di.createEmptyParent(e),e.parent&&e.parent.add(t),n.push(t)}return n}},a(tt,"_materialTriggersPerId",{}),a(tt,"_startHiddenBehaviour",null),a(tt,"_parallelStartHiddenActions",[]),a(tt,"variantSwitchIndex",0),tt);ze([m(Pe)],Ju.prototype,"materialToSwitch"),ze([m(Pe)],Ju.prototype,"variantMaterial"),ze([m()],Ju.prototype,"fadeDuration");let P0=Ju;var ke;const Xc=(ke=class extends I{constructor(){super(...arguments),a(this,"target"),a(this,"toggleOnClick",!1),a(this,"targetState",!0),a(this,"hideSelf",!0),a(this,"selfModel"),a(this,"selfModelClone"),a(this,"targetModel"),a(this,"toggleModel"),a(this,"stateBeforeCreatingDocument",!1),a(this,"targetStateBeforeCreatingDocument",!1)}start(){qc(this.gameObject)}onPointerClick(n){n.use(),!this.toggleOnClick&&this.hideSelf&&(this.gameObject.visible=!1),this.target&&(this.target.visible=this.toggleOnClick?!this.target.visible:this.targetState)}createBehaviours(n,e,t){e.uuid===this.gameObject.uuid&&(this.selfModel=e,this.selfModelClone=e.clone())}beforeCreateDocument(){this.target&&(this.gameObject[ke.wasVisible]===void 0&&(this.gameObject[ke.wasVisible]=this.gameObject.activeSelf),this.target[ke.wasVisible]===void 0&&(this.target[ke.wasVisible]=this.target.activeSelf),this.stateBeforeCreatingDocument=this.gameObject[ke.wasVisible],this.targetStateBeforeCreatingDocument=this.target[ke.wasVisible],this.gameObject.visible=!0,this.target.visible=!0)}afterCreateDocument(n,e){if(!this.target)return;this.targetModel=e.document.findById(this.target.uuid);const t=this.selfModel;if(this.selfModel&&this.targetModel){let s=this.selfModel,o=this.targetState;if(this.toggleOnClick)if(o=!this.targetStateBeforeCreatingDocument,!this.selfModelClone.geometry)(!this.selfModel.parent||this.selfModel.parent.isEmpty())&&m0.createEmptyParent(this.selfModel),this.toggleModel=this.selfModel.deepClone(),this.toggleModel.name+="_toggle",this.selfModel.parent.add(this.toggleModel);else{if(!this.gameObject[ke.toggleClone]){const c=this.selfModelClone.clone();c.setMatrix(new se),c.name+="_toggle"+ke.clonedToggleIndex++,t.add(c),this.gameObject[ke.toggleClone]=c,console.warn("USDZExport: Toggle "+this.gameObject.name+" doesn't have geometry. It will be deep cloned and nested behaviours will likely not work.")}const l=this.gameObject[ke.toggleClone];if(!this.gameObject[ke.reverseToggleClone]){const c=this.selfModelClone.clone();c.setMatrix(new se),c.name+="_toggleReverse"+ke.clonedToggleIndex++,t.add(c),this.gameObject[ke.reverseToggleClone]=c}this.toggleModel=this.gameObject[ke.reverseToggleClone],(!this.toggleModel.geometry||!l.geometry)&&console.error("triggers without childs and without geometry won't work!",this,t.geometry),s=l,t.geometry=null,t.material=null}if(this.toggleModel){if(this.toggleOnClick){const l=[];l.push(ve.fadeAction(s,0,!1)),l.push(ve.fadeAction(this.toggleModel,0,!0)),l.push(ve.fadeAction(this.targetModel,0,o)),n.addBehavior(new Yt("Toggle_"+s.name+"_ToggleTo"+(o?"On":"Off"),Rt.tapTrigger(s),ve.parallel(...l)));const c=[];c.push(ve.fadeAction(this.toggleModel,0,!1)),c.push(ve.fadeAction(s,0,!0)),c.push(ve.fadeAction(this.targetModel,0,!o)),n.addBehavior(new Yt("Toggle_"+s.name+"_ToggleTo"+(o?"Off":"On"),Rt.tapTrigger(this.toggleModel),ve.parallel(...c)))}}else{const l=[];this.hideSelf&&l.push(ve.fadeAction(s,0,!1)),l.push(ve.fadeAction(this.targetModel,0,o)),n.addBehavior(new Yt("Toggle_"+s.name+"_ToggleTo"+(o?"On":"Off"),Rt.tapTrigger(s),l.length>1?ve.parallel(...l):l[0]))}const r=new Array;this.targetStateBeforeCreatingDocument||r.push(this.targetModel),this.stateBeforeCreatingDocument||r.push(t),this.toggleModel&&r.push(this.toggleModel),ep.add(r,n)}}afterSerialize(n,e){this.gameObject[ke.wasVisible]!==void 0&&(this.gameObject.visible=this.gameObject[ke.wasVisible],delete this.gameObject[ke.wasVisible]),this.target&&this.target[ke.wasVisible]!==void 0&&(this.target.visible=this.target[ke.wasVisible],delete this.target[ke.wasVisible]),delete this.gameObject[ke.toggleClone],delete this.gameObject[ke.reverseToggleClone]}},a(ke,"clonedToggleIndex",0),a(ke,"wasVisible",Symbol("usdz_SetActiveOnClick_wasVisible")),a(ke,"toggleClone",Symbol("clone for toggling")),a(ke,"reverseToggleClone",Symbol("clone for reverse toggling")),ke);ze([m(A)],Xc.prototype,"target"),ze([m()],Xc.prototype,"toggleOnClick"),ze([m()],Xc.prototype,"targetState"),ze([m()],Xc.prototype,"hideSelf");let O0=Xc;const k0=class lr extends I{constructor(){super(...arguments),a(this,"wasVisible",!1)}static add(e,t){const s=Array.isArray(e)?e:[e];for(const o of s)lr._fadeObjects.includes(o)||(console.log("adding hide on start",o),lr._fadeObjects.push(o));lr._fadeBehaviour===void 0&&(lr._fadeBehaviour=new Yt("HideOnStart",Rt.sceneStartTrigger(),ve.fadeAction(lr._fadeObjects,0,!1)),t.addBehavior(lr._fadeBehaviour))}start(){P.setActive(this.gameObject,!1)}createBehaviours(e,t,s){t.uuid===this.gameObject.uuid&&(this.wasVisible||lr.add(t,e))}beforeCreateDocument(){this.wasVisible=P.isActiveSelf(this.gameObject)}};a(k0,"_fadeBehaviour"),a(k0,"_fadeObjects",[]);let ep=k0;class ol extends I{constructor(){super(...arguments),a(this,"target"),a(this,"duration",.5),a(this,"motionType","bounce")}beforeCreateDocument(){}createBehaviours(e,t,s){if(this.target&&t.uuid===this.gameObject.uuid){const o=new Yt("emphasize "+this.name,Rt.tapTrigger(this.gameObject),ve.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(o)}}afterCreateDocument(e,t){}}ze([m()],ol.prototype,"target"),ze([m()],ol.prototype,"duration"),ze([m()],ol.prototype,"motionType");class Uo extends I{constructor(){super(...arguments),a(this,"target"),a(this,"clip",""),a(this,"toggleOnClick",!1),a(this,"trigger","tap")}start(){qc(this.gameObject)}ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(ts);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}onPointerClick(e){var t;e.use(),!(!((t=this.target)!=null&&t.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,s){if(!(!this.target&&!this.clip)&&t.uuid===this.gameObject.uuid){const o=this.clip?this.clip:this.target?this.target.clip:void 0;if(!o||typeof o!="string")return;const r=this.target?this.target.gameObject:this.gameObject;pa.getName(o);const l=this.target?this.target.volume:1,c=this.target&&this.target.spatialBlend==0?"nonSpatial":"spatial";let h=!1;this.gameObject.traverse(g=>{g instanceof X&&g.visible&&(h=!0)}),h=!0;const d=e.addAudioClip(o);let u=ve.playAudioAction(r,d,"play",l,c);this.target&&this.target.loop&&(u=ve.sequence(u).makeLooping());const p=this.name?"_"+this.name:"";if(h&&this.trigger==="tap"){this.toggleOnClick&&(u.multiplePerformOperation="stop");const g=new Yt("playAudio"+p,Rt.tapTrigger(t),u);e.addBehavior(g)}if(this.target&&this.target.playOnAwake&&this.target.enabled)if(h&&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 g=new Yt("playAudioOnStart"+p,Rt.sceneStartTrigger(),u);e.addBehavior(g)}}}}ze([m(ts)],Uo.prototype,"target"),ze([m(URL)],Uo.prototype,"clip"),ze([m()],Uo.prototype,"toggleOnClick");var Bi;const M0=(Bi=class extends I{constructor(){super(...arguments),a(this,"animator"),a(this,"stateName"),a(this,"trigger","tap"),a(this,"animation"),a(this,"selfModel"),a(this,"stateAnimationModel"),a(this,"animationSequence",new Array),a(this,"animationLoopAfterSequence",new Array),a(this,"randomOffsetNormalized",0)}get target(){var n,e;return((n=this.animator)==null?void 0:n.gameObject)||((e=this.animation)==null?void 0:e.gameObject)}start(){qc(this.gameObject)}onPointerClick(n){var e;n.use(),this.target&&this.stateName&&((e=this.animator)==null||e.play(this.stateName,0,0,.1))}createBehaviours(n,e,t){e.uuid===this.gameObject.uuid&&(this.selfModel=e)}afterSerialize(){if(Bi.rootsWithExclusivePlayback.size>1){const n='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.';F()&&be(n),console.warn(n,...Bi.rootsWithExclusivePlayback)}Bi.animationActions=[],Bi.rootsWithExclusivePlayback=new Set}afterCreateDocument(n,e){if(this.animationSequence===void 0&&this.animationLoopAfterSequence===void 0||!this.stateAnimationModel||!this.target)return;const t=e.document,s=e.extensions.find(l=>l instanceof Zu);if(!s)return;const o=s.getClipCount(this.target)>1;o&&(F()&&console.warn("Setting exclusive playback for "+this.target.name+"@"+this.stateName+" because it has "+s.getClipCount(this.target)+" animations. This works around QuickLook bug FB13410767."),Bi.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";t.traverse(l=>{var c,h;if(l.uuid===((c=this.target)==null?void 0:c.uuid)){const d=Bi.getActionForSequences(t,l,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),u=new Yt(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+((h=this.target)==null?void 0:h.name),this.trigger=="tap"?Rt.tapTrigger(this.selfModel):Rt.sceneStartTrigger(),d);o&&u.makeExclusive(!0),n.addBehavior(u)}})}static getActionForSequences(n,e,t,s,o){const r=(c,h)=>{let d=Bi.animationActions.find(u=>u.affectedObjects==c&&u.start==h.start&&u.duration==h.duration&&u.animationSpeed==h.speed);return d||(d=ve.startAnimationAction(c,h),Bi.animationActions.push(d)),d},l=ve.sequence();if(t&&t.length>0)for(const c of t)l.addAction(r(e,c));if(s&&s.length>0){const c=l.actions.length==0?l:ve.sequence();for(const h of s)c.addAction(r(e,h));c.makeLooping(),l!==c&&l.addAction(c)}return o&&o>0&&l.actions.unshift(ve.waitAction(o)),l}static getAndRegisterAnimationSequences(n,e,t){var s,o,r,l,c,h,d,u;if(!e)return;const p=e.getComponent(Ot),g=e.getComponent(jt);if(!p&&!g)return;if(p&&!t)throw new Error("PlayAnimationOnClick: No stateName specified for animator "+p.name+" on "+e.name);let f=[],y=[];if(g){const k=n.registerAnimation(e,g.clip);k&&(g.loop?y.push(k):f.push(k));let T=0;if(g.minMaxOffsetNormalized){const L=g.minMaxOffsetNormalized.x,B=g.minMaxOffsetNormalized.y;T=(((s=g.clip)==null?void 0:s.duration)||1)*(L+Math.random()*(B-L))}return{animationSequence:f,animationLoopAfterSequence:y,randomTimeOffset:T}}const v=p?.runtimeAnimatorController;let b=v?.findState(t),_=[],w=[];if(v&&b){const k=new Array;k.push(b);let T=!1;for(;k.length<100;){if(!b||b===null||!b.transitions||b.transitions.length===0){(o=b.motion)!=null&&o.isLooping&&(T=!0);break}const L=b.transitions.find(z=>z.conditions.length===0),B=L?v.getState(L.destinationState,0):null;if(B&&k.includes(B)){b=B,T=!0;break}else if(L){if(b=B,!b)break;k.push(b)}else{T=((r=b.motion)==null?void 0:r.isLooping)??!1;break}}if(T&&b){const L=k.indexOf(b);_=k.slice(0,L),w=k.slice(L),E1&&console.log("found loop from "+t,"states until loop",_,"states looping",w)}else _=k,w=[],E1&&console.log("found no loop from "+t,"states",_);if(!w.length){const L=_[_.length-1],B=(l=L.motion)==null?void 0:l.clip;if(B){let z;if(n.holdClipMap.has(B))z=n.holdClipMap.get(B);else{const j=L.name+"_hold";z=B.clone(),z.duration=1,z.name=j;const V=B.duration;z.tracks=B.tracks.map(G=>{const E=G.clone();E.times=new Float32Array([0,V]);const U=G.values.length,$=G.getValueSize(),te=G.values.slice(U-$,U);return E.values=new Float32Array(2*$),E.values.set(te,0),E.values.set(te,$),E}),z.name=j,n.holdClipMap.set(B,z)}if(z){const j={name:z.name,motion:{clip:z,isLooping:!1,name:z.name},speed:1,transitions:[],behaviours:[],hash:L.hash+1};w.push(j)}}}}if(_.length===1&&(!((c=_[0].motion)!=null&&c.clip)||((d=(h=_[0].motion)==null?void 0:h.clip.tracks)==null?void 0:d.length)===0)){f=new Array;const k=n.registerAnimation(e,null);k&&f.push(k);return}if(_=_.filter(k=>{var T,L,B;return((T=k.motion)==null?void 0:T.clip)&&((B=(L=k.motion)==null?void 0:L.clip.tracks)==null?void 0:B.length)>0}),w=w.filter(k=>{var T,L,B;return((T=k.motion)==null?void 0:T.clip)&&((B=(L=k.motion)==null?void 0:L.clip.tracks)==null?void 0:B.length)>0}),_.length===0&&w.length===0){console.warn("No clips found for state "+t+" on "+p?.name+", can't export animation data");return}const x=(k,T)=>{if(!e)return;const L=n.registerAnimation(e,k.motion.clip??null);L?(L.speed=k.speed,T.push(L)):console.warn("Couldn't register animation for state "+k.name+" on "+p?.name)};if(_.length>0){f=new Array;for(const k of _)x(k,f)}if(w.length>0){y=new Array;for(const k of w)x(k,y)}let M=0;if(p&&v&&p.minMaxOffsetNormalized){const k=p.minMaxOffsetNormalized.x,T=p.minMaxOffsetNormalized.y,L=_.length?_[0]:w.length?w[0]:null;M=(((u=L?.motion.clip)==null?void 0:u.duration)||1)*(k+Math.random()*(T-k))}return{animationSequence:f,animationLoopAfterSequence:y,randomTimeOffset:M}}createAnimation(n,e,t){if(!this.target||!this.animator&&!this.animation)return;const s=Bi.getAndRegisterAnimationSequences(n,this.target,this.stateName);s&&(this.animationSequence=s.animationSequence,this.animationLoopAfterSequence=s.animationLoopAfterSequence,this.randomOffsetNormalized=s.randomTimeOffset,this.stateAnimationModel=e)}},a(Bi,"animationActions",[]),a(Bi,"rootsWithExclusivePlayback",new Set),Bi);ze([m(Ot)],M0.prototype,"animator"),ze([m()],M0.prototype,"stateName");let Qc=M0;class rl extends I{constructor(){super(...arguments),a(this,"target")}getType(){}getDuration(){}}ze([m(A)],rl.prototype,"target");class Yc extends I{constructor(){super(...arguments),a(this,"target")}}ze([m(rl)],Yc.prototype,"target");class Kc extends rl{constructor(){super(...arguments),a(this,"type",1),a(this,"duration",1)}getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}ze([m()],Kc.prototype,"type"),ze([m()],Kc.prototype,"duration");class R0 extends Yc{}const A1=class hC{constructor(){a(this,"_quicklookButton"),a(this,"_arButton"),a(this,"_vrButton"),a(this,"_sendToQuestButton")}static create(){return new hC}static getOrCreate(){return this._instance||(this._instance=this.create()),this._instance}get isSecureConnection(){return window.location.protocol==="https:"}get quicklookButton(){return this._quicklookButton}get arButton(){return this._arButton}get vrButton(){return this._vrButton}get sendToQuestButton(){return this._sendToQuestButton}get qrButton(){return xo.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=Y.supportsQuickLookAR();e.innerText="View in AR",e.prepend(Pt("view_in_ar"));let s=!1,o=null;return e.addEventListener("click",()=>{o=vc(dn),o||(s=!0,o=new dn),s&&(o.objectToExport=J.Current.scene),o?(e.classList.add("this-mode-is-requested"),o.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(r=>{e.classList.remove("this-mode-is-requested"),console.error(r)})):console.warn("No USDZExporter component found in the scene")}),this.hideElementDuringXRSession(e),e}createARButton(e){var t;if(this._arButton)return this._arButton;const s="immersive-ar",o=document.createElement("button");return this._arButton=o,o.classList.add("webxr-button"),o.dataset.needle="webxr-ar-button",o.innerText="Enter AR",o.prepend(Pt("view_in_ar")),o.title="Click to start an AR session",o.addEventListener("click",()=>ne.start(s,e)),this.updateSessionSupported(o,s),this.listenToXRSessionState(o,s),this.hideElementDuringXRSession(o),this.isSecureConnection||(o.disabled=!0,o.title="WebXR requires a secure connection (HTTPS)"),Y.isMozillaXR()||(t=navigator.xr)==null||t.addEventListener("devicechange",()=>this.updateSessionSupported(o,s)),o}createVRButton(e){var t;if(this._vrButton)return this._vrButton;const s="immersive-vr",o=document.createElement("button");return this._vrButton=o,o.classList.add("webxr-button"),o.dataset.needle="webxr-vr-button",o.innerText="Enter VR",o.prepend(Pt("panorama_photosphere")),o.title="Click to start a VR session",o.addEventListener("click",()=>ne.start(s,e)),this.updateSessionSupported(o,s),this.listenToXRSessionState(o,s),this.hideElementDuringXRSession(o),this.isSecureConnection||(o.disabled=!0,o.title="WebXR requires a secure connection (HTTPS)"),Y.isMozillaXR()||(t=navigator.xr)==null||t.addEventListener("devicechange",()=>this.updateSessionSupported(o,s)),o}createSendToQuestButton(){var e;if(this._sendToQuestButton)return this._sendToQuestButton;const t="https://oculus.com/open_url/?url=",s=document.createElement("button");return this._sendToQuestButton=s,s.dataset.needle="webxr-sendtoquest-button",s.innerText="Open on Quest",s.prepend(Pt("share_windows")),s.title="Click to send this page to the Oculus Browser on your Quest",s.addEventListener("click",()=>{const o=encodeURIComponent(window.location.href),r=t+o;window.open(r)==null&&De("This page doesn't allow popups. Please paste "+r+" into your browser.")}),this.listenToXRSessionState(s),this.hideElementDuringXRSession(s),Y.isMozillaXR()||(e=navigator.xr)==null||e.addEventListener("devicechange",()=>{var o;(o=navigator.xr)!=null&&o.isSessionSupported("immersive-vr")?s.style.display="none":s.style.display=""}),s}createQRCode(){return xo.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!("xr"in navigator)){e.style.display="none";return}ne.isSessionSupported(t).then(s=>{e.style.display=s?"":"none",F()&&!s&&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){kd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),ug(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}listenToXRSessionState(e,t){t&&(ne.onSessionRequestStart(s=>{s.mode===t?e.classList.add("this-mode-is-requested"):(e["was-disabled"]=e.disabled,e.disabled=!0,e.classList.add("other-mode-is-requested"))}),ne.onSessionRequestEnd(s=>{e.classList.remove("this-mode-is-requested"),e.classList.remove("other-mode-is-requested"),e.disabled=e["was-disabled"]}))}};a(A1,"_instance");let al=A1;var qE=Object.defineProperty,XE=Object.getOwnPropertyDescriptor,_t=(n,e,t,s)=>{for(var o=s>1?void 0:s?XE(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&qE(e,t,o),o};const tp=C("debugspriterenderer"),QE=C("wireframe"),I1=class cv{static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&cv.cache[e.guid])return tp&&console.log("Take cached geometry for sprite",e.guid),cv.cache[e.guid];const t=new Ns;e.__cached_geometry=t;const s=new Float32Array(e.triangles.length*3),o=new Float32Array(e.triangles.length*2);for(let r=0;r<e.triangles.length;r+=1){const l=e.triangles[r];s[r*3]=-e.vertices[l].x,s[r*3+1]=e.vertices[l].y,s[r*3+2]=0;const c=e.uv[l];o[r*2]=c.x,o[r*2+1]=1-c.y}return t.setAttribute("position",new yt(s,3)),t.setAttribute("uv",new yt(o,2)),e.guid&&(this.cache[e.guid]=t),tp&&console.log("Built sprite geometry",e,t),t}};a(I1,"cache",{});let ip=I1;class YE{constructor(){a(this,"x"),a(this,"y")}}function L1(n){n&&(n.colorSpace!=Cn&&(n.colorSpace=Cn,n.needsUpdate=!0),n.minFilter==ld&&n.magFilter==ld&&(n.anisotropy=1,n.needsUpdate=!0))}let Gn=class{constructor(n){a(this,"guid"),a(this,"texture"),a(this,"triangles"),a(this,"uv"),a(this,"vertices"),a(this,"__cached_geometry"),a(this,"_mesh"),a(this,"_material"),n&&(this.texture=n,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}])}get mesh(){return this._mesh||(this._mesh=new X(ip.getOrCreateGeometry(this),this.material)),this._mesh}get material(){return this._material||(this.texture&&L1(this.texture),this._material=new Me({map:this.texture,color:16777215,side:xi,transparent:!0})),this._material}getGeometry(){return ip.getOrCreateGeometry(this)}};_t([m()],Gn.prototype,"guid",2),_t([m(je)],Gn.prototype,"texture",2),_t([Tr()],Gn.prototype,"triangles",2),_t([Tr()],Gn.prototype,"uv",2),_t([Tr()],Gn.prototype,"vertices",2);const T0=Symbol("spriteOwner");class ll{constructor(){a(this,"sprites"),this.sprites=[]}}_t([m(Gn)],ll.prototype,"sprites",2);const E0=class hv{constructor(){a(this,"spriteSheet"),a(this,"index",0)}static create(){const e=new hv;return e.spriteSheet=new ll,e}clone(){const e=new hv;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]}update(e){if(!this.spriteSheet)return;const t=this.index;if(t<0||t>=this.spriteSheet.sprites.length)return;const s=this.spriteSheet.sprites[t],o=s?.texture;if(o&&(L1(o),!s.__hasLoadedProgressive)){s.__hasLoadedProgressive=!0;const r=o;Xe.assignTextureLOD(o,0).then(l=>{l instanceof je&&(s.texture=l,e?.map===r&&(e.map=l,e.needsUpdate=!0))})}}};_t([m(ll)],E0.prototype,"spriteSheet",2),_t([m()],E0.prototype,"index",2);let cl=E0;class ui extends I{constructor(){super(...arguments),a(this,"drawMode",0),a(this,"size",{x:1,y:1}),a(this,"color"),a(this,"sharedMaterial"),a(this,"transparent",!0),a(this,"cutoutThreshold",0),a(this,"castShadows",!1),a(this,"renderOrder",0),a(this,"toneMapped",!0),a(this,"_spriteSheet"),a(this,"_currentSprite")}set texture(e){var t;if(!this._spriteSheet)return;const s=(t=this._spriteSheet.spriteSheet)==null?void 0:t.sprites[this.spriteIndex];s&&(s.texture=e,this.updateSprite())}addSprite(e,t=!1){var s,o;if(this._spriteSheet||(this._spriteSheet=cl.create()),!this._spriteSheet.spriteSheet)return-1;(s=this._spriteSheet.spriteSheet)==null||s.sprites.push(e);const r=((o=this._spriteSheet.spriteSheet)==null?void 0:o.sprites.length)-1;return t&&(this.spriteIndex=r),r}get sprite(){return this._spriteSheet}set sprite(e){if(e!==this._spriteSheet)if(typeof e=="number"){const t=Math.floor(e);this.spriteIndex=t}else e instanceof Gn?(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(){var e;return((e=this._spriteSheet)==null?void 0:e.index)??0}get spriteFrames(){var e,t;return((t=(e=this._spriteSheet)==null?void 0:e.spriteSheet)==null?void 0:t.sprites.length)??0}awake(){this._currentSprite=void 0,this._spriteSheet?this._spriteSheet=this._spriteSheet.clone():this._spriteSheet=cl.create(),tp&&console.log("Awake",this.name,this,this.sprite)}start(){this._currentSprite?this.gameObject&&this.gameObject.add(this._currentSprite):this.updateSprite()}updateSprite(e=!1){var t;if(!this.__didAwake&&!e)return!1;const s=this._spriteSheet;if(!((t=s?.spriteSheet)!=null&&t.sprites))return console.warn("SpriteRenderer has no data or spritesheet assigned..."),!1;const o=s.spriteSheet.sprites[this.spriteIndex];if(!o)return tp&&console.warn("Sprite not found",this.spriteIndex,s.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=ip.getOrCreateGeometry(o),this._currentSprite.material.map=o.texture;else{const r=new Me({color:16777215,side:xi});if(QE&&(r.wireframe=!0),this.color&&(r.color||(r.color=new ae),r.color.copy(this.color),r.opacity=this.color.alpha),r.transparent=!0,r.toneMapped=this.toneMapped,r.depthWrite=!1,o.texture&&!r.wireframe){let l=o.texture;l[T0]!==void 0&&l[T0]!==this&&this.spriteFrames>1&&(l=o.texture=l.clone()),l[T0]=this,r.map=l}this.sharedMaterial=r,this._currentSprite=new X(ip.getOrCreateGeometry(o),r),this._currentSprite.renderOrder=Math.round(this.renderOrder),Xe.assignTextureLOD(r,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,s?.update(this.sharedMaterial),!0}}_t([m()],ui.prototype,"drawMode",2),_t([m(YE)],ui.prototype,"size",2),_t([m(ce)],ui.prototype,"color",2),_t([m(Pe)],ui.prototype,"sharedMaterial",2),_t([m()],ui.prototype,"transparent",2),_t([m()],ui.prototype,"cutoutThreshold",2),_t([m()],ui.prototype,"castShadows",2),_t([m()],ui.prototype,"renderOrder",2),_t([m()],ui.prototype,"toneMapped",2),_t([m(cl)],ui.prototype,"sprite",1);const j1=C("debugwebxr"),KE=new se().makeRotationY(Math.PI),A0=class Kh extends I{constructor(){super(...arguments),a(this,"_arScale",1),a(this,"invertForward",!1),a(this,"customReticle"),a(this,"arTouchTransform",!0),a(this,"autoPlace",!1),a(this,"autoCenter",!1),a(this,"useXRAnchor",!1),a(this,"_isPlacing",!0),a(this,"_startOffset",new se),a(this,"_createdPlacementObject",null),a(this,"_reparentedComponents",[]),a(this,"_placementScene",new bi),a(this,"_reticle",[]),a(this,"_hits",[]),a(this,"_placementStartTime",-1),a(this,"_rigPlacementMatrix"),a(this,"_anchor",null),a(this,"userInput"),a(this,"onPlaceScene",e=>{var t;if(this._isPlacing==!1||e!=null&&e.used)return;let s=this._reticle[0];if(!s){console.warn("No reticle to place...");return}if(!s.visible&&!this.autoPlace){console.warn("Reticle is not visible (can not place)");return}if((t=ne.active)!=null&&t.isTrackingImages){console.warn("Scene Placement is disabled while images are being tracked");return}let o=this._hits[0];if(e&&e.origin instanceof pg){const r=this._reticle[e.origin.index];r&&(s=r,o=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(),s.position.copy(s.lastPos),s.quaternion.copy(s.lastQuat),this.onApplyPose(s),Kh._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(ne.active,o),this.context.xr)for(const r of this.context.xr.controllers)r.cancelHitTestSource()}),a(this,"upVec",new S(0,1,0)),a(this,"lookPoint",new S),a(this,"worldUpVec",new S(0,1,0))}static onPlaced(e){const t="placed";return this._eventListeners[t]||(this._eventListeners[t]=[]),this._eventListeners[t].push(e),()=>{const s=this._eventListeners[t].indexOf(e);s>=0&&this._eventListeners[t].splice(s,1)}}static get hasPlaced(){return this._hasPlaced}get arScale(){return this._arScale}set arScale(e){this._arScale=Math.max(1e-6,e),this.onSetScale()}onEnable(){var e;(e=this.customReticle)==null||e.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){j1&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,Kh._hasPlaced=!1,this.gameObject.updateMatrixWorld(),this._startOffset.copy(this.gameObject.matrixWorld);const t=new A;this._createdPlacementObject=t,t.name="AR Session Root",this._placementScene.name="AR Placement Scene",this._placementScene.children.length=0;for(let s=this.context.scene.children.length-1;s>=0;s--){const o=this.context.scene.children[s];this._placementScene.add(o)}if(this.context.scene.add(t),this.autoCenter){const s=ei(this._placementScene.children),o=s.getCenter(new S),r=s.getSize(new S),l=new se;l.makeTranslation(o.x,o.y-r.y*.5,o.z),this._startOffset.multiply(l)}this._reparentedComponents.length=0,this._reparentedComponents.push({comp:this,originalObject:this.gameObject}),P.addComponent(t,this);for(const s of this._reticle)Ri(s);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,Kh._hasPlaced=!1,this._rigPlacementMatrix=void 0}onUpdateXR(e){var t,s,o,r;if(e.xr.isTrackingImages){for(const l of this._reticle)l.visible=!1;return}if(this._isPlacing){const l=(t=e.xr.rig)==null?void 0:t.gameObject;l&&l.parent!==this.context.scene&&this.context.scene.add(l);let c=!1;if(e.xr.isPassThrough&&e.xr.controllers.length>0&&!this.autoPlace)for(const h of e.xr.controllers){const d=h.getHitTest();d&&(c=!0,this.updateReticleAndHits(e.xr,h.index,d,e.xr.rigScale))}if(!c){const h=e.xr.getHitTest();h&&this.updateReticleAndHits(e.xr,0,h,e.xr.rigScale)}}else{if(this._anchor&&e.xr.referenceSpace){const l=e.xr.frame.getPose(this._anchor.anchorSpace,e.xr.referenceSpace);if(l&&this.context.time.frame%20===0){const c=e.xr.convertSpace(l.transform),h=this._reticle[0];h&&(h.position.copy(c.position),h.quaternion.copy(c.quaternion),this.onApplyPose(h))}}if(this.arTouchTransform?(this.userInput||(this.userInput=new ZE(this.context)),(s=this.userInput)==null||s.enable()):(o=this.userInput)==null||o.disable(),this.arTouchTransform&&(r=this.userInput)!=null&&r.hasChanged){if(e.xr.rig){const l=e.xr.rig.gameObject;this.userInput.applyMatrixTo(l.matrix,!0),l.matrix.decompose(l.position,l.quaternion,l.scale),this.userInput.factor=l.scale.x}this.userInput.reset()}}}updateReticleAndHits(e,t,s,o){this._hits[t]=s.hit;let r=this._reticle[t];if(!r){if(this.customReticle)if(this.customReticle.asset)r=Fa(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else r=new X(new gP(.07,.09,32).rotateX(-Math.PI/2),new Me({side:xi,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),r.name="AR Placement Reticle";if(j1){const l=new wi(1);l.position.y+=.01,r.add(l)}this._reticle[t]=r,r.matrixAutoUpdate=!1,r.visible=!1}if(r.lastPos=r.lastPos||s.position.clone(),r.lastQuat=r.lastQuat||s.quaternion.clone(),r.position.copy(r.lastPos.lerp(s.position,this.context.time.deltaTime/.1)),r.lastPos.copy(r.position),r.quaternion.copy(r.lastQuat.slerp(s.quaternion,this.context.time.deltaTime/.05)),r.lastQuat.copy(r.quaternion),r.scale.set(o,o,o),this.customReticle&&this.applyViewBasedTransform(r),r.updateMatrix(),r.visible=!0,r.parent!==this.context.scene&&this.context.scene.add(r),this._placementStartTime<0&&(this._placementStartTime=this.context.time.realtimeSinceStartup),this.autoPlace)if(this.upVec.set(0,1,0).applyQuaternion(r.quaternion),this.upVec.dot(Q(0,1,0))>.9){let l=r["autoplace:timer"]||0;l>=1?(r.visible=!1,this.onPlaceScene(null)):(l+=this.context.time.deltaTime,r["autoplace:timer"]=l)}else r["autoplace:timer"]=0}onSetScale(){var e,t,s;if(!Kh._hasPlaced)return;const o=(t=(e=ne.active)==null?void 0:e.rig)==null?void 0:t.gameObject;if(o){const r=((s=ne.active)==null?void 0:s.rigScale)||1,l=1/this._arScale*r,c=new se().makeScale(l,l,l).invert();o.matrix.premultiply(c),o.matrix.decompose(o.position,o.quaternion,o.scale)}}onRevertSceneChanges(){var e;for(const t of this._reticle)t&&(t.visible=!1,t?.removeFromParent());this._reticle.length=0;for(let t=this._placementScene.children.length-1;t>=0;t--){const s=this._placementScene.children[t];this.context.scene.add(s)}(e=this._createdPlacementObject)==null||e.removeFromParent();for(const t of this._reparentedComponents)P.addComponent(t.originalObject,t.comp)}async onCreateAnchor(e,t){if(t.createAnchor===void 0){console.warn("Hit does not support creating an anchor",t),F()&&be("Hit does not support creating an anchor");return}else{const s=await t.createAnchor(e.viewerPose.transform);e.running&&s&&(this._anchor=s)}}applyViewBasedTransform(e){const t=this.context.mainCamera,s=e,o=t.worldPosition,r=s.worldPosition;this.upVec.set(0,1,0).applyQuaternion(e.quaternion);const l=t.worldPosition;l&&e.position.clone().sub(l).angleTo(this.upVec)<Math.PI/2&&this.upVec.negate();const c=this.upVec.angleTo(this.worldUpVec)*180/Math.PI,h=30;c>h&&c<180-h||c<-h&&c>-180+h?(this.lookPoint.copy(e.position).add(this.upVec),this.lookPoint.y=e.position.y,e.lookAt(this.lookPoint)):(o.y=r.y,e.lookAt(o))}onApplyPose(e){var t,s,o;const r=(s=(t=ne.active)==null?void 0:t.rig)==null?void 0:s.gameObject;if(!r){console.warn("No rig object to place");return}const l=r.parent||this.context.scene;this._rigPlacementMatrix?(o=this._rigPlacementMatrix)==null||o.decompose(r.position,r.quaternion,r.scale):this._rigPlacementMatrix=r.matrix.clone(),this.applyViewBasedTransform(e),e.updateMatrix(),this.context.scene.add(e),e.attach(r),e.removeFromParent(),r.scale.set(this.arScale,this.arScale,this.arScale),r.position.multiplyScalar(this.arScale),r.updateMatrix(),this.invertForward&&r.matrix.premultiply(KE),r.matrix.premultiply(this._startOffset),r.matrix.decompose(r.position,r.quaternion,r.scale),l.add(r)}};a(A0,"_eventListeners",{}),a(A0,"_hasPlaced",!1);let zo=A0;const sp=class dv{constructor(e){a(this,"oneFingerDrag",!0),a(this,"twoFingerRotate",!0),a(this,"twoFingerScale",!0),a(this,"factor",1),a(this,"context"),a(this,"offset"),a(this,"plane"),a(this,"_scale",1),a(this,"_hasChanged",!1),a(this,"_enabled",!1),a(this,"currentlyUsedPointerIds",new Set),a(this,"currentlyUnusedPointerIds",new Set),a(this,"onPointerDownEarly",t=>{this.isActive&&t.stopPropagation()}),a(this,"onPointerDownLate",t=>{t.used?this.currentlyUsedPointerIds.add(t.pointerId):this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.add(t.pointerId)}),a(this,"onPointerUpEarly",t=>{this.currentlyUsedPointerIds.delete(t.pointerId),this.currentlyUnusedPointerIds.delete(t.pointerId)}),a(this,"prev",new Map),a(this,"_didMultitouch",!1),a(this,"touchStart",t=>{if(!t.defaultPrevented)for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s],r=Y.isAndroidDevice()&&o.clientY<window.innerHeight*.1;this.prev.has(o.identifier)||this.prev.set(o.identifier,{ignore:r,x:0,z:0,screenx:0,screeny:0});const l=this.prev.get(o.identifier);if(l){const c=this.getPositionOnPlane(o.clientX,o.clientY);l.x=c.x,l.z=c.z,l.screenx=o.clientX,l.screeny=o.clientY}}}),a(this,"touchEnd",t=>{t.touches.length<=0&&(this._didMultitouch=!1);for(let s=0;s<t.changedTouches.length;s++){const o=t.changedTouches[s];this.prev.delete(o.identifier)}}),a(this,"touchMove",t=>{if(!t.defaultPrevented&&this.isActive){if(t.touches.length===1){if(this._didMultitouch)return;const s=t.touches[0],o=this.prev.get(s.identifier);if(!o||o.ignore)return;const r=this.getPositionOnPlane(s.clientX,s.clientY),l=r.x-o.x,c=r.z-o.z;if(l===0&&c===0)return;this.oneFingerDrag&&this.addMovement(l,c),o.x=r.x,o.z=r.z,o.screenx=s.clientX,o.screeny=s.clientY;return}else if(t.touches.length===2){this._didMultitouch=!0;const s=t.touches[0],o=t.touches[1],r=this.prev.get(s.identifier),l=this.prev.get(o.identifier);if(!r||!l)return;if(this.twoFingerRotate){const c=Math.atan2(s.clientY-o.clientY,s.clientX-o.clientX),h=Math.atan2(r.screeny-l.screeny,r.screenx-l.screenx),d=c-h;Math.abs(d)>.001&&this.addRotation(d)}if(this.twoFingerScale){const c=s.clientX-o.clientX,h=s.clientY-o.clientY,d=Math.sqrt(c*c+h*h),u=r.screenx-l.screenx,p=r.screeny-l.screeny,g=Math.sqrt(u*u+p*p),f=d-g;Math.abs(f)>2&&this.addScale(f)}r.screenx=s.clientX,r.screeny=s.clientY,l.screenx=o.clientX,l.screeny=o.clientY}}}),a(this,"_raycaster",new od),a(this,"_intersection",new S),a(this,"_screenPos",new S),a(this,"_tempMatrix",new se),this.context=e,this.offset=new se,this.plane=new dr,this.plane.setFromNormalAndCoplanarPoint(dv.up,dv.zero)}get scale(){return this._scale}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)}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))}getPositionOnPlane(e,t){const s=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(s),this._raycaster.set(s.position,this._screenPos.sub(s.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)}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)}};a(sp,"up",new S(0,1,0)),a(sp,"zero",new S(0,0,0)),a(sp,"one",new S(1,1,1));let ZE=sp;const No=C("debugautosync"),I0=Symbol("syncerId");class JE{constructor(){a(this,"_syncers",{})}getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new eA(e);return t[I0]=e.guid,this._syncers[t[I0]]=t,t}removeSyncer(e){delete this._syncers[e[I0]]}}const L0=new JE;class eA{constructor(e){a(this,"comp"),a(this,"hasChanges",!1),a(this,"changedProperties",{}),a(this,"_isReceiving",!1),a(this,"_isInit",!1),a(this,"onHandleSending",()=>{if(!this.hasChanges)return;this.hasChanges=!1;const t=this.comp.context.connection;if(!t||!t.isConnected||!t.isInRoom){for(const s in this.changedProperties)delete this.changedProperties[s];return}for(const s in this.changedProperties){const o=this.changedProperties[s];No&&console.log("SEND",this.comp.guid,this.networkingKey),t.send(this.networkingKey,{guid:this.comp.guid,property:s,data:o},ws.Queued),delete this.changedProperties[s]}}),a(this,"onHandleReceiving",t=>{if(No&&console.log("SYNCFIELD RECEIVE",this.comp.name,this.comp.guid,t),!!this._isInit&&this.comp&&t.guid===this.comp.guid)try{this._isReceiving=!0,this.comp[t.property]=t.data}catch(s){console.error(s)}finally{this._isReceiving=!1}}),this.comp=e}get networkingKey(){return this.comp.guid}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||(No&&console.log("Property changed: "+e,t),this.hasChanges=!0,this.changedProperties[e]=t)}}function tA(n,e){let t=e!==n;return!t&&n&&e&&(Array.isArray(n)&&Array.isArray(e)||typeof n=="object"&&typeof e=="object")&&(t=!0),t}const Zc=Symbol("AutoSyncHandler");function iA(n){if(n[Zc])return n[Zc];const e=L0.getOrCreateSyncer(n);return e?.init(n),n[Zc]=e,e}function sA(n){const e=n[Zc];e&&(L0.removeSyncer(e),e.destroy(),delete n[Zc])}const j0=function(n=null){return function(e,t){var s;let o="";typeof t=="string"?o=t:o=t.name;let r=null,l;typeof n=="string"?l=e[n]:typeof n=="function"&&(l=n),l==null&&(F()||No)&&n!=null&&console.warn('syncField: no callback function found for property "'+o+'"','"'+n+'"');const c=e,h=c.__internalAwake;if(typeof h!="function"){(No||F())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+((s=e?.constructor)==null?void 0:s.name)+'" is not supported',e);return}No&&console.log(o);const d=Symbol(o);c.__internalAwake=function(){if(this[d]!==void 0)return;this[d]=this[o],r=L0.getOrCreateSyncer(this);const p=Object.getOwnPropertyDescriptor(this,o);if(p?.set===void 0){let g=!1;Object.defineProperty(this,o,{set:function(f){var y;const v=this[d];if(this[d]=f,g){(F()||No)&&console.warn("Recursive call detected",o);return}g=!0;try{const b=tA(f,v);No&&console.log("SyncField assignment",o,"changed?",b,f,l),b&&l?.call(this,f,v)!==!1&&((y=iA(this))==null||y.notifyChanged(o,f))}finally{g=!1}},get:function(){return this[d]},configurable:!0,enumerable:!0})}r?.init(this),h.call(this)};const u=c.__internalDestroy;c.__internalDestroy=function(){sA(this),u.call(this)}}};var nA=Object.defineProperty,np=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&nA(e,t,o),o};const Kt=C("debugplayersync"),op=class dC extends I{constructor(){super(...arguments),a(this,"autoSync",!0),a(this,"asset"),a(this,"onPlayerSpawned"),a(this,"_localInstance"),a(this,"onJoinedRoom",()=>{Kt&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()}),a(this,"destroyInstance",()=>{var e;(e=this._localInstance)==null||e.then(t=>{Kt&&console.log("PlayerSync.destroyInstance",t),uc(t,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0})}static async setupFrom(e,t){const s=le.getOrCreateFromUrl(e);if(!s.asset){const l=await s.loadAssetAsync();l&&P.getOrAddComponent(l,ks)}const o=new dC;o._internalInit(t),o.asset=s;const r=new A;return r.guid=e,P.addComponent(r,o),o}awake(){this.watchTabVisible(),this.onPlayerSpawned||(this.onPlayerSpawned=new xe)}onEnable(){this.context.connection.beginListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(ie.LeftRoom,this.destroyInstance),this.context.connection.isInRoom&&this.onJoinedRoom()}onDisable(){this.context.connection.stopListen(ie.RoomStateSent,this.onJoinedRoom),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(ie.LeftRoom,this.destroyInstance)}async getInstance(){var e,t,s,o,r,l;if(this._localInstance)return this._localInstance;if(Kt&&console.log("PlayerSync.createInstance",(e=this.asset)==null?void 0:e.url),!((t=this.asset)!=null&&t.asset)&&!((s=this.asset)!=null&&s.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=(o=this.asset)==null?void 0:o.instantiateSynced({parent:this.gameObject,deleteOnDisconnect:!0},!0);const c=await this._localInstance;if(c){const h=P.getComponentsInChildren(c,ks);if(Kt&&console.log(`PlayerSync.createInstance: found ${h?.length} PlayerState components. Owner: ${this.context.connection.connectionId}`),h!=null&&h.length){for(const d of h)d.owner=this.context.connection.connectionId;(r=this.onPlayerSpawned)==null||r.invoke(c)}else this._localInstance=void 0,console.error("<strong>Failed finding PlayerState on "+((l=this.asset)==null?void 0:l.url)+"</strong>: please make sure the asset has a PlayerState component!"),P.destroySynced(c)}else this._localInstance=void 0,console.warn("PlayerSync: failed instantiating asset!");return this._localInstance}watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=ks.all.length-1;t>=0;t--){const s=ks.all[t];(!s.owner||!this.context.connection.userIsInRoom(s.owner))&&s.doDestroy()}})}};np([m()],op.prototype,"autoSync"),np([m(le)],op.prototype,"asset"),np([m(xe)],op.prototype,"onPlayerSpawned");let D0=op;var D1=(n=>(n.OwnerChanged="ownerChanged",n))(D1||{}),Ke;const B0=(Ke=class extends I{constructor(){super(...arguments),a(this,"onOwnerChangeEvent",new xe),a(this,"onFirstOwnerChangeEvent",new xe),a(this,"hasOwner",!1),a(this,"owner"),a(this,"dontDestroy",!1),a(this,"onUserLeftRoom",n=>{if(n.userId===this.owner){Kt&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}})}static get all(){return Ke._all}static get local(){return Ke._local}static getFor(n){if(n instanceof A)return P.getComponentInParent(n,Ke);if(n instanceof I)return P.getComponentInParent(n.gameObject,Ke)}static isLocalPlayer(n){const e=Ke.getFor(n);return e?.isLocalPlayer??!1}static addEventListener(n,e){return this._callbacks[n]||(this._callbacks[n]=[]),this._callbacks[n].push(e),e}static removeEventListener(n,e){if(!this._callbacks[n])return;const t=this._callbacks[n].indexOf(e);t>=0&&this._callbacks[n].splice(t,1)}static dispatchEvent(n,e){if(this._callbacks[n])for(const t of this._callbacks[n])t(e)}get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(n,e){var t,s;Kt&&console.log(`PlayerSync.onOwnerChange: ${e} \u2192 ${n} (me: ${this.context.connection.connectionId})`);const o=Ke._local.indexOf(this);o>=0&&Ke._local.splice(o,1);const r={playerState:this,oldValue:e,newValue:n};if(this.hasOwner||(this.hasOwner=!0,(t=this.onFirstOwnerChangeEvent)==null||t.invoke(r)),(s=this.onOwnerChangeEvent)==null||s.invoke(r),this.owner===this.context.connection.connectionId){Ke._local.push(this);const c=new CustomEvent("local-owner-changed",{detail:r});this.dispatchEvent(c)}const l=new CustomEvent("owner-changed",{detail:r});this.dispatchEvent(l),Ke.dispatchEvent("ownerChanged",l)}awake(){Ke.all.push(this),Kt&&console.log("Registered new PlayerState",this.guid,Ke.all.length-1,Ke.all),this.context.connection.beginListen(ie.UserLeftRoom,this.onUserLeftRoom)}async start(){Kt&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await fs(300),this.context.connection.userIsInRoom(this.owner)==!1&&(Kt&&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||(Kt&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?Kt&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(Kt&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):Kt&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){Kt&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),uc(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(Kt&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(ie.UserLeftRoom,this.onUserLeftRoom),Ke.all.splice(Ke.all.indexOf(this),1),this.isLocalPlayer){const n=Ke._local.indexOf(this);n>=0&&Ke._local.splice(n,1)}}},a(Ke,"_all",[]),a(Ke,"_local",[]),a(Ke,"_callbacks",{}),Ke);np([j0(B0.prototype.onOwnerChange)],B0.prototype,"owner");let ks=B0;var oA=Object.defineProperty,hl=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&oA(e,t,o),o};class ln extends I{constructor(){super(...arguments),a(this,"position","bottom"),a(this,"showNeedleLogo",!1),a(this,"showSpatialMenu"),a(this,"createFullscreenButton"),a(this,"createMuteButton"),a(this,"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&&(Y.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}hl([m()],ln.prototype,"position"),hl([m()],ln.prototype,"showNeedleLogo"),hl([m()],ln.prototype,"showSpatialMenu"),hl([m()],ln.prototype,"createFullscreenButton"),hl([m()],ln.prototype,"createMuteButton"),hl([m()],ln.prototype,"createQRCodeButton");var rA=Object.defineProperty,F0=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&rA(e,t,o),o};const Jc=C("debugwebxr"),B1=new H().setFromAxisAngle(new S(0,1,0),Math.PI);class Wo extends I{constructor(){super(...arguments),a(this,"head"),a(this,"leftHand"),a(this,"rightHand"),a(this,"_leftHandMeshes"),a(this,"_rightHandMeshes"),a(this,"_syncTransforms")}async onEnterXR(e){if(!this.activeAndEnabled)return;Jc&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=ks.getFor(this);if(t!=null&&t.owner){const s=this.gameObject.addComponent(ai);s.avatar=this.gameObject,s.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(ai);t&&t.destroy()}onUpdateXR(e){var t,s;if(!this.activeAndEnabled)return;const o=ks.isLocalPlayer(this);if(!o)return;const r=e.xr;if(r.rig&&r.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),r.rig.gameObject.add(this.gameObject)),this._syncTransforms&&o)for(const u of this._syncTransforms)u.fastMode=!0,u.isOwned()||u.requestOwnership();if(this.head&&this.context.mainCamera){const u=this.head.asset;if(u.position.copy(this.context.mainCamera.position),u.position.x*=-1,u.position.z*=-1,u.quaternion.copy(this.context.mainCamera.quaternion),u.quaternion.x*=-1,this.context.time.frameCount%10===0&&this.head.asset){const p=P.getComponentsInChildren(this.head.asset,is);for(const g of p)g.enabled=!1,g.gameObject.visible=!1}}const l=e.xr.leftController,c=(t=this.leftHand)==null?void 0:t.asset;l&&c?(c.position.copy(l.gripPosition),c.quaternion.copy(l.gripQuaternion),c.quaternion.multiply(B1),c.visible=l.isTracking,this.updateHandVisibility(l,c,this._leftHandMeshes)):c&&c.visible&&(c.visible=!1);const h=e.xr.rightController,d=(s=this.rightHand)==null?void 0:s.asset;h&&d?(d.position.copy(h.gripPosition),d.quaternion.copy(h.gripQuaternion),d.quaternion.multiply(B1),d.visible=h.isTracking,this.updateHandVisibility(h,d,this._rightHandMeshes)):d&&d.visible&&(d.visible=!1)}onBeforeRender(){this.context.xr&&this.context.time.frame%10===0&&this.updateRemoteAvatarVisibility()}updateHandVisibility(e,t,s){if(s){const o=e.model&&e.model.visible&&e.model!==t;s.forEach(r=>{Ln(r,!o)})}}updateRemoteAvatarVisibility(){var e,t,s;if(this.context.connection.isConnected){const o=ks.getFor(this);if(o&&o.isLocalPlayer==!1){const r=ne.getXRSync(this.context);if(r&&r.hasState(o.owner)){this.tryFindAvatarObjectsIfMissing();const l=(e=this.leftHand)==null?void 0:e.asset;l&&(l.visible=r?.isTracking(o.owner,"left")??!1);const c=(t=this.rightHand)==null?void 0:t.asset;c&&(c.visible=r?.isTracking(o.owner,"right")??!1)}if((s=this.head)!=null&&s.asset){const l=P.getComponentsInChildren(this.head.asset,is);for(const c of l)c.enabled=!1,c.gameObject.visible=!0}}}}tryFindAvatarObjectsIfMissing(){if(!this.head||!this.leftHand||!this.rightHand){const e={head:this.head,leftHand:this.leftHand,rightHand:this.rightHand};p_.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(){var e,t;if(this.tryFindAvatarObjectsIfMissing(),this.head)this.head instanceof A&&(this.head=new le("",this.sourceId,this.head));else{const s=new A;s.name="Head";const o=vo.createPrimitive(vr.Cube);s.add(o),this.gameObject.add(s),this.head=new le("",this.sourceId,s),Jc&&console.log("Create head",s)}if(this.rightHand)this.rightHand instanceof A&&(this.rightHand=new le("",this.sourceId,this.rightHand));else{const s=new A;s.name="Right Hand",this.gameObject.add(s),this.rightHand=new le("",this.sourceId,s),Jc&&console.log("Create right hand",s)}if(this.leftHand)this.leftHand instanceof A&&(this.leftHand=new le("",this.sourceId,this.leftHand));else{const s=new A;s.name="Left Hand",this.gameObject.add(s),this.leftHand=new le("",this.sourceId,s),Jc&&console.log("Create left hand",s)}await this.loadAvatarObjects(this.head,this.leftHand,this.rightHand),this._leftHandMeshes=[],(e=this.leftHand.asset)==null||e.traverse(s=>{s!=null&&s.isMesh&&this._leftHandMeshes.push(s)}),this._rightHandMeshes=[],(t=this.rightHand.asset)==null||t.traverse(s=>{s!=null&&s.isMesh&&this._rightHandMeshes.push(s)}),ks.isLocalPlayer(this.gameObject)&&(this._syncTransforms=P.getComponentsInChildren(this.gameObject,Zs))}async loadAvatarObjects(e,t,s){const o=e.loadAssetAsync(),r=t.loadAssetAsync(),l=s.loadAssetAsync(),c=new Array;o&&c.push(o),r&&c.push(r),l&&c.push(l);const h=await Nm(c);Jc&&console.log("Avatar loaded results:",h)}}F0([m(le)],Wo.prototype,"head"),F0([m(le)],Wo.prototype,"leftHand"),F0([m(le)],Wo.prototype,"rightHand");var aA=Object.defineProperty,rp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&aA(e,t,o),o};const qn=C("debugwebxr"),Vo=new Array;class cn extends I{constructor(){super(...arguments),a(this,"createControllerModel",!0),a(this,"createHandModel",!0),a(this,"customLeftHand"),a(this,"customRightHand"),a(this,"_models",new Array)}supportsXR(e){return e==="immersive-vr"||e==="immersive-ar"}async onXRControllerAdded(e){var t;if(!(e.xr.isVR||e.xr.isPassThrough))return;const{controller:s}=e;if(qn&&console.warn("Add Controller Model for",s.side,s.index),this.createControllerModel||this.createHandModel){if(s.hand){if(this.createHandModel){const o=await this.loadHandModel(this,s);if(!o||!s.connected||!s.isHand){o!=null&&o.handObject&&Ba(o.handObject,!1),(t=o?.handObject)==null||t.destroy();return}this._models.push({controller:s,model:o.handObject,handmesh:o.handmesh}),this._models.sort((r,l)=>r.controller.index-l.controller.index),this.scene.add(o.handObject),s.model=o.handObject}}else if(this.createControllerModel){const o=await s.getModelUrl();if(o){const r=await this.loadModel(s,o);if(!r||!s.connected||s.isHand)return;this._models.push({controller:s,model:r}),this._models.sort((l,c)=>l.controller.index-c.controller.index),this.scene.add(r),r.traverse(l=>{l.layers.set(2),l.matrixAutoUpdate=!1,l.updateMatrix()}),s.model=r}else s.targetRayMode!=="transient-pointer"&&console.warn("XRControllerModel: no model found for "+s.side)}}}onXRControllerRemoved(e){console.debug("XR Controller Removed",e.controller.side,e.controller.index);const t=this._models.findIndex(o=>o.controller===e.controller),s=this._models[t];s&&(this._models.splice(t,1),s.model&&(Ba(s.model,!1),s.model.destroy(),s.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&&(Ba(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(ne.active&&(qn&&(Vo[0]=Date.now()),this.updateRendering(ne.active),qn)){const e=Date.now()-Vo[0];Vo.push(e),Vo.length>=30&&(Vo[0]=0,Vo.reduce((t,s)=>t+s,0)/Vo.length,Vo.length=0)}}updateRendering(e){var t,s,o,r,l;for(let c=0;c<this._models.length;c++){const h=this._models[c];if(!h)continue;const d=h.controller;if(!d.connected){qn&&console.warn("XRControllerModel.onUpdateXR: controller is not connected anymore",d.side,d.hand);continue}if(h.model&&!h.handmesh)h.model.matrixAutoUpdate=!1,h.model.matrix.copy(d.gripMatrix),h.model.visible=d.isTracking,(t=e.rig)==null||t.gameObject.add(h.model);else if(d.inputSource.hand&&h.handmesh){const u=e.referenceSpace,p=this.context.renderer.xr.getHand(d.index);if(u&&e.frame.getJointPose){for(const g of d.inputSource.hand.values()){const f=p.joints[g.jointName];if(f){const y=d.getHandJointPose(g);if(y){const v=y.transform.position,b=y.transform.orientation;f.position.copy(v),f.quaternion.copy(b),f.matrixAutoUpdate=!1}f.visible=y!=null}}h.model&&(h.model.visible=d.isTracking,h.model.visible&&h.model.parent!==((s=e.rig)==null?void 0:s.gameObject)&&((o=e.rig)==null||o.gameObject.add(h.model))),(r=h.model)!=null&&r.visible&&((l=h.handmesh)==null||l.updateMesh(),h.model.matrixAutoUpdate=!1,h.model.matrix.identity(),h.model.applyMatrix4(ka))}}}}async loadModel(e,t){var s;if(!e.connected)return console.warn("XRControllerModel.onXRControllerAdded: controller is not connected anymore",e.side),null;const o=await le.getOrCreate("",t).instantiate();return Ba(o),(s=ne.active)!=null&&s.isPassThrough&&o.traverseVisible(r=>{this.makeOccluder(r)}),o}async loadHandModel(e,t){const s=this.context,o=s.renderer.xr.getHand(t.index);o||(qn?q.DrawLabel(t.rayWorldPosition,"No hand found for index "+t.index,.05,5):console.warn("No hand found for index "+t.index));const r=new On;Sf(r,s),await zu(r,s,this.sourceId??"");const l=o0(r);let c="";const h=t.side==="left"?this.customLeftHand:this.customRightHand;h?(c=h.url.split(".").slice(0,-1).join("."),r.setPath("")):(c=t.inputSource.handedness==="left"?"left":"right",r.setPath("https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/"));const d=new A;Ba(d);const u=new QP(d,o,r.path,c,r,p=>{var g;const f=l?.gltf;((g=f?.scene.children)==null?void 0:g.length)===0&&(f.scene.children[0]=p),l!=null&&l.gltf&&_s().createBuiltinComponents(e.context,e.sourceId||c,l.gltf,null,l),p.traverse(y=>{var v;y.layers.set(2),(v=ne.active)!=null&&v.isPassThrough&&!h&&this.makeOccluder(y),y instanceof X&&Xe.assignMeshLOD(y,0)}),t.connected||(qn&&q.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),p.removeFromParent())});if(qn&&d.add(new wi(.5)),t.inputSource.hand){qn&&console.log(t.inputSource.hand);for(const p of t.inputSource.hand.values())if(o.joints[p.jointName]===void 0){const g=new ho;g.matrixAutoUpdate=!1,g.visible=!0,o.joints[p.jointName]=g,o.add(g)}}else qn&&q.DrawLabel(t.rayWorldPosition,"No inputSource.hand found for index "+t.index,.05,5);return{handObject:d,handmesh:u}}makeOccluder(e){if(e instanceof X){let t=e.material;t instanceof Pe&&(t=e.material=t.clone(),t.depthWrite=!0,t.depthTest=!0,t.colorWrite=!1,e.receiveShadow=!1,e.renderOrder=-100)}}}a(cn,"factory",new XP),rp([m()],cn.prototype,"createControllerModel"),rp([m()],cn.prototype,"createHandModel"),rp([m(le)],cn.prototype,"customLeftHand"),rp([m(le)],cn.prototype,"customRightHand");class ap extends I{}var lA=Object.defineProperty,Ho=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&lA(e,t,o),o};const U0=C("debugwebxr");class Fi extends I{constructor(){super(...arguments),a(this,"movementSpeed",1.5),a(this,"rotationStep",30),a(this,"useTeleport",!0),a(this,"usePinchToTeleport",!0),a(this,"useTeleportTarget",!1),a(this,"useTeleportFade",!1),a(this,"showRays",!0),a(this,"showHits",!0),a(this,"isXRMovementHandler",!0),a(this,"xrSessionMode","immersive-vr"),a(this,"_didApplyRotation",!1),a(this,"_didTeleport",!1),a(this,"_teleportBuffer",new Array),a(this,"_plane",null),a(this,"_lines",[]),a(this,"_hitDiscs",[]),a(this,"_hitDistances",[]),a(this,"_lastHitDistances",[]),a(this,"hitPointRaycastFilter",e=>e.type==="SkinnedMesh"?"continue in children":!0)}onUpdateXR(e){const t=e.xr.rig;if(!(t!=null&&t.gameObject)||e.xr.isPassThrough)return;const s=e.xr.leftController,o=e.xr.rightController;s&&this.onHandleMovement(s,t.gameObject),o&&(this.onHandleRotation(o,t.gameObject),this.useTeleport&&this.onHandleTeleport(o,t.gameObject))}onLeaveXR(e){for(const t of this._lines)t.removeFromParent();for(const t of this._hitDiscs)t?.removeFromParent()}onBeforeRender(){var e;(e=this.context.xr)!=null&&e.running&&(this.showRays&&this.renderRays(this.context.xr),this.showHits&&this.renderHits(this.context.xr))}onHandleMovement(e,t){const s=e.getStick("xr-standard-thumbstick");if(s.x!=0||s.y!=0){const o=Q(s.x,0,s.y);o.multiplyScalar(this.context.time.deltaTimeUnscaled*this.movementSpeed);const r=Ge(t);o.multiplyScalar(r.x),o.applyQuaternion(e.xr.poseOrientation),o.y=0,o.applyQuaternion(t.worldQuaternion),t.position.add(o),t.updateWorldMatrix(!1,!1);for(const l of t.children)l.updateWorldMatrix(!1,!1)}}onHandleRotation(e,t){if(e._isMxInk)return;const s=e.getStick("xr-standard-thumbstick").x;if(this._didApplyRotation)Math.abs(s)<.3&&(this._didApplyRotation=!1);else if(Math.abs(s)>.5){this._didApplyRotation=!0;const o=s>0?1:-1,r=ee(this.context.mainCamera).clone();t.rotateY(o*W.toRadians(this.rotationStep));const l=ee(this.context.mainCamera).clone().sub(r);l.y=0,t.position.sub(l)}}onHandleTeleport(e,t){var s,o,r,l,c;let h=0;if(e.hand&&this.usePinchToTeleport&&e.isTeleportGesture){const d=e.getPointerId("primary");if(d!=null&&this.context.input.getIsPointerIdInUse(d))return;const u=e.getGesture("pinch");u&&(h=u.value)}else h=(s=e.getStick("xr-standard-thumbstick"))==null?void 0:s.y;if(this._didTeleport)h>=0&&h<.4?this._didTeleport=!1:h<0&&h>-.4&&(this._didTeleport=!1);else if(h>.8){this._didTeleport=!0;const d=this.context.physics.raycastFromRay(e.ray)[0];if(d&&d.object instanceof _a){const p=(o=d.normal)==null?void 0:o.dot(Q(0,1,0));if(p!==void 0&&p<.4)return}let u=d?.point;if(!u&&!this.useTeleportTarget){this._plane||(this._plane=new dr(new S(0,1,0),0));const p=t.worldPosition;this._plane.setFromNormalAndCoplanarPoint(new S(0,1,0),p);const g=e.ray;u=p.clone(),this._plane.intersectLine(new fP(g.origin,Q(g.direction).multiplyScalar(1e4).add(g.origin)),u),u.distanceTo(p)>t.scale.x*10&&(u=null)}if(u){if(this.useTeleportTarget&&!P.getComponentInParent(d.object,ap))return;const p=u.clone();if(U0&&q.DrawSphere(u,.025,16711680,5),(r=this.context.mainCamera)==null?void 0:r.position){const g=(l=this.context.xr)==null?void 0:l.getUserOffsetInRig();g&&(g.y=0,p.sub(g),U0&&q.DrawWireSphere(g.add(p),.025,65280,5))}this._teleportBuffer.push(t.matrix.clone()),this._teleportBuffer.length>10&&this._teleportBuffer.shift(),this.useTeleportFade?(c=e.xr.fadeTransition())==null||c.then(()=>{t.worldPosition=p}):t.worldPosition=p}}else if(h<-.8&&(this._didTeleport=!0,this._teleportBuffer.length>0)){const d=this._teleportBuffer.pop();d&&d.decompose(t.position,t.quaternion,t.scale)}}renderRays(e){var t;for(let s=0;s<this._lines.length;s++){const o=this._lines[s];o&&(o.visible=!1)}for(let s=0;s<e.controllers.length;s++){const o=e.controllers[s];let r=this._lines[s];if(!o.connected||!o.isTracking||!o.ray||o.targetRayMode==="transient-pointer"||!o.hasSelectEvent){r&&(r.visible=!1);continue}r||(r=this.createRayLineObject(),r.scale.z=.5,this._lines[s]=r),o.updateRayWorldPosition(),o.updateRayWorldQuaternion();const l=o.rayWorldPosition,c=o.rayWorldQuaternion;r.position.copy(l),r.quaternion.copy(c);const h=e.rigScale,d=this.usePinchToTeleport&&o.isTeleportGesture,u=this._lastHitDistances[s],p=this._hitDistances[s]!=null,g=u??h;r.scale.set(h,h,g),r.visible=!0,r.layers.disableAll(),r.layers.enable(2);let f=r.material.opacity;d?f=1:this.showHits&&g<e.rigScale*.5?f=0:(t=o.getButton("primary"))!=null&&t.pressed?f=.5:f=p?.2:.1,r.material.opacity=W.lerp(r.material.opacity,f,this.context.time.deltaTimeUnscaled/.1),r.parent!==this.context.scene&&this.context.scene.add(r)}}renderHits(e){var t;for(const s of this._hitDiscs){if(!s)continue;const o=s.controller;if(!o||!o.connected||!o.isTracking){s.visible=!1;continue}}for(let s=0;s<e.controllers.length;s++){const o=e.controllers[s];if(!o.connected||!o.isTracking||!o.ray||!o.hasSelectEvent)continue;let r=this._hitDiscs[s],l=!0;const c=o.getPointerId("primary");c!=null&&this.context.input.getIsPointerIdInUse(c)&&(r&&(r.visible=!1),this._hitDistances[s]=null,this._lastHitDistances[s]=0,l=!1);const h=this.context.time.smoothedFps>=59?1:10;if((this.context.time.frame+o.index)%h!==0&&(l=!1),!l){const p=this._hitDiscs[s];p&&p.visible&&p.hit&&this.updateHitPointerPosition(o,p,p.hit.distance);continue}const d=this.context.physics.raycastFromRay(o.ray,{testObject:this.hitPointRaycastFilter,precise:!1});let u=d.find(p=>this.usePinchToTeleport&&o.isTeleportGesture?!0:this.isObjectWithInteractiveComponent(p.object));if(u||(u=d[0]),r&&(r.controller=o,r.hit=u),this._hitDistances[s]=u?.distance||null,u){this._lastHitDistances[s]=u.distance;const p=e.rigScale??1;U0&&(q.DrawWireSphere(u.point,.025*p,16711680),q.DrawLabel(Q(0,.2,0).add(u.point),u.object.name,.02,0)),r||(r=this.createHitPointObject(),this._hitDiscs[s]=r),r.hit=u,r.visible=u.distance>p*.05;let g=.01*(p+u.distance);const f=(t=o.getButton("primary"))==null?void 0:t.pressed;f&&(g*=1.1),r.scale.set(g,g,g),r.layers.set(2);let y=r.material.opacity;if(f?y=1:y=u.distance<.15*p?.2:.6,r.material.opacity=W.lerp(r.material.opacity,y,this.context.time.deltaTimeUnscaled/.1),r.visible){if(u.normal){this.updateHitPointerPosition(o,r,u.distance);const v=u.normal.applyQuaternion(Se(u.object));r.quaternion.setFromUnitVectors(cA,v)}else this.updateHitPointerPosition(o,r,u.distance);r.parent!==this.context.scene&&this.context.scene.add(r)}}else this._hitDiscs[s]&&(this._hitDiscs[s].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,s){const o=Q(e.rayWorldPosition);o.add(Q(0,0,s-.01).applyQuaternion(e.rayWorldQuaternion)),t.position.lerp(o,this.context.time.deltaTimeUnscaled/.05)}createHitPointObject(){const e=new X(new nd(.3,6,6),new Me({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:xi}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new YP;e.layers.disableAll(),e.layers.enable(2);const t=new KP;e.geometry=t;const s=new Float32Array(9);s.set([0,0,.02,0,0,.4,0,0,1]),t.setPositions(s);const o=new Float32Array(9);o.set([1,1,1,.1,.1,.1,0,0,0]),t.setColors(o);const r=new ZP({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:Mv,dashed:!1});return e.material=r,e}}Ho([m()],Fi.prototype,"movementSpeed"),Ho([m()],Fi.prototype,"rotationStep"),Ho([m()],Fi.prototype,"useTeleport"),Ho([m()],Fi.prototype,"usePinchToTeleport"),Ho([m()],Fi.prototype,"useTeleportTarget"),Ho([m()],Fi.prototype,"useTeleportFade"),Ho([m()],Fi.prototype,"showRays"),Ho([m()],Fi.prototype,"showHits");const cA=new S(0,1,0);var hA=Object.defineProperty,wt=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&hA(e,t,o),o};const eh=C("debugwebxr"),dA=C("debugusdz");var $o;const ut=($o=class extends I{constructor(){super(...arguments),a(this,"createVRButton",!0),a(this,"createARButton",!0),a(this,"createSendToQuestButton",!0),a(this,"createQRCode",!0),a(this,"useDefaultControls",!0),a(this,"showControllerModels",!0),a(this,"showHandModels",!0),a(this,"usePlacementReticle",!0),a(this,"customARPlacementReticle"),a(this,"usePlacementAdjustment",!0),a(this,"arScale",1),a(this,"useXRAnchor",!1),a(this,"autoPlace",!1),a(this,"autoCenter",!1),a(this,"useQuicklookExport",!1),a(this,"useDepthSensing",!1),a(this,"useSpatialGrab",!0),a(this,"defaultAvatar"),a(this,"_playerSync"),a(this,"_createdComponentsInSession",[]),a(this,"_usdzExporter"),a(this,"_exitXRMenuButton"),a(this,"_previousXRState",0),a(this,"_spatialGrabRaycaster"),a(this,"_activeWebARSessionRoot",null),a(this,"onAvatarSpawned",n=>{eh&&console.log("WebXR.onAvatarSpawned",n),P.getComponentInChildren(n,Wo)??(i=P.addComponent(n,Wo))}),a(this,"_buttonFactory"),a(this,"_buttons",[])}awake(){ne.getXRSync(this.context)}onEnable(){var n,e;window.location.protocol!=="https:"&&be('<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API" target="_blank">WebXR</a> only works on secure connections (https).'),this.useQuicklookExport&&(P.findObjectOfType(dn)||(eh&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=P.addComponent(this.gameObject,dn),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0)),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(eh&&console.warn("WebXR: No default avatar set, using static default avatar"),this.defaultAvatar=new le("https://cdn.needle.tools/static/avatars/DefaultAvatar.glb")),this.defaultAvatar&&(this._playerSync=this.gameObject.getOrAddComponent(D0),this._playerSync.autoSync=!1),this._playerSync&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,(n=this._playerSync.onPlayerSpawned)==null||n.removeEventListener(this.onAvatarSpawned),(e=this._playerSync.onPlayerSpawned)==null||e.addEventListener(this.onAvatarSpawned))}onDisable(){var n;(n=this._usdzExporter)==null||n.destroy(),this.removeButtons()}async handleOfferSession(){return this.createVRButton&&await ne.isVRSupported()&&this.createVRButton?ne.offerSession("immersive-vr","default",this.context):this.createARButton&&await ne.isARSupported()&&this.createARButton?ne.offerSession("immersive-ar","default",this.context):!1}get session(){return ne.active??null}get sessionMode(){return ne.activeMode??null}get arSessionRoot(){return this._activeWebARSessionRoot}async enterVR(n){return ne.start("immersive-vr",n,this.context)}async enterAR(n){return ne.start("immersive-ar",n,this.context)}exitXR(){ne.stop()}get isActiveWebXR(){return!$o.activeWebXRComponent||$o.activeWebXRComponent===this}onBeforeXR(n,e){var t;if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${(t=$o.activeWebXRComponent)==null?void 0:t.name}). This is ignored: ${this.name}`);return}$o.activeWebXRComponent=this,n=="immersive-ar"&&this.useDepthSensing&&(e.optionalFeatures=e.optionalFeatures||[],e.optionalFeatures.push("depth-sensing"))}async onEnterXR(n){if(!this.isActiveWebXR)return;eh&&console.log("WebXR onEnterXR"),this._previousXRState=Ii.Global.Mask;const e=n.xr.isVR;if(Ii.Global.Set(e?tn.VR:tn.AR),n.xr.isAR){let t=P.findObjectOfType(zo);if(!t)if(this.usePlacementReticle){const s=new A;for(const o of this.context.scene.children)s.add(o);this.context.scene.add(s),t=P.addComponent(s,zo),this._createdComponentsInSession.push(t)}else(eh||F())&&console.warn("WebXR: No WebARSessionRoot found in scene and usePlacementReticle is disabled in WebXR component.");this._activeWebARSessionRoot=t,t&&(t.customReticle=this.customARPlacementReticle,t.arScale=this.arScale,t.arTouchTransform=this.usePlacementAdjustment,t.autoPlace=this.autoPlace,t.autoCenter=this.autoCenter,t.useXRAnchor=this.useXRAnchor)}this.useDefaultControls&&this.setDefaultMovementEnabled(!0),(this.showControllerModels||this.showHandModels)&&this.setDefaultControllerRenderingEnabled(!0),this.useSpatialGrab&&(this._spatialGrabRaycaster=P.findObjectOfType(Ac)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(Ac))),this.createLocalAvatar(n.xr),n.xr.isScreenBasedAR||(this._exitXRMenuButton=this.context.menu.appendChild({label:"Quit XR",onClick:()=>this.exitXR(),icon:"exit_to_app",priority:2e4}))}onUpdateXR(n){this.isActiveWebXR&&this._spatialGrabRaycaster&&(this._spatialGrabRaycaster.enabled=this.useSpatialGrab)}onLeaveXR(n){var e,t;if((e=this._exitXRMenuButton)==null||e.remove(),!!this.isActiveWebXR){Ii.Global.Set(this._previousXRState),(t=this._playerSync)==null||t.destroyInstance();for(const s of this._createdComponentsInSession)s.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),$l(1).then(()=>$o.activeWebXRComponent=null)}}setDefaultMovementEnabled(n){let e=this.gameObject.getComponent(Fi);return!e&&n&&(e=this.gameObject.addComponent(Fi),this._createdComponentsInSession.push(e)),e&&(e.enabled=n),e}setDefaultControllerRenderingEnabled(n){let e=this.gameObject.getComponent(cn);return!e&&n&&(e=this.gameObject.addComponent(cn),this._createdComponentsInSession.push(e),e.createControllerModel=this.showControllerModels,e.createHandModel==this.showHandModels),e&&(e.enabled=n),e}async createLocalAvatar(n){this._playerSync&&n.running&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,await this._playerSync.getInstance())}getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=al.getOrCreate()),this._buttonFactory}handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((Y.isiOS()&&Y.isSafari()||dA)&&this.useQuicklookExport){const n=P.findObjectOfType(dn);if(!n||n&&n.allowCreateQuicklookButton){const e=this.getButtonsFactory().createQuicklookButton();this.addButton(e,50)}}if(this.createARButton){const n=this.getButtonsFactory().createARButton();this.addButton(n,50)}if(this.createVRButton){const n=this.getButtonsFactory().createVRButton();this.addButton(n,50)}}if(this.createSendToQuestButton&&!Y.isQuest()&&ne.isVRSupported().then(n=>{if(!n){const e=this.getButtonsFactory().createSendToQuestButton();this.addButton(e,50)}}),this.createQRCode){const n=vc(ln);if(n&&n.createQRCodeButton===!1)F()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!Y.isMobileDevice()){const e=xo.getOrCreate().createQRCode();this.addButton(e,50)}}}addButton(n,e){this._buttons.push(n),n.setAttribute("priority",e.toString()),this.context.menu.appendChild(n)}removeButtons(){for(const n of this._buttons)n.remove();this._buttons.length=0}},a($o,"activeWebXRComponent",null),$o);wt([m()],ut.prototype,"createVRButton"),wt([m()],ut.prototype,"createARButton"),wt([m()],ut.prototype,"createSendToQuestButton"),wt([m()],ut.prototype,"createQRCode"),wt([m()],ut.prototype,"useDefaultControls"),wt([m()],ut.prototype,"showControllerModels"),wt([m()],ut.prototype,"showHandModels"),wt([m()],ut.prototype,"usePlacementReticle"),wt([m(le)],ut.prototype,"customARPlacementReticle"),wt([m()],ut.prototype,"usePlacementAdjustment"),wt([m()],ut.prototype,"arScale"),wt([m()],ut.prototype,"useXRAnchor"),wt([m()],ut.prototype,"autoPlace"),wt([m()],ut.prototype,"autoCenter"),wt([m()],ut.prototype,"useQuicklookExport"),wt([m()],ut.prototype,"useDepthSensing"),wt([m()],ut.prototype,"useSpatialGrab"),wt([m(le)],ut.prototype,"defaultAvatar");let lp=ut;const cp=C("debugusdzbehaviours");class z0{constructor(){a(this,"behaviours",[]),a(this,"behaviourComponents",[]),a(this,"behaviourComponentsCopy",[]),a(this,"audioClips",[]),a(this,"audioClipsCopy",[]),a(this,"targetUuids",new Set)}get extensionName(){return"Behaviour"}addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+pa.getName(e);return this.audioClips.push({clipUrl:e,filesKey:t}),t}getAllTargetUuids(){return this.targetUuids}onBeforeBuildDocument(e){if(!e.root)return Promise.resolve();const t=[];return e.root.traverse(s=>{P.foreachComponent(s,o=>{var r;const l=o;if(typeof l.createBehaviours=="function"||typeof l.beforeCreateDocument=="function"||typeof l.afterCreateDocument=="function"||typeof l.afterSerialize=="function"){this.behaviourComponents.push(l);const c=(r=l.beforeCreateDocument)==null?void 0:r.call(l,this,e);c instanceof Promise&&t.push(c)}},!1)}),cp&&console.log("onBeforeBuildDocument: all components",this.behaviourComponents),Promise.all(t)}onExportObject(e,t,s){var o;for(const r of this.behaviourComponents)(o=r.createBehaviours)==null||o.call(r,this,t,s)}onAfterBuildDocument(e){for(const p of this.behaviourComponents)typeof p.afterCreateDocument=="function"&&p.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,s=new Set,o=new Set,r=new Set,l=cp;let c=`graph LR
1212
- `,h="";function d(p){if(p instanceof Fo){l&&(c+=`subgraph Group_${p.id}
1213
- `);for(const g of p.actions)l&&(c+=`${p.id}[${p.id}] -- ${p.type},loops:${p.loops} --> ${g.id}[${g.id}]
1214
- `),d(g);l&&(c+=`end
1215
- `)}else if(p instanceof Os){p.tokenId==="StartAnimation"&&r.add(p);let g=p.tokenId;p.type!==void 0&&(g+=":"+p.type);const f=p.affectedObjects;if(f)if(Array.isArray(f))for(const v of f)s.add(v),l&&(h+=`${p.id}[${p.id}
1216
- ${g}] -- ${g} --> ${v.uuid}(("${v.displayName||v.name||v.uuid}"))
1217
- `);else typeof f=="object"?(s.add(f),l&&(h+=`${p.id}[${p.id}
1218
- ${g}] -- ${g} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
1219
- `)):typeof f=="string"&&s.add({uuid:f});const y=p.xFormTarget;y&&(typeof y=="object"?(s.add(y),l&&(h+=`${p.id}[${p.id}
1220
- ${g}] -- ${g} --> ${y.uuid}(("${y.displayName||y.name||y.uuid}"))
1221
- `)):typeof y=="string"&&s.add({uuid:y}))}}function u(p,g){if(Array.isArray(p))for(const f of p)u(f,g);else if(p instanceof nl){let f=p.tokenId;p.type!==void 0&&(f+=":"+p.type),typeof p.targetId=="object"&&(t.add(p.targetId),l&&(h+=`${p.targetId.uuid}(("${p.targetId.displayName}")) --> ${p.id}[${p.id}
1222
- ${f}]
1223
- `)),l&&(c+=`${p.id}((${p.id})) -- ${f} --> ${g.id}[${g.tokenId||g.id}]
1224
- `)}}for(const p of this.behaviours)l&&(c+=`subgraph ${p.id}
1225
- `),d(p.action),u(p.trigger,p.action),l&&(c+=`end
1226
- `);l&&(c+=`
1227
- `+h),l&&(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(c),navigator.clipboard.writeText(c)));{let p=`gantt
1228
- title Animations
1229
- dateFormat X
1230
- axisFormat %s
1231
- `;const g=Array.from(r),f=new Set;for(const _ of g)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const w of _.affectedObjects)f.add(w);else f.add(_.affectedObjects);l&&(p+=`section ${_.animationName} (${_.id})
1232
- `,p+=`${_.id} : ${_.start}, ${_.duration}s
1233
- `)}l&&r.size&&console.log(p);const y=new Set;for(const _ of f){_.getPath||console.error("USDZExporter: Animation target object has no getPath method. This is likely a bug",_);let w=_.getPath();w.startsWith("<")&&(w=w.substring(1)),w.endsWith(">")&&(w=w.substring(0,w.length-1)),y.add({path:w,obj:_})}const v=Array.from(y).sort((_,w)=>_.path.length-w.path.length),b=new Array;for(let _=0;_<v.length;_++)for(let w=_+1;w<v.length;w++)if(v[w].path.startsWith(v[_].path)){const x=v[w],M=v[_];b.push({child:x.obj.displayName+" ("+x.path+")",parent:M.obj.displayName+" ("+M.path+")"})}b.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:b,playAnimationActions:r})}for(const p of new Set([...t,...s]))if(Array.isArray(p))for(const g of p)o.add(g.uuid);else o.add(p.uuid);cp&&console.log("All Behavior trigger sources and action targets",t,s,o),this.targetUuids=new Set(o)}onAfterHierarchy(e,t){var s;if((s=this.behaviours)!=null&&s.length){t.beginBlock('def Scope "Behaviors"');for(const o of this.behaviours)o.writeTo(this,e.document,t);t.closeBlock()}}async onAfterSerialize(e){cp&&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:s}of this.audioClipsCopy){if(e.files[s])return;const o=await(await(await fetch(t)).blob()).arrayBuffer(),r=new Uint8Array(o);e.files[s]=r}this.behaviourComponentsCopy.length=0,this.audioClipsCopy.length=0}}class N0{get extensionName(){return"Physics"}onExportObject(e,t,s){const o=P.getComponents(e,ht).filter(h=>h.enabled),r=P.getComponents(e,ci).filter(h=>h.enabled&&!h.isTrigger);let l=o.length>0?o[0]:null;const c=r.length>0?r[0]:null;c&&!l&&(l=new ht,l.isKinematic=!0),l&&t.addEventListener("serialize",(h,d)=>{var u,p,g;if(l){if(h.appendLine(),h.beginBlock('def RealityKitComponent "RigidBody"',"{",!0),l.useGravity||h.appendLine("bool gravityEnabled = 0"),h.appendLine('uniform token info:id = "RealityKit.RigidBody"'),l.isKinematic&&h.appendLine('token motionType = "Kinematic"'),h.beginBlock('def RealityKitStruct "massFrame"',"{",!0),h.appendLine(`float m_mass = ${l.mass}`),h.beginBlock('def RealityKitStruct "m_pose"',"{",!0),h.appendLine(`float3 position = (${l.centerOfMass.x}, ${l.centerOfMass.y}, ${l.centerOfMass.z})`),h.closeBlock("}"),h.closeBlock("}"),r.length>0){const f=r[0];h.beginBlock('def RealityKitStruct "material"',"{",!0);const y=f.sharedMaterial;y&&y.dynamicFriction!==void 0&&h.appendLine(`double dynamicFriction = ${(u=f.sharedMaterial)==null?void 0:u.dynamicFriction}`),y&&y.bounciness!==void 0&&h.appendLine(`double restitution = ${(p=f.sharedMaterial)==null?void 0:p.bounciness}`),y&&y.staticFriction!==void 0&&h.appendLine(`double staticFriction = ${(g=f.sharedMaterial)==null?void 0:g.staticFriction}`),h.closeBlock("}")}h.closeBlock("}")}}),c&&(t.addEventListener("serialize",(h,d)=>{var u;h.beginBlock('def RealityKitComponent "Collider"',"{",!0),h.appendLine("uint group = 1"),h.appendLine('uniform token info:id = "RealityKit.Collider"'),h.appendLine("uint mask = 4294967295");const p=c.isTrigger?"Trigger":"Default";if(h.appendLine(`token type = "${p}"`),h.beginBlock('def RealityKitStruct "Shape"',"{",!0),c instanceof qa){const g=c;h.appendLine('token shapeType = "Sphere"'),h.appendLine(`float radius = ${g.radius}`)}else if(c instanceof Tu){const g=c;h.appendLine('token shapeType = "Box"'),h.appendLine(`float3 extent = (${g.size.x}, ${g.size.y}, ${g.size.z})`)}else if(c instanceof Un){const g=c;h.appendLine('token shapeType = "Capsule"'),h.appendLine(`float radius = ${g.radius}`),h.appendLine(`float height = ${g.height}`)}else if(c instanceof jo&&(u=c.sharedMesh)!=null&&u.geometry){const g=c.sharedMesh.geometry;g.boundingBox||g.computeBoundingBox();const f=c.sharedMesh.geometry.boundingBox;f&&(h.appendLine('token shapeType = "Box"'),h.appendLine(`float3 extent = (${f.max.x-f.min.x}, ${f.max.y-f.min.y}, ${f.max.z-f.min.z})`),console.log("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. MeshCollider will be exported as Box",c))}else console.warn("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. Ignoring collider:",c);h.beginBlock('def RealityKitStruct "pose"',"{",!0),h.closeBlock("}"),h.closeBlock("}"),h.closeBlock("}")}),r.length>1&&console.log("WARNING: Multiple colliders detected. visionOS / iOS can only support objects with a single collider, only exporting the first collider: ",c))}}const uA=C("debugshadowcomponents");Vv.prototype.interactable={get(){return this.interactive},set(n){this.interactable=n}};class ls extends I{constructor(){super(...arguments),a(this,"_shadowComponent",null),a(this,"_controlsChildLayout",!0),a(this,"_root"),a(this,"_parentComponent")}isRoot(){var e;return((e=this.Root)==null?void 0:e.gameObject)===this.gameObject}get canvas(){const e=this.Root;return e!=null&&e.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){Jt.markUIDirty(this.context)}get shadowComponent(){return this._shadowComponent}set shadowComponent(e){this._shadowComponent=e}get controlsChildLayout(){return this._controlsChildLayout}set controlsChildLayout(e){this._controlsChildLayout=e,this.shadowComponent&&(this.shadowComponent.autoLayout=e)}get Root(){return this._root===void 0&&(this._root=P.getComponentInParent(this.gameObject,th)),this._root}__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this.shadowComponent=null,this._root=void 0,this._parentComponent=void 0,this}onEnable(){super.onEnable()}addShadowComponent(e,t){var s;if(!e)return;this.removeShadowComponent();const o=this.isRoot()?this.gameObject:this.gameObject.parent;if(this._parentComponent=P.getComponentInParent(o,ls),!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[Pi]=this,this.setShadowComponentOwner(e);let r=!1;if(((s=this.Root)==null?void 0:s.gameObject)===this.gameObject)this.gameObject.add(e);else{const l=this._parentComponent.shadowComponent;l&&(l?.add(e),r=!0)}this.shadowComponent=e,t&&t.shadowComponent&&this.shadowComponent&&t.shadowComponent.add(this.shadowComponent),pc&&e.add(new wi(.5)),this.onAfterAddedToScene(),r&&fO(),uA&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Pi]===void 0||e[Pi]===this)&&(e[Pi]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,s){if(e&&e[Pi]===t){s(e);for(const o of e.children)this.traverseOwnedShadowComponents(o,t,s)}}removeShadowComponent(){this.shadowComponent&&this.shadowComponent.removeFromParent()}onAfterAddedToScene(){}setInteractable(e){this.shadowComponent&&(this.shadowComponent.interactable=e)}}class th extends ls{awake(){super.awake()}}var pA=Object.defineProperty,mA=Object.getOwnPropertyDescriptor,ih=(n,e,t,s)=>{for(var o=s>1?void 0:s?mA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&pA(e,t,o),o};const W0=C("debugui"),V0=C("debuguilayout");class F1{constructor(){a(this,"width"),a(this,"height")}}class U1{constructor(){a(this,"x"),a(this,"y"),a(this,"width"),a(this,"height")}}const Ms=new S,sh=new se,hp=new H,dl=class uC extends ls{constructor(){super(...arguments),a(this,"_anchoredPosition"),a(this,"sizeDelta",new re(100,100)),a(this,"pivot",new re(.5,.5)),a(this,"anchorMin",new re(0,0)),a(this,"anchorMax",new re(1,1)),a(this,"minWidth"),a(this,"minHeight"),a(this,"lastMatrix"),a(this,"rectBlock"),a(this,"_transformNeedsUpdate",!1),a(this,"_initialPosition"),a(this,"_parentRectTransform"),a(this,"_lastUpdateFrame",-1),a(this,"_lastAnchoring"),a(this,"_createdBlocks",[]),a(this,"_createdTextBlocks",[])}get parent(){return this._parentRectTransform}get translation(){return this.gameObject.position}get rotation(){return this.gameObject.quaternion}get scale(){return this.gameObject.scale}get anchoredPosition(){return this._anchoredPosition||(this._anchoredPosition=new re),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}get width(){let e=this.sizeDelta.x;if(this.anchorMin.x!==this.anchorMax.x&&this._parentRectTransform){const t=this._parentRectTransform.width,s=this.anchorMax.x-this.anchorMin.x;e=t*s,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,s=this.anchorMax.y-this.anchorMin.y;e=t*s,e+=this.sizeDelta.y}return this.minHeight!==void 0&&e<this.minHeight?this.minHeight:e}awake(){super.awake(),this._lastUpdateFrame=-1,this._parentRectTransform=void 0,this.rectBlock=new A,this.rectBlock.name=this.name,this.lastMatrix=new se,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new re),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(){var e;super.onEnable(),this.rectBlock||(this.rectBlock=new A),this.lastMatrix||(this.lastMatrix=new se),this._lastAnchoring||(this._lastAnchoring=new re),this._initialPosition||(this._initialPosition=new S),this._anchoredPosition||(this._anchoredPosition=new re),this.addShadowComponent(this.rectBlock),this._transformNeedsUpdate=!0,(e=this.canvas)==null||e.registerTransform(this)}onDisable(){var e;super.onDisable(),this.removeShadowComponent(),(e=this.canvas)==null||e.unregisterTransform(this)}onParentRectTransformChanged(e){this._transformNeedsUpdate||this.onApplyTransform(V0?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(V0&&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){var t;if(this.context.time.frameCount===this._lastUpdateFrame)return;this._lastUpdateFrame=this.context.time.frameCount;const s=this.shadowComponent;if(!s)return;this.gameObject.parent?this._parentRectTransform=P.getComponentInParent(this.gameObject.parent,uC):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,V0&&console.warn("RectTransform \u2192 ApplyTransform",this.name+" because "+e),this.isRoot()?this.Root.screenspace||(s.rotation.y=Math.PI):(s.matrix.identity(),s.matrixAutoUpdate=!1,Ms.set(0,0,0),this.applyPivot(Ms),s.matrix.setPosition(Ms.x,Ms.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&(hp.copy(this.gameObject.quaternion),hp.x*=-1,hp.z*=-1,sh.makeRotationFromQuaternion(hp),s.matrix.premultiply(sh)),Ms.set(0,0,0),this.applyAnchoring(Ms),(t=this.canvas)!=null&&t.screenspace?Ms.z+=.1:Ms.z+=.01,sh.identity(),sh.setPosition(Ms.x,Ms.y,Ms.z),s.matrix.premultiply(sh),s.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const o=!0;for(const r of Jd(this.gameObject,ls,o,1)){if(r===this||!r.activeAndEnabled)continue;const l=r;l.onParentRectTransformChanged&&l.onParentRectTransformChanged(this)}}applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new re);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 s=this._parentRectTransform;if(s){let o=0;const r=1-this.anchorMax.y-this.anchorMin.y;o-=s.height*.5*r,e.y+=o;let l=0;const c=1-this.anchorMax.x-this.anchorMin.x;l-=s.width*.5*c,e.x+=l}}applyPivot(e){if(this.pivot&&!this.isRoot()){const t=this.pivot.x-.5;e.x-=t*this.sizeDelta.x*this.gameObject.scale.x;const s=this.pivot.y-.5;e.y-=s*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}createNewBlock(e){e={...this.getBasicOptions(),...e},W0&&console.log(this.name,e);const t=new Vv(e);return this._createdBlocks.push(t),t}createNewText(e){W0&&console.log(e),e={...this.getBasicOptions(),...e},W0&&console.log(this.name,e);const t=new Wv(e);return this._createdTextBlocks.push(t),t}};ih([m(re)],dl.prototype,"anchoredPosition",1),ih([m(re)],dl.prototype,"sizeDelta",2),ih([m(re)],dl.prototype,"pivot",2),ih([m(re)],dl.prototype,"anchorMin",2),ih([m(re)],dl.prototype,"anchorMax",2);let Rs=dl;var gA=Object.defineProperty,z1=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&gA(e,t,o),o};class ul extends I{constructor(){super(...arguments),a(this,"effectColor"),a(this,"effectDistance")}}z1([m(ce)],ul.prototype,"effectColor"),z1([m(re)],ul.prototype,"effectDistance");var fA=Object.defineProperty,yA=Object.getOwnPropertyDescriptor,N1=(n,e,t,s)=>{for(var o=s>1?void 0:s?yA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&fA(e,t,o),o};const dp={backgroundColor:new ae(1,1,1),backgroundOpacity:1,borderColor:new ae(1,1,1),borderOpacity:1};var Vr;const H0=(Vr=class extends ls{constructor(){super(...arguments),a(this,"_alphaFactor",1),a(this,"sRGBColor",new ae(1,0,1)),a(this,"raycastTarget",!0),a(this,"uiObject",null),a(this,"_color",null),a(this,"_rect",null),a(this,"_stateManager",null),a(this,"_currentlyCreatingPanel",!1)}get isGraphic(){return!0}get color(){return this._color||(this._color=new ce(1,1,1,1)),this._color}set color(n){(!this._color||this._color.r!==n.r||this._color.g!==n.g||this._color.b!==n.b||this._color.alpha!==n.alpha)&&(this._color||(this._color=new ce(1,1,1,1)),this._color.copy(n),this.onColorChanged())}setAlphaFactor(n){this._alphaFactor=n,this.onColorChanged()}get alphaFactor(){return this._alphaFactor}onColorChanged(){this.uiObject&&(this.sRGBColor.copy(this._color),this.sRGBColor.convertLinearToSRGB(),dp.backgroundColor=this.sRGBColor,dp.backgroundOpacity=this._color.alpha*this._alphaFactor,this.applyEffects(dp,this._alphaFactor),this.uiObject.set(dp),this.markDirty())}get m_Color(){return this._color}get rectTransform(){if(this._rect||(this._rect=P.getComponent(this.gameObject,Rs)),!this._rect)throw new Error("Not Supported: Make sure to add a RectTransform component before adding a UI Graphic component.");return this._rect}onParentRectTransformChanged(){var n;(n=this.uiObject)==null||n.set({width:this.rectTransform.width,height:this.rectTransform.height}),this.markDirty()}__internalNewInstanceCreated(n){return super.__internalNewInstanceCreated(n),this._rect=null,this.uiObject=null,this._stateManager=null,this._color&&(this._color=this._color.clone()),this}setState(n){this.makePanel(),this.uiObject&&(this.uiObject.setState(n),this==null||this.markDirty())}setupState(n){this.makePanel(),this.uiObject&&(this._stateManager||(this._stateManager=new yO(this.uiObject)),this.uiObject.setupState(n.state,n.attributes))}setOptions(n){this.makePanel(),this.uiObject&&this.uiObject.set(n)}awake(){super.awake(),this.makePanel(),Ha(this,"_color",()=>yT(this,this.onColorChanged))}onEnable(){var n;super.onEnable(),this.uiObject&&((n=this.rectTransform.shadowComponent)==null||n.add(this.uiObject),this.addShadowComponent(this.uiObject,this.rectTransform))}onDisable(){super.onDisable(),this.uiObject&&this.removeShadowComponent()}makePanel(){if(this.uiObject||this._currentlyCreatingPanel)return;this._currentlyCreatingPanel=!0;const n={backgroundColor:this.color,backgroundOpacity:this.color.alpha,offset:.015};this.onBeforeCreate(n),this.applyEffects(n),this.onCreate(n),this.controlsChildLayout=!1,this._currentlyCreatingPanel=!1,this.onAfterCreated(),this.onColorChanged()}onBeforeCreate(n){}onCreate(n){this.uiObject=this.rectTransform.createNewBlock(n),this.uiObject.name=this.name}onAfterCreated(){}applyEffects(n,e=1){var t;const s=(t=this.gameObject)==null?void 0:t.getComponent(ul);s&&(s.effectDistance&&(n.borderWidth=Math.max(Math.abs(s.effectDistance.x),Math.abs(s.effectDistance.y))),s.effectColor&&(n.borderColor=s.effectColor,n.borderOpacity=s.effectColor.alpha*e))}async setTexture(n){if(this.setOptions({backgroundOpacity:0}),n){if(Vr.textureCache.has(n))n=Vr.textureCache.get(n);else if(!n.isRenderTargetTexture){const e=n.clone();e.colorSpace=xn,Vr.textureCache.set(n,e),n=e}this.setOptions({backgroundImage:n,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),Xe.assignTextureLOD(n,0).then(e=>{e instanceof je&&(n&&Vr.textureCache.set(n,e),this.setOptions({backgroundImage:e}),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)}},a(Vr,"textureCache",new Map),Vr);N1([m(ce)],H0.prototype,"color",1),N1([m()],H0.prototype,"raycastTarget",2);let nh=H0;class oh extends nh{constructor(){super(...arguments),a(this,"_flippedObject",!1)}onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var vA=Object.defineProperty,bA=Object.getOwnPropertyDescriptor,Xn=(n,e,t,s)=>{for(var o=s>1?void 0:s?bA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&vA(e,t,o),o};const Hr=C("debugtext");var pt=(n=>(n[n.UpperLeft=0]="UpperLeft",n[n.UpperCenter=1]="UpperCenter",n[n.UpperRight=2]="UpperRight",n[n.MiddleLeft=3]="MiddleLeft",n[n.MiddleCenter=4]="MiddleCenter",n[n.MiddleRight=5]="MiddleRight",n[n.LowerLeft=6]="LowerLeft",n[n.LowerCenter=7]="LowerCenter",n[n.LowerRight=8]="LowerRight",n))(pt||{}),W1=(n=>(n[n.Normal=0]="Normal",n[n.Bold=1]="Bold",n[n.Italic=2]="Italic",n[n.BoldAndItalic=3]="BoldAndItalic",n))(W1||{});class Ft extends nh{constructor(){super(...arguments),a(this,"alignment",0),a(this,"verticalOverflow",0),a(this,"horizontalOverflow",0),a(this,"lineSpacing",1),a(this,"supportRichText",!1),a(this,"font"),a(this,"fontStyle",0),a(this,"sRGBTextColor",new ae(1,0,1)),a(this,"_text",""),a(this,"_fontSize",12),a(this,"_textMeshUi",null),a(this,"_didHandleTextRenderOnTop",!1)}setAlphaFactor(e){var t;super.setAlphaFactor(e),(t=this.uiObject)==null||t.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){var t;this._fontSize=e,(t=this.uiObject)==null||t.set({fontSize:e})}onColorChanged(){var e;this.sRGBTextColor.copy(this.color),this.sRGBTextColor.convertLinearToSRGB(),(e=this.uiObject)==null||e.set({color:this.sRGBTextColor,fontOpacity:this.color.alpha})}onParentRectTransformChanged(){super.onParentRectTransformChanged(),this.uiObject&&this.updateOverflow()}onBeforeCanvasRender(e){this.updateOverflow()}updateOverflow(){var e;const t=(e=this.uiObject)==null?void 0:e._overflow;t&&(t._needsUpdate=!0)}onCreate(e){Hr&&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,Hr&&(e.backgroundColor=16750848,e.backgroundOpacity=.5);const t=this.rectTransform;e={...e,...this.getTextOpts()},this.getAlignment(e),Hr&&(e.backgroundColor=Math.random()*16777215,e.backgroundOpacity=.1),this.uiObject=t.createNewText(e),this.feedText(this.text,this.supportRichText)}onAfterAddedToScene(){super.onAfterAddedToScene(),this.handleTextRenderOnTop()}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(){var e;super.onEnable(),this._didHandleTextRenderOnTop=!1,this.uiObject&&this.uiObject.addAfterUpdate(()=>{this.setShadowComponentOwner(this.uiObject),this.markDirty()}),setTimeout(()=>this.markDirty(),10),(e=this.canvas)==null||e.registerEventReceiver(this)}onDisable(){var e;super.onDisable(),(e=this.canvas)==null||e.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){var s,o,r;if(Hr&&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 l=this.getNextTag(e);if(l){if(l.startIndex>0){for(let d=this.uiObject.children.length-1;d>=0;d--){const u=this.uiObject.children[d];u.isUI&&(this.uiObject.remove(u),u.clear())}const h=new Lm({textContent:e.substring(0,l.startIndex),color:"inherit"});this.uiObject.add(h)}}else{this.uiObject.textContent="",this.setOptions({textContent:e});return}const c=[];for(;l;){const h=this.getNextTag(e,l.endIndex),d={fontFamily:(s=this.uiObject)==null?void 0:s.get("fontFamily"),color:"inherit",textContent:""};if(h){d.textContent=this.getText(e,l,h),this.handleTag(l,d,c);const u=new Lm(d);(o=this.uiObject)==null||o.add(u)}else{d.textContent=e.substring(l.endIndex),this.handleTag(l,d,c);const u=new Lm(d);(r=this.uiObject)==null||r.add(u)}l=h}}}handleTextRenderOnTop(){this._didHandleTextRenderOnTop||(this._didHandleTextRenderOnTop=!0,this.startCoroutine(this.renderOnTopCoroutine()))}*renderOnTopCoroutine(){if(!this.canvas)return;const e=[],t=this.canvas,s={renderOnTop:t.renderOnTop,depthWrite:t.depthWrite,doubleSided:t.doubleSided};for(;;){let o=!1;if(this._textMeshUi)for(let r=0;r<this._textMeshUi.length;r++){if(e[r]===!0)continue;o=!0;const l=this._textMeshUi[r];l.textContent&&(xu(l,s),e[r]=!0)}if(!o)break;yield}}handleTag(e,t,s){if(!e.isEndTag){if(e.type.includes("color")){const o=new $0(e,{color:t.color});if(s.push(o),e.type.length>6){const r=parseInt("0x"+e.type.substring(7));t.color=r}else t.color=new ae(1,1,1)}else if(e.type=="b"){this.setFont(t,1);const o=new $0(e,{fontWeight:700});s.push(o)}else if(e.type=="i"){this.setFont(t,2);const o=new $0(e,{fontStyle:"italic"});s.push(o)}}}getText(e,t,s){return e.substring(t.endIndex,s.startIndex)}getNextTag(e,t=0){const s=e.indexOf("<",t),o=e.indexOf(">",s);if(s>=0&&o>=0){const r=e.substring(s+1,o);return{type:r,startIndex:s,endIndex:o+1,isEndTag:r.startsWith("/")}}return null}setFont(e,t){if(!this.font)return;const s=this.font,o=this.getFamilyNameWithCorrectSuffix(s,t);Hr&&console.log("Selected font family:"+o);let r=Hv.getFontFamily(o);switch(r||(r=Hv.addFontFamily(o)),e.fontFamily=r,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 l=r.getVariant(e.fontWeight,e.fontStyle);if(!l){let c=o;c!=null&&c.endsWith("-msdf.json")||(c+="-msdf.json");let h=o;h!=null&&h.endsWith(".png")||(h+=".png"),l=r.addVariant(e.fontWeight,e.fontStyle,c,h),l?.addEventListener("ready",()=>{this.markDirty()})}}getFamilyNameWithCorrectSuffix(e,t){var s;const o=e.lastIndexOf("-");if(o<0)return e;const r=(s=e.substring(o+1))==null?void 0:s.toLowerCase();if(_A.includes(r))return Hr&&console.warn("Unsupported font style: "+r),e;const l=e.lastIndexOf("/");let c=e;l>=0&&(c=c.substring(l+1));const h=c[0]===c[0].toUpperCase(),d=e.substring(0,o);switch(Hr&&console.log("Select font: ",e,W1[t],c,h,d),t){case 0:return h?d+"-Regular":d+"-regular";case 1:return h?d+"-Bold":d+"-bold";case 2:return h?d+"-Italic":d+"-italic";case 3:return h?d+"-BoldItalic":d+"-bolditalic";default:return e}}}Xn([m()],Ft.prototype,"alignment",2),Xn([m()],Ft.prototype,"verticalOverflow",2),Xn([m()],Ft.prototype,"horizontalOverflow",2),Xn([m()],Ft.prototype,"lineSpacing",2),Xn([m()],Ft.prototype,"supportRichText",2),Xn([m(URL)],Ft.prototype,"font",2),Xn([m()],Ft.prototype,"fontStyle",2),Xn([m()],Ft.prototype,"text",1),Xn([m()],Ft.prototype,"fontSize",1);class $0{constructor(e,t){a(this,"tag"),a(this,"previousValues"),this.tag=e,this.previousValues=t}}const _A=["medium","mediumitalic","black","blackitalic","thin","thinitalic","extrabold","light","lightitalic","semibold"];class $r{constructor(e){a(this,"id"),a(this,"content",""),a(this,"font",[]),a(this,"pointSize",144),a(this,"width"),a(this,"height"),a(this,"depth"),a(this,"wrapMode"),a(this,"horizontalAlignment"),a(this,"verticalAlignment"),a(this,"material"),this.id=e}static getId(){return this.global_id++}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}writeTo(e,t){var s;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=[]),(s=this.font)==null||s.push("sans-serif"));const o=this.font.map(r=>`"${r}"`).join(", ");t.appendLine(`string[] font = [ ${o} ]`),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/${v0(this.material)}>`),t.closeBlock()}}a($r,"global_id",0);class G0{static singleLine(e,t,s){const o=new $r("text_"+$r.getId());return o.content=e,t&&(o.pointSize=t),s&&(o.depth=s),o}static multiLine(e,t,s,o,r,l){const c=new $r("text_"+$r.getId());return c.content=e,c.width=t,c.height=s,c.horizontalAlignment=o,c.verticalAlignment=r,l!==void 0&&(c.wrapMode=l),c}}const wA=new se().makeRotationY(Math.PI),xA=new se().makeScale(-1,1,-1);class up{get extensionName(){return"text"}exportText(e,t,s){const o=P.getComponent(e,Ft);if(!o)return;const r=P.getComponent(e,Rs);let l=100,c=100;r&&(l=r.width,c=r.height);const h=wA.clone();r&&h.premultiply(xA),t.setMatrix(h);const d=o.color.clone();t.material=new ft({color:d,emissive:d}),t.addEventListener("serialize",(u,p)=>{let g=o.text;g=g.replace(/\r/g,""),g=g.replace(/\n/g,"\\n");const f=G0.multiLine(g,l,c,"center","bottom","flowing");this.setTextAlignment(f,o.alignment),this.setOverflow(f,o),t.material&&(f.material=t.material),f.pointSize=this.convertToTextSize(o.fontSize),f.depth=.001,f.writeTo(void 0,u)})}convertToTextSize(e){return 1/.0502*144*e}setOverflow(e,t){t.horizontalOverflow?e.wrapMode="singleLine":e.wrapMode="flowing"}setTextAlignment(e,t){switch(t){case pt.LowerLeft:case pt.MiddleLeft:case pt.UpperLeft:e.horizontalAlignment="left";break;case pt.LowerCenter:case pt.MiddleCenter:case pt.UpperCenter:e.horizontalAlignment="center";break;case pt.LowerRight:case pt.MiddleRight:case pt.UpperRight:e.horizontalAlignment="right";break}switch(t){case pt.LowerLeft:case pt.LowerCenter:case pt.LowerRight:e.verticalAlignment="bottom";break;case pt.MiddleLeft:case pt.MiddleCenter:case pt.MiddleRight:e.verticalAlignment="middle";break;case pt.UpperLeft:case pt.UpperCenter:case pt.UpperRight:e.verticalAlignment="top";break}}}var SA=Object.defineProperty,it=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&SA(e,t,o),o};const V1=C("debuguilayout");class Gr{constructor(){a(this,"left",0),a(this,"right",0),a(this,"top",0),a(this,"bottom",0)}get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}it([m()],Gr.prototype,"left"),it([m()],Gr.prototype,"right"),it([m()],Gr.prototype,"top"),it([m()],Gr.prototype,"bottom");class Ui extends I{constructor(){super(...arguments),a(this,"_rectTransform",null),a(this,"_needsUpdate",!1),a(this,"childAlignment",0),a(this,"reverseArrangement",!1),a(this,"spacing",0),a(this,"padding"),a(this,"minWidth",0),a(this,"minHeight",0),a(this,"flexibleHeight",0),a(this,"flexibleWidth",0),a(this,"preferredHeight",0),a(this,"preferredWidth",0)}get rectTransform(){return this._rectTransform}onParentRectTransformChanged(e){this._needsUpdate=!0}get isDirty(){return this._needsUpdate}get isLayoutGroup(){return!0}updateLayout(){this._rectTransform&&(V1&&console.warn("Layout Update",this.context.time.frame,this.name),this._needsUpdate=!1,this.onCalculateLayout(this._rectTransform))}start(){this._needsUpdate=!0}onEnable(){V1&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(Rs);const e=this.gameObject.getComponentInParent(pl);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(pl);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}it([m()],Ui.prototype,"childAlignment"),it([m()],Ui.prototype,"reverseArrangement"),it([m()],Ui.prototype,"spacing"),it([m(Gr)],Ui.prototype,"padding"),it([m()],Ui.prototype,"minWidth"),it([m()],Ui.prototype,"minHeight"),it([m()],Ui.prototype,"flexibleHeight"),it([m()],Ui.prototype,"flexibleWidth"),it([m()],Ui.prototype,"preferredHeight"),it([m()],Ui.prototype,"preferredWidth");class Go extends Ui{constructor(){super(...arguments),a(this,"childControlHeight",!0),a(this,"childControlWidth",!0),a(this,"childForceExpandHeight",!1),a(this,"childForceExpandWidth",!1),a(this,"childScaleHeight",!1),a(this,"childScaleWidth",!1)}onCalculateLayout(e){var t;const s=this.primaryAxis,o=e.width;let r=o;const l=e.height;let c=l;r-=this.padding.horizontal,c-=this.padding.vertical,s==="x"?this.padding.horizontal:this.padding.vertical;const h=s==="x",d=h?"y":"x",u=h?this.childControlWidth:this.childControlHeight,p=h?this.childControlHeight:this.childControlWidth,g=h?this.childForceExpandWidth:this.childForceExpandHeight,f=h?this.childForceExpandHeight:this.childForceExpandWidth,y=h?c:r,v=h?o:l,b=.5*(h?this.childAlignment%3:Math.floor(this.childAlignment/3));let _=0;h?_+=this.padding.left:_+=this.padding.top;let w=0,x=0;for(let B=0;B<this.gameObject.children.length;B++){const z=this.gameObject.children[B],j=P.getComponent(z,Rs);j!=null&&j.activeAndEnabled&&(x+=1,h?w+=j.width:w+=j.height)}let M=0;const k=this.spacing*(x-1);if(g||u){let B=0;h?B=r-=k:B=c-=k,x>0&&(M=B/x)}let T=0;T+=this.padding.left,T-=this.padding.right,b!==0&&(_=v-w,_*=b,_-=k*b,h?(_-=this.padding.right*b,_+=this.padding.left*(1-b),_<this.padding.left&&(_=this.padding.left)):(_-=this.padding.bottom*b,_+=this.padding.top*(1-b),_<this.padding.top&&(_=this.padding.top)));let L=1;for(let B=0;B<this.gameObject.children.length;B++){const z=this.gameObject.children[B],j=P.getComponent(z,Rs);if(j!=null&&j.activeAndEnabled){(t=j.pivot)==null||t.set(.5,.5),j.anchorMin.set(0,1),j.anchorMax.set(0,1);const V=o*.5+T*.5;j.anchoredPosition.x!==V&&(j.anchoredPosition.x=V);const G=l*-.5;j.anchoredPosition.y!==G&&(j.anchoredPosition.y=G),f&&p&&j.sizeDelta[d]!==y&&(j.sizeDelta[d]=y),g&&u&&j.sizeDelta[s]!==M&&(j.sizeDelta[s]=M);const E=h?j.width:j.height,U=E*.5;if(_+=U,g){const te=M*L-M*.5;te>_&&(_=te-M*.5+E+this.padding.left,_-=U)}let $=_;s==="y"&&($=-$),j.anchoredPosition[s]!==$&&(j.anchoredPosition[s]=$),_+=U,_+=this.spacing,L+=1}}}}it([m()],Go.prototype,"childControlHeight"),it([m()],Go.prototype,"childControlWidth"),it([m()],Go.prototype,"childForceExpandHeight"),it([m()],Go.prototype,"childForceExpandWidth"),it([m()],Go.prototype,"childScaleHeight"),it([m()],Go.prototype,"childScaleWidth");class q0 extends Go{get primaryAxis(){return"y"}}class X0 extends Go{get primaryAxis(){return"x"}}class Q0 extends Ui{onCalculateLayout(){}}var CA=Object.defineProperty,PA=Object.getOwnPropertyDescriptor,hn=(n,e,t,s)=>{for(var o=s>1?void 0:s?PA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&CA(e,t,o),o},H1=(n=>(n[n.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",n[n.ScreenSpaceCamera=1]="ScreenSpaceCamera",n[n.WorldSpace=2]="WorldSpace",n[n.Undefined=-1]="Undefined",n))(H1||{});const Y0=C("debuguilayout"),ns=class pC extends th{constructor(){super(...arguments),a(this,"_renderOnTop"),a(this,"_depthWrite",!1),a(this,"_doubleSided",!0),a(this,"_castShadows",!1),a(this,"_receiveShadows",!1),a(this,"_renderMode",-1),a(this,"_rootCanvas"),a(this,"_scaleFactor",1),a(this,"worldCamera"),a(this,"planeDistance",-1),a(this,"_boundRenderSettingsChanged",this.onRenderSettingsChanged.bind(this)),a(this,"previousParent",null),a(this,"_lastMatrixWorld",null),a(this,"_rectTransforms",[]),a(this,"_layoutGroups",new Map),a(this,"_receivers",[]),a(this,"onBeforeRenderRoutine",()=>{var e,t,s,o;if(this.previousParent=this.gameObject.parent,((e=this.context.xr)!=null&&e.isVR||(t=this.context.xr)!=null&&t.isPassThrough)&&this.screenspace){this.gameObject.visible=!1,this.gameObject.removeFromParent();return}this.renderOnTop||this.screenspace?this.gameObject.removeFromParent():(this.onUpdateRenderMode(),this.handleLayoutUpdates(),(s=this.shadowComponent)==null||s.updateMatrixWorld(!0),(o=this.shadowComponent)==null||o.updateWorldMatrix(!0,!0),this.invokeBeforeRenderEvents(),Jt.ensureUpdateMeshUI($v,this.context))}),a(this,"onAfterRenderRoutine",()=>{var e,t,s,o,r;if(((e=this.context.xr)!=null&&e.isVR||(t=this.context.xr)!=null&&t.isPassThrough)&&this.screenspace){(s=this.previousParent)==null||s.add(this.gameObject);return}if((this.screenspace||this.renderOnTop)&&this.previousParent&&this.context.mainCamera){if(this.screenspace){const h=this.context.mainCamera;h?.add(this.gameObject)}else this.previousParent.add(this.gameObject);const l=this.context.renderer.autoClear,c=this.context.renderer.autoClearColor;this.context.renderer.autoClear=!1,this.context.renderer.autoClearColor=!1,this.context.renderer.clearDepth(),this.onUpdateRenderMode(!0),this.handleLayoutUpdates(),(o=this.shadowComponent)==null||o.updateMatrixWorld(!0),this.invokeBeforeRenderEvents(),Jt.ensureUpdateMeshUI($v,this.context,!0),this.context.renderer.render(this.gameObject,this.context.mainCamera),this.context.renderer.autoClear=l,this.context.renderer.autoClearColor=c,this.previousParent.add(this.gameObject)}(r=this._lastMatrixWorld)==null||r.copy(this.gameObject.matrixWorld)}),a(this,"_updateRenderSettingsRoutine"),a(this,"_activeRenderMode",-1),a(this,"_lastWidth",-1),a(this,"_lastHeight",-1)}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)}set depthWrite(e){this._depthWrite!==e&&(this._depthWrite=e,this.onRenderSettingsChanged())}get depthWrite(){return this._depthWrite}set doubleSided(e){this._doubleSided!==e&&(this._doubleSided=e,this.onRenderSettingsChanged())}get doubleSided(){return this._doubleSided}set castShadows(e){this._castShadows!==e&&(this._castShadows=e,this.onRenderSettingsChanged())}get castShadows(){return this._castShadows}set receiveShadows(e){this._receiveShadows!==e&&(this._receiveShadows=e,this.onRenderSettingsChanged())}get receiveShadows(){return this._receiveShadows}get renderMode(){return this._renderMode}set renderMode(e){this._renderMode!==e&&(this._renderMode=e,this.onRenderSettingsChanged())}set rootCanvas(e){this._rootCanvas instanceof pC||(this._rootCanvas=e)}get rootCanvas(){return this._rootCanvas}get scaleFactor(){return this._scaleFactor}set scaleFactor(e){this._scaleFactor=e}awake(){var e;this.shadowComponent=this.gameObject,this.previousParent=this.gameObject.parent,Y0&&console.log("Canvas.Awake()",((e=this.previousParent)==null?void 0:e.name)+"/"+this.gameObject.name),super.awake()}start(){this.applyRenderSettings()}onEnable(){super.onEnable(),this._updateRenderSettingsRoutine=void 0,this._lastMatrixWorld=new se,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)}registerTransform(e){this._rectTransforms.push(e)}unregisterTransform(e){const t=this._rectTransforms.indexOf(e);t!==-1&&this._rectTransforms.splice(t,1)}registerLayoutGroup(e){const t=e.gameObject;this._layoutGroups.set(t,e)}unregisterLayoutGroup(e){const t=e.gameObject;this._layoutGroups.delete(t)}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 $l(1).then(()=>{this.gameObject.visible=!0}))}onLeaveXR(e){this.screenspace&&(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!0)}invokeBeforeRenderEvents(){var e;for(const t of this._receivers)(e=t.onBeforeCanvasRender)==null||e.call(t,this)}handleLayoutUpdates(){this._lastMatrixWorld===null&&(this._lastMatrixWorld=new se);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);Y0&&e&&console.log("Canvas Layout changed",this.context.time.frameCount,this.name);for(const t of this._rectTransforms){e&&t.markDirty();let s=this._layoutGroups.get(t.gameObject);t.isDirty&&!s&&(s=t.gameObject.getComponentInParent(Ui)),(t.isDirty||s!=null&&s.isDirty)&&(Y0&&console.log("CANVAS UPDATE ### "+t.name+" ##################################### "+this.context.time.frame),s?.updateLayout(),t.updateTransform())}}applyRenderSettings(){this.onRenderSettingsChanged()}onRenderSettingsChanged(){this._updateRenderSettingsRoutine||(this._updateRenderSettingsRoutine=this.startCoroutine(this._updateRenderSettingsDelayed(),Oe.OnBeforeRender))}*_updateRenderSettingsDelayed(){if(yield,this._updateRenderSettingsRoutine=void 0,this.shadowComponent){this.onUpdateRenderMode(),xu(this.shadowComponent,this);for(const e of P.getComponentsInChildren(this.gameObject,ls))xu(e.shadowComponent,this)}}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,s=10;switch(t&&t.nearClipPlane>0&&t.farClipPlane>0&&(s=W.lerp(t.nearClipPlane,t.farClipPlane,.01)),this._renderMode===1&&(this.worldCamera&&(t=this.worldCamera),this.planeDistance>0&&(s=this.planeDistance)),this._renderMode){case 0:case 1:if(this._lastWidth=this.context.domWidth,this._lastHeight=this.context.domHeight,!t)return;const o=s+.01;this.gameObject.position.x=0,this.gameObject.position.y=0,this.gameObject.position.z=-o,this.gameObject.quaternion.identity();const r=this.gameObject.getComponent(Rs);let l=!1;r.sizeDelta.x!==this.context.domWidth&&(l=!0),r.sizeDelta.y!==this.context.domHeight&&(l=!0);const c=t.fieldOfView*Math.PI/180,h=2*Math.tan(c/2)*Math.abs(o);this.gameObject.scale.x=h/this.context.domHeight,this.gameObject.scale.y=h/this.context.domHeight,this.gameObject.scale.z=.01,l&&(r.sizeDelta.x=this.context.domWidth,r.sizeDelta.y=this.context.domHeight,r?.markDirty());break;case 2:this._lastWidth=-1,this._lastHeight=-1;break}}};hn([m()],ns.prototype,"renderOnTop",1),hn([m()],ns.prototype,"depthWrite",1),hn([m()],ns.prototype,"doubleSided",1),hn([m()],ns.prototype,"castShadows",1),hn([m()],ns.prototype,"receiveShadows",1),hn([m()],ns.prototype,"renderMode",1),hn([m(ns)],ns.prototype,"rootCanvas",1),hn([m()],ns.prototype,"scaleFactor",1),hn([m(ri)],ns.prototype,"worldCamera",2),hn([m()],ns.prototype,"planeDistance",2);let pl=ns;var OA=Object.defineProperty,kA=Object.getOwnPropertyDescriptor,K0=(n,e,t,s)=>{for(var o=s>1?void 0:s?kA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&OA(e,t,o),o};class qo extends I{constructor(){super(...arguments),a(this,"_alpha",1),a(this,"interactable",!0),a(this,"blocksRaycasts",!0),a(this,"_isDirty",!1),a(this,"_buffer",[])}get alpha(){return this._alpha}set alpha(e){e!==this._alpha&&(this._alpha=e,this.markDirty())}get isCanvasGroup(){return!0}markDirty(){this._isDirty||(this._isDirty=!0,this.startCoroutine(this.applyChangesDelayed(),Oe.OnBeforeRender))}*applyChangesDelayed(){this._isDirty=!1,this.applyChangesNow()}applyChangesNow(){this._buffer.length=0;for(const e of P.getComponentsInChildren(this.gameObject,ls,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}K0([m()],qo.prototype,"alpha",1),K0([m()],qo.prototype,"interactable",2),K0([m()],qo.prototype,"blocksRaycasts",2);class Z0{get extensionName(){return"tmui"}onExportObject(e,t,s){const o=P.getComponent(e,pl);if(o&&o.enabled&&o.renderMode===H1.WorldSpace){const r=new up,l=P.getComponent(e,Rs),c=P.getComponent(e,qo),h=new Array;if(l){if(!P.isActiveSelf(e)){const p=P.isActiveSelf(e);P.setActive(e,!0),l.onEnable(),l.updateTransform(),h.push(()=>{l.onDisable(),P.setActive(e,p)})}e.traverse(p=>{if(!P.isActiveInHierarchy(p)){const g=P.isActiveSelf(p);P.setActive(p,!0);const f=P.getComponent(p,ls);f&&(f.onEnable(),h.push(()=>{f.onDisable()}));const y=P.getComponent(p,Rs);y&&(y.onEnable(),y.updateTransform(),y.onApplyTransform(),h.push(()=>{y.onDisable()}));const v=P.getComponent(p,Ft);v&&(v.onEnable(),h.push(()=>{v.onDisable()})),h.push(()=>{P.setActive(p,g)})}}),l.width,l.height;const d=di.createEmpty(),u=l.shadowComponent;if(t.add(d),u){const p=u.matrix;d.setMatrix(p);const g=new Map,f=new Map;g.set(u,d),f.set(u,c?c.alpha:1),u.traverse(y=>{if(y===u)return;const v=di.createEmpty();v.setMatrix(y.matrix);const b=y.parent,_=!!b&&typeof b.textContent=="string"&&b.textContent.length>0;let w=f.get(b)||1;const x=P.getComponent(y,qo);if(x&&(w*=x.alpha),y instanceof X&&_){const k=y[Pi];k?r.exportText(k.gameObject,v,s):console.error("Error when exporting UI: shadow component owner not found. This is likely a bug.",y)}if(y instanceof X&&!_){const k=y.geometry.clone();k.scale(1,1,-1),this.flipWindingOrder(k),v.geometry=k;const T=new ae,L=y.material.opacity;T.copy(y.material.color),v.material=new Me({color:T,opacity:L*w,map:y.material.map,transparent:!0})}g.set(y,v),f.set(y,w);const M=g.get(b);if(!M){console.error("Error when exporting UI: shadow component parent not found!",y,y.parent);return}M.add(v)})}}for(const d of h)d()}}flipWindingOrder(e){const t=e.index.array;for(let s=0,o=t.length/3;s<o;s++){const r=t[s*3];t[s*3]=t[s*3+2],t[s*3+2]=r}e.index.needsUpdate=!0}}const rh=C("debugusdz");function MA(n,e){var t;const s=[],o=P.getComponentsInChildren(n,Ot),r=P.getComponentsInChildren(n,jt),l=new Array,c=new Array;if(e.injectImplicitBehaviours)for(const h of o){if(!h||!h.runtimeAnimatorController||!h.enabled)continue;const d=h.runtimeAnimatorController.activeState;if(!d||!d.motion||!d.motion.clip||((t=d.motion.clip.tracks)==null?void 0:t.length)<1||l.includes(h))continue;const u=new Qc;u.animator=h,u.stateName=d.name,u.trigger="start",u.name="PlayAnimationOnClick_implicitAtStart_"+u.stateName;const p=new A;P.addComponent(p,u),c.push(p),l.push(h),n.add(p)}else for(const h of o){if(!h||!h.runtimeAnimatorController||!h.enabled)continue;rh&&console.log(h);const d=[];for(const u of h.runtimeAnimatorController.enumerateActions()){rh&&console.log(u);const p=u.getClip();d.includes(p)||d.push(p)}s.push({root:h.gameObject,clips:d})}if(e.injectImplicitBehaviours)for(const h of r){if(!h||!h.clip||!h.enabled||!h.playAutomatically||l.includes(h))continue;const d=new Qc;d.animation=h,d.stateName=h.clip.name,d.trigger="start",d.name="PlayAnimationOnClick_implicitAtStart_"+d.stateName;const u=new A;P.addComponent(u,d),c.push(u),l.push(h),n.add(u)}else for(const h of r){rh&&console.log(h);const d=[];for(const u of h.animations)d.includes(u)||d.push(u);s.push({root:h.gameObject,clips:d})}rh&&s?.length>0&&console.log("USDZ Animation Clips without behaviours",s);for(const h of s)for(const d of h.clips)e.registerAnimation(h.root,d);return c}function RA(n,e){const t=P.getComponentsInChildren(n,ts),s=P.getComponentsInChildren(n,Uo),o=new Array,r=new Array;rh&&console.log({audioSources:t,playAudioOnClicks:s});for(const l of s){if(!l.target)continue;const c=t.indexOf(l.target);c>-1&&t.splice(c,1)}for(const l of t){if(!l||!l.clip||l.volume<=0||o.includes(l))continue;const c=new Uo;c.target=l,c.name="PlayAudioOnClick_implicitAtStart_",c.trigger="start";const h=new A;P.addComponent(h,c),console.log("implicit PlayAudioOnStart",h,c),r.push(h),o.push(l),n.add(h)}return r}function TA(n){return new Yt("DisableAtStart",Rt.sceneStartTrigger(),ve.fadeAction(n,0,!1))}function $1(n,e){const t=n.domElement.shadowRoot.querySelector("link[rel='ar']");if(t)return t;const s=document.createElement("div");s.classList.add("menu"),s.classList.add("quicklook-menu"),s.style.display="none",s.style.visibility="hidden";const o=document.createElement("button");o.id="open-in-ar",e?(o.innerText="View in AR",o.title="View this scene in AR. The scene will be exported to USDZ and opened with Apple's QuickLook."):(o.innerText="View in AR",o.title="Download this scene for AR. Open the downloaded USDZ file to view it in AR using Apple's QuickLook."),s.appendChild(o);const r=document.createElement("a");r.id="needle-usdz-link",r.style.display="none",r.rel="ar",r.href="",r.target="_blank",s.appendChild(r);const l=document.createElement("img");return l.id="button",r.appendChild(l),n.domElement.shadowRoot.appendChild(s),r}var EA=Object.defineProperty,Tt=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&EA(e,t,o),o};const zi=C("debugusdz"),AA=C("debugusdzpruning");class qr{constructor(){a(this,"callToAction"),a(this,"checkoutTitle"),a(this,"checkoutSubtitle"),a(this,"callToActionURL")}}Tt([m()],qr.prototype,"callToAction"),Tt([m()],qr.prototype,"checkoutTitle"),Tt([m()],qr.prototype,"checkoutSubtitle"),Tt([m()],qr.prototype,"callToActionURL");var ml;const pi=(ml=class extends I{constructor(){super(...arguments),a(this,"objectToExport"),a(this,"autoExportAnimations",!0),a(this,"autoExportAudioSources",!0),a(this,"exportFileName"),a(this,"customUsdzFile"),a(this,"customBranding"),a(this,"anchoringType","plane"),a(this,"maxTextureSize",2048),a(this,"planeAnchoringAlignment","horizontal"),a(this,"interactive",!0),a(this,"physics",!0),a(this,"allowCreateQuicklookButton",!0),a(this,"quickLookCompatible",!0),a(this,"extensions",[]),a(this,"link"),a(this,"button"),a(this,"onClickedOpenInARElement",n=>{n.preventDefault(),this.exportAndOpen()}),a(this,"_currentExportTasks",new Map),a(this,"_previousTimeScale",1),a(this,"lastCallback"),a(this,"_rootSessionRootWasAppliedTo",null),a(this,"_rootPositionBeforeExport",new S),a(this,"_rootRotationBeforeExport",new H),a(this,"_rootScaleBeforeExport",new S)}start(){var n,e,t;zi&&(console.log("USDZExporter",this),console.log("Debug USDZ Mode. Press 'T' to export"),window.addEventListener("keydown",s=>{switch(s.key){case"t":this.exportAndOpen();break}})),this.objectToExport||(this.objectToExport=this.gameObject),!((e=(n=this.objectToExport)==null?void 0:n.children)!=null&&e.length)&&!((t=this.objectToExport)!=null&&t.isMesh)&&(this.objectToExport=this.context.scene)}onEnable(){var n;const e=Y.supportsQuickLookAR(),t=Y.isiOS()||Y.isiPad();!this.button&&(zi||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=$1(this.context,e),this.link.addEventListener("message",this.lastCallback)),zi&&De("USDZ Exporter enabled: "+this.name),(n=document.getElementById("open-in-ar"))==null||n.addEventListener("click",this.onClickedOpenInARElement),oc.registerExporter(this)}onDisable(){var n,e,t;(n=this.button)==null||n.remove(),(e=this.link)==null||e.removeEventListener("message",this.lastCallback),zi&&De("USDZ Exporter disabled: "+this.name),(t=document.getElementById("open-in-ar"))==null||t.removeEventListener("click",this.onClickedOpenInARElement),oc.unregisterExporter(this)}async exportAsync(){return this.exportAndOpen()}async exportAndOpen(){var n;let e=this.exportFileName??((n=this.objectToExport)==null?void 0:n.name)??this.name;if(e+="-"+o1(),Xs()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=$1(this.context,Y.supportsQuickLookAR())),this.customUsdzFile)return zi&&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;const t=await this.export(this.objectToExport);return t?(zi&&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(n){if(!n)return console.warn("No object to export"),null;const e=this._currentExportTasks.get(n);if(e)return e;const t=this.internalExport(n);return t instanceof Promise?(this._currentExportTasks.set(n,t),t.then(s=>(this._currentExportTasks.delete(n),s)).catch(s=>(this._currentExportTasks.delete(n),console.error("Error during USDZ export \u2013 please report a bug!",s),null))):t}async internalExport(n){he.start("export-usdz",{onProgress:x=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:x}}))}}),he.report("export-usdz",{message:"Starting export",totalSteps:40,currentStep:0}),he.report("export-usdz",{message:"Load progressive textures",autoStep:5}),he.start("export-usdz-textures","export-usdz");const e=P.getComponentsInChildren(n,ui);for(const x of e)x&&x.enabled&&x.updateSprite(!0);const t=P.getComponentsInChildren(n,Di),s=new Array;let o=0;for(const x of t){for(const M of x.sharedMeshes)if(M){const k=Xe.assignMeshLOD(M,0);k instanceof Promise&&s.push(new Promise((T,L)=>{k.then(()=>{o++,he.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:o,totalSteps:s.length}),T()}).catch(B=>L(B))}))}for(const M of x.sharedMaterials)if(M){const k=Xe.assignTextureLOD(M,0);k instanceof Promise&&s.push(new Promise((T,L)=>{k.then(()=>{o++,he.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:o,totalSteps:s.length}),T()}).catch(B=>L(B))}))}}zi&&De("Progressive Loading: "+s.length),await Promise.all(s),zi&&De("Progressive Loading: done"),he.end("export-usdz-textures");const r=Ii.Global.Mask;Ii.Global.Set(tn.AR);const l=new d1,c=new Zu(this.quickLookCompatible);let h;const d=[];this.interactive&&(d.push(new z0),d.push(new pa),globalThis.NEEDLE_USE_RAPIER&&P.getComponentsInChildren(n,ht).length>0&&(this.physics?(h=new N0,d.push(h)):F()&&console.warn("USDZExporter: Physics export is disabled, but there are active Rigidbody components in the scene. They will not be exported.")),d.push(new up),d.push(new Z0));const u=[c,...d,...this.extensions],p={self:this,exporter:l,extensions:u,object:n};he.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,he.report("export-usdz","auto export animations and audio sources");const g=new Array;this.autoExportAnimations&&g.push(...MA(n,c)),u.find(x=>x.extensionName==="Audio")&&this.autoExportAudioSources&&g.push(...RA(n)),l.debug=zi,l.pruneUnusedNodes=!AA;const f=Wu.instance.objs.map(x=>x.batchedMesh);l.keepObject=x=>{let M=!0;const k=P.getComponent(x,Di);return k&&!k.enabled&&(M=!1),M&&f.includes(x)&&(M=!1),M&&P.getComponentInParent(x,Uc)&&(M=!1),M&&P.getComponentInParent(x,Ys)&&(M=!1),zi&&!M&&console.log("USDZExporter: Discarding object",x),M},l.beforeWritingDocument=()=>{if(F()&&c&&h){const x=c.animatedRoots;for(const M of x){const k=P.getComponentsInChildren(M,ht).filter(L=>L.enabled),T=P.getComponents(M,ci).filter(L=>L.enabled&&!L.isTrigger);(k.length>0||T.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.",M)}}};const y=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(x=>{x.visible||y.push(x)});const v=u.find(x=>x.extensionName==="Behaviour");this.interactive&&v&&y.length>0&&v.addBehavior(TA(y));let b=!0;this.quickLookCompatible&&!this.interactive&&(b=!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"),he.report("export-usdz","Invoking exporter.parse");const _=await l.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:u,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:b}),w=new Blob([_],{type:"model/vnd.usdz+zip"});this.revertWebARSessionRoot(),this.context.time.timeScale=this._previousTimeScale,he.report("export-usdz","Invoking after-export"),this.dispatchEvent(new CustomEvent("after-export",{detail:p}));for(const x of g)P.destroy(x);return Ii.Global.Set(r),he.end("export-usdz"),w}openInQuickLook(n,e){const t=n instanceof Blob?URL.createObjectURL(n):n,s=this.buildQuicklookOverlay();zi&&console.log("QuickLook Overlay",s);const o=s.callToAction?encodeURIComponent(s.callToAction):"",r=s.checkoutTitle?encodeURIComponent(s.checkoutTitle):"",l=s.checkoutSubtitle?encodeURIComponent(s.checkoutSubtitle):"";this.link.href=t+`#callToAction=${o}&checkoutTitle=${r}&checkoutSubtitle=${l}&callToActionURL=${s.callToActionURL}`,this.lastCallback||(this.lastCallback=this.quicklookCallback.bind(this),this.link.addEventListener("message",this.lastCallback)),this.link.download=e+".usdz",this.link.click()}download(n,e){ml.save(n,e)}static save(n,e){const t=document.createElement("a");t.style.display="none",document.body.appendChild(t),typeof n=="string"?t.href=n:t.href=URL.createObjectURL(n),t.download=e,t.click(),t.remove()}quicklookCallback(n){if(n?.data=="_apple_ar_quicklook_button_tapped"){zi&&be("Quicklook closed via call to action button");var e=new CustomEvent("quicklook-button-tapped",{detail:this});if(this.dispatchEvent(e),!e.defaultPrevented){const t=new URLSearchParams(this.link.href);if(t){const s=t.get("callToActionURL");zi&&De("Quicklook url: "+s),s&&(Xs()?globalThis.open(s,"_blank"):console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing",s))}}}}buildQuicklookOverlay(){var n,e,t,s,o,r;const l={};return this.customBranding&&Object.assign(l,this.customBranding),Xs()||(console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing"),l.callToAction="Close",l.checkoutTitle="\u{1F335} Made with Needle",l.checkoutSubtitle="_"),(((n=l.callToAction)==null?void 0:n.length)||((e=l.checkoutTitle)==null?void 0:e.length)||((t=l.checkoutSubtitle)==null?void 0:t.length))&&((s=l.callToAction)!=null&&s.length||(l.callToAction="\0"),(o=l.checkoutTitle)!=null&&o.length||(l.checkoutTitle="\0"),(r=l.checkoutSubtitle)!=null&&r.length||(l.checkoutSubtitle="\0")),this.dispatchEvent(new CustomEvent("quicklook-overlay",{detail:l})),l}getARScaleAndTarget(){if(!this.objectToExport)return{scale:1,_invertForward:!1,target:this.gameObject,sessionRoot:null};const n=P.findObjectOfType(lp);let e=P.getComponentInParent(this.objectToExport,zo);e||(e=P.getComponentInChildren(this.objectToExport,zo));let t=1,s=!1;const o=this.objectToExport;return n?t=n.arScale:e&&(t=e.arScale,s=e.invertForward),{scale:1/t,_invertForward:s,target:o,sessionRoot:e?.gameObject??null}}applyWebARSessionRoot(){if(!this.objectToExport)return;const{scale:n,_invertForward:e,target:t,sessionRoot:s}=this.getARScaleAndTarget(),o=s?.matrixWorld.clone().invert();this._rootSessionRootWasAppliedTo=t,this._rootPositionBeforeExport.copy(t.position),this._rootRotationBeforeExport.copy(t.quaternion),this._rootScaleBeforeExport.copy(t.scale),t.scale.multiplyScalar(n),e&&t.quaternion.multiply(ml.invertForwardQuaternion),t.updateMatrix(),t.updateMatrixWorld(!0),s&&o&&t.matrix.premultiply(o)}revertWebARSessionRoot(){if(!this.objectToExport||!this._rootSessionRootWasAppliedTo)return;const n=this._rootSessionRootWasAppliedTo;n.position.copy(this._rootPositionBeforeExport),n.quaternion.copy(this._rootRotationBeforeExport),n.scale.copy(this._rootScaleBeforeExport),n.updateMatrix(),n.updateMatrixWorld(!0),this._rootSessionRootWasAppliedTo=null}createQuicklookButton(){const n=al.getOrCreate().createQuicklookButton();return n.parentNode||this.context.menu.appendChild(n),n}},a(ml,"invertForwardMatrix",new se().makeRotationY(Math.PI)),a(ml,"invertForwardQuaternion",new H().setFromEuler(new It(0,Math.PI,0))),ml);Tt([m(A)],pi.prototype,"objectToExport"),Tt([m()],pi.prototype,"autoExportAnimations"),Tt([m()],pi.prototype,"autoExportAudioSources"),Tt([m()],pi.prototype,"exportFileName"),Tt([m(URL)],pi.prototype,"customUsdzFile"),Tt([m(qr)],pi.prototype,"customBranding"),Tt([m()],pi.prototype,"anchoringType"),Tt([m()],pi.prototype,"maxTextureSize"),Tt([m()],pi.prototype,"planeAnchoringAlignment"),Tt([m()],pi.prototype,"interactive"),Tt([m()],pi.prototype,"physics"),Tt([m()],pi.prototype,"allowCreateQuicklookButton"),Tt([m()],pi.prototype,"quickLookCompatible");let dn=pi;var IA=Object.defineProperty,LA=Object.getOwnPropertyDescriptor,J0=(n,e,t,s)=>{for(var o=LA(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&IA(e,t,o),o};class gl extends I{constructor(){super(...arguments),a(this,"_fog")}get fog(){return this._fog||(this._fog=new bv(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}onEnable(){this.scene.fog=this.fog}onDisable(){this.scene.fog===this._fog&&(this.scene.fog=null)}}J0([m()],gl.prototype,"near"),J0([m()],gl.prototype,"far"),J0([m(ae)],gl.prototype,"color");var jA=Object.defineProperty,ey=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&jA(e,t,o),o};class Xr extends I{constructor(){super(...arguments),a(this,"objectBounds",!1),a(this,"color"),a(this,"isGizmo",!0),a(this,"_gizmoObject",null),a(this,"_boxHelper",null)}onEnable(){this.isGizmo&&!pc||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new yP(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=Eg(this.color??16776960))),this.objectBounds?(this.scene.add(this._gizmoObject),this._boxHelper=this._gizmoObject,this.startCoroutine(this.syncObjectBounds(),Oe.OnBeforeRender)):this.gameObject.add(this._gizmoObject))}onDisable(){this._gizmoObject&&this.gameObject.remove(this._gizmoObject)}*syncObjectBounds(){for(var e;this._boxHelper;)(e=this._boxHelper)==null||e.update(),yield}}ey([m()],Xr.prototype,"objectBounds"),ey([m(ae)],Xr.prototype,"color"),ey([m()],Xr.prototype,"isGizmo");var DA=Object.defineProperty,ty=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&DA(e,t,o),o};class fl extends I{constructor(){super(...arguments),a(this,"isGizmo",!1),a(this,"color0"),a(this,"color1"),a(this,"gridHelper"),a(this,"size"),a(this,"divisions"),a(this,"offset")}onEnable(){if(this.isGizmo&&!pc)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new fm(e,t,this.color0??new ae(.4,.4,.4),this.color1??new ae(.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)}}ty([m()],fl.prototype,"isGizmo"),ty([m(ae)],fl.prototype,"color0"),ty([m(ae)],fl.prototype,"color1");var BA=Object.defineProperty,iy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&BA(e,t,o),o};class sy extends I{constructor(){super(...arguments),a(this,"connectedBody"),a(this,"_rigidBody",null)}get rigidBody(){return this._rigidBody}onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(ht)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}iy([m(ht)],sy.prototype,"connectedBody");class ny extends sy{createJoint(e,t){var s;(s=this.context.physics.engine)==null||s.addFixedJoint(e,t)}}class ah extends sy{constructor(){super(...arguments),a(this,"anchor"),a(this,"axis")}createJoint(e,t){var s;this.axis&&this.anchor&&((s=this.context.physics.engine)==null||s.addHingeJoint(e,t,this.anchor,this.axis))}}iy([m(S)],ah.prototype,"anchor"),iy([m(S)],ah.prototype,"axis");var FA=Object.defineProperty,UA=Object.getOwnPropertyDescriptor,un=(n,e,t,s)=>{for(var o=s>1?void 0:s?UA(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&FA(e,t,o),o};function oy(n){return n*Math.PI/180}const G1=300,Xo=C("debuglights");class mi extends I{constructor(){super(...arguments),a(this,"type",0),a(this,"range",1),a(this,"spotAngle",1),a(this,"innerSpotAngle",1),a(this,"_color",new ae(16777215)),a(this,"_shadowNearPlane",.1),a(this,"_shadowBias",0),a(this,"_shadowNormalBias",0),a(this,"_overrideShadowBiasSettings",!1),a(this,"_shadows",1),a(this,"lightmapBakeType",4),a(this,"_intensity",-1),a(this,"_shadowDistance"),a(this,"shadowWidth"),a(this,"shadowHeight"),a(this,"_shadowResolution"),a(this,"light"),a(this,"_webXRStartedListener"),a(this,"_webXREndedListener"),a(this,"_webARRoot")}set color(e){this._color=e,this.light!==void 0&&(this.light.color=e)}get color(){return this.light?this.light.color:this._color}set shadowNearPlane(e){var t,s;if(e!==this._shadowNearPlane&&(this._shadowNearPlane=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.camera)!==void 0)){const o=this.light.shadow.camera;o.near=e}}get shadowNearPlane(){return this._shadowNearPlane}set shadowBias(e){var t,s;e!==this._shadowBias&&(this._shadowBias=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.bias)!==void 0&&(this.light.shadow.bias=e,this.light.shadow.needsUpdate=!0))}get shadowBias(){return this._shadowBias}set shadowNormalBias(e){var t,s;e!==this._shadowNormalBias&&(this._shadowNormalBias=e,((s=(t=this.light)==null?void 0:t.shadow)==null?void 0:s.normalBias)!==void 0&&(this.light.shadow.normalBias=e,this.light.shadow.needsUpdate=!0))}get shadowNormalBias(){return this._shadowNormalBias}set shadows(e){this._shadows=e,this.light&&(this.light.castShadow=e!==0,this.updateShadowSoftHard())}get shadows(){return this._shadows}set intensity(e){var t;if(this._intensity=e,this.light){let s=1;if(this.context.isInXR&&this._webARRoot){const o=(t=this._webARRoot)==null?void 0:t.arScale;typeof o=="number"&&o>0&&(s/=o)}this.light.intensity=e*s}Xo&&console.log("Set light intensity to "+this._intensity,e,this)}get intensity(){return this._intensity}get shadowDistance(){const e=this.light;return e!=null&&e.shadow?e.shadow.camera.far:-1}set shadowDistance(e){this._shadowDistance=e;const t=this.light;if(t!=null&&t.shadow){const s=t.shadow.camera;s.far=e,s.updateProjectionMatrix()}}get shadowResolution(){const e=this.light;return e!=null&&e.shadow?e.shadow.mapSize.x:-1}set shadowResolution(e){if(e===this._shadowResolution)return;this._shadowResolution=e;const t=this.light;t!=null&&t.shadow&&(t.shadow.mapSize.set(e,e),t.shadow.needsUpdate=!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}getWorldPosition(e){return this.light?this.type===1?this.light.getWorldPosition(e).multiplyScalar(1):this.light.getWorldPosition(e):e}awake(){this.color=new ae(this.color??16777215),Xo&&console.log(this.name,this)}onEnable(){Xo&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Xo&&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(),Oe.LateUpdate))}onDisable(){Xo&&console.log("DISABLE LIGHT",this.name),this.light&&(this.selfIsLight?this.light.intensity=0:this.light.visible=!1)}onEnterXR(e){this._webARRoot=P.getComponentInParent(this.gameObject,zo)??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 ym(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-G1*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),pr(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Xo){const l=new bP(this.light,.2,this.color);this.context.scene.add(l)}break;case 0:const s=new vP(this.color,this.intensity*Math.PI,this.range,oy(this.spotAngle/2),1-oy(this.innerSpotAngle/2)/oy(this.spotAngle/2),2);s.position.set(0,0,0),s.rotation.set(0,0,0),this.light=s;const o=s.target;s.add(o),o.position.set(0,0,this.range),o.rotation.set(0,0,0);break;case 2:const r=new vm(this.color,this.intensity*Math.PI,this.range);this.light=r;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),Xo&&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=G1*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 s=this.gameObject.scale.x;t.left*=s,t.right*=s}if(this.shadowHeight!==void 0)t.top=this.shadowHeight/2,t.bottom=-this.shadowHeight/2;else{const s=this.gameObject.scale.y;t.top*=s,t.bottom*=s}this.light.shadow.needsUpdate=!0,Xo&&this.context.scene.add(new _P(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}}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)}}a(mi,"allowChangingRendererShadowMapType",!0),un([m()],mi.prototype,"type",2),un([m(ae)],mi.prototype,"color",1),un([m()],mi.prototype,"shadowNearPlane",1),un([m()],mi.prototype,"shadowBias",1),un([m()],mi.prototype,"shadowNormalBias",1),un([m()],mi.prototype,"shadows",1),un([m()],mi.prototype,"lightmapBakeType",2),un([m()],mi.prototype,"intensity",1),un([m()],mi.prototype,"shadowDistance",1),un([m()],mi.prototype,"shadowResolution",1),new S(0,0,0);var zA=Object.defineProperty,lh=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&zA(e,t,o),o};const ry=C("debuglods"),NA=C("nolods");class yl{constructor(){a(this,"screenRelativeTransitionHeight"),a(this,"distance"),a(this,"renderers")}}lh([m()],yl.prototype,"screenRelativeTransitionHeight"),lh([m()],yl.prototype,"distance"),lh([m(Di)],yl.prototype,"renderers");class WA{constructor(e){a(this,"model"),this.model=e}get renderers(){return this.model.renderers}}class ch extends I{constructor(){super(...arguments),a(this,"fadeMode",0),a(this,"localReferencePoint"),a(this,"lodCount",0),a(this,"size",0),a(this,"animateCrossFading",!1),a(this,"lodModels"),a(this,"_lods",[]),a(this,"_settings",[]),a(this,"_lodsHandler"),a(this,"_distanceFactor",1)}start(){if(ry&&console.log("LODGROUP",this.name,this.lodModels,this),!NA&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const s of this.lodModels){const o=new WA(s);this._lods.push(o);for(const r of o.renderers)e.includes(r)||e.push(r)}this._lodsHandler=new Array;for(let s=0;s<e.length;s++){const o=new wP;this._lodsHandler.push(o),this.gameObject.add(o)}const t=new A;t.name="Cull "+this.name;for(let s=0;s<e.length;s++){const o=e[s],r=this._lodsHandler[s],l=o.gameObject;ry&&console.log(s,l.name);for(const c of this._lods){const h=c.model.distance;let d=null;if(c.renderers.includes(o)?d=l:d=t,d.type==="Group"){console.warn(`LODGroup ${this.name}: Group or MultiMaterial object's are not supported as LOD object: ${d.name}`);continue}ry&&console.log("LEVEL",d.name,h),r.autoUpdate=!1,this.onAddLodLevel(r,d,c.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 s=t.getCurrentLevel(),o=t.levels[s];t.layers.mask=o.object.layers.mask}}onAddLodLevel(e,t,s){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,s*this._distanceFactor,.01);const o={lod:e,levelIndex:e.levels.length-1,distance:s};this._settings.push(o)}distanceFactor(e){if(e!==this._distanceFactor){this._distanceFactor=e;for(const t of this._settings){const s=t.lod.levels[t.levelIndex];s.distance=t.distance*e}}}}lh([m(S)],ch.prototype,"localReferencePoint"),lh([m(yl)],ch.prototype,"lodModels");var VA=Object.defineProperty,HA=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&VA(e,t,o),o};const pp=C("debugnestedgltf");class mp extends I{constructor(){super(...arguments),a(this,"filePath"),a(this,"loadAssetInParent",!0),a(this,"_isLoadingOrDoneLoading",!1)}listenToProgress(e){var t;(t=this.filePath)==null||t.beginListenDownload(e)}preload(){var e;(e=this.filePath)==null||e.preload()}async start(){var e,t,s,o,r;if(this._isLoadingOrDoneLoading)return;pp&&console.log(this,this.guid);const l=this.gameObject.parent;if(l){this._isLoadingOrDoneLoading=!0;const c=new Bs;c.idProvider=new At(this.hash(this.guid)),c.parent=this.loadAssetInParent!==!1?l:this.gameObject,this.gameObject.updateMatrix();const h=this.gameObject.matrix;pp&&console.log("Load nested:",((e=this.filePath)==null?void 0:e.url)??this.filePath,this.gameObject.position);const d=await((s=(t=this.filePath)==null?void 0:t.instantiate)==null?void 0:s.call(this.filePath,c));pp&&console.log("Nested loaded:",((o=this.filePath)==null?void 0:o.url)??this.filePath,d),d&&this.loadAssetInParent!==!1&&(d.matrixAutoUpdate=!1,d.matrix.identity(),d.applyMatrix4(h),d.matrixAutoUpdate=!0,d.layers.disableAll(),d.layers.set(this.layer),this.dispatchEvent(new CustomEvent("loaded",{detail:{instance:d,assetReference:this.filePath}}))),pp&&console.log("Nested loading done:",((r=this.filePath)==null?void 0:r.url)??this.filePath,d)}}onDestroy(){var e;(e=this.filePath)==null||e.unload()}hash(e){let t=0;for(let s=0;s<e.length;s++)t=e.charCodeAt(s)+((t<<5)-t);return t}}HA([m(le)],mp.prototype,"filePath");var $A=Object.defineProperty,ay=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$A(e,t,o),o};const GA=C("debugnet"),gp=class uv extends I{constructor(){super(...arguments),a(this,"url",null),a(this,"urlParameterName",null),a(this,"localhost",null)}awake(){GA&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?uv.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const s=C(this.urlParameterName);s&&typeof s=="string"&&(e=s)}if(!e)return null;const t=new RegExp("(((https?)|(?<socket_prefix>wss?))://)?(www.)?(?<url>.+)","gm").exec(e);return t!=null&&t.groups?t?.groups.socket_prefix?e:"wss://"+t?.groups.url:null}static GetUrl(e,t){let s=e;const o=uv.IsLocalNetwork()&&t;if(o&&(s=t),e!=null&&e.startsWith("/")){const r=o?s:window.location.origin;r!=null&&r.endsWith("/")&&e.startsWith("/")&&(e=e.substring(1)),s=r+e}return s}static IsLocalNetwork(e=window.location.hostname){return $t(e)}};ay([m()],gp.prototype,"url"),ay([m()],gp.prototype,"urlParameterName"),ay([m()],gp.prototype,"localhost");let ly=gp;var qA=Object.defineProperty,fp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&qA(e,t,o),o};class Qr extends I{constructor(){super(...arguments),a(this,"referenceSpace"),a(this,"from"),a(this,"affectPosition",!1),a(this,"affectRotation",!1),a(this,"alignLookDirection",!1),a(this,"levelLookDirection",!1),a(this,"levelPosition",!1),a(this,"positionOffset",new S(0,0,0)),a(this,"rotationOffset",new S(0,0,0)),a(this,"offset",new S(0,0,0))}update(){if(!this.from)return;var e=ee(this.from),t=Se(this.from);this.offset.copy(this.positionOffset);const s=this.offset.length();if(this.referenceSpace&&this.offset.transformDirection(this.referenceSpace.matrixWorld).multiplyScalar(s),e.add(this.offset),this.levelPosition&&this.referenceSpace){const c=new dr(this.gameObject.up,0),h=ee(this.referenceSpace);c.setFromNormalAndCoplanarPoint(this.gameObject.up,h);const d=new S(0,0,0);c.projectPoint(e,d),e.copy(d)}this.affectPosition&&at(this.gameObject,e);const o=new It(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),r=new H().setFromEuler(o);this.affectRotation&&Gi(this.gameObject,t.multiply(r));const l=new S;this.from.getWorldDirection(l).multiplyScalar(50),this.levelLookDirection&&(l.y=0),this.alignLookDirection&&this.gameObject.lookAt(l)}}fp([m(P)],Qr.prototype,"referenceSpace"),fp([m(P)],Qr.prototype,"from"),fp([m(S)],Qr.prototype,"positionOffset"),fp([m(S)],Qr.prototype,"rotationOffset");var XA=Object.defineProperty,Qo=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&XA(e,t,o),o};class gi{constructor(e=0,t=0){a(this,"time",0),a(this,"value",0),a(this,"inTangent",1/0),a(this,"inWeight"),a(this,"outTangent",1/0),a(this,"outWeight"),a(this,"weightedMode"),this.time=e,this.value=t}}Qo([m()],gi.prototype,"time"),Qo([m()],gi.prototype,"value"),Qo([m()],gi.prototype,"inTangent"),Qo([m()],gi.prototype,"inWeight"),Qo([m()],gi.prototype,"outTangent"),Qo([m()],gi.prototype,"outWeight"),Qo([m()],gi.prototype,"weightedMode");const q1=class Zh{constructor(){a(this,"keys",[])}static linearFromTo(e,t,s){const o=new Zh,r=new gi;r.time=0,r.value=e;const l=new gi;return l.time=s,l.value=t,o.keys.push(r,l),o}static constant(e){const t=new Zh,s=new gi;return s.time=0,s.value=e,t.keys.push(s),t}clone(){var e;const t=new Zh;return t.keys=((e=this.keys)==null?void 0:e.map(s=>{const o=new gi;return o.time=s.time,o.value=s.value,o.inTangent=s.inTangent,o.inWeight=s.inWeight,o.outTangent=s.outTangent,o.outWeight=s.outWeight,o.weightedMode=s.weightedMode,o}))||[],t}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 s=this.keys[t];if(s.time<=e)if(t+1<this.keys.length){const o=this.keys[t+1];if(o.time<e)continue;return!isFinite(s.outTangent)||!isFinite(o.inTangent)?s.value:Zh.interpolateValue(e,s,o)}else return s.value}return this.keys[this.keys.length-1].value}static interpolateValue(e,t,s){const o=t.time,r=t.value,l=t.outTangent,c=s.time,h=s.value,d=s.inTangent,u=c-o,p=u*u,g=p*u,f=((l+d)*u-2*(h-r))/g,y=(3*(h-r)-(d+2*l)*u)/p,v=l,b=r,_=e-o,w=_*_,x=w*_;return f*x+y*w+v*_+b}};Qo([m(gi)],q1.prototype,"keys");let hh=q1;var QA=Object.defineProperty,O=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&QA(e,t,o),o};const yp=C("debugparticles");var Qn=(n=>(n[n.Billboard=0]="Billboard",n[n.Stretch=1]="Stretch",n[n.HorizontalBillboard=2]="HorizontalBillboard",n[n.VerticalBillboard=3]="VerticalBillboard",n[n.Mesh=4]="Mesh",n))(Qn||{});class Yr{constructor(){a(this,"alphaKeys",[]),a(this,"colorKeys",[])}get duration(){return 1}evaluate(e,t){let s,o=0,r=null,l=0;for(let c=0;c<this.alphaKeys.length;c++){const h=this.alphaKeys[c];(h.time<e||!s)&&(s=h,o=c)}for(let c=0;c<this.colorKeys.length;c++){const h=this.colorKeys[c];(h.time<e||!r)&&(r=h,l=c)}if(r)if(l+1<this.colorKeys.length){const c=this.colorKeys[l+1],h=W.remap(e,r.time,c.time,0,1);t.r=W.lerp(r.color.r,c.color.r,h),t.g=W.lerp(r.color.g,c.color.g,h),t.b=W.lerp(r.color.b,c.color.b,h)}else t.r=r.color.r,t.g=r.color.g,t.b=r.color.b;if(s)if(o+1<this.alphaKeys.length){const c=this.alphaKeys[o+1],h=W.remap(e,s.time,c.time,0,1);t.alpha=W.lerp(s.alpha,c.alpha,h)}else t.alpha=s.alpha;return t}}O([m()],Yr.prototype,"alphaKeys"),O([m()],Yr.prototype,"colorKeys");var dh=(n=>(n[n.Local=0]="Local",n[n.World=1]="World",n[n.Custom=2]="Custom",n))(dh||{}),vp=(n=>(n[n.Sphere=0]="Sphere",n[n.SphereShell=1]="SphereShell",n[n.Hemisphere=2]="Hemisphere",n[n.HemisphereShell=3]="HemisphereShell",n[n.Cone=4]="Cone",n[n.Box=5]="Box",n[n.Mesh=6]="Mesh",n[n.ConeShell=7]="ConeShell",n[n.ConeVolume=8]="ConeVolume",n[n.ConeVolumeShell=9]="ConeVolumeShell",n[n.Circle=10]="Circle",n[n.CircleEdge=11]="CircleEdge",n[n.SingleSidedEdge=12]="SingleSidedEdge",n[n.MeshRenderer=13]="MeshRenderer",n[n.SkinnedMeshRenderer=14]="SkinnedMeshRenderer",n[n.BoxShell=15]="BoxShell",n[n.BoxEdge=16]="BoxEdge",n[n.Donut=17]="Donut",n[n.Rectangle=18]="Rectangle",n[n.Sprite=19]="Sprite",n[n.SpriteRenderer=20]="SpriteRenderer",n))(vp||{});const Yn=class Jh{constructor(){a(this,"mode","Constant"),a(this,"constant"),a(this,"constantMin"),a(this,"constantMax"),a(this,"curve"),a(this,"curveMin"),a(this,"curveMax"),a(this,"curveMultiplier")}static constant(e){const t=new Jh;return t.setConstant(e),t}static betweenTwoConstants(e,t){const s=new Jh;return s.setMinMaxConstant(e,t),s}static curve(e,t=1){const s=new Jh;return s.setCurve(e,t),s}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}clone(){var e,t,s;const o=new Jh;return o.mode=this.mode,o.constant=this.constant,o.constantMin=this.constantMin,o.constantMax=this.constantMax,o.curve=(e=this.curve)==null?void 0:e.clone(),o.curveMin=(t=this.curveMin)==null?void 0:t.clone(),o.curveMax=(s=this.curveMax)==null?void 0:s.clone(),o.curveMultiplier=this.curveMultiplier,o}evaluate(e,t){const s=t===void 0?Math.random():t;switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return e=W.clamp01(e),this.curve.evaluate(e)*this.curveMultiplier;case 2:case"TwoCurves":const o=e*this.curveMin.duration,r=e*this.curveMax.duration;return W.lerp(this.curveMin.evaluate(o),this.curveMax.evaluate(r),s%1)*this.curveMultiplier;case 3:case"TwoConstants":return W.lerp(this.constantMin,this.constantMax,s%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 s=0;s<e.keys.length;s++){const o=e.keys[s];o.value>t&&(t=o.value)}return t}};O([m()],Yn.prototype,"mode"),O([m()],Yn.prototype,"constant"),O([m()],Yn.prototype,"constantMin"),O([m()],Yn.prototype,"constantMax"),O([m(hh)],Yn.prototype,"curve"),O([m(hh)],Yn.prototype,"curveMin"),O([m(hh)],Yn.prototype,"curveMax"),O([m()],Yn.prototype,"curveMultiplier");let Z=Yn;var st;const Yo=(st=class{constructor(){a(this,"mode",0),a(this,"color"),a(this,"colorMin"),a(this,"colorMax"),a(this,"gradient"),a(this,"gradientMin"),a(this,"gradientMax")}static constant(n){const e=new st;return e.constant(n),e}static betweenTwoColors(n,e){const t=new st;return t.betweenTwoColors(n,e),t}constant(n){return this.mode=0,this.color=n,this}betweenTwoColors(n,e){return this.mode=2,this.colorMin=n,this.colorMax=e,this}evaluate(n,e){const t=e===void 0?Math.random():e;switch(this.mode){case 0:case"Color":return this.color;case 1:case"Gradient":return this.gradient.evaluate(n,st._temp),st._temp;case 2:case"TwoColors":return st._temp.lerpColors(this.colorMin,this.colorMax,t);case 3:case"TwoGradients":return this.gradientMin.evaluate(n,st._temp),this.gradientMax.evaluate(n,st._temp2),st._temp.lerp(st._temp2,t);case 4:case"RandomColor":const s=Math.random();return this.gradientMin.evaluate(n,st._temp),this.gradientMax.evaluate(n,st._temp2),st._temp.lerp(st._temp2,s)}return st._temp.set(16777215),st._temp.alpha=1,st._temp}},a(st,"_temp",new ce(0,0,0,1)),a(st,"_temp2",new ce(0,0,0,1)),st);O([m()],Yo.prototype,"mode"),O([m(ce)],Yo.prototype,"color"),O([m(ce)],Yo.prototype,"colorMin"),O([m(ce)],Yo.prototype,"colorMax"),O([m(Yr)],Yo.prototype,"gradient"),O([m(Yr)],Yo.prototype,"gradientMin"),O([m(Yr)],Yo.prototype,"gradientMax");let Kr=Yo;var cy=(n=>(n[n.Hierarchy=0]="Hierarchy",n[n.Local=1]="Local",n[n.Shape=2]="Shape",n))(cy||{});class Ut{constructor(){a(this,"cullingMode"),a(this,"duration"),a(this,"emitterVelocityMode"),a(this,"flipRotation"),a(this,"gravityModifier"),a(this,"gravityModifierMultiplier"),a(this,"loop"),a(this,"maxParticles"),a(this,"playOnAwake"),a(this,"prewarm"),a(this,"ringBufferLoopRange"),a(this,"ringBufferMode"),a(this,"scalingMode"),a(this,"simulationSpace"),a(this,"simulationSpeed"),a(this,"startColor"),a(this,"startDelay"),a(this,"startDelayMultiplier"),a(this,"startLifetime"),a(this,"startLifetimeMultiplier"),a(this,"startRotation"),a(this,"startRotationMultiplier"),a(this,"startRotation3D"),a(this,"startRotationX"),a(this,"startRotationXMultiplier"),a(this,"startRotationY"),a(this,"startRotationYMultiplier"),a(this,"startRotationZ"),a(this,"startRotationZMultiplier"),a(this,"startSize"),a(this,"startSize3D"),a(this,"startSizeMultiplier"),a(this,"startSizeX"),a(this,"startSizeXMultiplier"),a(this,"startSizeY"),a(this,"startSizeYMultiplier"),a(this,"startSizeZ"),a(this,"startSizeZMultiplier"),a(this,"startSpeed"),a(this,"startSpeedMultiplier"),a(this,"stopAction"),a(this,"useUnscaledTime")}}O([m(Z)],Ut.prototype,"gravityModifier"),O([m(Kr)],Ut.prototype,"startColor"),O([m(Z)],Ut.prototype,"startDelay"),O([m(Z)],Ut.prototype,"startLifetime"),O([m(Z)],Ut.prototype,"startRotation"),O([m(Z)],Ut.prototype,"startRotationX"),O([m(Z)],Ut.prototype,"startRotationY"),O([m(Z)],Ut.prototype,"startRotationZ"),O([m(Z)],Ut.prototype,"startSize"),O([m(Z)],Ut.prototype,"startSizeX"),O([m(Z)],Ut.prototype,"startSizeY"),O([m(Z)],Ut.prototype,"startSizeZ"),O([m(Z)],Ut.prototype,"startSpeed");class bp{constructor(){a(this,"cycleCount"),a(this,"maxCount"),a(this,"minCount"),a(this,"probability"),a(this,"repeatInterval"),a(this,"time"),a(this,"count"),a(this,"_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 s=this.time+this.repeatInterval*this._performed;if(e>=s&&(this._performed+=1,Math.random()<this.probability))switch(this.count.mode){case 0:t=this.count.constant;break;case 3:t=W.lerp(this.count.constantMin,this.count.constantMax,Math.random());break;case 1:t=this.count.curve.evaluate(Math.random());break;case 2:const o=Math.random();t=W.lerp(this.count.curveMin.evaluate(o),this.count.curveMax.evaluate(o),Math.random());break}}return t}}class Kn{constructor(){a(this,"enabled"),a(this,"bursts"),a(this,"rateOverTime"),a(this,"rateOverTimeMultiplier"),a(this,"rateOverDistance"),a(this,"rateOverDistanceMultiplier"),a(this,"system")}get burstCount(){var e;return((e=this.bursts)==null?void 0:e.length)??0}reset(){var e;(e=this.bursts)==null||e.forEach(t=>t.reset())}getBurst(){let e=0;if(this.burstCount>0)for(let t=0;t<this.burstCount;t++){const s=this.bursts[t];this.system.main.loop&&s.time>=this.system.time&&s.reset(),e+=Math.round(s.run(this.system.time))}return e}}O([m()],Kn.prototype,"enabled"),O([m()],Kn.prototype,"bursts"),O([m(Z)],Kn.prototype,"rateOverTime"),O([m()],Kn.prototype,"rateOverTimeMultiplier"),O([m(Z)],Kn.prototype,"rateOverDistance"),O([m()],Kn.prototype,"rateOverDistanceMultiplier");class _p{constructor(){a(this,"enabled"),a(this,"color")}}O([m(Kr)],_p.prototype,"color");class Zr{constructor(){a(this,"enabled"),a(this,"separateAxes"),a(this,"size"),a(this,"sizeMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier"),a(this,"_time",0),a(this,"_temp",new S)}evaluate(e,t,s){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,s)*this.xMultiplier,t.y=this.y.evaluate(e,s)*this.yMultiplier,t.z=this.z.evaluate(e,s)*this.zMultiplier;else{const o=this.size.evaluate(e,s)*this.sizeMultiplier;t.x=o}return t}}O([m(Z)],Zr.prototype,"size"),O([m(Z)],Zr.prototype,"x"),O([m(Z)],Zr.prototype,"y"),O([m(Z)],Zr.prototype,"z");var Ko;const nt=(Ko=class{constructor(){a(this,"shapeType",5),a(this,"enabled",!0),a(this,"alignToDirection",!1),a(this,"angle",0),a(this,"arc",360),a(this,"arcSpread"),a(this,"arcSpeedMultiplier"),a(this,"arcMode"),a(this,"boxThickness"),a(this,"position"),a(this,"rotation"),a(this,"_rotation",new It),a(this,"scale"),a(this,"radius"),a(this,"radiusThickness"),a(this,"sphericalDirectionAmount"),a(this,"randomDirectionAmount"),a(this,"randomPositionAmount"),a(this,"meshShapeType"),a(this,"meshRenderer"),a(this,"_meshObj"),a(this,"_meshGeometry"),a(this,"system"),a(this,"_space"),a(this,"_worldSpaceMatrix",new se),a(this,"_worldSpaceMatrixInverse",new se),a(this,"_vector",new S(0,0,0)),a(this,"_temp",new S(0,0,0)),a(this,"_triangle",new xP),a(this,"_dir",new S),a(this,"_loopTime",0),a(this,"_loopDirection",1),yp&&console.log(this)}get type(){return vp[this.shapeType]}initialize(n){this.onInitialize(n),n.position.x=this._vector.x,n.position.y=this._vector.y,n.position.z=this._vector.z}toJSON(){return this}clone(){return new Ko}setMesh(n){this.meshRenderer=n,n?(this._meshObj=n.sharedMeshes[Math.floor(Math.random()*n.sharedMeshes.length)],this._meshGeometry=this._meshObj.geometry):(this._meshObj=void 0,this._meshGeometry=void 0)}update(n,e){}onUpdate(n,e,t,s){this.system=n,this._space=t,t===1&&(this._worldSpaceMatrix.copy(s.matrixWorld),this._worldSpaceMatrix.elements[0]=1,this._worldSpaceMatrix.elements[5]=1,this._worldSpaceMatrix.elements[10]=1,this._worldSpaceMatrixInverse.copy(this._worldSpaceMatrix).invert())}applyRotation(n){const e=this.rotation.x!==0||this.rotation.y!==0||this.rotation.z!==0;return e&&(this._rotation.x=W.toRadians(this.rotation.x),this._rotation.y=W.toRadians(this.rotation.y),this._rotation.z=W.toRadians(this.rotation.z),this._rotation.order="ZYX",n.applyEuler(this._rotation)),e}onInitialize(n){this._vector.set(0,0,0),n.mesh=void 0,n.mesh_geometry=void 0;const e=this._temp.copy(this.position),t=this._space===1;t&&e.applyQuaternion(this.system.worldQuaternion);let s=this.radius;if(t&&(s*=this.system.worldScale.x),this.enabled){switch(this.shapeType){case 5:yp&&q.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(e);break;case 4:this.randomConePoint(this.position,this.angle,s,this.radiusThickness,this.arc,this.arcMode,this._vector);break;case 0:this.randomSpherePoint(this.position,s,this.radiusThickness,this.arc,this._vector);break;case 10:this.randomCirclePoint(this.position,s,this.radiusThickness,this.arc,this._vector);break;case 13:const o=this.meshRenderer;o?.destroyed==!1&&this.setMesh(o);const r=n.mesh=this._meshObj,l=n.mesh_geometry=this._meshGeometry;if(r&&l)switch(this.meshShapeType){case 0:{const c=l.getAttribute("position"),h=Math.floor(Math.random()*c.count);this._vector.fromBufferAttribute(c,h),this._vector.applyMatrix4(r.matrixWorld),n.mesh_normal=h}break;case 1:break;case 2:{const c=l.index;if(c){let h=Math.random(),d=Math.random();h+d>1&&(h=1-h,d=1-d);const u=Math.floor(Math.random()*(c.count/3));let p=u*3,g=u*3+1,f=u*3+2;p=c.getX(p),g=c.getX(g),f=c.getX(f);const y=l.getAttribute("position");this._triangle.a.fromBufferAttribute(y,p),this._triangle.b.fromBufferAttribute(y,g),this._triangle.c.fromBufferAttribute(y,f),this._vector.set(0,0,0).addScaledVector(this._triangle.a,h).addScaledVector(this._triangle.b,d).addScaledVector(this._triangle.c,1-(h+d)),this._vector.applyMatrix4(r.matrixWorld),n.mesh_normal=u}}break}break;default:this._vector.set(0,0,0),F()&&!globalThis.__particlesystem_shapetype_unsupported&&(console.warn("ParticleSystem ShapeType is not supported:",vp[this.shapeType]),globalThis.__particlesystem_shapetype_unsupported=!0);break}this.randomizePosition(this._vector,this.randomPositionAmount)}this.applyRotation(this._vector),t&&(this._vector.applyQuaternion(this.system.worldQuaternion),this._vector.add(this.system.worldPos)),yp&&q.DrawSphere(this._vector,.03,16711680,.5,!0)}getDirection(n,e){var 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 s=e.x,o=e.y,r=e.z;this._dir.set(s,o,r),(t=this.system)!=null&&t.worldspace?this._dir.sub(this.system.worldPos):this._dir.sub(this.position);break;case 13:const l=n.mesh,c=n.mesh_geometry;if(l&&c)switch(this.meshShapeType){case 0:{const h=c.getAttribute("normal"),d=n.mesh_normal;this._dir.fromBufferAttribute(h,d)}break;case 1:break;case 2:{const h=c.index;if(h){const d=n.mesh_normal,u=h.getX(d*3),p=h.getX(d*3+1),g=h.getX(d*3+2),f=c.getAttribute("position"),y=Q(),v=Q(),b=Q();y.fromBufferAttribute(f,u),v.fromBufferAttribute(f,p),b.fromBufferAttribute(f,g),y.sub(v),b.sub(v),y.cross(b),this._dir.copy(y).multiplyScalar(-1);const _=Se(l);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),yp&&(q.DrawSphere(e,.01,8925952,.5,!0),q.DrawDirection(e,this._dir,8925952,.5,!0)),this._dir}randomizePosition(n,e){if(e<=0)return;const t=Ko._tempVec;t.set(Math.random()*2-1,Math.random()*2-1,Math.random()*2-1),t.x*=e*this.scale.x,t.y*=e*this.scale.y,t.z*=e*this.scale.z,n.add(t)}randomizeDirection(n,e){if(e===0)return;const t=Ko._randomQuat,s=Ko._tempVec;s.set(Math.random()-.5,Math.random()-.5,Math.random()-.5).normalize(),t.setFromAxisAngle(s,e*Math.random()*Math.PI),n.applyQuaternion(t)}spherizeDirection(n,e){if(e===0)return;const t=Math.random()*Math.PI*2,s=Math.acos(1-Math.random()*2),o=Math.sin(s)*Math.cos(t),r=Math.sin(s)*Math.sin(t),l=Math.cos(s),c=new S(o,r,l);n.lerp(c,e)}randomSpherePoint(n,e,t,s,o){const r=Math.random(),l=Math.random(),c=2*Math.PI*r*(s/360),h=Math.acos(2*l-1),d=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),t)*e,u=n.x+this.scale.x*(-d*Math.sin(h)*Math.cos(c)),p=n.y+this.scale.y*(d*Math.sin(h)*Math.sin(c)),g=n.z+this.scale.z*(d*Math.cos(h));o.x=u,o.y=p,o.z=g}randomCirclePoint(n,e,t,s,o){const r=Math.random(),l=2*Math.PI*r*(s/360),c=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),t)*e,h=n.x+this.scale.x*c*Math.cos(l),d=n.y+this.scale.y*c*Math.sin(l),u=n.z;o.x=h,o.y=d,o.z=u}randomConePoint(n,e,t,s,o,r,l){let c=0,h=0;switch(r){case 0:c=Math.random(),h=Math.random();break;case 2:this._loopTime>1&&(this._loopDirection=-1),this._loopTime<0&&(this._loopDirection=1);case 1:c=.5,h=Math.random(),this._loopTime+=this.system.deltaTime*this._loopDirection;break}let d=2*Math.PI*c*(o/360);switch(r){case 2:case 1:d+=Math.PI+.5,d+=this._loopTime*Math.PI*2,d%=W.toRadians(o);break}const u=Math.acos(2*h-1),p=W.lerp(1,1-Math.pow(1-Math.random(),Math.PI),s)*t,g=n.x+-p*Math.sin(u)*Math.cos(d),f=n.y+p*Math.sin(u)*Math.sin(d),y=n.z;l.x=g*this.scale.x,l.y=f*this.scale.y,l.z=y*this.scale.z}},a(Ko,"_randomQuat",new H),a(Ko,"_tempVec",new S),Ko);O([m()],nt.prototype,"shapeType"),O([m()],nt.prototype,"enabled"),O([m()],nt.prototype,"alignToDirection"),O([m()],nt.prototype,"angle"),O([m()],nt.prototype,"arc"),O([m()],nt.prototype,"arcSpread"),O([m()],nt.prototype,"arcSpeedMultiplier"),O([m()],nt.prototype,"arcMode"),O([m(S)],nt.prototype,"boxThickness"),O([m(S)],nt.prototype,"position"),O([m(S)],nt.prototype,"rotation"),O([m(S)],nt.prototype,"scale"),O([m()],nt.prototype,"radius"),O([m()],nt.prototype,"radiusThickness"),O([m()],nt.prototype,"sphericalDirectionAmount"),O([m()],nt.prototype,"randomDirectionAmount"),O([m()],nt.prototype,"randomPositionAmount"),O([m()],nt.prototype,"meshShapeType"),O([m($c)],nt.prototype,"meshRenderer");let hy=nt;class Ce{constructor(){a(this,"damping"),a(this,"enabled"),a(this,"frequency"),a(this,"octaveCount"),a(this,"octaveMultiplier"),a(this,"octaveScale"),a(this,"positionAmount"),a(this,"quality"),a(this,"remap"),a(this,"remapEnabled"),a(this,"remapMultiplier"),a(this,"remapX"),a(this,"remapXMultiplier"),a(this,"remapY"),a(this,"remapYMultiplier"),a(this,"remapZ"),a(this,"remapZMultiplier"),a(this,"scrollSpeedMultiplier"),a(this,"separateAxes"),a(this,"strengthMultiplier"),a(this,"strengthX"),a(this,"strengthXMultiplier"),a(this,"strengthY"),a(this,"strengthYMultiplier"),a(this,"strengthZ"),a(this,"strengthZMultiplier"),a(this,"_noise"),a(this,"_time",0),a(this,"_temp",new S)}update(e){this._time+=e.time.deltaTime*this.scrollSpeedMultiplier}apply(e,t,s,o,r,l){if(!this.enabled)return;this._noise||(this._noise=lO(()=>0));const c=this._temp.set(t.x,t.y,t.z).multiplyScalar(this.frequency),h=this._noise(c.x,c.y,c.z,this._time),d=this._noise(c.x,c.y,c.z,this._time+1e3*this.frequency),u=this._noise(c.x,c.y,c.z,this._time+2e3*this.frequency);this._temp.set(h,d,u).normalize();const p=r/l;let g=this.positionAmount.evaluate(p);this.separateAxes?(this._temp.x*=g*this.strengthXMultiplier,this._temp.y*=g*this.strengthYMultiplier,this._temp.z*=g*this.strengthZMultiplier):(this.strengthX&&(g*=this.strengthX.evaluate(p)*1.5),this._temp.multiplyScalar(g)),s.x+=this._temp.x,s.y+=this._temp.y,s.z+=this._temp.z}}O([m()],Ce.prototype,"damping"),O([m()],Ce.prototype,"enabled"),O([m()],Ce.prototype,"frequency"),O([m()],Ce.prototype,"octaveCount"),O([m()],Ce.prototype,"octaveMultiplier"),O([m()],Ce.prototype,"octaveScale"),O([m(Z)],Ce.prototype,"positionAmount"),O([m()],Ce.prototype,"quality"),O([m(Z)],Ce.prototype,"remap"),O([m()],Ce.prototype,"remapEnabled"),O([m()],Ce.prototype,"remapMultiplier"),O([m(Z)],Ce.prototype,"remapX"),O([m()],Ce.prototype,"remapXMultiplier"),O([m(Z)],Ce.prototype,"remapY"),O([m()],Ce.prototype,"remapYMultiplier"),O([m(Z)],Ce.prototype,"remapZ"),O([m()],Ce.prototype,"remapZMultiplier"),O([m()],Ce.prototype,"scrollSpeedMultiplier"),O([m()],Ce.prototype,"separateAxes"),O([m()],Ce.prototype,"strengthMultiplier"),O([m(Z)],Ce.prototype,"strengthX"),O([m()],Ce.prototype,"strengthXMultiplier"),O([m(Z)],Ce.prototype,"strengthY"),O([m()],Ce.prototype,"strengthYMultiplier"),O([m(Z)],Ce.prototype,"strengthZ"),O([m()],Ce.prototype,"strengthZMultiplier");class Ne{constructor(){a(this,"enabled"),a(this,"attachRibbonToTransform",!1),a(this,"colorOverLifetime"),a(this,"colorOverTrail"),a(this,"dieWithParticles",!0),a(this,"inheritParticleColor",!0),a(this,"lifetime"),a(this,"lifetimeMultiplier"),a(this,"minVertexDistance",.2),a(this,"mode",0),a(this,"ratio",1),a(this,"ribbonCount",1),a(this,"shadowBias",0),a(this,"sizeAffectsLifetime",!1),a(this,"sizeAffectsWidth",!1),a(this,"splitSubEmitterRibbons",!1),a(this,"textureMode",0),a(this,"widthOverTrail"),a(this,"widthOverTrailMultiplier"),a(this,"worldSpace",!1)}getWidth(e,t,s,o){const r=this.widthOverTrail.evaluate(s,o);return e*=r,e}getColor(e,t,s){const o=this.colorOverTrail.evaluate(s),r=this.colorOverLifetime.evaluate(t);e.x*=o.r*r.r,e.y*=o.g*r.g,e.z*=o.b*r.b,"alpha"in o&&"alpha"in r&&(e.w*=o.alpha*r.alpha)}}O([m()],Ne.prototype,"enabled"),O([m()],Ne.prototype,"attachRibbonToTransform"),O([m(Kr)],Ne.prototype,"colorOverLifetime"),O([m(Kr)],Ne.prototype,"colorOverTrail"),O([m()],Ne.prototype,"dieWithParticles"),O([m()],Ne.prototype,"inheritParticleColor"),O([m(Z)],Ne.prototype,"lifetime"),O([m()],Ne.prototype,"lifetimeMultiplier"),O([m()],Ne.prototype,"minVertexDistance"),O([m()],Ne.prototype,"mode"),O([m()],Ne.prototype,"ratio"),O([m()],Ne.prototype,"ribbonCount"),O([m()],Ne.prototype,"shadowBias"),O([m()],Ne.prototype,"sizeAffectsLifetime"),O([m()],Ne.prototype,"sizeAffectsWidth"),O([m()],Ne.prototype,"splitSubEmitterRibbons"),O([m()],Ne.prototype,"textureMode"),O([m(Z)],Ne.prototype,"widthOverTrail"),O([m()],Ne.prototype,"widthOverTrailMultiplier"),O([m()],Ne.prototype,"worldSpace");class qe{constructor(){a(this,"enabled"),a(this,"space",0),a(this,"orbitalX"),a(this,"orbitalY"),a(this,"orbitalZ"),a(this,"orbitalXMultiplier"),a(this,"orbitalYMultiplier"),a(this,"orbitalZMultiplier"),a(this,"orbitalOffsetX"),a(this,"orbitalOffsetY"),a(this,"orbitalOffsetZ"),a(this,"speedModifier"),a(this,"speedModifierMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier"),a(this,"_system"),a(this,"_temp",new S),a(this,"_temp2",new S),a(this,"_temp3",new S),a(this,"_hasOrbital",!1),a(this,"_index",0),a(this,"_orbitalMatrix",new se)}update(e){this._system=e}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,s,o,r,l,c){var h;if(!this.enabled)return;const d=l/c,u=this.speedModifier.evaluate(d)*this.speedModifierMultiplier,p=this.x.evaluate(d),g=this.y.evaluate(d),f=this.z.evaluate(d);if(this._temp.set(-p,g,f),this._system&&this._system.main.simulationSpace===1&&this._temp.applyQuaternion(this._system.worldQuaternion),this._hasOrbital&&((h=this._system)==null?void 0:h.worldPos)){const y=this._temp2.set(s.x,s.y,s.z),v=this.orbitalXMultiplier,b=this.orbitalYMultiplier,_=this.orbitalZMultiplier,w=u*Math.PI*2*10,x=Math.cos(w*v),M=Math.sin(w*v),k=Math.cos(w*b),T=Math.sin(w*b),L=Math.cos(w*_),B=Math.sin(w*_),z=y.x*(k*L)+y.y*(k*B)+y.z*-T,j=y.x*(M*T*L-x*B)+y.y*(M*T*B+x*L)+y.z*(M*k),V=y.x*(x*T*L+M*B)+y.y*(x*T*B-M*L)+y.z*(x*k),G=this._temp3.set(y.x-z,y.y-j,y.z-V);G.normalize(),G.multiplyScalar(.2/r*Math.max(this.orbitalXMultiplier,this.orbitalYMultiplier,this.orbitalZMultiplier)),o.x+=G.x,o.y+=G.y,o.z+=G.z}o.x+=this._temp.x,o.y+=this._temp.y,o.z+=this._temp.z,o.x*=u,o.y*=u,o.z*=u}}O([m()],qe.prototype,"enabled"),O([m()],qe.prototype,"space"),O([m(Z)],qe.prototype,"orbitalX"),O([m(Z)],qe.prototype,"orbitalY"),O([m(Z)],qe.prototype,"orbitalZ"),O([m()],qe.prototype,"orbitalXMultiplier"),O([m()],qe.prototype,"orbitalYMultiplier"),O([m()],qe.prototype,"orbitalZMultiplier"),O([m()],qe.prototype,"orbitalOffsetX"),O([m()],qe.prototype,"orbitalOffsetY"),O([m()],qe.prototype,"orbitalOffsetZ"),O([m(Z)],qe.prototype,"speedModifier"),O([m()],qe.prototype,"speedModifierMultiplier"),O([m(Z)],qe.prototype,"x"),O([m()],qe.prototype,"xMultiplier"),O([m(Z)],qe.prototype,"y"),O([m()],qe.prototype,"yMultiplier"),O([m(Z)],qe.prototype,"z"),O([m()],qe.prototype,"zMultiplier");class zt{constructor(){a(this,"animation"),a(this,"enabled"),a(this,"cycleCount"),a(this,"frameOverTime"),a(this,"frameOverTimeMultiplier"),a(this,"numTilesX"),a(this,"numTilesY"),a(this,"startFrame"),a(this,"startFrameMultiplier"),a(this,"rowMode"),a(this,"rowIndex"),a(this,"spriteCount"),a(this,"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 s=this.frameOverTime.evaluate(e%1);return s*=this.frameOverTimeMultiplier,s*=t,s=s%t,s=Math.floor(s),s}}O([m()],zt.prototype,"animation"),O([m()],zt.prototype,"enabled"),O([m()],zt.prototype,"cycleCount"),O([m(Z)],zt.prototype,"frameOverTime"),O([m()],zt.prototype,"frameOverTimeMultiplier"),O([m()],zt.prototype,"numTilesX"),O([m()],zt.prototype,"numTilesY"),O([m(Z)],zt.prototype,"startFrame"),O([m()],zt.prototype,"startFrameMultiplier"),O([m()],zt.prototype,"rowMode"),O([m()],zt.prototype,"rowIndex"),O([m()],zt.prototype,"spriteCount"),O([m()],zt.prototype,"timeMode");class Ts{constructor(){a(this,"enabled"),a(this,"separateAxes"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t){return this.enabled?this.separateAxes?0:this.z.evaluate(e,t)*-1:0}}O([m()],Ts.prototype,"enabled"),O([m()],Ts.prototype,"separateAxes"),O([m(Z)],Ts.prototype,"x"),O([m()],Ts.prototype,"xMultiplier"),O([m(Z)],Ts.prototype,"y"),O([m()],Ts.prototype,"yMultiplier"),O([m(Z)],Ts.prototype,"z"),O([m()],Ts.prototype,"zMultiplier");class os{constructor(){a(this,"enabled"),a(this,"range"),a(this,"separateAxes"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t){if(!this.enabled)return 0;if(!this.separateAxes){const s=W.lerp(this.range.x,this.range.y,t);return this.z.evaluate(s)*-1}return 0}}O([m()],os.prototype,"enabled"),O([m()],os.prototype,"range"),O([m()],os.prototype,"separateAxes"),O([m(Z)],os.prototype,"x"),O([m()],os.prototype,"xMultiplier"),O([m(Z)],os.prototype,"y"),O([m()],os.prototype,"yMultiplier"),O([m(Z)],os.prototype,"z"),O([m()],os.prototype,"zMultiplier");class mt{constructor(){a(this,"enabled"),a(this,"dampen"),a(this,"drag"),a(this,"dragMultiplier"),a(this,"limit"),a(this,"limitMultiplier"),a(this,"separateAxes"),a(this,"limitX"),a(this,"limitXMultiplier"),a(this,"limitY"),a(this,"limitYMultiplier"),a(this,"limitZ"),a(this,"limitZMultiplier"),a(this,"multiplyDragByParticleSize",!1),a(this,"multiplyDragByParticleVelocity",!1),a(this,"space"),a(this,"_temp",new S),a(this,"_temp2",new S)}apply(e,t,s,o,r,l,c){if(this.enabled){const h=this.limit.evaluate(r)*this.limitMultiplier;if(t.length()>h){this._temp.copy(t).normalize().multiplyScalar(h);const d=this.dampen*.5;t.x=W.lerp(t.x,this._temp.x,d),t.y=W.lerp(t.y,this._temp.y,d),t.z=W.lerp(t.z,this._temp.z,d),s.x=W.lerp(s.x,this._temp.x,d),s.y=W.lerp(s.y,this._temp.y,d),s.z=W.lerp(s.z,this._temp.z,d)}}}}O([m()],mt.prototype,"enabled"),O([m()],mt.prototype,"dampen"),O([m(Z)],mt.prototype,"drag"),O([m()],mt.prototype,"dragMultiplier"),O([m(Z)],mt.prototype,"limit"),O([m()],mt.prototype,"limitMultiplier"),O([m()],mt.prototype,"separateAxes"),O([m(Z)],mt.prototype,"limitX"),O([m()],mt.prototype,"limitXMultiplier"),O([m(Z)],mt.prototype,"limitY"),O([m()],mt.prototype,"limitYMultiplier"),O([m(Z)],mt.prototype,"limitZ"),O([m()],mt.prototype,"limitZMultiplier"),O([m()],mt.prototype,"multiplyDragByParticleSize"),O([m()],mt.prototype,"multiplyDragByParticleVelocity"),O([m()],mt.prototype,"space");const uh=class mC{constructor(){a(this,"enabled"),a(this,"curve"),a(this,"curveMultiplier"),a(this,"mode"),a(this,"system"),a(this,"_temp",new S),a(this,"_firstUpdate",!0),a(this,"_frames",0)}clone(){var e;const t=new mC;return t.enabled=this.enabled,t.curve=(e=this.curve)==null?void 0:e.clone(),t.curveMultiplier=this.curveMultiplier,t.mode=this.mode,t}get _lastWorldPosition(){return this.system._iv_lastWorldPosition||(this.system._iv_lastWorldPosition=new S),this.system._iv_lastWorldPosition}get _velocity(){return this.system._iv_velocity||(this.system._iv_velocity=new S),this.system._iv_velocity}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}}applyCurrent(e,t,s){if(this.enabled&&this.system&&this.system.worldspace!==!1&&this.mode===1){const o=this.curve.evaluate(t,s);this._temp.copy(this._velocity).multiplyScalar(o),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}};O([m()],uh.prototype,"enabled"),O([m(Z)],uh.prototype,"curve"),O([m()],uh.prototype,"curveMultiplier"),O([m()],uh.prototype,"mode");let dy=uh;class fi{constructor(){a(this,"enabled"),a(this,"range"),a(this,"separateAxes"),a(this,"size"),a(this,"sizeMultiplier"),a(this,"x"),a(this,"xMultiplier"),a(this,"y"),a(this,"yMultiplier"),a(this,"z"),a(this,"zMultiplier")}evaluate(e,t,s,o){const r=e.length(),l=W.remap(r,this.range.x,this.range.y,0,1),c=this.size.evaluate(l,s);return o.x*=c,o.y*=c,o.z*=c,o}}O([m()],fi.prototype,"enabled"),O([m(re)],fi.prototype,"range"),O([m()],fi.prototype,"separateAxes"),O([m(Z)],fi.prototype,"size"),O([m()],fi.prototype,"sizeMultiplier"),O([m(Z)],fi.prototype,"x"),O([m()],fi.prototype,"xMultiplier"),O([m(Z)],fi.prototype,"y"),O([m()],fi.prototype,"yMultiplier"),O([m(Z)],fi.prototype,"z"),O([m()],fi.prototype,"zMultiplier");class vl{constructor(){a(this,"enabled"),a(this,"range"),a(this,"color")}evaluate(e,t,s){const o=e.length(),r=W.remap(o,this.range.x,this.range.y,0,1),l=this.color.evaluate(r,t);s.x*=l.r,s.y*=l.g,s.z*=l.b,"alpha"in l&&(s.w*=l.alpha)}}O([m()],vl.prototype,"enabled"),O([m(re)],vl.prototype,"range"),O([m(Kr)],vl.prototype,"color"),new S(1,1,1),new S(0,0,1);class uy{constructor(e,t,s,o){a(this,"type","NeedleParticleSubEmitter"),a(this,"emitterType"),a(this,"emitterProbability"),a(this,"q_",new H),a(this,"v_",new S),a(this,"v2_",new S),a(this,"_emitterMatrix",new Im),a(this,"_circularBuffer"),this.system=e,this.particleSystem=t,this.subSystem=s,this.subParticleSystem=o,this.subParticleSystem&&this.subParticleSystem&&(this.subParticleSystem.onlyUsedByOther=!0);const r=1e3;this._circularBuffer=new Si(()=>new Im,r)}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===py.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===py.Death){let o=e.life;if(e[bl]!==void 0&&(o=e[bl]),!(e.age+t*1.2>=o))return;const r=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=r}const s=new Im;s.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||s.multiplyMatrices(this._emitterMatrix,s),this.subParticleSystem.emit(t,e.emissionState,s)}}var YA=Object.defineProperty,We=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&YA(e,t,o),o};const Zo=C("debugparticles"),KA=C("noprogressive"),ZA=C("debugprogressive");var py=(n=>(n[n.Birth=0]="Birth",n[n.Collision=1]="Collision",n[n.Death=2]="Death",n[n.Trigger=3]="Trigger",n[n.Manual=4]="Manual",n))(py||{});class rs extends I{constructor(){super(...arguments),a(this,"renderMode"),a(this,"particleMaterial"),a(this,"trailMaterial"),a(this,"particleMesh"),a(this,"maxParticleSize"),a(this,"minParticleSize"),a(this,"velocityScale"),a(this,"cameraVelocityScale"),a(this,"lengthScale")}start(){if(this.maxParticleSize!==.5&&this.minParticleSize!==0&&F()){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(){var e;return((e=this.particleMaterial)==null?void 0:e.transparent)??!1}getMaterial(e=!1){let t=e===!0&&this.trailMaterial?this.trailMaterial:this.particleMaterial;if(t){if(t.type==="MeshStandardMaterial"){Zo&&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=xn,t.map.premultiplyAlpha=!1);const s=new Me;s.copy(t),e?this.trailMaterial=s:this.particleMaterial=s}t.map&&(t.map.colorSpace=xn,t.map.premultiplyAlpha=!1),e&&t.side===po&&(t=t.clone(),t.side=cd,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!KA&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,ZA&&console.log("Load material LOD",t.name),Xe.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof X&&(t=this.particleMesh.geometry),t===null)){t=new zs(1,1);const s=t.attributes.uv;for(let o=0;o<s.count;o++)s.setX(o,1-s.getX(o))}return new X(t,this.getMaterial())}}We([m()],rs.prototype,"renderMode"),We([m(Pe)],rs.prototype,"particleMaterial"),We([m(Pe)],rs.prototype,"trailMaterial"),We([m()],rs.prototype,"maxParticleSize"),We([m()],rs.prototype,"minParticleSize"),We([m()],rs.prototype,"velocityScale"),We([m()],rs.prototype,"cameraVelocityScale"),We([m()],rs.prototype,"lengthScale");class wp{constructor(e,t=1){a(this,"_curve"),a(this,"_factor"),a(this,"type","function"),this._curve=e,this._factor=t}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 my{constructor(e){a(this,"type","value"),a(this,"system"),this.system=e}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}startGen(e){}}class JA extends my{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class e2 extends my{constructor(){super(...arguments),a(this,"_lastPosition",new S),a(this,"_lastDistance",0)}update(){const e=ee(this.system.gameObject);this._lastDistance=this._lastPosition.distanceTo(e),this._lastPosition.copy(e)}genValue(){if(!this.system.isPlaying||!this.system.emission.enabled||this.system.currentParticles>=this.system.maxParticles)return 0;let e=this.system.emission.rateOverTime.evaluate(this.system.time/this.system.duration,Math.random());if(this.system.deltaTime>0){const o=this.system.emission.rateOverDistance.evaluate(this.system.time/this.system.duration,Math.random());let r=this._lastDistance/this.system.deltaTime*o;Number.isFinite(r)||(r=0),e+=r}const t=this.system.emission.getBurst();t>0&&(e+=t/this.system.deltaTime);const s=this.system.maxParticles-this.system.currentParticles;return W.clamp(e,0,s/this.system.deltaTime)}}class t2 extends my{genValue(){return this.system.isPlaying,0}}class Jo{constructor(e){a(this,"system"),a(this,"type"),this.type=Object.getPrototypeOf(this).constructor.name||"ParticleSystemBaseBehaviour",e&&(this.system=e)}get context(){return this.system.context}initialize(e){}update(e,t){}frameUpdate(e){}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}reset(){}}class i2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleTextureSheet")}update(e,t){const s=this.system.textureSheetAnimation;if(s.enabled){const o=e.age/e.life,r=s.evaluate(o);r!==void 0&&(e.uvTile=r)}}}const X1=Symbol("particleRotation");class s2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleRotation")}initialize(e){e[X1]=Math.random()}update(e,t){if(e.rotation===void 0)return;const s=e.age/e.life;if(typeof e.rotation=="number"&&(this.system.rotationOverLifetime.enabled?e.rotation+=this.system.rotationOverLifetime.evaluate(s,e[X1])*t:this.system.renderer.renderMode===Qn.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const o=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(s,o)*t}}}const Q1=Symbol("sizeLerpFactor"),n2=new S;class o2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleSize"),a(this,"_minSize",0),a(this,"_maxSize",1)}initialize(e){e[Q1]=Math.random(),this._minSize=this.system.renderer.minParticleSize,this._maxSize=this.system.renderer.maxParticleSize}update(e,t){const s=e.age/e.life;let o=1;this.system.sizeOverLifetime.enabled&&(o*=this.system.sizeOverLifetime.evaluate(s,void 0,e[Q1]).x);let r=1;this.system.renderer.renderMode!==Qn.Mesh&&(r=this.system.worldScale.x/this.system.cameraScale);const l=Q(e.startSize).multiplyScalar(o*r);if(e.size.set(l.x,l.y,l.z),this.system.localspace){const c=eS(this.system,n2);e.size.x*=c.x,e.size.y*=c.y,e.size.z*=c.z}}}const bl=Symbol("particleLife"),gy=Symbol("trailLifetime"),Y1=Symbol("trailStartLength"),fy=Symbol("trailWidthRandom");class r2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleTrail")}initialize(e){e instanceof Nv&&(e[bl]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[gy]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[gy]),e[Y1]=e.length,e[fy]=Math.random())}update(e){var t;if((t=this.system.trails)!=null&&t.enabled&&e instanceof Nv){const s=e,o=e.age/e[bl],r=e.previous.values(),l=e.previous.length;for(let c=0;c<l;c++){const h=r.next().value,d=1-c/(l-1),u=e.size;if(u.x<=0&&!this.system.trails.sizeAffectsWidth){const p=20*this.system.trails.widthOverTrail.evaluate(.5,s[fy]);u.x=p,u.y=p,u.z=p}h.size=this.system.trails.getWidth(u.x,o,d,s[fy]),h.color.copy(e.color),this.system.trails.getColor(h.color,o,d)}if(e.age>e[bl]){e.velocity.set(0,0,0);const c=(e.age-e[bl])/e[gy];s.length=W.lerp(e[Y1],0,c)}}}}const xp=Symbol("startVelocity"),K1=Symbol("gravityModifier"),yy=Symbol("gravitySpeed"),Sp=Symbol("velocity lerp factor"),vy=new S;class a2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleVelocity"),a(this,"_gravityDirection",new S)}initialize(e){var t,s;const o=this.system.main.simulationSpeed;e.startSpeed=this.system.main.startSpeed.evaluate(Math.random(),Math.random());const r=this.system.shape.getDirection(e,e.position);e.velocity.x=r.x*e.startSpeed,e.velocity.y=r.y*e.startSpeed,e.velocity.z=r.z*e.startSpeed,(t=this.system.inheritVelocity)!=null&&t.enabled&&this.system.inheritVelocity.applyInitial(e.velocity),e[xp]?e[xp].copy(e.velocity):e[xp]=e.velocity.clone();const l=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[K1]=l*o,e[yy]=l*o*.5,e[Sp]=Math.random(),(s=this.system.velocityOverLifetime)==null||s.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===dh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){var s;const o=e[xp],r=e[K1];if(r!==0){const g=r*e[yy];vy.copy(this._gravityDirection).multiplyScalar(g),e[yy]+=t*.05,o.add(vy)}e.velocity.copy(o);const l=e.age/e.life;(s=this.system.inheritVelocity)!=null&&s.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,l,e[Sp]);const c=this.system.noise;c.enabled&&c.apply(0,e.position,e.velocity,t,e.age,e.life);const h=this.system.sizeBySpeed;h!=null&&h.enabled&&(e.size=h.evaluate(e.velocity,l,e[Sp],e.size));const d=this.system.colorBySpeed;d!=null&&d.enabled&&d.evaluate(e.velocity,e[Sp],e.color);const u=this.system.velocityOverLifetime;u.enabled&&u.apply(e,0,e.position,e.velocity,t,e.age,e.life);const p=this.system.limitVelocityOverLifetime;if(p.enabled&&p.apply(e.position,o,e.velocity,e.size,l,t,1),this.system.worldspace){const g=this.system.worldScale;e.velocity.x*=g.x,e.velocity.y*=g.y,e.velocity.z*=g.z}}}const Z1=Symbol("colorLerpFactor"),J1=new ce(1,1,1,1),Jr=new ce(1,1,1,1);class l2 extends Jo{constructor(){super(...arguments),a(this,"type","NeedleColor")}initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;Jr.copy(this.system.main.startColor.evaluate(Math.random())),t!=null&&t.color&&(J1.copy(t.color),Jr.multiply(J1)),Jr.convertLinearToSRGB(),e.startColor.set(Jr.r,Jr.g,Jr.b,Jr.alpha),e.color.copy(e.startColor),e[Z1]=Math.random()}update(e,t){if(e.age===0&&this._init(e),this.system.colorOverLifetime.enabled){const s=e.age/e.life,o=this.system.colorOverLifetime.color.evaluate(s,e[Z1]);e.color.set(o.r,o.g,o.b,"alpha"in o?o.alpha:1).multiply(e.startColor)}else e.color.copy(e.startColor)}}class c2{constructor(e){a(this,"system"),a(this,"emission"),a(this,"autoDestroy"),a(this,"startLength"),a(this,"emissionBursts"),a(this,"onlyUsedByOther"),a(this,"behaviors",[]),a(this,"rendererEmitterSettings",{startLength:new pO(220),followLocalOrigin:!1}),a(this,"flatWhiteTexture"),a(this,"clonedTexture",{original:void 0,clone:void 0}),this.system=e,this.emission=new e2(this.system)}get anim(){return this.system.textureSheetAnimation}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()}get looping(){return this.system.main.loop}get duration(){return this.system.duration}get shape(){return this.system.shape}get startLife(){return new wp(this.system.main.startLifetime)}get startSpeed(){return new wp(this.system.main.startSpeed)}get startRotation(){return new wp(this.system.main.startRotation)}get startSize(){return new wp(this.system.main.startSize)}get startColor(){return new dO(new uO(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new t2(this.system)}get instancingGeometry(){return this.system.renderer.getMesh(this.system.renderer.renderMode).geometry}get renderMode(){if(this.system.trails.enabled===!0)return kn.Trail;switch(this.system.renderer.renderMode){case Qn.Billboard:return kn.BillBoard;case Qn.Stretch:return kn.StretchedBillBoard;case Qn.HorizontalBillboard:return kn.HorizontalBillBoard;case Qn.VerticalBillboard:return kn.VerticalBillBoard;case Qn.Mesh:return kn.Mesh}return kn.BillBoard}get speedFactor(){var e;let t=this.system.main.simulationSpeed;return((e=this.system.renderer)==null?void 0:e.renderMode)===Qn.Stretch&&(t*=this.system.renderer.velocityScale??1),t}get texture(){const e=this.material;if(e&&e.map){const t=e.map;if(this.clonedTexture.original!==t||!this.clonedTexture.clone){const s=t.clone();s.premultiplyAlpha=!1,s.colorSpace=xn,this.clonedTexture.original=t,this.clonedTexture.clone=s}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=df(new ce(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new JA(this.system)}get uTileCount(){var e;return this.anim.enabled?(e=this.anim)==null?void 0:e.numTilesX:void 0}get vTileCount(){var e;return this.anim.enabled?(e=this.anim)==null?void 0:e.numTilesY:void 0}get renderOrder(){return 1}get blending(){var e;return((e=this.system.renderer.particleMaterial)==null?void 0:e.blending)??SP}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===dh.World}}class h2{constructor(){a(this,"burstParticleIndex",0),a(this,"burstParticleCount",0),a(this,"isBursting",!1),a(this,"travelDistance",0),a(this,"previousWorldPos"),a(this,"burstIndex",0),a(this,"burstWaveIndex",0),a(this,"time",0),a(this,"waitEmiting",0)}}const Nt=class pm extends I{constructor(){super(...arguments),a(this,"_state"),a(this,"colorOverLifetime"),a(this,"main"),a(this,"emission"),a(this,"sizeOverLifetime"),a(this,"shape"),a(this,"noise"),a(this,"trails"),a(this,"velocityOverLifetime"),a(this,"limitVelocityOverLifetime"),a(this,"inheritVelocity"),a(this,"colorBySpeed"),a(this,"textureSheetAnimation"),a(this,"rotationOverLifetime"),a(this,"rotationBySpeed"),a(this,"sizeBySpeed"),a(this,"_cameraScale",1),a(this,"__worldQuaternion",new H),a(this,"_worldQuaternionInverted",new H),a(this,"_worldScale",new S),a(this,"_worldPositionFrame",-1),a(this,"_worldPos",new S),a(this,"_renderer"),a(this,"_batchSystem"),a(this,"_particleSystem"),a(this,"_interface"),a(this,"_container"),a(this,"_time",0),a(this,"_isPlaying",!0),a(this,"_isUsedAsSubsystem",!1),a(this,"_didPreWarm",!1),a(this,"_bursts"),a(this,"_subEmitterSystems"),a(this,"_lastBatchesCount",-1)}play(e=!1){var t;e&&P.foreachComponent(this.gameObject,s=>{s instanceof pm&&s!==this&&s.play(!1)},!0),this._isPlaying=!0,this._particleSystem&&(this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1),(t=this.emission)==null||t.reset()}pause(e=!0){e&&P.foreachComponent(this.gameObject,t=>{t instanceof pm&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&P.foreachComponent(this.gameObject,s=>{s instanceof pm&&s!==this&&s.stop(!1,t)},!0),this._isPlaying=!1,this._time=0,t&&this.reset()}reset(){var e;this._time=0,this._particleSystem&&(this._particleSystem.particleNum=0,this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1,(e=this.emission)==null||e.reset())}emit(e){if(this._particleSystem){this.onUpdate(),e=Math.min(e,this.maxParticles-this.currentParticles),this._state||(this._state=new h2),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}get renderer(){return this._renderer}get isPlaying(){return this._isPlaying}get currentParticles(){var e;return((e=this._particleSystem)==null?void 0:e.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}get container(){return this._container}get worldspace(){return this.main.simulationSpace===dh.World}get localspace(){return this.main.simulationSpace===dh.Local}get worldQuaternion(){return this.__worldQuaternion}get worldQuaternionInverted(){return this._worldQuaternionInverted}get worldScale(){return this._worldScale}get worldPos(){return this._worldPositionFrame!==this.context.time.frame&&(this._worldPositionFrame=this.context.time.frame,ee(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof Jo&&(e.system=this),Zo&&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,s=t.indexOf(e);return s!==-1&&((F()||Zo)&&console.debug("Remove custom ParticleSystem Behaviour",s,e),t.splice(s,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}set bursts(e){for(let t=0;t<e.length;t++){const s=e[t];if(!(s instanceof bp)){const o=new bp;La(o,s),e[t]=o}}this._bursts=e}set subEmitterSystems(e){for(let t=0;t<e.length;t++){const s=e[t];if(!(s instanceof Cp)){const o=new Cp;La(o,s),e[t]=o}}Zo&&e.length>0&&console.log("SubEmitters: ",e,this),this._subEmitterSystems=e}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(rs),!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 A,this._container.matrixAutoUpdate=!1,this.context.scene.add(this._container),this._batchSystem=new cO,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new c2(this),this._particleSystem=new hO(this._interface),this._particleSystem.addBehavior(new o2(this)),this._particleSystem.addBehavior(new l2(this)),this._particleSystem.addBehavior(new i2(this)),this._particleSystem.addBehavior(new s2(this)),this._particleSystem.addBehavior(new a2(this)),this._particleSystem.addBehavior(new r2(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),Zo&&(console.log(this),this.gameObject.add(new wi(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof X&&this._interface.renderMode==kn.Mesh&&Xe.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==kn.Mesh&&(this.particleSystem.instancingGeometry=e)})}onDestroy(){var e,t,s,o;(e=this._container)==null||e.removeFromParent(),(t=this._batchSystem)==null||t.removeFromParent(),(s=this._particleSystem)==null||s.emitter.removeFromParent(),(o=this._particleSystem)==null||o.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(){var e;this.main&&(this._didPreWarm===!1&&((e=this.main)==null?void 0:e.prewarm)===!0&&(this._didPreWarm=!0,this.preWarm()),this.onUpdate(),this.onSimulate(this.deltaTime))}preWarm(){var e;if(!((e=this.emission)!=null&&e.enabled)||this.emission.rateOverTime.getMax()<=0)return;const t=1/60,s=this.main.duration,o=this.main.startLifetime.getMax(),r=Math.min(Math.max(s,o)/Math.max(.01,this.main.simulationSpeed),1e3),l=Math.ceil(r/t),c=Date.now();Zo&&console.log(`Particles ${this.name} - Prewarm for ${l} frames (${r} sec). Duration: ${s}, Lifetime: ${o}`);for(let h=0;h<l&&!(this.currentParticles>=this.maxParticles);h++){const d=Date.now()-c;if(d>2e3){console.warn(`Particles ${this.name} - Prewarm took too long. Aborting: ${d}`);break}this.onUpdate(),this.onSimulate(t)}}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 s=this.layer;t.layers.mask=1<<s}}onUpdate(){var e,t;if(this._bursts&&(this.emission.bursts=this._bursts,delete this._bursts),!this._isPlaying)return;const s=this.context.mainCamera;if(s){const l=Ge(s);this._cameraScale=l.x}const o=!this.worldspace,r=this.gameObject;if(Se(r,this.__worldQuaternion),this._worldQuaternionInverted.copy(this.__worldQuaternion).invert(),Ge(this.gameObject,this._worldScale),o&&this._container&&(e=this.gameObject)!=null&&e.parent){const l=eS(this,vy);this._container.matrix.makeScale(l.x,l.y,l.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),(t=this.inheritVelocity)==null||t.update(this.context),this.velocityOverLifetime.update(this)}addSubParticleSystems(){var e;if(this._subEmitterSystems&&this._particleSystem)for(const t of this._subEmitterSystems){t.particleSystem&&(t.particleSystem.__internalAwake?t.particleSystem.__internalAwake():F()&&console.warn("SubParticleSystem serialization issue(?)",t.particleSystem,t));const s=(e=t.particleSystem)==null?void 0:e._particleSystem;if(s){t.particleSystem._isUsedAsSubsystem=!0;const o=new uy(this,this._particleSystem,t.particleSystem,s);o.emitterType=t.type,o.emitterProbability=t.emitProbability,this._particleSystem.addBehavior(o)}else Zo&&console.warn("Could not add SubParticleSystem",t,this)}}};We([m(_p)],Nt.prototype,"colorOverLifetime"),We([m(Ut)],Nt.prototype,"main"),We([m(Kn)],Nt.prototype,"emission"),We([m(Zr)],Nt.prototype,"sizeOverLifetime"),We([m(hy)],Nt.prototype,"shape"),We([m(Ce)],Nt.prototype,"noise"),We([m(Ne)],Nt.prototype,"trails"),We([m(qe)],Nt.prototype,"velocityOverLifetime"),We([m(mt)],Nt.prototype,"limitVelocityOverLifetime"),We([m(dy)],Nt.prototype,"inheritVelocity"),We([m(vl)],Nt.prototype,"colorBySpeed"),We([m(zt)],Nt.prototype,"textureSheetAnimation"),We([m(Ts)],Nt.prototype,"rotationOverLifetime"),We([m(os)],Nt.prototype,"rotationBySpeed"),We([m(fi)],Nt.prototype,"sizeBySpeed");let ph=Nt;class Cp{constructor(){a(this,"particleSystem"),a(this,"emitProbability",1),a(this,"properties"),a(this,"type")}_deserialize(e,t){const s=this.particleSystem;if(s instanceof ph)return;let o="";s&&typeof s.guid=="string"&&(o=s.guid,this.particleSystem=P.findByGuid(o,t)),Zo&&!(this.particleSystem instanceof ph)&&console.warn("Could not find particle system for sub emitter",o,t,this)}}function eS(n,e){if(e.set(1,1,1),n.gameObject.parent&&n.localspace)switch(n.main.scalingMode){case cy.Local:e=Ge(n.gameObject.parent,e),e.x=1/e.x,e.y=1/e.y,e.z=1/e.z;break;default:if(!n.unsupported_scaling_mode){n.unsupported_scaling_mode=!0;const t="ParticleSystem scale mode "+cy[n.main.scalingMode]+" is not supported";F()&&be(t),console.warn(t,n.name,n)}e=Ge(n.gameObject,e);break}return e}class Dl extends I{constructor(){super(...arguments),a(this,"_didAssignPlayerColor",!1),a(this,"tryAssignColor",()=>{const e=P.getComponentInParent(this.gameObject,ks);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=P.getComponentInParent(this.gameObject,ai);return t!=null&&t.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1})}onEnable(){this.context.connection.beginListen(ie.JoinedRoom,this.tryAssignColor),this._didAssignPlayerColor||this.startCoroutine(this.waitForConnection())}onDisable(){this.context.connection.stopListen(ie.JoinedRoom,this.tryAssignColor)}*waitForConnection(){for(;!this.destroyed&&this.activeAndEnabled&&(yield cf(.2),!this.tryAssignColor()););}assignUserColor(e){const t=Dl.hashCode(e),s=Dl.colorFromHashCode(t);if(this.gameObject.type==="Mesh"){const o=this.gameObject;this.assignColor(s,e,o)}else if(this.gameObject.children)for(const o of this.gameObject.children){const r=o;r.material&&r.material.color&&this.assignColor(s,e,r)}}assignColor(e,t,s){let o=s.material;o&&(o._playerMaterial!==t&&(o=o.clone(),o._playerMaterial=t,s.material=o),o.color=e)}static hashCode(e){var t=0,s,o;if(e.length===0)return t;for(s=0;s<e.length;s++)o=e.charCodeAt(s),t=(t<<5)-t+o,t|=0;return t}static colorFromHashCode(e){const t=(e&16711680)>>16,s=(e&65280)>>8,o=e&255;return new ae(t/255,s/255,o/255)}}const d2=C("debugpost");let by=null;function u2(n){by=n}function tS(n){let e=n.gameObject;for(;e;){for(const t of Jd(e))if(t.isPostProcessingManager===!0)return t;e=e.parent}return null}function p2(n){let e=tS(n);if(!e)if(by){d2&&console.warn("Adding postprocessing manager to the scene.");const t=n.scene;e=Mi(t,by)}else F()&&console.warn("No post processing manager found");return e}var m2=Object.defineProperty,g2=Object.getOwnPropertyDescriptor,iS=(n,e,t,s)=>{for(var o=g2(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&m2(e,t,o),o};const f2=C("debugpost");class N{constructor(e){a(this,"isVolumeParameter",!0),a(this,"_isInitialized",!1),a(this,"_active",!0),a(this,"_value"),a(this,"_valueRaw"),a(this,"_defaultValue"),a(this,"valueProcessor"),a(this,"onValueChanged"),e!==void 0&&this.initialize(e)}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)}get value(){return this._valueRaw}set value(e){this.isInitialized||this.initialize(e),this.processValue(e,!1)}set defaultValue(e){this._defaultValue=e}__init(){this.processValue(this._valueRaw,!0)}processValue(e,t){if(e==null||!t&&this.testIfValueChanged(e)===!1)return;const s=this._value;f2&&typeof s=="number"&&typeof e=="number"&&(s?.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,s,this)}testIfValueChanged(e){return this._valueRaw!==e}}iS([m()],N.prototype,"overrideState"),iS([m()],N.prototype,"value");class y2 extends Ki{constructor(){super([N])}onSerialize(e,t){}onDeserialize(e,t){const s=t.target,o=t.path;let r;if(s&&o&&(r=s[o]),(typeof r!="object"||typeof r=="object"&&r.isVolumeParameter!==!0)&&(r=new N),typeof e=="object"&&"value"in e){const l=e.value;r.initialize(l),r.overrideState=e.overrideState}else r.value=e;return r}}new y2;var v2=Object.defineProperty,b2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&v2(e,t,o),o};const _y=C("debugpost");class ot extends I{constructor(e=void 0){if(super(),a(this,"active",!0),a(this,"_manager",null),a(this,"_result"),a(this,"_postprocessingContext",null),e)for(const t of Object.keys(e)){const s=e[t],o=this[t];o instanceof N?o.initialize(s):o!==void 0&&(this[t]=s)}}get isPostProcessingEffect(){return!0}onEnable(){super.onEnable(),_y&&console.warn("onEnable effect",this,this.__internalDidAwakeAndStart),this.__internalDidAwakeAndStart&&(this.active=!0),this.onEffectEnabled()}onDisable(){var e;super.onDisable(),_y&&console.warn("onDisable effect",this),(e=this._manager)==null||e.removeEffect(this),this.active=!1}onEffectEnabled(e){var t;e&&e.isPostProcessingManager===!0?this._manager=e:this._manager||(this._manager=p2(this)),(t=this._manager)==null||t.addEffect(this)}init(){}get postprocessingContext(){return this._postprocessingContext}apply(e){var t;return this._postprocessingContext=e,this._result||(this.initParameters(),this._result=(t=this.onCreateEffect)==null?void 0:t.call(this)),this._result&&this.initParameters(),this._result}unapply(){}dispose(){_y&&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 s=this[t];s instanceof N&&s.__init()}}onEditorModification(e){const t=e.propertyName;if(this[t]instanceof N){const s=e.value;return this[t].value=s,!0}}}b2([m()],ot.prototype,"active");var _2=Object.defineProperty,w2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&_2(e,t,o),o};const x2=C("debugpost"),wy={};function as(n,e){wy[n]=e}function S2(n){return n.__type in wy?wy[n.__type]:(x2&&n.__type&&console.warn("Unknown postprocessing type",n.__type,n),ot)}class Pp{constructor(){a(this,"components",[])}__init(e){var t;(t=this.components)==null||t.forEach(s=>{s.gameObject===void 0&&e.gameObject.addComponent(s),s.init()})}addEffect(e){this.components.push(e)}removeEffect(e){const t=this.components.indexOf(e);t>=0&&this.components.splice(t,1)}}w2([Tr([n=>S2(n),ot])],Pp.prototype,"components");var C2=Object.defineProperty,P2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&C2(e,t,o),o};class mh extends ot{constructor(){super(...arguments),a(this,"preset",new N(2))}get typeName(){return"Antialiasing"}onCreateEffect(){const e=new D.POSTPROCESSING.MODULE.SMAAEffect({preset:D.POSTPROCESSING.MODULE.SMAAPreset.HIGH,edgeDetectionMode:D.POSTPROCESSING.MODULE.EdgeDetectionMode.DEPTH});return this.preset.onValueChanged=t=>{e.applyPreset(t)},e}}P2([m(N)],mh.prototype,"preset"),as("Antialiasing",mh);var O2=Object.defineProperty,xy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&O2(e,t,o),o},Op;const kp=(Op=class extends ot{constructor(){super(...arguments),a(this,"threshold",new N(.9)),a(this,"intensity",new N(1)),a(this,"scatter",new N(.3)),a(this,"selectiveBloom")}get typeName(){return"Bloom"}init(){this.threshold.valueProcessor=n=>n,this.intensity.valueProcessor=n=>n,this.scatter.valueProcessor=n=>n}onCreateEffect(){let n;if(this.selectiveBloom==null&&(this.selectiveBloom=Op.useSelectiveBloom),this.selectiveBloom){const e=n=new D.POSTPROCESSING.MODULE.SelectiveBloomEffect(this.context.scene,this.context.mainCamera,{blendFunction:D.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});e.inverted=!0}else n=new D.POSTPROCESSING.MODULE.BloomEffect({blendFunction:D.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});return this.intensity.onValueChanged=e=>{n.intensity=e},this.threshold.onValueChanged=e=>{n.luminanceMaterial.threshold=Math.pow(e,2.2)},this.scatter.onValueChanged=e=>{n.luminancePass.enabled=!0,n.luminanceMaterial.smoothing=e,n.mipmapBlurPass&&(n.mipmapBlurPass.radius=_n.lerp(.1,.9,e))},n}},a(Op,"useSelectiveBloom",!1),Op);xy([m(N)],kp.prototype,"threshold"),xy([m(N)],kp.prototype,"intensity"),xy([m(N)],kp.prototype,"scatter");let Mp=kp;as("Bloom",Mp);var k2=Object.defineProperty,M2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&k2(e,t,o),o};class gh extends ot{constructor(){super(...arguments),a(this,"intensity",new N(0))}get typeName(){return"ChromaticAberration"}onCreateEffect(){const e=new D.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new re(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}}M2([m(N)],gh.prototype,"intensity"),as("ChromaticAberration",gh);var R2=Object.defineProperty,sS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&R2(e,t,o),o};const Rp=C("debugpost");var Tp=(n=>(n[n.None=0]="None",n[n.Neutral=1]="Neutral",n[n.ACES=2]="ACES",n[n.AgX=3]="AgX",n[n.KhronosNeutral=4]="KhronosNeutral",n))(Tp||{});function Sy(n){switch(n){case 0:return dd;case 1:return km;case 2:return Mm;case 3:return hd;case 4:return Nl;default:return Rp&&console.warn("[Postprocessing] Unknown tone mapping mode",n),Nl}}function T2(n){switch(n){case dd:return 0;case Mm:return 2;case hd:return 3;case Nl:return 1;case km:return 1;default:return 0}}function nS(n){switch(n){case dd:return D.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case Mm:return D.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case hd:return D.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case Nl:return D.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case km:return D.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return D.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}const Cy=class gC extends ot{constructor(){super(...arguments),a(this,"mode",new N(void 0)),a(this,"exposure",new N(1))}get typeName(){return"ToneMapping"}setMode(e){const t=Tp[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=tS(this);e&&super.onEffectEnabled(e)}onCreateEffect(){if(this.postprocessingContext)for(const s of this.postprocessingContext.components){if(s===this)break;if(s!=this&&s instanceof gC){console.warn("[PostProcessing] Multiple tonemapping effects found in the same postprocessing stack: Please check your scene setup.",{activeEffect:s,ignoredEffect:this});return}}if(this.mode.isInitialized==!1){const s=T2(this.context.renderer.toneMapping);Rp&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+s),this.mode.initialize(s)}const e=Sy(this.mode.value),t=new D.POSTPROCESSING.MODULE.ToneMappingEffect({mode:nS(e)});return this.mode.onValueChanged=s=>{const o=Sy(s);t.mode=nS(o),Rp&&console.log("[PostProcessing] ToneMapping mode changed to",Tp[s],o,t.mode)},Rp&&console.log("[PostProcessing] Use ToneMapping",Tp[this.mode.value],e,t.mode,"renderer.tonemapping: "+this.context.renderer.toneMapping),this.exposure.onValueChanged=s=>{this.context.renderer.toneMappingExposure=s},t}onBeforeRender(){this.mode.overrideState&&(this.context.renderer.toneMapping=Sy(this.mode.value)),this.exposure.overrideState&&this.exposure.value!==void 0&&(this.context.renderer.toneMappingExposure=this.exposure.value)}};sS([m(N)],Cy.prototype,"mode"),sS([m(N)],Cy.prototype,"exposure");let _l=Cy;as("Tonemapping",_l);var E2=Object.defineProperty,Ep=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&E2(e,t,o),o};class er extends ot{constructor(){super(...arguments),a(this,"postExposure",new N(0)),a(this,"contrast",new N(0)),a(this,"hueShift",new N(0)),a(this,"saturation",new N(0))}get typeName(){return"ColorAdjustments"}init(){this.postExposure.valueProcessor=e=>(e=Math.pow(2,e),e),this.contrast.valueProcessor=e=>{let t=1;return e>0?t=200:e<0&&(t=100),e/t},this.contrast.defaultValue=0,this.hueShift.valueProcessor=e=>Math.PI*e/180,this.hueShift.defaultValue=0,this.saturation.valueProcessor=e=>e<0?e/100:e/(100*Math.PI),this.saturation.defaultValue=0}onCreateEffect(){var e,t;const s=[];this.context.renderer.toneMapping!==va&&this.postExposure.overrideState&&(this.context.renderer.toneMapping=va);let o=(e=this.postprocessingContext)==null?void 0:e.components.find(c=>c instanceof _l);o||(o=new _l,(t=this.postprocessingContext)==null||t.components.push(o)),this.postExposure.onValueChanged=c=>{this.postExposure.overrideState&&(o.exposure.value=c)};const r=new D.POSTPROCESSING.MODULE.BrightnessContrastEffect;this.contrast.onValueChanged=c=>r.contrast=c;const l=new D.POSTPROCESSING.MODULE.HueSaturationEffect;return s.push(r),s.push(l),this.hueShift.onValueChanged=c=>l.hue=c,this.saturation.onValueChanged=c=>l.saturation=c,s}}Ep([m(N)],er.prototype,"postExposure"),Ep([m(N)],er.prototype,"contrast"),Ep([m(N)],er.prototype,"hueShift"),Ep([m(N)],er.prototype,"saturation"),as("ColorAdjustments",er);var A2=Object.defineProperty,ea=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&A2(e,t,o),o};const I2=C("debugpost");class Es extends ot{constructor(){super(...arguments),a(this,"mode"),a(this,"focusDistance",new N(1)),a(this,"focalLength",new N(.2)),a(this,"aperture",new N(20)),a(this,"gaussianMaxRadius",new N),a(this,"resolutionScale",new N(1*1/window.devicePixelRatio)),a(this,"bokehScale",new N)}get typeName(){return"DepthOfField"}init(){this.focalLength.valueProcessor=t=>{const s=t/300;return W.lerp(2,.01,s)};const e=20;this.aperture.valueProcessor=t=>{const s=1-t/32;return W.lerp(1,e,s)}}onCreateEffect(){if(this.mode===0){I2&&console.warn("DepthOfField: Mode is set to Off");return}const e=new D.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(){}}ea([m()],Es.prototype,"mode"),ea([m(N)],Es.prototype,"focusDistance"),ea([m(N)],Es.prototype,"focalLength"),ea([m(N)],Es.prototype,"aperture"),ea([m(N)],Es.prototype,"gaussianMaxRadius"),ea([m(N)],Es.prototype,"resolutionScale"),ea([m(N)],Es.prototype,"bokehScale"),as("DepthOfField",Es);class fh extends ot{constructor(e){super(),a(this,"effect"),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var L2=Object.defineProperty,j2=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&L2(e,t,o),o};class yh extends ot{constructor(){super(...arguments),a(this,"granularity",new N(10))}get typeName(){return"PixelationEffect"}onCreateEffect(){const e=new D.POSTPROCESSING.MODULE.PixelationEffect;return this.granularity.onValueChanged=t=>{e.granularity=t},e}}j2([m(N)],yh.prototype,"granularity"),as("PixelationEffect",yh);var D2=Object.defineProperty,vh=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&D2(e,t,o),o};class Zn extends ot{constructor(){super(...arguments),a(this,"intensity",new N(2)),a(this,"falloff",new N(1)),a(this,"samples",new N(9)),a(this,"color",new N(new ae(0,0,0))),a(this,"luminanceInfluence",new N(.7)),a(this,"_ssao")}get typeName(){return"ScreenSpaceAmbientOcclusion"}onBeforeRender(){if(this._ssao&&this.context.mainCamera instanceof we){const e=this.context.mainCamera.far-this.context.mainCamera.near;this._ssao.ssaoMaterial.worldDistanceFalloff=e*.01,this._ssao.ssaoMaterial.worldDistanceThreshold=this.context.mainCamera.far}}onCreateEffect(){const e=this.context.mainCamera,t=new D.POSTPROCESSING.MODULE.NormalPass(this.context.scene,e),s=new D.POSTPROCESSING.MODULE.DepthDownsamplingPass({normalBuffer:t.texture,resolutionScale:.5}),o=this._ssao=new D.POSTPROCESSING.MODULE.SSAOEffect(e,t.texture,{normalDepthBuffer:s.texture,worldDistanceThreshold:1,worldDistanceFalloff:1,worldProximityThreshold:.1,worldProximityFalloff:2,intensity:1,blendFunction:D.POSTPROCESSING.MODULE.BlendFunction.MULTIPLY,luminanceInfluence:.5});this.intensity.onValueChanged=l=>{o.intensity=l},this.falloff.onValueChanged=l=>{o.ssaoMaterial.radius=l*.1},this.samples.onValueChanged=l=>{o.ssaoMaterial.samples=l},this.color.onValueChanged=l=>{o.color||(o.color=new ae),o.color.copy(l)},this.luminanceInfluence.onValueChanged=l=>{o.luminanceInfluence=l};const r=new Array;return r.push(t),r.push(s),r.push(o),r}}vh([m(N)],Zn.prototype,"intensity"),vh([m(N)],Zn.prototype,"falloff"),vh([m(N)],Zn.prototype,"samples"),vh([m(N)],Zn.prototype,"color"),vh([m(N)],Zn.prototype,"luminanceInfluence"),as("ScreenSpaceAmbientOcclusion",Zn);var B2=Object.defineProperty,ta=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&B2(e,t,o),o};const F2=C("debugN8AO");var Py=(n=>(n[n.Performance=0]="Performance",n[n.Low=1]="Low",n[n.Medium=2]="Medium",n[n.High=3]="High",n[n.Ultra=4]="Ultra",n))(Py||{});class As extends ot{constructor(){super(...arguments),a(this,"gammaCorrection",!0),a(this,"aoRadius",new N(1)),a(this,"falloff",new N(1)),a(this,"intensity",new N(1)),a(this,"color",new N(new ae(0,0,0))),a(this,"screenspaceRadius",!1),a(this,"quality",2),a(this,"_ssao")}get typeName(){return"ScreenSpaceAmbientOcclusionN8"}get pass(){return this._ssao}onValidate(){this._ssao&&(this._ssao.setQualityMode(Py[this.quality]),this._ssao.configuration.gammaCorrection=this.gammaCorrection,this._ssao.configuration.screenSpaceRadius=this.screenspaceRadius)}onCreateEffect(){const e=this.context.mainCamera,t=this.context.domWidth,s=this.context.domHeight,o=this._ssao=new D.POSTPROCESSING_AO.MODULE.N8AOPostPass(this.context.scene,e,t,s),r=Py[this.quality];o.setQualityMode(r),o.configuration.transparencyAware=!1;const l=new Pn(t,s);return o.configuration.beautyRenderTarget=l,o.configuration.autoRenderBeauty=!1,o.configuration.gammaCorrection=this.gammaCorrection,o.configuration.screenSpaceRadius=this.screenspaceRadius,F2&&(o.enableDebugMode(),console.log(o),setInterval(()=>{console.log("SSAO",o.lastTime)},1e3),setInterval(()=>{console.log("SSAO",o.enabled,{ssao:o,autoRenderBeauty:o.configuration.autoRenderBeauty})},4e3)),this.intensity.onValueChanged=c=>{o.configuration.intensity=c},this.falloff.onValueChanged=c=>{o.configuration.distanceFalloff=c},this.aoRadius.onValueChanged=c=>{o.configuration.aoRadius=c},this.color.onValueChanged=c=>{o.color||(o.color=new ae),o.configuration.color.copy(c)},o}}ta([kt(),m()],As.prototype,"gammaCorrection"),ta([m(N)],As.prototype,"aoRadius"),ta([m(N)],As.prototype,"falloff"),ta([m(N)],As.prototype,"intensity"),ta([m(N)],As.prototype,"color"),ta([kt(),m()],As.prototype,"screenspaceRadius"),ta([kt(),m()],As.prototype,"quality"),as("ScreenSpaceAmbientOcclusionN8",As);var U2=Object.defineProperty,z2=Object.getOwnPropertyDescriptor,oS=(n,e,t,s)=>{for(var o=z2(e,t),r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&U2(e,t,o),o};class bh extends ot{constructor(){super(...arguments),a(this,"_effect"),a(this,"_amount",1),a(this,"_radius",1)}get typeName(){return"Sharpening"}onCreateEffect(){return this._effect??(this._effect=new(N2())),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}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}}oS([m()],bh.prototype,"amount"),oS([m()],bh.prototype,"radius");function N2(){const n=`
1234
- void mainSupport() {
1235
- vUv = uv;
1236
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
1237
- }
1238
- `,e=`
1239
- uniform sampler2D tDiffuse;
1240
- uniform float amount;
1241
- uniform float radius;
1242
-
1243
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
1244
- float tx = 1.0 / resolution.x;
1245
- float ty = 1.0 / resolution.y;
1246
- vec2 texelSize = vec2(tx, ty);
1247
-
1248
- vec4 blurred = vec4(0.0);
1249
- float total = 0.0;
1250
-
1251
- for (float x = -radius; x <= radius; x++) {
1252
- for (float y = -radius; y <= radius; y++) {
1253
- vec2 offset = vec2(x, y) * texelSize;
1254
- vec4 diffuse = texture2D(tDiffuse, uv + offset);
1255
- float weight = exp(-length(offset) * amount);
1256
- blurred += diffuse * weight;
1257
- total += weight;
1258
- }
1259
- }
1260
-
1261
- if (total > 0.0) {
1262
- blurred /= total;
1263
- }
1264
-
1265
- // Calculate the sharpened color using inputColor
1266
- vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
1267
- // Keep original alpha
1268
- sharp.a = inputColor.a;
1269
-
1270
- // Ensure the sharp color does not go below 0 or above 1
1271
- // This means: sharpening must happen AFTER tonemapping.
1272
- sharp = clamp(sharp, 0.0, 1.0);
1273
-
1274
- outputColor = sharp;
1275
- }
1276
-
1277
- `;class t extends D.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:n,blendFunction:D.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new ao(1)],["radius",new ao(1)]])})}}return t}var W2=Object.defineProperty,wl=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&W2(e,t,o),o};class pn extends ot{constructor(){super(...arguments),a(this,"offset",new N(0)),a(this,"rotation",new N(0)),a(this,"focusArea",new N(.4)),a(this,"feather",new N(.3)),a(this,"kernelSize",new N(2)),a(this,"resolutionScale",new N(1/window.devicePixelRatio))}get typeName(){return"TiltShiftEffect"}init(){this.offset.defaultValue=0,this.rotation.defaultValue=0,this.focusArea.defaultValue=.4,this.feather.defaultValue=.3,this.kernelSize.defaultValue=D.POSTPROCESSING.MODULE.KernelSize.MEDIUM,this.resolutionScale.defaultValue=1/window.devicePixelRatio}onCreateEffect(){const e=new D.POSTPROCESSING.MODULE.TiltShiftEffect({kernelSize:D.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([m(N)],pn.prototype,"offset"),wl([m(N)],pn.prototype,"rotation"),wl([m(N)],pn.prototype,"focusArea"),wl([m(N)],pn.prototype,"feather"),wl([m(N)],pn.prototype,"kernelSize"),wl([m(N)],pn.prototype,"resolutionScale"),as("TiltShiftEffect",pn);var V2=Object.defineProperty,Oy=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&V2(e,t,o),o};class ia extends ot{constructor(){super(...arguments),a(this,"color",new N({r:0,g:0,b:0,a:1})),a(this,"intensity",new N(0)),a(this,"center",new N({x:.5,y:.5}))}get typeName(){return"Vignette"}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 D.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}}Oy([m(N)],ia.prototype,"color"),Oy([m(N)],ia.prototype,"intensity"),Oy([m(N)],ia.prototype,"center"),as("Vignette",ia),globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const Jn=C("debugpost"),H2=C("debugpostpasses"),ky=Symbol("needle:postprocessing-handler"),My=Symbol("needle:previous-autoclear-state");class Ry{constructor(e){a(this,"_composer",null),a(this,"_lastVolumeComponents"),a(this,"_effects",[]),a(this,"_isActive",!1),a(this,"context"),a(this,"_menuEntry",null),a(this,"_passIndices",null),this.context=e}get isActive(){return this._isActive}get composer(){return this._composer}apply(e){return this._isActive=!0,this.onApply(this.context,e)}unapply(){var e;if(Jn&&console.log("Unapplying postprocessing effects"),this._isActive=!1,this._lastVolumeComponents){for(const s of this._lastVolumeComponents)s.unapply();this._lastVolumeComponents.length=0}const t=this.context;t[ky]===this&&delete t[ky],t.composer===this._composer&&((e=t.composer)==null||e.dispose(),t.composer=null),typeof t.renderer[My]=="boolean"&&(t.renderer.autoClear=t.renderer[My])}dispose(){this.unapply();for(const e of this._effects)e.dispose();this._effects.length=0,this._composer=null}async onApply(e,t){if(!t)return;await Promise.all([D.POSTPROCESSING.load(),D.POSTPROCESSING_AO.load()]),e[ky]=this,Jn&&console.log("Apply Postprocessing Effects",t),this._lastVolumeComponents=[...t],this._effects.length=0;const s={handler:this,components:this._lastVolumeComponents};for(let o=0;o<this._lastVolumeComponents.length;o++){const r=this._lastVolumeComponents[o];if(r.context=e,r.apply){if(r.active){if(!e.mainCameraComponent){console.error("No camera in scene found or available yet - can not create postprocessing effects");return}const l=r.apply(s);if(!l)continue;Array.isArray(l)?this._effects.push(...l):this._effects.push(l)}}else r.active&&be("Volume component is not a VolumeComponent: "+r.__type)}if(this.context.renderer.toneMapping!=va&&!this._effects.find(o=>o instanceof D.POSTPROCESSING.MODULE.ToneMappingEffect)){const o=new D.POSTPROCESSING.MODULE.ToneMappingEffect;this._effects.push(o)}this.applyEffects(e)}applyEffects(e){const t=this._effects;if(t.length<=0)return;const s=e.mainCameraComponent,o=e.renderer,r=e.scene,l=s.threeCamera;o[My]=o.autoClear,this._composer||(this._composer=new D.POSTPROCESSING.MODULE.EffectComposer(o,{frameBufferType:CP,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 c=e.composer;c.setMainCamera(l),c.setRenderer(o),c.setMainScene(r),c.autoRenderToScreen=!0;for(const d of c.passes)d.dispose();c.removeAllPasses();const h=new D.POSTPROCESSING.MODULE.RenderPass(r,l);if(h.name="Render To Screen",h.mainScene=r,c.addPass(h),H2){this.orderEffects();for(const d of t)if(d instanceof D.POSTPROCESSING.MODULE.Effect){const u=new D.POSTPROCESSING.MODULE.EffectPass(l,d);u.name=d.name,c.addPass(u)}else d instanceof D.POSTPROCESSING.MODULE.Pass&&(d.renderToScreen=!1),c.addPass(d)}else try{this.orderEffects();const d=[];for(const u of t)u instanceof D.POSTPROCESSING.MODULE.Effect?d.push(u):(u instanceof D.POSTPROCESSING.MODULE.Pass&&(u.renderToScreen=!1),c.addPass(u));if(d.length>0){const u=new D.POSTPROCESSING.MODULE.EffectPass(l,...d);u.name=d.map(p=>p.name).join(", "),u.mainScene=r,u.enabled=!0,u.renderToScreen=!1,c.addPass(u)}}catch(d){console.error("Error while applying postprocessing effects",d),c.removeAllPasses()}for(let d=0;d<c.passes.length;d++){const u=c.passes[d],p=d===c.passes.length-1;u?.configuration!==void 0?u.configuration.gammaCorrection=p:"autosetGamma"in u&&(u.autosetGamma=p)}Jn&&console.log("[PostProcessing] Passes \u2192",[...c.passes],`
1278
- ---------------------------------
1279
- \u2022 `+c.passes.map(d=>d.name).join(`
1280
- \u2022 `)+`
1281
- `),Jn&&this._onCreateEffectsDebug(this._composer,l)}orderEffects(){Jn==="verbose"&&console.debug("Before ordering effects",[...this._effects]),Ap??(Ap=[D.POSTPROCESSING.MODULE.NormalPass,D.POSTPROCESSING.MODULE.DepthDownsamplingPass,D.POSTPROCESSING.MODULE.SMAAEffect,D.POSTPROCESSING.MODULE.SSAOEffect,D.POSTPROCESSING_AO.MODULE.N8AOPostPass,D.POSTPROCESSING.MODULE.TiltShiftEffect,D.POSTPROCESSING.MODULE.DepthOfFieldEffect,D.POSTPROCESSING.MODULE.ChromaticAberrationEffect,D.POSTPROCESSING.MODULE.BloomEffect,D.POSTPROCESSING.MODULE.SelectiveBloomEffect,D.POSTPROCESSING.MODULE.VignetteEffect,D.POSTPROCESSING.MODULE.PixelationEffect,D.POSTPROCESSING.MODULE.ToneMappingEffect,D.POSTPROCESSING.MODULE.HueSaturationEffect,D.POSTPROCESSING.MODULE.BrightnessContrastEffect]),this._effects.sort((e,t)=>{const s=Ap.findIndex(r=>e.constructor.name.endsWith(r.name)),o=Ap.findIndex(r=>t.constructor.name.endsWith(r.name));return s<0?(Jn&&console.warn("Unknown effect found: ",e.constructor.name),-1):o<0?(Jn&&console.warn("Unknown effect found: ",t.constructor.name),1):s-o}),Jn==="verbose"&&console.debug("After ordering effects",[...this._effects])}_onCreateEffectsDebug(e,t){if(Jn==="passes"){const s=new D.POSTPROCESSING.MODULE.DepthEffect({blendFunction:D.POSTPROCESSING.MODULE.BlendFunction.NORMAL,inverted:!0});s.name="Depth Effect";const o=new D.POSTPROCESSING.MODULE.EffectPass(t,s);if(o.name="Depth Effect Pass",o.enabled=!1,e.passes.push(o),this._passIndices!==null){const l=[e.passes[0]];this._passIndices.length>0&&l.push(...this._passIndices.filter(c=>c!==0).map(c=>e.passes[c]).filter(c=>c)),l.length>0&&console.log("[PostProcessing] Passes (selected) \u2192",l),e.passes.length=0;for(const c of l)c.enabled=!0,c.renderToScreen=!1,e.addPass(c)}const r=this.context.menu;if(r&&this._passIndices===null){this._menuEntry&&this._menuEntry.remove();const l=document.createElement("select");l.multiple=!0;const c=document.createElement("option");c.innerText="Final Output",c.value="-1",l.appendChild(c);for(const h of e.passes){const d=document.createElement("option");d.innerText=h.name,d.value=`${e.passes.indexOf(h)}`,d.title=h.name,l.appendChild(d)}r.appendChild(l),this._menuEntry=l,l.addEventListener("change",()=>{const h=Array.from(l.selectedOptions).map(d=>parseInt(d.value));h.length===1&&h[0]===-1?this._passIndices=null:this._passIndices=h,this.applyEffects(this.context)})}}}}let Ap=null;var $2=Object.defineProperty,rS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$2(e,t,o),o};const xl=C("debugpost");class Sl extends I{constructor(){super(...arguments),a(this,"sharedProfile"),a(this,"multisampling","auto"),a(this,"_postprocessing"),a(this,"_activeEffects",[]),a(this,"_effects",[]),a(this,"_componentEnabledTime",-1),a(this,"_multisampleAutoChangeTime",0),a(this,"_multisampleAutoDecreaseTime",0),a(this,"_lastApplyTime"),a(this,"_rapidApplyCount",0),a(this,"_isDirty",!1),a(this,"_modificationQueue"),a(this,"_recreateId",-1)}get isPostProcessingManager(){return!0}get effects(){return this._activeEffects}addEffect(e){let t=e;return t instanceof ot||(t=new fh(t)),t.gameObject===void 0&&this.gameObject.addComponent(t),this._effects.includes(t)||(this._effects.push(t),this._isDirty=!0),e}removeEffect(e){var t,s,o,r;let l=-1;if(e instanceof ot?l=this._effects.indexOf(e):l=this._effects.findIndex(c=>c instanceof fh&&c.effect===e),l!==-1)return this._effects.splice(l,1),this._isDirty=!0,e;if(e instanceof ot){const c=(s=(t=this.sharedProfile)==null?void 0:t.components)==null?void 0:s.indexOf(e);c!==void 0&&c!==-1&&(this._isDirty=!0,(r=(o=this.sharedProfile)==null?void 0:o.components)==null||r.splice(c,1))}return e}markDirty(){this._isDirty=!0}awake(){var e;xl&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",t=>{t.key==="p"&&(this.enabled=!this.enabled,De("Toggle PostProcessing "+this.name+": Enabled="+this.enabled),this.markDirty())})),(e=this.sharedProfile)==null||e.__init(this)}onEnable(){this._componentEnabledTime=this.context.time.realtimeSinceStartup,this._isDirty=!0}onDisable(){var e;(e=this._postprocessing)==null||e.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)){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);const e=this.context.composer;if(this.multisampling==="auto"){const t=this.context.time.realtimeSinceStartup-this._multisampleAutoChangeTime;if(this.context.time.realtimeSinceStartup-this._componentEnabledTime>2&&t>.5){const s=e.multisampling;e.multisampling>0&&this.context.time.smoothedFps<=50?(this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup,this._multisampleAutoDecreaseTime=this.context.time.realtimeSinceStartup,e.multisampling*=.5,e.multisampling=Math.floor(e.multisampling),xl&&console.debug(`[PostProcessing] Reduced multisampling from ${s} to ${e.multisampling}`)):t>1&&this.context.time.smoothedFps>=59&&e.multisampling<this.context.renderer.capabilities.maxSamples&&this.context.time.realtimeSinceStartup-this._multisampleAutoDecreaseTime>10&&(this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup,e.multisampling=e.multisampling<=0?1:e.multisampling*2,e.multisampling=Math.floor(e.multisampling),xl&&console.debug(`[PostProcessing] Increased multisampling from ${s} to ${e.multisampling}`))}}else e.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples));if(this.context.mainCamera){const t=this.context.composer.passes;for(const s of t)if(s.mainCamera&&s.mainCamera!==this.context.mainCamera){this.context.composer.setMainCamera(this.context.mainCamera);break}}}}onDestroy(){var e;(e=this._postprocessing)==null||e.dispose()}apply(){var e,t;if(xl&&console.log(`Apply PostProcessing "${this.name}"`),F()&&(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.unapply(),this._activeEffects.length=0,(e=this.sharedProfile)!=null&&e.components){const s=this.sharedProfile.components;for(const o of s)o.active&&o.enabled&&!this._activeEffects.includes(o)&&this._activeEffects.push(o)}for(const s of this._effects)s.active&&s.enabled&&!this._activeEffects.includes(s)&&this._activeEffects.push(s);this._activeEffects.length>0&&(this._postprocessing||(this._postprocessing=new Ry(this.context)),(t=this._postprocessing.apply(this._activeEffects))==null||t.then(()=>{var s;if(!this.activeAndEnabled)return;this._applyPostQueue();const o=(s=this._postprocessing)==null?void 0:s.composer;o?(this.multisampling==="auto"?o.multisampling=Y.isMobileDevice()?2:4:o.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples)),xl&&console.debug(`[PostProcessing] Set multisampling to ${o.multisampling} (Is Mobile: ${Y.isMobileDevice()})`)):xl&&console.warn("[PostProcessing] No composer found")}))}unapply(){var e;(e=this._postprocessing)==null||e.unapply()}_applyPostQueue(){if(this._modificationQueue){for(const e of this._modificationQueue.values())this.onEditorModification(e);this._modificationQueue.clear()}}onEditorModification(e){var t,s;if(e.propertyName.startsWith("postprocessing.")){if(!this._postprocessing)return this._modificationQueue||(this._modificationQueue=new Map),this._modificationQueue.set(e.propertyName,e),!0;if(!((t=this._activeEffects)!=null&&t.length))return;const o=e.propertyName.split(".");if(o.length===3||o.length===4){const r=o[1],l=o[2];for(const c of this._activeEffects)if(((s=c.typeName)==null?void 0:s.toLowerCase())===r.toLowerCase()){if(l==="active"){c.active=e.value,this.scheduleRecreate();return}if(!Ip.has(r)){const h=new Array;Ip.set(r,h);const d=Object.keys(c);for(const u of d)c[u]instanceof N&&h.push(u)}if(Ip.has(r)){const h=l.toLowerCase(),d=Ip.get(r);for(const u of d)if(u.toLowerCase()===h){const p=c[u];p instanceof N&&(o.length===4&&o[3]==="active"?(p.overrideState=e.value,this.scheduleRecreate()):p&&p.value!==void 0&&(p.value=e.value));return}}console.warn("Unknown modification",l);return}}return!0}return!1}scheduleRecreate(){const e=++this._recreateId;setTimeout(()=>{e===this._recreateId&&(this.onDisable(),this.onEnable())},200)}}rS([Tr(Pp)],Sl.prototype,"sharedProfile"),rS([Tr()],Sl.prototype,"multisampling");const Ip=new Map;u2(Sl);async function Ty(n){const{NeedleEngineHTMLElement:e}=await Promise.resolve().then(()=>_L);e.observedAttributes.includes(n)||e.observedAttributes.push(n)}var G2=Object.defineProperty,xt=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&G2(e,t,o),o};const Wt=C("debugsceneswitcher"),q2=C("sceneswitcher:clearscene"),Lp="scene";Ty(Lp);const tr=Promise.resolve(!1);class Ze extends I{constructor(){super(...arguments),a(this,"autoLoadFirstScene",!0),a(this,"scenes",[]),a(this,"loadingScene"),a(this,"queryParameterName","scene"),a(this,"useSceneName",!0),a(this,"clamp",!0),a(this,"useHistory",!0),a(this,"useKeyboard",!0),a(this,"useSwipe",!0),a(this,"useSceneLighting",!0),a(this,"useSceneBackground",!0),a(this,"preloadNext",1),a(this,"preloadPrevious",1),a(this,"preloadConcurrent",2),a(this,"createMenuButtons",!1),a(this,"sceneLoadingStart",new xe),a(this,"sceneLoadingProgress",new xe),a(this,"sceneLoaded",new xe),a(this,"_currentIndex",-1),a(this,"_currentScene"),a(this,"_engineElementOverserver"),a(this,"_preloadScheduler"),a(this,"_menuButtons"),a(this,"onPopState",async e=>{if(!this.useHistory)return;const t=this.useHistory;try{this.useHistory=!1;let s=!1;if(this.queryParameterName&&(s=await this.tryLoadFromQueryParam()),!s){const o=e?.state;if(o&&o.startsWith(this.guid)){const r=o.substr(this.guid.length+2);Wt&&console.log("PopState",r),await this.trySelectSceneFromValue(r)}}}finally{this.useHistory=t}}),a(this,"normalizedSwipeThresholdX",.1),a(this,"_didSwipe",!1),a(this,"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 s=t.x/this.context.domWidth;s>=this.normalizedSwipeThresholdX?(this._didSwipe=!0,this.selectPrev()):s<=-this.normalizedSwipeThresholdX&&(this._didSwipe=!0,this.selectNext())}}}),a(this,"onInputPointerUp",e=>{e.button===0&&(this._didSwipe=!1)}),a(this,"onInputKeyDown",e=>{if(!this.useKeyboard||!this.scenes)return;const t=e.key.toLowerCase();if(!t)return;const s=parseInt(t)-1;if(s>=0){this.trySelectSceneFromValue(s);return}switch(t){case"arrowright":case"d":this.selectNext();break;case"arrowleft":case"a":this.selectPrev();break}}),a(this,"__lastSwitchScene"),a(this,"__lastSwitchScenePromise"),a(this,"_currentlyLoadingScene"),a(this,"_lastLoadingScene"),a(this,"_loadingScenePromise"),a(this,"_isCurrentlyLoading",!1),a(this,"_currentLoadingProgress")}get currentIndex(){return this._currentIndex}get currentLoadingProgress(){return this._currentLoadingProgress}get currentlyLoadingScene(){return this._currentlyLoadingScene}get currentlyLoadedScene(){return this._currentScene}awake(){this.scenes===void 0&&(this.scenes=[]);for(const e of this.scenes)e&&!e.hasUrl&&e.asset instanceof A?P.remove(e.asset):e instanceof A&&P.remove(e);Wt&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Be.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Be.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Be.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===Lp){const s=this.context.domElement.getAttribute(Lp);s!==null&&this.trySelectSceneFromValue(s)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new X2(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(Lp);try{(e===null||!await this.trySelectSceneFromValue(e))&&this._currentIndex===-1&&this.select(0)}finally{}}this.createMenuButtons&&(this._menuButtons??(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(){var e;if(globalThis.removeEventListener("popstate",this.onPopState),this.context.input.removeEventListener(Be.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Be.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Be.PointerUp,this.onInputPointerUp),(e=this._preloadScheduler)==null||e.stop(),this._menuButtons){for(const t of this._menuButtons)t.remove();this._menuButtons=void 0}}addScene(e){if(typeof e=="string"){let t=this.context.addressables.findAssetReference(e);return t||(t=new le(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){var t,s,o;if(Wt&&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 l=(t=this.scenes)==null?void 0:t.find(c=>c.url===e);if(!l){const c=le.getOrCreate(this.sourceId??"",e,this.context);return this.switchScene(c)}if(l)e=(s=this.scenes)==null?void 0:s.indexOf(l);else return tr}if(!((o=this.scenes)!=null&&o.length))return tr;if(e<0){if(this.clamp)return tr;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return tr;e=0}const r=this.scenes[e];return this.switchScene(r)}unload(){return this.__lastSwitchScene=void 0,this.__lastSwitchScenePromise=void 0,this.__unloadCurrentScene()}async reload(){if(this.__lastSwitchScene){const e=this.__lastSwitchScene;return this.__lastSwitchScene=void 0,this.switchScene(e)}return!1}async switchScene(e){var t;if(!(e instanceof le)){const s=typeof e;if(s==="string")return this.select(e);if(s==="number")return this.select(e);if(e&&e instanceof A){const o=(t=this.scenes)==null?void 0:t.indexOf(e);e=new le(e.name,void 0,e),o>=0&&(this.scenes[o]=e)}else return console.warn(`[SceneSwitcher] Can't switch to scene of type ${s}`),!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){Wt&&console.log("UNLOAD",e.url,"HasURL?: "+e.hasUrl);const t=this.tryGetSceneEventListener(e.asset);if(t!=null&&t.sceneClosing){const s=t.sceneClosing();s instanceof Promise&&await s}e.hasUrl?e.unload():e.asset instanceof A&&P.remove(e.asset)}}async __internalSwitchScene(e){var t,s,o,r,l;await this.__unloadCurrentScene();const c=this._currentIndex=((t=this.scenes)==null?void 0:t.indexOf(e))??-1;try{this._currentlyLoadingScene=e,this._currentLoadingProgress=new ProgressEvent("progress",{loaded:0,total:1});const h=new CustomEvent("loadscene-start",{detail:{scene:e,switcher:this,index:c}});this.dispatchEvent(h),(s=this.sceneLoadingStart)==null||s.invoke(h.detail),await this.onStartLoading(),await e.loadAssetAsync((u,p)=>{var g;if(Wt){const f=p.loaded/p.total,y="["+"=".repeat(Math.floor(f*20))+"-".repeat(20-Math.floor(f*20))+"]";console.debug(`[SceneSwitcher] Download ${(f*100).toFixed(1)} % ${y}`,e.url)}this._currentLoadingProgress=p,this.dispatchEvent(p),(g=this.sceneLoadingProgress)==null||g.invoke(p)}).catch(console.error),await this.onEndLoading();const d=new CustomEvent("loadscene-finished",{detail:{scene:e,switcher:this,index:c}});if(this.dispatchEvent(d),this._currentLoadingProgress=void 0,this._currentlyLoadingScene=void 0,d.defaultPrevented)return Wt&&console.warn("Adding loaded scene prevented:",e,d),!1;if(!e.asset)return Wt&&console.warn("Failed loading scene:",e),!1;if(this._currentIndex===c){if(Wt&&console.log("ADD",e.url),this._currentScene=e,q2){const g=((o=this.context.mainCameraComponent)==null?void 0:o.gameObject)||this.context.mainCamera;g?.removeFromParent();const f=this.gameObject.removeFromParent();Ri(this.context.scene,!0,!0),this.context.scene=new bi,this.context.scene.add(f),g&&this.context.scene.add(g)}if(P.add(e.asset,this.gameObject),this.useSceneLighting&&this.context.sceneLighting.enable(e),this.useSceneBackground){const g=this.context.lightmaps.tryGetSkybox(e.url);g?(g.mapping=Sn,this.context.scene.background=g):Wt&&console.warn("SceneSwitcher: Can't find skybox for scene "+e.url)}if(this.useHistory&&c>=0){let g=c.toString();if(this.useSceneName&&(e instanceof A?g=e.name:e.url&&(g=aS(e.url))),(r=this.queryParameterName)!=null&&r.length)Vl(this.queryParameterName,g,this.useHistory);else{const f=history.state,y=this.guid+"::"+c;f!==y&&history.pushState(y,"unused",location.href)}}const u=this.tryGetSceneEventListener(e.asset);if(u!=null&&u.sceneOpened){const g=u.sceneOpened(this);g instanceof Promise&&await g}const p=new CustomEvent("scene-opened",{detail:{scene:e,switcher:this,index:c}});return this.dispatchEvent(p),(l=this.sceneLoaded)==null||l.invoke(this),!0}}catch(h){console.error(h)}return!1}preload(e){if(e>=0&&e<this.scenes.length){const t=this.scenes[e];if(t instanceof le)return t.preload()}return tr}tryLoadFromQueryParam(){var e;if(!((e=this.queryParameterName)!=null&&e.length))return tr;const t=C(this.queryParameterName);return typeof t=="boolean"?tr:this.trySelectSceneFromValue(t)}trySelectSceneFromValue(e){if(typeof e=="string"){const t=parseInt(e);if(t>=0&&t<this.scenes.length)return this.select(t);{const s=e.toLowerCase();for(let o=0;o<this.scenes.length;o++){const r=this.scenes[o];if(!!r&&(r instanceof A?r.name:aS(r.url)).toLowerCase().includes(s))return this.select(o)}}}else if(typeof e=="number"&&e>=0&&e<this.scenes.length)return this.select(e);return $t()&&console.warn('Can not find scene: "'+e+'"',this),tr}async onStartLoading(){var e,t;if(this._isCurrentlyLoading=!0,this.loadingScene&&(this._lastLoadingScene!==this.loadingScene&&(this._loadingScenePromise=void 0),this._lastLoadingScene=this.loadingScene,this._loadingScenePromise||(this._loadingScenePromise=(e=this.loadingScene)==null?void 0:e.loadAssetAsync().then(s=>s!=null)),await this._loadingScenePromise,this._isCurrentlyLoading&&(t=this.loadingScene)!=null&&t.asset)){Wt&&console.log("Add loading scene",this.loadingScene.url,this.loadingScene.asset);const s=this.loadingScene.asset;P.add(s,this.gameObject);const o=this.tryGetSceneEventListener(s);if(o!=null&&o.sceneOpened){const r=o.sceneOpened(this);r instanceof Promise&&await r}}if(this._isCurrentlyLoading){const s=this.tryGetSceneEventListener(this.gameObject);if(s&&s.sceneOpened){const o=s.sceneOpened(this);o instanceof Promise&&await o}}}async onEndLoading(){var e;if(this._isCurrentlyLoading=!1,(e=this.loadingScene)!=null&&e.asset){Wt&&console.log("Remove loading scene",this.loadingScene.url);const t=this.loadingScene.asset,s=this.tryGetSceneEventListener(t);if(typeof s?.sceneClosing=="function"){const o=s.sceneClosing();o instanceof Promise&&await o}P.remove(t)}if(!this._isCurrentlyLoading){const t=this.tryGetSceneEventListener(this.gameObject);if(t&&t.sceneClosing){const s=t.sceneClosing();s instanceof Promise&&await s}}}tryGetSceneEventListener(e,t=0){if(!e)return null;const s=P.foreachComponent(e,o=>{const r=o;if(r.sceneClosing||r.sceneOpened)return r});if(t===0&&!s&&e.children.length)for(const o of e.children){const r=this.tryGetSceneEventListener(o,t+1);if(r)return r}return s||null}}xt([m()],Ze.prototype,"autoLoadFirstScene"),xt([m(le)],Ze.prototype,"scenes"),xt([m(le)],Ze.prototype,"loadingScene"),xt([m()],Ze.prototype,"queryParameterName"),xt([m()],Ze.prototype,"useSceneName"),xt([m()],Ze.prototype,"clamp"),xt([m()],Ze.prototype,"useHistory"),xt([m()],Ze.prototype,"useKeyboard"),xt([m()],Ze.prototype,"useSwipe"),xt([m()],Ze.prototype,"useSceneLighting"),xt([m()],Ze.prototype,"useSceneBackground"),xt([m()],Ze.prototype,"preloadNext"),xt([m()],Ze.prototype,"preloadPrevious"),xt([m()],Ze.prototype,"preloadConcurrent"),xt([m()],Ze.prototype,"createMenuButtons"),xt([m(xe)],Ze.prototype,"sceneLoadingStart"),xt([m(xe)],Ze.prototype,"sceneLoadingProgress"),xt([m(xe)],Ze.prototype,"sceneLoaded");function aS(n){const e=n.split("/").pop(),t=e?.split(".").shift();return t!=null&&t.length?t:n}class X2{constructor(e,t=1,s=1,o=2){a(this,"maxLoadAhead"),a(this,"maxLoadBehind"),a(this,"maxConcurrent"),a(this,"_isRunning",!1),a(this,"_switcher"),a(this,"_loadTasks",[]),a(this,"_maxConcurrentLoads",1),this._switcher=e,this.maxLoadAhead=t,this.maxLoadBehind=s,this.maxConcurrent=o}begin(e){if(this._isRunning)return;Wt&&console.log("Preload begin",{delay:e}),this._isRunning=!0;let t=-10,s,o;const r=this._switcher.scenes,l=Date.now()+e,c=setInterval(()=>{if(this.allLoaded()&&(Wt&&console.log("All scenes (pre-)loaded"),this.stop()),!this._isRunning){clearInterval(c);return}if(Date.now()<l||this.canLoadNewScene()===!1)return;(t===-10||t!==this._switcher.currentIndex)&&(t=this._switcher.currentIndex,o=0,s=0);const h=o%2===0;h&&(s+=1),o+=1;const d=h?this.maxLoadAhead:this.maxLoadBehind;if(s>d)return;const u=h?t+s:t-s;if(!(u<0)&&!(u<0||u>=r.length)&&!this._loadTasks.some(p=>p.index===u)){const p=r[u];Wt&&console.log("Preload scene",{roomIndex:u,searchForward:h,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},p?.url),new Q2(u,p,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!=null&&e.isLoaded&&e.isLoaded()===!1)return!1}return!0}}class Q2{constructor(e,t,s){a(this,"index"),a(this,"asset"),a(this,"tasks"),this.index=e,this.asset=t,this.tasks=s,s.push(this),this.awaitLoading()}async awaitLoading(){this.asset&&!this.asset.isLoaded()&&(Wt&&console.log("Preload start: "+this.asset.url,this.index),await this.asset.preload(),Wt&&console.log("Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}function Y2(){return new Promise((n,e)=>{const t=()=>{t!=null&&(document.removeEventListener("pointerdown",t),document.removeEventListener("click",t),document.removeEventListener("dragstart",t),document.removeEventListener("touchstart",t),n())};document.addEventListener("pointerdown",t),document.addEventListener("click",t),document.addEventListener("dragstart",t),document.addEventListener("touchstart",t)})}async function K2(n){await Y2(),n()}var Z2=Object.defineProperty,J2=Object.getOwnPropertyDescriptor,Ni=(n,e,t,s)=>{for(var o=s>1?void 0:s?J2(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&Z2(e,t,o),o};const St=C("debugvideo");var lS=(n=>(n[n.None=0]="None",n[n.AdjustHeight=1]="AdjustHeight",n[n.AdjustWidth=2]="AdjustWidth",n))(lS||{}),cS=(n=>(n[n.VideoClip=0]="VideoClip",n[n.Url=1]="Url",n))(cS||{}),hS=(n=>(n[n.CameraFarPlane=0]="CameraFarPlane",n[n.CameraNearPlane=1]="CameraNearPlane",n[n.RenderTexture=2]="RenderTexture",n[n.MaterialOverride=3]="MaterialOverride",n))(hS||{});class gt extends I{constructor(){super(),a(this,"playOnAwake",!0),a(this,"aspectMode",0),a(this,"clip",null),a(this,"source",1),a(this,"_url",null),a(this,"renderMode"),a(this,"targetMaterialProperty"),a(this,"targetMaterialRenderer"),a(this,"targetTexture"),a(this,"time",0),a(this,"_playbackSpeed",1),a(this,"_isLooping",!1),a(this,"_muted",!1),a(this,"_audioOutputMode",2),a(this,"playInBackground",!0),a(this,"_crossOrigin","anonymous"),a(this,"_videoElement",null),a(this,"_videoTexture",null),a(this,"_videoMaterial",null),a(this,"_isPlaying",!1),a(this,"wasPlaying",!1),a(this,"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}}),a(this,"_receivedInput",!1),a(this,"_overlay",null),a(this,"_targetObjects"),a(this,"_updateAspectRoutineId",-1),a(this,"_hls"),a(this,"onHlsAvailable",()=>{var e;St&&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),(e=this._videoElement)==null||e.play(),St&&console.log("HLS: loaded",this.clip))}),K2(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],C("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}get url(){return this._url}set url(e){const t=this._url!==e;this.__didAwake?t&&this.setClipURL(e??""):this._url=e}get playbackSpeed(){var e;return((e=this._videoElement)==null?void 0:e.playbackRate)??this._playbackSpeed}set playbackSpeed(e){this._playbackSpeed=e,this._videoElement&&(this._videoElement.playbackRate=e)}get isLooping(){var e;return((e=this._videoElement)==null?void 0:e.loop)??this._isLooping}set isLooping(e){this._isLooping=e,this._videoElement&&(this._videoElement.loop=e)}get currentTime(){var e;return((e=this._videoElement)==null?void 0:e.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(){var e;return((e=this._videoElement)==null?void 0:e.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(){var e;return((e=this._videoElement)==null?void 0:e.muted)??this._muted}set muted(e){this._muted=e,this._videoElement&&(this._videoElement.muted=e)}get currentVideo(){return this.clip}set audioOutputMode(e){e!==this._audioOutputMode&&(e===1&&F()&&console.warn("VideoAudioOutputMode.AudioSource is not yet implemented"),this._audioOutputMode=e,this.updateVideoElementSettings())}get audioOutputMode(){return this._audioOutputMode}preloadVideo(){St&&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,St&&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(){var e,t;St&&console.log("VideoPlayer.onEnable",cS[this.source],this.clip,this.url,this),window.addEventListener("visibilitychange",this.visibilityChanged),this.playOnAwake===!0?this.create(!0):this.preloadVideo(),this.screenspace?(e=this._overlay)==null||e.start():(t=this._overlay)==null||t.stop()}onDisable(){var e;window.removeEventListener("visibilitychange",this.visibilityChanged),(e=this._overlay)==null||e.stop(),this.pause()}onDestroy(){var e;this._videoElement&&((e=this.videoElement)==null||e.remove(),this._videoElement=null),this._videoTexture&&(this._videoTexture.dispose(),this._videoTexture=null)}play(){var e,t;if(this._videoElement||this.create(!1),!this._videoElement){St&&console.warn("Can not play: no video element found",this);return}if(!(this._isPlaying&&!((e=this._videoElement)!=null&&e.ended)&&!((t=this._videoElement)!=null&&t.paused))){if(this._isPlaying=!0,this._receivedInput||(this._videoElement.muted=!0),this.handleBeginPlaying(!1),this.shouldUseM3U){this.ensureM3UCanBePlayed();return}St&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(s=>{var o;console.log(s),St&&console.error("Error playing video",s,"CODE="+s.code,(o=this.videoElement)==null?void 0:o.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),St&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),St&&console.log("STOP",this))}pause(){var e,t;this.time=((e=this._videoElement)==null?void 0:e.currentTime)??0,this._isPlaying=!1,(t=this._videoElement)==null||t.pause(),St&&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!=null&&t.length)&&typeof this.clip=="string"&&(t=this.clip);break}return t?(this._videoElement||(St&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(St&&console.log("Set Video src",t),this._videoElement.src=t):(St&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new PP(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=Cn,e&&this.handleBeginPlaying(e),St&&console.log("Video: handle playing done...",t,e),!0):(St&&console.warn("No video source set",this),!1)}updateAspect(){this.aspectMode!==0&&this.startCoroutine(this.updateAspectImpl())}get screenspace(){var e;return((e=this._overlay)==null?void 0:e.enabled)??!1}set screenspace(e){var t;if(e){if(!this._videoTexture)return;this._overlay||(this._overlay=new eI(this.context)),this._overlay.add(this._videoTexture)}else(t=this._overlay)==null||t.remove(this._videoTexture);this._overlay&&(this._overlay.enabled=e)}createVideoElement(){const e=document.createElement("video");return this._crossOrigin&&e.setAttribute("crossorigin",this._crossOrigin),St&&console.log("created video element",e),e}handleBeginPlaying(e){var t,s;if(!this.activeAndEnabled||!this._videoElement)return;this._targetObjects.length=0;let o=this.gameObject;switch(this.renderMode){case 3:o=(t=this.targetMaterialRenderer)==null?void 0:t.gameObject,o||(o=(s=P.getComponent(this.gameObject,Di))==null?void 0:s.gameObject);break;case 2:console.error("VideoPlayer renderTexture not implemented yet. Please use material override instead");return}if(!o){console.error("Missing target for video material renderer",this.name,hS[this.renderMode],this);return}const r=o.material;if(r){this._targetObjects.push(o),r!==this._videoMaterial&&(this._videoMaterial=r.clone(),o.material=this._videoMaterial);const l="map",c=this._videoMaterial;if(!this.targetMaterialProperty)c[l]=this._videoTexture;else switch(this.targetMaterialProperty){default:c[l]=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())}*updateAspectImpl(){const e=++this._updateAspectRoutineId,t=void 0,s=this.clip;for(;e===this._updateAspectRoutineId&&this.aspectMode!==0&&this.clip&&s===this.clip&&this._isPlaying;){if(!s||typeof s=="string")return;let o;for(const r of s.getVideoTracks()){const l=r.getSettings();if(l&&l.width&&l.height){o=l.width/l.height;break}else o=this.context.renderer.domElement.clientWidth/this.context.renderer.domElement.clientHeight}if(o===void 0){for(let r=0;r<10;r++)yield;if(!this.isPlaying)break;continue}if(t===o){yield;continue}for(const r of this._targetObjects){let l=1;if(r.parent){const c=Ge(r.parent);l=c.x/c.y}switch(this.aspectMode){case 1:r.scale.y=1/o*r.scale.x*l;break;case 2:r.scale.x=o*r.scale.y*l;break}}for(let r=0;r<3;r++)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):(St&&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))}}Ni([m()],gt.prototype,"playOnAwake",2),Ni([m()],gt.prototype,"aspectMode",2),Ni([m(URL)],gt.prototype,"clip",2),Ni([m()],gt.prototype,"source",2),Ni([m(URL)],gt.prototype,"url",1),Ni([m()],gt.prototype,"renderMode",2),Ni([m()],gt.prototype,"targetMaterialProperty",2),Ni([m(Di)],gt.prototype,"targetMaterialRenderer",2),Ni([m(je)],gt.prototype,"targetTexture",2),Ni([m()],gt.prototype,"time",2),Ni([m()],gt.prototype,"playbackSpeed",1),Ni([m()],gt.prototype,"isLooping",1),Ni([m()],gt.prototype,"audioOutputMode",1);class eI{constructor(e){a(this,"context"),a(this,"_videos",[]),a(this,"_screenspaceModeQuad"),a(this,"_isInScreenspaceMode",!1),a(this,"_input"),this.context=e,this._input=new tI(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(){var e;if(this._isInScreenspaceMode||this._videos.length<0)return;const t=this._videos[this._videos.length-1];if(!t)return;if(this._isInScreenspaceMode=!0,!this._screenspaceModeQuad){if(this._screenspaceModeQuad=vo.createPrimitive(vr.Quad,{material:new iI(t)}),!this._screenspaceModeQuad)return;this._screenspaceModeQuad.geometry.scale(2,2,2)}const s=this._screenspaceModeQuad;this.context.scene.add(s),this.updateScreenspaceMaterialUniforms();const o=s.material;o?.reset(),(e=this._input)==null||e.enable(o)}stop(){var e;this._isInScreenspaceMode=!1,this._screenspaceModeQuad&&((e=this._input)==null||e.disable(),this._screenspaceModeQuad.removeFromParent())}updateScreenspaceMaterialUniforms(){var e;const t=(e=this._screenspaceModeQuad)==null?void 0:e.material;t&&(t.screenAspect=this.context.domElement.clientWidth/this.context.domElement.clientHeight)}}class tI{constructor(e){a(this,"_onResizeScreenFn"),a(this,"_onKeyUpFn"),a(this,"_onMouseWheelFn"),a(this,"context"),a(this,"overlay"),a(this,"_material"),a(this,"_isPinching",!1),a(this,"_lastPinch",0),this.overlay=e,this.context=e.context}enable(e){this._material=e,window.addEventListener("resize",this._onResizeScreenFn=()=>{this.overlay.updateScreenspaceMaterialUniforms()}),window.addEventListener("keyup",this._onKeyUpFn=o=>{o.key==="Escape"&&this.overlay.stop()}),window.addEventListener("wheel",this._onMouseWheelFn=o=>{this.overlay.enabled&&(e.zoom+=o.deltaY*5e-4,o.preventDefault())},{passive:!1});const t=new re;window.addEventListener("mousemove",o=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const r=new re(o.movementX,o.movementY);r.x/=this.context.domElement.clientWidth,r.y/=this.context.domElement.clientHeight,t.set(r.x,r.y),t.multiplyScalar(e.zoom/-this.context.time.deltaTime*.01),e.offset=e.offset.add(t)}}),window.addEventListener("pointermove",o=>{this.overlay.enabled&&this.context.input.getPointerPressed(0)&&this.context.input.getTouchesPressedCount()===1&&(t.set(o.movementX,o.movementY),t.multiplyScalar(e.zoom*-this.context.time.deltaTime*.05),e.offset=e.offset.add(t))});let s=0;window.addEventListener("touchstart",o=>{if(o.touches.length<2){this.context.time.time-s<.3&&this.overlay.stop(),s=this.context.time.time;return}this._isPinching=!0,this._lastPinch=0}),window.addEventListener("touchmove",o=>{if(!this._isPinching||!this._material)return;const r=o.touches[0],l=o.touches[1],c=r.clientX-l.clientX,h=r.clientY-l.clientY,d=Math.sqrt(c*c+h*h);if(this._lastPinch!==0){const u=d-this._lastPinch;this._material.zoom-=u*.004}this._lastPinch=d}),window.addEventListener("touchend",()=>{this._isPinching=!1})}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 iI extends gs{constructor(e){super(),a(this,"_offset",new re),this.uniforms={map:{value:e},screenAspect:{value:1},offsetScale:{value:new ye(0,0,1,1)}},this.vertexShader=`
1282
- uniform sampler2D map;
1283
- uniform float screenAspect;
1284
- uniform vec4 offsetScale;
1285
- varying vec2 vUv;
1286
-
1287
- void main() {
1288
-
1289
- gl_Position = vec4( position , 1.0 );
1290
- vUv = uv;
1291
- vUv.y = 1. - vUv.y;
1292
-
1293
- // fit into screen
1294
- ivec2 res = textureSize(map, 0);
1295
- float videoAspect = float(res.x) / float(res.y);
1296
- float aspect = videoAspect / screenAspect;
1297
- if(aspect >= 1.0)
1298
- {
1299
- vUv.y = vUv.y * aspect;
1300
- float offset = (1. - aspect) * .5;
1301
- vUv.y = vUv.y + offset;
1302
- }
1303
- else
1304
- {
1305
- vUv.x = vUv.x / aspect;
1306
- float offset = (1. - 1. / aspect) * .5;
1307
- vUv.x = vUv.x + offset;
1308
- }
1309
-
1310
- vUv.x -= .5;
1311
- vUv.y -= .5;
1312
-
1313
- vUv.x *= offsetScale.z;
1314
- vUv.y *= offsetScale.z;
1315
- vUv.x += offsetScale.x;
1316
- vUv.y += offsetScale.y;
1317
-
1318
- vUv.x += .5;
1319
- vUv.y += .5;
1320
- }
1321
-
1322
- `,this.fragmentShader=`
1323
- uniform sampler2D map;
1324
- varying vec2 vUv;
1325
- void main() {
1326
- if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
1327
- gl_FragColor = vec4(0., 0., 0., 1.);
1328
- else
1329
- {
1330
- vec4 texcolor = texture2D(map, vUv);
1331
- gl_FragColor = texcolor;
1332
- }
1333
- }
1334
- `}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}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}}var sI=Object.defineProperty,nI=Object.getOwnPropertyDescriptor,_h=(n,e,t,s)=>{for(var o=s>1?void 0:s?nI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&sI(e,t,o),o};const Et=C("debugscreensharing");var dS=(n=>(n[n.Screen=0]="Screen",n[n.Camera=1]="Camera",n[n.Canvas=2]="Canvas",n[n.Microphone=3]="Microphone",n))(dS||{});class ir extends I{constructor(){super(...arguments),a(this,"allowStartOnClick",!0),a(this,"autoConnect",!1),a(this,"_videoPlayer"),a(this,"_audioSource"),a(this,"device","Screen"),a(this,"deviceName"),a(this,"deviceFilter"),a(this,"_net"),a(this,"_requestOpen",!1),a(this,"_currentStream",null),a(this,"_currentMode",0),a(this,"onJoinedRoom",async()=>{await fs(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()}),a(this,"_activeShareRequest",null),a(this,"onReceiveStream",e=>{var t;((t=e.stream)==null?void 0:t.active)===!0&&this.setStream(e.stream,2)}),a(this,"onCallEnded",e=>{Et&&console.log("CALL ENDED",this.isReceiving,this==null?void 0:this.screenspace),this.isReceiving&&(this.screenspace=!1)})}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){var t;if(this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&!(e&&e.pointerId!==0)){if(this.isReceiving&&(t=this.videoPlayer)!=null&&t.isPlaying){this.videoPlayer&&(this.videoPlayer.screenspace=!this.videoPlayer.screenspace);return}if(this.isSending){this.close();return}this.share()}}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}get screenspace(){var e;return((e=this.videoPlayer)==null?void 0:e.screenspace)??!1}set screenspace(e){this.videoPlayer&&(this.videoPlayer.screenspace=e)}get currentScream(){return this._currentStream}get currentMode(){return this._currentMode}get isSending(){var e;return((e=this._currentStream)==null?void 0:e.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"}awake(){typeof this.device=="number"&&(this.device=dS[this.device]),Et&&console.log("Screensharing",this.name,this),ts.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new id(this)}onEnable(){var e,t,s;(e=this._net)==null||e.enable(),(t=this._net)==null||t.addEventListener(Js.StreamReceived,this.onReceiveStream),(s=this._net)==null||s.addEventListener(Js.StreamEnded,this.onCallEnded),this.context.connection.beginListen(ie.JoinedRoom,this.onJoinedRoom),this.autoConnect&&fs(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){var e,t,s;(e=this._net)==null||e.removeEventListener(Js.StreamReceived,this.onReceiveStream),(t=this._net)==null||t.removeEventListener(Js.StreamEnded,this.onCallEnded),this.context.connection.stopListen(ie.JoinedRoom,this.onJoinedRoom),(s=this._net)==null||s.disable(),this.close()}_ensureVideoPlayer(){const e=new gt;e.aspectMode=lS.AdjustWidth,P.addComponent(this.gameObject,e),this._videoPlayer=e}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"),F()&&be("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");return}if(e!=null&&e.device&&(this.device=e.device),!this.videoPlayer&&this.requiresVideoPlayer&&(this._videoPlayer||(this._videoPlayer=P.getComponent(this.gameObject,gt)??void 0),this.videoPlayer||this._ensureVideoPlayer(),!this.videoPlayer)){console.warn("Can not share video without a videoPlayer assigned");return}this._requestOpen=!0;try{const t=e?.constraints??{echoCancellation:!0,autoGainControl:!1},s={video:t,audio:t},o=s.video;switch(o!==void 0&&typeof o!="boolean"&&(o.width||(o.width={max:1920}),o.height||(o.height={max:1920}),o.aspectRatio||(o.aspectRatio={ideal:1.7777777778}),o.frameRate||(o.frameRate={ideal:24}),o.facingMode||(o.facingMode={ideal:"user"})),this.device){case"Camera":this.tryShareUserCamera(s,e);break;case"Screen":{if(!navigator.mediaDevices.getDisplayMedia){console.error("No getDisplayMedia support");return}const l=await navigator.mediaDevices.getDisplayMedia(s);this._requestOpen?this.setStream(l,1):en(l)}break;case"Canvas":const r=this.context.renderer.domElement.captureStream(0);this.setStream(r,1);break;case"Microphone":{if(!navigator.mediaDevices.getUserMedia){console.error("No getDisplayMedia support");return}s.video=!1;const l=await navigator.mediaDevices.getUserMedia(s);this._requestOpen?this.setStream(l,1):en(l)}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(){var e;this._requestOpen=!1,this._currentStream&&(Et&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),(e=this._net)==null||e.stopSendingStream(this._currentStream),en(this._currentStream),this._currentMode=0,this._currentStream=null)}setStream(e,t){var s,o,r;if(e===this._currentStream||(this.close(),!e))return;this._currentStream=e,this._requestOpen=!0,this._currentMode=t;const l=this.device!=="Microphone",c=t===1;l?(this._videoPlayer||this._ensureVideoPlayer(),this._videoPlayer?this._videoPlayer.setVideo(e):console.error("No video player assigned for video stream")):(this._audioSource||(this._audioSource=new ts,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),c||(Et&&console.log("PLAY",e.getAudioTracks()),this._audioSource.volume=1,(s=this._audioSource)==null||s.play(e))),c&&((o=this._net)==null||o.startSendingStream(e)),c&&(this._videoPlayer&&(this._videoPlayer.muted=!0),(r=this._audioSource)==null||r.stop());for(const h of e.getTracks())h.addEventListener("ended",()=>{Et&&console.log("Track ended",h),this.close()}),Et&&h.kind==="video"&&console.log(c?"Video \u2192":"Video \u2190",h.getSettings())}async tryShareUserCamera(e,t){const s=(await navigator.mediaDevices.enumerateDevices()).filter(r=>r.kind==="videoinput");Et&&console.log(`Request camera. These are your kind:videoinput devices:
1335
- `,s);let o=!1;for(const r of s)try{if(!this._requestOpen){Et&&console.log("Camera selection cancelled");break}if(r.kind!=="videoinput"){Et&&console.log("Skipping non-video device",r);continue}const l=r.deviceId;if(t?.deviceId!=null||t?.deviceFilter!=null){if(t?.deviceId!==void 0&&l!==t.deviceId){Et&&console.log("Skipping device due to options.deviceId: "+r.label+"; "+r.deviceId);continue}if(t!=null&&t.deviceFilter&&t.deviceFilter(r)===!1){Et&&console.log("Skipping device due to options.deviceFilter: "+r.label+"; "+r.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(r)===!1){Et&&console.log("Skipping device due to ScreenShare.deviceFilter: "+r.label+"; "+r.deviceId);continue}else Et&&console.log("Selected device by filter",r);else if(this.deviceName){const h=r.label.toLowerCase(),d=this.deviceName.toLowerCase(),u=h.includes(d),p=r.deviceId===this.deviceName;if(!u&&!p){Et&&console.log("Skipping device due to ScreenShare.deviceName: "+r.label+"; "+r.deviceId);continue}else Et&&console.log("Selected device by name",r)}e.video!==!1&&((typeof e.video>"u"||typeof e.video=="boolean")&&(e.video={}),e.video.deviceId=l),o=!0;const c=await navigator.mediaDevices.getUserMedia(e).catch(h=>(console.error("Failed to get user media",h),null));if(c===null)continue;this._requestOpen?(this.setStream(c,1),Et&&console.log("Selected camera",r)):(en(c),Et&&console.log("Camera selection cancelled"));break}catch(l){if(l.message==="Failed to allocate videosource"||l.message==="Could not start video source"){be("Failed to start video: Try another camera (Code "+l.code+")"),console.warn(l);continue}else console.error("Failed to get user media",l.message,l.code,l)}!o&&F()&&(be("No camera found for sharing. Please connect a camera (see console for more information)"),console.warn("No camera found for sharing. Please connect a camera",s,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([m()],ir.prototype,"allowStartOnClick",2),_h([m()],ir.prototype,"autoConnect",2),_h([m(gt)],ir.prototype,"videoPlayer",1),_h([m()],ir.prototype,"device",2),_h([m()],ir.prototype,"deviceName",2);var oI=Object.defineProperty,uS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&oI(e,t,o),o};class wh extends I{constructor(){super(...arguments),a(this,"mode",0),a(this,"shadowColor",new ce(0,0,0,1)),a(this,"targetMesh")}start(){if(this.gameObject instanceof X)this.gameObject instanceof X&&this.gameObject.material&&(this.gameObject.material=this.gameObject.material.clone(),this.targetMesh=this.gameObject,this.targetMesh.receiveShadow=!0);else{const e=vo.createPrimitive(vr.Quad,{name:"ShadowCatcher",material:new ft({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=Mv,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
1336
- // diffuse-only lighting with overdrive to somewhat compensate
1337
- // for the loss of indirect lighting and to make it more visible.
1338
- vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
1339
- float max = max(direct.r, max(direct.g, direct.b));
1340
-
1341
- // early out - we're simply returning direct lighting and some alpha based on it so it can
1342
- // be blended onto the scene.
1343
- gl_FragColor = vec4(direct, max);
1344
- return;
1345
- `)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new fv;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 Me;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)}}uS([m()],wh.prototype,"mode"),uS([m(ce)],wh.prototype,"shadowColor");var rI=Object.defineProperty,xh=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&rI(e,t,o),o};const Vt=C("debugskybox");Ty("skybox-image"),Ty("environment-image");function pS(n,e,t,s,o){const r=new Dp;r.allowDrop=!1,r.allowNetworking=!1,r.background=t,r.environment=s,P.addComponent(n.scene,r);const l=c=>{typeof c=="string"&&(Vt&&console.log(o,"CHANGED TO",c),r.setSkybox(c))};return ib(n.domElement,o,l),r.addEventListener("destroy",()=>{Vt&&console.log("Destroyed attribute remote skybox",o),sb(n.domElement,o,l)}),r.setSkybox(e)}const jp=new Array;pe.registerCallback(me.ContextCreationStart,n=>{var e;const t=n.context,s=t.domElement.getAttribute("skybox-image")||t.domElement.getAttribute("background-image"),o=t.domElement.getAttribute("environment-image");if(s){Vt&&console.log("Creating remote skybox to load "+s),((e=t.mainCameraComponent)==null?void 0:e.clearFlags)!==To.Skybox&&console.warn('"skybox-image"/"background-image" attribute has no effect: camera clearflags are not set to "Skybox"');const r=pS(t,s,!0,!1,"skybox-image");jp.push(r)}if(o){Vt&&console.log("Creating remote environment to load "+o);const r=pS(t,o,!1,!0,"environment-image");jp.push(r)}}),pe.registerCallback(me.ContextCreationStart,()=>Promise.all(jp).finally(()=>{jp.length=0}));function mS(){return globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES||(globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES=new Array),globalThis.NEEDLE_ENGINE_SKYBOX_TEXTURES}function gS(n){const e=mS().find(t=>t.src===n);return e?(Vt&&console.log("Skybox: Found previously loaded texture for "+n),e.texture):null}async function aI(n){const e=await n;jg(e,!0),Te(e)}function lI(n,e){const t=mS();for(;t.length>5;){const s=t.shift();s&&aI(s.texture)}e.then(s=>jg(s,!1)),t.push({src:n,texture:e})}const sa=class extends I{constructor(){super(...arguments),a(this,"url"),a(this,"allowDrop",!0),a(this,"background",!0),a(this,"environment",!0),a(this,"allowNetworking",!0),a(this,"_loader"),a(this,"_prevUrl"),a(this,"_prevLoadedEnvironment"),a(this,"_prevEnvironment",null),a(this,"_prevBackground",null),a(this,"validTextureTypes",[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"]),a(this,"onDragOverEvent",n=>{if(this.allowDrop&&n.dataTransfer)for(const e of n.dataTransfer.types)(e==="text/uri-list"||e==="Files")&&n.preventDefault()}),a(this,"onDrop",n=>{var e,t,s,o;if(this.allowDrop&&n.dataTransfer){for(const r of n.dataTransfer.types)if(Vt&&console.log(r),r==="text/uri-list"){const l=n.dataTransfer.getData(r);Vt&&console.log(r,l);let c=(t=(e=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(l))==null?void 0:e.groups)==null?void 0:t.name;if(c||(c=(o=(s=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(l))==null?void 0:s.groups)==null?void 0:o.name),Vt&&console.log(c),c){const h="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+c+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${h}`),n.preventDefault(),this.setSkybox(h);break}else if(this.isValidTextureType(l)){console.log("[Remote Skybox] Setting skybox from url: "+l),n.preventDefault(),this.setSkybox(l);break}else{console.warn(`[RemoteSkybox] Unknown url ${l}. 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 h=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:n,url:l,apply:d=>{n.preventDefault(),this.setSkybox(d)}}});this.dispatchEvent(h)}}else if(r=="Files"){const l=n.dataTransfer.files.item(0);if(Vt&&console.log(r,l),!l)continue;if(!this.isValidTextureType(l.name)){console.warn(`[RemoteSkybox]: File "${l.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}if(gS(l.name)===null){const c=new Blob([l]),h=URL.createObjectURL(c);n.preventDefault(),this.setSkybox(h,l.name)}else n.preventDefault(),this.setSkybox(l.name);break}}})}onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){var n;this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,ri.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),(n=this.context.mainCameraComponent)==null||n.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):Vt&&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(n,e){var t;if(!this.activeAndEnabled||(n=cI(n,this.environment,this.background),!n))return!1;if(e??(e=n),this.isValidTextureType(e)||console.warn("Potentially invalid skybox url",e,"on",this.name),Vt&&console.log("Set remote skybox url: "+n),this._prevUrl===n&&this._prevLoadedEnvironment)return this.apply(),!0;(t=this._prevLoadedEnvironment)==null||t.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=n;const s=await this.loadTexture(n,e);if(!s)return Vt&&console.warn("RemoteSkybox: Failed to load texture from url",n),!1;if(!this.enabled)return Vt&&console.warn("RemoteSkybox: Component is not enabled, aborting setSkybox"),!1;if(this._prevUrl!==n)return Vt&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1;this.url=n;const o=n.lastIndexOf("/");return s.name=n.substring(o>=0?o+1:0),this._loader instanceof fa&&(s.colorSpace=Cn),this._prevLoadedEnvironment=s,this.apply(),!0}async loadTexture(n,e){var t,s,o,r,l;if(!n)return Promise.resolve(null);e??(e=n);const c=gS(e);if(c){const g=await c;if(((s=(t=g.source)==null?void 0:t.data)==null?void 0:s.length)>0||(l=(r=(o=g.source)==null?void 0:o.data)==null?void 0:r.data)!=null&&l.length)return g}const h=e.endsWith(".exr"),d=e.endsWith(".hdr"),u=e.endsWith(".ktx2");if(h)this._loader instanceof pd||(this._loader=new pd);else if(d)this._loader instanceof Tm||(this._loader=new Tm);else if(u){if(!(this._loader instanceof JP)){const{ktx2Loader:g}=Rm(this.context.renderer);this._loader=g}}else this._loader instanceof fa||(this._loader=new fa);Vt&&console.log("Loading skybox: "+n);const p=this._loader.loadAsync(n);return lI(e,p),await p}apply(){var n;const e=this._prevLoadedEnvironment;e&&(e instanceof OP||e instanceof kP||(e.mapping=MP,e.needsUpdate=!0),this.context.scene.background!==e&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==e&&(this._prevEnvironment=this.context.scene.environment),Vt&&console.log("Set remote skybox",this.url,!ri.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=e),this.background&&!ri.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=e),((n=this.context.mainCameraComponent)==null?void 0:n.backgroundBlurriness)!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness))}isRemoteTexture(n){return n.startsWith("http://")||n.startsWith("https://")}isValidTextureType(n){for(const e of this.validTextureTypes)if(n.endsWith(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)}};xh([j0(sa.prototype.urlChangedSyncField),m(URL)],sa.prototype,"url"),xh([m()],sa.prototype,"allowDrop"),xh([m()],sa.prototype,"background"),xh([m()],sa.prototype,"environment"),xh([m()],sa.prototype,"allowNetworking");let Dp=sa;function cI(n,e,t){const s=e&&!t;switch(n?.toLowerCase()){case"studio":return s?"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.hdr":"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.hdr";case"blurred-skybox":return s?"https://cdn.needle.tools/static/skybox/blurred-skybox-small.exr":"https://cdn.needle.tools/static/skybox/blurred-skybox.exr";case"quicklook-ar":return s?"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.exr":"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.exr";case"quicklook":return s?"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.exr":"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.exr"}return n===void 0?null:n}var hI=Object.defineProperty,Bp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&hI(e,t,o),o},Fp;const Sh=(Fp=class extends I{constructor(){super(...arguments),a(this,"target",null),a(this,"followFactor",.1),a(this,"rotateFactor",.1),a(this,"positionAxes",Na.All),a(this,"flipForward",!1),a(this,"_firstUpdate",!0)}onBeforeRender(){this.updateNow(!1)}updateNow(n){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const e=ee(this.target),t=this._firstUpdate||n?1:W.clamp01(this.context.time.deltaTime*this.followFactor),s=this.worldPosition;this.positionAxes&Na.X&&(s.x=W.lerp(s.x,e.x,t)),this.positionAxes&Na.Y&&(s.y=W.lerp(s.y,e.y,t)),this.positionAxes&Na.Z&&(s.z=W.lerp(s.z,e.z,t)),this.worldPosition=s}if(this.rotateFactor>0){const e=Se(this.target);this.flipForward&&e.premultiply(Fp._invertForward);const t=this._firstUpdate||n?1:W.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(e,t)}this._firstUpdate=!1}}},a(Fp,"_invertForward",new H().setFromAxisAngle(new S(0,1,0),Math.PI)),Fp);Bp([m(A)],Sh.prototype,"target"),Bp([m()],Sh.prototype,"followFactor"),Bp([m()],Sh.prototype,"rotateFactor"),Bp([m()],Sh.prototype,"positionAxes");let Up=Sh;var dI=Object.defineProperty,Ch=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&dI(e,t,o),o};const Ph=C("debugspatialtrigger"),fS=new lo,yS=new lo;function uI(n,e){return fS.mask=n,yS.mask=e,fS.test(yS)}class mn extends I{constructor(){super(...arguments),a(this,"triggerMask",0),a(this,"onEnter"),a(this,"onStay"),a(this,"onExit"),a(this,"currentIntersected",[]),a(this,"lastIntersected",[])}start(){Ph&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of zp.triggers)uI(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)}onEnterTrigger(e){var t;Ph&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),(t=this.onEnter)==null||t.invoke()}onExitTrigger(e){var t;Ph&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),(t=this.onExit)==null||t.invoke()}onStayTrigger(e){var t;e.raiseOnStayEvent(this),(t=this.onStay)==null||t.invoke()}}Ch([m()],mn.prototype,"triggerMask"),Ch([m(xe)],mn.prototype,"onEnter"),Ch([m(xe)],mn.prototype,"onStay"),Ch([m(xe)],mn.prototype,"onExit");var Cl;const vS=(Cl=class extends I{constructor(){super(...arguments),a(this,"triggerMask"),a(this,"boxHelper")}start(){Ph&&console.log(this.name,this.triggerMask,this)}onEnable(){var n;Cl.triggers.push(this),this.boxHelper||(this.boxHelper=P.addComponent(this.gameObject,Lo),(n=this.boxHelper)==null||n.showHelper(null,Ph))}onDisable(){Cl.triggers.splice(Cl.triggers.indexOf(this),1)}test(n){return this.boxHelper?this.boxHelper.isInBox(n)??!1:!1}raiseOnEnterEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof mn&&e.onEnterTrigger(this)},!1)}raiseOnStayEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof mn&&e.onStayTrigger(this)},!1)}raiseOnExitEvent(n){P.foreachComponent(this.gameObject,e=>{e!==n&&e instanceof mn&&e.onExitTrigger(this)},!1)}},a(Cl,"triggers",[]),Cl);Ch([m()],vS.prototype,"triggerMask");let zp=vS;var pI=Object.defineProperty,mI=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&pI(e,t,o),o};const Wi=C("debugspectator");class Np extends I{constructor(){super(...arguments),a(this,"cam",null),a(this,"useKeys",!0),a(this,"_mode",0),a(this,"orbit",null),a(this,"_handler"),a(this,"eventSub_WebXRRequestStartEvent",null),a(this,"eventSub_WebXRStartEvent",null),a(this,"eventSub_WebXREndEvent",null),a(this,"_debug"),a(this,"_networking")}get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){var e;return((e=this._handler)==null?void 0:e.currentTarget)!==void 0}isSpectatingUser(e){var t;return((t=this.target)==null?void 0:t.userId)===e}isFollowedBy(e){var t;return(t=this.followers)==null?void 0:t.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){var t;if(this._handler){const s=(t=this._handler.currentTarget)==null?void 0:t.userId,o=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&o?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),P.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,s)):this._handler.currentTarget!==e&&(this._handler.set(e),P.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,s))}}get target(){var e;return(e=this._handler)==null?void 0:e.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){var e,t;return this.isSpectating&&((e=this.target)==null?void 0:e.currentObject)===((t=this.context.players.getPlayerView(this.localId))==null?void 0:t.currentObject)}awake(){if(this._debug=new yI(this.context,this),this._networking=new _I(this.context,this),this._networking.awake(),P.setActive(this.gameObject,!1),this.cam=P.getComponent(this.gameObject,ri),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new gI(this.context,this.cam,this)),this.orbit=P.getComponent(this.context.mainCamera,_e)}onDestroy(){var e,t;this.stopSpectating(),(e=this._handler)==null||e.destroy(),(t=this._networking)==null||t.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows|MacOS/.test(e),s=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!s}onBeforeXR(e){this.isSupportedPlatform()&&P.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(Wi&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){var t,s;this.context.removeCamera(this.cam),P.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),(t=this._handler)==null||t.set(void 0),(s=this._handler)==null||s.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,wo.Headset),this.target=this.context.players.getPlayerView(this.localId)),Wi&&console.log("Follow self",this.target)}onAfterRender(){var e,t,s;if(!this.cam)return;const o=this.context.renderer,r=o.xr.enabled;if(!o.xr.isPresenting&&!((e=this._handler)!=null&&e.currentTarget))return;(t=this._handler)==null||t.update(this._mode);const l=o.getRenderTarget();let c=null;const h=o.state;if(!l){if(!o.state.bindFramebuffer||!h.bindXRFramebuffer)return;c=o._framebuffer,h.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const d=this.context.mainCameraComponent;if(d){const g=d.backgroundColor;g&&o.setClearColor(g,g.alpha),this.cam.backgroundColor=g,this.cam.clearFlags=d.clearFlags,this.cam.nearClipPlane=d.nearClipPlane,this.cam.farClipPlane=d.farClipPlane}else o.setClearColor(new ae(1,1,1));o.setRenderTarget(null),o.xr.enabled=!1;const u=(s=this.cam)==null?void 0:s.threeCamera;this.context.updateAspect(u);const p=o.xr.isPresenting;o.xr.isPresenting=!1,o.setSize(this.context.domWidth,this.context.domHeight),o.render(this.context.scene,u),o.xr.isPresenting=p,o.xr.enabled=r,l?o.setRenderTarget(l):h.bindXRFramebuffer&&h.bindXRFramebuffer(c),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of ai.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let s=tn.All;this.isSpectatingSelf&&(s=e&&t.avatar.isLocalAvatar?tn.FirstPerson:tn.ThirdPerson);const o=t.avatar.flags;if(!o)continue;for(const r of o)r.UpdateVisible(s)}}resetAvatarFlags(){var e;for(const t of ai.instances)if(t.avatar&&"flags"in t.avatar){const s=t.avatar.flags;if(!s)continue;for(const o of s)"isLocalAvatar"in t.avatar&&(e=t.avatar)!=null&&e.isLocalAvatar?o.UpdateVisible(tn.FirstPerson):o.UpdateVisible(tn.ThirdPerson)}}}mI([m()],Np.prototype,"useKeys");class gI{constructor(e,t,s){a(this,"context"),a(this,"cam"),a(this,"spectator"),a(this,"follow"),a(this,"target"),a(this,"view"),a(this,"currentObject"),this.context=e,this.cam=t,this.spectator=s}get currentTarget(){return this.view}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=P.addComponent(this.cam.gameObject,Up)),this.target||(this.target=new A),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,Wi&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){Wi&&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(){var e;(e=this.target)==null||e.removeFromParent(),this.follow&&P.destroy(this.follow)}update(e){var t,s,o,r,l,c;if(((t=this.currentTarget)==null?void 0:t.isConnected)===!1||((s=this.currentTarget)==null?void 0:s.removed)===!0){Wi&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&((o=this.currentTarget)==null?void 0:o.currentObject)!==this.currentObject&&(Wi&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const h=this.context.mainCamera;if(h){const u=this.cam.threeCamera;(u.near!==h.near||u.far!==h.far)&&(u.near=h.near,u.far=h.far,u.updateProjectionMatrix())}const d=(r=this.follow)==null?void 0:r.target;if(!(!d||!this.follow)){switch(e){case 0:((l=this.view)==null?void 0:l.viewDevice)!==wo.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),d.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,d.position.set(0,.5,1.5);break}this.follow.flipForward=!1,((c=this.view)==null?void 0:c.viewDevice)!==wo.Browser?d.quaternion.copy(fI):d.quaternion.identity()}}}const fI=new H().setFromAxisAngle(new S(0,1,0),Math.PI);class yI{constructor(e,t){a(this,"context"),a(this,"spectator"),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",o=>{!this.spectator.useKeys||o.key==="Escape"&&this.spectator.stopSpectating()});let s=0;this.context.input.addEventListener(Be.PointerDown,o=>{s=this.context.time.time}),this.context.input.addEventListener(Be.PointerUp,o=>{const r=this.context.time.time-s;r>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&r<.3&&this.trySelectObject()})}trySelectObject(){const e=new $s;e.setMask(16777215);const t=this.context.physics.raycast(e);if(Wi&&console.log(...t),t!=null&&t.length)for(const s of t){if(s.distance<.2)continue;const o=s.object,r=P.getComponentInParent(o,ai),l=r?.connectionId;if(l){const c=this.context.players.getPlayerView(l);this.spectator.target=c,Wi&&console.log("spectate",l,r);break}}}}class vI{constructor(e,t,s){a(this,"guid"),a(this,"dontSave",!0),a(this,"targetUserId"),a(this,"stoppedFollowing"),this.guid=e,this.targetUserId=t,this.stoppedFollowing=s}}class bI{constructor(e,t){a(this,"guid"),a(this,"userId"),this.guid=e.guid,this.userId=t}}class _I{constructor(e,t){a(this,"followers",[]),a(this,"context"),a(this,"spectator"),a(this,"_followerEventMethod"),a(this,"_requestFollowMethod"),a(this,"_joinedRoomMethod"),a(this,"_lastRequestFollowUser"),a(this,"_enforceFollowInterval"),this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(ie.JoinedRoom,this._joinedRoomMethod),this.context.domElement.addEventListener("keydown",e=>{this.spectator.useKeys&&(e.key==="f"?this.onRequestFollowMe():e.key==="Escape"&&this.onRequestFollowMe(!0))})}destroy(){this.context.connection.stopListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.stopListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.stopListen(ie.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(Wi&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const s=e?.userId===void 0,o=s?t:e?.userId,r=new vI(this.context.connection.connectionId,o,s);this.context.connection.send("spectator-follower-changed",r)}}onRequestFollowMe(e=!1){if(Wi&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,s=new bI(this.spectator,t);this.context.connection.send("spectator-request-follow",s)}}onUserJoinedRoom(){C("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,s=e.guid;if(Wi&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const o=this.followers.indexOf(s);o!==-1&&(this.followers.splice(o,1),this.removeDisconnectedFollowers(),console.log(s,"unfollows you",this.followers.length))}else this.followers.includes(s)||(this.followers.push(s),this.removeDisconnectedFollowers(),console.log(s,"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)}}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 Wi&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}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):(Wi&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}class bn{constructor(){a(this,"bb",null),a(this,"bb_pos",0)}__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new bn).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+zv),(t||new bn).__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 Ir).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new Ir).__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 wI=Object.defineProperty,xI=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&wI(e,t,o),o};const Wp="SCAM";vg(Wp,bn.getRootAsSyncedCameraModel);const Vi=new Am;class SI{constructor(e,t){a(this,"userId"),a(this,"guid"),this.guid=t,this.userId=e}send(e,t){if(e){Vi.clear();const s=Vi.createString(this.guid),o=Vi.createString(this.userId);bn.startSyncedCameraModel(Vi),bn.addGuid(Vi,s),bn.addUserId(Vi,o);const r=ee(e),l=wd(e);bn.addPos(Vi,Ir.createVec3(Vi,r.x,r.y,r.z)),bn.addRot(Vi,Ir.createVec3(Vi,l.x,l.y,l.z));const c=bn.endSyncedCameraModel(Vi);Vi.finish(c,Wp),t.sendBinary(Vi.asUint8Array())}}}var Oh;const bS=(Oh=class extends I{constructor(){super(...arguments),a(this,"cameraPrefab",null),a(this,"_lastWorldPosition"),a(this,"_lastWorldQuaternion"),a(this,"_model",null),a(this,"_needsUpdate",!0),a(this,"_lastUpdateTime",0),a(this,"remoteCams",{}),a(this,"userToCamMap",{}),a(this,"_camTimeoutInSeconds",10),a(this,"_receiveCallback",null)}getCameraObject(n){const e=this.userToCamMap[n];return e?this.remoteCams[e].obj:null}async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(Wp,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Wp,this._receiveCallback)}update(){for(const s in this.remoteCams){const o=this.remoteCams[s],r=this.context.time.realtimeSinceStartup-o.lastUpdate;if(!o||r>this._camTimeoutInSeconds){F()&&console.log("Remote cam timeout",s),o!=null&&o.obj&&P.destroy(o.obj),delete this.remoteCams[s],o&&delete this.userToCamMap[o.userId],Oh.instances.push(o),this.context.players.removePlayerView(o.userId,wo.Browser);continue}}if(this.context.isInXR)return;const n=this.context.mainCamera;if(n===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new SI(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const e=ee(n),t=Se(n);(e.distanceTo(this._lastWorldPosition)>.001||t.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(e),this._lastWorldQuaternion.copy(t),!((!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(n,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,n,wo.Browser))}onReceivedRemoteCameraInfoBin(n){const e=n.guid();if(!e)return;const t=n.userId();if(!t||!this.context.connection.userIsInRoom(t)||!this.cameraPrefab)return;let s=this.remoteCams[e];if(!s)if("isObject3D"in this.cameraPrefab){const c=new Bs;c.context=this.context;const h=P.instantiate(this.cameraPrefab,c);s=this.remoteCams[e]={obj:h,lastUpdate:this.context.time.realtimeSinceStartup,userId:t},s.obj.visible=!0,this.gameObject.add(h),this.userToCamMap[t]=e,Oh.instances.push(s);const d=P.getOrAddComponent(h,ai);d.connectionId=t,d.avatar=h}else return;const o=s.obj;this.context.players.setPlayerView(t,o,wo.Browser),s.lastUpdate=this.context.time.realtimeSinceStartup,cs.markDirty(o);const r=n.pos();r&&pr(o,r.x(),r.y(),r.z());const l=n.rot();l&&Ql(o,l.x(),l.y(),l.z())}},a(Oh,"instances",[]),Oh);xI([m([A,le])],bS.prototype,"cameraPrefab");let Ey=bS;var CI=Object.defineProperty,PI=Object.getOwnPropertyDescriptor,sr=(n,e,t,s)=>{for(var o=s>1?void 0:s?PI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&CI(e,t,o),o};const Ay="view",Iy=C("debugsyncedroom");class Is extends I{constructor(){super(...arguments),a(this,"roomName",""),a(this,"urlParameterName","room"),a(this,"joinRandomRoom"),a(this,"requireRoomParameter",!1),a(this,"autoRejoin",!0),a(this,"createJoinButton",!0),a(this,"createViewOnlyButton",!1),a(this,"_lastJoinedRoom"),a(this,"_roomPrefix",""),a(this,"_lastPingTime",0),a(this,"_lastRoomTime",-1),a(this,"_userWantsToBeInARoom",!1),a(this,"_roomButton"),a(this,"_roomButtonIconJoin"),a(this,"_roomButtonIconLeave"),a(this,"updateRoomButtonState",()=>{var e,t;this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",(e=this._roomButtonIconJoin)==null||e.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",(t=this._roomButtonIconLeave)==null||t.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))}),a(this,"_viewOnlyButton"),a(this,"onCreateViewOnlyButton",()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{var t;const s=this.getViewOnlyUrl();s!=null&&s.length?navigator.canShare({url:s})?(t=navigator.share({url:s}))==null||t.catch(o=>{console.warn(o)}):(navigator.clipboard.writeText(s),De("View only URL copied to clipboard")):be("Could not create view only URL")},e.title="Copy the view only URL: A page accessed by the view only URL can not be modified by visiting users.",e.textContent="Share View URL",e.prepend(Pt("visibility"))}this.context.menu.appendChild(this._viewOnlyButton)})}get currentRoomName(){return C(Ay)||C(this.urlParameterName)}set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}awake(){var e;this.joinRandomRoom===void 0&&((e=this.roomName)==null?void 0:e.length)<=0&&(this.joinRandomRoom=!0),Iy&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=C(Ay);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(){var e;(e=this._roomButton)==null||e.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){var t;e===void 0&&(e=0);let s=!1;if(((t=this.urlParameterName)==null?void 0:t.length)>0){const o=C(this.urlParameterName);if(o&&(typeof o=="string"||typeof o=="number")){s=!0;const r=eb(o.toString());this.roomName=r}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&&!s?((Iy||F())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
1346
- 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.
1347
- Please choose one of the following options to fix this:
1348
- A) Set a room name in the SyncedRoom component
1349
- B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
1350
- C) Set "joinRandomRoom" to true`),!1):(Iy&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}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()):F()&&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(Ay,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=Wl(),t=this.generateRoomName();C(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),Fm(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}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=C(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?Vl(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Pt("group"),this._roomButtonIconLeave=Pt("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(ie.LeftRoom,this.updateRoomButtonState),e}destroyRoomButton(){this.context.connection.stopListen(ie.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(ie.LeftRoom,this.updateRoomButtonState)}onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(ie.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){var e;this.context.connection.stopListen(ie.JoinedRoom,this.onCreateViewOnlyButton),(e=this._viewOnlyButton)==null||e.remove()}}sr([m()],Is.prototype,"roomName",2),sr([m()],Is.prototype,"urlParameterName",2),sr([m()],Is.prototype,"joinRandomRoom",2),sr([m()],Is.prototype,"requireRoomParameter",2),sr([m()],Is.prototype,"autoRejoin",2),sr([m()],Is.prototype,"createJoinButton",2),sr([m()],Is.prototype,"createViewOnlyButton",2),sr([m()],Is.prototype,"roomPrefix",1);function OI(){const n=C("testwindowcount")||0;n&&n>0&&kI(n)}function kI(n){if(C("testwindow"))return null;const e=new URL(window.location.href);Bm(e.searchParams,AT,1),Bm(e.searchParams,"testwindow",1);const t=e.toString(),s=[];window.onbeforeunload=()=>{for(const h of s)h.close()};const o=.05,r=128;let l=0,c=0;for(let h=0;h<n;h++){l*r+r*.01>=window.innerWidth&&(c+=1,l=0);const d=l*(r*(1+o))+window.screenLeft,u=c*(r*(1+o))+window.screenTop+90+60*c;l+=1;const p=window.open(t,"test window "+h,`popup=yes width=${r} height=${r} top=${u} left=${d}`);if(!p){console.warn("Failed to open window");continue}s.push(p),p.onload=()=>{p.onbeforeunload=()=>{for(let g=0;g<s.length;g++){const f=s[g];f!==p&&f.close()}s.length=0}}}return s}class Ly extends I{awake(){OI()}}class jy extends I{constructor(){super(...arguments),a(this,"transformsPerFrame",10),a(this,"interval",0),a(this,"useFlatbuffers",!0),a(this,"builder",null),a(this,"models",null)}awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Tc,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new _S(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new Am(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const s=lx(this.context.connection.connectionId,this);this.context.connection.sendBinary(s)}}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 _S{constructor(e,t){a(this,"guid"),a(this,"fast",!1),a(this,"position"),a(this,"rotation"),a(this,"velocity"),a(this,"dontSave"),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)}isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}update(e,t){const s=e.worldPosition;this.position.x=s.x,this.position.y=s.y,this.position.z=s.z;const o=e.worldQuaternion;if(this.rotation.x=o.x,this.rotation.y=o.y,this.rotation.z=o.z,this.rotation.w=o.w,this.fast=!1,t){const r=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=r.x,this.velocity.y=r.y,this.velocity.z=r.z}}}a(_S,"temp",new S);var MI=Object.defineProperty,Vp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&MI(e,t,o),o};const RI=C("debugsignals");class Hp{constructor(){a(this,"guid")}}Vp([m()],Hp.prototype,"guid");class kh{constructor(){a(this,"signal"),a(this,"reaction")}}Vp([m(Hp)],kh.prototype,"signal"),Vp([m(xe)],kh.prototype,"reaction");var Ls;const wS=(Ls=class extends I{constructor(){super(...arguments),a(this,"events")}static invoke(n){if(Ls.receivers[n]){const e=Ls.receivers[n];if(!e)return;for(const t of e)t.invoke(n)}}awake(){RI&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const n of this.events)Ls.receivers[n.signal.guid]||(Ls.receivers[n.signal.guid]=[]),Ls.receivers[n.signal.guid].push(this)}onDisable(){if(this.events){for(const n of this.events)if(Ls.receivers[n.signal.guid]){const e=Ls.receivers[n.signal.guid].indexOf(this);e>=0&&Ls.receivers[n.signal.guid].splice(e,1)}}}invoke(n){if(!this.events||!Array.isArray(this.events))return;const e=typeof n=="object"?n.guid:n;for(const t of this.events)if(t.signal.guid===e)try{if(t.reaction){if(!t.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",t,this);continue}}else{console.warn("Missing reaction for signal",t,this);continue}t.reaction.invoke()}catch(s){console.error(s)}}},a(Ls,"receivers",{}),Ls);Vp([m(kh)],wS.prototype,"events");let Mh=wS;var Hi=(n=>(n.Activation="ActivationTrack",n.Animation="AnimationTrack",n.Audio="AudioTrack",n.Control="ControlTrack",n.Marker="MarkerTrack",n.Signal="SignalTrack",n))(Hi||{}),gn=(n=>(n[n.None=0]="None",n[n.Hold=1]="Hold",n[n.Loop=2]="Loop",n[n.PingPong=3]="PingPong",n[n.Continue=4]="Continue",n))(gn||{}),Dy=(n=>(n.Signal="SignalEmitter",n))(Dy||{});const fn=C("debugtimeline");class Rh{constructor(){a(this,"director"),a(this,"track")}get muted(){return this.track.muted}set muted(e){var t;e!==this.track.muted&&(this.track.muted=e,(t=this.onMuteChanged)==null||t.call(this))}*forEachClip(e=!1){var t;if((t=this.track)!=null&&t.clips)if(e)for(let s=this.track.clips.length-1;s>=0;s--)yield this.track.clips[s];else for(const s of this.track.clips)yield s}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,s,o=!0){if(t<0||t>=s.length)return 0;const r=s[t];if(o||e>=r.start&&e<=r.end){let l=1;if(r.easeInDuration>0){const c=Math.min((e-r.start)/r.easeInDuration,1);l*=c}if(r.easeOutDuration>0){const c=Math.min((r.end-e)/r.easeOutDuration,1);l*=c}return l}return 0}}class TI{constructor(e){a(this,"clip"),a(this,"rootPositionOffset"),a(this,"rootQuaternionOffset"),a(this,"rootStartPosition"),a(this,"rootEndPosition"),a(this,"rootStartQuaternion"),a(this,"rootEndQuaternion");const t=e.getClip();this.clip=t;const s=e.getRoot(),o=s.name+".position",r=s.name+".quaternion";fn&&console.log(t.name,t.tracks,o);for(const l of t.tracks)if(!(l.times.length<=0)){if(l.name.endsWith(o))this.rootStartPosition=new S().fromArray(l.values,0),this.rootEndPosition=new S().fromArray(l.values,l.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),fn&&console.log(this.rootPositionOffset);else if(l.name.endsWith(r)&&(this.rootStartQuaternion=new H().fromArray(l.values,0),this.rootEndQuaternion=new H().fromArray(l.values,l.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),fn)){const c=new It().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",c)}}}get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}}class $p extends Rh{constructor(){super(...arguments),a(this,"models",[]),a(this,"trackOffset"),a(this,"target"),a(this,"mixer"),a(this,"clips",[]),a(this,"actions",[]),a(this,"weight",1),a(this,"_actionOffsets",[]),a(this,"_didBind",!1),a(this,"_animator",null),a(this,"_useclipOffsets",!0),a(this,"_totalOffsetPosition",new S),a(this,"_totalOffsetRotation",new H),a(this,"_totalOffsetPosition2",new S),a(this,"_totalOffsetRotation2",new H),a(this,"_summedPos",new S),a(this,"_tempPos",new S),a(this,"_summedRot",new H),a(this,"_tempRot",new H),a(this,"_clipRotQuat",new H)}onDisable(){var e;(e=this.mixer)==null||e.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&Jw(this._animator.gameObject,this,this.director.isPlaying)}createHooks(e,t){var s,o;if(((s=t.tracks)==null?void 0:s.length)<=0){console.warn("No tracks in AnimationClip",t);return}const r=t.tracks[0].name.split("."),l=r[r.length-2],c=l+".position",h=l+".quaternion";let d=!1,u=!1;for(const p of t.tracks)p.name.endsWith(c)?(d=!0,this.createPositionInterpolant(t,e,p)):p.name.endsWith(h)&&(u=!0,this.createRotationInterpolant(t,e,p));if(!d||!u){const p=(o=this.mixer)==null?void 0:o.getRoot(),g=t.tracks[0],f=g.name.lastIndexOf("."),y=g.name.substring(0,f),v=y.substring(y.lastIndexOf(".")+1),b=p.getObjectByName(v);if(b)if(d){if(!u){const _=t.tracks[0].name.substring(0,f)+".quaternion";fn&&console.warn("Create quaternion track",v,b);const w=b.quaternion,x=new TP(_,[0,t.duration],[w.x,w.y,w.z,w.w,w.x,w.y,w.z,w.w]);t.tracks.push(x),this.createRotationInterpolant(t,e,x)}}else{const _=y+".position";fn&&console.warn("Create position track",v,b);const w=b.position,x=new RP(_,[0,t.duration],[w.x,w.y,w.z,w.x,w.y,w.z]);t.tracks.push(x),this.createPositionInterpolant(t,e,x)}}}bind(){if(!this._didBind){this._didBind=!0,fn&&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 TI(e);this._actionOffsets.push(t)}this.target&&(this._animator=P.getComponent(this.target,Ot)??null,this._animator&&Jw(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,s=t.position,o=t.rotation;s&&s.x!==void 0&&(s.isVector3||(t.position=new S(s.x,s.y,s.z)),o.isQuaternion||(t.rotation=new H(o.x,o.y,o.z,o.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new S(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new H(t.x,t.y,t.z,t.w)))}}evaluate(e){var t,s,o,r,l,c,h;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 d=0,u=0,p=!1,g=!1,f=0;for(let y=0;y<this.clips.length;y++){const v=this.models[y],b=this.actions[y],_=v.asset;b.weight=0;const w=e>=v.start&&e<=v.end,x=v.preExtrapolationMode,M=v.postExtrapolationMode,k=y<this.clips.length-1?this.models[y+1]:null;let T=w,L=!1;if(!T&&!p&&v.end<e&&M!==gn.None?(!k||k.start>e)&&(T=!0,p=!0):y==0&&!T&&!g&&v.start>e&&x!==gn.None&&(!k||k.start<e)&&(T=!0,L=!0,g=!0),T){let B=this.weight;B*=this.evaluateWeight(e,y,this.models,T),B*=this.director.weight;let z=w;if(L)switch(x){case gn.Hold:break;case gn.Loop:e+=v.start,z=!0;break;default:e+=v.start,z=!0;break}let j=this.getClipTime(e,v),V=0;const G=_.duration;if(L&&x===gn.Hold&&(j=0),z){if(_.loop)for(V+=Math.floor(j/(G+1e-6));j>G;)j-=G}else if(!w&&p)switch(M){case gn.Hold:j=this.getClipTime(v.end,v);break;case gn.Loop:j%=G;break;case gn.PingPong:const U=Math.floor(j/G)%2!==0;j%=G,U&&(j=G-j);break}v.reversed===!0?b.time=b.getClip().duration-j:b.time=j,b.timeScale=0;const E=Math.max(0,B);if(b.weight=E,f+=E,b.clampWhenFinished=!1,b.isRunning()||b.play(),this._useclipOffsets){const U=d==0?this._totalOffsetPosition:this._totalOffsetPosition2,$=d==0?this._totalOffsetRotation:this._totalOffsetRotation2;d<1&&(u=1-B),d+=1;const te=this._summedPos.set(0,0,0),oe=this._tempPos.set(0,0,0),ue=this._summedRot.identity(),ge=this._tempRot.identity(),He=_.rotation;He&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp(He,B));const $e=this._actionOffsets[y];if($e.hasOffsets)for(let us=0;us<V;us++)$e.rootPositionOffset?oe.copy($e.rootPositionOffset):oe.set(0,0,0),oe.applyQuaternion(ue),this._clipRotQuat&&oe.applyQuaternion(this._clipRotQuat),$e.rootQuaternionOffset&&(ge.copy($e.rootQuaternionOffset),ue.multiply(ge)),te.add(oe);this._clipRotQuat&&$.multiply(this._clipRotQuat),$.multiply(ue),_.position&&te.add(_.position),U.add(te)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,u),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,u)),this.__mixerError===void 0&&(fn||F())&&(s=(t=this._animator)==null?void 0:t.runtimeAnimatorController)!=null&&s.mixer&&this.mixer!==((r=(o=this._animator)==null?void 0:o.runtimeAnimatorController)==null?void 0:r.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)),(l=this._animator)!=null&&l.runtimeAnimatorController){const y=Math.max(0,1-f);(h=(c=this._animator)==null?void 0:c.runtimeAnimatorController)==null||h.update(y)}else this.mixer.update(e)}createRotationInterpolant(e,t,s){var o;const r=s.createInterpolant.bind(s),l=new H;this.ensureTrackOffsets();const c=(o=this.trackOffset)==null?void 0:o.rotation;s.createInterpolant=()=>{const h=r(),d=h.evaluate.bind(h);return h.evaluate=u=>{var p;const g=d(u);if(l.set(g[0],g[1],g[2],g[3]),l.premultiply(this._totalOffsetRotation),c&&l.premultiply(c),this.director.animationCallbackReceivers)for(const f of this.director.animationCallbackReceivers)(p=f?.onTimelineRotation)==null||p.call(f,this.director,this.target,u,l);return g[0]=l.x,g[1]=l.y,g[2]=l.z,g[3]=l.w,g},h}}createPositionInterpolant(e,t,s){var o,r;const l=s.createInterpolant.bind(s),c=new S;this.ensureTrackOffsets();const h=(o=this.trackOffset)==null?void 0:o.rotation,d=(r=this.trackOffset)==null?void 0:r.position;let u;s.createInterpolant=()=>{const p=l(),g=p.evaluate.bind(p);return p.evaluate=f=>{var y,v,b;const _=g(f);if(c.set(_[0],_[1],_[2]),t.removeStartOffset&&(u===void 0?(u=null,u=(v=(y=this._actionOffsets.find(w=>w.clip===e))==null?void 0:y.rootStartPosition)==null?void 0:v.clone()):u!=null&&u.isVector3&&c.sub(u)),c.applyQuaternion(this._totalOffsetRotation),c.add(this._totalOffsetPosition),h&&c.applyQuaternion(h),d&&(c.x-=d.x,c.y+=d.y,c.z+=d.z),this.director.animationCallbackReceivers)for(const w of this.director.animationCallbackReceivers)(b=w?.onTimelinePosition)==null||b.call(w,this.director,this.target,f,c);return _[0]=c.x,_[1]=c.y,_[2]=c.z,_},p}}}const EI=C("mutetimeline"),xS=class ed extends Rh{constructor(){super(...arguments),a(this,"models",[]),a(this,"listener"),a(this,"audio",[]),a(this,"audioContextTimeOffset",[]),a(this,"lastTime",0),a(this,"audioSource"),a(this,"_audioLoader",null),a(this,"_playableDirectorResumed",!1)}getAudioFilePath(e){const t=this.director.sourceId;return mo(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const s=this.models[t];this.audio[t].setVolume(e?s.asset.volume:0)}}addModel(e){const t=new EP(this.listener);this.audio.push(t);const s=e;s._didTriggerPlay=!1,this.models.push(s)}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!=null&&t.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t!=null&&t.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t!=null&&t.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if(EI||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,s=this._playableDirectorResumed;this._playableDirectorResumed=!1;const o=t?.1:0;for(let r=0;r<this.models.length;r++){const l=this.models[r],c=this.audio[r],h=l.asset;if((!c||!c.buffer)&&this.isInTimeRange(l,e-1,e+1)&&this.handleAudioLoading(l,c),ts.userInteractionRegistered!==!1&&!(c===null||!c.buffer))if(c.playbackRate=this.director.context.time.timeScale*this.director.speed,c.loop=h.loop,e>=l.start&&e<=l.end&&e<this.director.duration){if(!c.isPlaying||!this.director.isPlaying)(s||!l._didTriggerPlay&&this.lastTime<e)&&(l.duration*l.timeScale>.3?c.offset=l.clipIn+(e-l.start)*l.timeScale:c.offset=0,fn&&console.log("Timeline Audio ("+this.track.name+") play with offset "+c.offset+" - "+l.asset.clip),c.play(o),l._didTriggerPlay=!0);else{const u=l.clipIn+(e-l.start)*l.timeScale,p=c.context.currentTime-c._startedAt+c.offset;Math.abs(u-p)>.3&&(c.offset=u,c.stop(),c.play(o))}let d=h.volume;if(this.track.volume!==void 0&&(d*=this.track.volume),t&&(d=0),l.easeInDuration>0){const u=Math.min((e-l.start)/l.easeInDuration,1);d*=u}if(l.easeOutDuration>0){const u=Math.min((l.end-e)/l.easeOutDuration,1);d*=u}c.setVolume(d*this.director.weight)}else l._didTriggerPlay=!1,this.director.isPlaying&&c.isPlaying&&c.stop()}this.lastTime=e}loadAudio(e,t=0,s=0){let o=null;const r=e-s,l=e+t;for(const c of this.models)if(this.isInTimeRange(c,r,l)){const h=this.audio[this.models.indexOf(c)],d=this.handleAudioLoading(c,h);d!==null&&(o===null&&(o=[]),o.push(d))}return o!==null?Promise.all(o):null}isInTimeRange(e,t,s){return t<=e.start&&s>=e.end||t>=e.start&&t<=e.end||s>=e.start&&s<=e.end}static dispose(){ed._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new Cm);const s=this.getAudioFilePath(e.asset.clip);if(ed._audioBuffers.get(s)){const r=ed._audioBuffers.get(s);return r.then(l=>{l&&t.setBuffer(l)}),r}fn&&console.warn("LOAD audio track",s,this.director.sourceId);const o=new Promise((r,l)=>{this._audioLoader.load(s,c=>{t.setBuffer(c),r(c)},void 0,c=>{console.error("Error loading audio",c),r(null)})});return ed._audioBuffers.set(s,o),o}};a(xS,"_audioBuffers",new Map);let Gp=xS;class Th extends Rh{constructor(){super(...arguments),a(this,"models",[]),a(this,"didTrigger",[]),a(this,"receivers",[])}evaluate(e){var t;if(this.track.muted)return;const s=this.director.context.time.deltaTime*1.5;for(let o=0;o<this.models.length;o++){const r=this.models[o],l=this.didTrigger[o],c=r.time-e;let h=!1;if(r.retroActive)h=c<=1e-6;else{const d=Math.abs(c);(d===0||d>=1e-5&&d<s)&&(h=!0)}if(h){if(!l)if(fn&&console.log("Trigger signal",e,r.time,r),this.didTrigger[o]=!0,((t=this.receivers)==null?void 0:t.length)<=0)Mh.invoke(r.asset);else for(const d of this.receivers)d&&d.invoke(r.asset)}else r.emitOnce||(this.didTrigger[o]=!1)}}}class qp extends Rh{constructor(){super(...arguments),a(this,"models",[]),a(this,"timelines",[]),a(this,"_previousActiveModel",null)}resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const s=this.models[t].asset;if(!s.sourceObject||typeof s.sourceObject!="object"){console.log("no source object, removing model",t,s),this.models.splice(t,1);continue}else{const o=P.getComponent(s.sourceObject,Pl);this.timelines.push(o),o&&s.updateDirector&&(o.playOnAwake=!1)}}}evaluate(e){var t;this._previousActiveModel=null;for(let s=0;s<this.models.length;s++){const o=this.models[s],r=o.asset;if(e>=o.start&&e<=o.end){this._previousActiveModel=o;const l=this.getClipTime(e,o);if(r.controlActivation){const c=r.sourceObject;c.visible=!0}if(r.updateDirector){const c=this.timelines[s];c&&(c.isPlaying&&c.pause(),c.time=l,c.evaluate())}}else{const l=(t=this._previousActiveModel)==null?void 0:t.asset;if(r.controlActivation){const c=r.sourceObject;l?.sourceObject!==c&&(c.visible=!1)}}}}}var AI=Object.defineProperty,SS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&AI(e,t,o),o};const eo=C("debugtimeline");var Eh;const By=(Eh=class extends I{constructor(){super(...arguments),a(this,"playableAsset"),a(this,"playOnAwake"),a(this,"extrapolationMode",1),a(this,"waitForAudio",!0),a(this,"_visibilityChangeEvt"),a(this,"_clonedPlayableAsset",!1),a(this,"_speed",1),a(this,"_guidsMap"),a(this,"_isPlaying",!1),a(this,"_internalUpdateRoutine"),a(this,"_isPaused",!1),a(this,"_isStopping",!1),a(this,"_time",0),a(this,"_duration",0),a(this,"_weight",1),a(this,"_animationTracks",[]),a(this,"_audioTracks",[]),a(this,"_signalTracks",[]),a(this,"_controlTracks",[]),a(this,"_customTracks",[]),a(this,"_allTracks",[this._animationTracks,this._audioTracks,this._signalTracks,this._controlTracks,this._customTracks]),a(this,"animationCallbackReceivers",[])}static registerCreateTrack(n,e){this.createTrackFunctions[n]=e}get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(n){typeof n=="number"&&!Number.isNaN(n)?this._time=n:(eo||$t())&&console.error("INVALID TIMELINE.TIME VALUE",n,this.name)}get duration(){return this._duration}set duration(n){this._duration=n}get weight(){return this._weight}set weight(n){this._weight=n}get speed(){return this._speed}set speed(n){this._speed=n}awake(){var n,e,t,s,o;eo&&console.log(this,(n=this.playableAsset)==null?void 0:n.tracks),this.rebuildGraph(),!this.isValid()&&(eo||F())&&(eo?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",(e=this.playableAsset)==null?void 0:e.tracks,"IsArray?",Array.isArray((t=this.playableAsset)==null?void 0:t.tracks),this):(o=(s=this.playableAsset)==null?void 0:s.tracks)!=null&&o.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){var n,e,t;for(const s of this._audioTracks)(n=s.onEnable)==null||n.call(s);for(const s of this._customTracks)(e=s.onEnable)==null||e.call(s);for(const s of this._animationTracks)(t=s.onEnable)==null||t.call(s);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(){var n,e,t;this.stop();for(const s of this._audioTracks)(n=s.onDisable)==null||n.call(s);for(const s of this._customTracks)(e=s.onDisable)==null||e.call(s);for(const s of this._animationTracks)(t=s.onDisable)==null||t.call(s);this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){var n;for(const e of this._allTracks)for(const t of e)(n=t.onDestroy)==null||n.call(t)}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const n=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,n&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const e=[];for(const t of this._audioTracks){const s=t.loadAudio(this._time,1,0);s&&e.push(s)}if(e.length>0&&(await Promise.all(e),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!ts.userInteractionRegistered&&this.waitForAudio;)await fs(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),Oe.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const t of this._audioTracks)t.stop();const n=this._isPaused==!0,e=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),n&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,n&&!e&&this.invokePauseChangedMethodsOnTracks(),e&&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 n of this._allTracks)for(const e of n)yield e}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}resolveGuids(n){this._guidsMap=n}invokePauseChangedMethodsOnTracks(){var n;for(const e of this.forEachTrack())(n=e.onPauseChanged)==null||n.call(e)}invokeStateChangedMethodsOnTracks(){var n;for(const e of this.forEachTrack())(n=e.onStateChanged)==null||n.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(n=!1){if(!this.isValid())return;let e=this._time;switch(this.extrapolationMode){case 0:this._speed>0?e=Math.min(e,this._duration):this._speed<0&&(e=Math.max(e,0)),this._time=e;break;case 1:e%=this._duration,this._time=e;break;case 2:if(e>this._duration){this.stop();return}break}const t=this._time;for(const s of this.playableAsset.tracks)if(!s.muted)switch(s.type){case Hi.Activation:if(!n&&!this._isPlaying)continue;for(let o=0;o<s.outputs.length;o++){const r=s.outputs[o];if(typeof r=="object"){let l=!1;if(s.clips)for(const h of s.clips)h.start<=t&&t<=h.end&&(l=!0);const c=r;c.visible!==void 0&&c.visible!==l&&(c.visible=l,eo&&console.warn(this.name,"set ActivationTrack-"+o,c.name,l,t))}}break}if(!this._isStopping)for(const s of this._animationTracks)s.evaluate(t);for(const s of this._audioTracks)s.evaluate(t);for(const s of this._signalTracks)s.evaluate(t);for(const s of this._controlTracks)s.evaluate(t);for(const s of this._customTracks)s.evaluate(t)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=Hl(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const n=this.findRoot(this.gameObject);for(const e of this.playableAsset.tracks){for(let t=e.outputs.length-1;t>=0;t--){let s=e.outputs[t];if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const o=P.findByGuid(s,n);o===null||typeof o!="object"?(e.outputs.splice(t,1),console.warn("Failed to resolve binding",s,e.name,e.type)):(eo&&console.log("Resolved binding",s,"to",o),e.outputs[t]=o)}else if(s===null){if(e.outputs.splice(t,1),Eh.createTrackFunctions[e.type])continue;e.type!==Hi.Audio&&e.type!==Hi.Control&&e.type!==Hi.Marker&&e.type!==Hi.Signal&&console.warn("Missing binding",s,e.name,e.type,this.name,this.playableAsset.name)}}if(e.type===Hi.Control&&e.clips)for(let t=0;t<e.clips.length;t++){const s=e.clips[t];let o=s.asset.sourceObject;if(typeof o=="string"){this._guidsMap&&this._guidsMap[o]&&(o=this._guidsMap[o]);const r=P.findByGuid(o,n);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",o,e.name,s):(eo&&console.log("Resolved binding",o,"to",r),s.asset.sourceObject=r)}}}}findRoot(n){return n.parent?this.findRoot(n.parent):n}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const n of this.playableAsset.tracks)if(n.muted!==!0){if(n.clips)for(const e of n.clips)e.end>this._duration&&(this._duration=e.end);if(n.markers)for(const e of n.markers)e.time>this._duration&&(this._duration=e.time+.001)}}}setupAndCreateTrackHandlers(){var n,e,t;if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let s=P.findObjectOfType(Bn,this.context);for(const o of this.playableAsset.tracks){const r=o.type,l=Eh.createTrackFunctions[r];if(l!=null){const c=l(this,o);if(typeof c.evaluate=="function"){c.director=this,c.track=o,this._customTracks.push(c);continue}}if(o.type===Hi.Animation){if(!o.clips||o.clips.length<=0){eo&&console.warn("Animation track has no clips",o);continue}for(let c=o.outputs.length-1;c>=0;c--){let h=o.outputs[c];if(h instanceof A){const u=P.getOrAddComponent(h,Ot);u&&(h=u)}const d=(n=h?.gameObject)==null?void 0:n.animations;if(d){const u=new $p;u.trackOffset=o.trackOffset,u.director=this,u.track=o;for(let p=0;p<o.clips.length;p++){const g=o.clips[p],f=g.asset;if(!f){console.error(`Timeline ${this.name}: clip #${p} on track "${o.name}" has no animation data`);continue}const y=f.clip;let v=y;if((typeof v=="string"||typeof v=="number")&&(v=d.find(_=>_.name===y)),eo&&console.log(f,y,"\u2192",v),!v){console.warn("Could not find animationClip for model",g,o.name,this.name,(e=this.playableAsset)==null?void 0:e.name,d,h);continue}h instanceof Ot&&h.runtimeAnimatorController&&(h.__internalDidAwakeAndStart||h.initializeRuntimeAnimatorController(),h.runtimeAnimatorController.mixer||h.runtimeAnimatorController.bind(h),u.mixer=h.runtimeAnimatorController.mixer),u.mixer||(u.mixer=new xm(h.gameObject),this.context.animations.registerAnimationMixer(u.mixer)),u.clips.push(v),u.mixer.uncacheAction(v),u.createHooks(g.asset,v);const b=u.mixer.clipAction(v);u.actions.push(b),u.models.push(g)}this._animationTracks.push(u)}}}else if(o.type===Hi.Audio){if(!o.clips||o.clips.length<=0)continue;const c=new Gp;c.director=this,c.track=o,c.audioSource=o.outputs.find(h=>h instanceof ts),this._audioTracks.push(c),s||(s=(t=this.context.mainCameraComponent)==null?void 0:t.gameObject.addComponent(Bn)),c.listener=s.listener;for(let h=0;h<o.clips.length;h++){const d=o.clips[h];c.addModel(d)}}else if(o.type===Hi.Marker){const c=new Th;if(c.director=this,c.track=o,o.markers)for(const h of o.markers)switch(h.type){case Dy.Signal:c.models.push(h),c.didTrigger.push(!1);break}if(c!==null&&c.models.length>0){const h=P.getComponent(this.gameObject,Mh);h&&(c.receivers.push(h),this._signalTracks.push(c))}}else if(o.type===Hi.Signal){const c=new Th;if(c.director=this,c.track=o,o.markers)for(const h of o.markers)c.models.push(h),c.didTrigger.push(!1);for(const h of o.outputs)c.receivers.push(h);this._signalTracks.push(c)}else if(o.type===Hi.Control){const c=new qp;if(c.director=this,c.track=o,o.clips)for(const h of o.clips)c.models.push(h);c.resolveSourceObjects(this.context),this._controlTracks.push(c)}}}setAudioTracksAllowPlaying(n){for(const e of this._audioTracks)e.onAllowAudioChanged(n)}registerAnimationCallback(n){this.animationCallbackReceivers.push(n)}unregisterAnimationCallback(n){const e=this.animationCallbackReceivers.indexOf(n);e!==-1&&this.animationCallbackReceivers.splice(e,1)}},a(Eh,"createTrackFunctions",{}),Eh);SS([m()],By.prototype,"playOnAwake"),SS([m()],By.prototype,"extrapolationMode");let Pl=By;var II=Object.defineProperty,Xp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&II(e,t,o),o};class na extends I{constructor(){super(...arguments),a(this,"isGizmo",!1),a(this,"translationSnap",1),a(this,"rotationSnapAngle",15),a(this,"scaleSnap",.25),a(this,"_control"),a(this,"orbit"),a(this,"onControlChangedEvent",e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const s=P.getComponentInParent(this.gameObject,Zs);s&&s.requestOwnership()}}),a(this,"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}}),a(this,"windowKeyUpListener",e=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}})}get control(){return this._control}onEnable(){var e;if(!(this.isGizmo&&!pc)&&this.context.mainCamera&&(this._control||(this._control=new eO(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(t=>{const s=t;if(s.layers.set(2),s){const o=s.material;o&&(o.opacity=.3)}}),this.orbit=P.getComponentInParent(this.context.mainCamera,_e)??void 0),this._control)){const t=this._control.getHelper();this.context.scene.add(t),this._control.attach(this.gameObject),(e=this._control)==null||e.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){var e,t,s;(t=(e=this._control)==null?void 0:e.getHelper())==null||t.removeFromParent(),(s=this._control)==null||s.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(_n.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}}Xp([m()],na.prototype,"isGizmo"),Xp([m()],na.prototype,"translationSnap"),Xp([m()],na.prototype,"rotationSnapAngle"),Xp([m()],na.prototype,"scaleSnap");var LI=Object.defineProperty,jI=Object.getOwnPropertyDescriptor,Qp=(n,e,t,s)=>{for(var o=s>1?void 0:s?jI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&LI(e,t,o),o};class Fy{constructor(){a(this,"texture",null),a(this,"rect")}}Qp([m(je)],Fy.prototype,"texture",2);let Ol=class extends oh{constructor(){super(...arguments),a(this,"_sprite"),a(this,"pixelsPerUnitMultiplier",1)}set image(n){this.sprite||(this.sprite=new Fy),this.sprite.texture=n,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(n){this._sprite!==n&&(this._sprite=n,this.onAfterCreated())}isBuiltinSprite(){var n,e,t,s,o,r,l;const c=this.sprite;switch((n=c?.texture)==null?void 0:n.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!((t=(e=c?.texture)==null?void 0:e.name)!=null&&t.length)&&((o=(s=c?.texture)==null?void 0:s.image)==null?void 0:o.width)===32&&((l=(r=c?.texture)==null?void 0:r.image)==null?void 0:l.height)===32}onBeforeCreate(n){var e,t;super.onBeforeCreate(n),this.isBuiltinSprite()&&(n.borderRadius=5/this.pixelsPerUnitMultiplier,((t=(e=this.sprite)==null?void 0:e.texture)==null?void 0:t.name)==="Knob"&&(n.borderRadius=999))}onAfterCreated(){var n;this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture((n=this.sprite)==null?void 0:n.texture))}};Qp([m(Fy)],Ol.prototype,"sprite",1),Qp([m()],Ol.prototype,"pixelsPerUnitMultiplier",2);class Yp extends oh{constructor(){super(...arguments),a(this,"_mainTexture")}get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}Qp([m(je)],Yp.prototype,"mainTexture",1);var DI=Object.defineProperty,BI=Object.getOwnPropertyDescriptor,$i=(n,e,t,s)=>{for(var o=s>1?void 0:s?BI(e,t):e,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=(s?l(e,t,o):l(o))||o);return s&&o&&DI(e,t,o),o};const oa=C("debugbutton");class nr{constructor(){a(this,"colorMultiplier"),a(this,"disabledColor"),a(this,"fadeDuration"),a(this,"highlightedColor"),a(this,"normalColor"),a(this,"pressedColor"),a(this,"selectedColor")}}$i([m()],nr.prototype,"colorMultiplier",2),$i([m(ce)],nr.prototype,"disabledColor",2),$i([m()],nr.prototype,"fadeDuration",2),$i([m(ce)],nr.prototype,"highlightedColor",2),$i([m(ce)],nr.prototype,"normalColor",2),$i([m(ce)],nr.prototype,"pressedColor",2),$i([m(ce)],nr.prototype,"selectedColor",2);class FI{constructor(){a(this,"disabledTrigger"),a(this,"highlightedTrigger"),a(this,"normalTrigger"),a(this,"pressedTrigger"),a(this,"selectedTrigger")}}class to extends I{constructor(){super(...arguments),a(this,"onClick",new xe),a(this,"_isHovered",0),a(this,"colors"),a(this,"transition"),a(this,"animationTriggers"),a(this,"animator"),a(this,"_interactable",!0),a(this,"_requestedAnimatorTrigger"),a(this,"_isInit",!1),a(this,"_image")}click(){var e;(e=this.onClick)==null||e.invoke()}onPointerEnter(e){var t,s;const o=e.event.pointerType==="mouse"&&e.button===0;o&&(this._isHovered+=1),oa&&console.warn("Button Enter",o,this._isHovered,(t=this.animationTriggers)==null?void 0:t.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&((s=this._image)==null||s.setState("hovered")),o&&this.context.input.setCursor("pointer"))}onPointerExit(){var e,t;this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),oa&&console.log("Button Exit",this._isHovered,(e=this.animationTriggers)==null?void 0:e.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&&((t=this._image)==null||t.setState("normal")),this.context.input.unsetCursor("pointer")))}onPointerDown(e){var t,s;oa&&console.log("Button Down",(t=this.animationTriggers)==null?void 0:t.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&((s=this._image)==null||s.setState("pressed")))}onPointerUp(e){var t,s;oa&&console.warn("Button Up",(t=this.animationTriggers)==null?void 0:t.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&&((s=this._image)==null||s.setState(this._isHovered?"hovered":"normal")))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===Md.Mouse)&&(oa&&(console.warn("Button Click",this.onClick),De("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)),q.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}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}set_interactable(e){this.interactable=e}awake(){super.awake(),oa&&console.log(this),this._isInit=!1,this.init()}start(){var e;(e=this._image)==null||e.setInteractable(this.interactable),this.gameObject.getComponentInParent(Va)||this.gameObject.addComponent(wu)}onEnable(){super.onEnable()}onDestroy(){this._isHovered&&this.context.input.unsetCursor("pointer")}*setAnimatorTriggerAtEndOfFrame(e){var t;this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&((t=this.animator)==null||t.setTrigger(e))}init(){this._isInit||(this._isInit=!0,this._image=P.getComponent(this.gameObject,Ol),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){var t,s,o,r,l;e.setInteractable(this.interactable);const c=this.getFinalColor(e.color,(t=this.colors)==null?void 0:t.normalColor),h={state:"normal",attributes:{backgroundColor:c,backgroundOpacity:c.alpha}};e.setupState(h);const d=this.getFinalColor(e.color,(s=this.colors)==null?void 0:s.highlightedColor),u={state:"hovered",attributes:{backgroundColor:d,backgroundOpacity:d.alpha}};e.setupState(u);const p=this.getFinalColor(e.color,(o=this.colors)==null?void 0:o.pressedColor),g={state:"pressed",attributes:{backgroundColor:p,backgroundOpacity:p.alpha}};e.setupState(g);const f=this.getFinalColor(e.color,(r=this.colors)==null?void 0:r.selectedColor),y={state:"selected",attributes:{backgroundColor:f,backgroundOpacity:f.alpha}};e.setupState(y);const v=this.getFinalColor(e.color,(l=this.colors)==null?void 0:l.disabledColor),b={state:"disabled",attributes:{backgroundColor:v,backgroundOpacity:v.alpha}};e.setupState(b)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}$i([m(xe)],to.prototype,"onClick",2),$i([m(nr)],to.prototype,"colors",2),$i([m()],to.prototype,"transition",2),$i([m(FI)],to.prototype,"animationTriggers",2),$i([m(Ot)],to.prototype,"animator",2),$i([m()],to.prototype,"interactable",1);var UI=Object.defineProperty,Kp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&UI(e,t,o),o};const or=C("debuginputfield");var K;const Ah=(K=class extends I{constructor(){super(...arguments),a(this,"textComponent"),a(this,"placeholder"),a(this,"onValueChanged"),a(this,"onEndEdit"),a(this,"inputEventFn"),a(this,"_iosEventFn")}get text(){var n;return((n=this.textComponent)==null?void 0:n.text)??""}set text(n){this.textComponent&&(this.textComponent.text=n,this.placeholder&&(n.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return K.active===this}start(){or&&console.log(this.name,this)}onEnable(){var n;K.htmlField||(K.htmlField=document.createElement("input"),K.htmlField.style.width="0px",K.htmlField.style.height="0px",K.htmlField.style.padding="0px",K.htmlField.style.border="none",K.htmlField.style.overflow="hidden",K.htmlField.style.caretColor="transparent",K.htmlField.style.outline="none",K.htmlField.classList.add("ar"),K.htmlField.onfocus=()=>K.htmlFieldFocused=!0,K.htmlField.onblur=()=>K.htmlFieldFocused=!1,document.body.append(K.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),K.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&(n=this.textComponent)!=null&&n.text.length&&P.setActive(this.placeholder.gameObject,!1),Y.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){var n;(n=K.htmlField)==null||n.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){K.active===this&&K.htmlField?(K.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&P.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(n){n.event.pointerType==="mouse"&&n.button===0&&this.context.input.setCursor("text")}onPointerExit(n){this.context.input.unsetCursor("text")}onPointerClick(n){or&&console.log("CLICK",n,K.active),K.activeTime=this.context.time.time,K.active!==this&&this.startCoroutine(this.activeLoop(),Oe.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();K.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-K.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){var n,e,t,s;if(K.active!==this&&(or&&console.log("Select",this.name,this,K.htmlField,this.context.isInXR,this.context.arOverlayElement,(n=this.textComponent)==null?void 0:n.text,(e=K.htmlField)==null?void 0:e.value),(t=K.active)==null||t.onDeselected(),K.active=this,this.placeholder&&P.setActive(this.placeholder.gameObject,!1),K.htmlField)){if(K.htmlField.value=((s=this.textComponent)==null?void 0:s.text)||"",or&&console.log("set input field value",K.htmlField.value),this.context.isInXR){const o=this.context.arOverlayElement;o&&o.append(K.htmlField)}this.selectInputField()}}onDeselected(){var n;K.active===this&&(K.active=null,or&&console.log("Deselect",this.name,this),K.htmlField&&(K.htmlField.blur(),document.body.append(K.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&P.setActive(this.placeholder.gameObject,!0),K.htmlField&&((n=this.onEndEdit)==null||n.invoke(K.htmlField.value)))}update(){var n;K.active===this&&((n=this.textComponent)==null||n.markDirty())}onInput(n){var e,t;if(K.active===this){if(or&&console.log(n.code,n,(e=K.htmlField)==null?void 0:e.value,(t=this.textComponent)==null?void 0:t.text),n.code==="Escape"||n.code==="Enter"){this.onDeselected();return}K.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&P.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){var n;if(this.textComponent&&K.htmlField){const e=this.textComponent.text,t=K.htmlField.value,s=this.textComponent.text!==K.htmlField.value;this.textComponent.text=K.htmlField.value,s&&(or&&console.log("[InputField] value changed:",t,e),(n=this.onValueChanged)==null||n.invoke(t,e))}}selectInputField(){K.htmlField&&(or&&console.log("Focus Inputfield",K.htmlFieldFocused),K.htmlField.setSelectionRange(K.htmlField.value.length,K.htmlField.value.length),Y.isiOS()?K.htmlField.focus({preventScroll:!0}):setTimeout(()=>{var n;return(n=K.htmlField)==null?void 0:n.focus()},1))}processInputOniOS(){const n=this.context.physics.raycast();if(!n.length)return;const e=n[0].object,t=Rf(e);(t?.gameObject===this.gameObject||t?.gameObject.parent===this.gameObject)&&this.selectInputField()}},a(K,"active",null),a(K,"activeTime",-1),a(K,"htmlField",null),a(K,"htmlFieldFocused",!1),K);Kp([m(Ft)],Ah.prototype,"textComponent"),Kp([m(Ft)],Ah.prototype,"placeholder"),Kp([m(xe)],Ah.prototype,"onValueChanged"),Kp([m(xe)],Ah.prototype,"onEndEdit");let Uy=Ah;var zI=Object.defineProperty,CS=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&zI(e,t,o),o};class Ih extends I{constructor(){super(...arguments),a(this,"id",null),a(this,"keepAspect",!1),a(this,"_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 tO;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const s=new iO(e);t.add(s),s.visible=!1;const o=s.material;o.transparent=!0,setTimeout(()=>{s.visible=!0;const r=wd(this.gameObject).clone();Ql(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const l=new _i;l.setFromObject(t),this.setWorldRotation(r.x,r.y,r.z);const c=l.max.x-l.min.x,h=l.max.y-l.min.y;if(this.keepAspect){const u=c/h;c>h?s.scale.set(1/c,1/h/u,1):s.scale.set(1/c*u,1/h,1)}else s.scale.set(1/c,1/h,1);const d=this.gameObject.scale;s.scale.multiply(d)},1)}onDisable(){var e;(e=this._object)==null||e.removeFromParent()}}CS([m()],Ih.prototype,"id"),CS([m()],Ih.prototype,"keepAspect");/* @license
1351
- * Copyright 2021 Google LLC. All Rights Reserved.
1352
- * Licensed under the Apache License, Version 2.0 (the 'License');
1353
- * you may not use this file except in compliance with the License.
1354
- * You may obtain a copy of the License at
1355
- *
1356
- * http://www.apache.org/licenses/LICENSE-2.0
1357
- *
1358
- * Unless required by applicable law or agreed to in writing, software
1359
- * distributed under the License is distributed on an 'AS IS' BASIS,
1360
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361
- * See the License for the specific language governing permissions and
1362
- * limitations under the License.
1363
- */const NI={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]}]},WI={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 Zp extends bi{constructor(e){super(),this.position.y=-3.5;const t=new ga;t.deleteAttribute("uv");const s=new ft({metalness:0,side:cd}),o=new ft({metalness:0}),r=e=="legacy"?NI:WI,l=new vm(16777215,r.topLight.intensity,28,2);l.position.set(...r.topLight.position),this.add(l);const c=new X(t,s);c.position.set(...r.room.position),c.scale.set(...r.room.scale),this.add(c);for(const h of r.boxes){const d=new X(t,o);d.position.set(...h.position),d.rotation.set(0,h.rotation,0),d.scale.set(...h.scale),this.add(d)}for(const h of r.lights){const d=new X(t,this.createAreaLightMaterial(h.intensity));d.position.set(...h.position),d.scale.set(...h.scale),this.add(d)}}createAreaLightMaterial(e){const t=new Me;return t.color.setScalar(e),t}}var VI=Object.defineProperty,Jp=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&VI(e,t,o),o},em;const Lh=(em=class extends I{constructor(){super(...arguments),a(this,"target"),a(this,"invertForward",!1),a(this,"keepUpDirection",!0),a(this,"copyTargetRotation",!1)}onBeforeRender(){let n=this.target;if(n||(n=this.context.mainCamera),!n)return;let e=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(e=!1),Xl(this.gameObject,n,this.keepUpDirection,e),this.invertForward&&this.gameObject.quaternion.multiply(em.flipYQuat)}createBehaviours(n,e,t){if(e.uuid===this.gameObject.uuid){let s=e;if(this.keepUpDirection){const r=di.createEmptyParent(e);s=r;const l=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new se().makeRotationZ(Math.PI/2*l))),e.setMatrix(e.getMatrix().multiply(new se().makeRotationZ(-Math.PI/2*l)))}const o=new Yt("lookat "+this.name,Rt.sceneStartTrigger(),ve.lookAtCameraAction(s,void 0,this.invertForward?ds.back:ds.forward,this.keepUpDirection?ds.up:ds.zero));n.addBehavior(o)}}},a(em,"flipYQuat",new H().setFromAxisAngle(new S(0,1,0),Math.PI)),em);Jp([m(A)],Lh.prototype,"target"),Jp([m()],Lh.prototype,"invertForward"),Jp([m()],Lh.prototype,"keepUpDirection"),Jp([m()],Lh.prototype,"copyTargetRotation");let zy=Lh;var HI=Object.defineProperty,Ny=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&HI(e,t,o),o};class kl extends I{constructor(){super(...arguments),a(this,"url"),a(this,"mode",0),a(this,"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),F()&&De("Open URL: "+e),this.mode){case 0:Y.isSafari(),globalThis.open(e,"_blank");break;case 1:Y.isSafari()&&Y.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:Y.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(Ai)||this.gameObject.addComponent(Ai)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){var t;this.clickable&&!e.used&&(t=this.url)!=null&&t.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(F()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}Ny([m()],kl.prototype,"url"),Ny([m()],kl.prototype,"mode"),Ny([m()],kl.prototype,"clickable");var $I=Object.defineProperty,Ml=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&$I(e,t,o),o};class io extends I{constructor(){super(...arguments),a(this,"side","none"),a(this,"controller",!0),a(this,"hands",!1),a(this,"controlVisibility",!0),a(this,"useGripSpace",!1),a(this,"resetTransformAfterXRSession",!0),a(this,"_startPosition",new S),a(this,"_startRotation",new H),a(this,"_startScale",new S)}get activeAndEnabled(){return!0}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=Q(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=Q(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([m()],io.prototype,"side"),Ml([m()],io.prototype,"controller"),Ml([m()],io.prototype,"hands"),Ml([m()],io.prototype,"controlVisibility"),Ml([m()],io.prototype,"useGripSpace"),Ml([m()],io.prototype,"resetTransformAfterXRSession");function PS(n,e){const t=n.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const s=t.session.enabledFeatures;if(s&&!s.some(r=>r==="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.
1364
-
1365
- Example to request camera-access in global scope:
1366
- NeedleXRSession.onSessionRequestStart(evt => {
1367
- evt.init.optionalFeatures = evt.init.optionalFeatures || [];
1368
- evt.init.optionalFeatures.push('camera-access');
1369
- });
1370
- `),F()&&Zl("No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene"),!1;const o=t.getViewerPose(n.xr.getReferenceSpace());if(o)for(const r of o.views)if("camera"in r&&r.camera){let l=n.xr.getBinding();if(l||(l=new XRWebGLBinding(t.session,n.getContext())),l){let c=null;if("getCameraImage"in l){GI(n,e);const h=n.properties.get(e);if(h)return c=l.getCameraImage(r.camera),h.__webglTexture=c,!0;console.warn("No texture properties found for target texture")}}else console.error(r.camera,n.xr)}else console.error("NO CAMERA IN VIEW");else console.error(n.xr.getReferenceSpace(),t);return!1}const OS=new WeakMap;function GI(n,e){const t=OS.get(e)||new WeakSet;if(t.has(n))return;t.add(n),OS.set(e,t),console.debug("Initialize texture for camera feed");const s=new Me,o=new zs,r=new bi;r.add(new X(o,s));const l=new we;s.map=e,n.render(r,l)}function qI(n,e,t,s="image/webp",o){return Wy({context:n,width:e,height:t,mimeType:s,camera:o})}function Wy(n){var e,t;n||(n={});const{transparent:s=!1}=n;let{mimeType:o,context:r,width:l,height:c,camera:h}=n;if(!r&&(r=pe.Current,!r))return console.error("Can not save screenshot: No needle-engine context found or provided."),null;if(!h&&(h=r.mainCamera,!h))return console.error("No camera found"),null;const d=r.renderer,u=d.xr.enabled&&d.xr.isPresenting;if(u&&r.currentFrameEvent!=Oe.EarlyUpdate)return console.warn("Screenshot: defer to access XR frame"),new Promise(L=>{An(B=>{const z=Wy(n);L(z)},Oe.EarlyUpdate,{once:!0})});const p=d.domElement,g=p.width,f=p.height;l||(l=g),c||(c=f);const y=l,v=c,b=window.devicePixelRatio||1;l/=b,c/=b,d.xr.isPresenting&&d.xr.getFrame();const _=d.xr.enabled;d.xr.enabled=!1,d.xr.isPresenting=!1,p.style.width=`${l}px`,p.style.height=`${c}px`;const w=d.getRenderTarget(),x=d.getClearColor(new ae),M=d.getClearAlpha(),k=r.scene.background,T="aspect"in h?h.aspect:null;try{const L=n.render_events!==!1,B=new Array;L&&(ja(r.scene,Di,B),B.forEach(E=>{var U;if(E?.onBeforeRender(),E.isInstancingActive&&E.instances)for(let $=0;$<((U=E.instances)==null?void 0:U.length);$++){const te=E.instances[$];Ln(te.object,!0)}})),s&&(r.scene.background=null,d.setClearColor(0,0)),n.background&&(r.scene.background=null,d.setClearColor(n.background),n.background instanceof ce&&d.setClearAlpha(n.background.a)),s&&d.setClearAlpha(0),d.setSize(l,c,!1),"cam"in h&&(h=h.threeCamera),h instanceof we&&(h.aspect=l/c,h.updateProjectionMatrix());const z="type"in n&&n.type==="texture";let j=null;z&&(j=new Pn(l,c,{wrapS:Tv,wrapT:Tv,format:1023}),d.setRenderTarget(j));let V=p;if(u?(j&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),V=Dh.compositeWithCameraImage({width:y,height:v,scene:r.scene,camera:h,renderer:d})):r.renderNow(h||null),h instanceof we&&T!=null&&(h.aspect=T,h.updateProjectionMatrix()),L&&B.forEach(E=>E.onAfterRender()),!o&&"download_filename"in n&&n.download_filename)switch((e=n.download_filename.split(".").pop())==null?void 0:e.toLowerCase()){case"png":o="image/png";break;case"jpg":case"jpeg":o="image/jpeg";break;case"webp":o="image/webp";break}if(s&&n.trim===!0){const E=XI(V);E&&(V=E)}if("type"in n){if(n.type==="texture")return j?(n.target&&(n.target.image=j?.texture.image,n.target.needsUpdate=!0),j.texture.offset.set(0,-1),j.texture.needsUpdate=!0,j.texture):(console.error("No target texture found"),null);if(n.type==="blob")return new Promise((E,U)=>{V.toBlob($=>{E($)},o)});if(n.type==="share")return new Promise((E,U)=>{V.toBlob($=>{if($&&"share"in navigator){let te="file_type"in n&&n.file_type||o;o||(te="image/png");const oe=te?.split("/")[1]||"png",ue=new File([$],"filename"in n?n.filename||`screenshot.${oe}`:`screenshot.${oe}`,{type:te});return navigator.share({title:"title"in n?n.title:void 0,text:"text"in n?n.text:void 0,url:"url"in n?n.url:void 0,files:[ue]}).catch(ge=>{console.warn("User cancelled share",ge.message)}).finally(()=>{E({blob:$,shared:!0})})}return{blob:$,shared:!1}},o)})}const G=V.toDataURL(o);if("download_filename"in n&&n.download_filename){let E=n.download_filename;if(Y.isMobileDevice()&&typeof window<"u"){const U=E+"_screenshots",$=E.split("."),te=(t=$.pop())==null?void 0:t.toLowerCase();let oe=0;localStorage.getItem(U)&&(oe=parseInt(sessionStorage.getItem(U)||"0")),oe>0&&(E=`${$.join()}-${oe}.${te}`),oe+=1,sessionStorage.setItem(U,oe.toString())}kS(G,E)}return G}finally{d.setRenderTarget(w),r.scene.background=k,d.setSize(g,f,!1),d.setClearColor(x,M),T!=null&&h instanceof we&&(h.aspect=T,h.updateProjectionMatrix()),d.xr.enabled=_,d.xr.isPresenting=u,u||r.updateSize(!0)}return null}function XI(n){if(!("document"in globalThis))return null;const e=document.createElement("canvas");e.width=n.width,e.height=n.height;const t=e.getContext("2d");if(!t)return null;t.drawImage(n,0,0);const s=e.width,o=e.height,r=t.getImageData(0,0,s,o).data;let l=o,c=s,h=0,d=0;for(let y=0;y<o;y++)for(let v=0;v<s;v++){const b=(y*s+v)*4;r[b+3]!==0&&(v<c&&(c=v),v>d&&(d=v),y<l&&(l=y),y>h&&(h=y))}const u=d-c+1,p=h-l+1,g=document.createElement("canvas"),f=g.getContext("2d");return f?(g.width=u,g.height=p,f.drawImage(e,c,l,u,p,0,0,u,p),g):null}let jh=null;function kS(n,e){if(n){if(!n.startsWith("data:image")){console.error("Can not save image: Data url is not an image",n);return}jh||(jh=document.createElement("a")),jh.href=n,jh.download=e,jh.click()}}var Dh;(n=>{let e=null,t=null,s=null,o=null,r=null;function l(d){const{renderer:u,width:p,height:g}=d,f=u.xr.enabled,y=u.getRenderTarget(),v=u.autoClear,b=p,_=g,w=p/g;(!s||s.width!==b||s.height!==_)&&(s??(s=new Pn(b,_,{colorSpace:Cn})),s.width=b,s.height=_,s.samples=4,s.texture.repeat.y=-1,s.texture.offset.y=1),(!r||r.width!==b||r.height!==_)&&(r=document.createElement("canvas"),r.width=b,r.height=_,r.style.position="fixed",r.style.top="0px",r.style.right="0px",r.style.width="300px",r.style.height=`${300/w}px`,r.style.zIndex="1000",r.style.pointerEvents="none",r.style.opacity="1.0",r.style.willChange="contents"),e||(e=h({defines:{DECODE_VIDEO_TEXTURE:!0}})),t||(t=h()),o||(o=new je),u.xr.updateCamera(d.camera),u.xr.enabled=!1,u.autoClear=!1,u.clear(),u.setSize(b,_),u.setRenderTarget(s),PS(d.renderer,o)||console.error("Could not update texture from XR frame");const x=P.findObjectOfType(Bh);return x?x.setTexture(o):(e.setTexture(o),u.render(e,d.camera)),u.clearDepth(),u.setSize(b,_),u.render(d.scene,d.camera),u.setRenderTarget(null),t.setTexture(s.texture),u.render(t,d.camera),r.getContext("2d",{alpha:!1}).drawImage(u.domElement,0,0,r.width,r.height),u.setRenderTarget(y),u.xr.enabled=f,u.autoClear=v,r}n.compositeWithCameraImage=l;const c=`
1371
- uniform sampler2D t2D;
1372
- varying vec2 vUv;
1373
-
1374
- void main() {
1375
-
1376
- vec4 texColor = texture2D( t2D, vUv );
1377
-
1378
- #ifdef DECODE_VIDEO_TEXTURE
1379
-
1380
- // inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
1381
- 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 );
1382
-
1383
- #endif
1384
-
1385
- gl_FragColor = texColor;
1386
- #include <tonemapping_fragment>
1387
- #include <colorspace_fragment>
1388
- }
1389
- `;function h(d){const u=d?.material||new gs({name:"BackgroundMaterial",uniforms:Rv.clone(ud.background.uniforms),vertexShader:ud.background.vertexShader,fragmentShader:c,defines:d?.defines,side:po,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(u,"map",{get:function(){return this.threeTexture}});const p=new X(new zs(2,2),u);return bd(p,!1),p.geometry.deleteAttribute("normal"),p.renderOrder=-1e6,p.setTexture=function(g){u.uniforms.t2D.value=g},p}n.makeFullscreenPlane=h})(Dh||(Dh={}));var QI=Object.defineProperty,YI=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&QI(e,t,o),o};const MS=C("debugarcamera");class Bh extends I{constructor(){super(...arguments),a(this,"backgroundTint",new ce(1,1,1,1)),a(this,"backgroundPlane"),a(this,"threeTexture"),a(this,"forceTextureInitialization",function(){const e=new Me,t=new zs,s=new bi;s.add(new X(t,e));const o=new we;return function(r,l){e.map=l,r.render(s,o),MS&&console.warn("Force texture initialization")}}()),a(this,"preRender",()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new je,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=Dh.makeFullscreenPlane({material:new gs({name:"BackgroundMaterial",uniforms:{...Rv.clone(ud.background.uniforms),tint:{value:new ye(e.r,e.g,e.b,e.a)}},vertexShader:ud.background.vertexShader,fragmentShader:KI,side:xi,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof gs&&this.backgroundPlane.material.uniforms.tint.value.set(this.backgroundTint.r,this.backgroundTint.g,this.backgroundTint.b,this.backgroundTint.a),this.updateFromFrame()}})}onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),MS&&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)}get background(){return this.backgroundPlane}onBeforeRender(e){this.updateFromFrame()}updateFromFrame(){var e;this.threeTexture&&((e=this.context.xr)==null?void 0:e.mode)==="immersive-ar"&&(PS(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)}}YI([m(ce)],Bh.prototype,"backgroundTint");const KI=`
1390
- uniform sampler2D t2D;
1391
- uniform vec4 tint;
1392
-
1393
- varying vec2 vUv;
1394
-
1395
- void main() {
1396
-
1397
- vec4 texColor = texture2D( t2D, vUv );
1398
- texColor.w = 1.0;
1399
-
1400
- // inline sRGB decode
1401
- 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 );
1402
-
1403
- gl_FragColor = texColor * tint;
1404
-
1405
- #include <tonemapping_fragment>
1406
- #include <colorspace_fragment>
1407
- }
1408
- `;var ZI=Object.defineProperty,rr=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&ZI(e,t,o),o};const RS=C("debugimagetracking"),Vy=class pv{constructor(e,t,s,o,r,l){a(this,"measuredSize"),a(this,"state"),a(this,"_position"),a(this,"_rotation"),a(this,"_trackingComponent"),a(this,"_trackedImage"),a(this,"_bitmap"),a(this,"_pose"),this._trackingComponent=e,this._trackedImage=t,this._bitmap=s,this.measuredSize=o,this.state=r,this._pose=l}get url(){return this._trackedImage.image??""}get widthInMeters(){return this._trackedImage.widthInMeters??void 0}get bitmap(){return this._bitmap}get model(){return this._trackedImage}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 s=e.position.distanceToSquared(this._position)/.05+e.quaternion.angleTo(this._rotation)/.05;t&&(t*=Math.max(1,s)),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))}ensureTransformData(){if(!this._position){this._position=pv._positionBuffer.get(),this._rotation=pv._rotationBuffer.get();const e=this._pose.transform,t=ne.active.convertSpace(e);this._position.copy(t?.position),this._rotation.copy(t?.quaternion)}}};a(Vy,"_positionBuffer",new Si(()=>new S,20)),a(Vy,"_rotationBuffer",new Si(()=>new H,20));let Hy=Vy;class so{constructor(){a(this,"image"),a(this,"widthInMeters",.25),a(this,"object"),a(this,"createObjectInstance",!1),a(this,"imageDoesNotMove",!1),a(this,"hideWhenTrackingIsLost",!0)}}rr([m(URL)],so.prototype,"image"),rr([m()],so.prototype,"widthInMeters"),rr([m(le)],so.prototype,"object"),rr([m()],so.prototype,"createObjectInstance"),rr([m()],so.prototype,"imageDoesNotMove"),rr([m()],so.prototype,"hideWhenTrackingIsLost");class JI{constructor(e,t,s){a(this,"filename"),a(this,"widthInMeters"),a(this,"imageData"),this.filename=e,this.imageData=t,this.widthInMeters=s}get extensionName(){return"image-tracking"}onAfterHierarchy(e,t){const s=Y.getiOSVersion(),o=(s?parseInt(s.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.widthInMeters*o).toFixed(8)),t.closeBlock()}onBeforeBuildDocument(e){const t=P.findObjectOfType(Fh);!t||!t.trackedImages||t.trackedImages.length>1&&(F()&&be("USDZ: Only one tracked image is supported."),console.warn("USDZ: Only one tracked image is supported."))}onAfterSerialize(e){e.files["image_tracking/"+this.filename]=this.imageData}onExportObject(e,t,s){var o;const r=P.findObjectOfType(Fh);if(!(!r||!r.trackedImages)){for(const l of r.trackedImages)if(((o=l.object)==null?void 0:o.asset)===e){const c=P.findObjectOfType(dn);if(!c)continue;const{scale:h,target:d}=c.getARScaleAndTarget();let u=e;const p=new se;if(e!==d)for(;u.parent&&u.parent!==d;)u=u.parent,p.premultiply(u.matrix);const g=p.clone().invert();t.setMatrix(g.scale(new S(h,h,h)));break}}}}var ra;const $y=(ra=class extends I{constructor(){super(...arguments),a(this,"trackedImages"),a(this,"smooth",!0),a(this,"trackedImageIndexMap",new Map),a(this,"_supported",!0),a(this,"imageToObjectMap",new Map),a(this,"currentImages",[]),a(this,"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.`),a(this,"onImageTrackingUpdate",n=>{const e=ne.active;if(e)for(const t of n){const s=t.model,o=t.state==="tracked";if(!s.object)continue;let r=this.imageToObjectMap.get(s);if(r===void 0)r={object:null,frames:0,lastTrackingTime:Date.now()},this.imageToObjectMap.set(s,r),s.object.loadAssetAsync().then(l=>{if(s.createObjectInstance&&l&&(l=P.instantiate(l)),l){r.object=l;for(const c of l.getComponentsInChildren(Di))c.setInstancingEnabled(!1);e.rig?(e.rig.gameObject.add(l),t.applyToObject(l),l.activeSelf||P.setActive(l,!0)):console.warn("XRImageTracking: missing XRRig")}});else{if(r.frames++,o&&(r.lastTrackingTime=Date.now()),s.imageDoesNotMove&&r.frames>10||!r.object)continue;e.rig&&(e.rig.gameObject.add(r.object),t.applyToObject(r.object,this.smooth?this.context.time.deltaTimeUnscaled*3:void 0),r.object.activeSelf||P.setActive(r.object,!0))}}})}get supported(){return this._supported}awake(){if(RS&&console.log(this),!!this.trackedImages){for(const n of this.trackedImages)if(n.image&&!ra._imageElements.has(n.image)){const e=n.image;ra._imageElements.set(e,null);const t=document.createElement("img");t.src=e,t.addEventListener("load",async()=>{const s=await createImageBitmap(t);ra._imageElements.set(e,s);const o=await y1(s);if(o){const r=await(await o.convertToBlob({type:"image/png"})).arrayBuffer(),l=P.findObjectOfType(dn);l&&this.trackedImages&&(l.extensions.push(new JI("marker.png",new Uint8Array(r),this.trackedImages[0].widthInMeters)),l.anchoringType="image")}})}}}onBeforeXR(n,e){var t;if(this.trackedImages){e.optionalFeatures=e.optionalFeatures||[],e.optionalFeatures.includes("image-tracking")||e.optionalFeatures.push("image-tracking"),e.trackedImages=[];for(const s of this.trackedImages)if((t=s.image)!=null&&t.length&&s.widthInMeters>0){const o=ra._imageElements.get(s.image);o&&(this.trackedImageIndexMap.set(e.trackedImages.length,s),e.trackedImages.push({image:o,widthInMeters:s.widthInMeters}))}}}onEnterXR(n){var e;if(this.trackedImages){for(const t of this.trackedImages)if((e=t.object)!=null&&e.asset){const s=t.object.asset;s.userData||(s.userData={});const o={visible:s.visible,parent:s.parent,matrix:s.matrix.clone()};s.userData["image-tracking"]=o}}for(const t of this.imageToObjectMap.values())t.frames=0}onLeaveXR(n){var e,t;if(!this.supported&&Y.isAndroidDevice()&&be(this.webXRIncubationsWarning),this.trackedImages){for(const s of this.trackedImages)if((e=s.object)!=null&&e.asset){const o=s.object.asset;if(o.userData){const r=o.userData["image-tracking"];r&&(o.visible=r.visible,(t=r.parent)==null||t.add(o),o.matrix.copy(r.matrix),o.matrix.decompose(o.position,o.quaternion,o.scale)),delete o.userData["image-tracking"]}}}}onUpdateXR(n){var e;this.currentImages.length=0;const t=n.xr.frame;if(!t)return;if("getImageTrackingResults"in t){if(((e=n.xr.session.enabledFeatures)==null?void 0:e.includes("image-tracking"))===!1)return;if(t.session&&typeof t.getImageTrackingResults=="function"){const o=t.getImageTrackingResults();if(o.length>0){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const l of o){const c=l.trackingState,h=l.index,d=this.trackedImageIndexMap.get(h);if(d){const u=t.getPose(l.imageSpace,r),p=new Hy(this,d,l.image,l.measuredSize,c,u);this.currentImages.push(p)}else RS&&console.warn("No tracked image for index",h)}if(this.currentImages.length>0)try{this.dispatchEvent(new CustomEvent("image-tracking",{detail:this.currentImages})),this.onImageTrackingUpdate(this.currentImages)}catch(l){console.error(l)}}}}}else{this.didPrintWarning||(this.didPrintWarning=!0,console.log(this.webXRIncubationsWarning)),this._supported=!1,be(this.webXRIncubationsWarning);return}const s=1e3;for(const[o,r]of this.imageToObjectMap){if(!r.object||!o||o.hideWhenTrackingIsLost===!1)continue;let l=!1;for(const c of this.currentImages)if(c.model===o){const h=Date.now()-r.lastTrackingTime;if(o.imageDoesNotMove||c.state==="tracked"||h<=s){l=!0;break}}l||P.setActive(r.object,!1)}}},a(ra,"_imageElements",new Map),ra);rr([m(so)],$y.prototype,"trackedImages"),rr([m()],$y.prototype,"smooth");let Fh=$y;var eL=Object.defineProperty,Rl=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&eL(e,t,o),o};const aa=C("debugplanetracking");class no extends I{constructor(){super(...arguments),a(this,"dataTemplate"),a(this,"occluder",!0),a(this,"initiateRoomCaptureIfNoData",!0),a(this,"usePlaneData",!0),a(this,"useMeshData",!0),a(this,"runInVR",!0),a(this,"bounds",new _i),a(this,"center",new S),a(this,"labelOffset",new S),a(this,"_dataId",1),a(this,"_allPlanes",new Map),a(this,"_allMeshes",new Map),a(this,"firstTimeNoPlanesDetected",-100),a(this,"makeOccluder",(e,t,s=!1)=>{if(t){if(t instanceof Array){for(const o of t)this.makeOccluder(e,o,s);return}!s&&!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)}}),a(this,"_flipForwardMatrix",new se().makeRotationY(Math.PI)),a(this,"_verticesCache",new Map)}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 s=e.xr.frame;if(!this.context.renderer.xr.getReferenceSpace())return;const o=s.detectedPlanes,r=s.detectedMeshes,l=o!==void 0&&o.size>0,c=r!==void 0&&r.size>0;if(this.initiateRoomCaptureIfNoData&&(!l&&!c&&this.firstTimeNoPlanesDetected<-10&&(this.firstTimeNoPlanesDetected=Date.now()),(l||c)&&(this.firstTimeNoPlanesDetected=-1),this.firstTimeNoPlanesDetected>0&&Date.now()-this.firstTimeNoPlanesDetected>2500&&"initiateRoomCapture"in s.session&&(s.session.initiateRoomCapture(),this.firstTimeNoPlanesDetected=-1)),o!==void 0&&this.processFrameData(e.xr,t.gameObject,s,o,this._allPlanes),r!==void 0&&this.processFrameData(e.xr,t.gameObject,s,r,this._allMeshes),aa){const h=this.context.mainCameraComponent.gameObject.worldPosition;for(const d of this._allPlanes.values())!d.mesh||!d.mesh.visible||(this.bounds.makeEmpty(),d.mesh.traverse(u=>{u instanceof X&&this.bounds.expandByObject(u)}),this.bounds.getCenter(this.center),this.labelOffset.copy(h).sub(this.center).normalize().multiplyScalar(.1),q.DrawLabel(this.center.add(this.labelOffset),(d.xrData.semanticLabel||"plane").toUpperCase()+`
1409
- `+d.xrData.lastChangedTime.toFixed(2),.02))}}removeData(e,t){const s=t.get(e);if(!s)return;t.delete(e),aa&&console.log("Plane no longer tracked, id="+s.id),s.mesh&&(s.mesh.removeFromParent(),s.mesh.traverse(r=>{const l=r.userData.normalsHelper;l?(l.dispose(),l.removeFromParent()):aa&&console.warn("No normals helper found for mesh",s.mesh)}),Ri(s.mesh,!0,!0));const o=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:s}});this.dispatchEvent(o)}processFrameData(e,t,s,o,r){const l=this.context.renderer.xr.getReferenceSpace();if(l){for(const c of r.keys())o.has(c)||this.removeData(c,r);for(const c of o){const h="planeSpace"in c?c.planeSpace:"meshSpace"in c?c.meshSpace:void 0;if(!h)continue;const d=s.getPose(h,l);let u;if(r.has(c)){const p=r.get(c);if(u=p.mesh,p.timestamp<c.lastChangedTime){if(p.timestamp=c.lastChangedTime,p.mesh){const f=this.createGeometry(c);if(p.mesh instanceof X)p.mesh.geometry.dispose(),p.mesh.geometry=f,this.makeOccluder(p.mesh,p.mesh.material);else if(p.mesh instanceof ho)for(const y of p.mesh.children)y instanceof X&&(y.geometry.dispose(),y.geometry=f,this.makeOccluder(y,y.material));if(p.collider){const y=p.mesh;p.collider.sharedMesh=y,p.collider.convex=this.checkIfContextShouldBeConvex(y,p.xrData),p.collider.onDisable(),p.collider.onEnable()}aa&&(console.log("Plane updated, id="+p.id,p),p.mesh.traverse(y=>{if(!(y instanceof X))return;const v=y.userData.normalsHelper;v&&v.update()}))}const g=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:p}});this.dispatchEvent(g)}}else{if(!this.dataTemplate){const p=new X;aa?p.material=new AP:this.occluder?(p.material=new Me,this.makeOccluder(p,p.material,!0)):p.material=new Me({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new le("","",p)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const p=P.instantiate(this.dataTemplate.asset);if(p.name="xr-tracked-plane",u=p,ig(p,!1),p instanceof X)Te(p.geometry),p.geometry=this.createGeometry(c),this.makeOccluder(p,p.material,this.occluder&&!this.dataTemplate);else if(p instanceof ho)for(const y of p.children)y instanceof X&&(Te(y.geometry),y.geometry=this.createGeometry(c),this.makeOccluder(y,y.material,this.occluder&&!this.dataTemplate));const g=p.getComponent(jo);if(g){const y=p;g.sharedMesh=y,g.convex=this.checkIfContextShouldBeConvex(y,c),g.onDisable(),g.onEnable()}p.matrixAutoUpdate=!1,p.matrixWorldNeedsUpdate=!0,t.add(p);const f={id:this._dataId++,xrData:c,timestamp:c.lastChangedTime,mesh:p,collider:g};r.set(c,f),aa&&console.log("New plane detected, id="+f.id,f,{hasCollider:!!g,isGroup:p instanceof ho});try{const y=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:f}});this.dispatchEvent(y)}catch(y){console.error(y)}}}u&&(d?(u.visible=!0,u.matrix.fromArray(d.transform.matrix),u.matrix.premultiply(this._flipForwardMatrix)):u.visible=!1,aa&&u.traverse(p=>{if(p instanceof X)if(p.userData.normalsHelper)p.userData.normalsHelper.update();else{const g=new sO(p,.05,255);g.layers.disableAll(),g.layers.set(2),this.context.scene.add(g),p.userData.normalsHelper=g}}))}}}checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const s=new _i;s.expandByObject(e);const o=new S;s.getSize(o);let r=!0;return o.x>2&&o.y>2&&o.z>1.5&&(r=!1),r&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(r=!0),r}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 Ns}createMeshGeometry(e,t){const s=e.toString()+"_"+t.toString();if(this._verticesCache.has(s))return this._verticesCache.get(s);const o=new Ns;o.setIndex(new yt(t,1)),o.setAttribute("position",new yt(e,3));const r=Array();for(let l=0;l<e.length;l+=3)r.push(e[l],e[l+2]);return o.setAttribute("uv",new yt(e,3)),o.computeVertexNormals(),this._verticesCache.set(s,o),o}createPlaneGeometry(e){const t=new Ns,s=[],o=[];e.forEach(g=>{s.push(g.x,g.y,g.z),o.push(g.x,g.z)});const r=new S(s[0],s[1],s[2]),l=new S(s[3],s[4],s[5]),c=new S(s[6],s[7],s[8]),h=new S,d=new S;h.subVectors(l,r),d.subVectors(c,r),h.cross(d),h.normalize();const u=[];for(let g=0;g<s.length/3;g++)u.push(h.x,h.y,h.z);const p=[];for(let g=2;g<e.length;++g)p.push(0,g-1,g);return t.setAttribute("position",new yt(new Float32Array(s),3)),t.setAttribute("uv",new yt(new Float32Array(o),2)),t.setAttribute("normal",new yt(new Float32Array(u),3)),t.setIndex(p),t.computeBoundingBox(),t.computeBoundingSphere(),t}}Rl([m(le)],no.prototype,"dataTemplate"),Rl([m()],no.prototype,"occluder"),Rl([m()],no.prototype,"initiateRoomCaptureIfNoData"),Rl([m()],no.prototype,"usePlaneData"),Rl([m()],no.prototype,"useMeshData"),Rl([m()],no.prototype,"runInVR");var tL=Object.defineProperty,iL=(n,e,t,s)=>{for(var o=void 0,r=n.length-1,l;r>=0;r--)(l=n[r])&&(o=l(e,t,o)||o);return o&&tL(e,t,o),o};const TS=C("debugwebxr");class tm extends I{constructor(){super(...arguments),a(this,"priority",0),a(this,"_startScale")}get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){var e;(e=ne.active)==null||e.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(TS){const e=new A;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(Xr);t&&(t.isGizmo=!1);const s=new wi(.5);this.gameObject.add(s)}}isXRRig(){return!0}supportsXR(e){return!0}onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),TS&&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)}}iL([m()],tm.prototype,"priority");class sL extends I{constructor(){super(...arguments),a(this,"toggleKey","KeyP")}update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}R.add("AlignmentConstraint",Oc),R.add("Animation",jt),R.add("Animator",Ot),R.add("AudioListener",Bn),R.add("AudioSource",ts),R.add("Avatar_Brain_LookAt",jc),R.add("Avatar_MouthShapes",Dc),R.add("Avatar_MustacheShake",Df),R.add("AvatarBlink_Simple",Lr),R.add("AvatarEyeLook_Rotation",Uf),R.add("AxesHelper",Ga),R.add("BasicIKConstraint",Nf),R.add("BoxHelperComponent",Lo),R.add("Camera",ri),R.add("CharacterController",jr),R.add("CharacterControllerInput",Nn),R.add("Collider",ci),R.add("SphereCollider",qa),R.add("BoxCollider",Tu),R.add("MeshCollider",jo),R.add("CapsuleCollider",Un),R.add("ContactShadows",Uc),R.add("LogStats",Hf),R.add("DeleteBox",Eu),R.add("Deletable",Gf),R.add("DeviceFlag",Au),R.add("DragControls",Ur),R.add("DropListener",Wn),R.add("Duplicatable",Zf),R.add("EventListEvent",vu),R.add("EventTrigger",Du),R.add("GltfExportBox",d0),R.add("GltfExport",p0),R.add("VariantAction",S0),R.add("ChangeTransformOnClick",Wr),R.add("ChangeMaterialOnClick",P0),R.add("SetActiveOnClick",O0),R.add("HideOnStart",ep),R.add("EmphasizeOnClick",ol),R.add("PlayAudioOnClick",Uo),R.add("PlayAnimationOnClick",Qc),R.add("PreliminaryAction",rl),R.add("PreliminaryTrigger",Yc),R.add("VisibilityAction",Kc),R.add("TapGestureTrigger",R0),R.add("USDZExporter",dn),R.add("Fog",gl),R.add("BoxGizmo",Xr),R.add("GridHelper",fl),R.add("GroundProjectedEnv",Ys),R.add("UsageMarker",zc),R.add("Interactable",$f),R.add("FixedJoint",ny),R.add("HingeJoint",ah),R.add("Light",mi),R.add("LODGroup",ch),R.add("LookAtConstraint",Ar),R.add("NeedleMenu",ln),R.add("NestedGltf",mp),R.add("Networking",ly),R.add("OffsetConstraint",Qr),R.add("CameraTargetReachedEvent",Lc),R.add("OrbitControls",_e),R.add("ParticleSystemRenderer",rs),R.add("ParticleSystem",ph),R.add("PlayerColor",Dl),R.add("Antialiasing",mh),R.add("BloomEffect",Mp),R.add("ChromaticAberration",gh),R.add("ColorAdjustments",er),R.add("DepthOfField",Es),R.add("EffectWrapper",fh),R.add("PixelationEffect",yh),R.add("ScreenSpaceAmbientOcclusion",Zn),R.add("ScreenSpaceAmbientOcclusionN8",As),R.add("SharpeningEffect",bh),R.add("TiltShiftEffect",pn),R.add("ToneMappingEffect",_l),R.add("Vignette",ia),R.add("Volume",Sl),R.add("ReflectionProbe",Vc),R.add("Renderer",Di),R.add("MeshRenderer",$c),R.add("SkinnedMeshRenderer",h0),R.add("Rigidbody",ht),R.add("SceneSwitcher",Ze),R.add("ScreenCapture",ir),R.add("ShadowCatcher",wh),R.add("RemoteSkybox",Dp),R.add("SmoothFollow",Up),R.add("SpatialTriggerReceiver",mn),R.add("SpatialTrigger",zp),R.add("SpectatorCamera",Np),R.add("SpriteRenderer",ui),R.add("SyncedCamera",Ey),R.add("SyncedRoom",Is),R.add("SyncedTransform",Zs),R.add("TestRunner",Ly),R.add("TestSimulateUserData",jy),R.add("PlayableDirector",Pl),R.add("SignalReceiver",Mh),R.add("AnimationTrackHandler",$p),R.add("AudioTrackHandler",Gp),R.add("SignalTrackHandler",Th),R.add("ControlTrackHandler",qp),R.add("TransformGizmo",na),R.add("BaseUIComponent",ls),R.add("UIRootComponent",th),R.add("Button",to),R.add("Canvas",pl),R.add("CanvasGroup",qo),R.add("EventSystem",Jt),R.add("Graphic",nh),R.add("MaskableGraphic",oh),R.add("Image",Ol),R.add("RawImage",Yp),R.add("InputField",Uy),R.add("VerticalLayoutGroup",q0),R.add("HorizontalLayoutGroup",X0),R.add("GridLayoutGroup",Q0),R.add("Outline",ul),R.add("ObjectRaycaster",Ai),R.add("GraphicRaycaster",wu),R.add("SpatialGrabRaycaster",Ac),R.add("RectTransform",Rs),R.add("SpatialHtml",Ih),R.add("Text",Ft),R.add("EnvironmentScene",Zp),R.add("LookAt",zy),R.add("OpenURL",kl),R.add("VideoPlayer",gt),R.add("Voip",Io),R.add("Avatar",Wo),R.add("XRControllerFollow",io),R.add("XRControllerModel",cn),R.add("XRControllerMovement",Fi),R.add("TeleportTarget",ap),R.add("WebARCameraBackground",Bh),R.add("WebARSessionRoot",zo),R.add("WebXR",lp),R.add("AvatarMarker",ai),R.add("WebXRImageTracking",Fh),R.add("WebXRPlaneTracking",no),R.add("XRRig",tm),R.add("XRFlag",is),R.add("PlayerSync",D0),R.add("PlayerState",ks),R.add("PresentationMode",sL);const Uh=vt,nL=C("debugtypestore");nL&&console.log(R);function oL(n,e){const t=q_(n,e);return t!==void 0?t:null}const rL=new DM,Gy=Symbol("deserialize-queue");async function aL(n,e,t,s=null,o){if(!t){console.debug("Can not create component instances: gltf is null");return}let r=s;typeof r=="number"&&(r=new At(s));const l=e.indexOf("?");e=l===-1?e:e.substring(0,l);const c=new Zg(t.scene);c.gltfId=e,c.context=n,c.gltf=t,c.nodeToObject=o?.nodeToObjectMap,c.implementationInformation=rL;let h=n[Gy];if(h||(h=n[Gy]=[]),t.scenes)for(const d of t.scenes)await Qy(c,d,h);if(t.children)for(const d of t.children)await Qy(c,d,h);n.new_scripts_pre_setup_callbacks.push(()=>{const d=n[Gy];if(d){for(const u of d)lL(u,c);d.length=0}if(r){const u={},p=[];Xy(t,r,u,p);for(const g of t.scenes)Xy(g,r,u,p);for(const g of p)g.resolveGuids(u)}})}const qy=Symbol("original-component-name"),Tl=new Map;function Xy(n,e,t,s){if(e===null||!n)return;const o=n.guid,r=n.guid;r!=null&&r.length&&(Tl.has(r)||(Uh&&console.log('Creating InstanceIdProvider with key "'+r+'" for object '+n.name),Tl.set(r,new At(r))));const l=r&&Tl.get(r)||e;if(n.guid=l.generateUUID(),o&&o!=="invalid"&&(t[o]=n.guid),n&&n.userData&&n.userData.components)for(const c of n.userData.components){if(c===null)continue;const h=c.guid;h?Tl.has(h)||(Uh&&console.log('Creating InstanceIdProvider with key "'+h+'" for component '+c[qy]),Tl.set(h,new At(h))):Uh&&console.warn("Can not create IdProvider: component "+c[qy]+" has no guid",c.guid);const d=Tl.get(h)||e,u=c.guid;c.guid=d.generateUUID(),u&&u!=="invalid"&&(t[u]=c.guid),c.resolveGuids&&s.push(c)}if(n.children)for(const c of n.children)Xy(c,e,t,s)}const zh=[];async function Qy(n,e,t,s){var o,r,l,c,h;if(!e)return;const d=e.userData;if(d){const u=d.builtin_components;if(u&&u.length>0)for(const p of u)try{if(p===null)continue;const g=R.get(p.name);if(g!=null){const f=new g;f.sourceId=n.gltfId,La(f,p,n.implementationInformation),f.context=n.context,"guid"in p&&(f[tc]=p.guid),f[qy]=p.name,xr(e,f,!1),t.push({instance:f,compData:p,obj:e}),f.isCamera&&n.context&&n.context.mainCamera===null&&f.tag==="MainCamera"&&n.context.setCurrentCamera(f),((l=(r=(o=n.context)==null?void 0:o.physics)==null?void 0:r.engine)==null?void 0:l.isInitialized)===!1&&(f.isCollider||f.isRigidbody)&&((h=(c=n.context)==null?void 0:c.physics.engine)==null||h.initialize())}else Uh&&console.debug("unknown component: "+p.name),zh.includes(p.name)||zh.push(p.name)}catch(g){console.error(p.name+" - "+g.message,g)}if(zh.length>0){const p=zh.join(", ");console.warn("unknown components: "+p),zh.length=0,$t()&&De(`<strong>Unknown components in scene</strong>:
1410
-
1411
- ${p}
1412
-
1413
- This could mean you forgot to add a npmdef to your ExportInfo
1414
- <a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,Ci.Warn)}}if(e.children)for(const u of e.children)await Qy(n,u,t)}function lL(n,e){const{instance:t,compData:s,obj:o}=n;e.object=o,e.target=t,Gd(t,s,e),Uh&&console.debug("add "+s.name,s,t)}class ES{createBuiltinComponents(e,t,s,o,r){return aL(e,t,s,o,r)}writeBuiltinComponentData(e,t){return oL(e,t)}parseSync(e,t,s,o){return LS(e,t,s,o)}loadSync(e,t,s,o,r){return Yy(e,t,s,o,r)}}cg(ES);const AS=C("printGltf")||C("printgltf"),cL=C("debugfileformat");async function IS(n,e){const t=await Lx(n,{useExtension:!0})||"unknown";cL&&console.debug(`Determined file type: '${t}' for url '${n}'`,{registeredModelLoaderCallbacks:Qa});for(const s of Qa){const{callback:o}=s,r=o({context:e,url:n,mimetype:t});if(r instanceof Promise&&await r,r)return console.debug(`Using custom loader (${s.name||"unnamed"}) for ${t} at '${n}'`),r}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.
1415
- Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,n);const s=new On;return await zu(s,e,n),s}case"model/fbx":case"model/vnd.autodesk.fbx":return new Dv;case"model/obj":return new Em;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 s=new On;return await zu(s,e,n),s}}}function hL(n,e){return Yy(e?.context||J.Current,n,n,e?.seed||null,e?.onprogress)}async function LS(n,e,t,s){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=""),AS&&console.log("Parse glTF",t);const o=await IS(t,n);if(!o)return;const{componentsExtension:r}=jS(o,n);if(o instanceof Em){typeof e!="string"&&(e=new TextDecoder().decode(e));const l=o.parse(e);return await Nh(o,n,t,l,s,r)}if(!(o instanceof On)){if(o.parse===void 0){console.error("Loader does not support parse");return}const l=o.parse(e,t);return await Nh(o,n,t,l,s,r)}return new Promise((l,c)=>{try{let h=t.split("?")[0].trimEnd();const d=h.split("/");d.length>0&&d[d.length-1]!==""&&d.pop(),h=d.join("/"),h.endsWith("/")||(h+="/"),o.resourcePath=h,o.parse(e,"",async u=>{const p=await Nh(o,n,t,u,s,r);l(p)},u=>{console.error('Loading asset at "'+t+`" failed
1416
- `,u),l(void 0)})}catch(h){console.error(h),c(h)}})}async function Yy(n,e,t,s,o){uL(e);const r=await IS(e,n);if(!r)return;const{componentsExtension:l}=jS(r,n);if(!(r instanceof On)){const c=await r.loadAsync(e,o);return await Nh(r,n,e,c,s,l)}return new Promise((c,h)=>{try{r.load(e,async d=>{const u=await Nh(r,n,t,d,s,l);c(u)},d=>{o?.call(r,d)},d=>{console.error('Loading asset at "'+e+`" failed
1417
- `,d),c(void 0)})}catch(d){console.error(d),h(d)}})}function jS(n,e){const t=o0(n);return n instanceof On&&Sf(n,e),{componentsExtension:t}}async function Nh(n,e,t,s,o,r){var l;if(AS&&console.warn("Loaded",t,s),s==null)return console.error(`Loaded model is null '${t}' - please make sure the loader is registered correctly`),{scene:new A,animations:[],scenes:[]};if(typeof s!="object")return console.error(`Loaded model is not an object '${t}' - please make sure the loader is registered correctly`),{scene:new A,animations:[],scenes:[]};if(s instanceof A)s={scene:s,animations:s.animations,scenes:[s]};else if(s instanceof Ns){const c=new ft({color:new ae(14540253)}),h=new X(s,c);s={scene:h,animations:[],scenes:[h]}}else Array.isArray(s.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.`);if(t.includes("?")&&(t=t.split("?")[0]),"scenes"in s)for(const c of s.scenes)c&&!((l=c.animations)!=null&&l.length)&&(c.animations=[...s.animations]);return pL(n,s),gx(s)&&(qx(t,s,e),await _s().createBuiltinComponents(e,t,s,o,r||void 0)),await dL(s.scene,e,e.mainCamera),s}async function dL(n,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(n,t,e.scene).catch(s=>{console.warn(s.message)}):wM(n,e)}catch(s){console.warn(s?.message||s)}}function uL(n){if(new URL(n,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.
1418
- 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>`;De(e),console.warn(e)}}function pL(n,e){if(n instanceof Dv||n instanceof Em){let t=e;t instanceof A||(t=e.scene),t.traverse(s=>{const o=s;o!=null&&o.isMesh&&sg(o,o.material)})}}const Wh=C("debugoverlay"),DS="ar",mL="quit-ar";class gL{constructor(){a(this,"arContainer",null),a(this,"currentSession",null),a(this,"_createdAROnlyElements",[]),a(this,"_reparentedObjects",[]),a(this,"contentElement",null),a(this,"originalDomOverlayParent",null),a(this,"requestEndAR",()=>{this.onRequestedEndAR()})}get ARContainer(){return this.arContainer}onBegin(e,t,s){var o;if(this.currentSession=s,this.arContainer=t,Y.isMozillaXR()){const r=e.domElement.children;for(let l=0;l<r?.length;l++){const c=r[l];if(!c||c===this.arContainer)return;this._reparentedObjects.push({el:c,previousParent:c.parentElement}),(o=this.arContainer)==null||o.appendChild(c)}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){var t;for(const s of this._createdAROnlyElements)s.remove&&s.remove();for(const s of this._reparentedObjects){const o=s.el;(t=s.previousParent)==null||t.appendChild(o)}this._reparentedObjects.length=0,Y.isMozillaXR()&&setTimeout(()=>{var s;const o=e.renderer.domElement;o&&((s=e.domElement.shadowRoot)==null||s.prepend(o));const r=document.querySelectorAll("*");for(var l=0;l<r.length;l++){const c=r[l];c&&c._displayChanged!==void 0&&c._displayWas!==void 0&&(c.style.display=c._displayWas)}},10)}createOverlayContainer(e){if(this.contentElement)return this.contentElement;Wh&&console.log("Setup overlay container");const t=e.shadowRoot.querySelector(".content");this.contentElement=t;const s=e.shadowRoot.querySelector(".overlay-content");return s&&t.appendChild(s),Wh&&!Y.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 s=document.querySelector(`.${mL}`);if(s){s.addEventListener("click",this.requestEndAR),Wh&&s.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),Wh&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const o=document.createElement("div");o.style.cssText=`
1419
- position: fixed;
1420
- top: 0;
1421
- right: 0;
1422
- z-index: 600;
1423
- pointer-events: all;
1424
- `,this.appendElement(o,t);var r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("quit-ar-button"),r.setAttribute("width","40px"),r.setAttribute("height","40px"),r.style.cssText=`
1425
- background: rgba(255, 255, 255, .4);
1426
- -webkit-backdrop-filter: blur(8px);
1427
- backdrop-filter: blur(8px);
1428
- border-radius: 50%;
1429
- box-shadow: 0 0 5px rgba(0,0,0,.3);
1430
- outline: 1px solid rgba(255, 255, 255, .6);
1431
- display: flex;
1432
- justify-content: center;
1433
- align-items: center;
1434
- `,o.appendChild(r);var l=document.createElementNS("http://www.w3.org/2000/svg","path");l.setAttribute("d","M 12,12 L 28,28 M 28,12 12,28"),l.setAttribute("stroke","#000000"),l.setAttribute("stroke-width","2px"),l.style.cssText=`
1435
- /**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
1436
- `,r.appendChild(l),Wh&&console.log("Created fallback close button",r,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const la=C("debugloading"),Vh=C("debugloadingrendering"),BS=C("debuglicense");class fL{constructor(){a(this,"className"),a(this,"additionalClasses")}}let Hh=0,FS;function Ky(n){la&&console.log(n.progress.loaded.toFixed(0)+"/"+n.progress.total.toFixed(0),n);const e=n.count,t=n.progress.total;t===0||t===void 0?(FS!==n.name&&(Hh=0),FS=n.name,Hh+=(1-Hh)*.001,la&&be("Loading "+n.name+" did not report total size")):Hh=n.progress.loaded/t;const s=n.index/e+Hh/e;return W.clamp01(s)}const US=class mv{constructor(e,t){a(this,"loadingProgress",0),a(this,"_element"),a(this,"_progress",0),a(this,"_allowCustomLoadingElement",!0),a(this,"_loadingElement"),a(this,"_loadingTextContainer",null),a(this,"_loadingBar",null),a(this,"_messageContainer",null),a(this,"_loadingElementOptions"),a(this,"_progressLoop"),this._element=e,this._loadingElementOptions=t}async onLoadingBegin(e){const t=this._element.shadowRoot||this._element;if(la&&console.warn("Begin Loading"),!this._loadingElement){for(let s=0;s<t.children.length;s++){const o=t.children[s];if(o.classList.contains(mv.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){la&&console.warn("Remove custom loading container"),t.removeChild(o);continue}this._loadingElement=this.createLoadingElement(o)}}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){var s;if(!((s=this._loadingElement)!=null&&s.parentNode))return;let o=0;typeof e=="number"?o=e:("index"in e&&(o=Ky(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=o,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){la&&console.warn("Finished Loading"),Vh||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;Vh&&(e=1/500,typeof Vh=="number"&&(e*=Vh)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!Vh&&(e=.9),this._progress=W.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){this._loadingElement&&(la&&console.log("Hiding loading element"),this._loadingElement.style.display="none",this._loadingElement.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){var t,s;la&&!e&&console.log("Creating loading element"),this._loadingElement=e||document.createElement("div");let o=this._element.getAttribute("loading-style");(!o||o==="auto")&&(window.matchMedia("(prefers-color-scheme: dark)").matches?o="dark":o="light");const r=Xs();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";const y=this._element.getAttribute("loading-background");y?this._loadingElement.style.background=y:this._loadingElement.style.backgroundColor="transparent",this._loadingElement.style.display="flex",this._loadingElement.style.alignItems="center",this._loadingElement.style.justifyContent="center",this._loadingElement.style.zIndex=Number.MAX_SAFE_INTEGER.toString(),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",o==="light"?this._loadingElement.style.color="rgba(0,0,0,.6)":this._loadingElement.style.color="rgba(255,255,255,.3)"}const l=((t=this._loadingElementOptions)==null?void 0:t.className)??mv.LoadingContainerClassName;if(this._loadingElement.classList.add(l),(s=this._loadingElementOptions)!=null&&s.additionalClasses)for(const y of this._loadingElementOptions.additionalClasses)this._loadingElement.classList.add(y);const c=document.createElement("div");this._loadingElement.appendChild(c);const h=document.createElement("img"),d=120;if(h.style.width=`${d}px`,h.style.height=`${d}px`,h.style.paddingTop="20px",h.style.paddingBottom="10px",h.style.margin="0px",h.style.userSelect="none",h.style.objectFit="contain",h.style.transition="transform 1.5s ease-out, opacity .3s ease-in-out",h.style.transform="translateY(30px)",h.style.opacity="0.05",setTimeout(()=>{h.style.opacity="1",h.style.transform="translateY(0px)"},1),h.src=qv,r&&this._element){const y=this._element.getAttribute("loading-logo-src");y&&(h.src=y)}c.appendChild(h);const u=document.createElement("div");u.style.cssText=`
1437
- display: flex;
1438
- flex-direction: column;
1439
- align-items: center;
1440
- justify-content: center;
1441
- width: 100%;
1442
- opacity: 0;
1443
- transition: opacity 1s ease-in-out 4s;
1444
- `,setTimeout(()=>{u.style.opacity="1"},1),this._loadingElement.appendChild(u);const p=document.createElement("div"),g=100;p.style.display="flex",p.style.width=g+"%",p.style.height="3px",p.style.position="absolute",p.style.left="0",p.style.bottom="0px",p.style.opacity="0",p.style.transition="opacity 1s ease-in-out 2s",setTimeout(()=>{p.style.opacity="1"},1),o==="light"?p.style.backgroundColor="rgba(0,0,0,.2)":p.style.backgroundColor="rgba(255,255,255,.2)",this._loadingElement.appendChild(p),this._loadingBar=document.createElement("div"),p.appendChild(this._loadingBar);const f=function(y){return W.lerp(0,g,y)+"%"};if(this._loadingBar.style.background="#66A22F",this._loadingBar.style.backgroundAttachment="fixed",this._loadingBar.style.width="0%",this._loadingBar.style.height="100%",r&&this._element){const y=this._element.getAttribute("primary-color"),v=this._element.getAttribute("secondary-color");y&&v?this._loadingBar.style.background=`linear-gradient(90deg, ${y} ${f(0)}, ${v} ${f(1)})`:y?this._loadingBar.style.background=y:v&&(this._loadingBar.style.background=v)}return this.handleRuntimeLicense(this._loadingElement),this._loadingElement}async handleRuntimeLicense(e){let t=Qs();if(t)return;BS&&console.log("Loading UI has commercial license?",t);const s=document.createElement("div");s.style.paddingTop=".6em",s.style.fontSize=".8em",s.style.textTransform="uppercase",s.innerText=`NEEDLE ENGINE NON COMMERCIAL VERSION
1445
- CLICK HERE TO GET A LICENSE`,s.style.cursor="pointer",s.style.userSelect="none",s.style.textAlign="center",s.style.pointerEvents="all",s.addEventListener("click",()=>window.open("https://needle.tools/pricing","_self")),s.style.opacity="0",e.appendChild(s),!F()&&Rr&&(BS&&console.log("Waiting for runtime license check"),await Rr,t=Qs()),!t&&(s.style.transition="opacity .5s ease-in-out",s.style.opacity="1")}};a(US,"LoadingContainerClassName","loading");let zS=US;cg(ES);const Ie=C("debugwebcomponent"),NS="needle-engine",WS="vr",VS="desktop",yL=[DS,WS,VS],$h="ar-session-active",Gh="desktop-session-active",vL=["public-key","version","hash","src","camera-controls","loadstart","progress","loadfinished","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","tone-mapping","tone-mapping-exposure","background-blurriness","background-color"];class Zy extends HTMLElement{constructor(){super(),a(this,"_context"),a(this,"_overlay_ar"),a(this,"_loadingProgress01",0),a(this,"_loadingView"),a(this,"_previousSrc",null),a(this,"_didFullyLoad",!1),a(this,"_loadId",0),a(this,"_abortController",null),a(this,"_lastSourceFiles",null),a(this,"_createContextPromise",null),a(this,"onXRSessionStarted",()=>{var t;const s=this.context.xrSessionMode;s==="immersive-ar"?this.onEnterAR(this.context.xrSession):s==="immersive-vr"&&this.onEnterVR(this.context.xrSession),(t=this.context.xrSession)==null||t.addEventListener("end",()=>{this.dispatchEvent(new CustomEvent("xr-session-ended",{detail:{session:this.context.xrSession,context:this._context,sessionMode:s}})),s==="immersive-ar"?this.onExitAR(this.context.xrSession):s==="immersive-vr"&&this.onExitVR(this.context.xrSession)})}),a(this,"onReady",()=>{var t;return(t=this._loadingView)==null?void 0:t.onLoadingFinished()}),a(this,"onError",()=>{var t;return(t=this._loadingView)==null?void 0:t.setMessage("Loading failed!")}),a(this,"_previouslyRegisteredMap",new Map),this._overlay_ar=new gL,this.addEventListener("ready",this.onReady),jw(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
1446
- @import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
1447
-
1448
- :host {
1449
- position: absolute;
1450
- display: block;
1451
- width: max(600px, 100%);
1452
- height: max(300px, 100%);
1453
- touch-action: none;
1454
-
1455
- -webkit-tap-highlight-color: transparent;
1456
- }
1457
-
1458
- @media (max-width: 600px) {
1459
- :host {
1460
- width: 100%;
1461
- }
1462
- }
1463
- @media (max-height: 300px) {
1464
- :host {
1465
- height: 100%;
1466
- }
1467
- }
1468
-
1469
- :host > div.canvas-wrapper {
1470
- width: 100%;
1471
- height: 100%;
1472
- }
1473
-
1474
- :host canvas {
1475
- position: absolute;
1476
- user-select: none;
1477
- -webkit-user-select: none;
1478
-
1479
- /** allow touch panning but no pinch zoom **/
1480
- /** but this doesnt work yet:
1481
- * touch-action: pan-x, pan-y;
1482
- **/
1483
-
1484
- -webkit-touch-callout: none;
1485
- -webkit-user-drag: none;
1486
- -webkit-user-modify: none;
1487
-
1488
- left: 0;
1489
- top: 0;
1490
- }
1491
- :host .content {
1492
- position: absolute;
1493
- top: 0;
1494
- width: 100%;
1495
- height: 100%;
1496
- visibility: visible;
1497
- z-index: 500; /* < must be less than the webxr buttons element */
1498
- pointer-events: none;
1499
- }
1500
- :host .overlay-content {
1501
- position: absolute;
1502
- user-select: auto;
1503
- pointer-events: all;
1504
- }
1505
- :host slot[name="quit-ar"]:hover {
1506
- cursor: pointer;
1507
- }
1508
- :host .quit-ar-button {
1509
- position: absolute;
1510
- // top: env(titlebar-area-y); /** this doesnt work **/
1511
- top: 60px; /** camera access needs a bit more space **/
1512
- right: 20px;
1513
- z-index: 9999;
1514
- }
1515
- </style>
1516
- <div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
1517
- <canvas></canvas>
1518
- </div>
1519
- <div class="content">
1520
- <slot class="overlay-content"></slot>
1521
- </div>
1522
- `,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new J({domElement:this}),this.addEventListener("error",this.onError)}static get observedAttributes(){return vL}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")}getContext(){return new Promise((e,t)=>{if(this._context&&this.loadingFinished)e(this._context);else{const s=()=>{this.removeEventListener("loadfinished",s),this._context&&this.loadingFinished&&e(this._context)};this.addEventListener("loadfinished",s)}})}get context(){return this._context}async connectedCallback(){if(Ie&&console.log("<needle-engine> connected"),this.setPublicKey(),this.setVersion(),this.addEventListener("xr-session-started",this.onXRSessionStarted),this.onSetupDesktop(),!this.getAttribute("src")){const t=globalThis["needle:codegen_files"];Ie&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(Ie&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}Ie&&console.log("src",this.getAttribute("src"));const e=this._loadId;setTimeout(()=>{this.isConnected!==!1&&e===this._loadId&&this.onLoad()},1)}disconnectedCallback(){var e;this.removeEventListener("xr-session-started",this.onXRSessionStarted),this._didFullyLoad=!1;const t=this.getAttribute("keep-alive"),s=t==null||t?.length>0&&t!=="true"&&t!=="1";Ie&&console.warn('<needle-engine> disconnected, keep-alive: "'+t+'"',typeof t,"Dispose=",s),s?(Ie&&console.warn("<needle-engine> dispose"),(e=this._context)==null||e.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):Ie&&console.warn("<needle-engine> is not disposed because keep-alive is set")}attributeChangedCallback(e,t,s){switch(Ie&&console.log("attributeChangedCallback",e,t,s),e){case"src":Ie&&console.warn(`<needle-engine src>
1523
- changed from "`,t,'" to "',s,'"'),this.onLoad();break;case"hash":this._context&&(this._context.hash=s);break;case"loadstart":case"progress":case"loadfinished":typeof s=="string"&&s.length>0&&(Ie&&console.log(e+" attribute changed",s),this.registerEventFromAttribute(e,s));break;case"dracoDecoderPath":Ie&&console.log("dracoDecoderPath",s),Hw(s);break;case"dracoDecoderType":s==="wasm"||s==="js"?(Ie&&console.log("dracoDecoderType",s),$w(s)):console.error("Invalid dracoDecoderType",s,"expected js or wasm");break;case"ktx2DecoderPath":Ie&&console.log("ktx2DecoderPath",s),Gw(s);break;case"tone-mapping":{this.applyAttributes();break}case"tone-mapping-exposure":{this.applyAttributes();break}case"background-blurriness":{const o=parseFloat(s);o!=null&&this._context&&(this._context.scene.backgroundBlurriness=o);break}case"background-color":{this.applyAttributes();break}case"public-key":{s!=Ca&&this.setPublicKey();break}case"version":{s!=bs&&this.setVersion();break}}}async onLoad(){var e,t;if(!this.isConnected)return;if(this._context||(Ie&&console.warn("Create new context"),this._context=new J({domElement:this})),!this._context){console.error("Needle Engine: Context not initialized");return}const s=this.getSourceFiles();if(!this.checkIfSourceHasChanged(s,this._lastSourceFiles))return;this._abortController&&(Ie&&console.warn("Abort previous loading process"),this._abortController.abort(),this._abortController=null),this._lastSourceFiles=s;const o=++this._loadId;if((s==null||s.length<=0)&&(Ie&&console.warn("Clear scene",s),this._context.clear(),o!==this._loadId))return;const r=this.getAttribute("alias");this.classList.add("loading");const l=Qs();this.ensureLoadStartIsRegistered();let c=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:r},cancelable:!0}));if(l){const b=this.getAttribute("hide-loading-overlay");b!=null&&b!=="0"&&(c=!1)}c===!1&&!l&&(F()||(c=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),F()&&be('You need a <a target="_blank" href="https://needle.tools/pricing">commercial license</a> to override the default loading view. This will not work in production.')),!this._loadingView&&c&&(this._loadingView=new zS(this)),c&&(this._didFullyLoad!==!0?(e=this._loadingView)==null||e.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===o&&this._loadingView.onLoadingBegin("begin load")},300)),Ie&&console.warn(`--------------
1524
- Needle Engine: Begin loading `+o+`
1525
- `,s),this.onBeforeBeginLoading();const h=[],d={context:this._context,name:"",progress:{},index:0,count:s.length,totalProgress01:this._loadingProgress01},u=new CustomEvent("progress",{detail:d}),p=new Array,g=new AbortController;this._abortController=g;const f={files:s,abortSignal:g.signal,onLoadingProgress:b=>{var _;if(Ie&&console.debug("Loading progress: ",b),g.signal.aborted)return;const w=b.index;!p[w]&&b.name&&(p[w]=bL(b.name)),b.name=p[w],c&&((_=this._loadingView)==null||_.onLoadingUpdate(b)),d.name=b.name,d.progress=b.progress,this._loadingProgress01=Ky(b),d.totalProgress01=this._loadingProgress01,this.dispatchEvent(u)},onLoadingFinished:(b,_,w)=>{Ie&&console.debug(`Finished loading "${_}" (aborted? ${g.signal.aborted})`),!g.signal.aborted&&w&&h.push({src:_,file:w})}},y=this.getAttribute("hash");y!=null&&(this._context.hash=y),this._context.alias=r,this._createContextPromise=this._context.create(f);const v=await this._createContextPromise;if(this.applyAttributes(),Ie&&console.warn(`--------------
1526
- Needle Engine: finished loading `+o+`
1527
- `,s,`Aborted? ${g.signal.aborted}`),g.signal.aborted){console.log("Loading finished but aborted...");return}if(this._loadId!==o){console.log("Load id changed during loading process");return}this._loadingProgress01=1,c&&v&&((t=this._loadingView)==null||t.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:r,loadedFiles:h}}))}applyAttributes(){var e,t;if((e=this._context)!=null&&e.renderer){const r=this.getAttribute("tonemapping")||this.getAttribute("tone-mapping");switch(r?.toLowerCase()){case"none":this._context.renderer.toneMapping=va;break;case"linear":this._context.renderer.toneMapping=dd;break;case"neutral":this._context.renderer.toneMapping=Nl;break;case"agx":this._context.renderer.toneMapping=hd;break;default:r!=null&&console.warn("Invalid tone-mapping attribute: "+r)}const l=this.getAttribute("tone-mapping-exposure");if(l!=null){const c=parseFloat(l);isNaN(c)||(this._context.renderer.toneMappingExposure=c)}}const s=this.getAttribute("background-blurriness");if(s!=null){const r=parseFloat(s);r!==void 0&&this._context&&(this._context.scene.backgroundBlurriness=r)}const o=this.getAttribute("background-color");if((t=this._context)!=null&&t.renderer&&typeof o=="string"&&o.length>0){const r=ce.fromColorRepresentation(o);Ie&&console.debug("<needle-engine> background-color changed, str:",o,"\u2192",r),this._context.renderer.setClearColor(r,r.alpha),this.context.scene.background=null}}internalSetLoadingMessage(e){var t;(t=this._loadingView)==null||t.setMessage(e)}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 s=t.length-1;s>=0;s--){const o=t[s];(o==="null"||o==="undefined"||o?.length<=0)&&t.splice(s,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 s=0;s<e?.length;s++)if(e[s]!==t[s])return!0}return!1}ensureLoadStartIsRegistered(){const e=this.getAttribute("loadstart");e&&this.registerEventFromAttribute("loadstart",e)}registerEventFromAttribute(e,t){const s=this._previouslyRegisteredMap.get(e);if(s&&(this._previouslyRegisteredMap.delete(e),this.removeEventListener(e,s)),typeof t=="string"&&t.length>0)try{const o=(0,eval)(t);typeof o=="function"&&(this._previouslyRegisteredMap.set(e,o),this.addEventListener(e,r=>o?.call(globalThis,this._context,r)))}catch(o){console.error("Error registering event "+e+'="'+t+`" failed with the following error:
1528
- `,o)}}setPublicKey(){Ca&&Ca.length>0&&this.setAttribute("public-key",Ca)}setVersion(){bs.length>0&&this.setAttribute("version",bs)}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){var t;this.onSetupAR();const s=this.getAROverlayContainer();this._overlay_ar.onBegin(this._context,s,e),this.dispatchEvent(new CustomEvent("enter-ar",{detail:{session:e,context:this._context,htmlContainer:(t=this._overlay_ar)==null?void 0:t.ARContainer}}))}onExitAR(e){var t;this._overlay_ar.onEnd(this._context),this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-ar",{detail:{session:e,context:this._context,htmlContainer:(t=this._overlay_ar)==null?void 0:t.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(Gh);const e=this.getAROverlayContainer();Ie&&console.warn("onSetupAR:",e),e&&(e.classList.add($h),e.classList.remove(Gh)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,DS))}onSetupVR(){this.classList.remove($h),this.classList.remove(Gh),this.foreachHtmlElement(e=>this.setupElementsForMode(e,WS))}onSetupDesktop(){this.classList.remove($h),this.classList.add(Gh);const e=this.getAROverlayContainer();e&&(e.classList.remove($h),e.classList.add(Gh)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,VS))}setupElementsForMode(e,t,s=null){var o,r;if(!(e===((r=(o=this._context)==null?void 0:o.renderer)==null?void 0:r.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 l of yL)e.classList.contains(l)&&(e.style.visibility="hidden",e.style.display="none")}foreachHtmlElement(e){for(let t=0;t<this.children.length;t++){const s=this.children[t];s.style&&e(s)}}onBeforeBeginLoading(){const e=this.getAttribute("dracoDecoderPath");e&&(Ie&&console.log("using custom draco decoder path",e),Hw(e));const t=this.getAttribute("dracoDecoderType");t&&(Ie&&console.log("using custom draco decoder type",t),$w(t));const s=this.getAttribute("ktx2DecoderPath");s&&(Ie&&console.log("using custom ktx2 decoder path",s),Gw(s))}}typeof window<"u"&&!window.customElements.get(NS)&&window.customElements.define(NS,Zy);function bL(n){if(n.startsWith("blob:"))return"blob";const e=n.split("/");let t=e[e.length-1];const s=t.indexOf("?");s>0&&(t=t.substring(0,s));const o=t.indexOf("=");o>0&&(t=t.substring(o));const r=t.split(".").pop(),l=r?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(r.toLowerCase()):-1;if(r&&l>=0&&(t=t.substring(0,t.length-r.length-1)),t=decodeURIComponent(t),t.length>3){let c="",h=!1;const d=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let u=0;u<t.length;u++){let p=t[u];(p==="_"||p==="-")&&(p=" "),!(p===" "&&c.length<=0||d.includes(p)||(c.length===0&&(p=p.toUpperCase()),h&&p===" "))&&(h&&(p=p.toUpperCase()),h=!1,c+=p,p===" "&&(h=!0))}return F()&&t!==c&&console.debug('Generated display name: "'+t+'" \u2192 "'+c+'"'),c.trim()}return F()&&console.debug("Loading: use default name",t),t}const _L=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineHTMLElement:Zy},Symbol.toStringTag,{value:"Module"}));function wL(){En.registerWaitForInteraction(()=>{const n=IP.getContext();n.addEventListener("statechange",()=>{setTimeout(()=>{const e=n.state;(e==="suspended"||e==="interrupted")&&n.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}setTimeout(wL,1e3);const rt=C("debugphysics"),Jy=C("debugcolliderplacement"),ev=C("debugcollisions"),xL=C("showcolliders"),tv=C("debugraycasts"),yi=Symbol("needle component"),Zt=Symbol("physics body"),HS=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,rt&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),pe.registerCallback(me.ContextCreationStart,n=>{rt&&console.log("Register rapier physics backend"),n.context.physics.engine=new $S(n.context)});const qh=class mm{constructor(e){a(this,"debugRenderColliders",!1),a(this,"debugRenderRaycasts",!1),a(this,"context"),a(this,"_initializePromise"),a(this,"_isInitialized",!1),a(this,"rapierRay"),a(this,"raycastVectorsBuffer",new Si(()=>new S,10)),a(this,"rapierSphere",null),a(this,"rapierColliderArray",[]),a(this,"rapierIdentityRotation",{x:0,y:0,z:0,w:1}),a(this,"rapierForwardVector",{x:0,y:0,z:1}),a(this,"enabled",!1),a(this,"_tempPosition",new S),a(this,"_tempQuaternion",new H),a(this,"_tempScale",new S),a(this,"_tempMatrix",new se),a(this,"_isUpdatingPhysicsWorld",!1),a(this,"_world"),a(this,"_hasCreatedWorld",!1),a(this,"eventQueue"),a(this,"collisionHandler"),a(this,"objects",[]),a(this,"bodies",[]),a(this,"_meshCache",new Map),a(this,"_gravity",{x:0,y:-9.81,z:0}),a(this,"lines"),a(this,"_tempCenterPos",new S),a(this,"_tempCenterVec",new S),a(this,"_tempCenterQuaternion",new H),this.context=e}removeBody(e){var t,s,o;if(!e)return;this.validate();const r=e[Zt];if(e[Zt]=null,r&&this.world){const l=this.objects.findIndex(c=>c===e);if(l>=0){const c=this.bodies[l];if(this.bodies.splice(l,1),this.objects.splice(l,1),c instanceof D.RAPIER_PHYSICS.MODULE.Collider){const h=c;(t=this.world)==null||t.removeCollider(h,!0);const d=h.parent();d&&d.numColliders()<=0&&(d[yi]||(s=this.world)==null||s.removeRigidBody(d))}else c instanceof D.RAPIER_PHYSICS.MODULE.RigidBody&&(c.numColliders()<=0?(o=this.world)==null||o.removeRigidBody(c):F()&&(c.did_log_removing||setTimeout(()=>{c.numColliders()>0&&(c.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,s){if(this.validate(),!!this.enabled&&!(e.destroyed||!e.gameObject)&&!(!t&&!s))if(e.isCollider===!0)console.warn("TODO: implement updating collider position");else{const o=e,r=o[Zt];r&&this.syncPhysicsBody(o.gameObject,r,t,s)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,s=t[Zt];s&&(this.internalUpdateColliderProperties(t,s),t.sharedMaterial&&this.updatePhysicsMaterial(t))}else{const t=e,s=this.internal_getRigidbody(t);s&&this.internalUpdateRigidbodyProperties(t,s)}}addForce(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.addForce(t,s):console.warn("Rigidbody doesn't exist: can not apply force (does your object with the Rigidbody have a collider?)")}addImpulse(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.applyImpulse(t,s):console.warn("Rigidbody 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();const s=this.internal_getRigidbody(e);s?.resetForces(t)}resetTorques(e,t){this.validate();const s=this.internal_getRigidbody(e);s?.resetTorques(t)}applyImpulse(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.applyImpulse(t,s):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():console.warn("Rigidbody doesn't exist: can not wake up (does your object with the Rigidbody have a collider?)")}isSleeping(e){this.validate();const t=this.internal_getRigidbody(e);return t?.isSleeping()}setAngularVelocity(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.setAngvel(t,s):console.warn("Rigidbody doesn't exist: can not set angular velocity (does your object with the Rigidbody have a collider?)")}setLinearVelocity(e,t,s){this.validate();const o=this.internal_getRigidbody(e);o?o.setLinvel(t,s):console.warn("Rigidbody doesn't exist: can not set linear velocity (does your object with the Rigidbody have a collider?)")}get isInitialized(){return this._isInitialized}async initialize(){return this._initializePromise||(this._initializePromise=this.internalInitialization()),this._initializePromise}async internalInitialization(){return C("__nophysics")?(console.warn("Physics are disabled"),!1):(rt&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,D.RAPIER_PHYSICS.MAYBEMODULE==null&&(rt&&console.trace("Loading rapier physics engine"),await(await D.RAPIER_PHYSICS.load()).init()),rt&&console.log("Physics engine initialized, creating world..."),this._world=new D.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new D.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,rt&&console.log("Physics world created"),!0))}validate(){this._isInitialized||rt&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}raycast(e,t,s){var o;if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let r=s?.maxDistance,l=s?.solid;r===void 0&&(r=1/0),l===void 0&&(l=!0);const c=this.getPhysicsRay(this.rapierRay,e,t);if(!c)return null;(this.debugRenderRaycasts||tv)&&q.DrawRay(c.origin,c.dir,255,1);const h=(o=this.world)==null?void 0:o.castRay(c,r,l,s?.queryFilterFlags,s?.filterGroups,void 0,void 0,d=>{const u=d[yi];return s!=null&&s.filterPredicate?s.filterPredicate(u):s?.useIgnoreRaycastLayer!==!1?!(u!=null&&u.gameObject.layers.isEnabled(2)):!0});if(h){const d=c.pointAt(h.timeOfImpact),u=this.raycastVectorsBuffer.get();return u.set(d.x,d.y,d.z),{point:u,collider:h.collider[yi]}}return null}raycastAndGetNormal(e,t,s){var o;if(!this._isInitialized)return null;let r=s?.maxDistance,l=s?.solid;r===void 0&&(r=1/0),l===void 0&&(l=!0);const c=this.getPhysicsRay(this.rapierRay,e,t);if(!c)return null;(this.debugRenderRaycasts||tv)&&q.DrawRay(c.origin,c.dir,255,1);const h=(o=this.world)==null?void 0:o.castRayAndGetNormal(c,r,l,s?.queryFilterFlags,s?.filterGroups,void 0,void 0,d=>{const u=d[yi];return s!=null&&s.filterPredicate?s.filterPredicate(u):s?.useIgnoreRaycastLayer!==!1?!(u!=null&&u.gameObject.layers.isEnabled(2)):!0});if(h){const d=c.pointAt(h.timeOfImpact),u=h.normal,p=this.raycastVectorsBuffer.get(),g=this.raycastVectorsBuffer.get();return p.set(d.x,d.y,d.z),g.set(u.x,u.y,u.z),{point:p,normal:g,collider:h.collider[yi]}}return null}getPhysicsRay(e,t,s){var o,r,l;const c=(o=this.context)==null?void 0:o.mainCamera;if(t===void 0){const u=(r=this.context)==null?void 0:r.input.getPointerPosition(0);if(u)t=u;else return null}if(t.z===void 0){if(!c)return console.error("Can not perform raycast from 2d point - no main camera found"),null;const u=this.raycastVectorsBuffer.get();u.x=t.x,u.y=t.y,u.z=0,(u.x>1||u.y>1||u.y<-1||u.x<-1)&&(rt&&console.warn("Converting screenspace to raycast space",u),(l=this.context)==null||l.input.convertScreenspaceToRaycastSpace(u)),u.unproject(c),t=u}const h=t;e.origin.x=h.x,e.origin.y=h.y,e.origin.z=h.z;const d=this.raycastVectorsBuffer.get();if(s)d.set(s.x,s.y,s.z);else{if(!c)return console.error("Can not perform raycast - no camera found"),null;d.set(e.origin.x,e.origin.y,e.origin.z);const u=ee(c);d.sub(u)}return d.normalize(),e.dir.x=d.x,e.dir.y=d.y,e.dir.z=d.z,e}sphereOverlap(e,t){return this.rapierColliderArray.length=0,this._isInitialized?this.world?(this.rapierSphere??(this.rapierSphere=new D.RAPIER_PHYSICS.MODULE.Ball(t)),this.rapierSphere.radius=t,(this.debugRenderRaycasts||tv)&&q.DrawWireSphere(e,t,3359999,1),this.world.intersectionsWithShape(e,this.rapierIdentityRotation,this.rapierSphere,s=>{const o=s[yi],r=new bx(o.gameObject,o);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,s=>s.isSensor()?!1:s[yi].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}get world(){return this._world}get isUpdating(){return this._isUpdatingPhysicsWorld}get gravity(){var e;return((e=this.world)==null?void 0:e.gravity)??this._gravity}set gravity(e){this.world?this.world.gravity=e:this._gravity=e}clearCaches(){var e,t,s,o;this._meshCache.clear(),(e=this.eventQueue)!=null&&e.raw&&((t=this.eventQueue)==null||t.free()),(s=this.world)!=null&&s.bodies&&((o=this.world)==null||o.free())}async addBoxCollider(e,t){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){rt&&console.warn("Physics are disabled");return}const s=e.gameObject,o=Ge(s,this._tempPosition).multiply(t);o.multiplyScalar(.5),o.x<0&&(o.x=Math.abs(o.x)),o.y<0&&(o.y=Math.abs(o.y)),o.z<0&&(o.z=Math.abs(o.z));const r=1e-7;o.x<r&&(o.x=r),o.y<r&&(o.y=r),o.z<r&&(o.z=r);const l=D.RAPIER_PHYSICS.MODULE.ColliderDesc.cuboid(o.x,o.y,o.z);this.createCollider(e,l)}async addSphereCollider(e){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){rt&&console.warn("Physics are disabled");return}const t=D.RAPIER_PHYSICS.MODULE.ColliderDesc.ball(.5);this.createCollider(e,t),this.updateProperties(e)}async addCapsuleCollider(e,t,s){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){rt&&console.warn("Physics are disabled");return}const o=e.gameObject,r=Ge(o,this._tempPosition);r.x=Math.abs(r.x),r.y=Math.abs(r.y);const l=s*r.x;t=Math.max(t,l*2);const c=W.clamp(t*.5*r.y-s*r.x,0,Number.MAX_SAFE_INTEGER),h=D.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(c,l);this.createCollider(e,h)}async addMeshCollider(e,t,s,o){var r,l,c;let h=t.geometry;if(!h){rt&&console.warn("Missing mesh geometry",t.name);return}(l=(r=h.index)==null?void 0:r.array)!=null&&l.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),h=nO(h));let d=null;const u=h.getAttribute("position");if(u instanceof xv){const y=u.count;d=new Float32Array(y*3);for(let v=0;v<y;v++){const b=u.getX(v),_=u.getY(v),w=u.getZ(v);d[v*3]=b,d[v*3+1]=_,d[v*3+2]=w}}else d=u.array;if(await this.initialize(),!this.enabled){rt&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const p=(c=h.index)==null?void 0:c.array,g=e.gameObject.worldScale.clone();if(o&&g.multiply(o),Math.abs(g.x-1)>1e-4||Math.abs(g.y-1)>1e-4||Math.abs(g.z-1)>1e-4){const y=`${h.uuid}_${g.x}_${g.y}_${g.z}_${s}`;if(this._meshCache.has(y))rt&&console.warn("Use cached mesh collider"),d=this._meshCache.get(y);else{(rt||F())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${g.x}, ${g.y}, ${g.z})`);const v=new Float32Array(d.length);for(let b=0;b<d.length;b+=3)v[b]=d[b]*g.x,v[b+1]=d[b+1]*g.y,v[b+2]=d[b+2]*g.z;d=v,this._meshCache.set(y,v)}}const f=s?D.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(d):D.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(d,p);f&&this.createCollider(e,f)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,s=e[Zt];if(s&&t){if(t.bounciness!==void 0&&s.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case bt.Average:s.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:s.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:s.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:s.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&s.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case bt.Average:s.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:s.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:s.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:s.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[Zt]:null}getComponent(e){return e?e[yi]:null}createCollider(e,t){var s;if(!this.world)throw new Error("Physics world not initialized");const o=this._tempMatrix;let r;e.attachedRigidbody?r=this.getRigidbody(e,this._tempMatrix):(rt&&console.log("Create collider without rigidbody",e.name),o.makeRotationFromQuaternion(Se(e.gameObject)),o.setPosition(ee(e.gameObject))),o.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 l=e.sharedMaterial;if(l){if(l.bounciness!==void 0&&t.setRestitution(l.bounciness),l.bounceCombine!==void 0)switch(l.bounceCombine){case bt.Average:t.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:t.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:t.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:t.setRestitutionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(l.dynamicFriction!==void 0&&t.setFriction(l.dynamicFriction),l.frictionCombine!==void 0)switch(l.frictionCombine){case bt.Average:t.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:t.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:t.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:t.setFrictionCombineRule(D.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}((s=e.attachedRigidbody)==null?void 0:s.autoMass)===!1&&(t.setDensity(1e-6),t.setMass(1e-6));try{const c=this.world.createCollider(t,r);return c[yi]=e,e[Zt]=c,c.setActiveEvents(D.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),c.setActiveCollisionTypes(D.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(c),this.updateColliderCollisionGroups(e),c}catch(c){return console.error('Error creating collider "'+e.name+`"
1529
- Error:`,c),null}}updateColliderCollisionGroups(e){const t=e[Zt],s=e.membership;let o=0;if(s==null)o=65535;else for(let c=0;c<s.length;c++){const h=s[c];h>31?console.error(`Rapier only supports 32 layers, layer ${h} is not supported`):o|=1<<Math.floor(h)}const r=e.filter;let l=0;if(r==null)l=65535;else for(let c=0;c<r.length;c++){const h=r[c];h>31?console.error(`Rapier only supports 32 layers, layer ${h} is not supported`):l|=1<<Math.floor(h)}t.setCollisionGroups(o<<16|l)}getRigidbody(e,t){if(!this.world)throw new Error("Physics world not initialized");let s=null;if(e.attachedRigidbody){const o=e.attachedRigidbody;if(s=o[Zt],!s){const r=o.isKinematic&&!Jy;rt&&console.log("Create rigidbody",r);const l=r?D.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():D.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),c=ee(e.attachedRigidbody.gameObject);l.setTranslation(c.x,c.y,c.z),l.setRotation(Se(e.attachedRigidbody.gameObject)),l.centerOfMass=new D.RAPIER_PHYSICS.MODULE.Vector3(o.centerOfMass.x,o.centerOfMass.y,o.centerOfMass.z),s=this.world.createRigidBody(l),this.bodies.push(s),this.objects.push(o)}s[yi]=o,o[Zt]=s,this.internalUpdateRigidbodyProperties(o,s),this.getRigidbodyRelativeMatrix(e.gameObject,o.gameObject,t),e[HS]=s}else{const o=D.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),r=ee(e.gameObject);o.setTranslation(r.x,r.y,r.z),o.setRotation(Se(e.gameObject)),s=this.world.createRigidBody(o),t.identity(),s[yi]=null}return s}internal_getRigidbody(e){return e.isCollider===!0?e[HS]:e[Zt]}internalUpdateColliderProperties(e,t){const s=t.shape;let o=!1;switch(s.type){case D.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const g=s,f=e,y=e.gameObject,v=Ge(y,this._tempPosition),b=Math.abs(f.radius*v.x);o=g.radius!==b,g.radius=b,o&&t.setShape(g);break}case D.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const r=s,l=e,c=e.gameObject,h=Ge(c,this._tempPosition),d=Math.abs(l.size.x*.5*h.x),u=Math.abs(l.size.y*.5*h.y),p=Math.abs(l.size.z*.5*h.z);o=r.halfExtents.x!==d||r.halfExtents.y!==u||r.halfExtents.z!==p,r.halfExtents.x=d,r.halfExtents.y=u,r.halfExtents.z=p,o&&t.setShape(r);break}if(o){const r=e.attachedRigidbody;if(r!=null&&r.autoMass){const l=this.getBody(r);l?.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 s=0;s<t.numColliders();s++)t.collider(s).setDensity(1);t.recomputeMassPropertiesFromColliders()}else{t.setAdditionalMass(e.mass,!1);for(let s=0;s<t.numColliders();s++)t.collider(s).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(D.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(D.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new D.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else e!==void 0&&(this.world.timestep=W.lerp(this.world.timestep,e,.8));try{this.world.step(this.eventQueue)}catch(t){console.warn("Error running physics step",t)}this._isUpdatingPhysicsWorld=!1}}postStep(){this.world&&this.enabled&&(this._isUpdatingPhysicsWorld=!0,this.syncObjects(),this._isUpdatingPhysicsWorld=!1,this.eventQueue&&!this.collisionHandler&&(this.collisionHandler=new SL(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){var t,s,o,r;if(rt||Jy||xL||this.debugRenderColliders===!0){if(!this.lines){const c=new wv({color:7855479,fog:!1}),h=new Ns;this.lines=new _v(h,c),this.lines.layers.disableAll(),this.lines.layers.enable(2)}this.lines.parent!==((t=this.context)==null?void 0:t.scene)&&((s=this.context)==null||s.scene.add(this.lines));const l=e.debugRender();this.lines.geometry.setAttribute("position",new yt(l.vertices,3)),this.lines.geometry.setAttribute("color",new yt(l.colors,4)),(this.context.time.frame%30===0||((o=this.lines.geometry.boundingSphere)==null?void 0:o.radius)===0)&&this.lines.geometry.computeBoundingSphere()}else this.lines&&((r=this.context)==null||r.scene.remove(this.lines))}syncObjects(){if(!Jy)for(let e=0;e<this.bodies.length;e++){const t=this.objects[e],s=this.bodies[e],o=t;if(o?.isCollider===!0&&!o.attachedRigidbody){const h=s.parent();h?this.syncPhysicsBody(t.gameObject,h,!0,!0):this.syncPhysicsBody(t.gameObject,s,!0,!0);continue}const r=s.translation(),l=s.rotation();if(Number.isNaN(r.x)||Number.isNaN(l.x)){!o.__COLLIDER_NAN&&F()&&(console.warn("Collider has NaN values",o.name,o.gameObject,s),o.__COLLIDER_NAN=!0);continue}const c=t.center;if(c&&c.isVector3){this._tempQuaternion.set(l.x,l.y,l.z,l.w);const h=this._tempPosition.copy(c).applyQuaternion(this._tempQuaternion),d=Ge(t.gameObject);h.multiply(d),r.x-=h.x,r.y-=h.y,r.z-=h.z}pr(t.gameObject,r.x,r.y,r.z),Jm(t.gameObject,l.x,l.y,l.z,l.w)}}syncPhysicsBody(e,t,s,o){if(t instanceof D.RAPIER_PHYSICS.MODULE.RigidBody){const r=ee(e,this._tempPosition),l=Se(e,this._tempQuaternion);switch(t.bodyType()){case D.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case D.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case D.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicVelocityBased:s&&t.setNextKinematicTranslation(r),o&&t.setNextKinematicRotation(l);break;default:s&&t.setTranslation(r,!1),o&&t.setRotation(l,!1);break}}else if(t instanceof D.RAPIER_PHYSICS.MODULE.Collider){e.matrixWorldNeedsUpdate&&e.updateWorldMatrix(!0,!1),e.matrixWorld.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const r=this._tempPosition,l=this._tempQuaternion,c=t[yi];if(this.tryApplyCenter(c,r),s){const h=t.translation();(h.x!==r.x||h.y!==r.y||h.z!==r.z)&&t.setTranslation(r)}if(o){const h=t.rotation();(h.x!==l.x||h.y!==l.y||h.z!==l.z||h.w!==l.w)&&t.setRotation(l)}}}tryApplyCenter(e,t){const s=e.center;s&&e.gameObject&&(s.x!==0||s.y!==0||s.z!==0)&&(this._tempCenterPos.x=s.x,this._tempCenterPos.y=s.y,this._tempCenterPos.z=s.z,Ge(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(Se(e.gameObject,this._tempCenterQuaternion),this._tempCenterPos.applyQuaternion(this._tempCenterQuaternion)),t.x+=this._tempCenterPos.x,t.y+=this._tempCenterPos.y,t.z+=this._tempCenterPos.z)}getRigidbodyRelativeMatrix(e,t,s,o){if(o===void 0&&(o=mm._matricesBuffer,o.length=0),e===t){const r=Ge(e,this._tempPosition);s.makeScale(r.x,r.y,r.z);for(let l=o.length-1;l>=0;l--)s.multiply(o[l]);return s}return o.push(e.matrix),e.parent&&this.getRigidbodyRelativeMatrix(e.parent,t,s,o),s}addFixedJoint(e,t){if(!this.world){console.error("Physics world not initialized");return}const s=e[Zt],o=t[Zt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const r=D.RAPIER_PHYSICS.MODULE.JointData.fixed(mm.centerConnectionPos,mm.centerConnectionRot,this._tempPosition,this._tempQuaternion),l=this.world.createImpulseJoint(r,s,o,!0);rt&&console.log("ADD FIXED JOINT",l)}addHingeJoint(e,t,s,o){if(!this.world){console.error("Physics world not initialized");return}const r=e[Zt],l=t[Zt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const c=D.RAPIER_PHYSICS.MODULE.JointData.revolute(s,this._tempPosition,o),h=this.world.createImpulseJoint(c,r,l,!0);rt&&console.log("ADD HINGE JOINT",h)}calculateJointRelativeMatrices(e,t,s){e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);const o=e.matrixWorld,r=t.matrixWorld;o.elements[0]=1,o.elements[5]=1,o.elements[10]=1,r.elements[0]=1,r.elements[5]=1,r.elements[10]=1,s.copy(r).premultiply(o.invert()).invert()}};a(qh,"_didLoadPhysicsEngine",!1),a(qh,"_matricesBuffer",[]),a(qh,"centerConnectionPos",{x:0,y:0,z:0}),a(qh,"centerConnectionRot",{x:0,y:0,z:0,w:1});let $S=qh;class SL{constructor(e,t){a(this,"world"),a(this,"eventQueue"),a(this,"activeCollisions",[]),a(this,"activeCollisionsStay",[]),a(this,"activeTriggers",[]),this.world=e,this.eventQueue=t}handleCollisionEvents(){this.eventQueue&&this.world&&this.eventQueue.drainCollisionEvents((e,t,s)=>{const o=this.world.getCollider(e),r=this.world.getCollider(t);if(!o||!r)return;const l=o[yi],c=r[yi];ev&&console.log("EVT",l.name,c.name,s,o,r),l&&c&&(s?(this.onCollisionStarted(l,o,c,r),this.onCollisionStarted(c,r,l,o)):(this.onCollisionEnded(l,c),this.onCollisionEnded(c,l)))})}update(){this.onHandleCollisionStay()}onCollisionStarted(e,t,s,o){let r=null;if(e.isTrigger||s.isTrigger)Or(e.gameObject,l=>{l.onTriggerEnter&&!l.destroyed&&l.onTriggerEnter(s),this.activeTriggers.push({collider:e,component:l,otherCollider:s})});else{const l=e.gameObject;this.world.contactPair(t,o,(c,h)=>{Or(l,d=>{var u;if(d.destroyed)return;const p=d.onCollisionEnter||d.onCollisionStay||d.onCollisionExit;if(p||ev){if(!r){const g=[],f=c.normal();s instanceof jo&&s.convex&&(f.x=-f.x,f.y=-f.y,f.z=-f.z);for(let y=0;y<c.numSolverContacts();y++){const v=c.solverContactPoint(y),b=c.contactImpulse(y);if(v){const _=c.contactDist(y),w=c.solverContactFriction(y),x=c.solverContactTangentVelocity(y),M=new yx(v,_,f,b,w,x);g.push(M),ev&&q.DrawDirection(v,f,16711680,3,!0)}}r=new vx(l,s,g)}if(p){const g={collider:e,component:d,collision:r};this.activeCollisions.push(g),d.onCollisionStay&&this.activeCollisionsStay.push(g),(u=d.onCollisionEnter)==null||u.call(d,r)}}})})}}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 s=e.collision;t.onCollisionStay(s)}}for(const e of this.activeTriggers){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onTriggerStay){const s=e.otherCollider;if(s.destroyed)continue;t.onTriggerStay(s)}}}onCollisionEnded(e,t){if(!(e.destroyed||t.destroyed)){for(let s=0;s<this.activeCollisions.length;s++){const o=this.activeCollisions[s],r=o.collider;if(r.destroyed||o.collision.collider.destroyed){this.activeCollisions.splice(s,1),s--;continue}if(r===e&&o.collision.collider===t){const l=o.component;if(this.activeCollisions.splice(s,1),s--,l.activeAndEnabled&&l.onCollisionExit){const c=o.collision;l.onCollisionExit(c)}}}for(let s=0;s<this.activeCollisionsStay.length;s++){const o=this.activeCollisionsStay[s],r=o.collider;if(r.destroyed||o.collision.collider.destroyed){this.activeCollisionsStay.splice(s,1),s--;continue}if(r===e&&o.collision.collider===t){const l=o.component;if(this.activeCollisionsStay.splice(s,1),s--,l.activeAndEnabled&&l.onCollisionExit){const c=o.collision;l.onCollisionExit(c)}}}for(let s=0;s<this.activeTriggers.length;s++){const o=this.activeTriggers[s],r=o.collider;if(r.destroyed||o.otherCollider.destroyed){this.activeTriggers.splice(s,1),s--;continue}if(r===e&&o.otherCollider===t){const l=o.component;if(this.activeTriggers.splice(s,1),s--,l.activeAndEnabled&&l.onTriggerExit){const c=o.otherCollider;l.onTriggerExit(c)}}}}}}class CL{static async createComparisonScene(e){const{files:t}=e,s=await Promise.all(t.map(y=>new le(y).loadAssetAsync())),o=new bi;let r=0;for(const y of s)if(y instanceof A){y.position.y=r,o.add(y);const v=ei([y]);r+=v.getSize(new S).y,r+=.1}const l=new we(20);o.add(l);const c=e.environment||"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/studio_small_09_1k.exr";{let y=null;if(c.endsWith(".hdr")){const v=(await import("./three-examples-DuVhxqft.min.js").then(b=>b.RGBELoader$1)).RGBELoader;y=new v}else if(c.endsWith(".exr")){const v=(await import("./three-examples-DuVhxqft.min.js").then(b=>b.EXRLoader$1)).EXRLoader;y=new v}if(y){const v=await y.loadAsync(c).catch(b=>(console.error(b),null));v&&(v.mapping=Sn,v.needsUpdate=!0,o.background=v,o.environment=v,o.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",c)}const h=ei(o.children),d=h.getCenter(new S),u=h.getSize(new S),p=Math.max(u.x,u.y,u.z)/(2*Math.tan(Math.PI*l.fov/360));l.position.set(d.x,d.y,p),l.lookAt(d);const g=new Iv(l,e.domElement||document.body);g.target=d,g.update();const f=(e.domElement||document.body).getBoundingClientRect();return l.aspect=f.width/f.height,l.updateProjectionMatrix(),{scene:o,camera:l}}}let iv=0;function GS(n){n?iv++:iv--}function PL(){return iv>0}const OL={binary:!0,animations:!0};async function kL(n){if(!n.context)throw new Error("No context provided to exportAsGLTF");n.scene||(n.scene=n.context.scene);const e={...OL,...n},{context:t}=e,s=new Lv;s.register(c=>new Xx(c)),s.register(c=>new nE(c)),s.register(c=>new Bx(c)),r0(s,e.context);const o={binary:e.binary,animations:RL(t,e.scene,[])},r=new ML;console.debug("Exporting GLTF",o),r.onBeforeExport(e),GS(!0);const l=await s.parseAsync(e.scene,o).catch(c=>(console.error(c),null));if(GS(!1),r.onAfterExport(e),!l)throw new Error("Failed to export GLTF");if(e.downloadAs!=null){let c=null;if(l instanceof ArrayBuffer?c=new Blob([l],{type:"application/octet-stream"}):console.error("Can not download GLTF as a blob",l),c){const h=URL.createObjectURL(c),d=document.createElement("a");d.href=h;let u=e.downloadAs;!u.endsWith(".glb")&&!u.endsWith(".gltf")&&(u+=e.binary?".glb":".gltf"),d.download=u,d.click()}}return l}const qS=Symbol("needle:weight");class ML{constructor(){a(this,"_undo",[])}onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const s=Ua.tryGetActionsFromMixer(t);if(s)for(let o=0;o<s.length;o++){const r=s[o];r[qS]=r.weight,r.weight=0,this._undo.push(()=>{r.weight=r[qS]})}t.update(0)}),e.context.scene.traverse(t=>{if(!t0(t)){const s=t.parent;s&&(t.removeFromParent(),this._undo.push(()=>s.add(t)))}})}onAfterExport(e){this._undo.forEach(t=>t()),this._undo.length=0}}function RL(n,e,t){n.animations.mixers.forEach(o=>{const r=Ua.tryGetActionsFromMixer(o);if(r)for(let l=0;l<r.length;l++){const c=r[l].getClip();t.push(c)}}),Array.isArray(e)||(e=[e]);for(const o of e)Ua.tryGetAnimationClipsFromObjectHierarchy(o,t);const s=new Set(t);return Array.from(s)}const XS="needle-button",sv=F();var ca,ha,da,vi,js,El,im,QS,YS,sm;class nv extends HTMLElement{constructor(){super(),Fs(this,im),Fs(this,ca),Fs(this,ha),Fs(this,da),Fs(this,vi),Fs(this,js),Fs(this,El),Fs(this,sm,e=>{sv&&console.log("Needle Button clicked"),!e.defaultPrevented&&fe(this,vi)&&fe(this,vi).click()}),this.removeEventListener("click",fe(this,sm)),this.addEventListener("click",fe(this,sm))}attributeChangedCallback(e,t,s){sd(this,im,QS).call(this)}}ca=new WeakMap,ha=new WeakMap,da=new WeakMap,vi=new WeakMap,js=new WeakMap,El=new WeakMap,im=new WeakSet,QS=function(){var n,e;if((n=fe(this,vi))==null||n.remove(),this.getAttribute("ar")!=null)fe(this,js)??Us(this,js,new al),Us(this,vi,fe(this,js).createARButton());else if(this.getAttribute("vr")!=null)fe(this,js)??Us(this,js,new al),Us(this,vi,fe(this,js).createVRButton());else if(this.getAttribute("quicklook")!=null)fe(this,js)??Us(this,js,new al),Us(this,vi,fe(this,js).createQuicklookButton());else{sv?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}fe(this,ca)??Us(this,ca,this.attachShadow({mode:"open"})),fe(this,ha)??Us(this,ha,document.createElement("slot")),fe(this,da)??Us(this,da,document.createElement("style")),fe(this,da).innerHTML=`
1530
- button {
1531
- all: initial;
1532
- cursor: inherit;
1533
- color: inherit;
1534
- font-family: inherit;
1535
- gap: inherit;
1536
- white-space: nowrap;
1537
- }
1538
- `,this.getAttribute("unstyled")!=null||(fe(this,da).innerHTML+=`
1539
- :host {
1540
- display: inline-block;
1541
- background: rgba(255, 255, 255, .8);
1542
- backdrop-filter: blur(10px);
1543
- width: fit-content;
1544
- transition: background .2s;
1545
-
1546
- cursor: pointer;
1547
- padding: 0.4rem .5rem;
1548
- border-radius: 0.8rem;
1549
- color: black;
1550
- background: rgba(245, 245, 245, .8);
1551
- outline: rgba(0,0,0,.05) 1px solid;
1552
- }
1553
- :host(:hover) {
1554
- background: rgba(255, 255, 255, 1);
1555
- transition: background .2s;
1556
- }
1557
- slot {
1558
- display: flex;
1559
- align-items: center;
1560
- justify-content: center;
1561
- gap: .5rem;
1562
- }
1563
- `),fe(this,ha).innerHTML=fe(this,vi).innerHTML,fe(this,ha).style.cssText="display: flex; align-items: center; justify-content: center;",fe(this,vi).innerHTML=fe(this,ha).outerHTML,fe(this,ca).innerHTML=fe(this,vi).outerHTML,fe(this,ca).prepend(fe(this,da)),ou(gf,{element:fe(this,ca)}),(e=fe(this,El))==null||e.disconnect(),fe(this,El)??Us(this,El,new MutationObserver(()=>sd(this,im,YS).call(this))),fe(this,El).observe(fe(this,vi),{attributes:!0}),sv&&console.log("Needle Button updated")},YS=function(){fe(this,vi)&&(fe(this,vi).style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))},sm=new WeakMap,a(nv,"observedAttributes",["ar","vr","quicklook"]),typeof window<"u"&&!window.customElements.get(XS)&&window.customElements.define(XS,nv);const Xh=C("debugavatar");class ov{constructor(e,t,s,o){a(this,"root"),a(this,"head"),a(this,"leftHand"),a(this,"rigthHand");var r;this.root=e,this.head=t,this.leftHand=s,this.rigthHand=o,(r=this.root)==null||r.traverse(l=>l.layers.set(2))}get isValid(){return this.head!==null&&this.head!==void 0}}class KS{constructor(){a(this,"avatarRegistryUrl",null)}async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let s=null;if(typeof t=="string"){if(s=await this.loadAvatar(e,t),!s){const r=new Bs;s=P.instantiate(wa(t,e.scene),r)}}else s=t;if(!s)return null;const o=this.findAvatar(s);return o.isValid?(Xh&&console.log("[Custom Avatar] valid config",t,Xh?o:""),o):(console.warn("[Custom Avatar] config isn't valid",t,Xh?o:""),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(Xh&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const o=await fetch("./"+t);let r=null;if(o.ok){const c=await o.blob();c&&(r=await c.arrayBuffer())}if(!r)return null;const l=await _s().parseSync(e,r,null,0);return l?.scene??null}const s=new On;return Sf(s,e),new Promise((o,r)=>{const l=this.avatarRegistryUrl+"/"+t;s.load(l,async c=>{await _s().createBuiltinComponents(e,l,c,null,void 0),o(c.scene)},c=>{Xh&&console.log("[Custom Avatar] "+c.loaded/c.total*100+"% loaded of "+c.total/1024+"kB")},c=>{console.error("[Custom Avatar] Error when loading: "+c),o(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let s=t;s.children.length==1&&(s=e.children[0]);let o=this.findAvatarPart(s,["head"]);const r=this.findAvatarPart(s,["left","hand"]),l=this.findAvatarPart(s,["right","hand"]);if(!o){o=t;const c=new S;new _i().setFromObject(o).getSize(c);const h=Math.max(c.x,c.y,c.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&o.scale.multiplyScalar(1/h*.3)}return new ov(t,o,r,l)}findAvatarPart(e,t){const s=e.name.toLowerCase();let o=!0;for(const r of t){if(!o)break;s.indexOf(r)===-1&&(o=!1)}if(o)return e;if(e.children)for(const r of e.children){const l=this.findAvatarPart(r,t);if(l)return l}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class ZS{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class JS{}const TL=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ve,ActionCollection:T1,ActionModel:Os,AlignmentConstraint:Oc,Animation:jt,AnimationCurve:hh,AnimationExtension:Zu,AnimationTrackHandler:$p,Animator:Ot,AnimatorController:hs,Antialiasing:mh,AudioExtension:pa,AudioListener:Bn,AudioSource:ts,AudioTrackHandler:Gp,Avatar:Wo,AvatarBlink_Simple:Lr,AvatarEyeLook_Rotation:Uf,AvatarLoader:KS,AvatarMarker:ai,AvatarModel:ov,Avatar_Brain_LookAt:jc,Avatar_MouthShapes:Dc,Avatar_MustacheShake:Df,Avatar_POI:Fn,AxesHelper:Ga,BaseUIComponent:ls,BasicIKConstraint:Nf,BehaviorExtension:z0,BehaviorModel:Yt,BloomEffect:Mp,BoxCollider:Tu,BoxGizmo:Xr,BoxHelperComponent:Lo,Button:to,CallInfo:Dn,Camera:ri,CameraTargetReachedEvent:Lc,Canvas:pl,CanvasGroup:qo,CapsuleCollider:Un,ChangeMaterialOnClick:P0,ChangeTransformOnClick:Wr,CharacterController:jr,CharacterControllerInput:Nn,ChromaticAberration:gh,Collider:ci,ColorAdjustments:er,ColorBySpeedModule:vl,ColorOverLifetimeModule:_p,ContactShadows:Uc,ControlTrackHandler:qp,CustomBranding:qr,Deletable:Gf,DeleteBox:Eu,DepthOfField:Es,DeviceFlag:Au,DocumentExtension:ZS,DragControls:Ur,DropListener:Wn,Duplicatable:Zf,EffectWrapper:fh,EmissionModule:Kn,EmphasizeOnClick:ol,EnvironmentScene:Zp,EventList:xe,EventListEvent:vu,EventSystem:Jt,EventTrigger:Du,FieldWithDefault:s1,FixedJoint:ny,Fog:gl,GltfExport:p0,GltfExportBox:d0,Gradient:Yr,Graphic:nh,GraphicRaycaster:wu,GridHelper:fl,GridLayoutGroup:Q0,GroundProjectedEnv:Ys,GroupActionModel:Fo,HideOnStart:ep,HingeJoint:ah,HorizontalLayoutGroup:X0,Image:Ol,InheritVelocityModule:dy,InputField:Uy,InstanceHandle:c0,InstancingHandler:Wu,Interactable:$f,Keyframe:gi,LODGroup:ch,LODModel:yl,Light:mi,LimitVelocityOverLifetimeModule:mt,LogStats:Hf,LookAt:zy,LookAtConstraint:Ar,MainModule:Ut,MaskableGraphic:oh,MeshCollider:jo,MeshRenderer:$c,MinMaxCurve:Z,MinMaxGradient:Kr,NeedleMenu:ln,NestedGltf:mp,Networking:ly,NoiseModule:Ce,ObjectRaycaster:Ai,OffsetConstraint:Qr,OpenURL:kl,OrbitControls:_e,Outline:ul,Padding:Gr,ParticleBurst:bp,ParticleSubEmitter:uy,ParticleSystem:ph,ParticleSystemRenderer:rs,PhysicsExtension:N0,PixelationEffect:yh,PlayAnimationOnClick:Qc,PlayAudioOnClick:Uo,PlayableDirector:Pl,PlayerColor:Dl,PointerEventData:td,PostProcessingHandler:Ry,PreliminaryAction:rl,PreliminaryTrigger:Yc,RawImage:Yp,Rect:U1,RectTransform:Rs,ReflectionProbe:Vc,RegisteredAnimationInfo:cr,RemoteSkybox:Dp,Renderer:Di,RendererLightmap:Vu,Rigidbody:ht,RotationBySpeedModule:os,RotationOverLifetimeModule:Ts,SceneSwitcher:Ze,ScreenCapture:ir,ScreenSpaceAmbientOcclusion:Zn,ScreenSpaceAmbientOcclusionN8:As,SetActiveOnClick:O0,ShadowCatcher:wh,ShapeModule:hy,SharpeningEffect:bh,SignalAsset:Hp,SignalReceiver:Mh,SignalReceiverEvent:kh,SignalTrackHandler:Th,Size:F1,SizeBySpeedModule:fi,SizeOverLifetimeModule:Zr,SkinnedMeshRenderer:h0,SmoothFollow:Up,SpatialGrabRaycaster:Ac,SpatialHtml:Ih,SpatialTrigger:zp,SpatialTriggerReceiver:mn,SpectatorCamera:Np,SphereCollider:qa,Sprite:Gn,SpriteData:cl,SpriteRenderer:ui,SpriteSheet:ll,SubEmitterSystem:Cp,SyncedCamera:Ey,SyncedRoom:Is,SyncedTransform:Zs,TapGestureTrigger:R0,TeleportTarget:ap,TestRunner:Ly,TestSimulateUserData:jy,Text:Ft,TextBuilder:G0,TextExtension:up,TextureSheetAnimationModule:zt,TiltShiftEffect:pn,ToneMappingEffect:_l,TrailModule:Ne,TransformData:dt,TransformGizmo:na,TriggerBuilder:Rt,TriggerModel:nl,UIRaycastUtils:Mf,UIRootComponent:th,USDZExporter:dn,USDZText:$r,USDZUIExtension:Z0,UsageMarker:zc,VariantAction:S0,VelocityOverLifetimeModule:qe,VerticalLayoutGroup:q0,VideoPlayer:gt,Vignette:ia,VisibilityAction:Kc,Voip:Io,Volume:Sl,VolumeParameter:N,VolumeProfile:Pp,WebARCameraBackground:Bh,WebARSessionRoot:zo,WebXR:lp,WebXRImageTracking:Fh,WebXRImageTrackingModel:so,WebXRPlaneTracking:no,WebXRTrackedImage:Hy,XRControllerFollow:io,XRControllerModel:cn,XRControllerMovement:Fi,XRFlag:is,XRRig:tm,XRState:Ii,__Ignore:JS},Symbol.toStringTag,{value:"Module"})),nm=C("debugmissingcamera");pe.registerCallback(me.MissingCamera,n=>{var e,t,s,o;nm&&console.warn("Creating missing camera");const r=n.context.scene,l=new we;l.name="Default Fallback Camera",r.add(l);const c=new ri;if(c.sourceId=((t=(e=n.files)==null?void 0:e[0])==null?void 0:t.src)??"unknown",c.fieldOfView=35,n.context.domElement.getAttribute("transparent")!=null)c.clearFlags=To.Uninitialized;else if((s=n.context.domElement.getAttribute("skybox-image"))!=null&&s.length||(o=n.context.domElement.getAttribute("background-image"))!=null&&o.length||n.context.lightmaps.tryGetSkybox(c.sourceId))c.clearFlags=To.Skybox,c.backgroundBlurriness=.2;else{if(c.clearFlags=To.SolidColor,!n.context.domElement.getAttribute("background-color")){let u="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(u="#1f1f1f"),r.background=new ae(u)}if(!r.environment){const u=new LP(n.context.renderer),p=new Zp("neutral");r.environment=u.fromScene(p,.025).texture}}const h=xr(l,c,!0);l.position.x=0,l.position.y=1,l.position.z=2;const d=n.context.domElement;return d?.cameraControls!=!1&&eC(n.context,h),h}),pe.registerCallback(me.ContextCreated,n=>{if(!n.context.mainCamera){nm&&console.log("Will not auto-fit because a default camera exists");return}const e=n.context.domElement;if(e?.cameraControls==!0){const t=pb(n.context.mainCamera);if(t?.isCameraController==!0){nm&&console.log("Will not auto-fit because a camera controller exists");return}eC(n.context)}});function eC(n,e){e=e??n.mainCameraComponent;const t=e?.gameObject;if(nm&&console.log("Creating default camera controls",e?.name),t){const s=mc(t,_e);s.sourceId=e?.sourceId??"unknown";const o=n.domElement.getAttribute("auto-rotate");if(s.autoRotate=o!=null&&o!="0"&&o?.toLowerCase()!="false",s.autoRotateSpeed=.5,s.autoFit=!0,s.autoRotate&&o){const r=parseFloat(o);isNaN(r)||(s.autoRotateSpeed=r)}}else console.warn("Missing camera object, can not add orbit controls")}pe.registerCallback(me.ContextCreated,n=>{const e=n.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&n.files)for(const t of n.files)P.foreachComponent(t.file.scene,s=>{if(s.enabled!==!1){if(s instanceof jt&&s.playAutomatically||s instanceof Ot||s instanceof Pl&&s.playOnAwake===!0)return!0;if(s instanceof jt)return s.playAutomatically=!0,!0;if(s instanceof Pl)return s.playOnAwake=!0,!0}},!0)!==!0&&Ua.assignAnimationsFromFile(t.file,{createAnimationComponent:(s,o)=>Mi(s,jt)})});class EL extends mO{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-Cdfpaq5W.js",import.meta.url),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,s={}){return new Promise((o,r)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=d=>{r(new Error(`[GenerateMeshBVHWorker] ${d.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=d=>{const{data:u}=d;if(u.error)r(new Error(u.error)),e.onmessage=null;else if(u.serialized){const{serialized:p,position:g}=u,f=gO.deserialize(p,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},s);if(t.attributes.position.array=g,p.index)if(t.index)t.index.array=p.index;else{const v=new yt(p.index,1,!1);t.setIndex(v)}y.setBoundingBox&&(t.boundingBox=f.getBoundingBox(new _i)),s.onProgress&&s.onProgress(u.progress),o(f),e.onmessage=null}else s.onProgress&&s.onProgress(u.progress)};const l=t.index?t.index.array:null,c=t.attributes.position.array,h=[c];l&&h.push(l),e.postMessage({index:l,position:c,options:{...s,onProgress:null,includedProgressCallback:!!s.onProgress,groups:[...t.groups]}},h.map(d=>d.buffer).filter(d=>typeof SharedArrayBuffer>"u"||!(d instanceof SharedArrayBuffer)))})}}const AL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:EL},Symbol.toStringTag,{value:"Module"}));export{MT as $physicsKey,ve as ActionBuilder,T1 as ActionCollection,Os as ActionModel,mw as Addressables,Oc as AlignmentConstraint,za as AmbientMode,jt as Animation,hh as AnimationCurve,Zu as AnimationExtension,$p as AnimationTrackHandler,Ua as AnimationUtils,Ot as Animator,Po as AnimatorConditionMode,hs as AnimatorController,Pf as AnimatorControllerParameterType,kc as AnimatorStateInfo,mh as Antialiasing,En as Application,x_ as AssetDatabase,le as AssetReference,pa as AudioExtension,Bn as AudioListener,ts as AudioSource,Gp as AudioTrackHandler,Wo as Avatar,Lr as AvatarBlink_Simple,Uf as AvatarEyeLook_Rotation,KS as AvatarLoader,ai as AvatarMarker,ov as AvatarModel,jc as Avatar_Brain_LookAt,Dc as Avatar_MouthShapes,Df as Avatar_MustacheShake,Fn as Avatar_POI,Na as Axes,Ga as AxesHelper,lg as BUILD_TIME,ls as BaseUIComponent,Nf as BasicIKConstraint,z0 as BehaviorExtension,Yt as BehaviorModel,kr as BlobStorage,Mp as BloomEffect,Tu as BoxCollider,Xr as BoxGizmo,Lo as BoxHelperComponent,to as Button,xo as ButtonsFactory,wx as CallDirection,Dn as CallInfo,ri as Camera,Lc as CameraTargetReachedEvent,pl as Canvas,qo as CanvasGroup,Un as CapsuleCollider,P0 as ChangeMaterialOnClick,Wr as ChangeTransformOnClick,jr as CharacterController,Nn as CharacterControllerInput,gh as ChromaticAberration,Si as CircularBuffer,To as ClearFlags,gn as ClipExtrapolation,ci as Collider,vx as Collision,fu as CollisionDetectionMode,er as ColorAdjustments,vl as ColorBySpeedModule,_p as ColorOverLifetimeModule,AR as Component,I as Component$1,lc as ComponentLifecycleEvents,TL as Components,n_ as ConnectionEvents,yx as ContactPoint,Uc as ContactShadows,J as Context,wR as ContextArgs,me as ContextEvent,pe as ContextRegistry,qp as ControlTrackHandler,qr as CustomBranding,$x as CustomShader,su as DefaultReflectionMode,Gf as Deletable,Eu as DeleteBox,Es as DepthOfField,Au as DeviceFlag,Y as DeviceUtilities,ZS as DocumentExtension,Ur as DragControls,Xf as DragMode,Wn as DropListener,Zf as Duplicatable,fh as EffectWrapper,Kn as EmissionModule,ol as EmphasizeOnClick,zS as EngineLoadingView,Zp as EnvironmentScene,xe as EventList,vu as EventListEvent,Jt as EventSystem,Du as EventTrigger,s1 as FieldWithDefault,lf as FileReference,bw as FileReferenceSerializer,KT as FileSpawnModel,Ax as File_Event,ny as FixedJoint,gl as Fog,Oe as FrameEvent,Cd as GENERATOR,P as GameObject,q as Gizmos,p0 as GltfExport,d0 as GltfExportBox,Yr as Gradient,nh as Graphic,wu as GraphicRaycaster,qi as Graphics,fl as GridHelper,Q0 as GridLayoutGroup,Ys as GroundProjectedEnv,Fo as GroupActionModel,Pu as HideFlags,ep as HideOnStart,ah as HingeJoint,X0 as HorizontalLayoutGroup,CM as HostData,Ol as Image,af as ImageReference,yw as ImageReferenceSerializer,dy as InheritVelocityModule,$b as Input,ii as InputEventQueue,Be as InputEvents,Uy as InputField,c0 as InstanceHandle,Wu as InstancingHandler,cs as InstancingUtil,j_ as InstantiateEvent,At as InstantiateIdProvider,Bs as InstantiateOptions,$f as Interactable,Dh as InternalScreenshotUtils,Qk as JoinedRoomResponse,Fk as KeyEventArgs,gi as Keyframe,ch as LODGroup,yl as LODModel,Yk as LeftRoomResponse,mi as Light,Mw as LightData,mt as LimitVelocityOverLifetimeModule,fL as LoadingElementOptions,Hf as LogStats,Ci as LogType,zy as LookAt,Ar as LookAtConstraint,D as MODULES,Ut as MainModule,Dy as MarkerType,oh as MaskableGraphic,W as Mathf,jo as MeshCollider,$c as MeshRenderer,Z as MinMaxCurve,Kr as MinMaxGradient,ic as NEKeyboardEvent,Rn as NEPointerEvent,nv as NeedleButtonElement,Zy as NeedleEngineHTMLElement,Yf as NeedleEngineModelLoader,ln as NeedleMenu,Od as NeedlePatchesKey,pg as NeedleXRController,ne as NeedleXRSession,a_ as NeedleXRSync,p_ as NeedleXRUtils,mp as NestedGltf,r_ as NetworkConnection,Js as NetworkedStreamEvents,id as NetworkedStreams,ly as Networking,B_ as NewInstanceModel,Ce as NoiseModule,Ai as ObjectRaycaster,vo as ObjectUtils,Qr as OffsetConstraint,yd as OneEuroFilter,qm as OneEuroFilterXYZ,kl as OpenURL,_e as OrbitControls,ul as Outline,o_ as OwnershipEvent,_g as OwnershipModel,Ca as PUBLIC_KEY,Gr as Padding,bp as ParticleBurst,uy as ParticleSubEmitter,ph as ParticleSystem,Jo as ParticleSystemBaseBehaviour,rs as ParticleSystemRenderer,vp as ParticleSystemShapeType,Ou as PeerHandle,i_ as PeerNetworking,Lg as Physics,N0 as PhysicsExtension,bt as PhysicsMaterialCombine,yh as PixelationEffect,Qc as PlayAnimationOnClick,Uo as PlayAudioOnClick,Pl as PlayableDirector,Dl as PlayerColor,ks as PlayerState,D1 as PlayerStateEvent,D0 as PlayerSync,Sw as PlayerView,Cw as PlayerViewManager,td as PointerEventData,Md as PointerType,ot as PostProcessingEffect,Ry as PostProcessingHandler,rl as PreliminaryAction,Yc as PreliminaryTrigger,Bo as PreviewHelper,vr as PrimitiveType,he as Progress,Nm as PromiseAllWithErrors,zm as PromiseErrorResult,ce as RGBAColor,$S as RapierPhysics,Yp as RawImage,$s as RaycastOptions,U1 as Rect,Rs as RectTransform,Vc as ReflectionProbe,cr as RegisteredAnimationInfo,Dp as RemoteSkybox,Mc as RenderTexture,hx as RenderTextureSerializer,Di as Renderer,kw as RendererData,Vu as RendererLightmap,ht as Rigidbody,Qe as RigidbodyConstraints,ie as RoomEvents,os as RotationBySpeedModule,Ts as RotationOverLifetimeModule,Fu as SceneLightSettings,Ze as SceneSwitcher,ir as ScreenCapture,Zn as ScreenSpaceAmbientOcclusion,As as ScreenSpaceAmbientOcclusionN8,ws as SendQueue,Zg as SerializationContext,O0 as SetActiveOnClick,wh as ShadowCatcher,hy as ShapeModule,bh as SharpeningEffect,Hp as SignalAsset,Mh as SignalReceiver,kh as SignalReceiverEvent,Th as SignalTrackHandler,F1 as Size,fi as SizeBySpeedModule,Zr as SizeOverLifetimeModule,h0 as SkinnedMeshRenderer,Up as SmoothFollow,Ac as SpatialGrabRaycaster,Ih as SpatialHtml,zp as SpatialTrigger,mn as SpatialTriggerReceiver,Np as SpectatorCamera,qa as SphereCollider,Ig as SphereIntersection,bx as SphereOverlapResult,Gn as Sprite,cl as SpriteData,ui as SpriteRenderer,ll as SpriteSheet,FR as StateMachineBehaviour,Lf as StreamEndedEvent,_x as StreamReceivedEvent,Cp as SubEmitterSystem,Ey as SyncedCamera,Is as SyncedRoom,Zs as SyncedTransform,R0 as TapGestureTrigger,ap as TeleportTarget,Ly as TestRunner,CL as TestSceneUtils,jy as TestSimulateUserData,Ft as Text,G0 as TextBuilder,up as TextExtension,zt as TextureSheetAnimationModule,pn as TiltShiftEffect,Tw as Time,_l as ToneMappingEffect,Rh as TrackHandler,Hi as TrackType,Ne as TrailModule,dt as TransformData,na as TransformGizmo,Rt as TriggerBuilder,nl as TriggerModel,R as TypeStore,Mf as UIRaycastUtils,th as UIRootComponent,m0 as USDDocument,di as USDObject,h1 as USDWriter,dn as USDZExporter,d1 as USDZExporter$1,$r as USDZText,Z0 as USDZUIExtension,dx as UriSerializer,zc as UsageMarker,Kk as UserJoinedOrLeftRoomModel,bs as VERSION,S0 as VariantAction,qe as VelocityOverLifetimeModule,q0 as VerticalLayoutGroup,gt as VideoPlayer,wo as ViewDevice,ia as Vignette,Kc as VisibilityAction,Io as Voip,Sl as Volume,N as VolumeParameter,Pp as VolumeProfile,JM as WaitForFrames,_w as WaitForPromise,cf as WaitForSeconds,oo as Watch,Bh as WebARCameraBackground,zo as WebARSessionRoot,lp as WebXR,al as WebXRButtonFactory,Fh as WebXRImageTracking,so as WebXRImageTrackingModel,no as WebXRPlaneTracking,Hy as WebXRTrackedImage,io as XRControllerFollow,cn as XRControllerModel,Fi as XRControllerMovement,is as XRFlag,tm as XRRig,Ii as XRState,tn as XRStateFlag,JS as __Ignore,k_ as __internalNotifyObjectDestroyed,Mn as activeInHierarchyFieldName,ib as addAttributeChangeCallback,Mi as addComponent,bE as addCustomExtensionPlugin,xr as addNewComponent,Pd as addPatch,Xd as apply,ER as applyHMRChanges,J_ as applyPrototypeExtensions,D_ as beginListenDestroy,U_ as beginListenInstantiate,yg as binaryIdentifierCasts,_R as build_scene_functions,fr as builtinComponentKeyName,Ky as calculateProgress01,ZO as clearMessages,rT as colorSerializer,V_ as compareAssociation,bu as componentSerializer,Pb as copyTexture,ex as createMotion,si as debugNet,sc as debugOwner,f1 as decompressGpuTexture,Hl as deepClone,fs as delay,$l as delayForFrames,Gd as deserializeObject,Ri as destroy,sw as destroyComponentInstance,Ix as determineMimeTypeFromExtension,Te as disposeObjectResources,en as disposeStream,tc as editorGuidKeyName,gr as enableSpatialConsole,lT as euler,uT as eventListSerializer,kL as exportAsGLTF,sf as findByGuid,vc as findObjectOfType,rw as findObjectsOfType,Dg as findResourceUsers,kb as fitObjectIntoVolume,Or as foreachComponent,Jd as foreachComponentEnumerator,pk as forward,nb as generateQRCode,F_ as generateSeed,ei as getBoundingBox,pb as getCameraController,Sr as getComponent,fc as getComponentInChildren,yc as getComponentInParent,gc as getComponents,ja as getComponentsInChildren,qd as getComponentsInParent,o1 as getFormattedDate,Pt as getIconElement,mf as getIconTexture,_s as getLoader,mc as getOrAddComponent,C as getParam,fk as getParentHierarchyPath,EO as getPath,$k as getPeerOptions,e_ as getPeerjsInstance,gM as getResourceUserCount,fb as getTempColor,ys as getTempQuaternion,Q as getTempVector,Wl as getUrlParams,Ob as getVisibleInCustomShadowRendering,_b as getWorldDirection,eg as getWorldEuler,ee as getWorldPosition,Se as getWorldQuaternion,wd as getWorldRotation,Ge as getWorldScale,Qs as hasCommercialLicense,Sc as hasIndieLicense,yu as hasPointerEventComponent,Xs as hasProLicense,Ab as hideDebugConsole,y1 as imageToCanvas,Fa as instantiate,qx as invokeLoadedImportPluginHooks,Hb as invokeXRSessionEnd,Vb as invokeXRSessionStart,aw as isActiveInHierarchy,Da as isActiveSelf,BO as isAndroidDevice,Cb as isAnimationAction,fx as isComponent,kO as isDebugMode,IO as isDesktop,Pr as isDestroyed,F as isDevEnvironment,pM as isDisposed,PL as isExporting,gx as isGLTFModel,Gv as isHostedOnGlitch,Cf as isHotReloadEnabled,RR as isHotReloading,jO as isIPad,Iw as isIconElement,$t as isLocalNetwork,UO as isMacOS,LO as isMobileDevice,FO as isMozillaXR,WO as isQuest,C_ as isResourceTrackingEnabled,NO as isSafari,Yd as isUsingInstancing,zO as isiOS,DO as isiPad,hL as loadAsset,Yy as loadSync,xd as logHierarchy,ok as lookAtInverse,Xl as lookAtObject,rk as lookAtScreenPoint,RO as makeId,Jv as makeIdFromRandomWords,Ps as makeNameSafe,lw as markAsInstancedRendered,VO as microphonePermissionsGranted,OO as nameof,Qv as nameofFactory,cx as objectSerializer,Bk as offXRSessionEnd,Dk as offXRSessionStart,ZR as onAfterRender,KR as onBeforeRender,QR as onClear,YR as onDestroy,nx as onInitialized,ox as onStart,rx as onUpdate,ug as onXRSessionEnd,kd as onXRSessionStart,LS as parseSync,Mb as placeOnSurface,sg as postprocessFBXMaterials,eT as prefix,Yv as pushState,TO as randomNumber,vg as registerBinaryType,lu as registerComponent,o0 as registerComponentExtension,as as registerCustomEffectType,r0 as registerExportExtensions,zu as registerExtensions,Xw as registerHotReloadType,cg as registerLoader,N_ as registerPrefabProvider,ew as registerPrototypeExtensions,RM as registerType,tb as relativePathPrefix,sb as removeAttributeChangeCallback,tf as removeComponent,_E as removeCustomImportExtensionType,Lk as removePatch,mo as resolveUrl,eb as sanitizeString,kS as saveImage,qI as screenshot,Wy as screenshot2,$g as sendDestroyed,m as serializable,q_ as serializeObject,Tr as serializeable,bc as setActive,lb as setAllowBalloonMessages,XO as setAllowOverlayMessages,bd as setAutoFitEnabled,Xm as setCameraController,hw as setDestroyed,Ck as setDevEnvironment,jg as setDisposable,Ba as setDontDestroy,Bm as setOrAddParamsToUrl,MO as setParam,Vl as setParamWithoutReload,Gk as setPeerOptions,uM as setResourceTrackingEnabled,Fm as setState,ig as setVisibleInCustomShadowRendering,tg as setWorldEuler,at as setWorldPosition,pr as setWorldPositionXYZ,Gi as setWorldQuaternion,Jm as setWorldQuaternionXYZW,Sb as setWorldRotation,Ql as setWorldRotationXYZ,Sa as setWorldScale,Zl as showBalloonError,De as showBalloonMessage,be as showBalloonWarning,ag as showDebugConsole,nk as slerp,uc as syncDestroy,j0 as syncField,Gg as syncInstantiate,yk as textureToCanvas,Zb as tryCastBinary,jx as tryDetermineMimetypeFromBinary,Lx as tryDetermineMimetypeFromURL,wa as tryFindObject,Jb as tryGetGuid,Qw as unregisterHotReloadType,Um as unwatchWrite,mb as useForAutoFit,kt as validate,gd as watchWrite};