@needle-tools/engine 4.12.0-next.dd87659 → 4.12.0-next.e42c144

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/components.needle.json +1 -1
  3. package/dist/generateMeshBVH.worker-iyfPIK6R.js +21 -0
  4. package/dist/{gltf-progressive-DZrY8VT6.min.js → gltf-progressive-BmSygnAC.min.js} +2 -2
  5. package/dist/{gltf-progressive-DgYz5BYa.js → gltf-progressive-DnLBuGK5.js} +24 -24
  6. package/dist/{gltf-progressive-DWcmTMCh.umd.cjs → gltf-progressive-Rs-ojtXy.umd.cjs} +1 -1
  7. package/dist/{loader.worker-Dip-PthR.js → loader.worker-DWzfDpAl.js} +4 -4
  8. package/dist/needle-engine.bundle-CW5U4a3u.umd.cjs +1647 -0
  9. package/dist/needle-engine.bundle-HNQiYV9e.min.js +1647 -0
  10. package/dist/{needle-engine.bundle-CiqX7AtA.js → needle-engine.bundle-qrrKb_xn.js} +8886 -8598
  11. package/dist/needle-engine.d.ts +142 -43
  12. package/dist/needle-engine.js +48 -48
  13. package/dist/needle-engine.min.js +1 -1
  14. package/dist/needle-engine.umd.cjs +1 -1
  15. package/dist/{postprocessing-DYDtB188.min.js → postprocessing-B5ksn9-G.min.js} +54 -54
  16. package/dist/{postprocessing-CMgoN5t5.umd.cjs → postprocessing-DZtb9Nnn.umd.cjs} +81 -81
  17. package/dist/{postprocessing-BTW9pD_s.js → postprocessing-__7s9wON.js} +450 -441
  18. package/dist/{three-DfMvBzXi.js → three-BCCkyCA5.js} +1 -7
  19. package/dist/{three-qj71I7J3.umd.cjs → three-Bf2NBxAw.umd.cjs} +2 -2
  20. package/dist/{three-B7CT31Bt.min.js → three-W7zWTcfP.min.js} +1 -1
  21. package/dist/{three-examples-CsW4_6LI.umd.cjs → three-examples-Dho7cuu4.umd.cjs} +4 -4
  22. package/dist/{three-examples-D1P7eEhn.min.js → three-examples-MsJjauyk.min.js} +10 -10
  23. package/dist/{three-examples-D1SK93ek.js → three-examples-y2GeYlze.js} +2 -20
  24. package/dist/{three-mesh-ui-C_uSB5dD.js → three-mesh-ui-3nSSizT4.js} +1 -1
  25. package/dist/{three-mesh-ui-LQ44s0AL.min.js → three-mesh-ui-CIez6qJQ.min.js} +1 -1
  26. package/dist/{three-mesh-ui-DpATDXwU.umd.cjs → three-mesh-ui-zsOOA5Pq.umd.cjs} +1 -1
  27. package/dist/{vendor-D0zoswDa.js → vendor-DMZcbVO1.js} +3707 -3527
  28. package/dist/vendor-sURMCFSI.min.js +1116 -0
  29. package/dist/{vendor-UCpFAwt1.umd.cjs → vendor-tyBvnMF-.umd.cjs} +39 -39
  30. package/lib/engine/codegen/register_types.js +0 -2
  31. package/lib/engine/codegen/register_types.js.map +1 -1
  32. package/lib/engine/debug/debug_console.js +403 -1
  33. package/lib/engine/debug/debug_console.js.map +1 -1
  34. package/lib/engine/engine_components.js +3 -3
  35. package/lib/engine/engine_components.js.map +1 -1
  36. package/lib/engine/engine_context.js +2 -0
  37. package/lib/engine/engine_context.js.map +1 -1
  38. package/lib/engine/engine_input.d.ts +5 -0
  39. package/lib/engine/engine_input.js +6 -0
  40. package/lib/engine/engine_input.js.map +1 -1
  41. package/lib/engine/engine_license.d.ts +18 -0
  42. package/lib/engine/engine_license.js +115 -18
  43. package/lib/engine/engine_license.js.map +1 -1
  44. package/lib/engine/engine_networking.js +5 -5
  45. package/lib/engine/engine_networking.js.map +1 -1
  46. package/lib/engine/engine_physics.js.map +1 -1
  47. package/lib/engine/engine_physics_rapier.js +1 -1
  48. package/lib/engine/engine_physics_rapier.js.map +1 -1
  49. package/lib/engine/engine_serialization_builtin_serializer.js +1 -1
  50. package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
  51. package/lib/engine/engine_utils.d.ts +4 -1
  52. package/lib/engine/engine_utils.js +28 -4
  53. package/lib/engine/engine_utils.js.map +1 -1
  54. package/lib/engine/extensions/extensions.d.ts +29 -7
  55. package/lib/engine/extensions/extensions.js.map +1 -1
  56. package/lib/engine/webcomponents/WebXRButtons.js +13 -5
  57. package/lib/engine/webcomponents/WebXRButtons.js.map +1 -1
  58. package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -5
  59. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  60. package/lib/engine/webcomponents/needle-engine.ar-overlay.js +4 -0
  61. package/lib/engine/webcomponents/needle-engine.ar-overlay.js.map +1 -1
  62. package/lib/engine/webcomponents/needle-engine.js +1 -1
  63. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  64. package/lib/engine/xr/NeedleXRSession.d.ts +1 -1
  65. package/lib/engine/xr/NeedleXRSession.js +101 -22
  66. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  67. package/lib/engine/xr/TempXRContext.js +12 -2
  68. package/lib/engine/xr/TempXRContext.js.map +1 -1
  69. package/lib/engine/xr/usdz.js +6 -2
  70. package/lib/engine/xr/usdz.js.map +1 -1
  71. package/lib/engine-components/AlignmentConstraint.d.ts +1 -2
  72. package/lib/engine-components/AlignmentConstraint.js +1 -2
  73. package/lib/engine-components/AlignmentConstraint.js.map +1 -1
  74. package/lib/engine-components/Animation.d.ts +2 -0
  75. package/lib/engine-components/Animation.js +2 -0
  76. package/lib/engine-components/Animation.js.map +1 -1
  77. package/lib/engine-components/Animator.d.ts +1 -0
  78. package/lib/engine-components/Animator.js +1 -0
  79. package/lib/engine-components/Animator.js.map +1 -1
  80. package/lib/engine-components/AudioListener.d.ts +1 -1
  81. package/lib/engine-components/AudioListener.js +1 -1
  82. package/lib/engine-components/AudioSource.d.ts +1 -1
  83. package/lib/engine-components/AudioSource.js +1 -1
  84. package/lib/engine-components/BasicIKConstraint.d.ts +8 -0
  85. package/lib/engine-components/BasicIKConstraint.js +8 -0
  86. package/lib/engine-components/BasicIKConstraint.js.map +1 -1
  87. package/lib/engine-components/BoxHelperComponent.d.ts +1 -0
  88. package/lib/engine-components/BoxHelperComponent.js +1 -0
  89. package/lib/engine-components/BoxHelperComponent.js.map +1 -1
  90. package/lib/engine-components/Camera.d.ts +2 -2
  91. package/lib/engine-components/Camera.js +6 -3
  92. package/lib/engine-components/Camera.js.map +1 -1
  93. package/lib/engine-components/CharacterController.d.ts +6 -2
  94. package/lib/engine-components/CharacterController.js +6 -2
  95. package/lib/engine-components/CharacterController.js.map +1 -1
  96. package/lib/engine-components/Collider.d.ts +2 -2
  97. package/lib/engine-components/Collider.js +1 -1
  98. package/lib/engine-components/Collider.js.map +1 -1
  99. package/lib/engine-components/Component.d.ts +2 -1
  100. package/lib/engine-components/Component.js +3 -2
  101. package/lib/engine-components/Component.js.map +1 -1
  102. package/lib/engine-components/ContactShadows.d.ts +1 -1
  103. package/lib/engine-components/ContactShadows.js +1 -1
  104. package/lib/engine-components/DragControls.js +4 -1
  105. package/lib/engine-components/DragControls.js.map +1 -1
  106. package/lib/engine-components/Gizmos.d.ts +2 -0
  107. package/lib/engine-components/Gizmos.js +2 -0
  108. package/lib/engine-components/Gizmos.js.map +1 -1
  109. package/lib/engine-components/Joints.d.ts +20 -0
  110. package/lib/engine-components/Joints.js +20 -0
  111. package/lib/engine-components/Joints.js.map +1 -1
  112. package/lib/engine-components/LODGroup.d.ts +1 -1
  113. package/lib/engine-components/LODGroup.js +1 -1
  114. package/lib/engine-components/LookAtConstraint.d.ts +1 -1
  115. package/lib/engine-components/LookAtConstraint.js +1 -1
  116. package/lib/engine-components/Networking.d.ts +1 -1
  117. package/lib/engine-components/Networking.js +1 -1
  118. package/lib/engine-components/OrbitControls.d.ts +1 -1
  119. package/lib/engine-components/OrbitControls.js +1 -1
  120. package/lib/engine-components/Renderer.d.ts +6 -0
  121. package/lib/engine-components/Renderer.js +6 -0
  122. package/lib/engine-components/Renderer.js.map +1 -1
  123. package/lib/engine-components/RendererInstancing.js +5 -3
  124. package/lib/engine-components/RendererInstancing.js.map +1 -1
  125. package/lib/engine-components/SceneSwitcher.js +18 -14
  126. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  127. package/lib/engine-components/ShadowCatcher.d.ts +1 -1
  128. package/lib/engine-components/ShadowCatcher.js +1 -1
  129. package/lib/engine-components/SpectatorCamera.d.ts +1 -1
  130. package/lib/engine-components/SpectatorCamera.js +16 -8
  131. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  132. package/lib/engine-components/SpriteRenderer.d.ts +2 -1
  133. package/lib/engine-components/SpriteRenderer.js +2 -1
  134. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  135. package/lib/engine-components/Voip.d.ts +1 -1
  136. package/lib/engine-components/Voip.js +1 -1
  137. package/lib/engine-components/api.d.ts +1 -0
  138. package/lib/engine-components/api.js +1 -0
  139. package/lib/engine-components/api.js.map +1 -1
  140. package/lib/engine-components/codegen/components.d.ts +0 -1
  141. package/lib/engine-components/codegen/components.js +0 -1
  142. package/lib/engine-components/codegen/components.js.map +1 -1
  143. package/lib/engine-components/export/gltf/GltfExport.d.ts +5 -0
  144. package/lib/engine-components/export/gltf/GltfExport.js +5 -0
  145. package/lib/engine-components/export/gltf/GltfExport.js.map +1 -1
  146. package/lib/engine-components/export/usdz/USDZExporter.d.ts +1 -0
  147. package/lib/engine-components/export/usdz/USDZExporter.js +1 -0
  148. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  149. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +1 -1
  150. package/lib/engine-components/particlesystem/ParticleSystem.js +1 -1
  151. package/lib/engine-components/timeline/SignalAsset.d.ts +1 -1
  152. package/lib/engine-components/timeline/SignalAsset.js +1 -1
  153. package/lib/engine-components/ui/Button.d.ts +1 -1
  154. package/lib/engine-components/ui/Button.js +1 -1
  155. package/lib/engine-components/ui/Canvas.d.ts +1 -1
  156. package/lib/engine-components/ui/Canvas.js +1 -1
  157. package/lib/engine-components/ui/CanvasGroup.d.ts +1 -1
  158. package/lib/engine-components/ui/CanvasGroup.js +1 -1
  159. package/lib/engine-components/ui/EventSystem.d.ts +1 -1
  160. package/lib/engine-components/ui/EventSystem.js +1 -1
  161. package/lib/engine-components/ui/Image.d.ts +1 -1
  162. package/lib/engine-components/ui/Image.js +1 -1
  163. package/lib/engine-components/ui/InputField.d.ts +1 -1
  164. package/lib/engine-components/ui/InputField.js +1 -1
  165. package/lib/engine-components/ui/Outline.d.ts +1 -1
  166. package/lib/engine-components/ui/Outline.js +1 -1
  167. package/lib/engine-components/ui/Raycaster.d.ts +3 -2
  168. package/lib/engine-components/ui/Raycaster.js +3 -2
  169. package/lib/engine-components/ui/Raycaster.js.map +1 -1
  170. package/lib/engine-components/ui/RectTransform.d.ts +6 -0
  171. package/lib/engine-components/ui/RectTransform.js +6 -0
  172. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  173. package/lib/engine-components/ui/SpatialHtml.d.ts +7 -0
  174. package/lib/engine-components/ui/SpatialHtml.js +7 -0
  175. package/lib/engine-components/ui/SpatialHtml.js.map +1 -1
  176. package/lib/engine-components/ui/Text.d.ts +2 -0
  177. package/lib/engine-components/ui/Text.js +2 -0
  178. package/lib/engine-components/ui/Text.js.map +1 -1
  179. package/lib/engine-components/utils/LookAt.d.ts +2 -1
  180. package/lib/engine-components/utils/LookAt.js +2 -1
  181. package/lib/engine-components/utils/LookAt.js.map +1 -1
  182. package/lib/engine-components/web/CursorFollow.d.ts +1 -1
  183. package/lib/engine-components/web/CursorFollow.js +1 -1
  184. package/lib/engine-components/web/HoverAnimation.d.ts +1 -1
  185. package/lib/engine-components/web/HoverAnimation.js +1 -1
  186. package/lib/engine-components/web/ViewBox.d.ts +1 -1
  187. package/lib/engine-components/web/ViewBox.js +1 -1
  188. package/lib/engine-components/webxr/Avatar.js +2 -0
  189. package/lib/engine-components/webxr/Avatar.js.map +1 -1
  190. package/lib/engine-components/webxr/WebXR.js +18 -12
  191. package/lib/engine-components/webxr/WebXR.js.map +1 -1
  192. package/package.json +5 -5
  193. package/plugins/vite/poster-client.js +8 -1
  194. package/src/engine/codegen/register_types.ts +0 -2
  195. package/src/engine/debug/debug_console.ts +449 -1
  196. package/src/engine/engine_components.ts +4 -4
  197. package/src/engine/engine_context.ts +2 -0
  198. package/src/engine/engine_input.ts +7 -0
  199. package/src/engine/engine_license.ts +128 -17
  200. package/src/engine/engine_networking.ts +5 -5
  201. package/src/engine/engine_physics.ts +3 -3
  202. package/src/engine/engine_physics_rapier.ts +1 -1
  203. package/src/engine/engine_serialization_builtin_serializer.ts +1 -1
  204. package/src/engine/engine_utils.ts +23 -4
  205. package/src/engine/extensions/extensions.ts +30 -6
  206. package/src/engine/webcomponents/WebXRButtons.ts +15 -5
  207. package/src/engine/webcomponents/needle menu/needle-menu.ts +4 -5
  208. package/src/engine/webcomponents/needle-engine.ar-overlay.ts +6 -0
  209. package/src/engine/webcomponents/needle-engine.ts +2 -2
  210. package/src/engine/xr/NeedleXRSession.ts +114 -24
  211. package/src/engine/xr/TempXRContext.ts +12 -2
  212. package/src/engine/xr/usdz.ts +6 -1
  213. package/src/engine-components/AlignmentConstraint.ts +1 -2
  214. package/src/engine-components/Animation.ts +2 -0
  215. package/src/engine-components/Animator.ts +1 -0
  216. package/src/engine-components/AudioListener.ts +1 -1
  217. package/src/engine-components/AudioSource.ts +1 -1
  218. package/src/engine-components/BasicIKConstraint.ts +8 -0
  219. package/src/engine-components/BoxHelperComponent.ts +1 -0
  220. package/src/engine-components/Camera.ts +6 -3
  221. package/src/engine-components/CharacterController.ts +6 -2
  222. package/src/engine-components/Collider.ts +2 -2
  223. package/src/engine-components/Component.ts +5 -4
  224. package/src/engine-components/ContactShadows.ts +1 -1
  225. package/src/engine-components/DragControls.ts +5 -1
  226. package/src/engine-components/Gizmos.ts +2 -0
  227. package/src/engine-components/Joints.ts +20 -0
  228. package/src/engine-components/LODGroup.ts +1 -1
  229. package/src/engine-components/LookAtConstraint.ts +1 -1
  230. package/src/engine-components/Networking.ts +1 -1
  231. package/src/engine-components/OrbitControls.ts +1 -1
  232. package/src/engine-components/Renderer.ts +6 -0
  233. package/src/engine-components/RendererInstancing.ts +6 -3
  234. package/src/engine-components/SceneSwitcher.ts +17 -17
  235. package/src/engine-components/ShadowCatcher.ts +1 -1
  236. package/src/engine-components/SpectatorCamera.ts +22 -11
  237. package/src/engine-components/SpriteRenderer.ts +2 -1
  238. package/src/engine-components/Voip.ts +1 -1
  239. package/src/engine-components/api.ts +2 -1
  240. package/src/engine-components/codegen/components.ts +0 -1
  241. package/src/engine-components/export/gltf/GltfExport.ts +5 -0
  242. package/src/engine-components/export/usdz/USDZExporter.ts +1 -0
  243. package/src/engine-components/particlesystem/ParticleSystem.ts +1 -1
  244. package/src/engine-components/timeline/SignalAsset.ts +1 -1
  245. package/src/engine-components/ui/Button.ts +1 -1
  246. package/src/engine-components/ui/Canvas.ts +1 -1
  247. package/src/engine-components/ui/CanvasGroup.ts +1 -1
  248. package/src/engine-components/ui/EventSystem.ts +1 -1
  249. package/src/engine-components/ui/Image.ts +1 -1
  250. package/src/engine-components/ui/InputField.ts +1 -1
  251. package/src/engine-components/ui/Outline.ts +1 -1
  252. package/src/engine-components/ui/Raycaster.ts +3 -2
  253. package/src/engine-components/ui/RectTransform.ts +6 -0
  254. package/src/engine-components/ui/SpatialHtml.ts +7 -0
  255. package/src/engine-components/ui/Text.ts +2 -0
  256. package/src/engine-components/utils/LookAt.ts +2 -1
  257. package/src/engine-components/web/CursorFollow.ts +1 -1
  258. package/src/engine-components/web/HoverAnimation.ts +1 -1
  259. package/src/engine-components/web/ViewBox.ts +1 -1
  260. package/src/engine-components/webxr/Avatar.ts +4 -0
  261. package/src/engine-components/webxr/WebXR.ts +19 -11
  262. package/dist/generateMeshBVH.worker-mO20N_b8.js +0 -21
  263. package/dist/needle-engine.bundle-CiL59iU3.min.js +0 -1647
  264. package/dist/needle-engine.bundle-DzYZGJbS.umd.cjs +0 -1647
  265. package/dist/vendor-BKGa4GE0.min.js +0 -1116
@@ -1,1647 +0,0 @@
1
- import{Vector2 as ee,Vector3 as b,Vector4 as pe,Quaternion as U,PlaneGeometry as Un,WebGLRenderer as cr,PerspectiveCamera as re,OrthographicCamera as fd,Scene as wi,Mesh as G,Texture as Le,Uniform$1 as Wi,Color as ne,ShaderMaterial as zn,Box3 as xi,ShadowMaterial as K0,Euler as ot,MeshStandardMaterial as pt,Box3Helper as SS,GridHelper as um,Object3D as k,Material as ve,Matrix3 as J0,Matrix4 as K,Layers as ds,Ray as vo,MathUtils as wo,AxesHelper as Si,MeshBasicMaterial as xe,DoubleSide as Ci,BufferGeometry as gn,Group as xo,CylinderGeometry as eb,SphereGeometry as yd,BoxGeometry as Pa,SpriteMaterial as CS,Sprite as PS,Shape as OS,ExtrudeGeometry as kS,Fog as tb,DirectionalLight as pm,PointLight as mm,EdgesGeometry as MS,LineSegments as ib,LineBasicMaterial as gm,Line as Oa,BufferAttribute as mt,Raycaster as bd,Sphere as _d,ArrayCamera as RS,Plane as hr,SkinnedMesh as us,InterleavedBufferAttribute as nb,Skeleton as TS,Bone as ES,WebGLCubeRenderTarget as AS,CubeCamera as IS,AnimationClip as Pi,FileLoader as fm,TextureLoader as Kl,PropertyBinding as ka,KeyframeTrack as LS,LinearSRGBColorSpace as So,ShaderChunk as qt,UniformsLib as jS,DataTexture as ym,RGBAFormat as vd,EquirectangularReflectionMapping as Nn,SRGBColorSpace as Co,Clock as DS,NeutralToneMapping as Ma,AgXToneMapping as wd,ACESFilmicToneMapping as xd,NoToneMapping as Sd,PCFSoftShadowMap$1 as BS,BasicNodeLibrary as FS,WebGLRenderTarget as Vn,DepthTexture as ob,NearestFilter as Cd,LoopRepeat as US,LoopOnce as bm,AnimationMixer as _m,CompressedTexture as zS,FrontSide as ps,Camera as NS,Frustum as sb,AudioListener as VS,PositionalAudio as WS,AudioLoader as vm,EventDispatcher as wm,BackSide as Pd,MeshDepthMaterial as $S,CustomBlending as HS,MaxEquation as GS,AlwaysStencilFunc as qS,GreaterEqualStencilFunc as XS,NotEqualStencilFunc as QS,GreaterStencilFunc as YS,LessEqualStencilFunc as ZS,EqualStencilFunc as KS,LessStencilFunc as JS,NeverStencilFunc as rb,InvertStencilOp as eC,DecrementWrapStencilOp as tC,IncrementWrapStencilOp as iC,DecrementStencilOp as nC,IncrementStencilOp as oC,ReplaceStencilOp as sC,ZeroStencilOp as rC,KeepStencilOp as aC,CubeTexture as ab,AmbientLight as lC,HemisphereLight as cC,RawShaderMaterial as lb,GLSL3 as hC,AlwaysDepth as dC,GreaterEqualDepth as uC,GreaterDepth as pC,LessEqualDepth as mC,LessDepth as gC,NotEqualDepth as fC,EqualDepth as yC,BatchedMesh as cb,MeshPhysicalMaterial as xm,LinearFilter as Od,UnsignedByteType as bC,RingGeometry as _C,Line3 as vC,AdditiveBlending as hb,BoxHelper as wC,SpotLight as xC,DirectionalLightHelper as SC,CameraHelper as CC,LOD as PC,Triangle as OC,NormalBlending as kC,ReinhardToneMapping as Sm,LinearToneMapping as Cm,HalfFloatType as Pm,VideoTexture as MC,CubeUVReflectionMapping as db,CompressedCubeTexture as RC,EquirectangularRefractionMapping as TC,CatmullRomCurve3 as EC,VectorKeyframeTrack as AC,QuaternionKeyframeTrack as IC,Audio as LC,ShaderLib as kd,UniformsUtils as ub,MirroredRepeatWrapping as pb,MeshNormalMaterial as jC,AudioContext as DC,PMREMGenerator$1 as BC}from"./three-B7CT31Bt.min.js";import{createLoaders as Om,getRaycastMesh as mb,LODsManager as dr,NEEDLE_progressive as Ve,addDracoAndKTX2Loaders as FC,configureLoader as UC,setKTX2TranscoderLocation as zC,setDracoDecoderLocation as NC}from"./gltf-progressive-DZrY8VT6.min.js";import{GroundedSkybox as Ra,Font as VC,TextGeometry as WC,FontLoader as $C,GLTFLoader as Po,TransformControlsGizmo as gb,EXRLoader as km,RGBELoader as fb,Stats as HC,nodeFrame as yb,OrbitControls as bb,PositionalAudioHelper as GC,HorizontalBlurShader as qC,VerticalBlurShader as XC,GLTFExporter as _b,strToU8 as vb,zipSync as QC,XRControllerModelFactory as YC,XRHandMeshModel as ZC,Line2 as KC,LineGeometry as JC,LineMaterial as eP,TransformControls as tP,InteractiveGroup as iP,HTMLMesh as nP,VertexNormalsHelper as oP,OBJLoader as Mm,FBXLoader as wb,mergeVertices as sP}from"./three-examples-D1P7eEhn.min.js";import{fetchProfile as rP,MotionController as aP,$70d766613f57b014$export$2e2bcd8739ae039 as xb,ByteBuffer as lP,v5 as Sb,md5 as Cb,SIZE_PREFIX_LENGTH as Pb,Builder as Rm,createNoise4D as cP,Matrix4 as Tm,BatchedParticleRenderer as hP,ParticleSystem as dP,RenderMode as Oo,ConstantColor as uP,Vector4 as pP,ConstantValue as mP,TrailParticle as Ob,WorkerBase as gP,MeshBVH as fP}from"./vendor-BKGa4GE0.min.js";import{__webpack_exports__default as Ce,__webpack_exports__Text as kb,__webpack_exports__Block as Mb,__webpack_exports__update as yP,SimpleStateBehavior as bP,__webpack_exports__Inline as Em,__webpack_exports__FontLibrary as Rb,ThreeMeshUI as Tb}from"./three-mesh-ui-LQ44s0AL.min.js";import{EffectAttribute as _P}from"./postprocessing-DYDtB188.min.js";const Am=new Map;function $i(o=globalThis.location?.hostname){if(Am.has(o))return Am.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return Am.set(o,e),e===!0}function Eb(){return window.location.hostname.includes("glitch.me")}const Ab=typeof window!==void 0?window.location.search.includes("debugcontext"):!1;var de=(o=>(o.ContextRegistered="ContextRegistered",o.ContextCreationStart="ContextCreationStart",o.ContextCreated="ContextCreated",o.ContextFirstFrameRendered="ContextFirstFrameRendered",o.ContextDestroying="ContextDestroying",o.ContextDestroyed="ContextDestroyed",o.MissingCamera="MissingCamera",o.ContextClearing="ContextClearing",o.ContextCleared="ContextCleared",o))(de||{});class ue{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static Registered=[];static register(e){this.Registered.indexOf(e)===-1&&(Ab&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(Ab&&console.warn("Unregistering context"),this.Registered.splice(t,1))}static _callbacks={};static registerCallback(e,t){this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t)}static unregisterCallback(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i!==-1&&this._callbacks[e].splice(i,1)}static dispatchCallback(e,t,i){if(!this._callbacks[e])return!0;const n={event:e,context:t};if(i)for(const r in i)n[r]=i[r];const s=new Array;return this._callbacks[e].forEach(r=>{const a=r(n);a instanceof Promise&&s.push(a)}),Promise.all(s)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}const Ib=()=>o=>o;function vP(o){return Ib()(o)}function wP(){return!!v("debug")}class Oi{_factory;_cache=[];_maxSize;_index=0;constructor(e,t){this._factory=e,this._maxSize=t}get(){const e=this._index%this._maxSize;return this._index++,this._cache.length<=e&&(this._cache[e]=this._factory()),this._cache[e]}}let ur=!1;const Im=new Array;typeof window<"u"&&setTimeout(()=>{if(ur){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of Im){const r=new URL(e);r.searchParams.append(s,""),o[s]=r.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine.
2
- Append any of these parameters to the URL to enable specific debug options.
3
- Example: ${i} will show an onscreen console window.`);const n=ur===!0?"":` (containing "${ur}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof ur=="string"&&!s.toLowerCase().includes(ur.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function Jl(){return new URLSearchParams(globalThis.location?.search)}function v(o){ur&&!Im.includes(o)&&Im.push(o);const e=Jl();if(e.has(o)){const t=e.get(o);if(t){const i=Number(t);return isNaN(i)?t:i}else return!0}return!1}ur=v("help");function xP(o,e){const t=Jl();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function ec(o,e,t=!0){const i=Jl();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?Lb(o,i):jm(o,i)}function Lm(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function Lb(o,e,t){window.history.pushState(t,o,"?"+e.toString())}function jm(o,e,t){window.history.replaceState(t,o,"?"+e.toString())}function SP(o){for(var e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",i=t.length,n=0;n<o;n++)e+=t.charAt(Math.floor(Math.random()*i));return e}function CP(o,e){return Math.floor(Math.random()*(e-o+1))+o}const jb=["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"],Db=["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 Bb(){const o=jb[Math.floor(Math.random()*jb.length)],e=Db[Math.floor(Math.random()*Db.length)];return o+"_"+e}function Fb(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function Ta(o,e,t=!0,i=!1){if(e==null)return null;if(e.userData&&e.userData.guid===o||e.guid==o)return e;if(i&&e.userData?.components){for(const n of e.userData.components)if(n.guid===o)return n}if(t){if(e.scenes)for(const n in e.scenes){const s=e.scenes[n],r=Ta(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=Ta(o,s,t,i);if(r)return r}}}function tc(o,e){if(o!=null&&typeof o=="object"){let t;Array.isArray(o)?t=[]:(t=Object.create(o),Object.assign(t,o));for(const i of Object.keys(o)){const n=o[i];e&&!e(o,i,n)?t[i]=n:n?.clone!==void 0&&typeof n.clone=="function"?t[i]=n.clone():t[i]=tc(n,e)}return t}return o}function Wn(o){return new Promise((e,t)=>{setTimeout(e,o)})}function ic(o,e){if(o<=0)return Promise.resolve();if(e||(e=ue.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+o;return new Promise((i,n)=>{if(!e)return n("No context");const s=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(s),1),i())};e.pre_update_callbacks.push(s)})}const Md=v("debugresolveurl"),Ub="rel:";function PP(o,e){return ms(o,e)}function ms(o,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(o===void 0)return Md&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(Ub)&&(e=e.substring(4));const t=o.lastIndexOf("/");if(t>=0){const i=o.substring(0,t+1);for(;i.endsWith("/")&&e.startsWith("/");)e=e.substring(1);const n=i+e;return Md&&console.log("source:",o,`changed uri
4
- from`,e,`
5
- to `,n,`
6
- basePath: `+i),n}return e}function zb(o){if(o)return o=o.trim(),o=o.split("?")[0]?.split("#")[0],o}class OP{subscribeWrite(e){this.writeCallbacks.push(e)}unsubscribeWrite(e){const t=this.writeCallbacks.indexOf(e);t!==-1&&this.writeCallbacks.splice(t,1)}writeCallbacks=[];constructor(e,t){this._object=e,this._prop=t,this._wrapperProp=Symbol("$"+t),this.apply()}_applied=!1;_object;_prop;_wrapperProp;apply(){if(this._applied||!this._object)return;const e=this._object,t=this._prop;if(e[t]===void 0)return;this._applied=!0,e[this._wrapperProp]!==void 0&&console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");const i=e[t];e[this._wrapperProp]=i,Object.defineProperty(e,t,{get:()=>e[this._wrapperProp],set:n=>{e[this._wrapperProp]=n;for(const s of this.writeCallbacks)s(n,this._prop)}})}revoke(){if(!this._applied||!this._object)return;this._applied=!1;const e=this._object,t=this._prop;Reflect.deleteProperty(e,t);const i=e[this._wrapperProp];e[t]=i,Reflect.deleteProperty(e,this._wrapperProp)}dispose(){this.revoke(),this.writeCallbacks.length=0,this._object=null}}class rs{_watches=[];constructor(e,t){if(Array.isArray(t))for(const i of t)this._watches.push(new rs(e,i));else this._watches.push(new OP(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 Ea=Symbol("needle:watches");function Rd(o,e){if(!o[Ea])if(o instanceof ee)o[Ea]=new rs(o,["x","y"]);else if(o instanceof b)o[Ea]=new rs(o,["x","y","z"]);else if(o instanceof pe||o instanceof U)o[Ea]=new rs(o,["x","y","z","w"]);else return!1;return o[Ea].subscribeWrite(e),!0}function Dm(o,e){if(!o)return;const t=o[Ea];t&&t.unsubscribeWrite(e)}var q;(o=>{let e;function t(){if(e!==void 0)return e;const W=window.navigator.userAgent,se=/Windows|MacOS|Mac OS/.test(W),ce=/Windows NT/.test(W)&&/Edg/.test(W)&&!/Win64/.test(W);return e=se&&!ce&&!w()}o.isDesktop=t;let i;function n(){return i!==void 0?i:typeof window.orientation<"u"||navigator.userAgent.indexOf("IEMobile")!==-1?i=!0:i=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent)}o.isMobileDevice=n;function s(){return a()}o.isIPad=s;let r;function a(){return r!==void 0?r:r=/iPad/.test(navigator.userAgent)}o.isiPad=a;let l;function c(){return l!==void 0?l:l=/Android/.test(navigator.userAgent)}o.isAndroidDevice=c;let h;function d(){return h!==void 0?h:h=/WebXRViewer\//i.test(navigator.userAgent)}o.isMozillaXR=d;let p;function m(){if(p!==void 0)return p;if(navigator.userAgentData)return p=navigator.userAgentData.platform==="macOS";{const W=navigator.userAgent.toLowerCase();return p=W.includes("mac os x")||W.includes("macintosh")}}o.isMacOS=m;let f;function g(){return f!==void 0?f:f=m()&&"xr"in navigator}o.isVisionOS=g;let y;const _=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function w(){return y!==void 0?y:y=_.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}o.isiOS=w;let P;function M(){return P!==void 0||(P=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),P}o.isSafari=M;let O;function j(){return O!==void 0?O:O=navigator.userAgent.includes("OculusBrowser")}o.isQuest=j;let I;function N(){return I!==void 0||(I=document.createElement("a").relList.supports("ar")),I}o.supportsQuickLookAR=N;async function V(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(W){return console.error("Error querying `microphone` permissions.",W),!1}}o.microphonePermissionsGranted=V;let H;function X(){if(H!==void 0)return H;const W=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(W&&(H=W[1].replace("_",".")),!H){const se=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);se&&(H=se[1])}return H||(H=null),H}o.getiOSVersion=X;let T;function $(){if(T!==void 0)return T;const W=navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);return W?T=W[1].replace("_","."):T=null,T}o.getChromeVersion=$})(q||(q={}));function kP(){return q.isDesktop()}function MP(){return q.isMobileDevice()}function RP(){return q.isiPad()}function TP(){return q.isiPad()}function EP(){return q.isAndroidDevice()}function AP(){return q.isMozillaXR()}function IP(){return q.isMacOS()}function LP(){return q.isiOS()}function jP(){return q.isSafari()}function DP(){return q.isQuest()}async function BP(){return q.microphonePermissionsGranted()}const gs=new WeakMap;function Bm(o,e,t){if(!gs.get(o)){const n=new MutationObserver(s=>{FP(o,s)});gs.set(o,{observer:n,attributeChangedListeners:new Map}),n.observe(o,{attributes:!0})}const i=gs.get(o).attributeChangedListeners;return i.has(e)||i.set(e,[]),i.get(e).push(t),()=>{Fm(o,e,t)}}function Fm(o,e,t){if(!gs.get(o))return;const i=gs.get(o).attributeChangedListeners;if(!i.has(e))return;const n=i.get(e),s=n.indexOf(t);s!==-1&&(n.splice(s,1),n.length<=0&&(i.delete(e),gs.get(o)?.observer.disconnect(),gs.delete(o)))}function FP(o,e){const t=gs.get(o).attributeChangedListeners;for(const i of e)if(i.type==="attributes"){const n=i.attributeName,s=o.getAttribute(n);if(t.has(n))for(const r of t.get(n))r(s)}}class Um{reason;constructor(e){this.reason=e}}async function zm(o){const e=await Promise.allSettled(o).catch(n=>[new Um(n.message)]);let t=!1;const i=e.map(n=>"value"in n?n.value:(t=!0,new Um(n.reason)));return{anyFailed:t,results:i}}const UP=v("debugdebug");let Nm=!1;(v("noerrors")||v("nooverlaymessages"))&&(Nm=!0);const Vm="needle_engine_global_error_container";var ki=(o=>(o[o.Log=0]="Log",o[o.Warn=1]="Warn",o[o.Error=2]="Error",o))(ki||{});function Nb(){return $b}const Wm=new Array;function zP(o){Wm.push(o)}let $m=!1;function NP(...o){if(!$m){$m=!0;try{for(let e=0;e<Wm.length;e++)Wm[e](...o)}catch(e){console.error(e)}$m=!1}}const Vb=console.error,VP=function(...o){Vb.apply(console,o),HP(o),pr(2,o),$P(...o)};function Wb(o){Nm=!o,o?console.error=VP:console.error=Vb}function WP(o){return Wb(o)}let $b=0;function $P(...o){$b+=1,NP(...o)}function HP(o){if(Array.isArray(o))for(let e=0;e<o.length;e++){const t=o[e];typeof t=="string"&&t.startsWith("THREE.PropertyBinding: Trying to update node for track:")&&(o[e]="Some animated objects couldn't be found: see console for details")}}function pr(o,e,t,i){if(Nm)return;const n=ue.Current?.domElement??document.querySelector("needle-engine");if(n){if(Array.isArray(e)){let s="";for(let r=0;r<e.length;r++){let a=e[r];a instanceof Error&&(a=a.message),typeof a!="object"&&(r>0&&(s+=" "),s+=a)}e=s}!e||e.length<=0||GP(o,n,e)}}const nc=new Map;function GP(o,e,t){if(t==null)return;const i=QP(e);if(i.childElementCount>=20){const a=i.lastElementChild;Gb(a)}t.length>400&&(t=t.substring(0,400)+"...");const n=t;if(nc.has(n))return;const s=YP(o,t);i.prepend(s);const r=()=>{nc.delete(n),Gb(s)};nc.set(n,r),setTimeout(r,1e4)}function qP(){UP&&console.log("Clearing messages");for(const o of nc.values())o?.call(o);nc.clear()}const XP=`
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 QP(o){globalThis[Vm]||(globalThis[Vm]=new Map);const e=globalThis[Vm];if(e.has(o))return e.get(o);{const t=document.createElement("div");e.set(o,t),t.setAttribute("data-needle_engine_debug_overlay",""),t.classList.add("debug-container"),t.style.cssText=`
43
- position: absolute;
44
- top: 0;
45
- right: 5px;
46
- padding-top: 0px;
47
- max-width: 70%;
48
- max-height: calc(100% - 5px);
49
- z-index: 100000;
50
- pointer-events: scroll;
51
- display: flex;
52
- align-items: end;
53
- flex-direction: column;
54
- color: white;
55
- overflow: auto;
56
- word-break: break-word;
57
- `,o.shadowRoot?o.shadowRoot.appendChild(t):o.appendChild(t);const i=document.createElement("style");return i.innerHTML=XP,t.appendChild(i),t}}const Hb=Symbol("logtype"),Td=new Map;function Gb(o){o.remove();const e=o[Hb],t=Td.get(e)??[];t.push(o),Td.set(e,t)}function YP(o,e){if(Td.has(o)){const i=Td.get(o);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[Hb]=o,o){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class ZP{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,s){return n+(s-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of KP){const s=e[n],r=t[n];if(s===void 0||r===void 0)break;if(Math.abs(s-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const KP=["x","y","z","w"],L=new ZP;class qb{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class Ed{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new qb(this.alpha(this.minCutOff)),this.dx=new qb(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,s=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(s);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class Hm{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new Ed(e,t,i,n),this.y=new Ed(e,t,i,n),this.z=new Ed(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const Ad="needle:cameraController";function Xb(o){return o[Ad]}function Gm(o,e,t){t?o[Ad]=e:o[Ad]===e&&(o[Ad]=null)}const qm="needle:autofit";function Qb(o){return o[qm]===void 0?!0:o[qm]!==!1}function Id(o,e){o[qm]=e}let fn;const JP={x:0,y:0,width:0,height:0},eO=v("debugfocusrect");function tO(o,e,t,i,n){o instanceof Element&&(eO&&o instanceof HTMLElement&&(o.style.outline="2px dashed rgba(255, 150, 0, .8)"),o=o.getBoundingClientRect()),fn=n.domElement.getBoundingClientRect();const s=JP;s.x=o.x,s.y=o.y,s.width=o.width,s.height=o.height,s.x-=fn.x,s.y-=fn.y;const r=fn.width,a=fn.height,l=i.view,c=e.zoom;let h=l?.offsetX||0,d=l?.offsetY||0,p=fn.width,m=fn.height;p/=c,m/=c,h=p*(c-1)*.5,d=m*(c-1)*.5;const f=s.x+s.width*.5,g=s.y+s.height*.5,y=fn.width*.5,_=fn.height*.5,w=f-y,P=g-_;h-=w/c,d-=P/c,e.offsetX!==void 0&&(h+=e.offsetX*(fn.width*.5)),e.offsetY!==void 0&&(d-=e.offsetY*(fn.height*.5));const M=l?.offsetX||h,O=l?.offsetY||d;h=L.lerp(M,h,t),d=L.lerp(O,d,t);const j=l?.width||r,I=l?.height||a;p=L.lerp(j,p,t),m=L.lerp(I,m,t),i.setViewOffset(r,a,h,d,p,m),i.updateProjectionMatrix(),e.damping>0&&(e.damping*=1-t,e.damping<.01&&(e.damping=0),e.damping=Math.max(0,e.damping))}function iO(o,e,t){const i=o.length(),n=e.length(),s=L.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const Xm=new U,Yb=new U().setFromAxisAngle(new b(0,1,0),Math.PI);function nO(o,e){o.lookAt(e),o.quaternion.multiply(Yb)}function oc(o,e,t=!0,i=!1){if(o===e)return;Xm.copy(o.quaternion);const n=J(e),s=J(o);if(i){if(yn(o,be(e)),t){const r=s.y,a=s.sub(t_(o));a.y=r,o.lookAt(a),o.quaternion.multiply(Yb)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Xm);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Xm)}function oO(o,e,t,i=1){if(t){const n=D(0,0,0),s=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(s,r,0),n.unproject(t);const a=t.worldPosition,l=o.worldPosition.distanceTo(a),c=n.sub(a);c.multiplyScalar(i*3.6*l);const h=t.worldPosition.add(c);return o.lookAt(h),h}return null}const sO=new Oi(()=>new b,100);function D(o,e,t){const i=sO.get();return i.set(0,0,0),o instanceof b?i.copy(o):Array.isArray(o)?i.set(o[0],o[1],o[2]):o instanceof DOMPointReadOnly?i.set(o.x,o.y,o.z):typeof o=="number"?(i.x=o,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof o=="object"&&(i.x=o.x,i.y=o.y,i.z=o.z),i}const rO=new Oi(()=>new ne,30);function Zb(o){const e=rO.get();return o?e.copy(o):e.set(0,0,0),e}const aO=new Oi(()=>new U,100);function ri(o,e,t,i){const n=aO.get();return n.identity(),o instanceof U?n.copy(o):o instanceof DOMPointReadOnly?n.set(o.x,o.y,o.z,o.w):typeof o=="number"&&e!==void 0&&t!==void 0&&i!==void 0?n.set(o,e,t,i):typeof o=="object"&&"x"in o&&"y"in o&&"z"in o&&"w"in o&&n.set(o.x,o.y,o.z,o.w),n}const Qm=new Oi(()=>new b,100),Kb=Symbol("lastMatrixWorldUpdateKey");function J(o,e=null,t=!0){const i=e??Qm.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[Kb]!==Date.now()&&(o[Kb]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function gt(o,e){if(!o)return o;const t=Qm.get();return e!==t&&t.copy(e),(o?.parent??o).worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function mr(o,e,t,i){const n=Qm.get();return n.set(e,t,i),gt(o,n),o}const Ld=new Oi(()=>new U,100),gr=new U,Ym=new U;function be(o,e=null){if(!o)return Ld.get().identity();const t=e??Ld.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function yn(o,e){if(!o)return;e!==gr&&gr.copy(e);const t=gr;o?.parent?.getWorldQuaternion(Ym),Ym.invert();const i=Ym.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Zm(o,e,t,i,n){gr.set(e,t,i,n),yn(o,gr)}const lO=new Oi(()=>new b,100),cO=new b;function He(o,e=null){return e||(e=lO.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function Aa(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=cO;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const hO=new b,Jb=new U;function dO(o){return be(o,Jb),hO.set(0,0,1).applyQuaternion(Jb)}const uO=new Oi(()=>new b,100),e_=new U;function t_(o,e){return e||(e=uO.get().set(0,0,1)),be(o,e_),e.applyQuaternion(e_)}const i_=new ot,n_=new ot,pO=new b;function Km(o){const e=Ld.get();return o.getWorldQuaternion(e),n_.setFromQuaternion(e),n_}function Jm(o,e){const t=Ld.get();yn(o,t.setFromEuler(e))}function jd(o){const e=Km(o),t=pO;return t.set(e.x,e.y,e.z),t.x=L.toDegrees(t.x),t.y=L.toDegrees(t.y),t.z=L.toDegrees(t.z),t}function o_(o,e){sc(o,e.x,e.y,e.z,!0)}function sc(o,e,t,i,n=!0){n&&(e=L.toRadians(e),t=L.toRadians(t),i=L.toRadians(i)),i_.set(e,t,i),gr.setFromEuler(i_),yn(o,gr)}function Dd(o,e=!0){o&&(e?function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()}(o):o.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function mO(o){let e=o?.name||"";if(!o)return e;let t=o.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function s_(o){if(o){const e=o;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class lm extends zn{static vertex=`
58
- varying vec2 vUv;
59
- void main(){
60
- vUv = uv;
61
- gl_Position = vec4(position.xy, 0., 1.0);
62
- }`;constructor(){super({vertexShader:lm.vertex,uniforms:{map:new Wi(null),flipY:new Wi(!0),writeDepth:new Wi(!1),depthTexture:new Wi(null)},fragmentShader:`
63
- uniform sampler2D map;
64
- uniform bool flipY;
65
- uniform bool writeDepth;
66
- uniform sampler2D depthTexture;
67
-
68
- varying vec2 vUv;
69
-
70
- void main(){
71
- vec2 uv = vUv;
72
- if (flipY) uv.y = 1.0 - uv.y;
73
- gl_FragColor = texture2D(map, uv);
74
-
75
- if (writeDepth) {
76
- float depth = texture2D(depthTexture, uv).r;
77
- gl_FragDepth = depth;
78
-
79
- // float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values
80
- // gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0);
81
- }
82
- }`})}reset(){this.uniforms.map.value=null,this.uniforms.flipY.value=!0,this.uniforms.writeDepth.value=!1,this.uniforms.depthTexture.value=null,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}}class sr{static planeGeometry=new Un(2,2,1,1);static renderer=new cr({antialias:!1,alpha:!0});static perspectiveCam=new re;static orthographicCam=new fd;static scene=new wi;static blitMaterial=new lm;static mesh=new G(sr.planeGeometry,sr.blitMaterial);static copyTexture(e,t){t||(t=this.blitMaterial),this.blitMaterial.reset();const i=t||this.blitMaterial;i.uniforms.map.value=e,i.needsUpdate=!0,i.uniformsNeedUpdate=!0;const n=i.vertexShader;i.vertexShader=lm.vertex;const s=this.mesh;s.material=i,s.frustumCulled=!1,this.scene.children.length=0,this.scene.add(s),this.renderer.setSize(e.image.width,e.image.height),this.renderer.clear(),this.renderer.render(this.scene,this.perspectiveCam);const r=new Le(this.renderer.domElement);return r.name="Copy",r.needsUpdate=!0,i.vertexShader=n,r}static blit(e,t,i){const{renderer:n=this.renderer,blitMaterial:s=this.blitMaterial,flipY:r=!1,depthTexture:a=null,depthTest:l=!0,depthWrite:c=!0}=i||{};this.blitMaterial.reset(),s.uniforms.map&&(s.uniforms.map.value=e),s.uniforms.flipY&&(s.uniforms.flipY.value=r),a?(s.uniforms.writeDepth=new Wi(!0),s.uniforms.depthTexture.value=a):(s.uniforms.writeDepth=new Wi(!1),s.uniforms.depthTexture.value=null),s.needsUpdate=!0,s.uniformsNeedUpdate=!0;const h=this.mesh;h.material=s,h.frustumCulled=!1,this.scene.children.length=0,this.scene.add(h);const d=n.getRenderTarget(),p=n.getContext(),m=p.getParameter(p.DEPTH_TEST),f=p.getParameter(p.DEPTH_WRITEMASK),g=p.getParameter(p.DEPTH_FUNC);l?n.getContext().enable(n.getContext().DEPTH_TEST):n.getContext().disable(n.getContext().DEPTH_TEST),n.state.buffers.depth.setMask(c),n.setClearColor(new ne(0,0,0),0),n.pixelRatio!==window.devicePixelRatio&&n.xr.isPresenting===!1&&n.setPixelRatio(window.devicePixelRatio),n.setRenderTarget(t),n.clear(),n.render(this.scene,this.perspectiveCam),n.setRenderTarget(d);const y=n.state.buffers.depth;y.setTest(m),y.setMask(f),y.setFunc(g)}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=r_(e));const i=e.image;if(fO(i)){const n=document.createElement("canvas");n.width=i.width,n.height=i.height;const s=n.getContext("2d");return s?(s.drawImage(i,0,0,i.width,i.height,0,0,n.width,n.height),n):(console.error("Failed getting canvas 2d context"),null)}return null}}function r_(o){return sr.copyTexture(o)}function gO(o,e=!1){return sr.textureToCanvas(o,e)}function fO(o){return typeof HTMLImageElement<"u"&&o instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&o instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&o instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&o instanceof ImageBitmap}function yO(o){const e=o.type;return e==="Mesh"||e==="SkinnedMesh"}function eg(o,e){e?o["needle:rendercustomshadow"]=!0:o["needle:rendercustomshadow"]=!1}function a_(o){return!!(o&&(o["needle:rendercustomshadow"]===!0||o["needle:rendercustomshadow"]==null))}function Xt(o,e=void 0,t=void 0,i=void 0){const n=i||new xi;n.makeEmpty();const s=[];function r(l){let c=!0;if(l.visible&&Qb(l)!==!1&&!(l.type==="TransformControlsGizmo"||l.type==="TransformControlsPlane")){if(l instanceof SS&&(c=!1),l instanceof um&&(c=!1),l instanceof Ra&&(c=!1),l.isGizmo===!0&&(c=!1),l.material instanceof K0&&(c=!1),yO(l)||(c=!1),t&&l.layers.test(t)===!1&&(c=!1),c&&(e&&Array.isArray(e)&&e?.includes(l)||typeof e=="function"&&e(l)===!0))return;if(l.isUI!==!0){if(c){const h=l.children;l.children=s;const d=l.position,p=l.scale;if(Number.isNaN(d.x)||Number.isNaN(d.y)||Number.isNaN(d.z)){console.warn(`Object "${l.name}" has NaN values in position or scale.... will ignore it`,d,p);return}l.geometry===null&&(l.geometry=void 0),n.expandByObject(l,!0),l.children=h}for(const h of l.children)r(h)}}}let a=!1;Array.isArray(o)||(o=[o]);for(const l of o)l&&(a=!0,l.updateMatrixWorld(),r(l));return a||console.warn("No objects to fit camera to..."),n}function l_(o,e,t){const i=Xt([o],t?.ignore),n=new b;i.getSize(n);const s=new b;i.getCenter(s);const r=new b;e.getSize(r);const a=new b;e.getCenter(a);const l=new b;l.set(r.x/n.x,r.y/n.y,r.z/n.z);const c=Math.min(l.x,l.y,l.z),h=t?.scale!==!1;if(h&&Aa(o,He(o).multiplyScalar(c)),t?.position!==!1){const d=new b;i.getCenter(d),d.y=i.min.y;const p=new b;e.getCenter(p),p.y=e.min.y;const m=p.clone().sub(d);h&&m.multiplyScalar(c),gt(o,J(o).add(m))}return{boundsBefore:i,scale:l}}function c_(o,e){const t=Xt([o]),i=new b;t.getCenter(i),i.y=t.min.y;const n=e.clone().sub(i),s=J(o);return gt(o,s.add(n)),{offset:n,bounds:t}}function tg(o,e,t,i){if(Array.isArray(e)){let r=!0;for(let a=0;a<e.length;a++)tg(o,e[a],a,e)||(r=!1);return r}if(e.type==="MeshStandardMaterial"||e.type==="MeshBasicMaterial")return!1;if(e["material:fbx"]!=null)return!0;const n=new pt;n["material:fbx"]=e;const s=e;return s&&(s.map?n.color.set(1,1,1):n.color.copyLinearToSRGB(s.color),n.emissive.copyLinearToSRGB(s.emissive),n.emissiveIntensity=s.emissiveIntensity,n.opacity=s.opacity,n.displacementScale=s.displacementScale,n.transparent=s.transparent,n.bumpMap=s.bumpMap,n.aoMap=s.aoMap,n.map=s.map,n.displacementMap=s.displacementMap,n.emissiveMap=s.emissiveMap,n.normalMap=s.normalMap,n.envMap=s.envMap,n.alphaMap=s.alphaMap,n.metalness=s.reflectivity,n.vertexColors=s.vertexColors,s.shininess&&(n.roughness=1-Math.sqrt(s.shininess)/10),n.needsUpdate=!0),t===void 0?o.material=n:i[t]=n,!0}let Bd=!1;zP((...o)=>{A()&&ue.Current?.isInXR&&(fr(!0),h_("error",...o))});function fr(o){if(o){if(Bd)return;Bd=!0,_O()}else{if(!Bd)return;Bd=!1,vO()}}const rc={log:void 0,warn:void 0,error:void 0};class bO{familyName="needle-xr";root=null;context=null;defaultFontSize=.06;constructor(){this.ensureFont()}onEnable(){this.context=ue.Current||ue.All[0],this.context.pre_render_callbacks.push(this.onBeforeRender)}onDisable(){this.context?.pre_render_callbacks.splice(this.context?.pre_render_callbacks.indexOf(this.onBeforeRender),1),this.root?.removeFromParent()}targetObject=new k;userForwardViewPoint=new b;oneEuroFilter=new Hm(90,.8);_lastElementRemoveTime=0;onBeforeRender=()=>{const e=this.context?.mainCamera;if(this.context&&e instanceof re){const t=this.getRoot();Number.isNaN(t.position.x)&&t.position.set(0,0,0),Number.isNaN(t.quaternion.x)&&t.quaternion.set(0,0,0,1),this.context.scene.add(this.targetObject);const i=this.context.xr?.rigScale??1,n=3.5*i,s=e.worldForward;s.y=0,s.normalize().multiplyScalar(n),this.userForwardViewPoint.copy(e.worldPosition).sub(s),this.targetObject.position.distanceTo(this.userForwardViewPoint)>2*i&&(this.targetObject.position.copy(this.userForwardViewPoint),oc(this.targetObject,e,!0,!0),this.targetObject.rotateY(Math.PI)),this.oneEuroFilter.filter(this.targetObject.position,t.position,this.context.time.time);const r=this.context.time.deltaTime;if(t.quaternion.slerp(this.targetObject.quaternion,r*5),t.scale.setScalar(i),this.targetObject.removeFromParent(),this.context.scene.add(t),this.context.time.time-this._lastElementRemoveTime>.1){this._lastElementRemoveTime=this.context.time.time;const a=Date.now();for(let l=0;l<this._activeTexts.length;l++){const c=this._activeTexts[l];if(c instanceof Ce.Text&&a-c._activatedTime>2e4){c.removeFromParent(),this._textBuffer.push(c),this._activeTexts.splice(l,1);break}}}}};addLog(e,t){const i=this.getRoot(),n=this.getText();let s=16777215,r=0;switch(e){case"log":s=16777215,r=0;break;case"warn":s=16772761,r=4465152;break;case"error":s=16755370,r=7798784;break}t.length>1e3&&(t=t.substring(0,1e3)+"...");const a=new Date().toISOString().split("T")[1].split(".")[0];n.textContent="["+a+"] "+t,n.visible=!0,n._activatedTime=Date.now(),i.add(n),this._activeTexts.push(n),this.context&&this.context.scene.add(i),n.set({backgroundColor:s,color:r}),Ce.update()}ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png")?.addEventListener("ready",()=>{Ce.update()}))}textOptions={fontSize:this.defaultFontSize,fontFamily:this.familyName,padding:.03,margin:.005,color:0,backgroundColor:16777215,backgroundOpacity:.4,borderRadius:.03,offset:.025};_textBuffer=[];_activeTexts=[];getText(){const e=this.getRoot();if(this._textBuffer.length>0){const i=this._textBuffer.pop();return i.visible=!0,setTimeout(()=>this.disableDepthTestRecursive(i),100),i}if(e.children.length>20&&this._activeTexts.length>0)return this._activeTexts.shift();const t=new Ce.Text(this.textOptions);return setTimeout(()=>this.disableDepthTestRecursive(t),500),setTimeout(()=>this.disableDepthTestRecursive(t),1500),t}disableDepthTestRecursive(e,t=0){for(let n=0;n<e.children.length;n++){const s=e.children[n];s instanceof k&&this.disableDepthTestRecursive(s,t+1)}e.renderOrder=10*t,e.layers.set(2);const i=e.material;i&&(i.depthWrite=!1,i.depthTest=!1,i.transparent=!0),t===0&&Ce.update()}getRoot(){if(this.root)return this.root;const e=this.defaultFontSize,t={boxSizing:"border-box",fontFamily:this.familyName,width:"2.6",fontSize:e,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:0,whiteSpace:"pre-wrap",flexDirection:"column-reverse"};return this.root=new Ce.Block(t),this.root}}let yr=null;function _O(){yr||(yr=new bO),yr.onEnable();for(const o in rc){rc[o]=console[o];let e=!1;console[o]=function(){if(rc[o]?.apply(console,arguments),!e)try{e=!0,h_(o,...arguments)}finally{e=!1}}}}function vO(){yr?.onDisable();for(const o in rc)console[o]=rc[o]}const ac=new Map;function h_(o,...e){try{switch(ac.clear(),o){case"log":yr?.addLog("log",t());break;case"warn":yr?.addLog("warn",t());break;case"error":yr?.addLog("error",t());break}}catch(s){console.error("Error in spatial console",s)}finally{ac.clear()}function t(){let s="";for(let r=0;r<e.length;r++){const a=e[r];s+=i(a),r<e.length-1&&(s+=", ")}return s}function i(s,r=0){if(typeof s=="string")return'"'+s+'"';if(typeof s=="number"){if(s%1!==0){const a=s.toFixed(5),l=a.indexOf(".");let c=a.length-1;for(;c>l&&a[c]==="0";)c--;return a.substring(0,c+1)}return s.toString()}else if(Array.isArray(s)){let a="[";for(let l=0;l<s.length;l++){const c=s[l];a+=i(c,r+1),l<s.length-1&&(a+=", ")}return a+="]",a}else{if(s===null)return"null";if(s===void 0)return"undefined";if(typeof s=="function")return s.name+"()"}if(s instanceof ee)return`(${i(s.x)}, ${i(s.y)})`;if(s instanceof b)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)})`;if(s instanceof pe)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof U)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof ve||s instanceof Le)return s.name;if(s instanceof J0)return`[${s.elements.join(", ")}]`;if(s instanceof K)return`[${s.elements.join(", ")}]`;if(s instanceof ds)return s.mask.toString();if(typeof s=="object"){if(ac.has(s))return"*";let a=`{
83
- `;a+=n(r);const l=Object.keys(s);let c="";for(let h=0;h<l.length;h++){const d=l[h],p=s[d];if(ac.has(p)){c+="";continue}ac.set(p,!0),c+=d+":"+i(p,r+1),h<l.length-1&&(c+=", "),c.length>=60&&(c+=`
84
- `,c+=n(r),a+=c,c="")}return a+=c,a+=`
85
- }`,a}return s}function n(s){let r="";for(let a=0;a<s;a++)r+=" ";return r}}const wO=v("nodevlogs");function Te(o,e=ki.Log){pr(e,o)}function ye(o){Te(o,ki.Warn)}function lc(o){Te(o,ki.Error)}let ig,ng;function A(){if(wO)return!1;if(ig!==void 0)return ig;if(ng!==void 0)return ng;let o=$i();return o||(o=window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),ng=o,o}function xO(o){ig=o}let Hi,br=null,$n=null,cc=!1,d_=null;const u_="terminal",SO=v("console");SO&&og();const CO=Symbol("consoleParent");function og(){if(Hi){Hi.showSwitch();return}RO()}function p_(){Hi&&(Hi.hide(),Hi.hideSwitch())}function PO(){d_||(d_=setInterval(OO,500))}let m_=0;function OO(){const o=Nb(),e=o!==m_;m_=o,e&&kO()}function kO(){og(),$n&&($n.setAttribute("error","true"),$n.innerText="\u{1F92C}")}function MO(){$n&&($n.removeAttribute("error"),$n.innerText=u_)}function RO(o=!1){if(Hi!==void 0||cc)return;cc=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),cc=!1,Hi=null;return}cc=!1,PO(),Hi=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&Hi.addPlugin(TO()),br=AO(),br&&(br[CO]=br.parentElement,br.style.position="absolute",br.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),Hi.setSwitchPosition(20,30),$n=EO(),$n){$n.innerText=u_,$n.addEventListener("click",MO);const i=document.createElement("style"),n=40;i.innerHTML=`
86
- #__vconsole .vc-switch {
87
- border: 1px solid rgba(255, 255, 255, .1);
88
- border-radius: 50%;
89
- width: ${n}px;
90
- height: ${n}px;
91
- padding: 0;
92
- line-height: ${n}px;
93
- font-size: ${n*.4}px;
94
- text-align: center;
95
- background: #ffffff5c;
96
- backdrop-filter: blur(16px);
97
- -webkit-backdrop-filter: blur(16px);
98
- user-select: none;
99
- pointer-events: auto;
100
- transition: transform .2s ease-in-out;
101
- box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
102
-
103
- font-family: 'Material Symbols Outlined';
104
- color: black;
105
- font-size: 2.3em;
106
- font-weight: 100;
107
- }
108
- #__vconsole .vc-switch:hover {
109
- cursor: pointer;
110
- transform: scale(1.1);
111
- transition: transform .1s ease-in-out, background .1s linear;
112
- background: rgba(245, 245, 245, .8);
113
- outline: rgba(0, 0, 0, .05) 1px solid;
114
- }
115
- #__vconsole .vc-switch[error] {
116
- background: rgba(255,0,0,.2);
117
- animation: vconsole-notify 1s ease-in-out;
118
- line-height: 35px;
119
- }
120
- @keyframes vconsole-notify {
121
- from {
122
- transform: scale(1, 1);
123
- }
124
- 10% {
125
- transform: scale(1.3, 1.3);
126
- }
127
- 70% {
128
- transform: scale(1.4, 1.4);
129
- }
130
- to {
131
- transform: scale(1, 1);
132
- }
133
- }
134
- #__vconsole .vc-panel {
135
- font-family: monospace;
136
- font-size: 11px;
137
- }
138
- #__vconsole .vc-plugin-box.vc-actived {
139
- height: 100%;
140
- }
141
- #__vconsole .vc-mask {
142
- overflow: hidden;
143
- }
144
- `,br?.prepend(i),o===!0&&Nb()<=0&&p_(),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.":"")),cc=!1,Hi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function TO(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),Hi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}function EO(){return document.querySelector("#__vconsole .vc-switch")||null}function AO(){return document.querySelector("#__vconsole")||null}const g_=v("debugdefines");fs('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),fs('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),fs('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),fs('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),fs('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.12.0-beta";'),fs('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),fs('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Dec 04 2025 15:37:58 GMT+0000 (Coordinated Universal Time)";'),fs('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const bn="4.12.0-beta",Fd="undefined",sg="Thu Dec 04 2025 15:37:58 GMT+0000 (Coordinated Universal Time)";g_&&console.log(`Engine version: ${bn} (generator: ${Fd})
145
- Project built at ${sg}`);const Ia=NEEDLE_PUBLIC_KEY,ko="needle_isActiveInHierarchy",_r="builtin_components",hc="needle_editor_guid";function fs(o){try{(0,eval)(o)}catch(e){g_&&console.error(e)}}let f_,y_=null;function _n(){return f_}function rg(o){if(o==null){console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");return}y_!==o&&(y_=o,f_=new o)}function IO(o,e){if(typeof window!==void 0&&window.SPECTOR){console.log(window.SPECTOR);const t=new URLSearchParams(window.location.search);if(t.has("spector")){let i=function(){if(n>o.time.frame)return window.requestAnimationFrame(()=>i());const r=s.captureCanvas(e);r&&r instanceof Promise?r.then(()=>s.displayUI()):s.displayUI()};const n=Number.parseInt(t.get("spector")||"0")||0;console.log("Scheduled Spector capture at frame #"+n);const s=new window.SPECTOR.Spector;s.spyCanvases=!0,i();return}else A()&&console.debug("Spector available: Add '?spector=<frame>' to the URL to enable it and capture a frame.")}}const Mi=Symbol("shadowDomOwner"),LO=v("debugpatch");function Ud(o,e,t,i){const n=LO===e;if(!t&&!i)return;const s=e+"___needle";DO(o,e,t,i);const r=Object.getOwnPropertyDescriptor(o,e),a=o[e];n&&console.log("Patch",o.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",o.constructor.name,e,r),typeof r.value=="function"&&(o[e]=__(r.value,o,e))):(n&&console.log("Create patch with new property",o.constructor.name,e,r),Object.defineProperty(o,e,{set:function(l){if(typeof l=="function")this[s]=__(l,o,e);else{const c=this[s];v_(o,e,this,c,l),this[s]=l,w_(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function jO(o,e,t){const i=lg(o,e);if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];s.prefix===t&&(s.prefix=null),s.postfix===t&&(s.postfix=null),!s.prefix&&!s.postfix&&i.splice(n,1)}}const b_=Symbol("Needle:Patches:WrappedFunction");function __(o,e,t){if(o[b_])return o;const i=function(...n){v_(e,t,this,...n);const s=o.apply(this,n);return w_(e,t,this,s,...n),s};return i[b_]=!0,i}const zd="Needle:Patches";function ag(){return globalThis[zd]||(globalThis[zd]=new WeakMap),globalThis[zd]}function lg(o,e){const t=ag().get(o);return t?t.get(e):null}function DO(o,e,t,i){let n=ag().get(o);n||(n=new Map,ag().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function v_(o,e,t,...i){if(!t)return;const n=lg(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function w_(o,e,t,i,...n){if(!t)return;const s=lg(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}const La=[];function Nd(o){La.indexOf(o)===-1&&La.push(o)}function BO(o){const e=La.indexOf(o);e!==-1&&La.splice(e,1)}const ja=[];function cg(o){ja.indexOf(o)===-1&&ja.push(o)}function FO(o){const e=ja.indexOf(o);e!==-1&&ja.splice(e,1)}function x_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<La.length;e++)La[e](o)}function S_(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<ja.length;e++)ja[e](o)}const st=v("debuginput");var Vd=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(Vd||{}),Ee=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Ee||{});class Mo extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new vo(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}_ray;space;isClick=!1;isDoubleClick=!1;get used(){return this._used}_used=!1;use(){this._used=!0}get pointerId(){return this._pointerid}_pointerid;get pointerType(){return this._pointerType}_pointerType;get type(){return this._type}_type;metadata={};intersections=new Array;constructor(e,t,i){super(e,i),this.clientZ=i.clientZ,this._pointerid=i.pointerId,this._pointerType=i.pointerType,this._type=e,this.deviceIndex=i.deviceIndex,this.origin=i.origin,this.source=t,this.mode=i.mode,this._ray=i.ray,this.space=i.device}_immediatePropagationStopped=!1;get immediatePropagationStopped(){return this._immediatePropagationStopped}_propagationStopped=!1;get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}stopPropagation(){this._propagationStopped=!0,super.stopPropagation(),this.source?.stopPropagation(),st&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class dc extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class UO{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var ai=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(ai||{});class C_{_eventListeners={};addEventListener(e,t,i){if(this._eventListeners[e]||(this._eventListeners[e]=[]),!t||typeof t!="function"){console.error("Invalid call to addEventListener: callback is required and must be a function!");return}i?i={...i}:i={};let n=0;i?.queue!=null&&(n=i.queue);const s=this._eventListeners[e],r=s.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(s.push({priority:n,listeners:[{callback:t,options:i}]}),s.sort((a,l)=>a.priority-l.priority))}removeEventListener(e,t,i){if(!this._eventListeners[e]||!t)return;const n=this._eventListeners[e];if(i?.queue!=null){const s=n.find(a=>a.priority===i.queue);if(!s)return;const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}else for(const s of n){const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}}dispatchEvent(e){let t=!1;if(e instanceof dc){const i=this._eventListeners[e.type];if(i)for(const n of i)for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}if(e instanceof Mo){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}if(e.immediatePropagationStopped){t=!0,st&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,st&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const s of e)if(i===s){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new ee];_pointerPositionsLastFrame=[new ee];_pointerPositionsDelta=[new ee];_pointerPositionsRC=[new ee];_pointerPositionDown=[new b];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":st&&Te("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":st&&Te("Create Pointer move"),this.onMove(e);break;case"pointerup":st&&Te("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}constructor(e){this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}_htmlEventSource;bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){for(const e in this._eventListeners)this._eventListeners[e].length=0;window.removeEventListener("contextmenu",this.onContextMenu),this._htmlEventSource?.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),this._htmlEventSource?.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}onLostFocus=()=>{for(const e in this.keysPressed)this.keysPressed[e].pressed=!1};_receivedPointerMoveEventsThisFrame=new Array;onEndOfFrame=()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let e=0;e<this._pointerUp.length;e++)this._pointerUp[e]=!1;for(let e=0;e<this._pointerDown.length;e++)this._pointerDown[e]=!1;for(let e=0;e<this._pointerClick.length;e++)this._pointerClick[e]=!1;for(let e=0;e<this._pointerDoubleClick.length;e++)this._pointerDoubleClick[e]=!1;for(const e of this._pointerPositionsDelta)e.set(0,0);for(let e=0;e<this._mouseWheelChanged.length;e++)this._mouseWheelChanged[e]=!1;for(let e=0;e<this._mouseWheelDeltaY.length;e++)this._mouseWheelDeltaY[e]=0};canReceiveInput(e){return e.target===this.context.renderer?.domElement||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&q.isMozillaXR()?!0:(st&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(st&&console.log(`key down ${e.code}, ${this.context.application.hasFocus}`,e),!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(t&&t.pressed)return;this.keysPressed[e.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:e.key,code:e.code};const i=new dc("keydown",e,e);this.onDispatchEvent(i)};onKeyPressed=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!0,t.frame=this.context.time.frameCount+1;const i=new dc("keypress",e,e);this.onDispatchEvent(i)};onKeyUp=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!1,t.frame=this.context.time.frameCount+1;const i=new dc("keyup",e,e);this.onDispatchEvent(i)};onWheelWindow=e=>{document.pointerLockElement&&this.onMouseWheel(e)};onMouseWheel=e=>{if(this.canReceiveInput(e)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const t=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=t+e.deltaY};onPointerDown=e=>{if(this.context.isInAR||this.canReceiveInput(e)===!1)return;e.target instanceof HTMLElement&&e.target.setPointerCapture(e.pointerId);const t=this.getPointerId(e);st&&Te(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Mo("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:i,pressure:e.pressure});this.onDown(n)};onPointerMove=e=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(e.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(e.pointerId);let t=e.button;e.pointerType==="mouse"&&(t=this.getFirstPressedButtonForPointer(0)??0);const i=this.getPointerId(e,t);t===-1&&(t=i);const n=this.getAndUpdateSpatialObjectForScreenPosition(i,e.clientX,e.clientY),s=new Mo("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:i,button:t,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:n,pressure:e.pressure});this.onMove(s)};onPointerCancel=e=>{this.context.isInAR||(st&&console.log("Pointer cancel",e),this.onPointerUp(e))};onPointerUp=e=>{if(this.context.isInAR)return;e.target instanceof HTMLElement&&e.target.releasePointerCapture(e.pointerId);const t=this.getPointerId(e),i=new Mo("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),pressure:e.pressure});this.onUp(i),this._pointerIds[t]=-1,st&&console.log("ID="+t,"PointerId="+e.pointerId,"ALL:",[...this._pointerIds])};getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}onTouchStart=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Mo("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onDown(r)}};onTouchMove=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Mo("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,pressure:i.force});this.onMove(r)}};onTouchEnd=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),s=new Mo("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(s),this._pointerIds[n]=-1}};tempNearPlaneVector=new b;tempFarPlaneVector=new b;tempLookMatrix=new K;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new k,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const s=this.context.mainCamera;if(s){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(s),a.unproject(s);const l=s.worldUp||D(0,1,0).applyQuaternion(be(s));this.tempLookMatrix.lookAt(a,r,l),n.position.set(r.x,r.y,r.z),n.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return n}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),i=e.clientX,n=e.clientY,s=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return st&&!s&&console.log("Not in rect",t,i,n),s}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,st?e:""),st&&console.log(e.pointerType,"DOWN",t),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new b);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new ee);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){st&&console.log(e.pointerType,"UP",t,"was not down");return}st&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let a=this._pointerEventsPressed.length-1;a>=0;a--)if(this._pointerEventsPressed[a].pointerId===t){this._pointerEventsPressed.splice(a,1);break}if(!this._pointerPositionDown[t]){st&&ye("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const i=this._pointerUpTime[t],n=this._pointerDownTime[t],s=this.context.time.realtimeSinceStartup,r=s-n;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=s,r<1){let a=e.clientX-this._pointerPositionDown[t].x,l=e.clientY-this._pointerPositionDown[t].y,c=0;if(e.isSpatial&&e.clientZ!=null&&(c=e.clientZ-this._pointerPositionDown[t].z,a*=200,l*=200,c*=200),Math.abs(a)<5&&Math.abs(l)<5&&Math.abs(c)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const h=s-i;st&&console.log("CLICK",t,a,l,c,h),h<this._doubleClickTimeThreshold&&h>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new ee);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new ee);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new ee);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let s=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const h=e.source;s===0&&h.movementX!==0&&(s=h.movementX||0),r===0&&h.movementY!==0&&(r=h.movementY||0)}n.x+=s,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new ee);const c=this._pointerPositionsRC[t];c.set(a,l),this.convertScreenspaceToRaycastSpace(c)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(st&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=z.Current;try{z.Current=this.context,this.dispatchEvent(e)}finally{z.Current=t}}}const Da=new K().makeRotationY(Math.PI),Gi=new U().setFromAxisAngle(new b(0,1,0),Math.PI),zO=v("debugwebxr");class NO{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new k,this.gameObject.name="Implicit XR Rig",zO){const e=Cg(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Ro=v("debugwebxr"),Wd=v("debugcustomgesture"),VO="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",WO="generic-trigger",$O=new U().setFromEuler(new ot(wo.degToRad(0),wo.degToRad(-90),wo.degToRad(-90))),HO=new b(.04,-.04,0);class hg{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new K;_gripPosition=new b;_gripQuaternion=new U;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new U;_rayMatrix=new K;_rayPosition=new b;_rayQuaternion=new U;get gripPosition(){return D(this._gripPosition)}get gripQuaternion(){return ri(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return D(this._linearVelocity).applyQuaternion(Gi)}get rayPosition(){return D(this._rayPosition)}get rayQuaternion(){return ri(this._rayQuaternion)}get gripWorldPosition(){return D(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return ri(this._gripWorldQuaternion)}_gripWorldQuaternion=new U;get rayWorldPosition(){return D(this._rayWorldPosition)}_rayWorldPosition=new b;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return ri(this._rayWorldQuaternion)}_rayWorldQuaternion=new U;get pinchPosition(){return D(this._pinchPosition)}_pinchPosition=new b;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?be(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Gi),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(D(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}_ray;_hand_wristDotUp=void 0;get handWristDotUp(){if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const e=this.handObject?.joints.wrist;if(e){const t=D(0,1,0).applyQuaternion(e.quaternion),i=D(0,1,0).dot(t);return this._hand_wristDotUp=i}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){return this.isHandUpsideDown&&this.getGesture("pinch")?.isDown}get object(){return this._object}_object;_gripSpaceObject;_raySpaceObject;model=null;_debugAxesHelper=new Si(.15);_debugGripAxesHelper=new Si(.07);_debugRayAxesHelper=new Si(.07);async getModelUrl(){return this.getMotionController?.then(e=>e?.assetUrl||null)}constructor(e,t,i){this.xr=e,this.inputSource=t,this.index=i,this._object=new k,this._object.name=`NeedleXRController_${i}`,Ro&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new k,this._raySpaceObject=new k,this._gripSpaceObject.name=`NeedleXRController_${i}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${i}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new vo,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}_hitTestSourcePromise=null;_requestHitTestSource(){return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay})?.then(e=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=e:(e.cancel(),null)))??null:null}onPointerHits=e=>{};onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){B.DrawSphere(this.rayWorldPosition,.003),B.DrawDirection(this.rayWorldPosition,D(0,0,10).applyQuaternion(this.rayWorldQuaternion));const e=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),t=this.inputSource.profiles.join(`
146
- `);let i=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
147
- C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(i+=`
148
- Pinch: ${this.getGesture("pinch")?.value.toFixed(3)}`),i+=`
149
- `+t,i+=`
150
- `+(this.inputSource.targetRaySpace?"Ray: x":"Ray: -")+(this.inputSource.gripSpace?" Grip: x":" Grip: -")+(this.inputSource.gamepad?` Gamepad: ${this.inputSource.gamepad.mapping}`:" Gamepad: -"),this.inputSource.gamepad){const n=this.inputSource.gamepad;let s="[btns "+n.buttons.length+"]: "+n.buttons.map(r=>r.value.toPrecision(1)).join(",");s+=`
151
- [axes `+n.axes.length+"]: "+n.axes.map(r=>r.toPrecision(1)).join(","),i+=`
152
- `+s}if(this._layout){i+=`
153
- Layout: `;for(const n of Object.keys(this._layout.components||{})){const s=this.getStick(n),r=this._layout.components[n]?.gamepadIndices,a=r?Object.entries(r).map(l=>l[0][0].toUpperCase()+l[0].slice(1)+"="+l[1]).join(","):"";i+=`
154
- ${n}: ${this._layout.components[n]?.type} [${a}] (${s.x.toPrecision(2)},${s.y.toPrecision(2)})`}}B.DrawLabel(e,i,.006)}onUpdateFrame(e){if(this._handJointPoses.clear(),this._hand_wristDotUp=void 0,!this.xr.referenceSpace||!this.inputSource.gamepad?.connected){this._isTracking=!1;return}const t=e.getPose(this.inputSource.targetRaySpace,this.xr.referenceSpace);this._isTracking=t!=null;let i=null,n=null,s=null,r=null;if(t){const h=t.transform;this._rayMatrix.fromArray(h.matrix).premultiply(Da),this._rayMatrix.decompose(this._rayPosition,this._rayQuaternion,D(1,1,1)),s=D(h.position),r=ri(h.orientation),this._rayPositionRaw.copy(s),this._rayRotationRaw.copy(r)}if(this.inputSource.gripSpace){const h=e.getPose(this.inputSource.gripSpace,this.xr.referenceSpace);if(h){const d=h.transform;if(i=D(d.position),n=ri(d.orientation),this._gripMatrix.fromArray(d.matrix).premultiply(Da),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,D(1,1,1)),"linearVelocity"in h&&h.linearVelocity){const p=h.linearVelocity;this._linearVelocity.set(p.x,p.y,p.z)}}}this.xr.context.mainCamera?.parent&&(this._object.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._object),this._gripSpaceObject!==void 0&&this._gripSpaceObject?.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._gripSpaceObject),this._raySpaceObject!==void 0&&this._raySpaceObject?.parent!==this.xr.context.mainCamera?.parent&&this.xr.context.mainCamera.parent.add(this._raySpaceObject));const a=this.hand;if(a){let h=!1;const d=a.get("wrist"),p=d&&this.getHandJointPose(d,e);if(p){h=!0;const g=p.transform.position,y=p.transform.orientation;this._object.position.set(g.x,g.y,g.z),this._object.quaternion.set(y.x,y.y,y.z,y.w).multiply(Gi)}h||(this._object.position.copy(this._rayPosition),this._object.quaternion.copy(this._rayQuaternion).multiply(Gi));const m=a.get("middle-finger-metacarpal"),f=m&&this.getHandJointPose(m,e);f&&(this._gripMatrix.fromArray(f.transform.matrix).premultiply(Da),this._gripMatrix.decompose(this._gripPosition,this._gripQuaternion,D(1,1,1)),i=D().copy(f.transform.position),n=ri().copy(f.transform.orientation),n.multiply($O),i.add(D(HO).applyQuaternion(n)))}else this.inputSource.gripSpace&&this.targetRayMode==="transient-pointer"&&i&&n?(this._object.position.copy(i),this._object.quaternion.copy(n).multiply(Gi)):s&&r&&(this._object.position.copy(s),this._object.quaternion.copy(r).multiply(Gi));Ro&&(s&&r&&(this._raySpaceObject?.position.copy(s),this._raySpaceObject?.quaternion.copy(r).multiply(Gi)),i&&n&&(this._gripSpaceObject?.position.copy(i),this._gripSpaceObject?.quaternion.copy(n).multiply(Gi)));const l=this.xr.context.mainCamera?.parent,c=l?be(l):void 0;i&&n&&(this._gripWorldPosition.copy(i),l&&this._gripWorldPosition.applyMatrix4(l.matrixWorld),this._gripWorldQuaternion.copy(n),this._gripWorldQuaternion.multiply(Gi),c&&this._gripWorldQuaternion.premultiply(c)),this.updateRayWorldPosition(),this.updateRayWorldQuaternion()}onDisconnected(){this._connected=!1,Ro&&console.warn("Controller disconnected",this.index);for(const e of this._object.children)this.xr.context.scene.attach(e);this._object?.removeFromParent(),this._debugAxesHelper?.removeFromParent(),this._debugGripAxesHelper?.removeFromParent(),this._debugRayAxesHelper?.removeFromParent(),this._gripSpaceObject?.removeFromParent(),this._raySpaceObject?.removeFromParent(),this.unsubscribeEvents(),this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}getButton(e){if(!this._layout)return;switch(e){case"primary-button":if(this.isLeft)e="x-button";else if(this.isRight)e="a-button";else return;break;case"primary":return this.hand?this.getGesture("pinch"):this.toNeedleGamepadButton(0,e);case"xr-standard-trigger":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(0,e);break;case"xr-standard-squeeze":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(1,e);break;case"xr-standard-thumbstick":if(this.inputSource.gamepad)return this.toNeedleGamepadButton(3,e);break}if(this._buttonMap.has(e))return this.toNeedleGamepadButton(this._buttonMap.get(e),e);const t=this._layout?.components[e];if(t?.gamepadIndices)switch(t.type){case"button":case"squeeze":if(this.inputSource.gamepad){const i=t.gamepadIndices.button;return this._buttonMap.set(e,i),this.toNeedleGamepadButton(i,e)}break;default:console.warn("Unsupported component type",t.type);break}this._buttonMap.set(e,void 0)}getGesture(e){const t=this.states[e];if(!t)return null;this.states[e]=t;const i=this._needleGamepadButtons[e]||new O_(void 0,e);return i.pressed=t.pressed,i.value=t.value,i.isDown=t.isDown,i.isUp=t.isUp,this._needleGamepadButtons[e]=i,i}getPointerId(e){if((e==="primary"||e==="pinch")&&(e=0),typeof e!="number"){const t=this._buttonMap.get(e);if(t===void 0)return;e=t}return this.index*10+e}_needleGamepadButtons={};toNeedleGamepadButton(e,t){if(!this.inputSource.gamepad?.buttons)return;const i=this.inputSource.gamepad?.buttons[e],n=this.states[e],s=this._needleGamepadButtons[e]||new O_(e,t);return i&&(s.pressed=i.pressed,s.value=i.value,s.touched=i.touched),n&&(s.isDown=n.isDown,s.isUp=n.isUp),this._needleGamepadButtons[e]=s,s}getStick(e){if(!this._layout)return{x:0,y:0,z:0};if(this.isHand)return{x:0,y:0,z:0};e==="primary"&&this._layout.components["xr-standard-thumbstick"]&&(e="xr-standard-thumbstick");const t=this._layout?.components[e];if(t?.gamepadIndices)switch(t.type){case"thumbstick":case"touchpad":if(this.inputSource.gamepad){const i=t.gamepadIndices.xAxis,n=t.gamepadIndices.yAxis;let s=this.inputSource.gamepad.axes[i]||0,r=this.inputSource.gamepad.axes[n]||0;s*=-1,r*=-1;const a=t.gamepadIndices.button,l=this.inputSource.gamepad?.buttons[a]?.value||0;return{x:s,y:r,z:l}}}return{x:0,y:0,z:0}}_buttonMap=new Map;_motioncontroller;_layout;getMotionController;initialize(){if(this._hasSelectEvent=this.profiles.includes("generic-hand-select")||this.profiles.some(e=>e.startsWith("generic-trigger")),this._isMetaQuestTouchController=this.profiles.includes("meta-quest-touch-plus")||this.profiles.includes("oculus-touch-v3"),this._isMxInk=this.profiles.includes("logitech-mx-ink"),!this._layout){if(this.inputSource.targetRayMode==="transient-pointer")return;const e=rP(this.inputSource,VO,WO);this.getMotionController=e.then(t=>{if(!this.connected)return null;this._motioncontroller=new aP(this.inputSource,t.profile,t.assetPath||"");const i=t.profile.layouts[this.inputSource.handedness];if(this._layout=i,this._layout){if(!this._layout.gamepad?.length){this._layout.gamepad=[];for(const n in this._layout.components){const s=this._layout.components[n];this._layout.gamepad[s.gamepadIndices.button]=n}}this.profiles.length>=1&&this.profiles[0]==="htc-vive-focus-plus"&&this.inputSource.gamepad&&this.inputSource.gamepad.axes.length===4&&!this._layout.components["xr-standard-thumbstick"]&&(this._layout.components["xr-standard-thumbstick"]={type:"thumbstick",gamepadIndices:{xAxis:2,yAxis:3}})}return this._motioncontroller}).catch(t=>(this.inputSource&&console.warn("Couldn't initialize motion controller profile for ",this.inputSource,t),null))}}emitPointerDownEvent=!0;emitPointerUpEvent=!0;emitPointerMoveEvent=!0;pointerMoveDistanceThreshold=.03;pointerMoveAngleThreshold=.05;subscribeEvents(){this.xr.session.addEventListener("selectstart",this.onSelectStart),this.xr.session.addEventListener("selectend",this.onSelectEnd),this.xr.session.addEventListener("squeezestart",this.onSequeezeStart),this.xr.session.addEventListener("squeezeend",this.onSequeezeEnd)}unsubscribeEvents(){this.xr.session.removeEventListener("selectstart",this.onSelectStart),this.xr.session.removeEventListener("selectend",this.onSelectEnd),this.xr.session.removeEventListener("squeezestart",this.onSequeezeStart),this.xr.session.removeEventListener("squeezeend",this.onSequeezeEnd)}_selectButtonIndex=void 0;_squeezeButtonIndex=void 0;onSelectStart=e=>{if(!this.emitPointerDownEvent||this.inputSource!==e.inputSource)return;this.onUpdateFrame(e.frame),this._hasSelectEvent=!0;const t=this._layout?.selectComponentId,i=this._layout?.components[t]?.gamepadIndices?.button;i!==void 0&&(this._selectButtonIndex=i),!Wd&&(Ro&&B.DrawDirection(this.rayWorldPosition,D(0,.01,1).applyQuaternion(this.rayWorldQuaternion),16711680,10),this.emitPointerEvent(Ee.PointerDown,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSelectEnd=e=>{this.emitPointerUpEvent&&(Wd||this.inputSource===e.inputSource&&this.emitPointerEvent(Ee.PointerUp,this._selectButtonIndex||0,"xr-standard-trigger",!0,e))};onSequeezeStart=e=>{this.emitPointerDownEvent&&this.inputSource===e.inputSource&&(this._squeezeButtonIndex=this._layout?.components["xr-standard-squeeze"]?.gamepadIndices?.button,this._squeezeButtonIndex!==void 0&&(Ro&&B.DrawDirection(this.rayWorldPosition,D(0,.01,1).applyQuaternion(this.rayWorldQuaternion),255,10),this.emitPointerEvent(Ee.PointerDown,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)))};onSequeezeEnd=e=>{this.emitPointerUpEvent&&this.inputSource===e.inputSource&&this._squeezeButtonIndex!==void 0&&this.emitPointerEvent(Ee.PointerUp,this._squeezeButtonIndex||0,"xr-standard-squeeze",!0,e)};states={};updateInputEvents(){if(this.gamepad?.buttons){for(let e=0;e<this.gamepad.buttons.length;e++){const t=this.gamepad.buttons[e],i=this.states[e]||new P_;let n=null;this._isMxInk&&(e===4||e===5)?(t.value>0&&!i.pressed?(n="pointerdown",i.isDown=!0,i.isUp=!1):t.value===0&&i.pressed?(n="pointerup",i.isDown=!1,i.isUp=!0):i.pressed&&(n="pointermove",i.isDown=!1,i.isUp=!1),i.pressed=t.value>0,i.value=t.value):(t.pressed&&!i.pressed?(n="pointerdown",i.isDown=!0,i.isUp=!1):!t.pressed&&i.pressed?(n="pointerup",i.isDown=!1,i.isUp=!0):(i.isDown=!1,i.isUp=!1),i.pressed=t.pressed,i.value=t.value),this.states[e]=i;const s=e!==this._selectButtonIndex&&e!==this._squeezeButtonIndex;if(n!=null&&s){let r=this._layout?.gamepad[e];this._isMxInk&&e===4&&(r="stylus-touch"),this._isMxInk&&e===5&&(r="stylus-tip"),(Ro||Wd)&&console.log("Emitting pointer event",n,e,r,t.value,this.gamepad,this._layout),this.emitPointerEvent(n,e,r??"none",!1,null,t.value)}}if(this._isMetaQuestTouchController){const e=this.gamepad.buttons.length-1,t=this.states[e];if(t&&t.isDown){const i=this.context.menu;i.spatialMenuIsVisible?i.setSpatialMenuVisible(!1):this.context.menu.setSpatialMenuVisible(!0)}}}if(this.hand){const e=this.handObject;if(e){const t=e.joints["index-finger-tip"],i=e.joints["thumb-tip"];if(t&&i){const n=t.position.distanceTo(i.position);this._pinchPosition.lerpVectors(t.position,i.position,.5);const s=this.xr.context.mainCamera?.parent;if(s&&this._pinchPosition.applyMatrix4(s.matrixWorld),n!==0){const r=this.states.pinch||new P_,a=(.02+.01)*1.5;r.value=1-(n-.02)/a;const l=n<.02-.01,c=n>.02+.01;l&&!r.pressed?(Wd&&console.log("pinch start",n),r.isDown=!0,r.isUp=!1,r.pressed=!0):c&&r.pressed?(r.isDown=!1,r.isUp=!0,r.pressed=!1):(r.isDown=!1,r.isUp=!1),this.states.pinch=r}}}}}_didMoveLastFrame=!1;_lastPointerMovePosition=new b;_lastPointerMoveQuaternion=new U;onUpdateMove(){if(!this.emitPointerMoveEvent)return;let e=!1;if(this._lastPointerMovePosition.distanceTo(this.gripWorldPosition)>this.pointerMoveDistanceThreshold*this.xr.rigScale&&(e=!0),e||this._lastPointerMoveQuaternion.angleTo(this.gripWorldQuaternion)>this.pointerMoveAngleThreshold&&(e=!0),e){this._didMoveLastFrame=!0,this._lastPointerMovePosition.copy(this.gripWorldPosition),this._lastPointerMoveQuaternion.copy(this.gripWorldQuaternion),Ro&&B.DrawLabel(this.rayWorldPosition.add(this.object.worldForward.multiplyScalar(.1)),"move",.01);let t=this.xr.context.input.getFirstPressedButtonForPointer(this.index);t===void 0&&(t=0);const i=this.gamepad?.buttons[t]?.value;this.emitPointerEvent("pointermove",t,"none",!1,null,i)}else this._didMoveLastFrame=!1}pointerInit;emitPointerEvent(e,t,i,n,s=null,r){if(!this.emitEvents){Ro&&e!==Ee.PointerMove&&console.warn("Pointer events are disabled for this controller",this.index,e,t);return}if(this.xr.mode==="immersive-vr"||this.xr.isPassThrough){this.pointerInit.origin=this,this.pointerInit.pointerId=this.getPointerId(t),this.pointerInit.pointerType=this.hand?"hand":"controller",this.pointerInit.button=t,this.pointerInit.buttonName=i,this.pointerInit.isPrimary=n,this.pointerInit.mode=this.inputSource.targetRayMode,this.pointerInit.ray=this.ray,this.pointerInit.device=this.object,this.pointerInit.pressure=r,this.pointerInit.clientX=this._rayPosition.x/this.xr.rigScale,this.pointerInit.clientY=this._rayPosition.y/this.xr.rigScale,this.pointerInit.clientZ=this._rayPosition.z/this.xr.rigScale;const a=z.Current;z.Current=this.xr.context,Ro&&e!=="pointermove"&&console.warn("Pointer event",e,t,i,{...this.pointerInit}),this.xr.context.input.createInputEvent(new Mo(e,s,this.pointerInit)),z.Current=a}}}class P_{isDown=!1;isUp=!1;pressed=!1;value=0}class O_{index;name;touched=!1;pressed=!1;value=0;isDown=!1;isUp=!1;constructor(e,t){this.index=e,this.name=t}}var dg=(o=>(o.Visible="application-visible",o.Hidden="application-hidden",o.MuteChanged="application-mutechanged",o))(dg||{});let uc=!1;const vr=[];function wr(){if(uc)return;A()&&console.debug("[Needle Engine] User input registered: Media playback is now allowed."),uc=!0;const o=[...vr];vr.length=0,o.forEach(e=>e())}document.addEventListener("mousedown",wr),document.addEventListener("pointerup",wr),document.addEventListener("click",wr),document.addEventListener("dragstart",wr),document.addEventListener("touchend",wr),document.addEventListener("keydown",wr),typeof window<"u"&&"userActivation"in navigator&&navigator.userActivation?.isActive&&(A()&&console.debug("[Needle Engine] User input already active: Media playback is now allowed."),vr.length=0,uc=!0);class Dn extends EventTarget{static get userInteractionRegistered(){return uc}static registerWaitForAllowAudio=Dn.registerWaitForInteraction;static registerWaitForInteraction(e){if(e!==null){if(uc){e();return}vr.indexOf(e)===-1&&vr.push(e)}}static unregisterWaitForInteraction(e){const t=vr.indexOf(e);t!==-1&&vr.splice(t,1)}_mute=!1;get muted(){return this._mute}set muted(e){e!==this._mute&&(this._mute=e,this.dispatchEvent(new Event("application-mutechanged")))}context;get hasFocus(){return document.hasFocus()}get isVisible(){return this._isVisible}_isVisible=!0;constructor(e){super(),this.context=e,window.addEventListener("visibilitychange",this.onVisiblityChanged.bind(this),!1)}onVisiblityChanged(e){switch(e.target.visibilityState){case"hidden":this._isVisible=!1,this.dispatchEvent(new Event("application-hidden"));break;case"visible":this._isVisible=!0,this.dispatchEvent(new Event("application-visible"));break}}}const Ba=new Map,Fa=new Map;let k_=0;function To(o,e,t){if(Ba.has(e)||Ba.set(e,new Array),Ba.get(e).push({method:o,options:{once:!1,...t}}),k_<30){const i=Fa.get(e);i&&i?.length>100&&(k_+=1,console.warn(`You have ${i.length} methods registered for Event ${e}.
155
-
156
- This might be a performance issue!
157
- Consider unregistering the methods when they are not needed anymore!
158
-
159
- To unregister you can call the function returned by your event hook (e.g.const unregister = onStart(...))
160
-
161
- or by using the once option like onStart(()=>{}, { once:true }).
162
-
163
- See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for more information.`))}}function ys(o,e){const t=Fa.get(e);if(t){for(let n=0;n<t.length;n++)if(t[n].method===o){t.splice(n,1);return}}const i=Ba.get(e);if(i){for(let n=0;n<i.length;n++)if(i[n].method===o){i.splice(n,1);return}}}function Hn(o,e){e===de.ContextCreated&&ug.delete(o),M_(o,e)}function M_(o,e){e===we.Start&&Ba.get(de.ContextCreated)&&M_(o,de.ContextCreated);const t=e===we.Start||e===de.ContextCreated,i=Fa.get(e);i&&i.length>0&&T_(o,i,t);const n=Ba.get(e);if(n&&n.length>0){const s=[...n];n.length=0,T_(o,s,t),s.length>0&&(Fa.has(e)||Fa.set(e,new Array),Fa.get(e).push(...s))}}const $d=new Array,R_={context:null};function T_(o,e,t){$d.length=0;for(let n=0;n<e.length;n++)$d.push(e[n]);let i=ug.get(o);for(let n=0;n<$d.length;n++){const s=$d[n];let r=!0;if(i&&i.has(s)&&(r=!1),r)try{R_.context=o,s.method?.call(R_,o)}catch(a){console.error("Error in lifecycle method",a)}if(s.options?.once){for(let a=0;a<e.length;a++)if(e[a]===s){e.splice(a,1);break}}else t&&(i||(i=new Set,ug.set(o,i)),i.add(s))}}const ug=new WeakMap,pg={};function mg(o,e){pg[o]=e}function E_(o){const e=o.getBufferIdentifier(),t=pg[e];return t(o)}function A_(o){return typeof o.guid=="function"?o.guid():null}let gg;function GO(){return gg}function qO(o){gg=o}function I_(o,e){return e||(e={}),e={...gg,...e},o?new xb(o,e):new xb(e)}async function L_(){const o=await import("./vendor-BKGa4GE0.min.js").then(e=>e.bundler);return console.log(o),o.default===void 0?o:o.default}class j_{get isHost(){return this._host!==void 0}_host;_client;_clientData;constructor(){this.onEnable()}onEnable(){this.trySetupHost("HOST-5980e65c-8438-453e-8b35-f13c736dcd81")}async trySetupHost(e){const t=await L_(),i=new t(e);i.on("error",n=>{console.error(n),this._host=void 0,this.trySetupClient(e)}),i.on("open",n=>{this._host=new QO(i)})}async trySetupClient(e){const t=await L_();this._client=new t,this._client.on("error",i=>{console.error("Client error",i)}),this._client.on("open",i=>{console.log("client connected",i),this._clientData=this._client.connect(e,{metadata:{id:i}}),this._clientData.on("open",()=>{console.log("Connected to host")}),this._clientData.on("data",n=>{console.log("<<",n)})})}}class XO{_peer;constructor(e){this._peer=e}}class QO extends XO{get isHost(){return!0}_connections=[];constructor(e){super(e),console.log("I AM THE HOST"),this._peer?.on("connection",this.onConnection.bind(this)),this._peer.on("close",()=>{this.broadcast("BYE")}),setInterval(()=>{this.broadcast("HELLO")},2e3)}onConnection(e){console.log("host connection",e),e.on("open",()=>{this._connections.push(e),this.broadcastConnection(e)})}broadcastConnection(e){const t=this._connections.map(i=>i.metadata?.id).filter(i=>i!==void 0);this.broadcast({type:"connection-list",connections:t})}broadcast(e){if(e!=null){console.log(">>",e);for(const t in this._peer.connections){const i=this._peer.connections[t];if(i)if(Array.isArray(i))for(const n of i)n&&n.send(e);else console.warn(i)}}}}var vn=(o=>(o[o.OnConnection=0]="OnConnection",o[o.OnRoomJoin=1]="OnRoomJoin",o[o.Queued=2]="Queued",o[o.Immediate=3]="Immediate",o))(vn||{});const D_="https://urls.needle.tools/default-networking-backend/index";let qi="wss://networking.needle.tools/socket";const li=!!v("debugnet"),pc=!!(li||v("debugowner")),Hd=v("debugnetbin");var B_=(o=>(o.ConnectionInfo="connection-start-info",o))(B_||{}),te=(o=>(o.Join="join-room",o.Leave="leave-room",o.JoinedRoom="joined-room",o.LeftRoom="left-room",o.UserJoinedRoom="user-joined-room",o.UserLeftRoom="user-left-room",o.RoomStateSent="room-state-sent",o))(te||{});class YO{room;viewId;allowEditing;inRoom}class ZO{room}class KO{userId}var F_=(o=>(o.RequestHasOwner="request-has-owner",o.ResponseHasOwner="response-has-owner",o.RequestIsOwner="request-is-owner",o.ResponseIsOwner="response-is-owner",o.RequestOwnership="request-ownership",o.GainedOwnership="gained-ownership",o.RemoveOwnership="remove-ownership",o.LostOwnership="lost-ownership",o.GainedOwnershipBroadcast="gained-ownership-broadcast",o.LostOwnershipBroadcast="lost-ownership-broadcast",o))(F_||{});class fg{guid;connection;get hasOwnership(){return this._hasOwnership}get isOwned(){return this._isOwned}get isConnected(){return this.connection.isConnected}_hasOwnership=!1;_isOwned=void 0;_gainSubscription;_lostSubscription;_hasOwnerResponse;constructor(e,t){this.connection=e,this.guid=t,this._gainSubscription=this.onGainedOwnership.bind(this),this._lostSubscription=this.onLostOwnership.bind(this),e.beginListen("lost-ownership",this._lostSubscription),e.beginListen("gained-ownership-broadcast",this._gainSubscription),this._hasOwnerResponse=this.onHasOwnerResponse.bind(this),e.beginListen("response-has-owner",this._hasOwnerResponse)}_isWaitingForOwnershipResponseCallback=null;updateIsOwned(){this.connection.send("request-has-owner",{guid:this.guid})}onHasOwnerResponse(e){e.guid===this.guid&&(this._isOwned=e.value)}requestOwnershipIfNotOwned(){return this._isWaitingForOwnershipResponseCallback!==null?this:(this._isWaitingForOwnershipResponseCallback=this.waitForHasOwnershipRequestResponse.bind(this),this.connection.beginListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this.connection.send("request-has-owner",{guid:this.guid}),this)}waitForHasOwnershipRequestResponse(e){e.guid===this.guid&&(this._isWaitingForOwnershipResponseCallback&&(this.connection.stopListen("response-has-owner",this._isWaitingForOwnershipResponseCallback),this._isWaitingForOwnershipResponseCallback=null),this._isOwned=e.value,e.value||(pc&&console.log("request ownership",this.guid),this.requestOwnership()))}requestOwnershipAsync(){return new Promise((e,t)=>{this.requestOwnership();let i=0;const n=()=>{if(i++>10)return t("Timeout");setTimeout(()=>{this.hasOwnership?e(this):n()},100)};n()})}requestOwnership(){return pc&&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?(pc&&console.log("GAINED OWNERSHIP",this.guid),this._hasOwnership=!0):this._hasOwnership=!1)}onLostOwnership(e){e===this.guid&&(pc&&console.log("LOST OWNERSHIP",this.guid),this._hasOwnership=!1,this._isOwned=!1)}}class U_{context;_peer=null;constructor(e){this.context=e}get peer(){return this._peer||(this._peer=new j_),this._peer}tryGetState(e){return e==="invalid"?null:this._state[e]}get connectionId(){return this._connectionId}get isDebugEnabled(){return li}get isConnected(){return this.connected}get currentRoomName(){return this._currentRoomName}get allowEditing(){return this._currentRoomAllowEditing}get currentRoomViewId(){return this._currentRoomViewId}getViewOnlyUrl(){if(this.currentRoomViewId===null)return null;const e=new URL(window.location.href);return e.searchParams.set("view",this.currentRoomViewId),e.href}get isInRoom(){return this._isInRoom}get currentLatency(){return this._currentDelay}get currentServerUrl(){return this._ws?.url??null}sendPing(){this.send("ping",{time:this.context.time.time})}userIsInRoom(e){return this._currentInRoom.indexOf(e)!==-1}_usersInRoomCopy=[];usersInRoom(e=null){e||(e=this._usersInRoomCopy),e.length=0;for(const t of this._currentInRoom)e.push(t);return e}joinRoom(e,t=!1){return e?e.length>1024?(console.error('Room name too long, can not join: "'+e+'". Max length is 1024 characters.'),!1):(this.isInRoom&&this.currentRoomName!==e&&console.warn("Needle Engine is already connected to a networking room. Connecting to multiple rooms is not supported"),this.connect(),li&&console.log("join: "+e),this.send("join-room",{room:e,viewOnly:t},vn.OnConnection),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}leaveRoom(e=null){return e||(e=this.currentRoomName),e?(this.send("leave-room",{room:e}),!0):(console.error('Missing room name, can not join: "'+e+'"'),!1)}send(e,t=null,i=vn.Queued){if(t===null&&(t={}),i===vn.Queued){this._defaultMessagesBuffer.push({key:e,value:t});return}return this.sendWithWebsocket(e,t,i)}sendDeleteRemoteState(e){this.send("delete-state",{guid:e,dontSave:!0}),delete this._state[e]}sendDeleteRemoteStateAll(){this.send("delete-all-state"),this._state={}}sendBinary(e){Hd&&console.log("<< send binary",this.context.time.frame,e.length/1024+" KB"),this._ws?.send(e)}_defaultMessagesBuffer=[];_defaultMessagesBufferArray=[];sendBufferedMessagesNow(){if(!this._ws)return;this._defaultMessagesBufferArray.length=0;const e=Object.keys(this._defaultMessagesBuffer).length;for(const i in this._defaultMessagesBuffer){const n=this._defaultMessagesBuffer[i];if(e<=1){this.sendWithWebsocket(n.key,n.value,vn.Immediate);break}const s=this.toMessage(n.key,n.value);this._defaultMessagesBufferArray.push(s)}if(this._defaultMessagesBuffer.length=0,this._defaultMessagesBufferArray.length>0&&li&&console.log("SEND BUFFERED",this._defaultMessagesBufferArray.length),this._defaultMessagesBufferArray.length<=0)return;const t=JSON.stringify(this._defaultMessagesBufferArray);this._ws?.send(t)}beginListen(e,t){return this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t),t}stopListening(e,t){return this.stopListen(e,t)}stopListen(e,t){if(!t||!this._listeners[e])return;const i=this._listeners[e].indexOf(t);i>=0&&this._listeners[e].splice(i,1)}beginListenBinary(e,t){return this._listenersBinary[e]||(this._listenersBinary[e]=[]),this._listenersBinary[e].push(t),t}stopListenBinary(e,t){if(!this._listenersBinary[e])return;const i=this._listenersBinary[e].indexOf(t);i>=0&&this._listenersBinary[e].splice(i,1)}netWebSocketUrlProvider;registerProvider(e){this.netWebSocketUrlProvider=e}async connect(e){if(this.connected&&e&&e!==qi)return Promise.reject("Can not connect to different server url. Please disconnect first.");if(this.connected)return Promise.resolve(!0);e&&console.debug("Connecting to user provided url "+e);const t=e||this.netWebSocketUrlProvider?.getWebsocketUrl();return t?qi=t:Eb()&&(qi="wss://"+window.location.host+"/socket"),this.connectWebsocket()}disconnect(){this._ws?.close(),this._ws=void 0,qi=void 0,this._currentRoomAllowEditing=!0,this._currentRoomName=null,this._currentRoomViewId=null,this._isInRoom=!1,this._currentInRoom.length=0,this._state={},this._currentDelay=-1}_listeners={};_listenersBinary={};connected=!1;channelId;_connectionId=null;_ws;_waitingForSocket={};_isInRoom=!1;_currentRoomName=null;_currentRoomViewId=null;_currentRoomAllowEditing=!0;_currentInRoom=[];_state={};_currentDelay=-1;_connectingToWebsocketPromise=null;connectWebsocket(){return this._connectingToWebsocketPromise?this._connectingToWebsocketPromise:this._connectingToWebsocketPromise=new Promise(async(e,t)=>{let i=!1;const n=c=>{i||(i=!0,e(c))};if(qi===void 0&&(console.log("Fetch default backend url: "+D_),qi=await(await fetch(D_)).text()),qi===void 0){n(!1);return}console.debug(`\u22A1 Connecting to networking backend on
164
- `+qi);const s=await import("./vendor-BKGa4GE0.min.js").then(c=>c.index),r=s.default?.WebsocketBuilder??s.WebsocketBuilder,a=s.default?.ExponentialBackoff??s.ExponentialBackoff,l=new r(qi).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,A()||li?console.log(`\u229E Connected to networking backend
165
- `+qi):console.debug("\u229E Connected to networking backend",qi),n(!0),this.onSendQueued(vn.OnConnection)}).onClose(c=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let h="Websocket connection closed...";qi?.includes("/socket")||(h+=' Do you perhaps mean to connect to "/socket"?'),console.error(h)}).onError(c=>{console.error("\u22A0 Websocket connection failed..."),n(!1)}).onRetry(()=>{console.log("\u2192 Retry connecting to networking websocket")}).build();l.addEventListener(s.WebsocketEvent.message,(c,h)=>{this.onMessage(c,h)})})}onMessage(e,t){const i=t.data;try{if(typeof i!="string"){i.size&&this.handleIncomingBinaryMessage(i);return}const n=JSON.parse(i);if(Array.isArray(n))for(const s of n)this.handleIncomingStringMessage(s);else this.handleIncomingStringMessage(n);return}catch(n){li&&i==="pong"?console.log("<<",i):A()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){Hd&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new lP(i),s=n.getBufferIdentifier(),r=this._listenersBinary[s],a=E_(n),l=A_(a);if(l&&typeof l=="string"&&(this._state[l]=a),!r)return;const c=a??n;for(const h of r)h(c)}handleIncomingStringMessage(e){if(li&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const r=e.data;r&&(console.assert(r.id!==void 0&&r.id!==null&&r.id.length>0,"server did not send connection id",r.id),console.debug("Your id is: "+r.id,this.context.alias??""),this._connectionId=r.id)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(li&&console.log(e),e){this._isInRoom=!0;const r=e;this._currentRoomName=r.room,this._currentRoomViewId=r.viewId,this._currentRoomAllowEditing=r.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...r.inRoom),(Hd||A())&&console.debug("Joined Needle Engine Room: "+r.room);const a=new URL(window.location.href);a.searchParams.has("room")&&a.searchParams.delete("room"),a.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
166
- ${a.href}`)}this.onSendQueued(vn.OnRoomJoin);break;case"left-room":const n=e;n.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(Hd||A())&&console.debug("Left Needle Engine Room: "+n.room));break;case"user-joined-room":if(e.data){const r=e.data;this._currentInRoom.push(r.userId),li&&console.log(r.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const r=e.data,a=this._currentInRoom.indexOf(r.userId);a>=0&&(li&&console.log(r.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(a,1)),r.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":li&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const s=e.data?.time;s&&(this._currentDelay=this.context.time.time-s),li&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+this._currentInRoom?.length);break}const t=e.data;t&&(this._state[t.guid]=t);let i=this._listeners[e.key];if(i){i=[...i];for(const n of i)try{n(e.data)}catch(s){console.error('Error invoking callback for "'+e.key+'"',s)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,i=vn.OnRoomJoin){if(!this._ws){const s=this._waitingForSocket[i]||[];s.push(()=>this.sendWithWebsocket(e,t,i)),this._waitingForSocket[i]=s;return}const n=JSON.stringify(this.toMessage(e,t));li&&console.log(">>",e),this._ws.send(n)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const i of t)i();t.length=0}}}const mc=v("debugwebxr");class yg{controllerStates=[];userId;context;userStateEvtName;constructor(e,t){this.userId=e,this.context=t,this.userStateEvtName="xr-sync-user-state-"+e,this.context.connection.beginListen(this.userStateEvtName,this.onReceivedControllerState)}dispose(){this.context.connection.stopListen(this.userStateEvtName,this.onReceivedControllerState)}onReceivedControllerState=e=>{mc&&console.log(`XRSync: Received change for ${this.userId}: ${e.type} ${e.handedness}; tracked=${e.isTracking}`);let t=!1;for(let i=0;i<this.controllerStates.length;i++)if(this.controllerStates[i].index===e.index){this.controllerStates[i]=e,t=!0;break}t||this.controllerStates.push(e)};update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const i=this.controllerStates[t];let n=!1;for(let s=0;s<e.controllers.length;s++)e.controllers[s].index===i.index&&(n=!0);n||(mc&&console.log(`XRSync: ${i.type} ${i.handedness} removed`,i.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(i))}for(const t of e.controllers)this.updateControllerStates(t)}}onExitXR(e){for(const t of this.controllerStates)this.sendControllerRemoved(t);this.controllerStates.length=0}sendControllerRemoved(e){e.isTracking=!1,e.guid="",this.context.connection.send(this.userStateEvtName,e),this.context.connection.sendDeleteRemoteState(e.guid)}updateControllerStates(e){const t=this.controllerStates.find(i=>i.index===e.index);if(t){let i=!1;i||=t.isTracking!=e.isTracking,i&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const i={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(i),this.context.connection.send(this.userStateEvtName,i),mc&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class z_{hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.isTracking||!1:void 0}getDeviceType(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(n=>n.handedness===t)?.type||"unknown":void 0}context;constructor(e){this.context=e,this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(te.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(te.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(te.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(te.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(mc&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new yg(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new yg(e,this.context))}};onLeftRoom=()=>{this.context.connection.connectionId&&(this._states.has(this.context.connection.connectionId)||(this._states.get(this.context.connection.connectionId)?.dispose(),this._states.delete(this.context.connection.connectionId)))};onOtherUserJoinedRoom=e=>{const t=e.userId;this._states.has(t)||(mc&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new yg(t,this.context)))};onOtherUserLeftRoom=e=>{const t=e.userId;this._states.has(t)||(this._states.get(t)?.dispose(),this._states.delete(t))};_states=new Map;onUpdate(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.update(e)}onExitXR(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.onExitXR(e)}}class N_{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new xe({color:0,transparent:!0,depthTest:!1,fog:!1,side:Ci}),this._fadeToColorQuad=new G(new Un(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const i=this._fadeToColorQuad,n=this._fadeToColorMaterial;i.parent!==e&&n.opacity>0?e.add(i):n.opacity===0&&i.removeFromParent(),i.layers.set(2),i.material=this._fadeToColorMaterial,i.position.z=-1,i.renderOrder=1/0;const s=this._requestedFadeValue;n.opacity=L.lerp(n.opacity,s,t/.03),Math.abs(n.opacity-s)<=.01&&this._transitionResolve&&(this._transitionResolve(),this._transitionResolve=null,this._transitionPromise=null,this._requestedFadeValue=0)}remove(){this._fadeToColorQuad.removeFromParent()}fadeTransition(){if(this._transitionPromise)return this._transitionPromise;this._requestedFadeValue=1;const e=new Promise(t=>{this._transitionResolve=t});return this._transitionPromise=e,e}_requestedFadeValue=0;_transitionPromise=null;_transitionResolve=null}var xr=(o=>(o[o.Quad=0]="Quad",o[o.Cube=1]="Cube",o[o.Sphere=2]="Sphere",o[o.Cylinder=3]="Cylinder",o[o.RoundedCube=10]="RoundedCube",o))(xr||{});class Sr{static createText(e,t){let i=null;const n=t?.font||ek(t?.familyFamily||null);n instanceof VC?i=this.#t(e,n,t):i==null&&(i=new gn);const s=t?.color||16777215,r=new G(i,t?.material??new pt({color:s}));return this.applyDefaultObjectOptions(r,t),n instanceof Promise?n.then(a=>{r.geometry=this.#t(e,a,t),t?.onGeometry&&t.onGeometry(r)}):t?.onGeometry&&t.onGeometry(r),r}static#t(e,t,i){const n=i?.depth||.1;return new WC(e,{font:t,size:1,depth:n,height:n,bevelEnabled:i?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})}static createOccluder(e){const t=new xe({colorWrite:!1,depthWrite:!0,side:Ci});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let i;const n=t?.color||16777215;switch(e){case"Quad":case 0:{const s=new Un(1,1,1,1),r=t?.material??new pt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new G(s,r),i.name="Quad"}break;case"Cube":case 1:{const s=new Pa(1,1,1),r=t?.material??new pt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new G(s,r),i.name="Cube"}break;case 10:case"RoundedCube":{const s=JO(1,1,1,.1,2),r=t?.material??new pt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new G(s,r),i.name="RoundedCube"}break;case"Sphere":case 2:{const s=new yd(.5,16,16),r=t?.material??new pt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new G(s,r),i.name="Sphere"}break;case"Cylinder":case 3:{const s=new eb(.5,.5,1,32),r=t?.material??new pt({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new G(s,r),i.name="Cylinder"}break;case"ShaderBall":i=new xo,i.name="ShaderBall",tk(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const t=new CS({color:16777215});e?.texture&&"map"in t&&(t.map=e.texture);const i=new PS(t);return this.applyDefaultObjectOptions(i,e),i}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t?.name&&(e.name=t.name),t?.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x||0,t.position.y||0,t.position.z||0)),t?.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x||0,t.rotation.y||0,t.rotation.z||0)),t?.scale&&(typeof t.scale=="number"?e.scale.set(t.scale,t.scale,t.scale):Array.isArray(t.scale)?e.scale.set(t.scale[0],t.scale[1],t.scale[2]):e.scale.set(t.scale.x||1,t.scale.y||1,t.scale.z||1)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t?.parent&&t.parent.add(e)}}function JO(o,e,t,i,n){const s=new OS,r=1e-5,a=i-r;s.absarc(r,r,r,-Math.PI/2,-Math.PI,!0),s.absarc(r,e-a*2,r,Math.PI,Math.PI/2,!0),s.absarc(o-a*2,e-a*2,r,Math.PI/2,0,!0),s.absarc(o-a*2,r,r,0,-Math.PI/2,!0);const l=new kS(s,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(c,h)=>{const d=[];for(let p=0;p<h.length;p+=3)d.push(new ee(h[p]/o,h[p+1]/e));return d},generateSideWallUV:(c,h,d,p,m,f)=>{const g=[];return g.push(new ee(h[d]/o,h[d+1]/e)),g.push(new ee(h[p]/o,h[p+1]/e)),g.push(new ee(h[m]/o,h[m+1]/e)),g.push(new ee(h[f]/o,h[f+1]/e)),g}}});return l.scale(1,1,1-i),l.center(),l.index||l.setIndex(Array.from({length:l.attributes.position.count},(c,h)=>h)),l.computeVertexNormals(),l}const Gd=new Map;function ek(o){let e="";switch(o){default:case"OpenSans":e="https://cdn.needle.tools/static/fonts/facetype/Open Sans_Regular_ascii.json";break;case"Helvetiker":e="https://raw.githubusercontent.com/mrdoob/three.js/master/examples/fonts/helvetiker_regular.typeface.json";break}if(Gd.has(e)){const n=Gd.get(e);if(n)return n}const t=new $C,i=new Promise((n,s)=>{t.load(e,r=>{Gd.set(e,r),n(r)},void 0,s)});return Gd.set(e,i),i}let bg=!1,_g=null;function tk(o,e){if(_g===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new Po,n=Om(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),bg=!0,_g=i.loadAsync(t).then(s=>{const r=s.scene;return r.position.y-=.5,r}).catch(s=>(console.warn("Failed to load shaderball mesh: "+s.message),W_())).finally(()=>{bg=!1})}if(bg){const t=W_();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&V_(i,e),o.add(t)}_g.then(t=>{o.children.forEach(s=>{s.name==="ShaderBall-Placeholder"&&o.remove(s)});const i=t.clone(),n=i.children[0];n?.type==="Mesh"&&(n.geometry.attributes.tangent||n.geometry.computeTangents(),V_(n,e)),o.add(i)})}function V_(o,e){if(e?.color||e?.material||e?.texture){const t=e?.material??o.material?.clone()??new pt;e.color&&"color"in t&&t.color instanceof ne&&t.color.set(e.color),e?.texture&&"map"in t&&(t.map=e.texture),o.material=t}}function W_(){return new xo().add(Sr.createPrimitive("Sphere",{material:new xe({transparent:!0,opacity:.1})}))}class $l{static _active=null;static get active(){return this._active}static _requestInFlight=!1;static async start(e,t){if(this._active)return console.error("Cannot start a new XR session while one is already active"),null;if(this._requestInFlight)return console.error("Cannot start a new XR session while a request is already in flight"),null;if("xr"in navigator&&navigator.xr){if(!t)return console.error("XRSessionInit must be provided"),null;this._requestInFlight=!0;const i=await navigator.xr.requestSession(e,t);return i.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new $l(e,t,i),this._active):(i.end(),null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await Wn(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}_renderer;_camera;_scene;constructor(e,t,i){this._mode=e,this._init=t,this._session=i,this._session.addEventListener("end",this.onEnd),this._renderer=new cr({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new re,this._scene=new wi,this._scene.fog=new tb(4473924,10,250),this._scene.add(this._camera),this.setupScene()}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}onEnd=()=>{this._session?.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()};_lastTime=0;onFrame=(e,t)=>{const i=e-this._lastTime;this.update(e,i),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)};async onBeforeHandoff(){await Wn(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new ne(0),this._scene.add(new um(5,10,1118481,1118481));const e=new pm(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new pm(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new mm(16777215,1,100,1);i.position.set(0,2,0),i.castShadow=!1,i.distance=200,this._scene.add(i);const n=50;for(let s=0;s<100;s++){const r=new pt({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new ne(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=L.random(0,1)>.5?xr.Sphere:xr.Cube,l=Sr.createPrimitive(a,{material:r});l.position.x=L.random(-n,n),l.position.y=L.random(-2,n),l.position.z=L.random(-n,n),l.rotation.x=L.random(0,Math.PI*2),l.rotation.y=L.random(0,Math.PI*2),l.rotation.z=L.random(0,Math.PI*2),l.scale.multiplyScalar(.5+Math.random()*10);const c=l.position.distanceTo(this._camera.position)-l.scale.x;c<1&&l.position.multiplyScalar(1+1/c),this._objects.push(l),this._scene.add(l)}}update(e,t){const i=e*4e-4;for(let n=0;n<this._objects.length;n++){const s=this._objects[n];s.position.y+=Math.sin(i+n*.5)*.005,s.rotateY(.002)}}}var gc;(o=>{const e=[];function t(){if(!e?.length)return!1;for(const s of e)s.exportAndOpen();return!0}o.exportAndOpen=t;function i(s){e.push(s)}o.registerExporter=i;function n(s){if(!e)return;const r=e.indexOf(s);r>=0&&e.splice(r,1)}o.unregisterExporter=n})(gc||(gc={}));const Ge=v("debugwebxr"),$_=v("stats");let vg=0;function ik(o){let e=null;const t=o;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=o,e}nk();async function nk(){if(v("debugasap")){let o=globalThis["needle:XRSession"];if(o instanceof Promise){delete globalThis["needle:XRSession"],ue.addContextCreatedCallback(async e=>{if(!o)return;fr(!0);const t=await o;if(t){const i=Z.getDefaultSessionInit("immersive-vr");Z.setSession("immersive-vr",t,i,e.context)}else console.error("NeedleXRSession: ASAP session was rejected");o=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}navigator.xr?.addEventListener("sessiongranted",async()=>{fr(!0),console.log("Received Session Granted..."),await Wn(100);const o=sessionStorage.getItem("needle_xr_session_mode"),e=sessionStorage.getItem("needle_xr_session_init")??null,t=e?JSON.parse(e):null;let i=null;if(H_()&&(await $l.start(o||"immersive-vr",t||Z.getDefaultSessionInit("immersive-vr")),await rk(),i=await $l.handoff()),i)Z.setSession(i.mode,i.session,i.init,z.Current);else if(o&&e){console.log("Session Granted: Restore last session");const n=JSON.parse(e);Z.start(o,n).catch(s=>console.warn(s))}else Z.start("immersive-vr").catch(n=>console.warn("Session Granted failed:",n))},{once:!0})}}function ok(o,e){sessionStorage.setItem("needle_xr_session_mode",o),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function sk(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const wg=new Set;ue.registerCallback(de.ContextCreationStart,async o=>{wg.add(o.context)}),ue.registerCallback(de.ContextCreated,async o=>{wg.delete(o.context);const e=o.context?.domElement.getAttribute("autostart")||null;ak(e)});function H_(){return wg.size>0}function rk(){return new Promise(o=>{const e=Date.now(),t=setInterval(()=>{(!H_()||Date.now()-e>6e4)&&(clearInterval(t),o())},100)})}q.isDesktop()&&A()&&window.addEventListener("keydown",o=>{(o.key==="x"||o.key==="Escape")&&Z.active&&Z.stop()});function ak(o){if(o)switch(o?.toLowerCase()){case"ar":Dn.registerWaitForInteraction(()=>{Z.start("ar")});break}}const qd=Symbol("initial-fov");class Z{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new z_(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static _currentSessionRequestMode=null;static get active(){return this._activeSession}static get activeMode(){return this._activeSession?.mode??null}static get xrSystem(){return"xr"in navigator?navigator.xr:void 0}static isXRSupported(){return Promise.all([this.isVRSupported(),this.isARSupported()]).then(e=>e.some(t=>t)).catch(()=>!1)}static isVRSupported(){return this.isSessionSupported("immersive-vr")}static isARSupported(){return this.isSessionSupported("immersive-ar")}static isSessionSupported(e){return this.xrSystem?.isSessionSupported(e).catch(t=>(Ge&&console.error(t),!1))??Promise.resolve(!1)}static _currentSessionRequest;static _activeSession;static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static _sessionRequestStartListeners=[];static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static _sessionRequestEndListeners=[];static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static _xrStartListeners=[];static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static _xrEndListeners=[];static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static _controllerAddedListeners=[];static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static _controllerRemovedListeners=[];static offerSession(e,t,i){return"xr"in navigator&&navigator.xr&&"offerSession"in navigator.xr?(typeof navigator.xr.offerSession=="function"&&(console.log("WebXR offerSession is available - requesting mode: "+e),t=="default"&&(t=this.getDefaultSessionInit(e)),navigator.xr.offerSession(e,{...t}).then(n=>Z.setSession(e,n,t,i)).catch(n=>{console.log("XRSession offer rejected (perhaps because another call to offerSession was made or a call to requestSession was made)")})),!0):!1}static getDefaultSessionInit(e){switch(e){case"immersive-ar":const t=["anchors","local-floor","layers","dom-overlay","hit-test","unbounded"];return q.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return q.isVisionOS()||i.push("hand-tracking"),{optionalFeatures:i};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,i){if(q.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return gc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(A()&&v("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await $l.start(e,t||Z.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Ge||A())&&ye("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(i||(i=z.Current),i||(i=ue.All[0]),!i)throw new Error("No Needle Engine Context found");switch(t||(t={}),e){case"immersive-ar":{if(await this.xrSystem?.isSessionSupported("immersive-ar")!==!0)return console.error(e+" is not supported by this browser."),null;const r=this.getDefaultSessionInit(e),a=ik(i.domElement);a&&!q.isQuest()&&(r.domOverlay={root:a},r.optionalFeatures.push("dom-overlay")),t={...r,...t}}break;case"immersive-vr":{if(await this.xrSystem?.isSessionSupported("immersive-vr")!==!0)return console.error(e+" is not supported by this browser."),null;t={...this.getDefaultSessionInit(e),...t}}break;default:console.warn("No default session init for mode",e);break}t.optionalFeatures??=[],t.requiredFeatures??=[],await $l.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;Ge?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,n):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const r of n)r.onBeforeXR&&r.activeAndEnabled&&!r.destroyed&&r.onBeforeXR(e,t);for(const r of this._sessionRequestStartListeners)r({mode:e,init:t});Ge&&Te("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=navigator?.xr?.requestSession(e,t),this._currentSessionRequestMode=e;const s=await this._currentSessionRequest?.catch(r=>{console.error(r,"Code: "+r.code),r.code===9&&ye("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:"&&ye("XR requires a secure connection (HTTPS)")});this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const r of this._sessionRequestEndListeners)r({mode:e,init:t,newSession:s||null});return s?this.setSession(e,s,t,i):(console.warn("XR Session request was rejected"),null)}static setSession(e,t,i,n){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const s=e=="immersive-ar"?n.scripts_immersive_ar:n.scripts_immersive_vr;return this._activeSession=new Z(e,t,n,{scripts:s,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),Ge?console.log(`%cStarted ${e} session`,"font-weight:bold;",s):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static $_stop_request=Symbol();static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Ge&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Ge&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{Ge&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return Z._sync}get running(){return!this._ended&&this.session!=null}session;mode;get interactionMode(){return this.session.interactionMode}get visibilityState(){return this.session.visibilityState}get isVisibleBlurred(){return this.session.visibilityState==="visible-blurred"}get isSystemKeyboardSupported(){return this.session.isSystemKeyboardSupported}get environmentBlendMode(){return this.session.environmentBlendMode}get frame(){return this.context.xrFrame}controllers=[];get leftController(){return this.controllers.find(e=>e.side==="left")}get rightController(){return this.controllers.find(e=>e.side==="right")}getController(e){return typeof e=="number"?this.controllers[e]||null:this.controllers.find(t=>t.side===e)||null}get isPassThrough(){return!!(this.environmentBlendMode!=="opaque"&&this.interactionMode==="world-space"||this.mode==="immersive-ar"&&this.environmentBlendMode!=="opaque"&&this.controllers.some(e=>e.inputSource.targetRayMode==="tracked-pointer")||A()&&q.isDesktop()&&this.mode==="immersive-ar")}get isAR(){return this.mode==="immersive-ar"}get isVR(){return this.mode==="immersive-vr"}get isScreenBasedAR(){return this.isAR&&!this.isPassThrough}get posePosition(){return this._transformPosition}get poseOrientation(){return this._transformOrientation}get referenceSpace(){return this.context.renderer.xr.getReferenceSpace()}get viewerPose(){return this._viewerPose}get isTrackingImages(){if(this.frame&&"getImageTrackingResults"in this.frame&&typeof this.frame.getImageTrackingResults=="function")try{const e=this.frame.getImageTrackingResults();for(const t of e)if(t.trackingState==="tracked")return!0}catch{return!1}return!1}get rig(){const e=this._rigs[0]??null;return e?.gameObject&&Tr(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}_rigScale=1;_lastRigScaleUpdate=-1;get rigScale(){return this._rigs[0]?(this._lastRigScaleUpdate!==this.context.time.frame&&(this._lastRigScaleUpdate=this.context.time.frame,this._rigScale=this._rigs[0].gameObject.worldScale.x),this._rigScale):1}addRig(e){this._rigs.indexOf(e)>=0||(e.priority===void 0&&(e.priority=0),this._rigs.push(e),this.updateActiveXRRig())}removeRig(e){const t=this._rigs.indexOf(e);t!==-1&&(this._rigs.splice(t,1),this.updateActiveXRRig())}setRigActive(e){const t=this._rigs.indexOf(e),i=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=i?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){const e=this.context.mainCamera?.position;if(!e||!this.rig)return D(0,0,0);const t=D(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(ri(this.rig.gameObject.quaternion)),t}updateActiveXRRig(){const e=this._rigs[0]??null;this._defaultRig.gameObject.parent!==this.context.scene&&this.context.scene.add(this._defaultRig.gameObject),this._defaultRig.gameObject.visible=!0,this._rigs.includes(this._defaultRig)||this._rigs.push(this._defaultRig);let t=this._rigs[0];t&&t.priority===void 0&&(t.priority=0);for(let i=1;i<this._rigs.length;i++){const n=this._rigs[i];if(n.isActive){if(Tr(n.gameObject)){this._rigs.splice(i,1),i--;continue}(!t||t.isActive===!1||n.priority!==void 0&&n.priority>t.priority)&&(t=n)}}if(e!==t){const i=this._rigs.indexOf(t);i>=0&&this._rigs.splice(i,1),this._rigs.unshift(t)}Ge&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}_rigs=[];_viewerHitTestSource=null;getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,i=this.frame.getHitTestResults(t);if(i.length>0){const n=i[0];return this.convertHitTestResult(n)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const i=this.frame.getHitTestResultsForTransientInput(t);for(const n of i)if(n.inputSource===e.inputSource)for(const s of n.results)return this.convertHitTestResult(s);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),i=t&&e.getPose(t);if(i){const n=D(i.transform.position),s=ri(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(Da),r?.parent){n.applyMatrix4(r.parent.matrixWorld),s.multiply(Gi);const a=be(r.parent);a.premultiply(Gi),s.premultiply(a)}return{hit:e,position:n,quaternion:s}}return null}convertSpace(e){const t=D(e.position);t.applyMatrix4(Da);const i=ri(e.orientation);return i.premultiply(Gi),{position:t,quaternion:i}}_defaultRig;_xr_scripts;_xr_update_scripts=[];_inactive_scripts=[];_controllerAdded;_controllerRemoved;_originalCameraWorldPosition;_originalCameraWorldRotation;_originalCameraWorldScale;_originalCameraParent;_mainCamera=null;constructor(e,t,i,n){ok(e,n.init),this.session=t,this.mode=e,this.context=i,(Ge||v("console"))&&fr(!0),this._xr_scripts=[...n.scripts],this._xr_update_scripts=this._xr_scripts.filter(s=>typeof s.onUpdateXR=="function"),this._controllerAdded=n.controller_added,this._controllerRemoved=n.controller_removed,To(this.onBefore,we.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),(n.init.optionalFeatures?.includes("hit-test")||n.init.requiredFeatures?.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(s=>t.requestHitTestSource?.call(t,{space:s})?.then(r=>this._viewerHitTestSource=r).catch(r=>console.error(r))).catch(s=>console.error(s)),this.context.mainCamera&&(this._originalCameraWorldPosition=J(this.context.mainCamera,new b),this._originalCameraWorldRotation=be(this.context.mainCamera,new U),this._originalCameraWorldScale=He(this.context.mainCamera,new b),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof re&&(this.context.mainCamera[qd]=this.context.mainCamera.fov)),this._defaultRig=new NO,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let s=0;s<t.inputSources.length;s++){const r=t.inputSources[s];if(!r.handedness){console.warn("Input source in xr session has no handedness - ignoring",s);continue}this.onInputSourceAdded(r)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",s=>{for(const r of s.removed)this.disconnectInputSource(r);for(const r of s.added)this.onInputSourceAdded(r)}),this.context.xr=this,this.context.renderer.xr.setSession(this.session).then(this.onRendererSessionSet),"controllerAutoUpdate"in this.context.renderer.xr?(console.debug("Disabling three.js controllerAutoUpdate"),this.context.renderer.xr.controllerAutoUpdate=!1):Ge&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}onRendererSessionSet=()=>{this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),this.context.mainCameraComponent?.applyClearFlags())};onInputSourceAdded=e=>{if(e.targetRayMode==="screen")return;let t=0;for(let n=0;n<this.session.inputSources.length;n++)if(this.session.inputSources[n]===e){t=n;break}if(this.controllers.find(n=>n.inputSource===e)){console.debug("Controller already exists for input source",t);return}else if(this._newControllers.find(n=>n.inputSource===e)){console.debug("Controller already registered for input source",t);return}const i=new hg(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(s,r)=>{if(s.inputSource===e){Ge&&console.log("Disconnecting controller",s.index);const a=r.indexOf(s);a>=0&&r.splice(a,1),this.invokeControllerEvent(s,this._controllerRemoved,"removed");const l={xr:this,controller:s,change:"removed"};for(const c of this._xr_scripts)c.onXRControllerRemoved&&c.onXRControllerRemoved(l);s.onDisconnected()}},i=[...this.controllers];for(let s=i.length-1;s>=0;s--){const r=i[s];t(r,this.controllers)}const n=[...this._newControllers];for(let s=n.length-1;s>=0;s--){const r=n[s];t(r,this._newControllers)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}_ended=!1;_newControllers=[];onEnd=e=>{if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),sk(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,ys(this.onBefore,we.LateUpdate);const t=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);t>=0&&this.context.pre_render_callbacks.splice(t,1);const i=this.context.post_render_callbacks.indexOf(this.onAfterRender);i>=0&&this.context.post_render_callbacks.splice(i,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{this.context.mainCameraComponent?.applyClearFlags(),this.context.mainCameraComponent?.applyClippingPlane()}),S_({session:this});for(const s of Z._xrEndListeners)s({xr:this});const n=[...this.controllers];for(let s=0;s<n.length;s++)this.disconnectInputSource(n[s].inputSource);this.controllers.length=0,this._newControllers.length=0;for(const s of this._xr_scripts)s?.onLeaveXR?.({xr:this});this.sync?.onExitXR(this),this.context.mainCamera&&(this._originalCameraParent?.add(this.context.mainCamera),this._originalCameraWorldPosition&&gt(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&yn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&Aa(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof re&&this.context.mainCamera[qd]&&(this.context.mainCamera.fov=this.context.mainCamera[qd],this.context.mainCamera[qd]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),fr(!1)};_didStart=!1;onBefore=e=>{const t=e.xrFrame;if(!t)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),this.rig?.isActive==!1&&(Ge&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&this._mainCamera?.gameObject&&this._mainCamera?.gameObject?.parent!==this.rig.gameObject&&this.rig.gameObject.add(this._mainCamera?.gameObject),this.internalUpdateState(),this.applyCustomForward();const i={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const n=[...this.context.new_scripts_xr];for(let s=0;s<n.length;s++){const r=this.context.new_scripts_xr[s];if(!r||r.destroyed||r.supportsXR?.(this.mode)==!1){this.context.new_scripts_xr.splice(s,1);continue}if(!r.activeAndEnabled){this.context.new_scripts_xr.splice(s,1),this.markInactive(r);continue}if(this.addScript(r)){this.invokeCallback_EnterXR(r);for(const a of this.controllers)this.invokeCallback_ControllerAdded(r,a)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const s=Xt(this.context.scene.children);if(s){const r=s.getSize(D());if(r.length()>0){const a=this._defaultRig.gameObject;a.position.set(s.min.x+r.x*.5,s.min.y,s.max.z+r.z*.5+1.5);const l=s.getCenter(D());l.y=a.position.y,a.lookAt(l)}}}x_({session:this}),wr();for(const s of Z._xrStartListeners)s(i);const n=[...this._xr_scripts];Ge&&console.log("NeedleXRSession start, handle scripts:",n);for(const s of n){if(s.destroyed){this._script_to_remove.push(s);continue}if(!s.activeAndEnabled){this.markInactive(s);continue}this.invokeCallback_EnterXR(s);for(const r of this.controllers)this.invokeCallback_ControllerAdded(s,r)}}this.syncCameraCullingMask();for(const n of this.controllers)n.onUpdate(t);if(this._newControllers.length>0){const n=[...this._newControllers];this._newControllers.length=0;for(const s of n){if(!s.connected){console.warn("New controller is not connected",s);continue}this.controllers.push(s);for(const r of this._xr_scripts){if(r.destroyed){this._script_to_remove.push(r);continue}r.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(r,s)}}this.controllers.sort((s,r)=>s.index-r.index)}Ge&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(fr(!0),console.error("XRControllers are not added but inputSources are present"));for(const n of this._xr_update_scripts){if(n.destroyed===!0){this._script_to_remove.push(n);continue}if(n.activeAndEnabled===!1){this.markInactive(n);continue}n.onUpdateXR&&n.onUpdateXR(i)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const n=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const s of n)!s.destroyed&&this.running&&s.onLeaveXR?.(i),this.removeScript(s)}this.sync?.onUpdate(this),this.onRenderDebug()};onRenderDebug(){if(Ge)for(const e of this.controllers)e.onRenderDebug();if((Ge||$_)&&this.rig&&(vg++,vg>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const i=this.rig.gameObject.worldUp;e.add(i.multiplyScalar(2.5));let n="";if(n+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,n+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Ge||$_)for(const s of this.controllers)n+=`
167
- ${s.hand?"hand":"ctrl"} ${s.inputSource.handedness}[${s.index}] con:${s.connected} tr:${s.isTracking} hts:${s.hasHitTestSource?"yes":"no"}`;vg=0,B.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof re&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),q.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Ge&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Ge&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const s=this._inactive_scripts.indexOf(e);s>=0&&this._inactive_scripts.splice(s,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const s=t[n];if(s)try{s({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new k().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=He(this.rig.gameObject);e*=i.x}this._camera instanceof re&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Ge&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof re&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new U;_transformPosition=new b;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new N_),this._transition}fadeTransition(){return this._transition||(this._transition=new N_),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof re&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const xg=v("debugwebxr");class G_{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(xg&&console.log("FOUND AVATAR HEAD",e.name),i.head=new ie("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(xg&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new ie("",t,e)),!i.rightHand&&n.includes("right")&&(xg&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new ie("",t,e)));for(let s=0;s<e.children.length;s++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[s];this.tryFindAvatarObjects(r,t,i)}}}class oe extends ne{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=L.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,s=t;return n.alpha!=null&&s.alpha!=null&&(this.alpha=L.lerp(n.alpha,s.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new oe(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,s=t>>8&255,r=t>>0&255;return new oe(i/255,n/255,s/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,s=t>>0&255;return new oe(i/255,n/255,s/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new oe(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 oe(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new oe(e[0],e[1],e[2],e[3]);if(e.length===3)return new oe(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new oe(e)}}const jt=new b,q_=new b,X_=new U,lk=v("debuggizmos"),wn=8947848,Sg=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[Pg]!==void 0}static setVisible(e){for(const t of Xi.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,s,r,a){if(!B.enabled)return null;s||(s=wn);const l=Z.active?.rigScale??1,c=Xi.getTextLabel(n,t,i*l,s,r);return a instanceof k&&a.add(c),c.position.x=e.x,c.position.y=e.y,c.position.z=e.z,c}static DrawRay(e,t,i=wn,n=0,s=!0){if(!B.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),jt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+jt.x,e.y+jt.y,e.z+jt.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawDirection(e,t,i=wn,n=0,s=!0,r=1){if(!B.enabled)return;const a=Xi.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(jt.set(0,0,-r),X_.set(t.x,t.y,t.z,t.w),jt.applyQuaternion(X_)):(jt.set(t.x,t.y,t.z),jt.multiplyScalar(r)),l.setXYZ(1,e.x+jt.x,e.y+jt.y,e.z+jt.z),l.needsUpdate=!0,a.material.depthTest=s,a.material.depthWrite=!1,xn(a.material,i)}static DrawLine(e,t,i=wn,n=0,s=!0){if(!B.enabled)return;const r=Xi.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawCircle(e,t,i,n=wn,s=0,r=!0){if(!B.enabled)return;const a=Xi.getCircle(s);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,jt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,n)}static DrawWireSphere(e,t,i=wn,n=0,s=!0){if(!B.enabled)return;const r=Xi.getSphere(t,n,!0);mr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,r.material.fog=!1,xn(r.material,i)}static DrawSphere(e,t,i=wn,n=0,s=!0){if(!B.enabled)return;const r=Xi.getSphere(t,n,!1);mr(r,e.x,e.y,e.z),r.material.depthTest=s,r.material.depthWrite=!1,xn(r.material,i)}static DrawWireBox(e,t,i=wn,n=0,s=!0,r=void 0){if(!B.enabled)return;const a=Xi.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=s,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,xn(a.material,i)}static DrawWireBox3(e,t=wn,i=0,n=!0){if(!B.enabled)return;const s=Xi.getBox(i);s.position.copy(e.getCenter(jt)),s.scale.copy(e.getSize(jt)),s.material.depthTest=n,s.material.wireframe=!0,s.material.depthWrite=!1,s.material.fog=!1,xn(s.material,t)}static _up=new b(0,1,0);static DrawArrow(e,t,i=wn,n=0,s=!0,r=!1){if(!B.enabled)return;const a=Xi.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),jt.set(t.x,t.y,t.z).sub(q_.set(e.x,e.y,e.z)).normalize());const l=jt.set(t.x,t.y,t.z).sub(q_.set(e.x,e.y,e.z)).length()*.1;a.scale.set(l,l,l),a.material.depthTest=s,a.material.wireframe=r,xn(a.material,i),this.DrawLine(e,t,i,n,s)}static DrawWireMesh(e){const t=Xi.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrixWorld.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrixWorld.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,xn(t.material,e.color??wn)}}const ck=new Pa(1,1,1);function Cg(o=null){const e=new ne(o??14540253),t=new MS(ck);return new ib(t,new gm({color:e}))}function xn(o,e){if(Array.isArray(o)){for(const i of o)xn(i,e);return}const t=e instanceof oe?e.a:1;o.color.set(e),o.opacity=t,o.transparent=t<1}const Pg=Symbol("GizmoCache");class Xi{static familyName="needle-gizmos";static ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{Ce.update()}))}static getTextLabel(e,t,i,n,s){this.ensureFont();let r=this.textLabelCache.pop(),a=1;s&&typeof s=="string"&&s?.length>=8&&s.startsWith("#")?(a=parseInt(s.substring(7),16)/255,s=s.substring(0,7),lk&&console.log(s,a)):typeof s=="object"&&s.a!==void 0&&(a=s.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:s??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new kb(l);const c=this,h=r;h.setText=function(d){this.set({textContent:d}),c.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(z.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new Pa(1,1,1);t=new G(i)}return this.registerTimedObject(z.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new Oa;let i=t.geometry.getAttribute("position");i||(i=new mt(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new Oa;let i=t.geometry.getAttribute("position");if(!i){i=new mt(new Float32Array(Sg*3),3),t.geometry.setAttribute("position",i);const n=D(0,1,0),s=D(0,0,1),r=D(s);r.cross(n).normalize();const a=D(r),l=Math.PI*2/(Sg-1);for(let c=0;c<Sg+1;c++){const h=l*c;n.copy(a).multiplyScalar(Math.cos(h)*1),r.copy(s).multiplyScalar(Math.sin(h)*1);const d=n.add(r);i.setXYZ(c,d.x,d.y,d.z)}}}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new G(new yd(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(z.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new G(new eb(0,.5,1,8))),this.registerTimedObject(z.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new G,t.material=new xe),this.registerTimedObject(z.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const s=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(s){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==s){const a=e.pre_render_callbacks.indexOf(s);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(s)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[Pg]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(z.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,Ce.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof Ce.MeshUIBaseElement){if(Tr(n))continue;const s=e.isInVR,r=!1,a=!s;oc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let s=t.length-1;s>=0;s--){const r=t[s];n>=i[s]-1e-6&&(t.splice(s,1),i.splice(s,1),r.removeFromParent(),Tr(r)!=!0&&r[Pg].push(r))}}}const Qt=v("debugphysics"),hk=v("debugworker"),Q_=new ds;class bs{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new ee),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Q_.set(e),this.layerMask=Q_}setMask(e){this.layerMask||(this.layerMask=new ds);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Og{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class Hl{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new bd;defaultRaycastOptions=new bs;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new ds;sphere=new _d;sphereOverlap(e,t,i=!0,n=!1,s=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,s);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){Qt&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return Qt&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof RS&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let s=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),s||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),s=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof ds?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Qt&&console.time("raycast"),s.length=0,Hl._raycasting++,this.intersect(this.raycaster,n,s,e),s.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(s=s.filter(a=>!r.includes(a.object))),Hl._raycasting--,Qt&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",s?.length?[...s]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),s}intersect(e,t,i,n){for(const s of t){if(!s||s.visible===!1||B.isGizmo(s)||n.lineThreshold!==void 0&&n.lineThreshold<0&&s instanceof Oa)continue;let r=!0;const a=s,l=a.geometry;if(s.raycastAllowed===!1&&(r=!1),r&&n.testObject){const c=n.testObject?.(s);if(c===!1)continue;c==="continue in children"&&(r=!1)}else r&&(l&&Y_(l)||(r=!1));if(r){const c=i.length,h=s.raycastPreference||"lod";let d=h!=="bounds";if(n.precise===!1&&(d=!1),l&&(d||=l.getAttribute("position")?.array?.length<64),a instanceof Ra&&(d=!1),h==="lod"){const p=mb(s);p&&(a.geometry=p)}if(!d&&uk(a,e,i)||(n.useAcceleratedRaycast!==!1?Qd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,Qt&&i.length!=c){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:s,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,s.children,i,n)}return i}tempBoundingBox=new xi;intersectSphere(e,t,i,n,s,r,a,l){let c=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);c&&=e.visible,c&&=!(e instanceof Oa),c&&=!(e instanceof Ra);const h=e,d=h.geometry;if(c&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(c=!1)}if(d&&Y_(d)||(c=!1),c){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=s.length;if(Qd.runMeshBVHRaycast(this.sphere,h,s,this.context,{}),m!=s.length&&!r)return}else if(d.boundingBox||d.computeBoundingBox(),d.boundingBox){h.matrixWorldNeedsUpdate&&h.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(d.boundingBox).applyMatrix4(h.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const f=J(e),g=f.distanceTo(m.center),y=new Og(e,g,f);if(s.push(y),!r)return}}}if(e.children)for(const p of e.children){const m=s.length;if(this.intersectSphere(p,t,i,n,s,r,a,l),m!=s.length&&!r)return}}}function Y_(o){return!(o.index&&o.index.array.length<3)}const Cr=new _d,Xd=new hr,dk=new J0;function uk(o,e,t){const i=o._computeIntersections;if(!i)return!1;let n=o["_computeIntersections:Needle"];return n||(n=o["_computeIntersections:Needle"]=function(s,r,a){const l=this,c=l.geometry.boundingSphere;if(c){if(l instanceof Ra){Xd.setFromNormalAndCoplanarPoint(D(0,1,0),D(0,-l.position.y,0)),Xd.applyMatrix4(l.matrixWorld,dk);const d=s.ray.intersectPlane(Xd,D());if(d){Cr.copy(c),Cr.applyMatrix4(l.matrixWorld);const p=D(d).sub(s.ray.origin).length(),m=Cr.radius*.5;p<m&&r.push({distance:p,point:d,object:l,normal:Xd.normal.clone()})}return}Cr.copy(c),Cr.applyMatrix4(l.matrixWorld);const h=s.ray.intersectSphere(Cr,D());if(h){const d=D(h).sub(s.ray.origin),p=d.length();if(p>Cr.radius){const m=d.clone().normalize();r.push({distance:p,point:h,object:l,normal:m})}}}}),o._computeIntersections=n,e.intersectObject(o,!1,t),o._computeIntersections=i,!0}var Qd;(o=>{let e=0;function t(w,P,M,O,j){if(!P.geometry||!P.geometry.hasAttribute("position"))return!1;const I=P.geometry;if(P?.isSkinnedMesh){const N=P,V=N.bvhNeedsUpdate;if(!N.staticGenerator)l(),r&&(N.staticGenerator=new r(P),N.staticGenerator.applyWorldTransforms=!1,N.staticGeometry=N.staticGenerator.generate(),I.boundsTree=a?.call(N.staticGeometry),N.staticGeometryLastUpdate=performance.now()+Math.random()*200,N.bvhNeedsUpdate=!0);else if(I.boundsTree&&(N.autoUpdateMeshBvhInterval!==void 0&&N.autoUpdateMeshBvhInterval>=0||V===!0)){const H=performance.now(),X=H-N.staticGeometryLastUpdate,T=N.autoUpdateMeshBvhInterval??100;(V||X>T)&&(Qt&&console.warn(`Physics: updating skinned mesh bvh for ${P.name} after ${X.toFixed(2)}ms`),N.bvhNeedsUpdate=!1,N.staticGeometryLastUpdate=H,N.staticGenerator?.generate(N.staticGeometry),I.boundsTree.refit())}}else if(!I.boundsTree){h||_();let N=!0;if((O.xr||I[f]===!1||I.getAttribute("position")?.isInterleavedBufferAttribute||I.index&&I.index?.isInterleavedBufferAttribute||e>10)&&(N=!1),N&&p){if(I[m]===void 0){let V=null;if(y.length>0){const H=y.shift();H&&!H.running&&(V=H)}if(!V&&g.length<3)try{hk&&console.warn("[GenerateMeshBVHWorker] Creating worker with import.meta.url:",import.meta.url),V=new p,g.push(V)}catch(H){H instanceof DOMException&&H.name==="SecurityError"?(console.warn("Failed to create MeshBVH worker, falling back to main thread generation. This can happen when running from file://, if the browser does not support workers or if the browser is blocking workers for other reasons."),console.debug(H),e+=10):(console.error("Failed to create MeshBVH worker. Please see below for more details:"),console.log(H)),e++}if(V!=null&&!V.running){const H=P.name;Qt&&console.log("<<<< worker start",H,V),I[m]="queued",performance.mark("bvh.create.start");const X=I.clone();try{V.generate(X).then(T=>{I[m]="done",I.boundsTree=T}).catch(T=>{I[m]="failed - "+T?.message,I[f]=!1,Qt&&console.error("Failed to generate mesh bvh on worker",T)}).finally(()=>{Qt&&console.log(">>>>> worker done",H,{hasBoundsTre:I.boundsTree!=null}),y.push(V),X.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(T){console.error("Failed to generate mesh bvh on worker",T)}}else Qt&&console.warn("No worker available")}}else(!d||!N)&&(l(),s&&(performance.mark("bvh.create.start"),I.boundsTree=new s(I),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(w instanceof bd){const N=w,V=P.raycast;if(I.boundsTree)l(),n&&(P.acceleratedRaycast||(P.acceleratedRaycast=n.bind(P),Qt&&console.debug(`Physics: bind acceleratedRaycast fn to "${P.name}"`)),P.raycast=P.acceleratedRaycast);else if(Qt&&console.warn("No bounds tree found for mesh",P.name,{workerTask:I[m],hasAcceleratedRaycast:n!=null}),j.allowSlowRaycastFallback===!1&&(I.getAttribute("position")?.array?.length??0)>2e3)return Qt&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const H=N.firstHitOnly;return N.firstHitOnly=!1,N.intersectObject(P,!1,M),N.firstHitOnly=H,P.raycast=V,!0}else if(w instanceof _d){const N=I.boundsTree;if(N){const V=w;if(c.copy(P.matrixWorld).invert(),V.applyMatrix4(c),N.intersectsSphere(V)){const H=J(P),X=H.distanceTo(V.center),T=new Og(P,X,H);M.push(T)}}return!0}return!1}o.runMeshBVHRaycast=t;let i=!1,n=null,s=null,r=null,a=null;function l(){i||(i=!0,import("./vendor-BKGa4GE0.min.js").then(w=>w.index$1).then(w=>{n=w.acceleratedRaycast,s=w.MeshBVH,r=w.StaticGeometryGenerator,a=w.computeBoundsTree}).catch(w=>{(Qt||A())&&console.error("Failed to load BVH library...",w.message)}))}const c=new K;let h=!1,d=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),f=Symbol("Needle:MeshBVH-CanUseWorker"),g=[],y=[];function _(){h=!0,d=!0,Promise.resolve().then(()=>fL).then(w=>{p=w.GenerateMeshBVHWorker}).catch(w=>{Qt||A()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",w)}).finally(()=>{d=!1})}})(Qd||(Qd={}));const Z_=Symbol("gltf-loader-internal-usage-tracker"),pk=v("debugusers");class Gl{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return Gl._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){Gl._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const s=t.call(this,i,n);return s.then(r=>(r&&(e._loadedObjects.add(r),r[Z_]=e._loadingId),r)),s},null}afterRoot(e){Gl._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Z_],t instanceof k&&(t.parent||t instanceof G&&setTimeout(()=>{pk&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class K_{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
168
- `+i.src),e.preventDefault())}})}}const Yd=v("trackresources");function J_(){return Yd==="dispose"}let Pr=!0;Yd===0&&(Pr=!1);function mk(o){Pr=o}function ev(){return Pr}const tv=Symbol("disposable");function iv(o,e){o&&(o[tv]=e,Or&&console.warn("Set disposable",e,o))}const nv=Symbol("disposed");function gk(o){return o[nv]===!0}function Pe(o){if(o){if(o[tv]===!1){Or&&console.warn("Object is marked as not disposable",o);return}if(typeof o=="object"&&(o[nv]=!0),o instanceof wi)Pe(o.environment),Pe(o.background),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial);else if(o instanceof us)Pe(o.geometry),Pe(o.material),Pe(o.skeleton),Pe(o.bindMatrix),Pe(o.bindMatrixInverse),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof G)Pe(o.geometry),Pe(o.material),Pe(o.customDepthMaterial),Pe(o.customDistanceMaterial),o.visible=!1;else if(o instanceof k)o.visible=!1;else if(o instanceof gn){Ua(o);for(const e of Object.keys(o.attributes)){const t=o.attributes[e];Pe(t)}}else if(o instanceof mt||o instanceof nb)Or&&console.warn("BufferAttribute dispose not supported",o.count);else if(o instanceof Array)for(const e of o)e instanceof ve&&Pe(e);else if(o instanceof ve){Ua(o);for(const t of Object.keys(o)){const i=o[t];i instanceof Le&&Pe(i)}const e=o.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof Le?Pe(i):i instanceof Wi&&Pe(i.value)}}else o instanceof Le?(Ua(o),Ua(o.source),o.source?.data instanceof ImageBitmap&&Ua(o.source.data)):o instanceof TS?(Ua(o.boneTexture),o.boneTexture=null):o instanceof ES||!(o instanceof k)&&Or&&console.warn("Unknown object type",o)}}function Ua(o){o&&((Or||J_()||Yd)&&console.warn("\u{1F9E8} FREE",o),o instanceof ImageBitmap||"dispose"in o&&typeof o.dispose=="function"&&o.dispose())}function fk(o){}const yk=new Set;function kg(o,e,t=null,i){if(i||(i=yk,i.clear()),!o)return i;const n=o[fc];if(n)for(const s of n)i.has(s)||t?.call(null,s)!==!1&&(i.add(s),e&&kg(s,!0,t,i));return i}function bk(o){return o[yc]}const Or=v("debugresourceusers")||v("debugmemory"),fc=Symbol("needle-resource-users"),yc=Symbol("needle-resource-users-count");function Yt(o,e){Ud(o,e,function(t,i){Pr&&!Hl.raycasting&&(Zd(fc,this,t,!1),Zd(fc,this,i,!0))})}Pr&&(Yt(G.prototype,"material"),Yt(G.prototype,"geometry"),Yt(ve.prototype,"map"),Yt(ve.prototype,"bumpMap"),Yt(ve.prototype,"alphaMap"),Yt(ve.prototype,"normalMap"),Yt(ve.prototype,"displacementMap"),Yt(ve.prototype,"roughnessMap"),Yt(ve.prototype,"metalnessMap"),Yt(ve.prototype,"emissiveMap"),Yt(ve.prototype,"specularMap"),Yt(ve.prototype,"envMap"),Yt(ve.prototype,"lightMap"),Yt(ve.prototype,"aoMap"),Yt(ve.prototype,"gradientMap"));function _k(o){if(Pr===!1)return;const e=o[fc];if(e)for(const t of e)Zd(fc,t,o,!1)}Pr&&Ud(ve.prototype,"dispose",function(){_k(this)});let Mg=0;function Zd(o,e,t,i){if(Mg>0)return;if(Array.isArray(t)){for(const s of t)Zd(o,e,s,i);return}if(!t)return;let n=t[o];if(n||(n=new Set),i){if(e&&!n.has(e)){n.add(e);let s=t[yc]||0;s+=1,t[yc]=s,Or&&console.warn(`\u{1F7E2} Added user of "${t.type}"`,e,t,s,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let s=t[yc]||0;s>0&&(s-=1,t[yc]=s),Or&&console.warn(`\u{1F534} Removed user of "${t.type}"`,e,t,s,"users:",n),s<=0&&(Gl.isLoading(t)||(Yd&&console.warn(`\u{1F534} Removed all user of "${t.type}"`,t),J_()&&Pe(t)))}t[o]=n}try{Ud(cr.prototype,"render",function(){Mg++},function(){Mg--})}catch(o){console.warn("Could not wrap WebGLRenderer.render",o)}const ov=v("debugcomponentevents");class Kd{static eventListeners=new Map;static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let i=this.eventListeners.get(e);i||(i=[]),i.push(t),this.eventListeners.set(e,i),ov&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const i=this.eventListeners.get(e);if(!i)return;const n=i.indexOf(t);n<0||i.splice(n,1)}static dispatchComponentLifecycleEvent(e,t){const i=this.eventListeners.get(e);if(ov&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const bc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),sv=Symbol("isUsingInstancing"),rv=Symbol("instancingRenderer"),_c=Symbol("instancingAutoUpdateBounds");class hn{static isUsingInstancing(e){return e[sv]===!0}static getRenderer(e){return e[rv]||null}setAutoUpdateBounds(e,t){const i=hn.getRenderer(e);i&&(i[_c]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[bc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)hn.markDirty(i,!0)}}var vc;(o=>{o.experimentalSmartHierarchyUpdate=!1})(vc||(vc={}));function za(o,e){try{e||o()}catch(t){return console.error(t),!1}return!0}const Rg=v("debugnewscripts"),vk=v("debughierarchy"),Ae=[];function wk(){return Ae.length>0}function Jd(o){if(Rg&&console.log("Register new components",o.new_scripts.length,[...o.new_scripts],o.alias?"element: "+o.alias:o.hash,o),o.new_scripts_pre_setup_callbacks.length>0){for(const e of o.new_scripts_pre_setup_callbacks)e&&e();o.new_scripts_pre_setup_callbacks.length=0}if(!(o.new_scripts.length<=0)){Ae.length=0,o.new_scripts.length>0&&Ae.push(...o.new_scripts),o.new_scripts.length=0;for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.isComponent!==!0){(A()||Rg)&&console.error(`Registered script is not a Needle Engine component.
169
- The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
170
- `,t),Ae.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
171
- Did you add and remove a component in the same frame?`),Ae.splice(e,1),e--;continue}t.context=o,wc(t.gameObject),Tg(t,o)}catch(t){console.error(t),Eo(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed){Eo(Ae[e],o),Ae.splice(e,1),e--;continue}if(t.registering)try{t.registering()}catch(i){console.error(i)}t.__internalAwake!==void 0&&(t.gameObject||console.error("Calling awake for a component without a GameObject",t,t.gameObject),wc(t.gameObject),t.activeAndEnabled&&za(t.__internalAwake.bind(t)))}catch(t){console.error(t),Eo(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed||t.enabled===!1||(wc(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,za(t.__internalEnable.bind(t)))}catch(t){console.error(t),Eo(Ae[e],o),Ae.splice(e,1),e--}for(let e=0;e<Ae.length;e++)try{const t=Ae[e];if(t.destroyed||!t.gameObject)continue;o.new_script_start.push(t)}catch(t){console.error(t),Eo(Ae[e],o),Ae.splice(e,1),e--}Ae.length=0;for(const e of o.new_scripts_post_setup_callbacks)e&&e();o.new_scripts_post_setup_callbacks.length=0}}function xk(o){o&&(o.__internalDisable(!0),Eo(o,o.context))}function av(o,e){for(let t=0;t<o.new_script_start.length;t++)try{const i=o.new_script_start[t];if(e!==void 0&&i.gameObject!==e||i.destroyed||i.activeAndEnabled===!1)continue;za(i.__internalAwake.bind(i)),i.enabled&&(za(i.__internalEnable.bind(i)),za(i.__internalStart.bind(i)),o.new_script_start.splice(t,1),t--)}catch(i){console.error(i),Eo(o.new_script_start[t],o),o.new_script_start.splice(t,1),t--}}function Tg(o,e){e.scripts.indexOf(o)===-1&&(e.scripts.push(o),o.earlyUpdate&&e.scripts_earlyUpdate.push(o),o.update&&e.scripts_update.push(o),o.lateUpdate&&e.scripts_lateUpdate.push(o),o.onBeforeRender&&e.scripts_onBeforeRender.push(o),o.onAfterRender&&e.scripts_onAfterRender.push(o),o.onPausedChanged&&e.scripts_pausedChanged.push(o),Eg(o,null)&&e.new_scripts_xr.push(o),Eg(o,"immersive-vr")&&e.scripts_immersive_vr.push(o),Eg(o,"immersive-ar")&&e.scripts_immersive_ar.push(o))}function Eo(o,e){Qi(o,e.new_scripts),Qi(o,e.new_script_start),Qi(o,e.scripts),Qi(o,e.scripts_earlyUpdate),Qi(o,e.scripts_update),Qi(o,e.scripts_lateUpdate),Qi(o,e.scripts_onBeforeRender),Qi(o,e.scripts_onAfterRender),Qi(o,e.scripts_pausedChanged),Qi(o,e.new_scripts_xr),Qi(o,e.scripts_immersive_vr),Qi(o,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(o)}function Qi(o,e){const t=e.indexOf(o);t>=0&&e.splice(t,1)}function Eg(o,e){if(o){const t=o;if(t.onBeforeXR||t.onEnterXR||t.onUpdateXR||t.onLeaveXR||t.onXRControllerAdded||t.onXRControllerRemoved)return!(e!=null&&t.supportsXR?.(e)===!1)}return!1}let Ag=!0;function Ig(){Ag=!0}function eu(o,e=!1){if(vc.experimentalSmartHierarchyUpdate){if(!e&&!Ag)return;Ag=!1}if(o||(o=ue.Current.scene),!o){console.trace("Invalid call - no current context.");return}const t=Ha(o);lv(o,t,!0)||(Rg||A()?console.error(`Error updating hierarchy
172
- Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,o):console.error('Failed to update active state in hierarchy of "'+o.name+'"',o),console.warn(" \u2191 this error might be caused by circular references. Please make sure you don't have files with circular references (e.g. one GLB 1 is loading GLB 2 which is then loading GLB 1 again)."))}function lv(o,e,t,i=0){if(i>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const n=Ha(o);if(e&&(e=n,e&&o.parent&&i===0)){const a=o.parent;e=a[ko],e===void 0&&(a instanceof wi||(e=!0))}const s=o[ko]!==e;s&&(o[ko]=e,vk&&console.warn("ACTIVE CHANGE",o.name,n,o.visible,e,"changed?"+s,o),Sk(o,a=>{e?a.enabled&&(za(a.__internalAwake.bind(a)),a.enabled&&a.__internalEnable()):a.__didAwake&&a.enabled&&(a.__didEnable=!1,a.onDisable())}));let r=!0;if(o.children)for(const a of o.children)lv(a,e,t,i+1)===!1&&(r=!1);return r}function wc(o){let e=!0,t=o,i=!1;for(;t&&t;){if(t.type==="Scene"&&(i=!0),!Ha(t)){e=!1;break}t=t.parent}if(!o){console.error("GO is null");return}o[ko]=e&&i}function Sk(o,e){if(o.userData?.components)for(const t of o.userData.components)e(t)}const tu=new Map,cv=Symbol("prewarmFlag"),Lg=Symbol("waitingForPrewarm"),jg=v("debugprewarm");function Ck(o,e){!o||o[cv]===!0||o[Lg]===!0||(tu.has(e)||tu.set(e,[]),o[Lg]=!0,tu.get(e).push(o),jg&&console.debug("register prewarm",o.name))}let hv=null,dv=null;function Pk(o){if(!o)return;const e=tu.get(o);if(!e?.length)return;const t=o.mainCamera;if(t){jg&&console.log("prewarm",e.length,"objects",[...e]);const i=o.renderer;if(i.compile){const n=o.scene;i.compile(n,t),hv??=new AS(64),dv??=new IS(.001,9999999,hv),dv.update(i,n);for(const s of e)s[cv]=!0,s[Lg]=!1;e.length=0,jg&&console.log("prewarm done")}}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context;yv(e),mv(e)});const iu=v("debugcomponents"),uv="eff8ba80-635d-11ec-90d6-0242ac120003";class Lt{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=Lt.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return Sb(e,uv);const t=this._seed;return this._seed-=1,Sb(t.toString(),uv)}initialize(e){typeof e=="string"?this._seed=Lt.hash(e):this._seed=e}static createFromString(e){return new Lt(this.hash(e))}static hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}var pv=(o=>(o.NewInstanceCreated="new-instance-created",o.InstanceDestroyed="instance-destroyed",o))(pv||{});class Ok{guid;dontSave;constructor(e){this.guid=e}}function xc(o,e,t=!0,i){if(!o)return;const n=o;if(Zi(o,t),!e){console.warn("Can not send destroy: No networking connection provided",o.guid);return}if(!e.isConnected){A()&&console.debug("Can not send destroy: not connected",o.guid);return}let s=o.guid;if(!s&&n.uuid&&(s=n.uuid),!s){console.warn("Can not send destroy: failed to find guid",o);return}Dg(s,e,i)}function Dg(o,e,t){const i=new Ok(o);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,vn.Queued)}function mv(o){o.connection.beginListen("instance-destroyed",e=>{iu&&console.log("[Remote] Destroyed",o.scene,e);const t=Xg(e.guid,o.scene);t&&Zi(t)})}class kk{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class gv{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}function Bg(o,e,t,i){const n=o;if(!n.guid)return console.warn("Can not instantiate: No guid",n),null;if(e.context||(e.context=z.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const s=e?{...e}:null,{instance:r,seed:a}=Mk(n,e);if(r){const l=r;if(l.guid){iu&&console.log("[Local] new instance","gameobject:",r?.guid);const c=new gv(n.guid,l.guid);c.seed=a,e.deleteOnDisconnect===!0&&(c.deleteStateOnDisconnect=!0),s&&(s.position&&(Array.isArray(s.position)?c.position={x:s.position[0],y:s.position[1],z:s.position[2]}:c.position={x:s.position.x,y:s.position.y,z:s.position.z}),s.rotation&&(s.rotation instanceof ot?s.rotation=new U().setFromEuler(s.rotation):s.rotation instanceof Array&&(s.rotation=new U().fromArray(s.rotation)),c.rotation={x:s.rotation.x,y:s.rotation.y,z:s.rotation.z,w:s.rotation.w}),s.scale&&(Array.isArray(s.scale)?c.scale={x:s.scale[0],y:s.scale[1],z:s.scale[2]}:c.scale={x:s.scale.x,y:s.scale.y,z:s.scale.z})),c.position||(c.position={x:l.position.x,y:l.position.y,z:l.position.z}),c.rotation||(c.rotation={x:l.quaternion.x,y:l.quaternion.y,z:l.quaternion.z,w:l.quaternion.w}),c.scale||(c.scale={x:l.scale.x,y:l.scale.y,z:l.scale.z}),c.visible=n.visible,s?.parent&&(typeof s.parent=="string"?c.parent=s.parent:c.parent=s.parent.guid),c.hostData=t,i===!1&&(c.dontSave=!0),!e?.context?.connection&&A()&&console.debug("Object will be instantiated but it will not be synced: not connected",n.guid),e.context.connection.isInRoom&&Na.push(new WeakRef(l)),e?.context?.connection.send("new-instance-created",c)}else console.warn("Missing guid, can not send new instance event",l)}return r}function fv(){return Math.random()*9999999}const Na=new Array;function yv(o){o.connection.beginListen("new-instance-created",async e=>{const t=await Rk(e.originalGuid,o.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const i=new Bn;e.position&&(i.position=new b(e.position.x,e.position.y,e.position.z)),e.rotation&&(i.rotation=new U(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(i.scale=new b(e.scale.x,e.scale.y,e.scale.z)),i.parent=e.parent,e.seed&&(i.idProvider=new Lt(e.seed)),i.visible=e.visible,i.context=o,iu&&o.alias&&console.log("[Remote] instantiate in: "+o.alias);const n=qa(t,i);Na.push(new WeakRef(n)),n&&(e.parent==="scene"&&o.scene.add(n),iu&&console.log("[Remote] new instance","gameobject:",n?.guid,t))}),o.connection.beginListen("left-room",()=>{Na.length>0&&console.debug(`Left networking room, cleaning up ${Na.length} instantiated objects`);for(const e of Na){const t=e.deref();t&&t.destroy()}Na.length=0})}function Mk(o,e){const t=fv(),i=e??new Bn;i.idProvider=new Lt(t);const n=qa(o,i);return{seed:t,instance:n}}const bv={};function _v(o,e){bv[o]=e}async function Rk(o,e){const t=bv[o];if(t!=null){const i=await t(o);if(i)return i}return vv(o,e)}function vv(o,e){if(e===null||!o)return null;if(e.guid===o)return e;if(e.children)for(const t of e.children){const i=vv(o,t);if(i)return i}return null}const Sc=v("gizmos"),ft=v("debugextension"),Fg=v("debugtypes");class Tk{_types=new Map;_reverseTypes=new Map;constructor(){Fg&&console.warn("TypeStore: Created",this)}add(e,t){Fg&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?Fg&&i!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):(this._types.set(e,t),this._reverseTypes.set(t,e))}get(e){return this._types.get(e)||null}getKey(e){return this._reverseTypes.get(e)||null}}const Ek=Symbol("BuiltInType"),C=new Tk,Ug=function(o){C.get(o.name)||C.add(o.name,o)},zg=v("debugresolvedependencies"),Ak=["/extensions/","extensions/"],Ik=[{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 Ng(o,e){zg&&console.log(o,e);const t=[];Vg(Ik,o,e,t);const i=await Promise.all(t);return typeof e=="string"&&i.length===1?i[0]:i}function wv(o,e){return!o||!e?!1:o["needle:identifier"]!=null&&e["needle:identifier"]!=null?o["needle:identifier"]===e["needle:identifier"]:!1}function Lk(o,e){o["needle:identifier"]=e}function Vg(o,e,t,i){if(typeof t=="object"&&t!==void 0&&t!==null)for(const n of Object.keys(t)){const s=t[n];if(typeof s=="string"){const r=xv(e,s);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=Sv(o,e,s);if(a){i.push(a.then(l=>(t[n]=l,l)));continue}}}else if(Array.isArray(s))for(let r=0;r<s.length;r++){const a=s[r],l=xv(e,a);if(l!=null){typeof l.then=="function"?i.push(l.then(c=>s[r]=c)):s[r]=l;continue}for(const c of o){const h=Cv(c.prefix,a);if(h>=0){zg&&console.log(c,h,c.dependencyName),i.push(e.getDependency(c.dependencyName,h).then(d=>s[r]=d));break}}typeof a=="object"&&Vg(o,e,a,i)}else typeof s=="object"&&Vg(o,e,s,i)}else if(typeof t=="string"){const n=Sv(o,e,t);n&&i.push(n)}}function xv(o,e){if(o&&o.plugins&&typeof e=="string"){for(const t of Ak)if(e.startsWith(t)){let i=e.substring(t.length);const n=i.indexOf("/");n>=0&&(i=i.substring(0,n));const s=o.plugins[i];if(ft&&console.log(i,s),typeof s?.resolve=="function"){const r=e.substring(t.length+i.length+1);return s.resolve(o,r)}break}}return null}function Sv(o,e,t){for(const i of o){const n=Cv(i.prefix,t);if(n>=0)return zg&&console.warn("GET DEPENDENCY",i,n,i.dependencyName),e.getDependency(i.dependencyName,n)}return null}function Cv(o,e){if(typeof e=="string"&&e.startsWith(o)){const t=e.substring(o.length),i=Number.parseInt(t);if(i>=0)return i}return-1}const Wg="NEEDLE_persistent_assets";function jk(o){return o?.___persistentAsset===!0}class Dk{get name(){return Wg}parser;constructor(e){this.parser=e}async afterRoot(e){if(!this.parser?.json?.extensions)return;const t=this.parser.json.extensions[Wg];if(!t)return;ft&&console.log(t);const i=new Array;for(const n of t?.assets){const s=Ng(this.parser,n);s&&i.push(s)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){ft&&console.log(t);const n=e.json.extensions[Wg];if(n){const s=n?.assets[i];if(s&&typeof s=="object"){s.___persistentAsset=!0;const r=s.__type;r&&C.get(r)}return s}}return null}}const Gn=v("debugserializer");class Bk{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;Gn&&console.warn("Type: "+e+" is already registered",t,i)}Gn&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}typeMap=new Map;getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){Gn&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return Gn&&console.log("FOUND SERIALIZER",n?.name,e.name,e.constructor.name,"for type: "+i,n,e,this.typeMap),n;const s=Object.getPrototypeOf(e);if(s&&s!==e){const r=this.getSerializerForConstructor(s,++t);if(r){const a=s.constructor||s.prototype;Gn&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}Gn&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const nu=new Bk;class Yi{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)nu.register(i,this);else nu.register(e,this)}}class Fk{isDevMode=$i();cache={};registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const i=t;i.$serializedTypes&&Object.keys(i.$serializedTypes)&&this.cache[e].push(...Object.keys(i.$serializedTypes)),Gn&&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 $g{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function Pv(o,e){const t=o.$serializedTypes;if(t===void 0)return null;const i={};for(const s in t){const r=o[s];if(r!=null&&typeof r=="object"){const a=nu.getSerializerForConstructor(r);if(a){i[s]=a.onSerialize(r,e);continue}}i[s]=r}function n(s){const r=C._types;for(const[a,l]of r)if(l===o.constructor)return a;return s.__name||s.constructor.name}return i.name=n(o),typeof o.guid=="string"&&(i.guid=o.guid),i}const ou=[];function Ov(o,e){if(!o)return e;typeof o.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,o.$serializedTypes));const t=Object.getPrototypeOf(o);return Ov(t,e)}function su(o,e,t){if(!o)return!1;if(t.target=o,o.onBeforeDeserialize!==void 0){const n=o.onBeforeDeserialize(e,t);if(typeof n=="boolean")return n}const i=Ov(o);if(e){if(typeof e.guid=="string"&&(o.guid=e.guid),i)for(const n in i){let s=function(l){const c=l.type;return c?Hg(a,c,t,void 0,o[n]):Hg(a,l,t,void 0,o[n])};const r=i[n],a=e[n];if(Gn&&console.log(n,a,o,r),!(o[n]!==void 0&&a===void 0)&&(t.type=void 0,t.path=n,t.serializable=r,!(o.onBeforeDeserializeMember!==void 0&&o.onBeforeDeserializeMember(n,a,t)===!0))){if(r===null)o[n]=a;else{if(Array.isArray(r))for(let l=0;l<r.length;l++){const c=r[l],h=s(c);if(h!==void 0||l===r.length-1){o[n]=h;break}}else o[n]=s(r);ou.length=0}o.onAfterDeserializeMember!==void 0&&o.onAfterDeserializeMember(n,a,t)}}Nk(o,e)}return zk(o,e,t.implementationInformation),o.onAfterDeserialize!==void 0&&o.onAfterDeserialize(e,t),!0}const Uk=v("noerrors");function zk(o,e,t){if(Uk||!e||!$i()||!o||o.constructor&&o.constructor[Ek]===!0)return;const i=o.constructor?.name,n=Object.getOwnPropertyNames(e);for(const s of n){if(s==="sourceId")continue;const r=o[s];if(r==null)continue;const a=e[s];if(t?.getDefinedKey(i,s)===!1){const l=s.charAt(0).toUpperCase()+s.slice(1);t.getDefinedKey(i,l)&&(pr(ki.Warn,'<strong>Please rename</strong> "'+l+'" to "'+s+'" in '+i),console.warn('Please use lowercase for field: "'+l+'" in '+i,a,o));continue}if(a!=null){if(typeof a=="object"&&(r===void 0||!r.isObject3D)){if(typeof a.node=="number"||typeof a.guid=="string"){if(a.could_not_resolve)continue;if(!(r!==void 0&&Object.keys(r).length>1)){pr(ki.Warn,`<strong>Missing serialization for object reference!</strong>
173
-
174
- Please change to:
175
- @serializable(Object3D)
176
- ${s}? : Object3D;
177
-
178
- in ${i}.ts
179
- <a href="https://docs.needle.tools/serializable" target="_blank">See documentation</a>`),console.warn(i,s,o[s],o);continue}}else if(!Array.isArray(r)){const l=r.constructor?.name;if(l==="Object"&&!r.constructor["did_warn:missing_serializable"]){r.constructor["did_warn:missing_serializable"]=!0;const c='You might be missing a @serializable(Type) decorator for field "'+s+'" in '+i+".ts";console.warn(c+`
180
- ${s}:`,a,l),pr(ki.Warn,"Dev Warning: Are you missing a type in @serializable? Please check the browser console for details")}}}if(typeof r=="string"&&typeof a=="string"&&(a.endsWith(".gltf")||a.endsWith(".glb"))){pr(ki.Warn,`<strong>Missing serialization for object reference!</strong>
181
-
182
- Please change to:
183
- @serializable(AssetReference)
184
- ${s}? : AssetReference;
185
-
186
- in script ${i}.ts
187
- <a href="https://docs.needle.tools/serializable" target="_blank">documentation</a>`),console.warn(i,s,o[s],o);continue}}}}function Nk(o,e){for(const t of Object.keys(e)){const i=e[t];if(typeof i=="object"&&i!==null&&i!==void 0){const n=o[t];if(!n){Gn&&console.log(t,"is undefined on",o);continue}for(const s of Object.keys(i))if(n[s]===void 0&&kv(i[s])&&!kv(n)){const r=Vk(n,s);if(r&&(r?.writable===void 0||r?.writable===!1)&&r.set===void 0){Gn&&console.warn('Property is not writable "'+s+'"',n,r,i[s],n[s]);continue}n[s]=i[s]}}}}function Vk(o,e){for(;o;){const t=Object.getOwnPropertyDescriptor(o,e);if(t)return t;o=Object.getPrototypeOf(o)}}function kv(o){switch(typeof o){case"number":case"string":case"boolean":return!0}return!1}function Hg(o,e,t,i,n){let s=typeof e=="function"&&e.prototype===void 0,r=e;if(s)try{if(r=e?.call(e,n),s=!1,r==null)return}catch(h){console.error("Error in callback",h,o)}if(t.type=r,!s&&n&&(n instanceof ve||n instanceof G||n instanceof gn||n instanceof Pi))return n;if(i||(i={serializer:nu.getSerializerForConstructor(r)}),n&&typeof n=="object"&&jk(n)){if(n.__concreteInstance)return n.__concreteInstance;const h=n;if(!h.$serializedTypes&&r.prototype.$serializedTypes&&(h.$serializedTypes=r.prototype.$serializedTypes),h.$serializedTypes&&su(h,o,t),n&&r!==void 0)try{let d=null;i.serializer&&(d=i.serializer.onDeserialize(o,t)),d||(d=new r,ft&&console.log("Create concrete instance for persistent asset",n,"instance:",d),Va(d,n)),n.__concreteInstance=d,n=d}catch(d){console.error("Error creating instance or creating values on instance",d,n,r)}return n}if(Array.isArray(o)){const h=[];for(let d=0;d<o.length;d++){const p=o[d],m=Hg(p,e,t,i,p);h.push(m)}return h}const a=i?.serializer;if(a)return a.onDeserialize(o,t);if(n instanceof Le)return n;let l;if(o&&(o.isMaterial||o.isTexture||o.isObject3D||o instanceof Pi))l=o;else{if(o===void 0)return;if(o===null&&(r===ve||r===Le||r===G||r===Pi))return null;try{l=new r(...Wk(o))}catch(h){console.error("Error creating "+t.path,t.target,h);return}}const c=l;return c.$serializedTypes&&su(c,o,t),l}function Wk(o){if(ou.length=0,typeof o=="object"&&o!==null&&o!==void 0)for(const e of Object.keys(o))ou.push(o[e]);return ou}const Gg=Symbol("assigned component properties");function Va(o,e,t,i){if(e==null||o==null)return;o[Gg]=!0;const n=o.constructor?.name??"unknown";t?.registerDefinedKeys(n,o);for(const s of Object.keys(e)){const r=$k(o,s);if(typeof r?.value!="function"&&(!r||r.writable===!0||r.set!==void 0)){const a=e[s],l=o[s];o[s]=a,i?.onAssigned&&i.onAssigned(o,s,l,a)}}delete o[Gg]}function $k(o,e){let t;do t=Object.getOwnPropertyDescriptor(o,e);while(!t&&(o=Object.getPrototypeOf(o)));return t}const Mv=Symbol("customVisibilityFlag");function Ao(o,e){o.layers[Mv]=e}const Rv=Symbol("DidPatchLayers");function Hk(){const o=ds.prototype;if(o[Rv])return;o[Rv]=!0;const e=o.test;o.test=function(t){return this[Mv]===!1?!1:e.call(this,t)}}Hk(),Object.defineProperty(re.prototype,"fov",{get:function(){return this._fov},set:function(o){const e=o!==this._fov;this._fov=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(re.prototype,"near",{get:function(){return this._near},set:function(o){const e=o!==this._near;this._near=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0}),Object.defineProperty(re.prototype,"far",{get:function(){return this._far},set:function(o){const e=o!==this._far;this._far=o,e&&this.view!==void 0&&this.updateProjectionMatrix()},configurable:!0});const Tv=new Map;function Ev(o,e){if(!o)return;if(!e){console.warn("No prototype found",o,o.prototype,o.constructor);return}const t=Tv.get(e);t&&t.apply(o)}function Av(o){const e=Gk(o.prototype);Tv.set(o,e)}function Gk(o){return new qk(o)}class qk{$symbol;extensions;descriptors;constructor(e){this.$symbol=Symbol("prototype-extension"),this.extensions=Object.keys(e),this.descriptors=new Array;for(let t=0;t<this.extensions.length;t++){const i=this.extensions[t],n=Object.getOwnPropertyDescriptor(e,i);n&&this.descriptors.push(n)}}apply(e){if(!e[this.$symbol]){e[this.$symbol]=!0;for(let t=0;t<this.extensions.length;t++){const i=this.extensions[t],n=this.descriptors[t];n&&Object.defineProperty(e,i,n)}}}}const Xk=v("debuggetcomponent"),Iv=()=>Xk||globalThis.NEEDLE_DEBUG_GETCOMPONENT===!0;function Qk(o){return o==null||o.isObject3D?o:o.object&&o.object.isObject3D?o.object:o}function qg(o,e){if(!o||!o.userData.components)return e;const t=o.userData.components.indexOf(e);return t<0||(Kd.dispatchComponentLifecycleEvent("removing-component",e),e.gameObject=null,o.userData.components.splice(t,1)),e}function Cc(o,e,t){return Mr(o,e)||Sn(o,e,t)}const Lv=new Lt("addComponentIdProvider");function kr(o,e,t=!0){o.userData||(o.userData={}),o.userData.components||(o.userData.components=[]),o.userData.components.push(e),e.gameObject=o,(e.guid===void 0||e.guid==="invalid")&&(e.guid=Lv.generateUUID()),au(o),wu(e,e.context);try{t&&e.__internalAwake&&(wc(o),e.activeAndEnabled&&e.__internalAwake()),Kd.dispatchComponentLifecycleEvent("component-added",e)}catch(i){console.error(i)}return e}function Sn(o,e,t,i){if(typeof e=="function"){const n=new e;t&&n.__internalNewInstanceCreated(t);let s=!0;return i?.callAwake!=null&&(s=i.callAwake),kr(o,n,s)}if(e.destroyed)return console.warn("Can not move/add a destroyed component",e),e;if(e.gameObject===o)return e;if(e.gameObject&&e.gameObject.userData?.components){const n=e.gameObject.userData.components.indexOf(e);e.gameObject.userData.components.splice(n,1)}if(o.userData||(o.userData={}),!o.userData.components)o.userData.components=[];else if(o.userData.components.includes(e))return e;return o.userData.components.push(e),e.gameObject=o,(e.guid===void 0||e.guid==="invalid")&&(e.guid=Lv.generateUUID()),t&&e._internalInit(t),wu(e,e.context),e}function jv(o){if(o.gameObject&&o.gameObject.userData.components){const e=o.gameObject.userData.components.indexOf(o);o.gameObject.userData.components.splice(e,1)}o.__internalDisable&&o.__internalDisable(),Eo(o,o.context??z.Current),o.destroy(),o.gameObject=null}let Dv=!1;function Bv(o,e,t){if(o==null)return null;if(!o.isObject3D)return console.error("Object is not object3D"),null;if(!o?.userData?.components||(typeof e=="string"&&(Dv||(Dv=!0,console.warn(`Accessing components by name is not supported.
188
- Please use the component type instead. This may keep working in local development but it will fail when bundling your application.
189
-
190
- You can import other modules your main module to get access to types
191
- or if you use npmdefs you can make types available globally using globalThis:
192
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis`,e))),Iv()&&console.log("[onGetComponent] FIND",e),e==null))return null;for(let i=0;i<o.userData.components.length;i++){const n=o.userData.components[i];let s=Object.getPrototypeOf(n);for(;s;){if(s===e.prototype)if(Iv()&&console.log("[onGetComponent] MATCH BY PROTOYPE",s),t)t.push(n);else return n;s=Object.getPrototypeOf(s)}}return t||null}function Mr(o,e){const t=Bv(o,e);return t?Array.isArray(t)?t[0]:t:null}function Pc(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),Bv(o,e,t),t}function Oc(o,e,t){if(t===!1&&o[ko]===!1)return null;const i=Mr(o,e);if(t===!1&&i?.enabled===!1)return null;if(i)return i;for(let n=0;n<o?.children?.length;n++){const s=Oc(o.children[n],e);if(s)return s}return null}function Wa(o,e,t,i=!0){t||(t=[]),i&&(t.length=0),Pc(o,e,t,!1);for(let n=0;n<o?.children?.length;n++)Wa(o.children[n],e,t,!1);return t}function kc(o,e){if(!o)return null;if(Array.isArray(o)){for(let i=0;i<o.length;i++){const n=Qk(o[i]),s=kc(n,e);if(s)return s}return null}return Mr(o,e)||(o.parent?kc(o.parent,e):null)}function ru(o,e,t,i=!0){return t||(t=[]),i&&(t.length=0),o?(Pc(o,e,t,!1),o.parent?ru(o.parent,e,t,!1):t):t}function $a(o,e=void 0,t=!0){if(!o)return null;if(!e&&(e=z.Current,!e))return console.error("Can not search object without any needle context or scene!!!"),null;let i=e;return i.isScene||(i=e?.scene),i&&Oc(i,o,t)||null}function Fv(o,e,t=void 0){if(!o)return e??[];if(e||(e=[]),e.length=0,!t&&(t=z.Current,!t))return console.error("Can not search object without any needle context or scene!!!"),e;"scene"in t&&(t=t.scene);const i=t;return i&&Wa(i,o,e,!1),e}function au(o){o&&o.isObject3D===!0&&Ev(o,k)}if(vc.experimentalSmartHierarchyUpdate){const o=k.prototype.add;k.prototype.add=function(...i){return Ig(),o.apply(this,i)};const e=k.prototype.attach;k.prototype.attach=function(...i){return Ig(),e.apply(this,i)};const t=k.prototype.remove;k.prototype.remove=function(...i){return Ig(),t.apply(this,i)}}k.prototype.SetActive=function(o){this.visible=o},k.prototype.setActive=function(o){this.visible=o},k.prototype.destroy=function(){Zi(this)},k.prototype.addComponent=function(o,e){return Sn(this,o,e)},k.prototype.addNewComponent=function(o,e){return Sn(this,o,e)},k.prototype.removeComponent=function(o){return qg(this,o)},k.prototype.getOrAddComponent=function(o,e){return Cc(this,o,e)},k.prototype.getComponent=function(o){return Mr(this,o)},k.prototype.getComponents=function(o,e){return Pc(this,o,e)},k.prototype.getComponentInChildren=function(o){return Oc(this,o)},k.prototype.getComponentsInChildren=function(o,e){return Wa(this,o,e)},k.prototype.getComponentInParent=function(o){return kc(this,o)},k.prototype.getComponentsInParent=function(o,e){return ru(this,o,e)},Object.getOwnPropertyDescriptor(k.prototype,"activeSelf")||Object.defineProperty(k.prototype,"activeSelf",{get:function(){return Ha(this)},set:function(o){Mc(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"raycastAllowed")||Object.defineProperty(k.prototype,"raycastAllowed",{get:function(){return this.userData&&this.userData.raycastAllowed!==!1},set:function(o){const e=this;e.userData||(e.userData={}),e.userData.raycastAllowed=o}}),Object.getOwnPropertyDescriptor(k.prototype,"worldPosition")||Object.defineProperty(k.prototype,"worldPosition",{get:function(){return this instanceof gb?J(this.object):J(this)},set:function(o){gt(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldQuaternion")||Object.defineProperty(k.prototype,"worldQuaternion",{get:function(){return this instanceof gb?be(this.object):be(this)},set:function(o){yn(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRotation")||Object.defineProperty(k.prototype,"worldRotation",{get:function(){return jd(this)},set:function(o){o_(this,o)}}),Object.getOwnPropertyDescriptor(k.prototype,"worldScale")||Object.defineProperty(k.prototype,"worldScale",{get:function(){return He(this)},set:function(o){Aa(this,o)}});const Yk=new K,Zk=new b(0,0,0),Kk=new b(0,1,0);Object.getOwnPropertyDescriptor(k.prototype,"worldForward")||Object.defineProperty(k.prototype,"worldForward",{get:function(){return D().set(0,0,1).applyQuaternion(be(this))},set:function(o){const e=ri().setFromRotationMatrix(Yk.lookAt(Zk.set(0,0,0),o,Kk.set(0,1,0)));this.worldQuaternion=e}}),Object.getOwnPropertyDescriptor(k.prototype,"worldRight")||Object.defineProperty(k.prototype,"worldRight",{get:function(){return D().set(1,0,0).applyQuaternion(be(this))}}),Object.getOwnPropertyDescriptor(k.prototype,"worldUp")||Object.defineProperty(k.prototype,"worldUp",{get:function(){return D().set(0,1,0).applyQuaternion(be(this))}}),Object.getOwnPropertyDescriptor(k.prototype,"contains")||Object.defineProperty(k.prototype,"contains",{value:function(o){if(!o)return!1;if(this===o)return!0;for(const e of this.children)if(e.contains(o))return!0;return!1}}),Av(k);const lu=v("debuggetcomponent"),Rr=v("debuginstantiate");class Bn{idProvider;parent;keepWorldPosition;position;rotation;scale;visible;context;components;clone(){const e=new Bn;return e.idProvider=this.idProvider,e.parent=this.parent,e.keepWorldPosition=this.keepWorldPosition,e.position=Array.isArray(this.position)?[...this.position]:this.position?.clone(),e.rotation=Array.isArray(this.rotation)?[...this.rotation]:this.rotation?.clone(),e.scale=Array.isArray(this.scale)?[...this.scale]:this.scale?.clone(),e.visible=this.visible,e.context=this.context,e.components=this.components,e}cloneAssign(e){this.idProvider=e.idProvider,this.parent=e.parent,this.keepWorldPosition=e.keepWorldPosition,this.position=Array.isArray(e.position)?[...e.position]:e.position?.clone(),this.rotation=Array.isArray(e.rotation)?[...e.rotation]:e.rotation?.clone(),this.scale=Array.isArray(e.scale)?[...e.scale]:e.scale?.clone(),this.visible=e.visible,this.context=e.context,this.components=e.components}}function Ha(o){return o.visible}function Mc(o,e){return typeof e=="number"&&(e=e>.5),o.visible=e,o.visible}function Uv(o){return o[ko]||cu(o)}function zv(o,e){o[sv]=e}function cu(o){return hn.isUsingInstancing(o)}function Xg(o,e){return Ta(o,e,!0,!0)}const Nv=Symbol("isDestroyed");function Tr(o){return o[Nv]}function Vv(o,e){o[Nv]=e}const Qg=Symbol("isDontDestroy");function Ga(o,e=!0){o[Qg]=e}const hu=[],du=[];function Zi(o,e=!0,t=!1){hu.length=0,du.length=0,Yg(o,e,!0);for(const i of hu)i.gameObject=null,i.context=null;for(const i of du)Vv(i,!0),t&&Pe(i);du.length=0,hu.length=0}function Yg(o,e=!0,t=!0){if(o==null)return;const i=o;if(i.isComponent){if(i[Qg])return;hu.push(i);const r=i.gameObject;i.__internalDisable(),i.__internalDestroy(),i.gameObject=r;return}if(o[Qg])return;const n=o;lu&&console.log(n),du.push(n);const s=n.userData?.components;if(s!=null&&Array.isArray(s)){let r=s.length;for(let a=0;a<s.length;a++){const l=s[a];Yg(l,e,!1),s.length<r&&(r=s.length,a--)}}if(e&&n.children)for(const r of n.children)Yg(r,e,!1);t&&n.removeFromParent()}function Er(o,e,t=!0){return Wv(o,e,t)}function*uu(o,e,t=!1,i=999,n=0){if(o?.userData.components&&!(n>i)){for(const s of o.userData.components)e&&s?.isComponent===!0&&s instanceof e?yield s:yield s;if(t===!0)for(const s of o.children)yield*uu(s,e,!0,i,n+1)}}function Wv(o,e,t,i=0){if(o){if(o.isObject3D,i>1e3){console.warn("Failed to iterate components: too many levels");return}if(o.userData?.components)for(let n=0;n<o.userData.components.length;n++){const s=o.userData.components[n];if(s?.isComponent===!0){const r=e(s);if(r!==void 0)return r}}if(t&&o.children){const n=i+1;for(let s=0;s<o.children.length;s++){const r=o.children[s];if(!r)continue;const a=Wv(r,e,t,n);if(a!==void 0)return a}}}}function qa(o,e){if("isAssetReference"in o)return o.instantiate(e??void 0);let t=null;e!=null&&(e.x!==void 0?(t=new Bn,t.position=e):t=e);let i=z.Current;t?.context&&(i=t.context),lu&&i.alias&&console.log("context",i.alias),t&&!t.idProvider&&(t.idProvider=new Lt(Date.now()));const n=[],s={},r={},a=$v(i,o,t,n,s,r);a&&(tM(a,s),eM(r,s)),lu&&(Dd(o,!0),Dd(a,!0));const l={};if(t?.components!==!1){for(const c in n){const h=n[c],d=h.guid;t&&t.idProvider&&(h.guid=t.idProvider.generateUUID(),l[d]=h.guid,lu&&console.log(h.name,h.guid)),wu(h,i),h.__internalNewInstanceCreated&&h.__internalNewInstanceCreated()}for(const c in n){const h=n[c];h.resolveGuids&&h.resolveGuids(l),h.enabled!==!1&&(h.enabled=!0)}Jd(i)}return a}function $v(o,e,t,i,n,s){if(!e||e[Mi])return null;const r=e.userData;e.userData={};const a=e.children;e.children=[];const l=e.clone(!1);if(au(l),e.userData=r,e.children=a,n[e.uuid]={original:e,clone:l},Rr&&console.log("ADD",e,l),e.type==="SkinnedMesh"&&(s[e.uuid]={original:e,clone:l}),t?.visible!==void 0&&(l.visible=t.visible),t?.idProvider){l.uuid=t.idProvider.generateUUID();const h=l;h&&(h.guid=l.uuid)}e.animations&&e.animations.length>0&&(l.animations=[...e.animations]);const c=e.parent;if(c&&c.add(l),t?.position)if(Array.isArray(t.position)){const h=new b;h.fromArray(t.position),l.worldPosition=h}else l.worldPosition=t.position;else l.position.copy(e.position);if(t?.rotation){if(t.rotation instanceof U)l.worldQuaternion=t.rotation;else if(t.rotation instanceof ot)l.worldQuaternion=ri().setFromEuler(t.rotation);else if(Array.isArray(t.rotation)){const h=new ot;h.fromArray(t.rotation),l.worldQuaternion=ri().setFromEuler(h)}}else l.quaternion.copy(e.quaternion);if(t?.scale)if(Array.isArray(t.scale)){const h=new b;h.fromArray(t.scale),t.scale=h}else l.scale.copy(t.scale);else l.scale.copy(e.scale);if(t?.parent&&t.parent!=="scene"){let h=null;if(typeof t.parent=="string"?h=Ta(t.parent,o.scene,!0):h=t.parent,h){const d=t.keepWorldPosition===!0?h.attach:h.add;d?d.call(h,l):console.error("Invalid parent object",h,"received when instantiating:",e)}else console.warn("could not find parent:",t.parent)}for(const[h,d]of Object.entries(e.userData))h!=="components"&&(l.userData[h]=d);if(e.userData?.components){const h=e.userData.components,d=[];l.userData.components=d;for(let p=0;p<h.length;p++){const m=h[p],f=new m.constructor;Jk(m,f),m[hc]!==void 0&&(f[hc]=m[hc]),d.push(f),f.gameObject=l,i.push(f),n[m.guid]={original:m,clone:f},Kd.dispatchComponentLifecycleEvent("component-added",f)}}t&&(t.position=void 0,t.rotation=void 0,t.scale=void 0,t.parent=void 0,t.visible=void 0);for(const h in e.children){const d=e.children[h],p=$v(o,d,t,i,n,s);p&&(n[p.uuid]={original:d,clone:p},l.add(p))}return l}function Jk(o,e,t){Va(e,o,void 0,{})}function eM(o,e){for(const t in o){const i=o[t],n=i.original,s=n.skeleton,r=i.clone;if(!s){console.warn("Skinned mesh has no skeleton?",i);continue}const a=s.bones,l=r.skeleton.clone();r.skeleton=l,r.bindMatrix.clone().copy(n.bindMatrix),r.bindMatrixInverse.copy(n.bindMatrixInverse);const c=[];l.bones=c;for(let h=0;h<a.length;h++){const d=a[h],p=e[d.uuid].clone;c.push(p)}}for(const t in o){const i=o[t].clone;i.skeleton.update(),i.bind(i.skeleton,i.bindMatrix),i.updateMatrixWorld(!0)}}function tM(o,e){for(const t in e){const i=e[t].clone;if(i?.isObject3D&&i?.userData?.components)for(let n=0;n<i.userData.components.length;n++){const s=i.userData.components[n],r=Object.entries(s);for(const[a,l]of r)if(Array.isArray(l)){const c=[];s[a]=c;for(let h=0;h<l.length;h++){const d=l[h];if(typeof d!="object"){c.push(d);continue}const p=Hv(s,a,d,e);p!==void 0?(Rr&&console.log("Found new instance for",a,d,"->",p),c.push(p)):(Rr&&console.warn("Could not find new instance for",a,d),c.push(d))}}else if(typeof l=="object"){const c=Hv(s,a,l,e);c!==void 0?s[a]=c:Rr&&console.warn("Could not find new instance for",a,l)}}}}function Hv(o,e,t,i){if(t!=null)if(t.isComponent===!0){const n=t.gameObject;if(n){const s=n.uuid,r=i[s]?.clone;if(!r){Rr&&console.log("reference did not change",e,o,t);return}const a=n.userData.components.indexOf(t);if(a>=0&&r.isObject3D)return Rr&&console.log(e,s),r.userData.components[a];console.warn("could not find component",e,t)}}else if(t.isObject3D===!0){if(e==="gameObject")return;const n=t;if(n){const s=n.uuid,r=i[s]?.clone;if(r)return Rr&&console.log(e,"old",t,"new",r),r}}else{if(t.isVector4||t.isVector3||t.isVector2||t.isQuaternion||t.isEuler||t.isColor===!0)return t.clone();if(t.isEventList===!0)return t.__internalOnInstantiate(i)}}var Ar;(o=>{o.baseUrl="https://networking.needle.tools";function e(l){return Cb(new Uint8Array(l))}o.hashMD5=e;function t(l){const c=Cb(new Uint8Array(l),{encoding:"binary",asBytes:!0});return btoa(String.fromCharCode(...c))}o.hashMD5_Base64=t;function i(l){const c=new Uint8Array(l);return crypto.subtle.digest("SHA-256",c).then(h=>btoa(String.fromCharCode(...new Uint8Array(h))))}o.hashSha256=i;function n(l){const c=l.filesize/1024/1024;return Io()?c<50:c<5}o.canUpload=n;async function s(l,c){const h=o.baseUrl;if(h){if(!l.name)return console.error("Upload: file name is missing"),null}else return console.error("Blob storage base url is not set"),null;let d=null;l instanceof File?d=await l.arrayBuffer():d=l.data;const p=d.byteLength,m=p/1024/1024;if(m>50)return c?.silent!==!0&&ye(`File (${m.toFixed(1)}MB) is too large for uploading (see console for details)`),console.warn(`Your file is too large for uploading (${m.toFixed(1)}MB). Max allowed size is 50MB`),null;if(!Io()&&m>5)return c?.silent!==!0&&ye('File is too large for uploading. Please get a <a href="https://needle.tools/pricing" target="_blank">commercial license</a> to upload files larger than 5MB'),console.warn(`Your file is too large for uploading (${m.toFixed(1)}MB). Max size is 5MB for non-commercial users. Please get a commercial license at https://needle.tools/pricing for larger files (up to 50MB)`),null;if(p<1)return console.warn(`Your file is too small for uploading (${m.toFixed(1)}MB). Min size is 1 byte`),null;const f=t(d),g={filename:l.name,"Content-Md5":f,"Content-Type":l.type||"application/octet-stream",FileSize:p.toString(),"Content-Disposition":`attachment; filename="${l.name}"`,"x-amz-server-side-encryption":"AES256"},y=await fetch(h+"/api/needle/blob",{method:"POST",headers:g,signal:c?.abort}).then(_=>_.json()).catch(_=>(console.error(_),null));if(y==null)return console.warn("Upload failed..."),null;if("error"in y)return console.error(y.error),null;if("upload"in y&&y.upload){let _=function(M){return c?.onProgress?.call(null,{progress01:0,state:"inprogress"}),fetch(M,{method:"PUT",headers:g,body:d,signal:c?.abort}).then(O=>(c?.onProgress?.call(null,{progress01:1,state:"finished"}),O)).catch(O=>O)};console.debug("Uploading file",y.upload);let w=!1,P=null;for(let M=0;M<3;M++)try{if(w)break;if(c?.abort?.aborted)return console.debug("Aborted upload"),null;const O=await _(y.upload);O instanceof Error?(P=O,await Wn(1e3*M)):O.ok&&(console.debug("File uploaded successfully"),w=!0)}catch(O){console.error(O)}if(!w)return console.error(P?.message||"Failed to upload file"),null}if("download"in y){const _=h+y.download;return console.debug("File found in blob storage",_),{key:y.key,success:!0,download_url:_}}return null}o.upload=s;function r(l){return`${o.baseUrl}/api/needle/blob/${l}`}o.getBlobUrlForKey=r;async function a(l,c){const h=new fm;h.setResponseType("arraybuffer");const d=await h.loadAsync(l,p=>{c&&c.call(null,p)});return d instanceof ArrayBuffer?new Uint8Array(d):(console.error("Download failed, no arraybuffer returned"),null)}o.download=a})(Ar||(Ar={}));const _s=v("debugaddressables");class Gv{_context;_assetReferences={};constructor(e){this._context=e,this._context.pre_update_callbacks.push(this.preUpdate)}dispose(){const e=this._context.pre_update_callbacks.indexOf(this.preUpdate);e>=0&&this._context.pre_update_callbacks.splice(e,1);for(const t in this._assetReferences)this._assetReferences[t]?.unload();this._assetReferences={}}preUpdate=()=>{};findAssetReference(e){return this._assetReferences[e]||null}registerAssetReference(e){return e.url&&(this._assetReferences[e.url]?console.warn("Asset reference already registered",e):this._assetReferences[e.url]=e),e}unregisterAssetReference(e){e.url&&delete this._assetReferences[e.url]}}const Zg=Symbol("assetReference");class ie{static getOrCreateFromUrl(e,t){if(!t&&(t=z.Current,!t))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.');const i=t.addressables,n=i.findAssetReference(e);if(n)return n;const s=new ie(e,t.hash);return i.registerAssetReference(s),s}static getOrCreate(e,t,i){if(typeof e=="string"){if(!i&&(i=z.Current,!i))throw new Error('Context is required when sourceId is a string. When you call this method from a component you can call it with "getOrCreate(this, url)" where "this" is the component.')}else i=e.context,e=e.sourceId;const n=ms(e,t);_s&&console.log("GetOrCreate Addressable from",e,t,"FinalPath=",n);const s=i.addressables,r=s.findAssetReference(n);if(r)return r;const a=new ie(n,i.hash);return s.registerAssetReference(a),a}isAssetReference=!0;get rawAsset(){return this._rawAsset}get asset(){return this._glbRoot??(this._rawAsset?.scene||null)}set asset(e){e?this._rawAsset={animations:e.animations,scene:e,scenes:[e]}:this._rawAsset=null}get uri(){return this._url}get url(){return this._url}get urlName(){return this._urlName}get hasUrl(){return this._url!==void 0&&(this._url.startsWith("http")||this._url.startsWith("blob:")||this._url.startsWith("www.")||this._url.includes("/"))}_rawAsset=null;_glbRoot;_url;_urlName;_progressListeners=[];_isLoadingRawBinary=!1;_rawBinary;constructor(...e){typeof e[0]=="object"?"url"in e[0]?this._url=e[0].url:(this._url="",e[0].asset&&(this.asset=e[0].asset)):(this._url=e[0],e[2]instanceof k&&(this.asset=e[2]));const t=this._url.lastIndexOf("/");if(t>=0){this._urlName=this._url.substring(t+1);const i=this._urlName.lastIndexOf(".");i>=0&&(this._urlName=this._urlName.substring(0,i))}else this._urlName=this._url;_v(this._url,this.onResolvePrefab.bind(this))}async onResolvePrefab(e){return e===this.url&&(this.mustLoad&&await this.loadAssetAsync(),this.asset)?this.asset:null}get mustLoad(){return!this.asset||this.asset.__destroyed===!0||Tr(this.asset)===!0}_loadingPromise=null;isLoaded(){return this._rawBinary||this.asset!==void 0}unload(){this.asset&&(_s&&console.log("Unload",this.asset),"scene"in this.asset&&this.asset.scene&&Zi(this.asset.scene,!0,!0),Zi(this.asset,!0,!0)),this.asset=null,this._rawBinary=void 0,this._glbRoot=null,this._loadingPromise=null,z.Current&&z.Current.addressables.unregisterAssetReference(this)}async preload(){if(!this.mustLoad||this._isLoadingRawBinary)return null;if(this._rawBinary!==void 0)return this._rawBinary;this._isLoadingRawBinary=!0,_s&&console.log("Preload",this.url);const e=await Ar.download(this.url,t=>{this.raiseProgressEvent(t)});return this._rawBinary=e?.buffer??null,this._isLoadingRawBinary=!1,this._rawBinary}async loadAssetAsync(e){if(_s&&console.log("[AssetReference] loadAssetAsync",this.url),!this.mustLoad)return this.asset;if(e&&this._progressListeners.push(e),this._loadingPromise!==null)return this._loadingPromise.then(n=>this.asset);const t=z.Current;if(this._rawBinary){if(!(this._rawBinary instanceof ArrayBuffer))return console.error("[AssetReference] Failed loading \u2013 Invalid data. Must be of type ArrayBuffer. "+typeof this._rawBinary),null;this._loadingPromise=_n().parseSync(t,this._rawBinary,this.url,null),this.raiseProgressEvent(new ProgressEvent("progress",{loaded:this._rawBinary.byteLength,total:this._rawBinary.byteLength}))}else _s&&console.log("Load async",this.url),this._loadingPromise=_n().loadSync(t,this.url,this.url,null,n=>{this.raiseProgressEvent(n)});this._loadingPromise.finally(()=>this._loadingPromise=null);const i=await this._loadingPromise;return this._progressListeners.length=0,this._glbRoot=this.tryGetActualGameObjectRoot(i),i?(i[Zg]=this,this._glbRoot&&(this._glbRoot[Zg]=this),this.asset&&(this.asset[Zg]=this),Jd(t),i.scene!==void 0&&(this._rawAsset=i),this.asset):null}instantiate(e){return this.onInstantiate(e,!1)}instantiateSynced(e,t=!0){return this.onInstantiate(e,!0,t)}beginListenDownload(e){this._progressListeners.indexOf(e)<0&&this._progressListeners.push(e)}endListenDownload(e){const t=this._progressListeners.indexOf(e);t>=0&&this._progressListeners.splice(t,1)}raiseProgressEvent(e){for(const t of this._progressListeners)t(this,e)}static currentlyInstantiating=new Map;async onInstantiate(e,t=!1,i){const n=z.Current,s=new Bn;if(e instanceof k?s.parent=e:e&&(Object.assign(s,e),s.cloneAssign(e)),s.parent===void 0&&(s.parent=n.scene),this.mustLoad&&await this.loadAssetAsync(),_s&&console.log("Instantiate",this.url,"parent:",e),this.asset){_s&&console.log("Add to scene",this.asset);let r=ie.currentlyInstantiating.get(this.url);if(r!==void 0&&r>=1e4)return console.error("Recursive or too many instantiations of "+this.url+" in the same frame ("+r+")"),null;try{if(r===void 0&&(r=0),r+=1,ie.currentlyInstantiating.set(this.url,r),t){s.context=n;const a=this.asset;a.guid=this.url;const l=Bg(a,s,void 0,i);if(l)return l}else{const a=qa(this.asset,s);if(a)return a}}finally{n.post_render_callbacks.push(()=>{r===void 0||r<0?r=0:r-=1,ie.currentlyInstantiating.set(this.url,r)})}}else _s&&console.warn("Failed to load asset",this.url);return null}tryGetActualGameObjectRoot(e){if(e&&e.scene){const t=e.scene;if(t.isGroup&&t.children.length===1&&t.children[0].name+"glb"===t.name){const i=t.children[0];return i.animations=t.animations,i}else return t}return null}}class iM extends Yi{constructor(){super([ie],"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?ie.getOrCreate(t.gltfId,e,t.context):(console.error("Missing source id"),null):(console.error("Missing context"),null);if(e instanceof k){if(!t.context)return console.error("Missing context"),null;if(!t.gltfId)return console.error("Missing source id"),null;const i=e,n=t.context,s=i.guid??i.uuid,r=n.addressables.findAssetReference(s);if(r)return r;const a=new ie(s,void 0,i);return n.addressables.registerAssetReference(a),a}return null}}new iM;const nM=Promise.resolve(null);class wa{static imageReferences=new Map;static getOrCreate(e){let t=wa.imageReferences.get(e);return t||(t=new wa(e),wa.imageReferences.set(e,t)),t}constructor(e){this.url=e}url;_bitmap;_bitmapObject;dispose(){this._bitmapObject&&this._bitmapObject.close(),this._bitmap=void 0}createHTMLImage(){const e=new Image;return e.src=this.url,e}loader=null;createTexture(){return this.url?(this.loader||(this.loader=new Kl),this.loader.setCrossOrigin("anonymous"),this.loader.loadAsync(this.url).then(e=>(e&&!e.name?.length&&(e.name=this.url.split("/").pop()??this.url),e))):(console.error("Can not load texture without url"),nM)}getBitmap(){return this._bitmap?this._bitmap:(this._bitmap=new Promise((e,t)=>{const i=document.createElement("img");i.addEventListener("load",()=>{this._bitmap=createImageBitmap(i).then(n=>(this._bitmapObject=n,e(n),n))}),i.addEventListener("error",n=>{console.error("Failed to load image:"+this.url,n),e(null)}),i.src=this.url}),this._bitmap)}}class qv extends Yi{constructor(){super([wa],"ImageReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=ms(t.gltfId,e);return wa.getOrCreate(i)}}}new qv;class xa{static cache=new Map;static getOrCreate(e){let t=xa.cache.get(e);return t||(t=new xa(e),xa.cache.set(e,t)),t}async loadRaw(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.blob())}async loadText(){return this.res||(this.res=fetch(this.url)),this.res.then(e=>e.text())}url;res;constructor(e){this.url=e}}class Xv extends Yi{constructor(){super([xa],"FileReferenceSerializer")}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"){const i=ms(t.gltfId,e);return xa.getOrCreate(i)}}}new Xv;class oM{context;mixers=[];constructor(e){this.context=e}onDestroy(){this.mixers.forEach(e=>e.stopAllAction()),this.mixers.length=0}registerAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.registerAnimationMixer called with null or undefined mixer");return}this.mixers.includes(e)||this.mixers.push(e)}unregisterAnimationMixer(e){if(!e){console.warn("AnimationsRegistry.unregisterAnimationMixer called with null or undefined mixer");return}const t=this.mixers.indexOf(e);t!==-1&&this.mixers.splice(t,1)}}class vs{static tryGetActionsFromMixer(e){return e._actions||null}static tryGetAnimationClipsFromObjectHierarchy(e,t){if(t||(t=new Array),e)e.animations&&t.push(...e.animations);else return t;if(e.children)for(const i of e.children)this.tryGetAnimationClipsFromObjectHierarchy(i,t);return t}static autoplayAnimations(e){if(!e||!e.animations)return console.debug("No animations found in file"),null;const t="scene"in e?e.scene:e,i=new Array;for(let s=0;s<e.animations.length;s++){const r=e.animations[s];if(!r.tracks||r.tracks.length<=0){console.warn("Animation has no tracks");continue}for(const a in r.tracks){const l=r.tracks[a],c=ka.parseTrackName(l.name);let h=ka.findNode(t,c.nodeName);if(!h){const p=l.__objectName??l.name.substring(0,l.name.indexOf("."));if(h=t.getObjectByProperty("uuid",p),!h)continue}let d=n(h)||n(t);if(!d){const p=C.get("Animation");if(d=t.addComponent(p),!d){console.error("Failed creating Animation component: No 'Animation' component found in TypeStore");break}}i.push(d),d.addClip&&d.addClip(r)}}return i;function n(s){if(!s)return null;const r=s.userData?.components;if(r&&r.length>0)for(let a=0;a<r.length;a++){const l=r[a];if(l.isAnimationComponent===!0)return l}return n(s.parent)}}static emptyClip(){return new Pi("empty",0,[])}static createScaleClip(e){const t=e?.duration??.3;let i={x:1,y:1,z:1};e?.scale!==void 0&&(typeof e.scale=="number"?i={x:e.scale,y:e.scale,z:e.scale}:i=e.scale);const n=e?.type??"linear",s=e?.scaleFactor??1.2,r=new Array,a=new Array;switch(n){case"linear":r.push(0,t),a.push(i.x,i.y,i.z,i.x*s,i.y*s,i.z*s);break;case"spring":r.push(0,t*.3,t*.5,t*.7,t*.9,t),a.push(i.x,i.y,i.z,i.x*s,i.y*s,i.z*s,i.x*.9,i.y*.9,i.z*.9,i.x*1.05,i.y*1.05,i.z*1.05,i.x*.98,i.y*.98,i.z*.98,i.x,i.y,i.z);break}const l=new LS(".scale",r,a);return new Pi("scale",r[r.length-1],[l])}}function*Kg(o,e=null){const t=e?e.time:z.Current.time,i=t.time;for(;t.time-i<o;)yield}function*sM(o){for(let e=0;e<o;e++)yield}function*Qv(o){let e=!0;for(o.then(()=>e=!1),o.catch(()=>e=!1);e;)yield}const Yv="NEEDLE_lightmaps",Xa=v("debuglightmapsextension")||v("debuglightmaps");var qn=(o=>(o[o.Lightmap=0]="Lightmap",o[o.Skybox=1]="Skybox",o[o.Reflection=2]="Reflection",o))(qn||{});class rM{get name(){return Yv}parser;registry;source;constructor(e,t,i){this.parser=e,this.registry=t,this.source=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[Yv];if(i){const n=i.textures;return n?.length?(Xa&&console.log(i),new Promise(async(s,r)=>{const a=[];for(const c of n)if(c.pointer){Xa&&console.log(c);let h=null;if(c.pointer.startsWith("/textures/")||c.pointer.startsWith("textures/"))Xa&&console.log("Load texture from gltf",c.pointer),h=Ng(this.parser,c.pointer).then(d=>this.resolveTexture(c,d));else if(typeof c.pointer=="string"){Xa&&console.log("Load texture from path",c.pointer);const d=ms(this.source,c.pointer);let p;d.endsWith(".exr")?p=new km(this.parser.options.manager):d.endsWith(".hdr")?p=new fb(this.parser.options.manager):p=new Kl(this.parser.options.manager),h=p.loadAsync(d,void 0).then(m=>this.resolveTexture(c,m))}else c.pointer;h&&a.push(h)}const l=await zm(a);l?.anyFailed&&(A()||Xa)&&console.error("[NEEDLE_lightmaps]Error during extension loading:",l),s()})):null}}return null}resolveTexture(e,t){const i=t;Xa&&console.log("Light Texture loaded:",i),i?.isTexture&&(this.registry?(i.colorSpace=So,this.registry.registerTexture(this.source,e.type,i,e.index)):console.log(qn[e.type],e.pointer,i))}}const Qa=!!v("debuglightmaps");class aM{context;map=new Map;clear(){this.map.clear()}constructor(e){this.context=e}registerTexture(e,t,i,n){Qa&&console.log("Registering ",qn[t]+' "'+e+'"',i),this.map.has(e)||this.map.set(e,new Map);const s=this.map.get(e),r=s?.get(t)??[];r.length<n&&(r.length=n+1),iv(i,!1),r[n]=i,s?.set(t,r)}tryGetLightmap(e,t=0){return this.tryGet(e,qn.Lightmap,t)}tryGetSkybox(e){return Qa&&console.log("[Get Skybox]",e,this.map),this.tryGet(e,qn.Skybox,0)}tryGetReflection(e){return Qa&&console.log("[Get Reflection]",e,this.map),this.tryGet(e,qn.Reflection,0)}tryGet(e,t,i){if(!e)return Qa&&console.warn("Missing source id"),null;const n=this.map.get(e);if(!n)return Qa&&console.warn(`[Lighting] No ${qn[t]} texture entry for`,e),null;const s=n.get(t);return s===void 0?(Qa&&console.warn(`[Lighting] No ${qn[t]} texture for`,e,"index",i),null):!s?.length||s.length<=i?null:s[i]}}qt.lights_fragment_maps=qt.lights_fragment_maps.replace("vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );",`
193
- vec2 lUv = vLightMapUv.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
194
- vec4 lightMapTexel = texture2D( lightMap, lUv);
195
- // 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.
196
- lightMapTexel.rgb *= lightMapTexel.a * 8.; // no idea where that "8" comes from... heuristically derived
197
- lightMapTexel.a = 1.;
198
- lightMapTexel = conv_sRGBToLinear(lightMapTexel);
199
- `),qt.lightmap_pars_fragment=`
200
- #ifdef USE_LIGHTMAP
201
- uniform sampler2D lightMap;
202
- uniform float lightMapIntensity;
203
- uniform vec4 lightmapScaleOffset;
204
-
205
- // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
206
- vec4 conv_sRGBToLinear( in vec4 value ) {
207
- 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 );
208
- }
209
- #endif
210
- `,qt.lights_fragment_begin=qt.lights_fragment_begin.replace("irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );",`
211
- #if defined(USE_LIGHTMAP)
212
- irradiance += 0.;
213
- #else
214
- irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
215
- #endif`),jS.lightmap.lightmapScaleOffset={value:new pe(1,1,0,0)};const Jg=v("debugprogressive"),pu=new xi,mu=new _d;class lM{static GLTF_PROGRESSIVE_LODSMANAGER_TYPE=dr;context;_lodsManager;_settings={};get manager(){return this._lodsManager}get skinnedMeshAutoUpdateBoundsInterval(){return this._lodsManager?.skinnedMeshAutoUpdateBoundsInterval||this._settings.skinnedMeshAutoUpdateBoundsInterval||0}set skinnedMeshAutoUpdateBoundsInterval(e){this._settings.skinnedMeshAutoUpdateBoundsInterval=e,this.applySettings()}get targetTriangleDensity(){return this._lodsManager?.targetTriangleDensity||this._settings.targetTriangleDensity||2e5}set targetTriangleDensity(e){this._settings.targetTriangleDensity=e,this.applySettings()}constructor(e){this.context=e}applySettings(){if(this._lodsManager)for(const e in this._settings)this._lodsManager[e]=this._settings[e]}setRenderer(e){this._lodsManager?.disable(),dr.removePlugin(this),dr.addPlugin(this),dr.debugDrawLine=B.DrawLine,this._lodsManager=dr.get(e,{engine:"needle-engine"}),this.applySettings(),this._lodsManager.enable()}disable(){this._lodsManager?.disable(),dr.removePlugin(this)}onAfterUpdatedLOD(e,t,i,n,s){Jg&&this.onRenderDebug(i,n,s)}onRenderDebug(e,t,i){if(!t.geometry||!Ve.hasLODLevelAvailable(t.geometry)&&!Ve.hasLODLevelAvailable(t.material))return;const n=dr.getObjectLODState(t);if(!n)return;let s=i.mesh_lod;const r=i.mesh_lod!=n.lastLodLevel_Mesh||i.texture_lod!=n.lastLodLevel_Texture;if(Jg&&t.geometry.boundingSphere){const a=t.geometry.boundingSphere;mu.copy(a),mu.applyMatrix4(t.matrixWorld);const l=mu.center,c=mu.radius,h=["#76c43e","#bcc43e","#c4ac3e","#c4673e","#ff3e3e"];if(r)B.DrawWireSphere(l,c,h[s],.1);else{const d=t.geometry.index?.count??0,p=Ve.getMeshLODExtension(t.geometry)?.lods;s=p?Math.min(p?.length-1,s):0;let m="";if(p&&n.lastScreenCoverage>0)for(let y=0;y<p.length;y++){const _=p[y].density,w=y==p.length-1;m+=_.toFixed(0)+">"+(_/n.lastScreenCoverage).toFixed(0)+(w?"":",")}const f=p?p[s]?.density:-1;let g="LOD "+i.mesh_lod+`
216
- TEX `+i.texture_lod;if(Jg=="density"&&(g+=`
217
- `+d+` tris
218
- `+(f/n.lastScreenCoverage).toFixed(0)+` dens
219
- `+(n.lastScreenCoverage*100).toFixed(1)+`% cov
220
- `+(n.lastCentrality*100).toFixed(1)+`% centr
221
- `+(pu.min.x.toFixed(2)+"-"+pu.max.x.toFixed(2)+"x"+pu.min.y.toFixed(2)+"-"+pu.max.y.toFixed(2))+" scr"),n.lastScreenCoverage>.1){const y=e,_=y.worldForward,w=y.worldPosition,P=D(_).multiplyScalar(c*.7).add(l),M=P.distanceTo(w),O=h[Math.min(h.length-1,Math.max(0,s))]+"88",j=this.context.domHeight>0?screen.height/this.context.domHeight:1,I=e.isPerspectiveCamera?Math.tan(e.fov*Math.PI/180/2):1;B.DrawLabel(P,g,M*.012*j*I,void 0,16777215,O)}}}}}const cM=v("debugplayerview");var ws=(o=>(o.Browser="browser",o.Headset="headset",o.Handheld="handheld",o))(ws||{});class Zv{userId;context;viewDevice="browser";get currentObject(){return this._object}set currentObject(e){this._object=e}get isConnected(){return this.context.connection.userIsInRoom(this.userId)}removed=!1;_object;constructor(e,t){this.userId=e,this.context=t}}class Kv{context;playerViews=new Map;constructor(e){this.context=e}setPlayerView(e,t,i){let n=this.playerViews.get(e);n||(n=new Zv(e,this.context),this.playerViews.set(e,n)),n.viewDevice=i,n.currentObject=t,n.removed=!1}getPlayerView(e){if(!!e){if(!this.context.connection.userIsInRoom(e)){this.playerViews.delete(e);return}return this.playerViews.get(e)}}removePlayerView(e,t){const i=this.playerViews.get(e);i?.viewDevice===t&&(cM&&console.log("REMOVE",e),i.removed=!0,this.playerViews.delete(e))}}new fm;const Rc=new Uint8Array(4);Rc[0]=255,Rc[1]=255,Rc[2]=255,Rc[3]=255;const hM=new ym(Rc,1,1,vd);function ef(o,e=1){const t="alpha"in o,i=e*e,n=new Uint8Array(4*i),s=Math.floor(o.r*255),r=Math.floor(o.g*255),a=Math.floor(o.b*255);for(let c=0;c<i;c++){const h=c*4;n[h+0]=s,n[h+1]=r,n[h+2]=a,t?n[h+3]=Math.floor(o.alpha*255):n[h+3]=255}const l=new ym(n,e,e);return l.needsUpdate=!0,l}function dM(o,e,t,i=1,n=3){const s=i*n,r=[o,e,t],a=r.length,l=new Uint8Array(4*a*s),c=new ne;for(let d=0;d<n;d++){const p=Math.floor(d/n*a),m=L.clamp(p+1,0,a-1),f=r[p],g=r[m],y=d/n*a%1;c.lerpColors(f,g,y);const _=Math.floor(c.r*255),w=Math.floor(c.g*255),P=Math.floor(c.b*255);for(let M=0;M<i;M++){const O=(d*i+M)*4;l[O+0]=_,l[O+1]=w,l[O+2]=P,l[O+3]=255}}const h=new ym(l,i,n);return h.needsUpdate=!0,h}function gu(o,e){const t=o.elements;e||(e=[]),e.length=0;for(let i=0;i<16;i+=4){const n=t[i],s=t[i+1],r=t[i+2],a=t[i+3],l=new pe(n,s,r,a);e.push(l)}return e}const tf=[],Jv=[];function uM(o,e){if(tf.length===0)for(let t=0;t<27;t++)tf.push(0);e||(e=tf);for(let t=0;t<27;t++)Jv[t]=e[t];e=Jv,o.unity_SHAr={value:new pe(e[9],e[3],e[6],e[0])},o.unity_SHBr={value:new pe(e[12],e[15],e[18],e[21])},o.unity_SHAg={value:new pe(e[10],e[4],e[7],e[1])},o.unity_SHBg={value:new pe(e[13],e[16],e[19],e[22])},o.unity_SHAb={value:new pe(e[11],e[5],e[8],e[2])},o.unity_SHBb={value:new pe(e[14],e[17],e[20],e[23])},o.unity_SHC={value:new pe(e[24],e[25],e[26],1)}}class pM{vertexShader;fragmentShader;technique;constructor(e,t,i){this.vertexShader=e,this.fragmentShader=t,this.technique=i}}async function mM(o,e){if(!o)return console.error("Can not find technique: no shader data"),null;const t=o.programs[e],i=t.vertexShader,n=t.fragmentShader;if(i!==void 0&&n!==void 0){const s=o.shaders[i],r=o.shaders[n];if(s.uri&&r.uri||s.code&&r.code){if(!s.code&&s.uri&&await ew(s),!r.code&&r.uri&&await ew(r),!s.code||!r.code)return null;const a=o.techniques[e];return new pM(s.code,r.code,a)}}return console.error("Shader technique not found",e),null}async function ew(o){const e=o.uri;if(e)if(e.endsWith(".glsl")){const t=await new fm().loadAsync(e);o.code=t.toString()}else o.code=gM(o.uri)}function gM(o){return decodeURIComponent(Array.prototype.map.call(atob(o),function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""))}const Cn=v("debugenvlight");var Ya=(o=>(o[o.Skybox=0]="Skybox",o[o.Trilight=1]="Trilight",o[o.Flat=3]="Flat",o[o.Custom=4]="Custom",o))(Ya||{}),fu=(o=>(o[o.Skybox=0]="Skybox",o[o.Custom=1]="Custom",o))(fu||{});class tw{context;constructor(e){this.context=e,this.context.pre_update_callbacks.push(this.preUpdate.bind(this))}_currentLightSettingsId;_sceneLightSettings;get currentLightSettingsId(){return this._currentLightSettingsId}preUpdate(){const e=this.context.time;this._timevec4.x=e.time,this._timevec4.y=Math.sin(e.time),this._timevec4.z=Math.cos(e.time),this._timevec4.w=e.deltaTime}_timevec4=new pe;get timeVec4(){return this._timevec4}get environmentIntensity(){if(!this._sceneLightSettings||!this._currentLightSettingsId)return 1;const e=this._sceneLightSettings.get(this._currentLightSettingsId);return e?e.ambientIntensity:1}get sceneLightSettings(){return this._sceneLightSettings?.values()}enable(e){e instanceof ie&&(e=e.url);const t=this._sceneLightSettings?.get(e);return t?(Cn&&console.log("Enable scene light settings",e,t),e!==this._currentLightSettingsId&&this._currentLightSettingsId&&this.disable(this._currentLightSettingsId),this._currentLightSettingsId=e,t.enabled=!0,!0):(Cn&&console.warn("No light settings found for",e),!1)}disable(e){if(e instanceof ie&&(e=e.url),e==null)return!1;const t=this._sceneLightSettings?.get(e);return t?(Cn&&console.log("Disable scene light settings",e,t),t.enabled=!1,!0):!1}enableCurrent(){return this._currentLightSettingsId?(this.enable(this._currentLightSettingsId),this._currentLightSettingsId??null):null}disableCurrent(){if(this._currentLightSettingsId){const e=this._currentLightSettingsId;return this.disable(this._currentLightSettingsId),e}return null}internalRegisterSceneLightSettings(e){const t=e.sourceId;if(!t){console.error("Missing source id for scene light settings, can not register:",e);return}Cn&&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}Cn&&console.log("Unregister "+e?.sourceId+" lighting",e),this._sceneLightSettings&&this._sceneLightSettings.delete(t)}internalRegisterReflection(e,t){Cn&&console.log("Register reflection",e,t);const i=new iw(this.context,t,1);this._lighting[e]=i}internalGetReflection(e){return this._lighting[e]}__currentReflectionId=null;internalEnableReflection(e){this.__currentReflectionId=e;const t=this._sceneLightSettings?.get(e);switch(Cn&&console.log("Enable reflection",e,t?Ya[t.ambientMode]:"Unknown ambient mode",t),t?.ambientMode){case 0:case 4:const i=this.internalGetReflection(e);if(i&&i.Source){Cn&&console.log("Setting environment reflection",i);const n=this.context.scene,s=i.Source;return s.mapping=Nn,n.environment=s,n.environmentIntensity=this.environmentIntensity||1,s}else Cn&&console.warn("Could not find reflection for source",e);break}if(t?.environmentReflectionSource===1)switch(t?.ambientMode){case 1:if(t.ambientTrilight){const i=t.ambientTrilight,n=dM(i[0],i[1],i[2],64,64);return n.colorSpace=Co,n.mapping=Nn,this.context.scene.environment=n,n}else console.error("Missing ambient trilight",t.sourceId);case 3:if(t.ambientLight){const i=ef(t.ambientLight,64);return i.colorSpace=Co,i.mapping=Nn,this.context.scene.environment=i,i}else console.error("Missing ambientlight",t.sourceId)}return null}internalDisableReflection(e){if(e&&e!==this.__currentReflectionId){Cn&&console.log("Not disabling reflection for",e,"because it is not the current light settings id",this.__currentReflectionId);return}Cn&&console.log("Disable reflection",e);const t=this.context.scene;t.environment=null}_lighting={}}class iw{get Source(){return this._source}_source;constructor(e,t,i=1){this._source=t,t.mapping=Nn}}const nw=v("timescale");let nf=1;typeof nw=="number"&&(nf=nw);class ow{get time(){return this._time}set time(e){this._time=e}_time=0;get deltaTime(){return this._deltaTime}set deltaTime(e){this._deltaTime=e}_deltaTime=0;get deltaTimeUnscaled(){return this._deltaTimeUnscaled}_deltaTimeUnscaled=0;timeScale=1;get frame(){return this._frame}set frame(e){this._frame=e}_frame=0;get frameCount(){return this.frame}get realtimeSinceStartup(){return this.clock.elapsedTime}get fps(){return 1/this.deltaTime}get smoothedFps(){return this._smoothedFps}get smoothedDeltaTime(){return 1/this._smoothedFps}clock=new DS;_smoothedFps=0;_smoothedDeltaTime=0;_fpsSamples=[];_fpsSampleIndex=0;constructor(){typeof nf=="number"&&(this.timeScale=nf)}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 sw=!1;function rw(o){sw||(sw=!0,fM(),yM())}rw();function fM(){const o=`
222
- float startCompression = 0.8;
223
- float desaturation = 0.5;
224
- // Patched tonemapping function
225
- vec3 NeutralToneMapping( vec3 color ) {
226
- color *= toneMappingExposure;
227
-
228
- float d = 1. - startCompression;
229
- // float peak = dot(color, vec3(0.299, 0.587, 0.114));
230
- float peak = max(color.r, max(color.g, color.b));
231
- if (peak < startCompression) return color;
232
- float newPeak = 1. - d * d / (peak + d - startCompression);
233
- float invPeak = 1. / peak;
234
-
235
- float extraBrightness = dot(color * (1. - startCompression * invPeak), vec3(1, 1, 1));
236
-
237
- color *= newPeak * invPeak;
238
- float g = 1. - 3. / (desaturation * extraBrightness + 3.);
239
- return mix(color, vec3(1, 1, 1), g);
240
- }
241
- `,e="vec3 NeutralToneMapping( vec3 color ) {",t=`return mix( color, vec3( newPeak ), g );
242
- }`,i=qt.tonemapping_pars_fragment.indexOf(e),n=qt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=qt.tonemapping_pars_fragment.substring(i,n+t.length);qt.tonemapping_pars_fragment=qt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find NeutralToneMapping in ShaderChunk.tonemapping_pars_fragment")}function yM(){const o=`
243
- // 0: Default, 1: Golden, 2: Punchy
244
- #define AGX_LOOK 0
245
-
246
- vec3 userSlope = vec3(1.0);
247
- vec3 userOffset = vec3(0.0);
248
- vec3 userPower = vec3(1.0);
249
- float userSaturation = 1.0;
250
-
251
- // Mean error^2: 3.6705141e-06
252
- vec3 _agxDefaultContrastApprox(vec3 x) {
253
- vec3 x2 = x * x;
254
- vec3 x4 = x2 * x2;
255
-
256
- return + 15.5 * x4 * x2
257
- - 40.14 * x4 * x
258
- + 31.96 * x4
259
- - 6.868 * x2 * x
260
- + 0.4298 * x2
261
- + 0.1191 * x
262
- - 0.00232;
263
- }
264
-
265
- vec3 _agx(vec3 val) {
266
- const mat3 agx_mat = mat3(
267
- 0.842479062253094, 0.0423282422610123, 0.0423756549057051,
268
- 0.0784335999999992, 0.878468636469772, 0.0784336,
269
- 0.0792237451477643, 0.0791661274605434, 0.879142973793104);
270
-
271
- const float min_ev = -12.47393;
272
- const float max_ev = 4.026069;
273
-
274
- // val = pow(val, vec3(2.2));
275
-
276
- // Input transform (inset)
277
- val = agx_mat * val;
278
-
279
- // Log2 space encoding
280
- val = clamp(log2(val), min_ev, max_ev);
281
- val = (val - min_ev) / (max_ev - min_ev);
282
-
283
- // Apply sigmoid function approximation
284
- val = _agxDefaultContrastApprox(val);
285
-
286
- return val;
287
- }
288
-
289
- vec3 _agxEotf(vec3 val) {
290
- const mat3 agx_mat_inv = mat3(
291
- 1.19687900512017, -0.0528968517574562, -0.0529716355144438,
292
- -0.0980208811401368, 1.15190312990417, -0.0980434501171241,
293
- -0.0990297440797205, -0.0989611768448433, 1.15107367264116);
294
-
295
- // Inverse input transform (outset)
296
- val = agx_mat_inv * val;
297
-
298
- // sRGB IEC 61966-2-1 2.2 Exponent Reference EOTF Display
299
- // NOTE: We're linearizing the output here. Comment/adjust when
300
- // *not* using a sRGB render target
301
- val = pow(val, vec3(2.2));
302
-
303
- return val;
304
- }
305
-
306
- vec3 _agxLook(vec3 val) {
307
- const vec3 lw = vec3(0.2126, 0.7152, 0.0722);
308
- float luma = dot(val, lw);
309
-
310
- // Default
311
- vec3 offset = vec3(0.0);
312
- vec3 slope = vec3(1.0);
313
- vec3 power = vec3(1.0);
314
- float sat = 1.0;
315
-
316
- #if AGX_LOOK == 1
317
- // Golden
318
- slope = vec3(1.0, 0.9, 0.5);
319
- power = vec3(0.8);
320
- sat = 0.8;
321
- #elif AGX_LOOK == 2
322
- // Punchy
323
- slope = vec3(1.0);
324
- power = vec3(1.35, 1.35, 1.35);
325
- sat = 1.4;
326
- #endif
327
-
328
- // Needle
329
- slope = vec3(1.05);
330
- power = vec3(1.10, 1.10, 1.10);
331
- sat = 1.15;
332
-
333
- // User
334
- // slope = userSlope;
335
- // offset = userOffset;
336
- // power = userPower;
337
- // sat = userSaturation;
338
-
339
- // ASC CDL
340
- val = pow(val * slope + offset, power);
341
- return luma + sat * (val - luma);
342
- }
343
-
344
-
345
- vec3 AgXToneMapping( vec3 color ) {
346
- // apply AGX
347
- color *= toneMappingExposure;
348
- color = max(color, vec3(0.001)); // Prevent NaN
349
- color = _agx(color);
350
- color = _agxLook(color); // Optional
351
- color = _agxEotf(color);
352
- return color;
353
- `,e="vec3 AgXToneMapping( vec3 color ) {",t="return color;",i=qt.tonemapping_pars_fragment.indexOf(e),n=qt.tonemapping_pars_fragment.indexOf(t,i);if(i>=0&&n>=0){const s=qt.tonemapping_pars_fragment.substring(i,n+t.length);qt.tonemapping_pars_fragment=qt.tonemapping_pars_fragment.replace(s,o)}else A()&&console.error("Couldn't find AgXToneMapping in ShaderChunk.tonemapping_pars_fragment")}function aw(o){if(typeof o=="string")switch(o=o.toLowerCase(),o){case"none":return Sd;case"neutral":return Ma;case"aces":return xd;case"agx":return wd;case"khronos_neutral":return Ma;default:console.warn("[PostProcessing] Unknown tone mapping mode",o);return}}const bM='<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>',_M=btoa(bM),vM="data:image/svg+xml;base64,"+_M,yu=vM,wM=`<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'> <svg clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" version="1.1" viewBox="0 0 1014 282" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m665.95 132.73v44.88l-10.56-8.4c-0.8-0.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18 0.4-6.06 1.2s-3.54 1.8-4.98 3-2.56 2.5-3.36 3.9-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c0.32 0.24 0.56 0.44 0.72 0.6s0.36 0.32 0.6 0.48c0.96-1.2 2.14-2.28 3.54-3.24s2.92-1.76 4.56-2.4 3.34-1.14 5.1-1.5 3.44-0.54 5.04-0.54c1.44 0 2.92 0.04 4.44 0.12s2.84 0.28 3.96 0.6c4.56 1.12 7.8 3.12 9.72 6s2.88 6.56 2.88 11.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m732.38 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m795.93 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m858.57 97.21c0.64 0.48 0.96 1.16 0.96 2.04v74.88c-0.08 1.04-0.12 2.12-0.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18s-2.06-1.66-2.46-1.98c-1.76 2.48-4.26 4.44-7.5 5.88s-7.02 2.16-11.34 2.16c-3.84 0-7.4-0.7-10.68-2.1s-6.14-3.44-8.58-6.12-4.34-5.94-5.7-9.78-2.04-8.16-2.04-12.96c0-4.32 0.78-8.34 2.34-12.06s3.6-6.92 6.12-9.6 5.38-4.78 8.58-6.3 6.48-2.28 9.84-2.28c2.56 0 4.82 0.22 6.78 0.66s3.68 1.06 5.16 1.86 2.78 1.74 3.9 2.82 2.16 2.22 3.12 3.42v-35.04l10.68 8.64zm-27.96 67.92c3.6 0 6.52-0.68 8.76-2.04s3.98-3.06 5.22-5.1 2.1-4.22 2.58-6.54 0.72-4.44 0.72-6.36v-1.2c0-1.12-0.22-2.7-0.66-4.74s-1.28-4.06-2.52-6.06-3-3.7-5.28-5.1-5.22-2.02-8.82-1.86c-3.44 0-6.26 0.74-8.46 2.22s-3.96 3.26-5.28 5.34-2.24 4.2-2.76 6.36-0.78 3.92-0.78 5.28c0 1.84 0.24 3.92 0.72 6.24s1.36 4.48 2.64 6.48 3.04 3.68 5.28 5.04 5.12 2.04 8.64 2.04z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m882.81 97.09c0.64 0.48 0.96 1.12 0.96 1.92l-0.12 41.04v37.08l-10.56-8.4c-0.72-0.64-1.08-1.44-1.08-2.4v-77.88l10.8 8.64z" fill-rule="nonzero"/> </g> <g transform="matrix(1.008 0 0 1.008 -2.239 .61874)"> <path d="m950.36 146.05c0 0.88 0.02 1.5 0.06 1.86s-0.02 0.98-0.18 1.86h-7.08c-2.08 0-4.44-0.02-7.08-0.06s-5.36-0.06-8.16-0.06h-22.08c0 2.88 0.56 5.36 1.68 7.44s2.6 3.8 4.44 5.16 3.94 2.36 6.3 3 4.74 0.96 7.14 0.96c3.04 0 5.9-0.76 8.58-2.28s4.94-3.52 6.78-6c0.64 0.56 1.54 1.48 2.7 2.76s2.94 3.2 5.34 5.76c-2.8 3.36-6.22 6.02-10.26 7.98s-8.42 2.94-13.14 2.94-8.92-0.64-12.84-1.92-7.32-3.24-10.2-5.88-5.12-5.98-6.72-10.02-2.4-8.82-2.4-14.34c0-4.96 0.66-9.42 1.98-13.38s3.22-7.32 5.7-10.08 5.44-4.9 8.88-6.42 7.32-2.28 11.64-2.28c5.76 0 10.52 0.88 14.28 2.64s6.72 4.16 8.88 7.2 3.66 6.54 4.5 10.5 1.26 8.18 1.26 12.66zm-29.4-22.8c-2.16 0.16-4.16 0.72-6 1.68s-3.42 2.2-4.74 3.72-2.36 3.28-3.12 5.28-1.14 4.12-1.14 6.36h33.12c0-2-0.22-4.06-0.66-6.18s-1.3-4.02-2.58-5.7-3.1-3.02-5.46-4.02-5.5-1.38-9.42-1.14z" fill-rule="nonzero"/> </g> <g transform="matrix(1.8559 0 0 .7642 45.348 36.475)"> <g transform="translate(2.7114)"> <path d="m3.935 173.02c-0.331 0-0.497-0.402-0.497-1.207v-51.002c0-0.738 0.138-1.107 0.414-1.107h1.781c0.277 0 0.415 0.335 0.415 1.006v5.935c0 0.336 0.027 0.553 0.083 0.654 0.055 0.101 0.151-0.017 0.289-0.352 0.912-1.744 1.754-3.236 2.527-4.477 0.773-1.24 1.554-2.179 2.341-2.816s1.65-0.956 2.588-0.956c1.685 0 3.011 0.922 3.977 2.766 0.967 1.845 1.602 3.84 1.905 5.986 0.056 0.268 0.139 0.369 0.249 0.302s0.221-0.235 0.331-0.503c0.939-1.811 1.802-3.353 2.589-4.628 0.787-1.274 1.581-2.246 2.382-2.917s1.671-1.006 2.61-1.006c2.016 0 3.569 1.392 4.66 4.175 1.09 2.783 1.636 6.421 1.636 10.915v37.925c0 0.871-0.18 1.307-0.539 1.307h-1.739c-0.138 0-0.249-0.1-0.332-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.338-6.321-1.015-8.3-0.676-1.978-1.76-2.967-3.251-2.967-0.884 0-1.726 0.386-2.527 1.157s-1.519 1.727-2.154 2.867-1.201 2.213-1.699 3.219c-0.248 0.469-0.421 0.905-0.517 1.308-0.097 0.402-0.145 0.972-0.145 1.71v37.221c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.166 0-0.29-0.1-0.373-0.301-0.083-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.332-6.321-0.994-8.3-0.663-1.978-1.754-2.967-3.273-2.967-1.242 0-2.375 0.704-3.396 2.112-1.022 1.409-2.223 3.555-3.604 6.439v39.031c0 0.805-0.18 1.207-0.539 1.207h-1.698z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m53.642 166.28c-1.077 2.549-2.237 4.477-3.479 5.785-1.243 1.307-2.61 1.961-4.101 1.961-2.154 0-3.853-1.324-5.095-3.973-1.243-2.649-1.864-6.187-1.864-10.613 0-3.488 0.4-6.489 1.201-9.004s1.988-4.51 3.562-5.985c1.574-1.476 3.521-2.414 5.841-2.817l3.686-0.704c0.221-0.067 0.394-0.218 0.518-0.453 0.124-0.234 0.187-0.587 0.187-1.056v-2.917c0-3.89-0.504-6.975-1.512-9.255s-2.354-3.42-4.039-3.42c-1.298 0-2.472 0.72-3.521 2.162s-2.002 3.572-2.858 6.388c-0.083 0.268-0.159 0.453-0.228 0.554-0.069 0.1-0.172 0.083-0.311-0.051l-1.698-1.71c-0.083-0.134-0.138-0.285-0.166-0.453-0.027-0.167 0.014-0.452 0.125-0.855 0.856-3.353 2.009-6.052 3.459-8.098 1.449-2.045 3.224-3.068 5.322-3.068 1.74 0 3.211 0.687 4.412 2.062s2.112 3.37 2.734 5.986c0.621 2.615 0.932 5.7 0.932 9.255v35.712c0 0.536-0.035 0.888-0.104 1.056s-0.2 0.251-0.393 0.251h-1.533c-0.166 0-0.29-0.117-0.373-0.352-0.083-0.234-0.124-0.553-0.124-0.955l-0.083-5.231c-0.055-0.939-0.221-1.006-0.497-0.202zm0.456-19.314c0-1.14-0.194-1.643-0.58-1.509l-3.107 0.603c-1.436 0.202-2.686 0.638-3.749 1.308-1.063 0.671-1.953 1.543-2.671 2.616s-1.257 2.33-1.616 3.772-0.538 3.102-0.538 4.98c0 3.152 0.455 5.616 1.367 7.393 0.911 1.778 2.14 2.666 3.686 2.666 0.939 0 1.85-0.419 2.734-1.257s1.671-1.895 2.361-3.169c0.663-1.408 1.181-2.85 1.553-4.326 0.373-1.475 0.56-2.883 0.56-4.225v-8.852z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m79.034 173.02c-0.166 0-0.297-0.117-0.394-0.352-0.096-0.234-0.145-0.553-0.145-0.955v-4.628c0-0.536-0.041-0.838-0.124-0.905s-0.207 0.1-0.373 0.503c-0.276 0.67-0.69 1.593-1.242 2.766-0.553 1.174-1.271 2.23-2.154 3.169-0.884 0.939-1.961 1.408-3.231 1.408-1.74 0-3.314-0.989-4.722-2.967-1.409-1.979-2.534-4.963-3.376-8.953-0.843-3.991-1.264-8.937-1.264-14.838 0-5.701 0.415-10.68 1.243-14.939s1.988-7.595 3.479-10.009c1.492-2.415 3.204-3.622 5.137-3.622 1.436 0 2.616 0.57 3.541 1.71 0.926 1.14 1.719 2.381 2.382 3.722 0.249 0.47 0.414 0.637 0.497 0.503s0.125-0.536 0.125-1.207v-23.841c0-0.805 0.151-1.208 0.455-1.208h1.864c0.276 0 0.414 0.369 0.414 1.107v72.128c0 0.537-0.041 0.905-0.124 1.107-0.083 0.201-0.235 0.301-0.455 0.301h-1.533zm-0.621-42.049c-0.939-2.213-1.885-3.94-2.838-5.181s-2.009-1.861-3.169-1.861c-1.463 0-2.768 0.889-3.914 2.666s-2.044 4.376-2.693 7.796-0.973 7.578-0.973 12.474c0 5.097 0.338 9.272 1.015 12.524 0.676 3.253 1.567 5.651 2.672 7.193 1.104 1.543 2.305 2.314 3.603 2.314 1.188 0 2.258-0.704 3.211-2.113 0.952-1.408 1.705-3.118 2.257-5.13s0.829-3.957 0.829-5.835v-24.847z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m89.514 149.38c0 3.42 0.345 6.606 1.035 9.557 0.691 2.951 1.609 5.315 2.755 7.092s2.437 2.666 3.873 2.666c1.519 0 2.837-0.738 3.956-2.213 1.118-1.476 2.064-3.655 2.837-6.539 0.083-0.336 0.166-0.52 0.249-0.554 0.083-0.033 0.179 0.017 0.29 0.151l1.408 1.912c0.221 0.268 0.235 0.67 0.041 1.207-0.69 2.548-1.47 4.661-2.34 6.337-0.87 1.677-1.857 2.935-2.962 3.773-1.104 0.838-2.319 1.257-3.645 1.257-2.043 0-3.838-1.14-5.385-3.42-1.546-2.28-2.761-5.482-3.645-9.607-0.884-4.124-1.325-8.836-1.325-14.134 0-5.901 0.455-10.931 1.367-15.089 0.911-4.158 2.14-7.377 3.686-9.658 1.547-2.28 3.3-3.42 5.261-3.42 1.988 0 3.714 1.073 5.178 3.219 1.463 2.146 2.595 5.231 3.396 9.255s1.201 8.886 1.201 14.587c0 0.469-0.02 0.939-0.062 1.408-0.041 0.469-0.214 0.704-0.517 0.704h-16.362c-0.083 0-0.152 0.151-0.207 0.453-0.056 0.302-0.083 0.654-0.083 1.056zm13.752-6.237c0.304 0 0.497-0.1 0.58-0.302 0.083-0.201 0.124-0.57 0.124-1.106 0-3.219-0.283-6.187-0.849-8.903s-1.367-4.896-2.402-6.539c-1.036-1.643-2.272-2.464-3.708-2.464-1.629 0-2.996 0.955-4.101 2.867-1.104 1.911-1.94 4.342-2.506 7.293s-0.849 6.002-0.849 9.154h13.711z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m148.54 119.7c0.165 0 0.283 0.117 0.352 0.352s0.076 0.52 0.02 0.855l-6.254 50.902c-0.028 0.47-0.104 0.788-0.228 0.956s-0.297 0.251-0.518 0.251h-1.615c-0.442 0-0.718-0.402-0.829-1.207l-5.26-40.138c-0.111-0.604-0.201-0.905-0.27-0.905s-0.131 0.301-0.186 0.905l-5.012 40.138c-0.028 0.47-0.097 0.788-0.207 0.956-0.111 0.168-0.277 0.251-0.497 0.251h-1.74c-0.442 0-0.718-0.402-0.829-1.207l-6.503-50.801c-0.055-0.403-0.048-0.721 0.021-0.956s0.2-0.352 0.393-0.352h1.823c0.166 0 0.297 0.067 0.393 0.201 0.097 0.134 0.159 0.403 0.187 0.805l5.302 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.219-41.949c0.055-0.268 0.124-0.47 0.207-0.604s0.193-0.201 0.331-0.201h1.533c0.138 0 0.262 0.067 0.373 0.201 0.11 0.134 0.179 0.403 0.207 0.805l5.468 41.848c0.083 0.671 0.179 0.989 0.29 0.956 0.11-0.034 0.207-0.386 0.29-1.056l5.053-41.849c0.055-0.335 0.138-0.57 0.249-0.704 0.11-0.134 0.234-0.201 0.373-0.201h1.284z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m156.49 171.51c0 0.604-0.042 1.006-0.125 1.208-0.082 0.201-0.262 0.301-0.538 0.301h-1.533c-0.221 0-0.366-0.083-0.435-0.251s-0.103-0.486-0.103-0.956v-50.902c0-0.805 0.152-1.207 0.456-1.207h1.822c0.304 0 0.456 0.402 0.456 1.207v50.6zm0.165-63.979c0 1.207-0.207 1.811-0.621 1.811h-1.905c-0.221 0-0.366-0.135-0.435-0.403s-0.104-0.67-0.104-1.207v-7.847c0-1.006 0.18-1.509 0.539-1.509h1.988c0.359 0 0.538 0.47 0.538 1.409v7.746z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m168.3 124.83c-0.221 0-0.331 0.269-0.331 0.805v33.801c0 3.42 0.221 5.667 0.663 6.74 0.441 1.073 1.09 1.609 1.946 1.609h3.024c0.138 0 0.242 0.084 0.311 0.252 0.069 0.167 0.103 0.419 0.103 0.754v2.716c0 0.537-0.138 0.906-0.414 1.107-0.248 0.067-0.614 0.134-1.098 0.201-0.483 0.067-0.959 0.118-1.429 0.151-0.469 0.034-0.828 0.05-1.077 0.05-1.712 0-2.934-0.955-3.665-2.867-0.732-1.911-1.098-5.013-1.098-9.305v-35.108c0-0.604-0.124-0.906-0.373-0.906h-3.521c-0.248 0-0.373-0.268-0.373-0.804v-3.521c0-0.537 0.111-0.805 0.332-0.805h3.686c0.166 0 0.263-0.268 0.29-0.805l0.415-16.095c0-0.805 0.124-1.207 0.372-1.207h1.492c0.303 0 0.455 0.436 0.455 1.307v15.995c0 0.537 0.097 0.805 0.29 0.805h5.468c0.221 0 0.331 0.268 0.331 0.805v3.521c0 0.536-0.124 0.804-0.373 0.804h-5.426z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> <g transform="translate(2.7114)"> <path d="m179.4 173.02c-0.331 0-0.497-0.402-0.497-1.207v-72.329c0-0.738 0.138-1.107 0.414-1.107h1.782c0.276 0 0.414 0.336 0.414 1.006v27.162c0 0.335 0.034 0.536 0.103 0.603s0.159-0.033 0.27-0.302c0.994-1.81 1.898-3.319 2.713-4.526 0.814-1.208 1.629-2.113 2.444-2.717 0.814-0.603 1.691-0.905 2.63-0.905 2.182 0 3.839 1.375 4.971 4.125 1.132 2.749 1.698 6.404 1.698 10.965v37.925c0 0.871-0.166 1.307-0.497 1.307h-1.74c-0.165 0-0.29-0.1-0.373-0.301-0.082-0.202-0.124-0.503-0.124-0.906v-36.315c0-3.555-0.366-6.321-1.097-8.3-0.732-1.978-1.899-2.967-3.501-2.967-0.883 0-1.705 0.318-2.464 0.956-0.76 0.637-1.526 1.576-2.299 2.816-0.773 1.241-1.643 2.834-2.61 4.779v39.031c0 0.805-0.179 1.207-0.538 1.207h-1.699z" fill-rule="nonzero" stroke="#000" stroke-width=".7px"/> </g> </g> <g transform="matrix(.80638 0 0 .80638 452.53 65.421)" fill-rule="nonzero"> <path d="m79.32 36.98v150.76l15.68-13.2 6.59-156.31-22.27 18.75z" fill="url(#f)"/> <path d="m79.32 36.98-22.27-18.75 6.59 156.31 15.68 13.2v-150.76z" fill="url(#e)"/> <path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33z" fill="url(#d)"/> <path d="m25.19 104.83-25.19-14.59 16.97 53.86 16.85 9.77-8.63-49.04z" fill="url(#c)"/> <path d="M43.86,82.5L18.69,67.98L0,90.24L25.18,104.83L43.86,82.5Z" fill="#9c3"/> <path d="m134.82 78.69-9.97 56.5 15.58-9.04 19.57-62.05-25.18 14.59z" fill="url(#b)"/> <path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5z" fill="url(#a)"/> <path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33 25.19-14.59z" fill="#ffe113"/> <path d="M101.59,18.23L79.32,0L57.05,18.23L79.32,36.98L101.59,18.23Z" fill="#f3e600"/> </g> <defs> <linearGradient id="f" x2="1" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)" gradientUnits="userSpaceOnUse"><stop stop-color="#62d399" offset="0"/><stop stop-color="#acd842" offset=".51"/><stop stop-color="#d7db0a" offset=".9"/><stop stop-color="#d7db0a" offset="1"/></linearGradient> <linearGradient id="e" x2="1" gradientTransform="matrix(-1.6,-162.13,162.13,-1.6,69.68,178.9)" gradientUnits="userSpaceOnUse"><stop stop-color="#0ba398" offset="0"/><stop stop-color="#4ca352" offset=".5"/><stop stop-color="#76a30a" offset="1"/></linearGradient> <linearGradient id="d" x2="1" gradientTransform="matrix(-1.9,-67.98,67.98,-1.9,36.6,152.17)" gradientUnits="userSpaceOnUse"><stop stop-color="#36a382" offset="0"/><stop stop-color="#36a382" offset=".19"/><stop stop-color="#49a459" offset=".54"/><stop stop-color="#76a30b" offset="1"/></linearGradient> <linearGradient id="c" x2="1" gradientTransform="matrix(2.18,-62.38,62.38,2.18,15.82,153.24)" gradientUnits="userSpaceOnUse"><stop stop-color="#267880" offset="0"/><stop stop-color="#457a5c" offset=".51"/><stop stop-color="#717516" offset="1"/></linearGradient> <linearGradient id="b" x2="1" gradientTransform="matrix(13.85,-71.96,71.96,13.85,135.08,135.43)" gradientUnits="userSpaceOnUse"><stop stop-color="#b0d939" offset="0"/><stop stop-color="#eadb04" offset="1"/></linearGradient> <linearGradient id="a" x2="1" gradientTransform="matrix(26.159 -64.737 64.737 26.159 107.42 128.14)" gradientUnits="userSpaceOnUse"><stop stop-color="#74af52" offset="0"/><stop stop-color="#74af52" offset=".17"/><stop stop-color="#99be32" offset=".48"/><stop stop-color="#c0c40a" offset="1"/></linearGradient> </defs> </svg>`;btoa(wM);const xM='<svg viewBox="0 0 509 154" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M665.95 132.73v44.88l-10.56-8.4c-.8-.64-1.2-1.44-1.2-2.4v-32.4c0-6.48-4.12-9.72-12.36-9.72-2.16 0-4.18.4-6.06 1.2-1.88.8-3.54 1.8-4.98 3-1.44 1.2-2.56 2.5-3.36 3.9-.8 1.4-1.2 2.7-1.2 3.9v40.92l-10.68-8.4c-.72-.64-1.08-1.44-1.08-2.4v-53.76l10.92 8.52c.32.24.56.44.72.6.16.16.36.32.6.48.96-1.2 2.14-2.28 3.54-3.24 1.4-.96 2.92-1.76 4.56-2.4 1.64-.64 3.34-1.14 5.1-1.5 1.76-.36 3.44-.54 5.04-.54 1.44 0 2.92.04 4.44.12 1.52.08 2.84.28 3.96.6 4.56 1.12 7.8 3.12 9.72 6 1.92 2.88 2.88 6.56 2.88 11.04ZM732.38 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM795.93 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14ZM858.57 97.21c.64.48.96 1.16.96 2.04v74.88c-.08 1.04-.12 2.12-.12 3.24-1.84-1.52-3.56-2.92-5.16-4.2-1.36-1.12-2.66-2.18-3.9-3.18-1.24-1-2.06-1.66-2.46-1.98-1.76 2.48-4.26 4.44-7.5 5.88-3.24 1.44-7.02 2.16-11.34 2.16-3.84 0-7.4-.7-10.68-2.1-3.28-1.4-6.14-3.44-8.58-6.12-2.44-2.68-4.34-5.94-5.7-9.78-1.36-3.84-2.04-8.16-2.04-12.96 0-4.32.78-8.34 2.34-12.06 1.56-3.72 3.6-6.92 6.12-9.6 2.52-2.68 5.38-4.78 8.58-6.3 3.2-1.52 6.48-2.28 9.84-2.28 2.56 0 4.82.22 6.78.66 1.96.44 3.68 1.06 5.16 1.86s2.78 1.74 3.9 2.82a35.92 35.92 0 0 1 3.12 3.42V88.57l10.68 8.64Zm-27.96 67.92c3.6 0 6.52-.68 8.76-2.04 2.24-1.36 3.98-3.06 5.22-5.1a20.5 20.5 0 0 0 2.58-6.54c.48-2.32.72-4.44.72-6.36v-1.2c0-1.12-.22-2.7-.66-4.74-.44-2.04-1.28-4.06-2.52-6.06s-3-3.7-5.28-5.1c-2.28-1.4-5.22-2.02-8.82-1.86-3.44 0-6.26.74-8.46 2.22-2.2 1.48-3.96 3.26-5.28 5.34-1.32 2.08-2.24 4.2-2.76 6.36-.52 2.16-.78 3.92-.78 5.28 0 1.84.24 3.92.72 6.24.48 2.32 1.36 4.48 2.64 6.48s3.04 3.68 5.28 5.04c2.24 1.36 5.12 2.04 8.64 2.04ZM882.81 97.09c.64.48.96 1.12.96 1.92l-.12 41.04v37.08l-10.56-8.4c-.72-.64-1.08-1.44-1.08-2.4V88.45l10.8 8.64ZM950.36 146.05c0 .88.02 1.5.06 1.86.04.36-.02.98-.18 1.86h-7.08c-2.08 0-4.44-.02-7.08-.06-2.64-.04-5.36-.06-8.16-.06h-22.08c0 2.88.56 5.36 1.68 7.44 1.12 2.08 2.6 3.8 4.44 5.16 1.84 1.36 3.94 2.36 6.3 3 2.36.64 4.74.96 7.14.96 3.04 0 5.9-.76 8.58-2.28 2.68-1.52 4.94-3.52 6.78-6 .64.56 1.54 1.48 2.7 2.76 1.16 1.28 2.94 3.2 5.34 5.76-2.8 3.36-6.22 6.02-10.26 7.98-4.04 1.96-8.42 2.94-13.14 2.94-4.72 0-8.92-.64-12.84-1.92-3.92-1.28-7.32-3.24-10.2-5.88-2.88-2.64-5.12-5.98-6.72-10.02-1.6-4.04-2.4-8.82-2.4-14.34 0-4.96.66-9.42 1.98-13.38 1.32-3.96 3.22-7.32 5.7-10.08s5.44-4.9 8.88-6.42c3.44-1.52 7.32-2.28 11.64-2.28 5.76 0 10.52.88 14.28 2.64 3.76 1.76 6.72 4.16 8.88 7.2 2.16 3.04 3.66 6.54 4.5 10.5.84 3.96 1.26 8.18 1.26 12.66Zm-29.4-22.8c-2.16.16-4.16.72-6 1.68-1.84.96-3.42 2.2-4.74 3.72-1.32 1.52-2.36 3.28-3.12 5.28-.76 2-1.14 4.12-1.14 6.36h33.12c0-2-.22-4.06-.66-6.18-.44-2.12-1.3-4.02-2.58-5.7-1.28-1.68-3.1-3.02-5.46-4.02-2.36-1-5.5-1.38-9.42-1.14Z" style="fill-rule:nonzero" transform="translate(-452.406 -63.709) scale(1.00797)"/><path d="M79.32 36.98v150.76L95 174.54l6.59-156.31-22.27 18.75Z" style="fill:url(#a);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M79.32 36.98 57.05 18.23l6.59 156.31 15.68 13.2V36.98Z" style="fill:url(#b);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m25.19 104.83 8.63 49.04 12.5-14.95-2.46-56.42-18.67 22.33Z" style="fill:url(#c);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M25.19 104.83 0 90.24l16.97 53.86 16.85 9.77-8.63-49.04Z" style="fill:url(#d);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M43.86 82.5 18.69 67.98 0 90.24l25.18 14.59L43.86 82.5Z" style="fill:#9c3;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-9.97 56.5 15.58-9.04L160 64.1l-25.18 14.59Z" style="fill:url(#e);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m134.82 78.69-18.68-22.33-2.86 65 11.57 13.83 9.97-56.5Z" style="fill:url(#f);fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="m160 64.1-18.69-22.26-25.17 14.52 18.67 22.33L160 64.1Z" style="fill:#ffe113;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><path d="M101.59 18.23 79.32 0 57.05 18.23l22.27 18.75 22.27-18.75Z" style="fill:#f3e600;fill-rule:nonzero" transform="matrix(.80638 0 0 .80638 2.361 1.094)"/><defs><linearGradient id="a" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.84 -162.96 162.96 .84 89.64 184.81)"><stop offset="0" style="stop-color:#62d399;stop-opacity:1"/><stop offset=".51" style="stop-color:#acd842;stop-opacity:1"/><stop offset=".9" style="stop-color:#d7db0a;stop-opacity:1"/><stop offset="1" style="stop-color:#d7db0a;stop-opacity:1"/></linearGradient><linearGradient id="b" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-90.565 123.412 54.953) scale(162.14)"><stop offset="0" style="stop-color:#0ba398;stop-opacity:1"/><stop offset=".5" style="stop-color:#4ca352;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30a;stop-opacity:1"/></linearGradient><linearGradient id="c" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="scale(-68) rotate(88.4 .881 -1.396)"><stop offset="0" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".19" style="stop-color:#36a382;stop-opacity:1"/><stop offset=".54" style="stop-color:#49a459;stop-opacity:1"/><stop offset="1" style="stop-color:#76a30b;stop-opacity:1"/></linearGradient><linearGradient id="d" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-88 87.255 68.431) scale(62.42)"><stop offset="0" style="stop-color:#267880;stop-opacity:1"/><stop offset=".51" style="stop-color:#457a5c;stop-opacity:1"/><stop offset="1" style="stop-color:#717516;stop-opacity:1"/></linearGradient><linearGradient id="e" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-79.1 149.53 -14.065) scale(73.28)"><stop offset="0" style="stop-color:#b0d939;stop-opacity:1"/><stop offset="1" style="stop-color:#eadb04;stop-opacity:1"/></linearGradient><linearGradient id="f" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="rotate(-67.997 148.705 -15.558) scale(69.8226)"><stop offset="0" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".17" style="stop-color:#74af52;stop-opacity:1"/><stop offset=".48" style="stop-color:#99be32;stop-opacity:1"/><stop offset="1" style="stop-color:#c0c40a;stop-opacity:1"/></linearGradient></defs></svg>',SM=btoa(xM),CM="data:image/svg+xml;charset=utf-8;base64,"+SM,lw=CM;var Tc;(o=>{function e(n){return n==="0"||n?.toLowerCase()==="false"}o.isFalsey=e;function t(n,s,r){const a=n.getAttribute(s);return e(a)?null:(r?.onAttribute?.call(null,a),a)}o.getAttributeValueIfNotFalsey=t;function i(n,s,r){const a=n.getAttribute(s);return a===null?null:e(a)?(r?.onAttribute?.call(null,a,!0),!1):(r?.onAttribute?.call(null,a,!1),a)}o.getAttributeAndCheckFalsey=i})(Tc||(Tc={}));async function cw(o){if(!globalThis.QRCode){const l="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs@gh-pages/qrcode.min.js";let c=document.head.querySelector(`script[src="${l}"]`);c||(c=document.createElement("script"),c.src=l,document.head.appendChild(c)),await new Promise((h,d)=>{c.addEventListener("load",()=>{h(!0)})})}const e=globalThis.QRCode,t=o.domElement??document.createElement("div"),i=new e(t,{width:o.width??256,height:o.height??256,colorDark:"#000000",colorLight:"#ffffff",correctLevel:o.showLogo?e.CorrectionLevel.H:e.CorrectLevel.M,...o}),n=i?._oQRCode.moduleCount||0,s=i?._oDrawing?._elCanvas;let r=.25;n<40?r=Math.floor(n/4)/n:r=Math.floor(n/6)/n;const a=Math.floor(n/20)/n;try{const l=await PM(s,{showLogo:o.showLogo,logoSize:r,logoPadding:a}).catch(c=>{});l&&(t.innerHTML="",t.append(l))}catch{}if(o.showUrl!==!1&&o.text){const l=t.querySelector(".qr-code-link-label");let c=o.text.replace(/^(https?:\/\/)?(www\.)?/,"").replace(/\/+$/,"").replace(/\?+$/,"");if(c="Scan to visit "+c,l)l.textContent=c;else{const h=document.createElement("div");h.classList.add("qr-code-link-label"),o.text=c,h.textContent=o.text,h.addEventListener("click",d=>{d.stopImmediatePropagation()}),h.style.textAlign="center",h.style.fontSize="0.8em",h.style.marginTop="0.1em",h.style.color="#000000",h.style.fontFamily="'Roboto Flex', sans-serif",h.style.opacity="0.5",h.style.wordBreak="break-all",h.style.wordWrap="break-word",h.style.marginBottom="0.3em",t.style.width="calc(210px + 20px)",t.appendChild(h)}}return t}async function PM(o,e){if(!o)return;const t=8,i=20,n=e.logoPadding||1/32,s="transparent",r=0,a=new Image,l=document.querySelector("needle-engine");l||console.debug("[QR Code] No web component found");const c=Io();let h=null;if(h=Tc.getAttributeAndCheckFalsey(l,"qrcode-logo-src"),c&&e.showLogo!==!0&&h===!1||(h||=Tc.getAttributeAndCheckFalsey(l,"logo-src"),c&&e.showLogo!==!0&&h===!1)||(h||=Tc.getAttributeAndCheckFalsey(l,"loading-logo-src",{onAttribute:()=>{A()?console.warn("[QR Code] 'loading-logo-src' is deprecated, please use 'logo-src' or 'qrcode-logo-src' instead."):console.debug("[QR Code] 'loading-logo-src' is deprecated.")}}),c&&e.showLogo!==!0&&h===!1)||(h&&!c&&(console.warn("[QR Code] Custom logo is only available with a commercial license. Using default Needle logo. Please get a commercial license at https://needle.tools/pricing."),h=null),h||=yu,!h))return;let d=!1;e.showLogo!==!1&&(a.src=h,d=await new Promise((P,M)=>{a.onload=()=>P(!0),a.onerror=O=>{const j=h!==yu?"'"+h+"'":null;console.error("[QR Code] Error loading logo image for QR code",j,A()?O:""),P(!1)}}));const p=document.createElement("canvas");p.width=o.width+t,p.height=o.height+t;const m=p.getContext("2d");if(!m)return;m.fillStyle="#ffffff",m.fillRect(0,0,p.width,p.height),m.drawImage(o,t/2,t/2),m.imageSmoothingEnabled=!0,m.imageSmoothingQuality="high",m.mozImageSmoothingEnabled=!0,m.webkitImageSmoothingEnabled=!0,m.globalCompositeOperation="lighten";const f=m.createLinearGradient(0,0,0,p.height);f.addColorStop(0,"rgb(45, 45, 45)"),f.addColorStop(1,"rgb(45, 45, 45)"),m.fillStyle=f,m.fillRect(0,0,p.width,p.height),m.globalCompositeOperation="source-over";let g=Math.min(o.width,o.height)*(e.logoSize||.25),y=g;if(d){const P=a.width/a.height;P>1?y=g/P:g=y*P;const M=n*o.width,O=Math.max(g,y),j=Math.round(O+M),I=Math.round(O+M),N=(p.width-O)/2,V=(p.height-O)/2;m.shadowColor=s,m.shadowBlur=i;const H=r,X=Math.round(N-M/2),T=Math.round(V-M/2);m.beginPath(),m.moveTo(X+H,T),m.lineTo(X+j-H,T),m.quadraticCurveTo(X+j,T,X+j,T+H),m.lineTo(X+j,T+I-H),m.quadraticCurveTo(X+j,T+I,X+j-H,T+I),m.lineTo(X+H,T+I),m.quadraticCurveTo(X,T+I,X,T+I-H),m.lineTo(X,T+H),m.quadraticCurveTo(X,T,X+H,T),m.fillStyle="#ffffff",m.closePath(),m.fill(),m.clip(),m.shadowColor="transparent";const $=(p.width-g)/2,W=(p.height-y)/2;m.drawImage(a,$,W,g,y)}const _=p.toDataURL("image/png"),w=document.createElement("img");return w.src=_,w.style.width="100%",w.style.height="auto",w}function Pt(o){const e=document.createElement("span");return e.style.maxWidth="48px",e.style.maxHeight="48px",e.style.overflow="hidden",e.classList.add("material-symbols-outlined","notranslate"),e.setAttribute("translate","no"),e.innerText=o,e}function hw(o){return o.classList?.contains("material-symbols-outlined")||!1}const bu=new Map;async function of(o){const e="Material Symbols Outlined";if(document.fonts.check(`1em '${e}'`)||(console.log("Font not loaded yet"),await document.fonts.ready),bu.has(o))return bu.get(o);const t=document.createElement("canvas"),i=48;t.width=i,t.height=i;const n=t.getContext("2d");if(n){n.font=`${i}px '${e}'`,n.fillStyle="black",n.fillText(o,0,i);const s=t.toDataURL(),r=new Le;return r.name=o+" icon",r.image=new Image,r.image.src=s,r.needsUpdate=!0,bu.set(o,r),r}return bu.set(o,null),null}class Fn{static _instance;static get instance(){return this.getOrCreate()}static getOrCreate(){return this._instance||(this._instance=new Fn),this._instance}static create(){return new Fn}_fullscreenButton;get fullscreenButton(){return this._fullscreenButton}createFullscreenButton(e){if(this._fullscreenButton)return this._fullscreenButton;if(!document.fullscreenEnabled)return A()&&console.warn("NeedleMenu: Fullscreen button could not be created, device doesn't support the Fullscreen API"),null;const t=document.createElement("button");this._fullscreenButton=t,t.classList.add("fullscreen-button"),t.title="Click to enter fullscreen mode";const i=Pt("fullscreen"),n=Pt("fullscreen_exit");return t.appendChild(i),t.onclick=()=>{document.fullscreenElement?document.exitFullscreen():"webkitRequestFullscreen"in e.domElement&&typeof e.domElement.webkitRequestFullscreen=="function"?e.domElement.webkitRequestFullscreen():"requestFullscreen"in e.domElement&&e.domElement.requestFullscreen()},document.addEventListener("fullscreenchange",()=>{document.fullscreenElement?(i.remove(),t.appendChild(n),t.title="Click to enter fullscreen mode"):(n.remove(),t.appendChild(i),t.title="Click to exit fullscreen mode")}),globalThis.addEventListener("needle-xrsession-start",()=>{t.style.display="none"}),globalThis.addEventListener("needle-xrsession-end",()=>{t.style.display=""}),t}_muteButton;get muteButton(){return this._muteButton}createMuteButton(e){if(this._muteButton)return this._muteButton;const t=document.createElement("button");this._muteButton=t,t.classList.add("mute-button"),t.title="Click to mute/unmute";const i=Pt("volume_off"),n=Pt("volume_up");return e.application.muted?t.appendChild(i):t.appendChild(n),t.onclick=()=>{e.application.muted?(i.remove(),t.appendChild(n),e.application.muted=!1):(n.remove(),t.appendChild(i),e.application.muted=!0)},t}_qrButton;get qrButton(){return this._qrButton}_customQRButtonUrl;set qrButtonUrl(e){try{new URL(e),this._customQRButtonUrl=e}catch{console.warn(`[Needle] QR code button URL is not a valid URL '${e}'`)}}get qrButtonUrl(){return this._customQRButtonUrl||window.location.href}createQRCode(){if(this._qrButton)return this._qrButton;const e=this,t=document.createElement("button");this._qrButton=t,t.innerText="QR Code",t.prepend(Pt("qr_code")),t.title="Scan this QR code with your phone to open this page",this.hideElementDuringXRSession(t);const i=document.createElement("div");i.style.cssText=`
354
- position: fixed;
355
- display: inline-block;
356
- padding: 0.5rem;
357
- background-color: white;
358
- border-radius: 0.4rem;
359
- cursor: pointer;
360
- z-index: 1000;
361
- box-shadow: 0 0 12px rgba(0, 0, 0, 0.2);
362
- `;const n=document.createElement("div");n.classList.add("qr-code-container"),i.appendChild(n),t.addEventListener("click",()=>{if(i.parentNode)return r();A()&&window.location.href.includes("://localhost")&&ye("To access your website from another device in the same local network you have to use the IP address instead of localhost. The IP address is logged in your development server console when you start the server."),s()});async function s(){await a();const l=document.body.querySelector("needle-engine")||document.body;l.appendChild(i);const c=n.getBoundingClientRect(),h=t.getBoundingClientRect();i.style.left=h.left+h.width*.5-c.width*.5+"px";const d=h.top<c.height,p="1.3rem";d?i.style.top=`calc(${h.bottom}px + ${i.style.padding} + 0.0rem)`:i.style.top=`calc(${h.top-c.height}px - ${i.style.padding} - ${p})`,i.style.opacity="0",i.style.pointerEvents="all",i.style.transition="opacity 0.2s ease-in-out",setTimeout(()=>{i.style.opacity="1",window.addEventListener("click",r,{once:!0})}),window.addEventListener("resize",r),window.addEventListener("scroll",r),document.fullscreenElement?document.fullscreenElement.appendChild(i):l.appendChild(i)}function r(){i.style.pointerEvents="none",i.style.transition="opacity 0.2s",i.style.opacity="0",setTimeout(()=>i.parentNode?.removeChild(i),500),window.removeEventListener("click",r),window.removeEventListener("resize",r),window.removeEventListener("scroll",r)}async function a(){const l=await cw({text:e.qrButtonUrl,width:200,height:200});n.innerHTML="",n.appendChild(l)}return t.addEventListener("pointerenter",()=>{a()},{once:!0}),t}hideElementDuringXRSession(e){Nd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),cg(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}}function _u(o,e){const t=e?.element||document.head,i=Array.from(t.querySelectorAll(`link[rel=stylesheet][href*='${o}']`));if(i.length<=0){const n=document.createElement("link");n.href=o,n.rel="stylesheet",t.appendChild(n),i.push(n)}if(e?.loadedCallback)for(let n=0;n<i.length;n++)e?.loadedCallback&&i[n].addEventListener("load",e.loadedCallback)}function dw(){_u("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap")}const sf="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block",vu="needle-logo-element";class uw extends HTMLElement{static get elementName(){return vu}static create(){return document.createElement(vu)}constructor(){super(),this._root=this.attachShadow({mode:"closed"});const e=document.createElement("template");e.innerHTML=`<style>
363
- :host {
364
- position: relative;
365
- min-width: fit-content;
366
- /* height: 100%; can not have height 100% because of align-items: stretch; in the parent */
367
- display: flex;
368
- }
369
-
370
- .wrapper {
371
- position: relative;
372
- display: grid;
373
- grid-template-columns: auto auto;
374
- padding: .1rem;
375
- }
376
- .wrapper:hover {
377
- cursor: pointer;
378
- }
379
- img {
380
- height: 100%;
381
- align-self: end;
382
- margin-left: 0.6rem;
383
- transition: transform 0.2s;
384
- }
385
- img.with-text {
386
- width: 11.5ch;
387
- &:hover {
388
- transform: scale(1.02);
389
- }
390
- }
391
- img.compact {
392
- width: 1.7em;
393
- &:hover {
394
- transform: scale(1.1);
395
- }
396
- }
397
- span {
398
- font-size: 1rem;
399
- white-space: nowrap;
400
- }
401
- </style>
402
- <div class="wrapper">
403
- <img class="logo with-text" src=${lw} />
404
- </div>
405
- `,this._root.appendChild(e.content.cloneNode(!0)),this.wrapper=this._root.querySelector(".wrapper"),this._root.appendChild(this.wrapper),this.logoElement=this._root.querySelector("img.logo"),this.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")}),this.wrapper.setAttribute("title","Made with Needle Engine")}_root;wrapper;logoElement;setLogoVisible(e){this.logoElement.style.display=e?"block":"none"}setType(e){e==="full"?(this.logoElement.src=lw,this.logoElement.classList.remove("with-text"),this.logoElement.classList.remove("compact")):(this.logoElement.src=yu,this.logoElement.classList.add("with-text"),this.logoElement.classList.add("compact"))}}customElements.get(vu)||customElements.define(vu,uw);const rf=v("debugspatialmenu");class OM{_context;needleMenu;htmlButtonsMap=new Map;enabled=!0;constructor(e,t){this._context=e,this._context.pre_render_callbacks.push(this.preRender),this.needleMenu=t;const i=this.needleMenu.shadowRoot?.querySelector(".options");i?new MutationObserver(n=>{if(this.enabled&&!(this._context.isInXR==!1&&!rf))for(const s of n)s.type==="childList"&&(s.addedNodes.forEach(r=>{this.createButtonFromHTMLNode(r)}),s.removedNodes.forEach(r=>{const a=r,l=this.htmlButtonsMap.get(a);l&&(this.htmlButtonsMap.delete(a),l.remove(),Ce.update())}))}).observe(i,{childList:!0}):console.error("Could not find options container in needle menu")}setEnabled(e){this.enabled=e,e||this.menu?.removeFromParent()}userRequestedMenu=!1;setDisplay(e){return this.enabled?(this.userRequestedMenu=e,!0):!1}onDestroy(){const e=this._context.pre_render_callbacks.indexOf(this.preRender);e>-1&&this._context.pre_render_callbacks.splice(e,1)}uiisDirty=!1;markDirty(){this.uiisDirty=!0}_showNeedleLogo;showNeedleLogo(e){this._showNeedleLogo=e}_wasInXR=!1;preRender=()=>{if(!this.enabled){this.menu?.removeFromParent();return}if(rf&&q.isDesktop()&&this.updateMenu(),!this._context.xr?.running){this._wasInXR&&(this._wasInXR=!1,this.onExitXR());return}this._wasInXR||(this._wasInXR=!0,this.onEnterXR()),this.updateMenu()};onEnterXR(){const e=this.needleMenu.shadowRoot?.querySelector(".options");e&&e.childNodes.forEach(t=>{this.createButtonFromHTMLNode(t)})}onExitXR(){this.menu?.removeFromParent()}createButtonFromHTMLNode(e){const t=this.getMenu(),i=this.htmlButtonsMap.get(e);if(i){i.add();return}if(e instanceof HTMLButtonElement){const n=this.createButton(t,e);this.htmlButtonsMap.set(e,n),n.add()}else e instanceof HTMLSlotElement&&e.assignedNodes().forEach(n=>{this.createButtonFromHTMLNode(n)})}_menuTarget=new k;positionFilter=new Hm(90,.5);updateMenu(){const e=this.getMenu();this.handleNeedleWatermark(),this._context.scene.add(e);const t=this._context.mainCamera,i=this._context.xr?.rigScale||1;if(t){const n=t.worldPosition,s=t.worldForward.multiplyScalar(-1),r=s.y>.6,a=s.y>.4,l=(e.visible?a:r)||this.userRequestedMenu,c=!e.visible&&l;e.visible=l||q.isDesktop()&&rf,s.multiplyScalar(3*i),n.add(s),c&&(e.position.copy(this._menuTarget.position),e.position.y+=.25,this._menuTarget.position.copy(e.position),this.positionFilter.reset(e.position),e.quaternion.copy(this._menuTarget.quaternion),this.markDirty());const h=this._menuTarget.position.distanceTo(n);(c||h>1.5*i)&&(this.ensureRenderOnTop(this.menu),this._menuTarget.position.copy(n),this._context.scene.add(this._menuTarget),oc(this._menuTarget,this._context.mainCamera,!0,!0),this._menuTarget.removeFromParent()),this.positionFilter.filter(this._menuTarget.position,e.position,this._context.time.time),this.menu?.quaternion.slerp(this._menuTarget.quaternion,this._context.time.deltaTime*5),this.menu?.scale.setScalar(i)}this.uiisDirty&&(this.uiisDirty=!1,Ce.update())}ensureRenderOnTop(e,t=0){e instanceof G&&(e.material.depthTest=!1,e.material.depthWrite=!1),e.renderOrder=1e3+t*2;for(const i of e.children)this.ensureRenderOnTop(i,t+1)}familyName="Needle Spatial Menu";menu;get isVisible(){return this.menu?.visible}getMenu(){if(this.menu)return this.menu;this.ensureFont(),this.menu=new Ce.Block({boxSizing:"border-box",fontFamily:this.familyName,height:"auto",fontSize:.1,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:.55,borderRadius:1,whiteSpace:"pre-wrap",flexDirection:"row",alignItems:"center",padding:new pe(0,.05,0,.05),borderColor:0,borderOpacity:.05,borderWidth:.005});const e=C.get("ObjectRaycaster");return e&&kr(this.menu,new e),this.menu}_poweredByNeedleElement;handleNeedleWatermark(){if(!this._poweredByNeedleElement){this._poweredByNeedleElement=new Ce.Block({width:"auto",height:"auto",fontSize:.05,whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",margin:.02,borderRadius:.02,padding:.02,backgroundColor:16777215,backgroundOpacity:1}),this._poweredByNeedleElement["needle:use_eventsystem"]=!0;const e=new pw(this._context,()=>globalThis.open("https://needle.tools","_self"));kr(this._poweredByNeedleElement,e);const t=new Ce.Text({textContent:"Powered by",width:"auto",height:"auto"}),i=new Ce.Text({textContent:"needle",width:"auto",height:"auto",fontSize:.07,margin:new pe(0,0,0,.02)});this._poweredByNeedleElement.add(t),this._poweredByNeedleElement.add(i),this.menu?.add(this._poweredByNeedleElement),this.markDirty(),new Kl().load("./include/needle/poweredbyneedle.webp",n=>{e.allowModifyUI=!1,t.removeFromParent(),i.removeFromParent();const s=n.image.width/n.image.height;this._poweredByNeedleElement?.set({backgroundImage:n,backgroundOpacity:1,width:.1*s,height:.1}),this.markDirty()})}if(this.menu){const e=this.menu.children.indexOf(this._poweredByNeedleElement);if(!this._showNeedleLogo&&Qn())e>=0&&(this._poweredByNeedleElement.removeFromParent(),this.markDirty());else{this._poweredByNeedleElement.visible=!0,this.menu.add(this._poweredByNeedleElement);const t=this.menu.children.indexOf(this._poweredByNeedleElement);e!==t&&this.markDirty()}}}ensureFont(){let e=Ce.FontLibrary.getFontFamily(this.familyName);e||(e=Ce.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","./include/needle/arial-msdf.json","./include/needle/arial.png")?.addEventListener("ready",()=>{this.markDirty()}))}createButton(e,t){const i=new Ce.Block({width:"auto",height:"auto",whiteSpace:"pre-wrap",flexDirection:"row",flexWrap:"wrap",justifyContent:"center",backgroundColor:16777215,backgroundOpacity:0,padding:.02,margin:.01,borderRadius:.02,cursor:"pointer",fontSize:.05}),n=new Ce.Text({textContent:"",width:"auto",justifyContent:"center",alignItems:"center",backgroundOpacity:0,backgroundColor:16777215,fontFamily:this.familyName,color:0,borderRadius:.02,padding:.01});i.add(n),i["needle:use_eventsystem"]=!0;const s=new pw(this._context,()=>t.click());return kr(i,s),new kM(this,e,t,i,n)}}class kM{menu;root;htmlbutton;spatialContainer;spatialText;spatialIcon;constructor(e,t,i,n,s){this.menu=e,this.root=t,this.htmlbutton=i,this.spatialContainer=n,this.spatialText=s,new MutationObserver(r=>{for(const a of r)a.type==="attributes"?a.attributeName==="style"&&this.updateVisible():a.type==="childList"&&this.updateText()}).observe(i,{attributes:!0,childList:!0}),this.updateText()}add(){this.spatialContainer.parent!=this.root&&(this.root.add(this.spatialContainer),this.menu.markDirty(),this.updateVisible(),this.updateText())}remove(){this.spatialContainer.parent&&(this.spatialContainer.removeFromParent(),this.menu.markDirty())}updateVisible(){const e=this.spatialContainer.visible;this.spatialContainer.visible=this.htmlbutton.style.display!=="none",e!==this.spatialContainer.visible&&this.menu.markDirty()}_lastText="";updateText(){let e="",t="";this.htmlbutton.childNodes.forEach(i=>{i.nodeType===Node.TEXT_NODE?e+=i.textContent:i instanceof HTMLElement&&hw(i)&&i.textContent&&(t=i.textContent)}),this._lastText!==e&&(this._lastText=e,this.spatialText.name=e,this.spatialText.set({textContent:e}),this.menu.markDirty()),e.length<=0?this.spatialText.parent&&(this.spatialText.removeFromParent(),this.menu.markDirty()):this.spatialText.parent||(this.spatialContainer.add(this.spatialText),this.menu.markDirty()),t&&this.createIcon(t)}_lastTexture;async createIcon(e){if(!this.spatialIcon){const i=await of(e);if(i&&!this.spatialIcon){const n=new Ce.Block({width:.08,height:.08,backgroundColor:16777215,backgroundImage:i,backgroundOpacity:1,margin:new pe(0,.005,0,0)});this.spatialIcon=n,this.spatialContainer.add(n),this.menu.markDirty()}}if(e!=this._lastTexture){this._lastTexture=e;const i=await of(e);i&&(this.spatialIcon?.set({backgroundImage:i}),this.menu.markDirty())}const t=this.spatialContainer.children.indexOf(this.spatialIcon);t>0&&(this.spatialContainer.children.splice(t,1),this.spatialContainer.children.unshift(this.spatialIcon),this.menu.markDirty())}}class pw{isComponent=!0;enabled=!0;get activeAndEnabled(){return!0}__internalAwake(){}__internalEnable(){}__internalDisable(){}__internalStart(){}onEnable(){}onDisable(){}gameObject;allowModifyUI=!0;get element(){return this.gameObject}context;onclick;constructor(e,t){this.context=e,this.onclick=t}onPointerEnter(){this.context.input.setCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:1}),Ce.update())}onPointerExit(){this.context.input.unsetCursor("pointer"),this.allowModifyUI&&(this.element.set({backgroundOpacity:0}),Ce.update())}onPointerDown(e){e.use()}onPointerUp(e){e.use()}onPointerClick(e){e.use(),this.onclick()}}const Ir="needle-menu",Ec=v("debugmenu"),mw=v("debugnoncommercial");let MM=class{_context;_menu;_spatialMenu;constructor(o){this._menu=cm.getOrCreate(o.domElement,o),this._context=o,this._spatialMenu=new OM(o,this._menu),window.addEventListener("message",this.onPostMessage),Nd(this.onStartXR)}onDestroy(){window.removeEventListener("message",this.onPostMessage),this._menu.remove(),this._spatialMenu.onDestroy()}onPostMessage=o=>{if(o.origin===globalThis.location.origin&&typeof o.data=="object"){const e=o.data,t=e.type;if(t==="needle:menu"){const i=e.button;if(i){if(!i.label)return console.error("NeedleMenu: buttoninfo.label is required");if(!i.onclick)return console.error("NeedleMenu: buttoninfo.onclick is required");const n=document.createElement("button");if(n.textContent=i.label,i.icon){const s=Pt(i.icon);n.prepend(s)}i.priority&&n.setAttribute("priority",i.priority.toString()),n.onclick=()=>{if(i.onclick){const s=i.onclick.startsWith("http")||i.onclick.startsWith("www."),r=i.target||"_blank";s?globalThis.open(i.onclick,r):console.error("NeedleMenu: onclick is not a valid link",i.onclick)}},this._menu.appendChild(n)}else Ec&&console.error("NeedleMenu: unknown postMessage event",e)}else Ec&&console.warn("NeedleMenu: unknown postMessage type",t,e)}};onStartXR=o=>{o.session.isScreenBasedAR&&(this._menu.previousParent=this._menu.parentNode,this._context.arOverlayElement.appendChild(this._menu),o.session.session.addEventListener("end",this.onExitXR),this._menu.closeFoldout())};onExitXR=()=>{this._menu.previousParent&&(this._menu.previousParent.appendChild(this._menu),delete this._menu.previousParent)};setPosition(o){this._menu.setPosition(o)}setVisible(o){this._menu.setVisible(o)}showNeedleLogo(o){this._menu.showNeedleLogo(o),this._spatialMenu?.showNeedleLogo(o)}get logoIsVisible(){return this._menu.logoIsVisible}showSpatialMenu(o){this._spatialMenu.setEnabled(o)}setSpatialMenuVisible(o){this._spatialMenu.setDisplay(o)}get spatialMenuIsVisible(){return this._spatialMenu.isVisible}showQRCodeButton(o){if(o==="desktop-only"&&(o=!q.isMobileDevice()),o){const e=Fn.getOrCreate().createQRCode();return e.style.display="",this._menu.appendChild(e),e}else{const e=Fn.getOrCreate().qrButton;return e&&(e.style.display="none"),e??null}}showAudioPlaybackOption(o){if(!o){this._muteButton?.remove();return}this._muteButton=Fn.getOrCreate().createMuteButton(this._context),this._muteButton.setAttribute("priority","100"),this._menu.appendChild(this._muteButton)}_muteButton;showFullscreenOption(o){if(!o){this._fullscreenButton?.remove();return}this._fullscreenButton=Fn.getOrCreate().createFullscreenButton(this._context),this._fullscreenButton&&(this._fullscreenButton.setAttribute("priority","150"),this._menu.appendChild(this._fullscreenButton))}_fullscreenButton;appendChild(o){return this._menu.appendChild(o)}};class cm extends HTMLElement{static create(){return document.createElement(Ir,{is:Ir})}static getOrCreate(e,t){let i=e.querySelector(Ir);return!i&&e.shadowRoot&&(i=e.shadowRoot.querySelector(Ir)),i||(i=window.document.body.querySelector(Ir)),i||(i=cm.create(),e.shadowRoot?e.shadowRoot.appendChild(i):e.appendChild(i)),i._domElement=e,i._context=t,i}_domElement=null;_context=null;constructor(){super();const e=document.createElement("template");e.innerHTML=`<style>
406
-
407
- /** Styling attributes that ensure the nested menu z-index does not cause it to overlay elements outside of <needle-engine> */
408
- :host {
409
- position: absolute;
410
- width: 100%;
411
- height: 100%;
412
- z-index: 0;
413
- top: 0;
414
- pointer-events: none;
415
- }
416
-
417
- #root {
418
- position: absolute;
419
- width: auto;
420
- max-width: 95%;
421
- left: 50%;
422
- transform: translateX(-50%);
423
- top: min(20px, 10vh);
424
- padding: 0.3rem;
425
- display: flex;
426
- visibility: visible;
427
- flex-direction: row-reverse; /* if we overflow this should be right aligned so the logo is always visible */
428
- pointer-events: all;
429
- z-index: 1000;
430
- }
431
-
432
- /** hide the menu if it's empty **/
433
- #root.has-no-options.logo-hidden {
434
- display: none;
435
- }
436
-
437
- /** using a div here because then we can change the class for placement **/
438
- #root.bottom {
439
- top: auto;
440
- bottom: min(30px, 10vh);
441
- }
442
- #root.top {
443
- top: calc(.7rem + env(safe-area-inset-top));
444
- }
445
-
446
- .wrapper {
447
- position: relative;
448
- display: flex;
449
- flex-direction: row;
450
- justify-content: center;
451
- align-items: stretch;
452
- gap: 0px;
453
- padding: 0 0rem;
454
- }
455
-
456
- .wrapper > *, .options > button, .options > select, ::slotted(*) {
457
- position: relative;
458
- border: none;
459
- border-radius: 0;
460
- outline: 1px solid rgba(0,0,0,0);
461
- display: flex;
462
- justify-content: center;
463
- align-items: center;
464
- max-height: 2.3rem;
465
- max-width: 100%;
466
-
467
- /** basic font settings for all entries **/
468
- font-size: 1rem;
469
- font-family: 'Roboto Flex', sans-serif;
470
- font-optical-sizing: auto;
471
- font-weight: 500;
472
- font-weight: 200;
473
- font-variation-settings: "wdth" 100;
474
- color: rgb(20,20,20);
475
- }
476
-
477
- .options > select[multiple]:hover {
478
- max-height: 300px;
479
- }
480
-
481
- .floating-panel-style {
482
- background: rgba(255, 255, 255, .4);
483
- outline: rgb(0 0 0 / 5%) 1px solid;
484
- border: 1px solid rgba(255, 255, 255, .1);
485
- box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05);
486
- border-radius: 1.5rem;
487
- /**
488
- * to make nested background filter work
489
- * https://stackoverflow.com/questions/60997948/backdrop-filter-not-working-for-nested-elements-in-chrome
490
- **/
491
- &::before {
492
- content: '';
493
- position: absolute;
494
- width: 100%;
495
- height: 100%;
496
- top: 0;
497
- left: 0;
498
- z-index: -1;
499
- border-radius: 1.5rem;
500
- -webkit-backdrop-filter: blur(8px);
501
- backdrop-filter: blur(8px);
502
- }
503
- }
504
-
505
- a {
506
- color: inherit;
507
- text-decoration: none;
508
- }
509
-
510
- .options {
511
- display: flex;
512
- flex-direction: row;
513
- align-items: center;
514
- }
515
-
516
- .options > *, ::slotted(*) {
517
- max-height: 2.25rem;
518
- padding: .4rem .5rem;
519
- }
520
-
521
- :host .options > *, ::slotted(*) {
522
- background: transparent;
523
- border: none;
524
- white-space: nowrap;
525
- transition: all 0.1s linear .02s;
526
- border-radius: 1.5rem;
527
- user-select: none;
528
- }
529
- :host .options > *:hover, ::slotted(*:hover) {
530
- cursor: pointer;
531
- color: black;
532
- background: rgba(245, 245, 245, .8);
533
- box-shadow: inset 0 0 1rem rgba(0,0,30,.2);
534
- outline: rgba(0,0,0,.1) 1px solid;
535
- }
536
- :host .options > *:active, ::slotted(*:active) {
537
- background: rgba(255, 255, 255, .8);
538
- 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);
539
- transition: all 0.05s linear;
540
- }
541
- :host .options > *:focus, ::slotted(*:focus) {
542
- outline: rgba(255,255,255,.5) 1px solid;
543
- }
544
- :host .options > *:focus-visible, ::slotted(*:focus-visible) {
545
- outline: rgba(0,0,0,.5) 1px solid;
546
- }
547
-
548
- :host .options > *:disabled, ::slotted(*:disabled) {
549
- background: rgba(0,0,0,.05);
550
- color: rgba(60,60,60,.7);
551
- pointer-events: none;
552
- }
553
-
554
- button, ::slotted(button) {
555
- gap: 0.3rem;
556
- }
557
-
558
- /** XR button animation **/
559
- :host button.this-mode-is-requested {
560
- background: repeating-linear-gradient(to right, #fff 0%, #fff 40%, #aaffff 55%, #fff 80%);
561
- background-size: 200% auto;
562
- background-position: 0 100%;
563
- animation: AnimationName .7s ease infinite forwards;
564
- }
565
- :host button.other-mode-is-requested {
566
- opacity: .5;
567
- }
568
-
569
- @keyframes AnimationName {
570
- 0% { background-position: 0% 0 }
571
- 100% { background-position: -200% 0 }
572
- }
573
-
574
-
575
-
576
-
577
- .logo {
578
- cursor: pointer;
579
- padding-left: 0.0rem;
580
- padding-bottom: .02rem;
581
- margin-right: 0.5rem;
582
- }
583
- .logo-hidden {
584
- .logo {
585
- display: none;
586
- }
587
- }
588
- :host .has-options .logo {
589
- border-left: 1px solid rgba(40,40,40,.4);
590
- margin-left: 0.3rem;
591
- margin-right: 0.5rem;
592
- }
593
-
594
- .logo > span {
595
- white-space: nowrap;
596
- }
597
-
598
-
599
-
600
- /** COMPACT */
601
-
602
- /** Hide the menu button normally **/
603
- .compact-menu-button { display: none; }
604
- /** And show it when we're in compact mode **/
605
- .compact .compact-menu-button {
606
- position: relative;
607
- display: block;
608
- background: none;
609
- border: none;
610
- border-radius: 2rem;
611
-
612
- margin: 0;
613
- padding: 0 .3rem;
614
- padding-top: .2rem;
615
-
616
- z-index: 100;
617
-
618
- color: #000;
619
-
620
- &:hover {
621
- background: rgba(255,255,255,.2);
622
- cursor: pointer;
623
- }
624
- &:focus {
625
- outline: 1px solid rgba(255,255,255,.5);
626
- }
627
- &:focus-visible {
628
- outline: 1px solid rgba(0,0,0,.5);
629
- }
630
- & .expanded-click-area {
631
- position: absolute;
632
- left: 0;
633
- right: 0;
634
- top: 10%;
635
- bottom: 10%;
636
- transform: scale(1.8);
637
- }
638
- }
639
- .has-no-options .compact-menu-button {
640
- display: none;
641
- }
642
- .open .compact-menu-button {
643
- background: rgba(255,255,255,.2);
644
- }
645
- .logo-visible .compact-menu-button {
646
- margin-left: .2rem;
647
- }
648
-
649
- /** Open and hide menu **/
650
- .compact .foldout {
651
- display: none;
652
- }
653
- .open .options, .open .foldout {
654
- display: flex;
655
- justify-content: center;
656
- }
657
- .compact .wrapper {
658
- padding: 0;
659
- }
660
- .compact .wrapper, .compact .options {
661
- height: auto;
662
- max-height: initial;
663
- flex-direction: row;
664
- gap: .12rem;
665
- }
666
- .compact .options {
667
- flex-wrap: wrap;
668
- gap: .3rem;
669
- }
670
- .compact .top .options {
671
- height: auto;
672
- flex-direction: row;
673
- }
674
- .compact .bottom .wrapper {
675
- height: auto;
676
- flex-direction: column;
677
- }
678
-
679
- .compact .foldout {
680
- max-height: min(100ch, calc(100vh - 100px));
681
- overflow: auto;
682
- overflow-x: hidden;
683
- align-items: center;
684
-
685
- position: fixed;
686
- bottom: calc(100% + 5px);
687
- z-index: 100;
688
- width: auto;
689
- left: .2rem;
690
- right: .2rem;
691
- padding: .2rem;
692
-
693
- }
694
- .compact.logo-hidden .foldout {
695
- /** for when there's no logo we want to center the foldout **/
696
- min-width: 24ch;
697
- margin-left: 50%;
698
- transform: translateX(calc(-50% - .2rem));
699
- }
700
-
701
- .compact.top .foldout {
702
- top: calc(100% + 5px);
703
- bottom: auto;
704
- }
705
-
706
- ::-webkit-scrollbar {
707
- max-width: 7px;
708
- background: rgba(100,100,100,.2);
709
- border-radius: .2rem;
710
- }
711
- ::-webkit-scrollbar-thumb {
712
- background: rgba(255, 255, 255, .3);
713
- border-radius: .2rem;
714
- }
715
- ::-webkit-scrollbar-thumb:hover {
716
- background: rgb(150,150,150);
717
- }
718
-
719
- .compact .options > *, .compact .options > ::slotted(*) {
720
- font-size: 1.2rem;
721
- padding: .6rem .5rem;
722
- width: 100%;
723
- }
724
- .compact.has-options .logo {
725
- border: none;
726
- padding-left: 0;
727
- margin-left: 1rem;
728
- margin-bottom: .02rem;
729
- }
730
- .compact .options {
731
- /** e.g. if we have a very wide menu item like a select with long option names we don't want to overflow **/
732
- max-width: 100%;
733
-
734
- & > button, & > select {
735
- display: flex;
736
- flex-basis: 100%;
737
- min-height: 3rem;
738
- }
739
- & > button.row2 {
740
- //border: 1px solid red !important;
741
- display: flex;
742
- flex: 1;
743
- flex-basis: 30%;
744
- }
745
- }
746
-
747
- /** If there's really not enough space then just hide all options **/
748
- @media (max-width: 100px) or (max-height: 100px){
749
- .foldout {
750
- display: none !important;
751
- }
752
- .compact-menu-button {
753
- display: none !important;
754
- }
755
- }
756
-
757
- /* dark mode */
758
- /*
759
- @media (prefers-color-scheme: dark) {
760
- :host {
761
- background: rgba(0,0,0, .6);
762
- }
763
- :host button {
764
- color: rgba(200,200,200);
765
- }
766
- :host button:hover {
767
- background: rgba(100,100,100, .8);
768
- }
769
- }
770
- */
771
-
772
- </style>
773
-
774
- <div id="root" class="logo-hidden floating-panel-style bottom">
775
- <div class="wrapper">
776
- <div class="foldout">
777
- <div class="options" part="options">
778
- <slot></slot>
779
- </div>
780
- <div class="options" part="options">
781
- <slot name="end"></slot>
782
- </div>
783
- </div>
784
- <div style="user-select:none;" class="logo">
785
- <span class="madewith notranslate" style="display:none;">powered by</span>
786
- </div>
787
- </div>
788
- <button class="compact-menu-button">
789
- <div class="expanded-click-area"></div>
790
- </button>
791
- </div>
792
- `;const t=this.attachShadow({mode:"open"});dw(),_u(sf,{loadedCallback:()=>{this.handleSizeChange()}}),_u(sf,{element:t});const i=e.content.cloneNode(!0);t?.appendChild(i),this.root=t.querySelector("#root"),this.wrapper=this.root?.querySelector(".wrapper"),this.options=this.root?.querySelector(".options"),this.logoContainer=this.root?.querySelector(".logo"),this.compactMenuButton=this.root?.querySelector(".compact-menu-button"),this.compactMenuButton.append(Pt("more_vert")),this.foldout=this.root?.querySelector(".foldout"),this.root?.appendChild(this.wrapper),this.wrapper.classList.add("wrapper");const n=uw.create();n.setType("compact"),n.style.minHeight="1rem",this.logoContainer.append(n),this.logoContainer.addEventListener("click",()=>{globalThis.open("https://needle.tools","_blank")});try{window.requestAnimationFrame(()=>jM(c=>{if(c==!0&&Io()&&!mw){let h=this._userRequestedLogoVisible;h===void 0&&(h=!1),this.___onSetLogoVisible(h)}else this.___onSetLogoVisible(!0)}))}catch(c){console.error("[Needle Menu] License check failed.",c)}this.compactMenuButton.addEventListener("click",c=>{c.preventDefault(),this.root.classList.toggle("open")});let s=this._context;setTimeout(()=>s=this._context);let r=0;const a=(c,h)=>{Ec&&console.log("Set menu visible",h),s?.isInAR&&s.arOverlayElement?c!=s.arOverlayElement&&s.arOverlayElement.appendChild(this):this.parentNode!=this._domElement?.shadowRoot&&this._domElement?.shadowRoot?.appendChild(this),this.style.display=h?"flex":"none",this.style.visibility="visible",this.style.opacity="1"};let l=!1;new MutationObserver(c=>{if(!l)try{l=!0,this.onChangeDetected(c);const h=this?.parentNode;if((this.style.display!="flex"||this.style.visibility!="visible"||this.style.opacity!="1"||h!=this._domElement?.shadowRoot)&&!Io()){const d=r++;$i()&&this._userRequestedMenuVisible===!1?(d===0&&a(h,this._userRequestedMenuVisible),d===1&&console.warn("Needle Menu Warning: You need a PRO license to hide the Needle Engine menu \u2192 The menu will be visible in your deployed website if you don't have a PRO license. See https://needle.tools/pricing for details.")):d===0?a(h,!0):setTimeout(()=>a(h,!0),5)}}finally{l=!1}}).observe(this.root,{childList:!0,subtree:!0,attributes:!0}),Ec&&this.___insertDebugOptions()}_sizeChangeInterval;connectedCallback(){window.addEventListener("resize",this.handleSizeChange),this.handleMenuVisible(),this._sizeChangeInterval=setInterval(()=>this.handleSizeChange(void 0,!0),5e3),setTimeout(()=>{this._domElement?.addEventListener("resize",this.handleSizeChange),this._domElement?.addEventListener("click",this.#t)},1)}disconnectedCallback(){window.removeEventListener("resize",this.handleSizeChange),clearInterval(this._sizeChangeInterval),this._domElement?.removeEventListener("resize",this.handleSizeChange),this._context?.domElement.removeEventListener("click",this.#t)}#t=e=>{if(!e.defaultPrevented&&e.target==this._domElement&&e instanceof PointerEvent&&e.button===0&&this.root.classList.contains("open")){const t=this.foldout.getBoundingClientRect(),i=e;i.clientX>t.left&&i.clientX<t.right&&i.clientY>t.top&&i.clientY<t.bottom||this.root.classList.toggle("open",!1)}};_userRequestedLogoVisible=void 0;showNeedleLogo(e){this._userRequestedLogoVisible=e,!(!e&&(!Io()||mw)&&(console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production."),!$i()))&&this.___onSetLogoVisible(e)}get logoIsVisible(){return!this.root.classList.contains("logo-hidden")}___onSetLogoVisible(e){this.logoContainer.style.display="",this.logoContainer.style.opacity="1",this.logoContainer.style.visibility="visible",e?(this.root.classList.remove("logo-hidden"),this.root.classList.add("logo-visible")):(this.root.classList.remove("logo-visible"),this.root.classList.add("logo-hidden"))}setPosition(e){if(e!=="top"&&e!=="bottom")return console.error("NeedleMenu.setPosition: invalid position",e);this.root.classList.remove("top","bottom"),this.root.classList.add(e)}_userRequestedMenuVisible=void 0;setVisible(e){this._userRequestedMenuVisible=e,this.style.display=e?"flex":"none"}closeFoldout(){this.root.classList.remove("open")}root;wrapper;options;logoContainer;compactMenuButton;foldout;append(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.options.appendChild(i)}else this.options.appendChild(t)}appendChild(e){if(!(e instanceof Node)){const t=document.createElement("button");if(t.textContent=e.label,t.onclick=e.onClick,t.setAttribute("priority",e.priority?.toString()??"0"),e.title&&(t.title=e.title),e.icon){const i=Pt(e.icon);e.iconSide==="right"?t.appendChild(i):t.prepend(i)}e.class&&t.classList.add(e.class),e=t}return this.options.appendChild(e)}prepend(...e){for(const t of e)if(typeof t=="string"){const i=document.createTextNode(t);this.options.prepend(i)}else this.options.prepend(t)}_isHandlingChange=!1;onChangeDetected(e){if(!this._isHandlingChange){this._isHandlingChange=!0;try{this.handleMenuVisible();for(const t of e)t.target==this.options&&this.onOptionsChildrenChanged(t)}finally{this._isHandlingChange=!1}}}onOptionsChildrenChanged(e){if(this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions),this.handleSizeChange(void 0,!0),e.type==="childList"&&e.addedNodes.length>0){const t=Array.from(this.options.children);t.sort((n,s)=>{const r=parseInt(n.getAttribute("priority")||"0"),a=parseInt(s.getAttribute("priority")||"0");return r-a});let i=!1;for(let n=0;n<t.length;n++){const s=this.options.children[n],r=t[n];if(s!==r){i=!0;break}}if(i)for(const n of t)this.options.appendChild(n)}}_didSort=new Map;handleMenuVisible(){Ec&&console.log("Update VisibleState: Any Content?",this.hasAnyContent),this.hasAnyContent?this.root.style.display="":this.root.style.display="none",this.root.classList.toggle("has-options",this.hasAnyVisibleOptions),this.root.classList.toggle("has-no-options",!this.hasAnyVisibleOptions)}get hasAnyContent(){return!!(this.logoContainer.style.display!="none"||this.hasAnyVisibleOptions)}get hasAnyVisibleOptions(){for(let e=0;e<this.options.children.length;e++){const t=this.options.children[e];if(t.tagName==="SLOT"){const i=t.assignedNodes();for(const n of i)if(n instanceof HTMLElement&&n.style.display!="none")return!0}else if(t.style.display!="none")return!0}return!1}_lastAvailableWidthChange=0;_timeoutHandle=0;handleSizeChange=(e,t)=>{if(!this._domElement)return;const i=this._domElement.clientWidth;if(i<100){clearTimeout(this._timeoutHandle),this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style");return}const n=i-40;if(!t&&Math.abs(n-this._lastAvailableWidthChange)<1)return;this._lastAvailableWidthChange=n,clearTimeout(this._timeoutHandle),this._timeoutHandle=setTimeout(()=>{const a=r();a<0?(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")):a>0&&(this.root.classList.remove("compact"),this.foldout.classList.remove("floating-panel-style"),r()<0&&(this.root.classList.add("compact"),this.foldout.classList.add("floating-panel-style")))},5);const s=()=>this.options.clientWidth+this.logoContainer.clientWidth,r=()=>n-s()};___insertDebugOptions(){window.addEventListener("keydown",i=>{i.key==="p"&&this.setPosition(this.root.classList.contains("top")?"bottom":"top")});const e=document.createElement("button");e.textContent="Hide Buttons",e.onclick=()=>{const i=new Array(this.options.children.length);for(let n=0;n<this.options.children.length;n++)i[n]=this.options.children[n];for(const n of i)this.options.removeChild(n);setTimeout(()=>{for(const n of i)this.options.appendChild(n)},1e3)},this.appendChild(e);const t=document.createElement("button");t.textContent="Toggle Logo",t.addEventListener("click",()=>{this.logoContainer.style.display=this.logoContainer.style.display==="none"?"":"none"}),this.appendChild(t)}}customElements.get(Ir)||customElements.define(Ir,cm);const Ye=v("debugcontext"),RM=v("stats"),TM=v("debugactive"),EM=v("debugframerate"),AM=v("debugcoroutine"),IM={};class LM{name;alias;hash;runInBackground;domElement;renderer;camera;scene}var we=(o=>(o[o.Start=-1]="Start",o[o.EarlyUpdate=0]="EarlyUpdate",o[o.Update=1]="Update",o[o.LateUpdate=2]="LateUpdate",o[o.OnBeforeRender=3]="OnBeforeRender",o[o.OnAfterRender=4]="OnAfterRender",o[o.PrePhysicsStep=9]="PrePhysicsStep",o[o.PostPhysicsStep=10]="PostPhysicsStep",o[o.Undefined=-1]="Undefined",o))(we||{});function wu(o,e){if(!o)return;if(!o.isComponent){(A()||Ye)&&console.error(`Registered script is not a Needle Engine component.
793
- The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
794
- `,o);return}e||(e=z.Current,Ye&&console.warn("> Registering component without context"));const t=e?.new_scripts;t.includes(o)||t.push(o)}class z{static _defaultTargetFramerate={value:90,toString(){return this.value}};static get DefaultTargetFrameRate(){return z._defaultTargetFramerate.value}static set DefaultTargetFrameRate(e){z._defaultTargetFramerate.value=e}static _defaultWebglRendererParameters={antialias:!0,alpha:!1,powerPreference:q.isiOS()||q.isMacOS()?"default":"high-performance",stencil:!0};static get DefaultWebGLRendererParameters(){return z._defaultWebglRendererParameters}get version(){return bn}static get Current(){return ue.Current}static set Current(e){ue.Current=e}static get All(){return ue.All}name;alias;isManagedExternally=!1;isPaused=!1;runInBackground=!1;targetFrameRate;physicsSteps=1;hash;domElement;appendHTMLElement(e){return this.domElement.shadowRoot?this.domElement.shadowRoot.appendChild(e):this.domElement.appendChild(e)}get resolutionScaleFactor(){return this._resolutionScaleFactor}set resolutionScaleFactor(e){if(e!==this._resolutionScaleFactor&&typeof e=="number"){if(e<=0){console.error("Invalid resolution scale factor",e);return}this._resolutionScaleFactor=e,this.updateSize()}}_resolutionScaleFactor=1;_boundingClientRectFrame=-1;_boundingClientRect=null;_domX;_domY;calculateBoundingClientRect(){if(this.xr){this._domX=0,this._domY=0;return}this._boundingClientRectFrame!==this.time.frame&&(this._boundingClientRectFrame=this.time.frame,this._boundingClientRect=this.domElement.getBoundingClientRect(),this._domX=this._boundingClientRect.x,this._domY=this._boundingClientRect.y)}get domWidth(){return this.isInAR?window.innerWidth:this.domElement.clientWidth}get domHeight(){return this.isInAR?window.innerHeight:this.domElement.clientHeight}get domX(){return this.calculateBoundingClientRect(),this._domX}get domY(){return this.calculateBoundingClientRect(),this._domY}get isInXR(){return this.renderer?.xr?.isPresenting||!1}xr=null;get xrSessionMode(){return this.xr?.mode}get isInVR(){return this.xrSessionMode==="immersive-vr"}get isInAR(){return this.xrSessionMode==="immersive-ar"}get isInPassThrough(){return this.xr?this.xr.isPassThrough:!1}get xrSession(){return this.renderer?.xr?.getSession()}get xrFrame(){return this._xrFrame}get xrCamera(){return this.renderer.xr.isPresenting?this.renderer?.xr?.getCamera():void 0}_xrFrame=null;get arOverlayElement(){const e=this.domElement;return typeof e.getAROverlayContainer=="function"?e.getAROverlayContainer():this.domElement}get currentFrameEvent(){return this._currentFrameEvent}_currentFrameEvent=-1;scene;renderer;composer=null;scripts=[];scripts_pausedChanged=[];scripts_earlyUpdate=[];scripts_update=[];scripts_lateUpdate=[];scripts_onBeforeRender=[];scripts_onAfterRender=[];scripts_WithCorroutines=[];scripts_immersive_vr=[];scripts_immersive_ar=[];coroutines={};post_setup_callbacks=[];pre_update_callbacks=[];pre_render_callbacks=[];post_render_callbacks=[];pre_update_oneshot_callbacks=[];new_scripts=[];new_script_start=[];new_scripts_pre_setup_callbacks=[];new_scripts_post_setup_callbacks=[];new_scripts_xr=[];mainCameraComponent=void 0;get mainCamera(){if(this._mainCamera)return this._mainCamera;if(this.mainCameraComponent){const e=this.mainCameraComponent;return e.threeCamera||e.buildCamera(),e.threeCamera}return this._fallbackCamera||(this._fallbackCamera=new re(75,this.domWidth/this.domHeight,.1,1e3)),this._fallbackCamera}set mainCamera(e){this._mainCamera=e}_mainCamera=null;_fallbackCamera=null;application;animations;time;input;physics;connection;assets;mainLight=null;get rendererData(){return this.sceneLighting}sceneLighting;addressables;lightmaps;players;lodsManager;menu;get isCreated(){return this._isCreated}get rootSourceId(){return this.rootSceneSourceIdentifiers[0]||void 0}_needsUpdateSize=!1;_isCreated=!1;_isCreating=!1;_isVisible=!1;_stats=RM?new HC:null;constructor(e){this.name=e?.name||"",this.alias=e?.alias,this.domElement=e?.domElement||document.body,this.hash=e?.hash,e?.renderer&&(this.renderer=e.renderer,this.isManagedExternally=!0),e?.runInBackground!==void 0&&(this.runInBackground=e.runInBackground),e?.scene?this.scene=e.scene:this.scene=new wi,e?.camera&&(this._mainCamera=e.camera),this.application=new Dn(this),this.time=new ow,this.input=new C_(this),this.physics=new Hl(this),this.connection=new U_(this),this.assets=new K_,this.sceneLighting=new tw(this),this.addressables=new Gv(this),this.lightmaps=new aM(this),this.players=new Kv(this),this.menu=new MM(this),this.lodsManager=new lM(this),this.animations=new oM(this);const t=()=>this._needsUpdateSize=!0;window.addEventListener("resize",t),this._disposeCallbacks.push(()=>window.removeEventListener("resize",t));const i=new ResizeObserver(n=>this._needsUpdateSize=!0);i.observe(this.domElement),this._disposeCallbacks.push(()=>i.disconnect()),this._intersectionObserver=new IntersectionObserver(n=>{this._isVisible=n[0].isIntersecting}),this._disposeCallbacks.push(()=>this._intersectionObserver?.disconnect()),ue.register(this)}createNewRenderer(e){if(this.renderer?.dispose(),e={...z.DefaultWebGLRendererParameters,...e},!e.canvas){const t=this.domElement?.shadowRoot?.querySelector("canvas");t&&(e.canvas=t,Ye&&console.log("Using canvas from shadow root",t))}return Ye&&console.log("Using Renderer Parameters:",e,this.domElement),this.renderer=new cr(e),this.renderer.debug.checkShaderErrors=A()||v("checkshadererrors")===!0,this.renderer.toneMappingExposure=1,this.renderer.toneMapping=Sd,this.renderer.setClearColor(new ne("lightgrey"),0),this.renderer.shadowMap.enabled=!0,this.renderer.shadowMap.type=BS,this.renderer.setSize(this.domWidth,this.domHeight),this.renderer.outputColorSpace=Co,this.renderer.nodes={library:new FS,modelViewMatrix:null,modelNormalViewMatrix:null},this.lodsManager.setRenderer(this.renderer),this.input.bindEvents(),IO(this,this.renderer.domElement),this.renderer}_intersectionObserver=null;internalOnUpdateVisible(){this._intersectionObserver?.disconnect(),this._intersectionObserver?.observe(this.domElement)}_disposeCallbacks=[];requestSizeUpdate(){this._needsUpdateSize=!0}maxRenderResolution;get devicePixelRatio(){return this._devicePixelRatio}set devicePixelRatio(e){e!==this._devicePixelRatio&&(this._devicePixelRatio=e,this._needsUpdateSize=!0)}_devicePixelRatio="auto";updateSize(e=!1){if(e||!this.isManagedExternally&&this.renderer.xr?.isPresenting===!1){this._needsUpdateSize=!1;const t=this.resolutionScaleFactor;let i=this.domWidth*t,n=this.domHeight*t;this.maxRenderResolution&&(this.maxRenderResolution.x=Math.max(1,this.maxRenderResolution.x),i=Math.min(this.maxRenderResolution.x,i),this.maxRenderResolution.y=Math.max(1,this.maxRenderResolution.y),n=Math.min(this.maxRenderResolution.y,n));const s=this.mainCamera;this.updateAspect(s),this.renderer.setSize(i,n,!0),this.renderer.domElement.style.width="100%",this.renderer.domElement.style.height="100%";const r=typeof this.devicePixelRatio=="number"?this.devicePixelRatio:this.devicePixelRatio==="auto"?Math.min(2,window.devicePixelRatio):void 0;r!==void 0&&this.renderer.setPixelRatio(r),this.composer&&(this.composer.setSize?.call(this.composer,i,n),r!==void 0&&"setPixelRatio"in this.composer&&typeof this.composer.setPixelRatio=="function"&&this.composer.setPixelRatio?.call(this.composer,window.devicePixelRatio))}}updateAspect(e,t,i){if(!e)return;t===void 0&&(t=this.domWidth),i===void 0&&(i=this.domHeight);const n=t/i;if(e.isPerspectiveCamera){const s=e,r=s.aspect;s.aspect=n,r!==s.aspect&&e.updateProjectionMatrix()}else if(e.isOrthographicCamera){const s=e,r=s.top-s.bottom,a=r*n/2,l=r/2;(s.left!=-a||s.top!=l)&&(s.left=-a,s.right=a,s.top=l,s.bottom=-l,e.updateProjectionMatrix())}}recreate(){this.clear(),this.create(this._originalCreationArgs)}_originalCreationArgs;async onCreate(e){return this.create(e)}async create(e){try{this._isCreating=!0,e!==this._originalCreationArgs&&(this._originalCreationArgs=tc(e)),window.addEventListener("unhandledrejection",this.onUnhandledRejection);const t=await this.internalOnCreate(e);return this._isCreated=t,t}finally{window.removeEventListener("unhandledrejection",this.onUnhandledRejection),this._isCreating=!1}}onUnhandledRejection=e=>{this.onError(e.reason)};onError(e){this.domElement.dispatchEvent(new CustomEvent("error",{detail:e}))}clear(){ue.dispatchCallback(de.ContextClearing,this),Hn(this,de.ContextClearing),Zi(this.scene,!0,!0),this.scene=new wi,this.addressables?.dispose(),this.lightmaps?.clear(),this.physics?.engine?.clearCaches(),this.lodsManager.disable(),this._onBeforeRenderListeners.clear(),this._onAfterRenderListeners.clear(),this.isManagedExternally||this.renderer&&(this.renderer.renderLists.dispose(),this.renderer.state.reset(),this.renderer.resetState()),ue.dispatchCallback(de.ContextCleared,this)}dispose(){this.internalOnDestroy()}onDestroy(){this.internalOnDestroy()}internalOnDestroy(){z.Current=this,ue.dispatchCallback(de.ContextDestroying,this),Hn(this,de.ContextDestroying),this.clear(),this.renderer?.setAnimationLoop(null),this.renderer&&(this.renderer.setClearAlpha(0),this.renderer.clear(),this.isManagedExternally||(Ye&&console.log("Disposing renderer"),this.renderer.dispose())),this.scene=null,this.renderer=null,this.input.dispose(),this.menu.onDestroy(),this.animations.onDestroy();for(const e of this._disposeCallbacks)try{e()}catch(t){console.error("Error in on dispose callback:",t,e)}this.domElement?.parentElement&&this.domElement.parentElement.removeChild(this.domElement),this._isCreated=!1,ue.dispatchCallback(de.ContextDestroyed,this),Hn(this,de.ContextDestroyed),ue.unregister(this),z.Current===this&&(z.Current=null)}registerCoroutineUpdate(e,t,i){return typeof t?.next!="function"?(console.error("Registered invalid coroutine function from "+e.name+`
795
- Coroutine functions must be generators: "*myCoroutine() {...}"
796
- Start a coroutine from a component by calling "this.startCoroutine(myCoroutine())"`),t):(this.coroutines[i]||(this.coroutines[i]=[]),this.coroutines[i].push({comp:e,main:t}),t)}unregisterCoroutineUpdate(e,t){if(!this.coroutines[t])return;const i=this.coroutines[t].findIndex(n=>n.main===e);i>=0&&this.coroutines[t].splice(i,1)}stopAllCoroutinesFrom(e){for(const t in this.coroutines){const i=this.coroutines[t];for(let n=i.length-1;n>=0;n--)i[n].comp===e&&i.splice(n,1)}}_cameraStack=[];setCurrentCamera(e){if(!e)return;if(e.threeCamera||e.buildCamera(),!e.threeCamera){console.warn("Camera component is missing camera",e);return}const t=this._cameraStack.indexOf(e);t>=0&&this._cameraStack.splice(t,1),this._cameraStack.push(e),this.mainCameraComponent=e;const i=e.threeCamera;i.isPerspectiveCamera&&this.updateAspect(i),this.mainCameraComponent?.applyClearFlagsIfIsActiveCamera()}removeCamera(e){if(!e)return;const t=this._cameraStack.indexOf(e);if(t>=0&&this._cameraStack.splice(t,1),this.mainCameraComponent===e&&(this.mainCameraComponent=void 0,this._cameraStack.length>0)){const i=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(i)}}_onBeforeRenderListeners=new Map;_onAfterRenderListeners=new Map;addBeforeRenderListener(e,t){if(!this._onBeforeRenderListeners.has(e.uuid)){const i=[];this._onBeforeRenderListeners.set(e.uuid,i),e.onBeforeRender=this._createRenderCallbackWrapper(i)}this._onBeforeRenderListeners.get(e.uuid).push(t)}removeBeforeRenderListener(e,t){if(this._onBeforeRenderListeners.has(e.uuid)){const i=this._onBeforeRenderListeners.get(e.uuid),n=i.indexOf(t);n>=0&&i.splice(n,1)}}addAfterRenderListener(e,t){if(!this._onAfterRenderListeners.has(e.uuid)){const i=[];this._onAfterRenderListeners.set(e.uuid,i),e.onAfterRender=this._createRenderCallbackWrapper(i)}this._onAfterRenderListeners.get(e.uuid)?.push(t)}removeAfterRenderListener(e,t){if(this._onAfterRenderListeners.has(e.uuid)){const i=this._onAfterRenderListeners.get(e.uuid),n=i.indexOf(t);n>=0&&i.splice(n,1)}}_createRenderCallbackWrapper(e){return(t,i,n,s,r,a)=>{for(let l=0;l<e.length;l++){const c=e[l];c(t,i,n,s,r,a)}}}_requireDepthTexture=!1;_requireColorTexture=!1;_renderTarget;_isRendering=!1;get isRendering(){return this._isRendering}setRequireDepth(e){this._requireDepthTexture=e}setRequireColor(e){this._requireColorTexture=e}get depthTexture(){return this._renderTarget?.depthTexture||null}get opaqueColorTexture(){return this._renderTarget?.texture||null}get isVisibleToUser(){if(this.isInXR)return!0;if(!this._isVisible)return!1;if(!this._needsVisibleUpdate&&this._lastStyleComputedResult!==void 0)return this._lastStyleComputedResult;this._needsVisibleUpdate=!1;const e=getComputedStyle(this.domElement);return this._lastStyleComputedResult=e.visibility!=="hidden"&&e.display!=="none"&&e.opacity!=="0",this._lastStyleComputedResult}_needsVisibleUpdate=!0;_lastStyleComputedResult=void 0;_createId=0;async internalOnCreate(e){const t=++this._createId;Ye&&console.log("Creating context",this.name,e);const i=globalThis["needle:dependencies:ready"];i instanceof Promise&&(Ye&&console.log("Waiting for dependencies to be ready"),await i.catch(h=>{if(Ye||A()){if(lc("Needle Engine dependencies failed to load. Please check the console for more details"),h instanceof ReferenceError){let d="YourComponentName";const p=h.message.indexOf("'");if(p>0){const m=h.message.indexOf("'",p+1);if(m>0){const f=h.message.substring(p+1,m);f.length>3&&(d=f)}}console.error(`Needle Engine dependencies failed to load:
797
-
798
- # Make sure you don't have circular imports in your scripts!
799
-
800
- Possible solutions:
801
- \u2192 Replace @serializable(${d}) in your script with @serializable(Behaviour)
802
- \u2192 If you only need type information try importing the type only, e.g: import { type ${d} }
803
-
804
- ---`,h);return}console.error("Needle Engine dependencies failed to load",h)}}).then(()=>{Ye&&console.log("Needle Engine dependencies are ready")})),this.clear();const n=this.renderer,s=!n||n.isDisposed===!0;this.isManagedExternally===!1&&s?this.createNewRenderer():this.lodsManager.setRenderer(this.renderer),this.renderer?.setAnimationLoop(null),z.Current=this,await ue.dispatchCallback(de.ContextCreationStart,this);let r=!0,a;try{z.Current=this,e?a=await this.internalLoadInitialContent(t,e):a=[]}catch(h){console.error(h),r=!1}if(!r)return this.onError("Failed to load initial content"),!1;if(t!==this._createId||e?.abortSignal?.aborted)return!1;if(this.internalOnUpdateVisible(),!this.renderer)return Ye&&console.warn("Context has no renderer (perhaps it was disconnected?",this.domElement.isConnected),!1;!this.isManagedExternally&&!this.domElement.shadowRoot&&this.domElement.prepend(this.renderer.domElement),z.Current=this,z.Current=this;for(let h=0;h<this.new_scripts.length;h++){const d=this.new_scripts[h];if(d.gameObject!==void 0&&d.gameObject!==null){d.gameObject.userData===void 0&&(d.gameObject.userData={}),d.gameObject.userData.components===void 0&&(d.gameObject.userData.components=[]);const p=d.gameObject.userData.components;p.includes(d)||p.push(d)}}if(this.post_setup_callbacks)for(let h=0;h<this.post_setup_callbacks.length;h++)z.Current=this,await this.post_setup_callbacks[h](this);if(!this._mainCamera){z.Current=this;let h=null;Er(this.scene,d=>{const p=d;if(p?.isCamera){if(wc(p.gameObject),!p.activeAndEnabled)return;if(p.tag==="MainCamera")return h=p,!0;h=p}}),h?this.setCurrentCamera(h):!ue.dispatchCallback(de.MissingCamera,this,{files:a})&&!this.mainCamera&&!this.isManagedExternally&&console.warn("Missing camera in main scene",this)}this.input.bindEvents(),z.Current=this,Jd(this),this.physics.engine&&(this.physics.engine?.step(0),this.physics.engine?.postStep()),!this.isManagedExternally&&this.composer&&this.mainCamera,this._needsUpdateSize=!0,this._stats&&(this._stats.showPanel(0),this._stats.dom.style.position="absolute",this.domElement.shadowRoot?.appendChild(this._stats.dom)),Ye&&Dd(this.scene,!0),this.targetFrameRate===void 0?(Ye&&console.warn("No target framerate set, using default",z.DefaultTargetFrameRate),this.targetFrameRate=z._defaultTargetFramerate):Ye&&console.log("Target framerate set to",this.targetFrameRate),this._dispatchReadyAfterFrame=!0;const l=ue.dispatchCallback(de.ContextCreated,this,{files:a});if(l){const h=this.domElement;"internalSetLoadingMessage"in h&&typeof h.internalSetLoadingMessage=="function"&&h?.internalSetLoadingMessage("finish loading"),await l}if(e?.abortSignal?.aborted)return!1;const c=this.rootSourceId;return c&&this.sceneLighting.enable(c),Hn(this,de.ContextCreated),Ye&&console.log("Context Created...",this.renderer,this.renderer.domElement),this._isCreating=!1,!this.isManagedExternally&&!e?.abortSignal?.aborted&&this.restartRenderLoop(),!0}rootSceneSourceIdentifiers=[];async internalLoadInitialContent(e,t){this.rootSceneSourceIdentifiers.length=0;const i=new Array;if(t.files.length===0)return i;const n=[...t.files];this.rootSceneSourceIdentifiers.push(...n);const s={name:"",progress:null,index:0,count:n.length},r=_n(),a=0;for(let l=0;l<n.length;l++){if(t.abortSignal?.aborted){Ye&&console.log("Aborting loading because of abort signal");break}if(e!==this._createId){Ye&&console.log("Aborting loading because create id changed",e,this._createId);break}const c=n[l];t?.onLoadingStart?.call(this,l,c),Ye&&console.log("Context Load "+c);const h=await r.loadSync(this,c,c,a,d=>{t.abortSignal?.aborted||(s.name=c,s.progress=d,s.index=l,s.count=n.length,t.onLoadingProgress?.call(this,s))});t?.onLoadingFinished?.call(this,l,c,h??null),h?i.push({src:c,file:h}):console.warn("Could not load file: "+c)}if(e!==this._createId||t.abortSignal?.aborted){Ye&&console.log("Aborting loading because create id changed or abort signal was set",e,this._createId);for(const l of i)if(l&&l.file)for(const c of l.file.scenes)Zi(c,!0,!0)}else{let l=!1;for(const c of i)c&&c.file&&(c.file.scene?(l=!0,this.scene.add(c.file.scene)):console.warn("No scene found in loaded file"));if(!l){for(const c of i)if(c&&c.file&&"parser"in c.file){let h=0;if(!Array.isArray(c.file.parser.json.materials))continue;for(let d=0;d<c.file.parser.json.materials.length;d++){const p=await c.file.parser.getDependency("material",d),m=new k;m.position.x=d*1.1,m.position.y=h,this.scene.add(m),Sr.createPrimitive("ShaderBall",{parent:m,material:p})}h+=1}}}return i}restartRenderLoop(){return this.renderer?this._isCreating?(console.warn("Can not start render loop while creating context"),!1):(this.renderer.setAnimationLoop((e,t)=>{this.isManagedExternally||this.update(e,t)}),!0):(console.error("Can not start render loop without renderer"),!1)}_renderlooperrors=0;update(e,t){if(t===void 0&&(t=null),A()||Ye||wk())try{this.internalStep(e,t),this._renderlooperrors=0}catch(i){this._renderlooperrors+=1,(A()||Ye)&&(i instanceof Error||i instanceof TypeError)&&Te("Caught unhandled exception during render-loop - see console for details.",ki.Error),console.error("Frame #"+this.time.frame+`
805
- `,i),this._renderlooperrors>=3&&(console.warn("Stopping render loop due to error"),this.renderer.setAnimationLoop(null)),this.domElement.dispatchEvent(new CustomEvent("error",{detail:i}))}else this.internalStep(e,t)}updatePhysics(e){this.internalUpdatePhysics(e)}setCameraFocusRect(e,t){const i=this._focusRect;if(this._focusRect=e,t&&Object.assign(this.focusRectSettings,t),t?.damping===void 0&&i){let n=i;i instanceof HTMLElement&&(n=i.getBoundingClientRect()),n&&"top"in n&&n.bottom>=-100&&n.right>=-100&&n.top<=window.innerHeight+100&&n.left<=window.innerWidth+100&&(this.focusRectSettings.damping=.2)}}get focusRect(){return this._focusRect}get focusRectSize(){const e=this._focusRect;if(e&&(e instanceof DOMRect||"width"in e&&"height"in e&&"x"in e&&"y"in e))return{x:e.x,y:e.y,width:e.width,height:e.height};if(e instanceof HTMLElement){const t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height}}return null}focusRectSettings={damping:0,zoom:1,offsetX:0,offsetY:0};_focusRect=null;_lastTimestamp=0;_accumulatedTime=0;_dispatchReadyAfterFrame=!1;internalStep(e,t){this.internalOnBeforeRender(e,t)!==!1&&(this.internalOnRender(),this.internalOnAfterRender())}internalOnBeforeRender(e,t){this.renderer.info.autoReset=!!t,this.renderer.info.autoReset===!1&&this.renderer.info.reset(),this._needsVisibleUpdate=!0;const i=t!==null&&this._xrFrame===null;if(this._xrFrame=t,i&&this.domElement.dispatchEvent(new CustomEvent("xr-session-started",{detail:{context:this,session:this.xrSession,frame:t}})),this._currentFrameEvent=-1,this.isManagedExternally===!1&&this.isInXR===!1&&this.targetFrameRate!==void 0){this._lastTimestamp===0&&(this._lastTimestamp=e),this._accumulatedTime+=(e-this._lastTimestamp)/1e3,this._lastTimestamp=e;let n=this.targetFrameRate;if(typeof n=="object"&&(n=n.value),this._accumulatedTime<1/(n+1))return!1;this._accumulatedTime=0}if(this._stats?.begin(),z.Current=this,this.onHandlePaused())return!1;for(z.Current=this,this.time.update(),EM&&console.log("FPS",this.time.smoothedFps.toFixed(0)),Jd(this),eu(this.scene),av(this),Hn(this,-1);this._cameraStack.length>0&&(!this.mainCameraComponent||this.mainCameraComponent.destroyed);){this._cameraStack.splice(this._cameraStack.length-1,1);const n=this._cameraStack[this._cameraStack.length-1];this.setCurrentCamera(n)}if(this.pre_update_oneshot_callbacks){for(const n in this.pre_update_oneshot_callbacks)this.pre_update_oneshot_callbacks[n]();this.pre_update_oneshot_callbacks.length=0}if(this.pre_update_callbacks)for(const n in this.pre_update_callbacks)this.pre_update_callbacks[n]();this._currentFrameEvent=0;for(let n=0;n<this.scripts_earlyUpdate.length;n++){const s=this.scripts_earlyUpdate[n];s.activeAndEnabled&&s.earlyUpdate!==void 0&&(z.Current=this,s.earlyUpdate())}this.executeCoroutines(0),Hn(this,0),this._currentFrameEvent=1;for(let n=0;n<this.scripts_update.length;n++){const s=this.scripts_update[n];s.activeAndEnabled&&s.update!==void 0&&(z.Current=this,s.update())}this.executeCoroutines(1),Hn(this,1),this._currentFrameEvent=2;for(let n=0;n<this.scripts_lateUpdate.length;n++){const s=this.scripts_lateUpdate[n];s.activeAndEnabled&&s.lateUpdate!==void 0&&(z.Current=this,s.lateUpdate())}if(this.executeCoroutines(2),Hn(this,2),this.physicsSteps===void 0&&(this.physicsSteps=1),this.physics.engine&&this.physicsSteps>0&&this.internalUpdatePhysics(this.physicsSteps),this.isVisibleToUser||this.runInBackground){this._currentFrameEvent=3;for(let n=0;n<this.scripts_onBeforeRender.length;n++){const s=this.scripts_onBeforeRender[n];s.activeAndEnabled&&s.onBeforeRender!==void 0&&(z.Current=this,s.onBeforeRender(t))}if(this.executeCoroutines(3),Hn(this,3),this._needsUpdateSize&&this.updateSize(),this.pre_render_callbacks)for(const n in this.pre_render_callbacks)this.pre_render_callbacks[n](t);if(this._focusRect&&this.mainCamera instanceof re){const n=this.focusRectSettings,s=n.damping>0?this.time.deltaTime/n.damping:1;tO(this._focusRect,this.focusRectSettings,s,this.mainCamera,this.renderer)}}return!0}internalUpdatePhysics(e){if(!this.physics.engine)return!1;const t=e,i=this.time.deltaTime/t;for(let n=0;n<t;n++)this._currentFrameEvent=9,this.executeCoroutines(9),this.physics.engine.step(i),this._currentFrameEvent=10,this.executeCoroutines(10);return this.physics.engine.postStep(),!0}internalOnRender(){this.isManagedExternally||(Pk(this),this._currentFrameEvent=-1,yb.camera=this.mainCamera,yb.update(),this.renderNow(),this._currentFrameEvent=4)}internalOnAfterRender(){if(this.isVisibleToUser||this.runInBackground){for(let e=0;e<this.scripts_onAfterRender.length;e++){const t=this.scripts_onAfterRender[e];t.activeAndEnabled&&t.onAfterRender!==void 0&&(z.Current=this,t.onAfterRender())}if(this.executeCoroutines(4),Hn(this,4),this.post_render_callbacks)for(const e in this.post_render_callbacks)this.post_render_callbacks[e]()}if(this._currentFrameEvent=-1,this.connection.sendBufferedMessagesNow(),this._stats){this._stats.end();const e=this.time.fps<20?50:150;this.time.frameCount%e===0&&console.log(this.renderer.info.render.calls+" DrawCalls",`
806
- Render:`,{...this.renderer.info.render},`
807
- Memory:`,{...this.renderer.info.memory},`
808
- Target Framerate: `+this.targetFrameRate)}this._dispatchReadyAfterFrame&&(this._dispatchReadyAfterFrame=!1,this.domElement.dispatchEvent(new CustomEvent("ready")),ue.dispatchCallback(de.ContextFirstFrameRendered,this))}_tempClearColor=new ne;_tempClearColor2=new ne;renderNow(e){if(!e&&(e=this.mainCamera,!e))return!1;if(this.handleRendererContextLost(),this._isRendering=!0,this.renderRequiredTextures(),this.renderer.toneMapping!==Sd&&rw(),this.composer&&!this.isInXR){e&&"setMainCamera"in this.composer&&this.composer.passes[0]?.mainCamera!=e&&this.composer.setMainCamera(e);const t=this.renderer.getClearColor(this._tempClearColor),i=this.renderer.getClearAlpha();this._tempClearColor2.copy(t),this.renderer.setClearColor(t.convertSRGBToLinear(),this.renderer.getClearAlpha()),this.composer.render(this.time.deltaTime),this.renderer.setClearColor(this._tempClearColor2,i)}else e&&(this.isInXR&&q.isMacOS()&&this.renderer.clearDepth(),this.renderer.render(this.scene,e));return this._isRendering=!1,!0}_contextRestoreTries=0;handleRendererContextLost(){this.time.frame%10&&this.renderer.getContext().isContextLost()&&this._contextRestoreTries++<100&&(console.warn("Attempting to recover WebGL context..."),this.renderer.forceContextRestore())}_wasPaused=!1;onHandlePaused(){const e=this.evaluatePaused();if(this._wasPaused!==e){TM&&console.log("Paused?",e,"context:"+this.alias);for(let t=0;t<this.scripts_pausedChanged.length;t++){const i=this.scripts_pausedChanged[t];i.activeAndEnabled&&i.onPausedChanged!==void 0&&(z.Current=this,i.onPausedChanged(e,this._wasPaused))}}return this._wasPaused=e,e}evaluatePaused(){return this.isInXR?!1:this.isPaused?!0:this.runInBackground?!1:!this.isVisibleToUser}renderRequiredTextures(){if(!this.mainCamera||!this._requireDepthTexture&&!this._requireColorTexture)return;if(!this._renderTarget){if(this._renderTarget=new Vn(this.domWidth,this.domHeight),this._requireDepthTexture){const i=new ob(this.domWidth,this.domHeight);this._renderTarget.depthTexture=i}this._requireColorTexture&&(this._renderTarget.texture=new Le,this._renderTarget.texture.generateMipmaps=!1,this._renderTarget.texture.minFilter=Cd,this._renderTarget.texture.magFilter=Cd,this._renderTarget.texture.format=vd)}const e=this._renderTarget;e.texture&&(e.texture.colorSpace=this.renderer.outputColorSpace);const t=this.renderer.getRenderTarget();this.renderer.setRenderTarget(e),this.renderer.render(this.scene,this.mainCamera),this.renderer.setRenderTarget(t)}executeCoroutines(e){if(this.coroutines[e]){const i=this.coroutines[e];for(let n=0;n<i.length;n++)try{const s=i[n];if(!s.comp||s.comp.destroyed||!s.main||s.comp.enabled===!1){AM&&console.log("Removing coroutine",s.comp,s.comp.enabled),i.splice(n,1),--n;continue}const r=s.chained;if(r&&r.length>0){const c=r[r.length-1].next();if(c.done&&r.pop(),t(c)&&(s.chained||(s.chained=[]),s.chained.push(c.value)),!c.done)continue}const a=s.main.next();if(a.done===!0){i.splice(n,1),--n;continue}const l=a.value;if(t(l)){if(l.next().done)continue;s.chained||(s.chained=[]),s.chained.push(l)}else if(l instanceof Promise){const c=l;s.chained||(s.chained=[]);const h=Qv(c);s.chained?.push(h);continue}}catch(s){console.error(s)}}function t(i){return!!(i&&i.next&&i.return)}}}const Ri=v("debuglicense"),gw=[];let Xn="basic";Ri&&console.log("License Type: "+Xn);function Qn(){switch(Xn){case"pro":case"enterprise":return!0}return!1}function Ac(){switch(Xn){case"indie":return!0}return!1}function af(){switch(Xn){case"edu":return!0}return!1}function Io(){return Qn()||Ac()||af()}function jM(o){if(Qn()||Ac()||af())return o(!0);gw.push(o)}function xu(o){for(const e of gw)try{e(o)}catch{}}ue.registerCallback(de.ContextRegistered,o=>{FM(o.context),BM(o.context),setTimeout(()=>zM(o.context),2e3)});let Su,lf=!1,cf="";async function DM(){if(Su)return Su;if(Xn==="basic")try{const o="https://engine.needle.tools/licensing/check?location="+encodeURIComponent(window.location.href)+"&version="+bn+"&generator="+encodeURIComponent(Fd),e=await fetch(o,{method:"GET"}).catch(t=>{Ri&&console.error("License check failed",t)});e?.status===200?(lf=!1,Ri&&console.log("License check succeeded"),Xn="pro",xu(!0)):e?.status===403?(xu(!1),lf=!0,cf=await e.text()):(xu(!1),Ri&&console.log("License check failed with status "+e?.status))}catch(o){xu(!1),Ri&&console.error("License check failed",o)}else Ri&&console.log('Runtime license check is skipped because license is already applied as "'+Xn+'"')}Su=DM();async function BM(o){function e(){const n=document.createElement("div");n.className="needle-forbidden",n.style.cssText=`
809
- position: fixed;
810
- top: 0;
811
- left: 0;
812
- width: 100%;
813
- height: 100%;
814
- pointer-events: all;
815
- zIndex: 2147483647;
816
- line-height: 1.5;
817
- backdrop-filter: blur(15px);
818
- -webkit-backdrop-filter: blur(15px);
819
- `;const s=n.style.cssText,r=document.createElement("div");n.appendChild(r),r.style.cssText=`
820
- position: absolute;
821
- left: 0;
822
- right: 0;
823
- top:0;
824
- bottom: 0;
825
- padding: 10%;
826
- color: white;
827
- font-size: 20px;
828
- font-family: sans-serif;
829
- text-align: center;
830
- pointer-events: all;
831
- display: flex;
832
- justify-content: center;
833
- align-items: center;
834
- background-color: rgba(0,0,0,.3);
835
- text-shadow: 0 0 2px black;
836
- `;const a=r.style.cssText,l=cf?.length>1?cf:"This web application has been paused.<br/>You might be in violation of the Needle Engine terms of use.<br/>Please contact the Needle support if you think this is a mistake.";return r.innerHTML=l,setInterval(()=>{r.innerHTML!==l&&(r.innerHTML=l),r.parentNode!==n&&n.appendChild(r),n.style.cssText!==s&&(n.style.cssText=s),r.style.cssText!==a&&(r.style.cssText=a)},500),n}let t=e();const i=t.style.cssText;setInterval(()=>{lf===!0&&(t.style.cssText!==i&&(t=e()),o.domElement.shadowRoot?t.parentNode!==o.domElement.shadowRoot&&o.domElement.shadowRoot?.appendChild(t):t.parentNode!=document.body&&document.body.appendChild(t))},500)}async function FM(o){try{if(!Qn()&&!Ac())return hf(o)}catch(e){return Ri&&console.log("License check failed",e),hf(o)}Ri&&hf(o)}async function hf(o){let e=!1;o.domElement.addEventListener("ready",()=>e=!0),await Su?.catch(()=>{}),!(Qn()||Ac())&&(Io()===!1&&UM(),e?df(o):o.domElement.addEventListener("ready",()=>{df(o)}))}function df(o){const e=`
837
- position: relative;
838
- display: block;
839
- background-size: 20px;
840
- background-position: 10px 5px;
841
- background-repeat:no-repeat;
842
- background-image:url('${fw}');
843
- background-max-size: 40px;
844
- padding: 10px;
845
- padding-left: 30px;
846
- `;if(Xn==="edu")console.log("%c This project is supported by Needle for Education \u2013 https://needle.tools",e);else return;const t=document.createElement("div");t.className="needle-non-commercial-use",t.innerHTML="Made with Needle for Education",o.domElement.shadowRoot?.appendChild(t);let i=`
847
- position: absolute;
848
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
849
- font-size: 12px;
850
- color: rgb(100, 100, 100);
851
- /*mix-blend-mode: difference;*/
852
- background-color: transparent;
853
- z-index: 10000;
854
-
855
- cursor: pointer;
856
- user-select: none;
857
- opacity: 0;
858
-
859
- bottom: 6px;
860
- right: 12px;
861
- transform: translateY(0px);
862
- transition: all .5s ease-in-out 1s;
863
- `;t.style.cssText=i,t.addEventListener("click",()=>{window.open("https://needle.tools","_blank")});let n=t.style.cssText;setTimeout(()=>{i=i.replace("opacity: 0","opacity: 1"),i=i.replace("transform: translateY(10px)","transform: translateY(0)"),t.style.cssText=i,n=t.style.cssText},100);const s=setInterval(()=>{const r=o.domElement.shadowRoot||o.domElement;t.parentNode!==r&&r.appendChild(t),n!=t.style.cssText&&(t.style.cssText=i,n=t.style.cssText)},1e3);af()&&setTimeout(()=>{clearInterval(s),t?.remove(),setTimeout(()=>{o.domElement.parentNode&&df(o)},1e3*60*5)},2e4)}const fw="data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";let yw=0;async function UM(o){const e=Date.now();if(e-yw<2e3)return;yw=e;const t=`
864
- position: relative;
865
- display: block;
866
- font-size: 18px;
867
- background-size: 20px;
868
- background-position: 10px 5px;
869
- background-repeat:no-repeat;
870
- background-image:url('${fw}');
871
- background-max-size: 40px;
872
- margin-bottom: 5px;
873
- margin-top: .3em;
874
- margin-bottom: .5em;
875
- padding: .2em;
876
- padding-left: 25px;
877
- border-radius: .5em;
878
- border: 2px solid rgba(160,160,160,.3);
879
- `,i=`Needle Engine \u2014 No license active, commercial use is not allowed. Visit https://needle.tools/pricing for more information and licensing options! v${bn}`;z.Current?.xr?console.log(i):console.log("%c "+i,t)}async function zM(o){if(window.crossOriginIsolated)return;const e=Xn;if(e==="pro"||e==="enterprise"){const t=o?.domElement?.getAttribute("no-telemetry");if(t===""||t==="true"||t==="1"){Ri&&console.debug("Telemetry is disabled");return}Ri&&console.debug("Telemetry attribute: "+t)}try{const t="https://needle.tools/api/v1/analytics";if(t){const i=window.location.href.split("?")[0];let n="api/v2/new/request";t.endsWith("/")||(n="/"+n);const s=Xn,r=`${t}${n}`;Ri&&console.debug("Sending beacon");const a={license:s,url:i,hostname:window.location.hostname,pathname:window.location.pathname,version:bn,generator:Fd,build_time:sg,public_key:Ia},l=navigator.sendBeacon?.(r,JSON.stringify(a));Ri&&console.debug("Sent beacon: "+l)}}catch(t){Ri&&console.log("Failed to send non-commercial usage message to analytics backend",t)}}function bw(o,e){return To(o,de.ContextCreated,e),()=>ys(o,de.ContextCreated)}function NM(o,e){return To(o,de.ContextClearing,e),()=>ys(o,de.ContextClearing)}function VM(o,e){return To(o,de.ContextDestroying,e),()=>ys(o,de.ContextDestroying)}function Cu(o,e){return To(o,we.Start,e),()=>ys(o,we.Start)}function _w(o,e){return To(o,we.Update,e),()=>ys(o,we.Update)}function WM(o,e){return To(o,we.OnBeforeRender,e),()=>ys(o,we.OnBeforeRender)}function $M(o,e){return To(o,we.OnAfterRender,e),()=>ys(o,we.OnAfterRender)}const HM=v("debugdecoders");let uf=null;function vw(){if(!uf){const o=Om(null);uf={dracoLoader:o.dracoLoader,ktx2Loader:o.ktx2Loader,meshoptDecoder:o.meshoptDecoder}}return uf}function ww(o){o!==void 0&&typeof o=="string"&&NC(o)}function xw(o){if(o!==void 0&&typeof o=="string"&&o!=="js"){const e=vw();HM&&console.log("Setting draco decoder type to",o),e.dracoLoader.setDecoderConfig({type:o})}}function Sw(o){o!==void 0&&typeof o=="string"&&zC(o)}function pf(o,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"),FC(o),o.dracoLoader||o.setDRACOLoader(t.dracoLoader),o.ktx2Loader||o.setKTX2Loader(t.ktx2Loader),o.meshoptDecoder||o.setMeshoptDecoder(t.meshoptDecoder),UC(o,{progressive:!0}),o}const qe=function(o){return u(o)},u=function(o){if(o===void 0&&(o=null),!Array.isArray(o))o=Cw(o);else for(let e=0;e<o.length;e++){const t=o[e];o[e]=Cw(t)}return function(e,t){if(!e){const n=typeof t=="string"?t:t.name;console.warn(`@serializable without a target at '${n}'.`);return}typeof t!="string"&&(t=t.name),Object.getOwnPropertyDescriptor(e,"$serializedTypes")||(e.$serializedTypes={});const i=e.$serializedTypes=e.$serializedTypes||{};i[t]=o}};function Cw(o){switch(o?.prototype?.constructor?.name){case"Number":case"String":case"Boolean":return null}return o}const xs=v("debughotreload");let Ic=!1;const Lc=new Map;function GM(){return Ic}function mf(){return globalThis.NEEDLE_HOT_RELOAD_ENABLED===!0}function Pw(o){if(Ic){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not registering instance",o);return}xs&&console.log("[Needle Engine] Registering hot reload instance",o);const e=o.constructor.name;Lc.has(e)?Lc.get(e)?.push(o):Lc.set(e,[o])}function Ow(o){if(Ic){xs&&console.warn("[Needle Engine] Hot reloading is in progress, not unregistering instance",o);return}xs&&console.log("[Needle Engine] Unregistering hot reload instance",o);const e=o.constructor.name,t=Lc.get(e);if(!t)return;const i=t.indexOf(o);i!==-1&&t.splice(i,1)}let kw=!1;function qM(){if(xs||kw)return;kw=!0;const o=console.error;console.error=(...e)=>{if(e.length){const t=e[0];if(typeof t=="string"&&t.includes("[hmr] Failed to reload ")){console.log("[Needle Engine] Hot reloading failed"),window.location.reload();return}}o.apply(console,e)}}function XM(o){xs&&console.log("[HMR] Apply changes",o,Object.keys(o)),qM();for(const e of Object.keys(o))try{Ic=!0;const t=C.get(e);if(!t){xs&&console.log("[HMR] Type not found: "+e);continue}const i=o[e],n=Lc.get(i.name);let s="[Needle Engine] Updating type: "+e;const r=n?.length??-1;r>0?s+=" x"+r:s+=" (No instances registered)",console.log(s);const a=Object.getOwnPropertyNames(t.prototype),l=Object.getOwnPropertyDescriptors(i.prototype);for(const c in l)l[c].writable&&(t.prototype[c]=o[e].prototype[c]);for(const c of a)l[c]||delete t.prototype[c];if(n){const c=new i,h=Object.getOwnPropertyDescriptors(c);for(const d of n){const p=d,m=p.isComponent===!0,f=m?p.activeAndEnabled:!0,g=m?p.context:void 0;try{if(m&&g&&Eo(p,g),m&&f&&(p.enabled=!1),d.onBeforeHotReloadFields&&d.onBeforeHotReloadFields()===!1)continue;for(const y in h)if(h[y].writable){if(d[y]===void 0)d[y]=c[y];else if(typeof d[y]=="function"&&!d[y].prototype){const _=d[y],w=_.name,P="bound ";if(w===P)continue;const M=_.name.substring(P.length),O=i.prototype[M];O&&(d[y]=O.bind(d))}}d.onAfterHotReloadFields&&d.onAfterHotReloadFields()}finally{m&&g&&Tg(p,g),m&&f&&(p.enabled=!0)}}}}catch(t){if(xs)console.error(t);else return!1}finally{Ic=!1,pr(ki.Log,"Script changes applied (HMR)")}return!0}class x extends k{guid;static isDestroyed(e){return Tr(e)}static setActive(e,t,i=!0){e&&(Mc(e,t),eu(e),t&&i&&av(z.Current,e))}static isActiveSelf(e){return Ha(e)}static isActiveInHierarchy(e){return Uv(e)}static markAsInstancedRendered(e,t){zv(e,t)}static isUsingInstancing(e){return cu(e)}static foreachComponent(e,t,i=!0){return Er(e,t,i)}static instantiateSynced(e,t){return e?Bg(e,t):null}static instantiate(e,t=null){return"isAssetReference"in e,qa(e,t)}static destroySynced(e,t,i=!0){if(!e)return;const n=e;t=t??z.Current,xc(n,t.connection,i)}static destroy(e,t=!0){return Zi(e,t)}static add(e,t,i){if(!(!e||!t)){if(e===t){console.warn("Can not add object to self",e);return}i||(i=z.Current),t.add(e),Mc(e,!0),eu(e),i?x.foreachComponent(e,n=>{Tg(n,i),!n.__internalDidAwakeAndStart&&i.new_script_start.includes(n)===!1&&i.new_script_start.push(n)},!0):console.warn("Missing context")}}static remove(e){e&&(e.parent?.remove(e),Mc(e,!1),eu(e),x.foreachComponent(e,t=>{xk(t)},!0))}static invokeOnChildren(e,t,...i){this.invoke(e,t,!0,i)}static invoke(e,t,i=!1,...n){e&&this.foreachComponent(e,s=>{const r=s[t];r&&typeof r=="function"&&r?.call(s,...n)},i)}static addNewComponent(e,t,i,n=!0){return Sn(e,t,i,{callAwake:n})}static addComponent(e,t,i,n){return Sn(e,t,i,n)}static moveComponent(e,t){return Sn(e,t)}static removeComponent(e){return qg(e.gameObject,e),e}static getOrAddComponent(e,t){return Cc(e,t)}static getComponent(e,t){return e===null?null:Mr(e,t)}static getComponents(e,t,i=null){return e===null?i??[]:Pc(e,t,i)}static findByGuid(e,t){return Xg(e,t)}static findObjectOfType(e,t,i=!0){return $a(e,t??z.Current,i)}static findObjectsOfType(e,t){const i=[];return Fv(e,i,t),i}static getComponentInChildren(e,t){return Oc(e,t)}static getComponentsInChildren(e,t,i=null){return Wa(e,t,i??void 0)}static getComponentInParent(e,t){return kc(e,t)}static getComponentsInParent(e,t,i=null){return ru(e,t,i)}static getAllComponents(e){const t=e.userData?.components;return t?[...t]:[]}static*iterateComponents(e){const t=e?.userData?.components;if(t&&Array.isArray(t))for(let i=0;i<t.length;i++)yield t[i]}}const QM=Symbol("component-name");class R{get isComponent(){return!0}get[QM](){return C.getKey(this.constructor)||void 0}__context;get context(){return this.__context??z.Current}set context(e){this.__context=e}get scene(){return this.context.scene}get layer(){return this.gameObject?.userData?.layer}get name(){return this.gameObject?.name?this.gameObject.name:this.gameObject?.userData.name}__name;set name(e){this.gameObject?(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.name=e,this.__name=e):this.__name=e}get tag(){return this.gameObject?.userData.tag}set tag(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.tag=e)}get static(){return this.gameObject?.userData.static}set static(e){this.gameObject&&(this.gameObject.userData||(this.gameObject.userData={}),this.gameObject.userData.static=e)}get activeAndEnabled(){return!(this.destroyed||this.__isEnabled===!1||!this.__isActiveInHierarchy)}get __isActive(){return this.gameObject.visible}get __isActiveInHierarchy(){if(!this.gameObject)return!1;const e=this.gameObject[ko];return e===void 0?!0:e}set __isActiveInHierarchy(e){this.gameObject&&(this.gameObject[ko]=e)}gameObject;guid="invalid";sourceId;awake(){}onEnable(){}onDisable(){}onDestroy(){this.__destroyed=!0}startCoroutine(e,t=we.Update){return this.context.registerCoroutineUpdate(this,e,t)}stopCoroutine(e,t=we.Update){this.context.unregisterCoroutineUpdate(e,t)}get destroyed(){return this.__destroyed}destroy(){this.__destroyed||this.__internalDestroy()}__didAwake=!1;__didStart=!1;__didEnable=!1;__isEnabled=void 0;__destroyed=!1;get __internalDidAwakeAndStart(){return this.__didAwake&&this.__didStart}constructor(e){this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),mf()&&Pw(this)}__internalNewInstanceCreated(e){return this.__didAwake=!1,this.__didStart=!1,this.__didEnable=!1,this.__isEnabled=void 0,this.__destroyed=!1,this._internalInit(e),this}_internalInit(e){if(typeof e=="object")for(const t of Object.keys(e)){const i=e[t];typeof i!="function"&&(this[t]=i)}}__internalAwake(){this.__didAwake||(this.__didAwake=!0,this.awake())}__internalStart(){this.__didStart||(this.__didStart=!0,this.start&&this.start())}__internalEnable(e){return this.__destroyed?(A()&&console.warn("[Needle Engine Dev] Trying to enable destroyed component"),!1):this.__didAwake?this.__didEnable?(e!==!0&&(this.__isEnabled=!0),!1):(this.__didEnable=!0,this.__isEnabled=!0,this.onEnable(),!0):!1}__internalDisable(e){if(this.__didAwake){if(!this.__didEnable){e!==!0&&(this.__isEnabled=!1);return}this.__didEnable=!1,this.__isEnabled=!1,this.onDisable()}}__internalDestroy(){this.__destroyed||(this.__destroyed=!0,this.__didAwake&&(this.onDestroy?.call(this),this.dispatchEvent(new CustomEvent("destroyed",{detail:this}))),jv(this),mf()&&Ow(this))}get enabled(){return typeof this.__isEnabled=="boolean"?this.__isEnabled:!0}set enabled(e){if(this.__destroyed){A()&&console.warn(`[Needle Engine Dev] Trying to ${e?"enable":"disable"} destroyed component`);return}if(typeof e=="number"&&(e>=.5?e=!0:e=!1),!this.__didAwake){this.__isEnabled=e;return}e?this.__internalEnable():this.__internalDisable()}get worldPosition(){return J(this.gameObject)}set worldPosition(e){gt(this.gameObject,e)}setWorldPosition(e,t,i){mr(this.gameObject,e,t,i)}get worldQuaternion(){return be(this.gameObject)}set worldQuaternion(e){yn(this.gameObject,e)}setWorldQuaternion(e,t,i,n){Zm(this.gameObject,e,t,i,n)}get worldEuler(){return Km(this.gameObject)}set worldEuler(e){Jm(this.gameObject,e)}get worldRotation(){return this.gameObject.worldRotation}set worldRotation(e){this.setWorldRotation(e.x,e.y,e.z,!0)}setWorldRotation(e,t,i,n=!0){sc(this.gameObject,e,t,i,n)}static _forward=new b;get forward(){return R._forward.set(0,0,-1).applyQuaternion(this.worldQuaternion)}static _right=new b;get right(){return R._right.set(1,0,0).applyQuaternion(this.worldQuaternion)}static _up=new b;get up(){return R._up.set(0,1,0).applyQuaternion(this.worldQuaternion)}_eventListeners=new Map;addEventListener(e,t){this._eventListeners[e]=this._eventListeners[e]||[],this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}dispatchEvent(e){if(!e||!this._eventListeners[e.type])return!1;const t=this._eventListeners[e.type];for(let i=0;i<t.length;i++)t[i](e);return!1}}const YM=Object.freeze(Object.defineProperty({__proto__:null,Behaviour:R,Component:R,GameObject:x},Symbol.toStringTag,{value:"Module"}));var ZM=Object.defineProperty,Mw=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ZM(e,t,n),n};class jc extends R{from;to;width=0;centered=!0;_centerPos;awake(){this._centerPos=new b}update(){if(!this.from||!this.to)return;const e=J(this.from).clone(),t=J(this.to).clone(),i=e.distanceTo(t);this._centerPos.copy(e),this._centerPos.add(t),this._centerPos.multiplyScalar(.5),gt(this.gameObject,this.centered?this._centerPos:e),this.gameObject.lookAt(J(this.to).clone()),this.gameObject.scale.set(this.width,this.width,i)}}Mw([u(x)],jc.prototype,"from"),Mw([u(x)],jc.prototype,"to");var KM=Object.defineProperty,JM=Object.getOwnPropertyDescriptor,Lr=(o,e,t,i)=>{for(var n=i>1?void 0:i?JM(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&KM(e,t,n),n};const Ss=v("debuganimation");let Rw=class{x;y};class Dt extends R{get isAnimationComponent(){return!0}addClip(e){this.animations||(this.animations=[]),this.animations.includes(e)||this.animations.push(e)}playAutomatically=!0;randomStartTime=!1;minMaxSpeed;minMaxOffsetNormalized;loop=!0;clampWhenFinished=!1;get time(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.time}return 0}set time(e){if(this.actions)for(const t of this.actions)t.time=e}get duration(){if(this.actions){for(const e of this.actions)if(e.isRunning())return e.getClip().duration}return 0}_tempAnimationClipBeforeGameObjectExisted=null;get clip(){return this.animations?.length?this.animations[0]:null}set clip(e){if(!this.__didAwake){Ss&&console.warn("Assign clip during serialization",e),this._tempAnimationClipBeforeGameObjectExisted=e;return}e&&(this.gameObject.animations||(this.gameObject.animations=[]),!this.animations.includes(e)&&(this.animations.length>0?this.animations.splice(0,0,e):this.animations.push(e)))}set clips(e){this.animations=e}_tempAnimationsArray;set animations(e){e==null||!Array.isArray(e)||(this.gameObject?this.gameObject.animations=e:this._tempAnimationsArray=e)}get animations(){return this.gameObject?.animations||this._tempAnimationsArray||[]}mixer=void 0;get actions(){return this._actions}set actions(e){this._actions=e}_actions;_handles;awake(){this.mixer=void 0,Ss&&console.log("Animation Awake",this.name,this),this._tempAnimationsArray&&(this.animations=this._tempAnimationsArray,this._tempAnimationsArray=void 0),this._tempAnimationClipBeforeGameObjectExisted&&(this.clip=this._tempAnimationClipBeforeGameObjectExisted,this._tempAnimationClipBeforeGameObjectExisted=null),this.actions=[],this._handles=[]}onEnable(){if(this.playAutomatically&&this.animations?.length>0){const e=Math.floor(Math.random()*this.animations.length),t=this.animations[e];this.play(e,{exclusive:!0,fadeDuration:0,startTime:this.randomStartTime?Math.random()*t.duration:0,loop:this.loop,clampWhenFinished:this.clampWhenFinished})}}update(){this.mixer&&(this.mixer.update(this.context.time.deltaTime),this._handles.forEach(e=>e.update()))}onDisable(){this.mixer&&this.mixer.stopAllAction()}onDestroy(){this.context.animations.unregisterAnimationMixer(this.mixer)}getAction(e){return this.actions?.find(t=>t.getClip().name===e)||null}get isPlaying(){if(this.actions){for(let e=0;e<this.actions.length;e++)if(this.actions[e].isRunning())return!0}return!1}stopAll(e){if(this.actions)for(const t of this.actions)e?.fadeDuration?t.fadeOut(e.fadeDuration):t.stop()}stop(e,t){if(e===void 0){this.stopAll();return}else if(typeof e=="number"){if(e>=this.animations.length){Ss&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}t?.fadeDuration?i.fadeOut(t.fadeDuration):i.stop()}pause(e,t=!1){if(e===void 0){for(const n of this.actions)n.paused=!t;return}else if(typeof e=="number"){if(e>=this.animations.length){Ss&&console.log("No animation at index",e);return}e=this.animations[e]}else typeof e=="string"&&(e=this.animations.find(n=>n.name===e));if(!e){console.error("Could not find clip",e);return}const i=this.actions.find(n=>n.getClip()===e);if(!i){console.error("Could not find action",e);return}i.paused=!t}resume(){for(const e of this.actions)e.paused=!1}play(e=0,t){if(Ss&&console.log("PLAY",e),this.ensureMixer(),!this.mixer){Ss&&console.warn("Missing mixer",this);return}e===void 0&&(e=0);let i=e;if(typeof e=="number"){if(e>=this.animations.length){Ss&&console.log("No animation at index",e);return}i=this.animations[e]}else typeof e=="string"&&(i=this.animations.find(s=>s.name===e));if(!i){console.error("Could not find clip",e);return}t||(t={});for(const s of this.actions)if(s.getClip()===i)return this.internalOnPlay(s,t);if(!i.tracks){console.warn("Clip is no AnimationClip",i);return}const n=this.mixer.clipAction(i);return this.actions.push(n),this.internalOnPlay(n,t)}internalOnPlay(e,t){var i=this.actions.find(s=>s===e);if(i===e&&i.isRunning()&&i.time<i.getClip().duration){const s=this.tryFindHandle(e);if(i.paused&&(i.paused=!1),s)return s.waitForFinish()}if(t.loop===void 0&&(t.loop=this.loop),t.clampWhenFinished===void 0&&(t.clampWhenFinished=this.clampWhenFinished),t.minMaxOffsetNormalized===void 0&&this.randomStartTime&&(t.minMaxOffsetNormalized=this.minMaxOffsetNormalized),t.minMaxSpeed===void 0&&(t.minMaxSpeed=this.minMaxSpeed),t?.exclusive??!0)for(const s of this.actions)s!=i&&(t.fadeDuration?s.fadeOut(t.fadeDuration):s.stop());if(t?.fadeDuration&&e.fadeIn(t.fadeDuration),e.enabled=!0,t?.startTime!=null)e.time=t.startTime;else if(t?.minMaxOffsetNormalized&&t.minMaxOffsetNormalized.x!=0&&t.minMaxOffsetNormalized.y!=0){const s=e.getClip();e.time=L.lerp(t.minMaxOffsetNormalized.x,t.minMaxOffsetNormalized.y,Math.random())*s.duration}else e.time>=e.getClip().duration&&(e.time=0);t?.minMaxSpeed?e.timeScale=L.lerp(t.minMaxSpeed.x,t.minMaxSpeed.y,Math.random()):e.timeScale=t?.speed??1,t?.loop!=null?e.loop=t.loop?US:bm:e.loop=bm,t?.clampWhenFinished&&(e.clampWhenFinished=!0),e.paused=!1,e.play(),Ss&&console.log("PLAY",e.getClip().name,e);const n=new eR(e,this.mixer,t,s=>{this._handles.splice(this._handles.indexOf(n),1)});return this._handles.push(n),n.waitForFinish()}tryFindHandle(e){for(const t of this._handles)if(t.action===e)return t}ensureMixer(){if(!this.mixer){const e="animationMixer";this.gameObject[e]&&(this.mixer=this.gameObject[e]),(!this.mixer||!this.mixer.clipAction)&&(this.mixer=new _m(this.gameObject),this.gameObject[e]=this.mixer)}this.context.animations.registerAnimationMixer(this.mixer)}}Lr([u()],Dt.prototype,"playAutomatically",2),Lr([u()],Dt.prototype,"randomStartTime",2),Lr([u(Rw)],Dt.prototype,"minMaxSpeed",2),Lr([u(Rw)],Dt.prototype,"minMaxOffsetNormalized",2),Lr([u()],Dt.prototype,"loop",2),Lr([u()],Dt.prototype,"clampWhenFinished",2),Lr([u(Pi)],Dt.prototype,"clips",1);class eR{mixer;action;promise=null;_options;_resolveCallback=null;_resolvedOrRejectedCallback;constructor(e,t,i,n){this.action=e,this.mixer=t,this._resolvedOrRejectedCallback=n,this._options=i}waitForFinish(){return this.promise?this.promise:(this.promise=new Promise(e=>{this._resolveCallback=e}),this.mixer.addEventListener("finished",this.onFinished),this.promise)}update(){this._options&&this._options.endTime!==void 0&&this.action.time>this._options.endTime&&(this._options.loop===!0?this.action.time=this._options.startTime??0:(this.action.time=this._options.endTime,this.action.timeScale=0,this.onResolve()))}onResolve(){this.dispose(),this._resolvedOrRejectedCallback?.call(this,this),this._resolveCallback?.call(this,this.action)}onFinished=e=>{e.action===this.action&&this.onResolve()};dispose(){this.mixer.removeEventListener("finished",this.onFinished)}}const Pu=Symbol("objectIsAnimatedData");function Tw(o,e,t){if(!o)return;if(o[Pu]===void 0){if(!t)return;o[Pu]=new Set}const i=o[Pu];t?i.add(e):i.has(e)&&i.delete(e)}function tR(o){if(!o)return!1;const e=o[Pu];return e!==void 0&&e.size>0}class iR{_context;get context(){return this._context??z.Current}get isStateMachineBehaviour(){return!0}}class Dc{name;nameHash;normalizedTime;length;speed;action;hasTransitions;constructor(e,t,i,n){this.name=e.name,this.nameHash=e.hash,this.normalizedTime=t,this.length=i,this.speed=n,this.action=e.motion.action||null,this.hasTransitions=e.transitions?.length>0||!1}}function Ew(o,e){return{name:"Empty",isLooping:!1,guid:e?.generateUUID()??wo.generateUUID(),index:-1,clip:new Pi(o,0,[])}}var Cs=(o=>(o[o.If=1]="If",o[o.IfNot=2]="IfNot",o[o.Greater=3]="Greater",o[o.Less=4]="Less",o[o.Equals=6]="Equals",o[o.NotEqual=7]="NotEqual",o))(Cs||{}),gf=(o=>(o[o.Float=1]="Float",o[o.Int=3]="Int",o[o.Bool=4]="Bool",o[o.Trigger=9]="Trigger",o))(gf||{});const rt=v("debuganimatorcontroller"),Ou=v("debugrootmotion");class dn{static createFromClips(e,t={looping:!1,autoTransition:!0,transitionDuration:0}){const i=[];for(let s=0;s<e.length;s++){const r=e[s],a=[];if(t.autoTransition!==!1){const c=t.transitionDuration??0,h=c/r.duration;let d=s;(t.autoTransition===void 0||t.autoTransition===!0)&&(d=(s+1)%e.length),a.push({exitTime:1-h,offset:0,duration:c,hasExitTime:!0,destinationState:d,conditions:[]})}const l={name:r.name,hash:s,motion:{name:r.name,clip:r,isLooping:t?.looping??!1},transitions:a,behaviours:[]};i.push(l)}const n={name:"AnimatorController",guid:new Lt(Date.now()).generateUUID(),parameters:[],layers:[{name:"Base Layer",stateMachine:{defaultState:0,states:i}}]};return new dn(n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){if(t<0)t=0;else if(t>=this.model.layers.length){console.warn("invalid layer");return}const s=this.model.layers[t].stateMachine;for(const r of s.states)if(r.name===e||r.hash===e){rt&&console.log("transition to ",r),this.transitionTo(r,n,i);return}console.warn("Could not find "+e+" to play")}reset(){this.setStartTransition()}setBool(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getBool(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}setFloat(e,t){const i=typeof e=="string"?"name":"hash",n=this.model?.parameters?.filter(s=>s[i]===e);return n.forEach(s=>s.value=t),n?.length>0}getFloat(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setInteger(e,t){const i=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(n=>n[i]===e).forEach(n=>n.value=t)}getInteger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??0}setTrigger(e){rt&&console.log("SET TRIGGER",e);const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!0)}resetTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.filter(i=>i[t]===e).forEach(i=>i.value=!1)}getTrigger(e){const t=typeof e=="string"?"name":"hash";return this.model?.parameters?.find(i=>i[t]===e)?.value??!1}isInTransition(){return this._activeStates.length>1}setSpeed(e){this._speed=e}_speed=1;FindState(e){return this.findState(e)}findState(e){if(!e)return null;if(Array.isArray(this.model.layers)){for(const t of this.model.layers)for(const i of t.stateMachine.states)if(i.name===e||i.hash==e)return i}return null}getCurrentStateInfo(){if(!this._activeState)return null;const e=this._activeState.motion.action;if(!e)return null;const t=this._activeState.motion.clip.duration,i=t<=0?0:Math.abs(e.time/t);return new Dc(this._activeState,i,t,this._speed)}get currentAction(){return this._activeState&&this._activeState.motion.action||null}normalizedStartOffset=0;animator;model;get context(){return this.animator?.context}get mixer(){return this._mixer}dispose(){if(this._mixer.stopAllAction(),this.animator){this._mixer.uncacheRoot(this.animator.gameObject);for(const e of this._activeStates)e.motion.clip&&this.mixer.uncacheAction(e.motion.clip,this.animator.gameObject)}this.context?.animations.unregisterAnimationMixer(this._mixer)}bind(e){e?this.animator!==e&&(this._mixer&&(this._mixer.stopAllAction(),this.context?.animations.unregisterAnimationMixer(this._mixer)),this.animator=e,this._mixer=new _m(this.animator.gameObject),this.context?.animations.registerAnimationMixer(this._mixer),this.createActions(this.animator)):console.error("AnimatorController.bind: animator is null")}clone(){if(typeof this.model=="string")return console.warn("AnimatorController has not been resolved, can not create model from string",this.model),null;rt&&console.warn("AnimatorController clone()",this.model);const e=tc(this.model,(t,i,n)=>n==null?!0:!(n.type==="Object3D"||n.isObject3D===!0||s_(n)||n.tracks!==void 0||n instanceof dn));return console.assert(e!==this.model),new dn(e)}update(e){if(!this.animator)return;this.evaluateTransitions(),this.updateActiveStates(e);const t=this.animator.context.time.deltaTime;this.animator.applyRootMotion&&this.rootMotionHandler?.onBeforeUpdate(e),this._mixer.update(t),this.animator.applyRootMotion&&this.rootMotionHandler?.onAfterUpdate(e)}_mixer;_activeState;get activeState(){return this._activeState}constructor(e){this.model=e,rt&&console.log(this)}_activeStates=[];updateActiveStates(e){for(let t=0;t<this._activeStates.length;t++){const i=this._activeStates[t],n=i.motion;if(!n.action)this._activeStates.splice(t,1),t--;else{const s=n.action;s.weight=e,s.getEffectiveWeight()<=0&&!s.isRunning()&&(rt&&console.debug("REMOVE",i.name,s.getEffectiveWeight(),s.isRunning(),s.isScheduled()),this._activeStates.splice(t,1),t--)}}}setStartTransition(){this.model.layers.length>1&&(rt||A())&&console.warn("Multiple layers are not supported yet "+this.animator?.name);for(const e of this.model.layers){const t=e.stateMachine;t.defaultState===void 0&&(rt&&console.warn("AnimatorController default state is undefined, will assign state 0 as default",e),t.defaultState=0);const i=t.states[t.defaultState];this.transitionTo(i,0,this.normalizedStartOffset);break}}evaluateTransitions(){let e=!1;if(!this._activeState){if(this.setStartTransition(),!this._activeState)return;e=!0}const t=this._activeState,i=t.motion.action;for(const s of t.transitions){if(!s.hasExitTime&&s.conditions.length<=0)continue;let r=!0;for(const a of s.conditions)if(!this.evaluateCondition(a)){r=!1;break}if(r)if(i){const a=t.motion.clip.duration,l=a<=0?1:Math.abs(i.time/a);let c=s.exitTime;i.timeScale<0&&(c=1-c);let h=!1;if(s.hasExitTime?i.timeScale>0?h=l>=s.exitTime:i.timeScale<0&&(h=1-l>=s.exitTime):h=!0,h){for(const d of s.conditions){const p=this.model.parameters.find(m=>m.name===d.parameter);p?.type===gf.Trigger&&p.value&&(p.value=!1)}if(i.clampWhenFinished=!0,rt){const d=this.getState(s.destinationState,0);console.log(`Transition to ${s.destinationState} / ${d?.name}`,s,`
880
- Timescale: `+i.timeScale,`
881
- Normalized time: `+l.toFixed(3),`
882
- Exit Time: `+c,s.hasExitTime)}this.transitionTo(s.destinationState,s.duration,s.offset);return}}else{this.transitionTo(s.destinationState,s.duration,s.offset);return}}i&&this.setTimescale(i,t);let n=!1;if(t.motion.isLooping&&i&&(i.time>=i.getClip().duration?(n=!0,i.reset(),i.time=0,i.play()):i.time<=0&&i.timeScale<0&&(n=!0,i.reset(),i.time=i.getClip().duration,i.play())),!n&&t&&!e&&i&&this.animator&&t.behaviours){const s=i?.getClip().duration,r=i.time/s,a=new Dc(this._activeState,r,s,this._speed);for(const l of t.behaviours)l.instance&&l.instance.onStateUpdate?.call(l.instance,this.animator,a,0)}}setTimescale(e,t){let i=t.speed??1;t.speedParameter&&(i*=this.getFloat(t.speedParameter)),i!==void 0&&(e.timeScale=i*this._speed)}getState(e,t){return typeof e=="number"&&(e==-1&&(e=this.model.layers[t].stateMachine.defaultState,e===void 0&&(rt&&console.warn("AnimatorController default state is undefined: ",this.model,"Layer: "+t),e=0)),e=this.model.layers[t].stateMachine.states[e]),e}_heldActions=[];releaseHeldActions(e){for(const t of this._heldActions)t.fadeOut(e);this._heldActions.length=0}transitionTo(e,t,i){if(!this.animator)return;const n=0;if(e=this.getState(e,n),!e?.motion||!e.motion.clip||!(e.motion.clip instanceof Pi))return;const s=this._activeState===e;if(s){const h=e.motion;if(!h.action_loopback&&h.clip){const d=this.rootMotionHandler?this.animator.gameObject.matrix.clone():null;this._mixer.uncacheAction(h.clip,this.animator.gameObject),d&&d.decompose(this.animator.gameObject.position,this.animator.gameObject.quaternion,this.animator.gameObject.scale),h.action_loopback=this.createAction(h.clip)}}if(this._activeState?.behaviours&&this._activeState.motion.action){const h=this._activeState?.motion.clip.duration,d=this._activeState.motion.action.time/h,p=new Dc(this._activeState,d,h,this._speed);for(const m of this._activeState.behaviours)m.instance?.onStateExit?.call(m.instance,this.animator,p,n)}const r=this._activeState?.motion.action;s&&(e.motion.action=e.motion.action_loopback,e.motion.action_loopback=r);const a=this._activeState;this._activeState=e;const l=e.motion?.action,c=e.motion.clip;if(c?.duration<=0&&c.tracks.length<=0?r&&this._heldActions.push(r):r&&(r.fadeOut(t),this.releaseHeldActions(t)),l){if(i=Math.max(0,Math.min(1,i)),e.cycleOffsetParameter){let d=this.getFloat(e.cycleOffsetParameter);typeof d=="number"?(d<0&&(d+=1),i+=d,i%=1):rt&&console.warn("AnimatorController cycle offset parameter is not a number",e.cycleOffsetParameter)}else typeof e.cycleOffset=="number"&&(i+=e.cycleOffset,i%=1);l.isRunning()&&l.stop(),l.reset(),l.enabled=!0,this.setTimescale(l,e);const h=e.motion.clip.duration;if(l.time=s?0:i*h,l.timeScale<0&&(l.time=h-l.time),l.clampWhenFinished=!0,l.setLoop(bm,0),t>0?l.fadeIn(t):l.weight=1,l.play(),this.rootMotionHandler&&this.rootMotionHandler.onStart(l),this._activeStates.includes(e)||this._activeStates.push(e),this._activeState.behaviours){const d=new Dc(e,i,h,this._speed);for(const p of this._activeState.behaviours)p.instance?.onStateEnter?.call(p.instance,this.animator,d,n)}}else rt&&(e.__warned_no_motion||(e.__warned_no_motion=!0,console.warn("No action",e.motion,this)));rt&&console.log("TRANSITION FROM "+a?.name+" TO "+e.name,t,r,l,l?.getEffectiveTimeScale(),l?.getEffectiveWeight(),l?.isRunning(),l?.isScheduled(),l?.paused)}createAction(e){if(this._mixer.existingAction(e)&&this._mixer.uncacheAction(e,this.animator?.gameObject),this.animator?.applyRootMotion){this.rootMotionHandler||(this.rootMotionHandler=new nR(this));const t=this.animator.gameObject;return this.rootMotionHandler.createClip(this._mixer,t,e)}else return this._mixer.clipAction(e)}evaluateCondition(e){const t=this.model.parameters.find(i=>i.name===e.parameter);if(!t)return!1;switch(e.mode){case Cs.If:return t.value===!0;case Cs.IfNot:return t.value===!1;case Cs.Greater:return t.value>e.threshold;case Cs.Less:return t.value<e.threshold;case Cs.Equals:return t.value===e.threshold;case Cs.NotEqual:return t.value!==e.threshold}return!1}createActions(e){rt&&console.log("AnimatorController createActions",this.model);for(const t of this.model.layers){const i=t.stateMachine;for(let n=0;n<i.states.length;n++){const s=i.states[n];s.transitions||(s.transitions=[]);for(const r of s.transitions)r.conditions||(r.conditions=[]);if(s.motion||(rt&&console.warn("No motion",s),s.motion=Ew(s.name)),this.animator&&s.motion.clips){const r=s.motion.clips?.find(a=>a.node.name===this.animator?.gameObject?.name);r?s.motion.clip=r.clip:(rt||A())&&console.warn('Could not find clip for animator "'+this.animator?.gameObject?.name+'"',s.motion.clips.map(a=>a.node.name))}if(!s.motion.clip){rt&&console.warn("No clip assigned to state",s);const r=new Pi(void 0,void 0,[]);s.motion.clip=r}if(s.motion?.clip){const r=s.motion.clip;if(r instanceof Pi){const a=this.createAction(r);s.motion.action=a}else(rt||A())&&console.warn("No valid animationclip assigned",s)}if(s.behaviours&&Array.isArray(s.behaviours))for(const r of s.behaviours){if(!r?.typeName)continue;const a=C.get(r.typeName);if(a){const l=new a;l.isStateMachineBehaviour&&(l._context=this.context??void 0,Va(l,r.properties),r.instance=l),rt&&console.log("Created animator controller behaviour",s.name,r.typeName,r.properties,l)}else(rt||A())&&console.warn("Could not find AnimatorBehaviour type: "+r.typeName)}}}}*enumerateActions(){if(this.model.layers)for(const e of this.model.layers){const t=e.stateMachine;for(let i=0;i<t.states.length;i++){const n=t.states[i];n?.motion&&(n.motion.action&&(yield n.motion.action),n.motion.action_loopback&&(yield n.motion.action_loopback))}}}rootMotionHandler}class Aw{track;createdInterpolant;originalEvaluate;customEvaluate;constructor(e,t){this.track=e;const i=e,n=i.createInterpolant.bind(e);i.createInterpolant=()=>(i.createInterpolant=n,this.createdInterpolant=n(),this.originalEvaluate=this.createdInterpolant.evaluate.bind(this.createdInterpolant),this.customEvaluate=s=>{if(!this.originalEvaluate)return;const r=this.originalEvaluate(s);return t(s,r)},this.createdInterpolant.evaluate=this.customEvaluate,this.createdInterpolant)}dispose(){this.createdInterpolant&&this.originalEvaluate&&(this.createdInterpolant.evaluate=this.originalEvaluate),this.track=void 0,this.createdInterpolant=null,this.originalEvaluate=void 0,this.customEvaluate=void 0}}class ut{static lastObjPosition={};static lastObjRotation={};static firstKeyframeRotation={};static spaceRotation={};static effectiveSpaceRotation={};static clipOffsetRotation={};set action(e){this._action=e}get action(){return this._action}get cacheId(){return this.root.uuid}_action;root;clip;positionWrapper=null;rotationWrapper=null;context;positionChange=new b;rotationChange=new U;constructor(e,t,i,n,s){if(this.context=e,this.root=t,this.clip=i,ut.firstKeyframeRotation[this.cacheId]||(ut.firstKeyframeRotation[this.cacheId]=new U),s){const r=s.values;ut.firstKeyframeRotation[this.cacheId].set(r[0],r[1],r[2],r[3])}ut.spaceRotation[this.cacheId]||(ut.spaceRotation[this.cacheId]=new U),ut.effectiveSpaceRotation[this.cacheId]||(ut.effectiveSpaceRotation[this.cacheId]=new U),ut.clipOffsetRotation[this.cacheId]=new U,s&&ut.clipOffsetRotation[this.cacheId].set(s.values[0],s.values[1],s.values[2],s.values[3]).invert(),this.handlePosition(i,n),this.handleRotation(i,s)}onStart(e){if(e.getClip()!==this.clip)return;ut.lastObjRotation[this.cacheId]||(ut.lastObjRotation[this.cacheId]=this.root.quaternion.clone());const t=ut.lastObjRotation[this.cacheId];if(ut.spaceRotation[this.cacheId].copy(t),Ou){const i=new ot().setFromQuaternion(t);console.log("START",this.clip.name,L.toDegrees(i.y),this.root.position.z)}}getClipRotationOffset(){return ut.clipOffsetRotation[this.cacheId]}_prevTime=0;handlePosition(e,t){if(t){const i=this.root;Ou&&i.add(new Si),ut.lastObjPosition[this.cacheId]||(ut.lastObjPosition[this.cacheId]=this.root.position.clone());const n=new b,s=new b;this.positionWrapper=new Aw(t,(r,a)=>{const l=this.action.getEffectiveWeight();return Ou&&i.position.length()>8&&i.position.set(0,i.position.y,0),r>this._prevTime&&(n.set(a[0],a[1],a[2]),n.sub(s),n.multiplyScalar(l),n.applyQuaternion(this.getClipRotationOffset()),n.applyQuaternion(i.quaternion),this.positionChange.copy(n)),s.fromArray(a),this._prevTime=r,a[0]=0,a[1]=0,a[2]=0,a})}}static identityQuaternion=new U;handleRotation(e,t){if(t){if(Ou){const r=t.values,a=new ot().setFromQuaternion(new U(r[0],r[1],r[2],r[3]));console.log(e.name,t.name,"FIRST ROTATION IN TRACK",L.toDegrees(a.y));const l=t.values.length-4,c=new U().set(r[l],r[l+1],r[l+2],r[l+3]),h=new ot().setFromQuaternion(c);console.log(e.name,t.name,"LAST ROTATION IN TRACK",L.toDegrees(h.y))}let i=0;const n=new U,s=new U;this.rotationWrapper=new Aw(t,(r,a)=>(r>i&&(s.set(a[0],a[1],a[2],a[3]),n.invert(),s.multiply(n),this.rotationChange.copy(s)),n.fromArray(a),i=r,a[0]=0,a[1]=0,a[2]=0,a[3]=1,a))}}onBeforeUpdate(e){this.positionChange.set(0,0,0),this.rotationChange.set(0,0,0,1)}onAfterUpdate(e){return!this.action||(e*=this.action.getEffectiveWeight(),e<=0)?!1:(this.positionChange.multiplyScalar(e),this.rotationChange.slerp(ut.identityQuaternion,1-e),!0)}}class nR{controller;handler=[];root;basePosition=new b;baseQuaternion=new U;baseRotation=new ot;constructor(e){this.controller=e}createClip(e,t,i){this.root=t,t&&"name"in t&&t.name;const n=this.findRootTrack(i,".position"),s=this.findRootTrack(i,".quaternion"),r=new ut(this.controller.context,t,i,n,s);this.handler.push(r);const a=e.clipAction(i);return r.action=a,a}onStart(e){for(const t of this.handler)t.onStart(e)}onBeforeUpdate(e){this.basePosition.copy(this.root.position),this.baseQuaternion.copy(this.root.quaternion);for(const t of this.handler)t.onBeforeUpdate(e)}summedPosition=new b;summedRotation=new U;onAfterUpdate(e){if(!(e<=0)){this.root.position.copy(this.basePosition),this.root.quaternion.copy(this.baseQuaternion),this.summedPosition.set(0,0,0),this.summedRotation.set(0,0,0,1);for(const t of this.handler)t.onAfterUpdate(e)&&(this.summedPosition.add(t.positionChange),this.summedRotation.multiply(t.rotationChange));this.root.position.add(this.summedPosition),this.root.quaternion.multiply(this.summedRotation)}}findRootTrack(e,t){const i=e.tracks;if(!i)return null;for(const n of i)if(n.name.endsWith(t))return n;return null}}class oR extends Yi{onSerialize(e,t){}onDeserialize(e,t){if(t.type===dn&&e?.__type==="AnimatorController")return new dn(e)}}new oR(dn);var sR=Object.defineProperty,rR=Object.getOwnPropertyDescriptor,ku=(o,e,t,i)=>{for(var n=i>1?void 0:i?rR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&sR(e,t,n),n};const Ki=v("debuganimator");class yt extends R{get isAnimationComponent(){return!0}applyRootMotion=!1;hasRootMotion=!1;keepAnimatorControllerStateOnDisable=!1;set runtimeAnimatorController(e){this._animatorController&&this._animatorController.model===e||(e?e instanceof dn?(e.animator&&e.animator!==this&&(console.warn("AnimatorController can not be bound to multiple animators",e.model?.name),e.model||console.error("AnimatorController has no model"),e=new dn(e.model)),this._animatorController=e,this._animatorController.bind(this)):(Ki&&console.log("Assign animator controller",e,this),this._animatorController=new dn(e),this.__didAwake&&this._animatorController.bind(this)):this._animatorController=null)}get runtimeAnimatorController(){return this._animatorController}getCurrentStateInfo(){return this.runtimeAnimatorController?.getCurrentStateInfo()}get currentAction(){return this.runtimeAnimatorController?.currentAction||null}get parametersAreDirty(){return this._parametersAreDirty}_parametersAreDirty=!1;get isDirty(){return this._isDirty}_isDirty=!1;Play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.play(e,t,i,n)}play(e,t=-1,i=Number.NEGATIVE_INFINITY,n=0){this.runtimeAnimatorController?.play(e,t,i,n),this._isDirty=!0}Reset(){this.reset()}reset(){this._animatorController?.reset(),this._isDirty=!0}SetBool(e,t){this.setBool(e,t)}setBool(e,t){Ki&&console.log("setBool",e,t),this.runtimeAnimatorController?.getBool(e)!==t&&(this._parametersAreDirty=!0),this.runtimeAnimatorController?.setBool(e,t)}GetBool(e){return this.getBool(e)}getBool(e){const t=this.runtimeAnimatorController?.getBool(e)??!1;return Ki&&console.log("getBool",e,t),t}toggleBool(e){this.setBool(e,!this.getBool(e))}SetFloat(e,t){this.setFloat(e,t)}setFloat(e,t){this.runtimeAnimatorController?.getFloat(e)!==t&&(this._parametersAreDirty=!0),Ki&&console.log("setFloat",e,t),this.runtimeAnimatorController?.setFloat(e,t)}GetFloat(e){return this.getFloat(e)}getFloat(e){const t=this.runtimeAnimatorController?.getFloat(e)??-1;return Ki&&console.log("getFloat",e,t),t}SetInteger(e,t){this.setInteger(e,t)}setInteger(e,t){this.runtimeAnimatorController?.getInteger(e)!==t&&(this._parametersAreDirty=!0),Ki&&console.log("setInteger",e,t),this.runtimeAnimatorController?.setInteger(e,t)}GetInteger(e){return this.getInteger(e)}getInteger(e){const t=this.runtimeAnimatorController?.getInteger(e)??-1;return Ki&&console.log("getInteger",e,t),t}SetTrigger(e){this.setTrigger(e)}setTrigger(e){this._parametersAreDirty=!0,Ki&&console.log("setTrigger",e),this.runtimeAnimatorController?.setTrigger(e)}ResetTrigger(e){this.resetTrigger(e)}resetTrigger(e){this._parametersAreDirty=!0,Ki&&console.log("resetTrigger",e),this.runtimeAnimatorController?.resetTrigger(e)}GetTrigger(e){this.getTrigger(e)}getTrigger(e){const t=this.runtimeAnimatorController?.getTrigger(e);return Ki&&console.log("getTrigger",e,t),t}IsInTransition(){return this.isInTransition()}isInTransition(){return this.runtimeAnimatorController?.isInTransition()??!1}SetSpeed(e){return this.setSpeed(e)}setSpeed(e){e!==this._speed&&(Ki&&console.log("setSpeed",e),this._speed=e,this._animatorController?.animator==this&&this._animatorController.setSpeed(e))}set minMaxSpeed(e){this._speed=L.lerp(e.x,e.y,Math.random()),this._animatorController?.animator==this&&this._animatorController.setSpeed(this._speed)}set minMaxOffsetNormalized(e){this._normalizedStartOffset=L.lerp(e.x,e.y,Math.random()),this.runtimeAnimatorController?.animator==this&&(this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset)}_speed=1;_normalizedStartOffset=0;_animatorController=null;awake(){Ki&&console.log("ANIMATOR",this.name,this),this.gameObject&&this.initializeRuntimeAnimatorController()}_initializeWithRuntimeAnimatorController;initializeRuntimeAnimatorController(e=!1){const t=e||this.runtimeAnimatorController!==this._initializeWithRuntimeAnimatorController;if(this.runtimeAnimatorController&&t){const i=this.runtimeAnimatorController.clone();this._initializeWithRuntimeAnimatorController=i,i?(console.assert(this.runtimeAnimatorController!==i),this.runtimeAnimatorController=i,console.assert(this.runtimeAnimatorController===i),this.runtimeAnimatorController.bind(this),this.runtimeAnimatorController.setSpeed(this._speed),this.runtimeAnimatorController.normalizedStartOffset=this._normalizedStartOffset):console.warn("Could not clone animator controller",this.runtimeAnimatorController)}}onDisable(){this.keepAnimatorControllerStateOnDisable||this._animatorController?.reset()}onBeforeRender(){this._isDirty=!1,this._parametersAreDirty=!1,!tR(this.gameObject)&&this._animatorController&&this._animatorController.update(1)}}ku([u()],yt.prototype,"applyRootMotion",2),ku([u()],yt.prototype,"hasRootMotion",2),ku([u()],yt.prototype,"keepAnimatorControllerStateOnDisable",2),ku([u()],yt.prototype,"runtimeAnimatorController",1);const Iw=Symbol("previous-visibility");class _o extends Vn{render(e,t,i){if("addPass"in i)this._unsupported_effectcomposer_warning||(console.warn("RenderTexture.render() does not yet support EffectComposer"),this._unsupported_effectcomposer_warning=!0);else if(i instanceof cr){this.onBeforeRender();const n=i.getRenderTarget(),s=i.xr.enabled;i.xr.enabled=!1,i.setRenderTarget(this),i.clear(!0,!0,!0),i.render(e,t),i.setRenderTarget(n),i.xr.enabled=s,this.onAfterRender()}}static _userSet=new Set;onBeforeRender(){_o._userSet.clear();const e=kg(this.texture,!0,null,_o._userSet);for(const t of e)t instanceof G&&(t[Iw]=t.visible,t.visible=!1)}onAfterRender(){for(const e of _o._userSet)e instanceof G&&(e.visible=e[Iw]);_o._userSet.clear()}}var aR=Object.defineProperty,lR=Object.getOwnPropertyDescriptor,Bc=(o,e,t,i)=>{for(var n=i>1?void 0:i?lR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&aR(e,t,n),n};const Mu=v("debuggroundprojection");class Yn extends R{applyOnAwake=!1;autoFit=!0;set radius(e){this._radius=e,this._projection&&this.updateProjection()}get radius(){return this._radius}_radius=50;set height(e){this._height=e,this._projection&&this.updateProjection()}get height(){return this._height}_height=3;set arBlending(e){this._arblending=e,this._needsTextureUpdate=!0}get arBlending(){return this._arblending}_arblending=0;_lastBackground;_lastRadius;_lastHeight;_projection;_watcher;awake(){this.applyOnAwake&&this.updateAndCreate()}onEnable(){this.context.time.frameCount>0&&this.applyOnAwake&&this.updateAndCreate(),this._watcher||(this._watcher=new rs(this.context.scene,"background"),this._watcher.subscribeWrite(e=>{Mu&&console.log("Background changed",this.context.scene.background),this._needsTextureUpdate=!0}))}onDisable(){this._watcher?.revoke(),this._projection?.removeFromParent()}onEnterXR(){this.activeAndEnabled&&(this._needsTextureUpdate=!0,this.updateProjection())}async onLeaveXR(){this.activeAndEnabled&&(await ic(1),this.updateProjection())}onBeforeRender(){this._projection&&this.scene.backgroundRotation&&this._projection.rotation.copy(this.scene.backgroundRotation),this.context.scene.backgroundBlurriness!==void 0&&this._lastBlurriness!=this.context.scene.backgroundBlurriness&&this.context.scene.backgroundBlurriness>.001?this.updateProjection():this._needsTextureUpdate&&this.context.scene.background instanceof Le&&this.updateBlurriness(this.context.scene.background,this.context.scene.backgroundBlurriness)}updateAndCreate(){this.updateProjection(),this._watcher?.apply()}_needsTextureUpdate=!1;updateProjection(){if(!this.context.scene.background){this._projection?.removeFromParent();return}const e=this.context.scene.background;if(!(e instanceof Le)){this._projection?.removeFromParent();return}if((this.context.xr?.isPassThrough||this.context.xr?.isAR)&&this.arBlending===0){this._projection?.removeFromParent();return}if(!this.gameObject||this.destroyed)return;let t=!0;const i=0,n=e!==this._lastBackground||this._height!==this._lastHeight||this._radius!==this._lastRadius;if(!this._projection||n){Mu&&console.log("Create/Update Ground Projection",e.name),this._projection?.removeFromParent();try{this._projection=new Ra(e,this._height,this._radius,64)}catch(s){console.error("Error creating three GroundProjection",s);return}this._projection.position.y=this._height-i,this._projection.name="GroundProjection",eg(this._projection,!1)}else t=!1;if(this._projection.parent||this.gameObject.add(this._projection),this.autoFit&&t){this._projection.updateWorldMatrix(!0,!0);const s=Xt(this.context.scene.children,[this._projection]),r=s.min.y;if(r<1/0){const a=D();a.x=s.min.x+(s.max.x-s.min.x)*.5;const l=He(this.gameObject).x;a.y=r+this._height*l-i,a.z=s.min.z+(s.max.z-s.min.z)*.5,gt(this._projection,a)}Mu&&B.DrawWireBox3(s,65280,5)}this.context.scene.backgroundBlurriness>.001&&this._needsTextureUpdate&&this.updateBlurriness(e,this.context.scene.backgroundBlurriness),this._lastBackground=e,this._lastHeight=this._height,this._lastRadius=this._radius,this._needsTextureUpdate=!1}_blurrynessShader=null;_lastBlurriness=-1;updateBlurriness(e,t){if(this._projection){if(!e)return}else return;this._needsTextureUpdate=!1,Mu&&console.log("Update Blurriness",t),this._blurrynessShader??=new zn({name:"GroundProjectionBlurriness",uniforms:{map:{value:e},blurriness:{value:t},blending:{value:0},alphaFactor:{value:1}},vertexShader:cR,fragmentShader:hR}),this._blurrynessShader.depthWrite=!1,this._blurrynessShader.uniforms.map.value=e,this._blurrynessShader.uniforms.blurriness.value=t,this._lastBlurriness=t,e.needsUpdate=!0;const i=this._projection.material.transparent;this._projection.material.transparent=(this.context.xr?.isAR===!0&&this.arBlending>1e-6)??!1,this._projection.material.transparent?this._blurrynessShader.uniforms.blending.value=this.arBlending:this._blurrynessShader.uniforms.blending.value=0,this.context.isInPassThrough?this._blurrynessShader.uniforms.alphaFactor.value=.95:this._blurrynessShader.uniforms.alphaFactor.value=1,i!==this._projection.material.transparent&&(this._projection.material.needsUpdate=!0),this._projection.material.map=sr.copyTexture(e,this._blurrynessShader),this._projection.material.depthTest=!0,this._projection.material.depthWrite=!1}}Bc([u()],Yn.prototype,"applyOnAwake",2),Bc([u()],Yn.prototype,"autoFit",2),Bc([u()],Yn.prototype,"radius",1),Bc([u()],Yn.prototype,"height",1),Bc([u()],Yn.prototype,"arBlending",1);const cR=`
883
- varying vec2 vUv;
884
-
885
- void main() {
886
- vUv = uv;
887
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
888
- }
889
- `,hR=`
890
- uniform sampler2D map;
891
- uniform float blurriness;
892
- uniform float alphaFactor;
893
- uniform float blending;
894
- varying vec2 vUv;
895
-
896
- const float PI = 3.14159265359;
897
-
898
- // Gaussian function
899
- float gaussian(float x, float sigma) {
900
- return exp(-(x * x) / (2.0 * sigma * sigma)) / (sqrt(2.0 * PI) * sigma);
901
- }
902
-
903
- // Custom smoothstep function for desired falloff
904
- float customSmoothstep(float edge0, float edge1, float x) {
905
- float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
906
- return t * t * (3.0 - 2.0 * t);
907
- }
908
-
909
- void main() {
910
- vec2 center = vec2(0.0, 0.0);
911
- vec2 pos = vUv;
912
- pos.x = 0.0; // Only consider vertical distance
913
- float distance = length(pos - center);
914
-
915
- // Calculate blur amount based on custom falloff
916
- float blurAmount = customSmoothstep(0.5, 1.0, distance * 2.0);
917
- blurAmount = clamp(blurAmount, 0.0, 1.0); // Ensure blur amount is within valid range
918
-
919
- // Gaussian blur
920
- vec2 pixelSize = 1.0 / vec2(textureSize(map, 0));
921
- vec4 color = vec4(0.0);
922
- float totalWeight = 0.0;
923
- int blurSize = int(60.0 * min(1.0, blurriness) * blurAmount); // Adjust blur size based on distance and blurriness
924
- float lodLevel = log2(float(blurSize)) * 0.5; // Compute LOD level
925
-
926
- for (int x = -blurSize; x <= blurSize; x++) {
927
- for (int y = -blurSize; y <= blurSize; y++) {
928
- vec2 offset = vec2(float(x), float(y)) * pixelSize * blurAmount;
929
- float weight = gaussian(length(vec2(float(x), float(y))), 1000.0 * blurAmount); // Use a fixed sigma value
930
- color += textureLod(map, vUv + offset, lodLevel) * weight;
931
- totalWeight += weight;
932
- }
933
- }
934
-
935
- color = totalWeight > 0.0 ? color / totalWeight : texture2D(map, vUv);
936
-
937
- gl_FragColor = color;
938
-
939
- float brightness = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));
940
- float stepFactor = blending - brightness * .1;
941
- gl_FragColor.a = pow(1.0 - blending * customSmoothstep(0.35 * stepFactor, 0.45 * stepFactor, distance), 5.);
942
- gl_FragColor.a *= alphaFactor;
943
- // gl_FragColor.rgb = vec3(1.0);
944
-
945
- // #include <tonemapping_fragment>
946
- // #include <colorspace_fragment>
947
-
948
- // Uncomment to visualize blur amount
949
- // gl_FragColor = vec4(blurAmount, 0.0, 0.0, 1.0);
950
- }
951
- `;function Lw(o){if(Z.active)return console.warn("[OrbitControls] Can not fit camera while XR session is active"),null;const e=z.Current;if(!e)return console.warn("[OrbitControls] No context found"),null;const t=o?.camera||e.mainCamera;if(!t)return console.warn("No camera or controls found to fit camera to objects..."),null;o||(o={}),o.autoApply=o.autoApply!==!1,o.minZoom||=0,o.maxZoom||=1/0;const{centerCamera:i,cameraNearFar:n="auto",fitOffset:s=1.1,fov:r=t instanceof re?t?.fov:-1}=o,a=new b,l=new b,c=t instanceof re?t.aspect:1,h=o.objects||e.scene,d=Xt(h,void 0,t?.layers),p=d.clone();d.getCenter(l);const m=new b;if(d.getSize(m),t instanceof re&&t.updateProjectionMatrix(),t.updateMatrixWorld(),d.applyMatrix4(t.matrixWorldInverse),d.getSize(a),d.setFromCenterAndSize(l,a),Number.isNaN(a.x)||Number.isNaN(a.y)||Number.isNaN(a.z))return console.warn("Camera fit size resultet in NaN",t,d),null;if(a.length()<=1e-10)return console.warn("Camera fit size is zero",d),null;const f=r,g=2*Math.atan(Math.tan(f*Math.PI/360/2)*c)/Math.PI*360,y=a.y/(2*Math.atan(Math.PI*f/360)),_=a.x/(2*Math.atan(Math.PI*g/360)),w=s*Math.max(y,_)+a.z/2;o.maxZoom=w*10,o.minZoom=w*.01,o.debug===!0&&console.log("Fit camera to objects",{fitHeightDistance:y,fitWidthDistance:_,distance:w,verticalFov:f,horizontalFov:g});const P=.05,M=l.clone();if(M.y-=a.y*P,o.targetOffset&&(o.targetOffset.x!==void 0&&(M.x+=o.targetOffset.x),o.targetOffset.y!==void 0&&(M.y+=o.targetOffset.y),o.targetOffset.z!==void 0&&(M.z+=o.targetOffset.z)),o.relativeTargetOffset&&(o.relativeTargetOffset.x!==void 0&&(M.x+=o.relativeTargetOffset.x*a.x),o.relativeTargetOffset.y!==void 0&&(M.y+=o.relativeTargetOffset.y*a.y),o.relativeTargetOffset.z!==void 0&&(M.z+=o.relativeTargetOffset.z*a.z)),n==null||n=="auto"){const I=$a(Yn),N=I?I.radius:0,V=Math.max(m.x,m.y,m.z,N);t instanceof re&&(t.near=w/100,t.far=V+w*10,t.updateProjectionMatrix()),I&&(o.maxZoom=Math.max(Math.min(o.maxZoom,N*.5),w))}o.currentZoom!==void 0&&(o.currentZoom<o.minZoom&&(o.minZoom=o.currentZoom*.9),o.currentZoom>o.maxZoom&&(o.maxZoom=o.currentZoom*1.1));const O=l.clone();o.fitDirection?O.sub(new b().copy(o.fitDirection).multiplyScalar(1e6)):O.sub(t.worldPosition),i==="y"&&(O.y=0),O.normalize(),O.multiplyScalar(w),i==="y"&&(O.y+=-P*4*w);let j=l.clone().sub(O);return o.cameraOffset&&(o.cameraOffset.x!==void 0&&(j.x+=o.cameraOffset.x),o.cameraOffset.y!==void 0&&(j.y+=o.cameraOffset.y),o.cameraOffset.z!==void 0&&(j.z+=o.cameraOffset.z)),o.relativeCameraOffset&&(o.relativeCameraOffset.x!==void 0&&(j.x+=o.relativeCameraOffset.x*a.x),o.relativeCameraOffset.y!==void 0&&(j.y+=o.relativeCameraOffset.y*a.y),o.relativeCameraOffset.z!==void 0&&(j.z+=o.relativeCameraOffset.z*a.z)),t.parent&&(j=t.parent.worldToLocal(j)),o.debug&&(B.DrawWireBox3(d,16777011,10),B.DrawWireBox3(p,65280,10)),o.autoApply&&(t.position.copy(j),t.lookAt(M),r>0&&t instanceof re&&(t.fov=r,t.updateProjectionMatrix())),{camera:t,position:j,lookAt:M,fov:o.fov}}var dR=Object.defineProperty,ff=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&dR(e,t,n),n};class jr extends R{constraintActive=!0;locked=!1;sources=[];setConstraintPosition(e){const t=this.sources[0];t&&(t.worldPosition=e)}}ff([u()],jr.prototype,"constraintActive"),ff([u()],jr.prototype,"locked"),ff([u(k)],jr.prototype,"sources");let Dr=class{bb=null;bb_pos=0;__init(o,e){return this.bb_pos=o,this.bb=e,this}x(){return this.bb.readFloat32(this.bb_pos)}y(){return this.bb.readFloat32(this.bb_pos+4)}z(){return this.bb.readFloat32(this.bb_pos+8)}static sizeOf(){return 12}static createVec3(o,e,t,i){return o.prep(4,12),o.writeFloat32(i),o.writeFloat32(t),o.writeFloat32(e),o.offset()}};class jw{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}position(e){return(e||new Dr).__init(this.bb_pos,this.bb)}rotation(e){return(e||new Dr).__init(this.bb_pos+12,this.bb)}scale(e){return(e||new Dr).__init(this.bb_pos+24,this.bb)}static sizeOf(){return 36}static createTransform(e,t,i,n,s,r,a,l,c,h){return e.prep(4,36),e.prep(4,12),e.writeFloat32(h),e.writeFloat32(c),e.writeFloat32(l),e.prep(4,12),e.writeFloat32(a),e.writeFloat32(r),e.writeFloat32(s),e.prep(4,12),e.writeFloat32(n),e.writeFloat32(i),e.writeFloat32(t),e.offset()}}class as{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedTransformModel(e,t){return(t||new as).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedTransformModel(e,t){return e.setPosition(e.position()+Pb),(t||new as).__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 jw).__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 E;(o=>{(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./rapier-DJ-luMxr.min.js");return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.RAPIER_PHYSICS||(o.RAPIER_PHYSICS={})),(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./postprocessing-DYDtB188.min.js").then(r=>r.index);return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.POSTPROCESSING||(o.POSTPROCESSING={})),(e=>{e.MAYBEMODULE=null;const t=[];function i(){return e.MODULE?Promise.resolve(e.MODULE):new Promise(s=>{t.push(s)})}e.ready=i;async function n(){if(e.MODULE)return e.MODULE;const s=await import("./postprocessing-DYDtB188.min.js").then(r=>r.N8AO);return e.MODULE=s,e.MAYBEMODULE=s,t.forEach(r=>r(s)),t.length=0,s}e.load=n})(o.POSTPROCESSING_AO||(o.POSTPROCESSING_AO={}))})(E||(E={}));var bt=(o=>(o[o.Average=0]="Average",o[o.Multiply=1]="Multiply",o[o.Minimum=2]="Minimum",o[o.Maximum=3]="Maximum",o))(bt||{}),Ru=(o=>(o[o.Discrete=0]="Discrete",o[o.Continuous=1]="Continuous",o))(Ru||{}),Xe=(o=>(o[o.None=0]="None",o[o.FreezePositionX=2]="FreezePositionX",o[o.FreezePositionY=4]="FreezePositionY",o[o.FreezePositionZ=8]="FreezePositionZ",o[o.FreezePosition=14]="FreezePosition",o[o.FreezeRotationX=16]="FreezeRotationX",o[o.FreezeRotationY=32]="FreezeRotationY",o[o.FreezeRotationZ=64]="FreezeRotationZ",o[o.FreezeRotation=112]="FreezeRotation",o[o.FreezeAll=126]="FreezeAll",o))(Xe||{}),Za=(o=>(o[o.None=0]="None",o[o.X=2]="X",o[o.Y=4]="Y",o[o.Z=8]="Z",o[o.All=-1]="All",o))(Za||{});const Ot=function(o,e){return function(t,i,n){uR(t,i,n,o,e)}};function uR(o,e,t,i,n){if(!n&&!i&&!o.onValidate)return;if(t!==void 0){console.error("Invalid usage of validate decorator. Only fields can be validated.",o,e,t),Te("Invalid usage of validate decorator. Only fields can be validated. Property: "+e,ki.Error);return}let s="";if(typeof e=="string"?s=e:s=e.name,o.__internalAwake){const r=Symbol(s),a=o.__internalAwake;o.__internalAwake=function(){if(!this.onValidate){A()&&console.warn('Usage of @validate decorate detected but there is no onValidate method in your class: "'+o.constructor?.name+'"');return}if(this[r]===void 0){this[r]=this[s];const l=this[s];if(l instanceof ee||l instanceof b||l instanceof pe||l instanceof U){const c=this[s];Rd(c,()=>{this.onValidate(s)})}Object.defineProperty(this,s,{set:function(c){if(this[Gg]===!0)this[r]=c;else{i?.call(this,c);const h=this[r];this[r]=c,this.onValidate?.call(this,s,h)}},get:function(){return n?.call(this),this[r]}})}a.call(this)}}}const pR=function(o){return function(e,t,i){let n="";typeof t=="string"?n=t:n=t.name;const s=o.prototype,r=Object.getOwnPropertyDescriptor(s,n);if(!r?.value){console.warn("Can not apply prefix: type does not have method named",t,o);return}const a=r.value,l=e[n];Object.defineProperty(s,n,{value:function(...c){const h=l?.call(this,...c);if(h instanceof Promise){h.then(d=>{if(d!==!1)return a.call(this,...c)});return}if(h!==!1)return a.call(this,...c)}})}};var mR=Object.defineProperty,gR=Object.getOwnPropertyDescriptor,Ti=(o,e,t,i)=>{for(var n=i>1?void 0:i?gR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&mR(e,t,n),n};class fR{get isDirty(){return this.positionChanged||this.rotationChanged}positionChanged=!1;rotationChanged=!1;position;quaternion;_positionKeys=["x","y","z"];_quaternionKeys=["_x","_y","_z","_w"];reset(e=!1){if(this.positionChanged=!1,this.rotationChanged=!1,this.mute=!1,e){if(this.position)for(const t of this._positionKeys)delete this.position[t];if(this.quaternion)for(const t of this._quaternionKeys)delete this.quaternion[t]}}syncValues(){for(const e of this._positionKeys)this.position[e]=this.obj.position[e];for(const e of this._quaternionKeys)this.quaternion[e]=this.obj.quaternion[e]}mute=!1;applyValues(){if(this.positionChanged&&this.position)for(const e of this._positionKeys){const t=this.position[e];t!==void 0&&(this.obj.position[e]=t)}if(this.rotationChanged&&this.quaternion)for(const e of this._quaternionKeys){const t=this.quaternion[e];t!==void 0&&(this.obj.quaternion[e]=t)}}context;obj;_positionWatch;_rotationWatch;constructor(e,t){this.context=t,this.obj=e}start(e,t){this.reset(),e&&(this._positionWatch||(this._positionWatch=new rs(this.obj.position,["x","y","z"])),this._positionWatch.apply(),this.position={},this._positionWatch.subscribeWrite((s,r)=>{if(this.context.physics.engine?.isUpdating||this.mute)return;const a=this.position[r];Math.abs(a-s)<1e-5||(this.position[r]=s,this.positionChanged=!0)})),t&&(this._rotationWatch||(this._rotationWatch=new rs(this.obj.quaternion,["_x","_y","_z","_w"])),this._rotationWatch.apply(),this.quaternion={},this._rotationWatch.subscribeWrite((s,r)=>{if(this.context.physics.engine?.isUpdating||this.mute)return;const a=this.quaternion[r];Math.abs(a-s)<1e-5||(this.quaternion[r]=s,this.rotationChanged=!0)}));const i=this.obj.matrixWorld.multiplyMatrices.bind(this.obj.matrixWorld),n=new K;this.obj.matrixWorld.multiplyMatrices=(s,r)=>(this.context.physics.engine?.isUpdating||this.mute||n.equals(s)||(this.positionChanged=!0,this.rotationChanged=!0,n.copy(s)),i(s,r))}stop(){this._positionWatch?.revoke(),this._rotationWatch?.revoke()}}const ci=class om extends R{get isRigidbody(){return!0}autoMass=!0;set mass(e){e!==this._mass&&(this._mass=e,this._propertiesChanged=!0,this.__didAwake&&(this.autoMass=!1))}get mass(){return this.autoMass?this.context.physics.engine?.getBody(this)?.mass()??-1:this._mass}_mass=0;useGravity=!0;centerOfMass=new b(0,0,0);constraints=Xe.None;isKinematic=!1;drag=0;angularDrag=1;detectCollisions=!0;sleepThreshold=.01;collisionDetectionMode=Ru.Discrete;get lockPositionX(){return(this.constraints&Xe.FreezePositionX)!==0}get lockPositionY(){return(this.constraints&Xe.FreezePositionY)!==0}get lockPositionZ(){return(this.constraints&Xe.FreezePositionZ)!==0}get lockRotationX(){return(this.constraints&Xe.FreezeRotationX)!==0}get lockRotationY(){return(this.constraints&Xe.FreezeRotationY)!==0}get lockRotationZ(){return(this.constraints&Xe.FreezeRotationZ)!==0}set lockPositionX(e){e?this.constraints|=Xe.FreezePositionX:this.constraints&=~Xe.FreezePositionX}set lockPositionY(e){e?this.constraints|=Xe.FreezePositionY:this.constraints&=~Xe.FreezePositionY}set lockPositionZ(e){e?this.constraints|=Xe.FreezePositionZ:this.constraints&=~Xe.FreezePositionZ}set lockRotationX(e){e?this.constraints|=Xe.FreezeRotationX:this.constraints&=~Xe.FreezeRotationX}set lockRotationY(e){e?this.constraints|=Xe.FreezeRotationY:this.constraints&=~Xe.FreezeRotationY}set lockRotationZ(e){e?this.constraints|=Xe.FreezeRotationZ:this.constraints&=~Xe.FreezeRotationZ}set gravityScale(e){this._gravityScale=e}get gravityScale(){return this._gravityScale}_gravityScale=1;dominanceGroup=0;static tempPosition=new b;_propertiesChanged=!1;_currentVelocity=new b;_smoothedVelocity=new b;_smoothedVelocityGetter=new b;_lastPosition=new b;_watch;awake(){this._watch=void 0,this._propertiesChanged=!1}onEnable(){this._watch||(this._watch=new fR(this.gameObject,this.context)),this._watch.start(!0,!0),this.startCoroutine(this.beforePhysics(),we.LateUpdate),A()&&(globalThis.NEEDLE_USE_RAPIER?E.RAPIER_PHYSICS.ready().then(async()=>{await ic(3),this.context.physics.engine?.getBody(this)||console.warn(`Rigidbody could not be created. Ensure "${this.name}" has a Collider component.`)}):console.warn("Rigidbody could not be created: Rapier physics are explicitly disabled."))}onDisable(){this._watch?.stop(),this.context.physics.engine?.removeBody(this)}onDestroy(){this.context.physics.engine?.removeBody(this)}onValidate(){this._propertiesChanged=!0}*beforePhysics(){for(;;)this._propertiesChanged&&(this._propertiesChanged=!1,this.context.physics.engine?.updateProperties(this)),this._watch?.isDirty?(this._watch.mute=!0,this._watch.applyValues(),this.context.physics.engine?.updateBody(this,this._watch.positionChanged,this._watch.rotationChanged),this._watch.reset()):this._watch?.syncValues(),this.captureVelocity(),yield}teleport(e,t=!0){this._watch?.reset(!0),t?this.gameObject.position.set(e.x,e.y,e.z):this.setWorldPosition(e.x,e.y,e.z),this.resetForcesAndTorques(),this.resetVelocities()}resetForces(e=!0){this.context.physics.engine?.resetForces(this,e)}resetTorques(e=!0){this.context.physics.engine?.resetTorques(this,e)}resetVelocities(){this.setVelocity(0,0,0),this.setAngularVelocity(0,0,0)}resetForcesAndTorques(){this.resetForces(),this.resetTorques()}wakeUp(){this.context.physics.engine?.wakeup(this)}get isSleeping(){return this.context.physics.engine?.isSleeping(this)}updateProperties(){return this._propertiesChanged=!1,this.context.physics.engine?.updateProperties(this)}applyForce(e,t,i=!0){this._propertiesChanged&&this.updateProperties(),this.context.physics.engine?.addForce(this,e,i)}applyImpulse(e,t=!0){this._propertiesChanged&&this.updateProperties(),this.context.physics.engine?.applyImpulse(this,e,t)}setForce(e,t,i,n=!0){this.context.physics.engine?.resetForces(this,n),typeof e=="number"?(t??=0,i??=0,this.context.physics.engine?.addForce(this,{x:e,y:t,z:i},n)):this.context.physics.engine?.addForce(this,e,n)}getVelocity(){const e=this.context.physics.engine?.getLinearVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setVelocity(e,t,i,n=!0){if(e instanceof b){const s=e;this.context.physics.engine?.setLinearVelocity(this,s,n);return}t===void 0||i===void 0||this.context.physics.engine?.setLinearVelocity(this,{x:e,y:t,z:i},n)}getAngularVelocity(){const e=this.context.physics.engine?.getAngularVelocity(this);return e?(this._currentVelocity.x=e.x,this._currentVelocity.y=e.y,this._currentVelocity.z=e.z,this._currentVelocity):this._currentVelocity.set(0,0,0)}setAngularVelocity(e,t,i,n=!0){if(typeof e=="object"){const s=e;this.context.physics.engine?.setAngularVelocity(this,s,n);return}if(t===void 0||i===void 0||typeof t=="boolean"){console.warn("setAngularVelocity expects either a Vec3 or 3 numbers");return}this.context.physics.engine?.setAngularVelocity(this,{x:e,y:t,z:i},n)}setTorque(e,t,i){typeof e=="number"?this.setAngularVelocity(e,t,i):this.setAngularVelocity(e)}get smoothedVelocity(){return this._smoothedVelocityGetter.copy(this._smoothedVelocity),this._smoothedVelocityGetter.multiplyScalar(1/this.context.time.deltaTime)}setBodyFromGameObject(e=null){}captureVelocity(){const e=this.gameObject.matrixWorld;om.tempPosition.setFromMatrixPosition(e);const t=om.tempPosition.sub(this._lastPosition);this._lastPosition.copy(om.tempPosition),this._smoothedVelocity.lerp(t,this.context.time.deltaTime/.1)}};Ti([Ot()],ci.prototype,"autoMass",2),Ti([u()],ci.prototype,"mass",1),Ti([Ot(),u()],ci.prototype,"useGravity",2),Ti([u(b)],ci.prototype,"centerOfMass",2),Ti([Ot(),u()],ci.prototype,"constraints",2),Ti([Ot(),u()],ci.prototype,"isKinematic",2),Ti([Ot(),u()],ci.prototype,"drag",2),Ti([Ot(),u()],ci.prototype,"angularDrag",2),Ti([Ot(),u()],ci.prototype,"detectCollisions",2),Ti([Ot(),u()],ci.prototype,"sleepThreshold",2),Ti([Ot(),u()],ci.prototype,"collisionDetectionMode",2),Ti([Ot()],ci.prototype,"_gravityScale",2),Ti([Ot()],ci.prototype,"dominanceGroup",2);let Ze=ci;new b,new b;const Ps=v("debugsync"),Fc="STRS";mg(Fc,as.getRootAsSyncedTransformModel);const Zn=new Rm;function Dw(o,e,t=!0){Zn.clear();const i=Zn.createString(o);as.startSyncedTransformModel(Zn),as.addGuid(Zn,i),as.addFast(Zn,t);const n=e.worldPosition,s=e.worldEuler,r=e.gameObject.scale;as.addTransform(Zn,jw.createTransform(Zn,n.x,n.y,n.z,s.x,s.y,s.z,r.x,r.y,r.z));const a=as.endSyncedTransformModel(Zn);return Zn.finish(a,Fc),Zn.asUint8Array()}let yf=0,Uc=0;_w(o=>{const e=o.connection.currentServerUrl?.includes("glitch")?10:40;Uc=Math.floor(yf/e),yf=0,Ps&&Uc>0&&console.log("Sync Transform Fast Interval",Uc)});class Pn extends R{overridePhysics=!0;interpolatePosition=!0;interpolateRotation=!0;fastMode=!1;syncDestroy=!1;_model=null;_needsUpdate=!0;rb=null;_wasKinematic=!1;_receivedDataBefore=!1;_targetPosition;_targetRotation;_receivedFastUpdate=!1;_shouldRequestOwnership=!1;requestOwnership(){Ps&&console.log("Request ownership"),this._model?this._model.requestOwnership():(this._shouldRequestOwnership=!0,this._needsUpdate=!0)}freeOwnership(){this._model?.freeOwnership()}hasOwnership(){return this._model?.hasOwnership??void 0}isOwned(){return this._model?.isOwned}joinedRoomCallback=null;receivedDataCallback=null;awake(){Ps&&console.log("new instance",this.guid,this),this._receivedDataBefore=!1,this._targetPosition=new b,this._targetRotation=new U,this.lastPosition=new b,this.lastRotation=new U,this.lastScale=new b,this.rb=x.getComponentInChildren(this.gameObject,Ze),this.rb&&(this._wasKinematic=this.rb.isKinematic),this.receivedUpdate=!0,this._model=new fg(this.context.connection,this.guid),this.context.connection.isConnected&&this.tryGetLastState(),this.joinedRoomCallback=this.tryGetLastState.bind(this),this.context.connection.beginListen(te.JoinedRoom,this.joinedRoomCallback),this.receivedDataCallback=this.onReceivedData.bind(this),this.context.connection.beginListenBinary(Fc,this.receivedDataCallback)}onDestroy(){this.syncDestroy&&Dg(this.guid,this.context.connection),this._model=null,this.context.connection.stopListen(te.JoinedRoom,this.joinedRoomCallback),this.context.connection.stopListenBinary(Fc,this.receivedDataCallback)}tryGetLastState(){const e=this.context.connection.tryGetState(this.guid);e&&this.onReceivedData(e)}tempEuler=new ot;onReceivedData(e){if(!this.destroyed&&typeof e.guid=="function"&&e.guid()===this.guid){Ps&&console.log("new data",this.context.connection.connectionId,this.context.time.frameCount,this.guid,e),this.receivedUpdate=!0,this._receivedFastUpdate=e.fast();const t=e.transform();if(t){hn.markDirty(this.gameObject,!0);const i=t.position();i&&(this.interpolatePosition&&this._targetPosition?.set(i.x(),i.y(),i.z()),(!this.interpolatePosition||!this._receivedDataBefore)&&this.setWorldPosition(i.x(),i.y(),i.z()));const n=t.rotation();n&&(this.tempEuler.set(n.x(),n.y(),n.z()),this.interpolateRotation&&this._targetRotation.setFromEuler(this.tempEuler),(!this.interpolateRotation||!this._receivedDataBefore)&&Jm(this.gameObject,this.tempEuler));const s=t.scale();s&&this.gameObject.scale.set(s.x(),s.y(),s.z())}this._receivedDataBefore=!0}}onEnable(){this.lastPosition.copy(this.worldPosition),this.lastRotation.copy(this.worldQuaternion),this.lastScale.copy(this.gameObject.scale),this._needsUpdate=!0,this._model&&this._model.updateIsOwned()}onDisable(){this._model&&this._model.freeOwnership()}receivedUpdate=!1;lastPosition;lastRotation;lastScale;onBeforeRender(){if(!this.activeAndEnabled||!this.context.connection.isConnected)return;if(!this.context.connection.isInRoom||!this._model){Ps&&console.log("no model or room",this.name,this.guid,this.context.connection.isInRoom);return}this._shouldRequestOwnership&&(this._shouldRequestOwnership=!1,this._model.requestOwnership());const e=this.worldPosition,t=this.worldQuaternion,i=this.gameObject.scale;if(this._model.isOwned&&!this.receivedUpdate){const r=this._model.hasOwnership||this.fastMode?1e-4:.001;(e.distanceTo(this.lastPosition)>r||t.angleTo(this.lastRotation)>r||i.distanceTo(this.lastScale)>r)&&(this._model.hasOwnership?this._needsUpdate=!0:(Ps&&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),hn.markDirty(this.gameObject,!0),this._needsUpdate=!1))}if(this._model&&!this._model.hasOwnership&&this._model.isOwned&&this._receivedDataBefore){const r=this._receivedFastUpdate||this.fastMode?.5:.3;let a=!1;if(this.interpolatePosition&&this._targetPosition){const l=this.worldPosition;l.lerp(this._targetPosition,r),this.worldPosition=l,a=!0}if(this.interpolateRotation&&this._targetRotation){const l=this.worldQuaternion;l.slerp(this._targetRotation,r),this.worldQuaternion=l,a=!0}a&&hn.markDirty(this.gameObject,!0)}if(this.receivedUpdate=!1,this.lastPosition.copy(e),this.lastRotation.copy(t),this.lastScale.copy(i),!this._model||!this._model||this._model.hasOwnership===void 0||!this._model.hasOwnership)return;this.rb&&this.overridePhysics&&this._wasKinematic!==void 0&&(Ps&&console.log("reset kinematic",this.rb.name,this._wasKinematic),this.rb.isKinematic=this._wasKinematic);const n=10,s=this.rb||this.fastMode;if(this._needsUpdate&&(this.context.time.frameCount%n===0||s)){if(yf++,s&&Uc>0&&this.context.time.frameCount%Uc!==0)return;Ps&&console.debug("[SyncedTransform] Send update",this.context.connection.connectionId,this.guid,this.gameObject.name,this.gameObject.guid),this._needsUpdate=!1;const r=Dw(this.guid,this,!!s);this.context.connection.sendBinary(r)}}}class ud{event;get deviceIndex(){return this.event.deviceIndex}get pointerId(){return this.event.pointerId}button;buttonName;get pressure(){return this.event.pressure}get used(){return this._used}_used=!1;use(){this._used||(this._used=!0,this.event.use())}_propagationStopped=!1;get propagationStopped(){return this._propagationStopped}stopPropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}stopImmediatePropagation(){this._propagationStopped=!0,this.event.stopImmediatePropagation()}z__pointer_ctured=!1;setPointerCapture(){this.z__pointer_ctured=!0}z__pointer_cture_rleased=!1;releasePointerCapture(){this.z__pointer_cture_rleased=!0}inputSource;get mode(){return this.event.mode}object;point;normal;face;distance;instanceId;intersection;isDown;isUp;isPressed;isClick;isDoubleClick;input;constructor(e,t){this.event=t,this.input=e,this.button=t.button}clone(){const e=new ud(this.input,this.event);return Object.assign(e,this),e}Use(){this.use()}StopPropagation(){this.event.stopImmediatePropagation()}}function Tu(o,e){return x.foreachComponent(o,t=>{if(!t.enabled)return;const i=t;if(e)switch(e){case"pointerdown":if(i.onPointerDown)return!0;break;case"pointerup":if(i.onPointerUp||i.onPointerClick)return!0;break;case"pointermove":if(i.onPointerEnter||i.onPointerExit||i.onPointerMove)return!0;break}else if(i.onPointerDown||i.onPointerUp||i.onPointerEnter||i.onPointerExit||i.onPointerClick)return!0},!1)===!0}const Lo=new Array;class jo{enabled=!0;target;methodName;arguments;get canClone(){return this.target instanceof Object}constructor(e,t,i,n){this.target=e,this.methodName=t||null,this.arguments=i,n!=null&&(this.enabled=n)}invoke(...e){if(this.enabled!==!1){if(typeof this.target=="function")this.arguments?(Lo.length=0,e!==void 0&&e.length>0&&Lo.push(...e),Lo.push(...this.arguments),this.target(...this.arguments),Lo.length=0):this.target(...e);else if(this.methodName!=null){const t=this.target[this.methodName];typeof t=="function"?this.arguments?(Lo.length=0,e!==void 0&&e.length>0&&Lo.push(...e),Lo.push(...this.arguments),t.call(this.target,...Lo),Lo.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 yR=o=>/^[A-Z]*$/.test(o);class Eu extends Event{args}class he{isEventList=!0;__internalOnInstantiate(e){const t=new Array;for(let i=0;i<this.methods.length;i++){const n=this.methods[i];if(!(n.target instanceof Function)){const s=n.target;let r=s?.uuid;if(s&&(r=s.guid),r){const a=e[r];if(a){const l=n.arguments?.map(c=>c instanceof Object&&c.uuid?e[c.uuid]:c?.isComponent?e[c.guid]:c);t.push(new jo(a.clone,n.methodName,l,n.enabled))}else A()&&console.warn("Could not find target for event listener")}}}return new he(t)}target;key;setEventTarget(e,t){if(this.key=e,this.target=t,this.key!==void 0){let i="",n=!1;for(const s of this.key)n&&yR(s)&&(i+="-"),n=!0,i+=s.toLowerCase();this.key=i}}get listenerCount(){return this.methods?.length??0}get isInvoking(){return this._isInvoking}_isInvoking=!1;methods=[];_methodsCopy=[];static from(...e){return new he(e)}constructor(e){if(this.methods=[],Array.isArray(e))for(const t of e)t instanceof jo?this.methods.push(t):typeof t=="function"&&this.methods.push(new jo(t));else typeof e=="function"&&this.methods.push(new jo(e))}invoke(...e){if(this._isInvoking)return console.warn("Circular event invocation detected. Please check your event listeners for circular references.",this),!1;if(this.methods?.length<=0)return!1;this._isInvoking=!0;try{this._methodsCopy.length=0,this._methodsCopy.push(...this.methods);for(const t of this._methodsCopy)t.invoke(...e);if(typeof this.target=="object"&&typeof this.key=="string"){const t=this.target.dispatchEvent;if(typeof t=="function"){const i=new Eu(this.key);i.args=e,t.call(this.target,i)}}}finally{this._isInvoking=!1,this._methodsCopy.length=0}return!0}addEventListener(e){return this.methods.push(new jo(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 bR extends Yi{constructor(){super([ne,oe],"ColorSerializer")}onDeserialize(e){if(e!=null)return e.a!==void 0?new oe(e.r,e.g,e.b,e.a):e.alpha!==void 0?new oe(e.r,e.g,e.b,e.alpha):new ne(e.r,e.g,e.b)}onSerialize(e){if(e!=null)return e.a!==void 0?{r:e.r,g:e.g,b:e.b,a:e.a}:{r:e.r,g:e.g,b:e.b}}}const _R=new bR;class vR extends Yi{constructor(){super([ot],"EulerSerializer")}onDeserialize(e,t){if(e!=null){if(e.order)return new ot(e.x,e.y,e.z,e.order);if(e.x!=null)return new ot(e.x,e.y,e.z)}}onSerialize(e,t){return{x:e.x,y:e.y,z:e.z,order:e.order}}}const wR=new vR;class xR extends Yi{constructor(){super(k,"ObjectSerializer")}onSerialize(e,t){if(t.objectToNode!==void 0&&e.uuid){const i=t.objectToNode[e.uuid];return ft&&console.log(i,e.name,e.uuid),{node:i}}}onDeserialize(e,t){if(typeof e=="string"){if(e.endsWith(".glb")||e.endsWith(".gltf")){if(t.serializable instanceof Array&&t.serializable.includes(ie))return;A()&&ye("Detected wrong usage of @serializable with Object3D or GameObject. Instead you should use AssetReference here! Please see the console for details.");const i=t.target?.constructor?.name;console.warn(`Wrong usage of @serializable detected in your script "${i}"
952
-
953
- It looks like you used @serializable(Object3D) or @serializable(GameObject) for a prefab or scene reference which is exported to a separate glTF file.
954
-
955
- To fix this please change your code to:
956
-
957
- @serializable(AssetReference)
958
- ${t.path}! : AssetReference;
959
- \0`)}return}if(e){if(e.node!==void 0&&t.nodeToObject){const i=t.nodeToObject[e.node];return ft&&console.log("Deserialized object reference?",e,i,t?.nodeToObject),i||console.warn("Did not find node: "+e.node,t.nodeToObject,t.object),i}else if(e.guid){if(!t.context){console.error("Missing context");return}let i;const n=t.gltf?.scene;return n&&(i=x.findByGuid(e.guid,n)),i||(i=x.findByGuid(e.guid,t.context.scene)),i?(i&&i.isComponent===!0&&(ft&&console.warn("Deserialized object reference is a component"),i=i.gameObject),ft&&console.log("Deserialized object reference?",e,i,t?.nodeToObject)):((A()||ft)&&console.warn("Could not resolve object reference",t.path,e,t.target,t.context.scene),e.could_not_resolve=!0),i}}}}const Bw=new xR;class SR extends Yi{constructor(){super([R,R],"ComponentSerializer")}onSerialize(e,t){if(e?.guid)return{guid:e.guid}}onDeserialize(e,t){if(e?.guid){if(e.___persistentAsset){ft&&console.log("Skipping component deserialization because it's a persistent asset",e);return}const i=t.path;ft&&console.log(e.guid,t.root,t.object,t.target);let n=this.findObjectForGuid(e.guid,t.root);if(n||t.context&&(n=this.findObjectForGuid(e.guid,t.context?.scene),n))return n;(A()||ft)&&console.warn('Could not resolve component reference: "'+i+'" using guid '+e.guid,t.target),e.could_not_resolve=!0;return}}findObjectForGuid(e,t){if(t.guid===e)return t;const i=x.foreachComponent(t,n=>{if(n.guid===e)return n},!1);if(i!==void 0)return i;for(let n=0;n<t.children.length;n++){const s=t.children[n],r=this.findObjectForGuid(e,s);if(r)return r}}}const Au=new SR;class CR extends Yi{constructor(){super([he])}onSerialize(e,t){console.log("TODO: SERIALIZE EVENT")}onDeserialize(e,t){if(typeof e=="function")return new he([new jo(e,null,[],!0)]);if(e&&e.type==="EventList"){ft&&console.log("DESERIALIZE EVENT",e);const i=new Array;if(e.calls&&Array.isArray(e.calls))for(const r of e.calls){let a=function(h){if(typeof h=="object"){let d=Bw.onDeserialize(h,t);if(d||(d=Au.onDeserialize(h,t)),d)return d}return h};ft&&console.log(r);let l=Au.findObjectForGuid(r.target,t.root);!l&&t.context?.scene&&(l=Au.findObjectForGuid(r.target,t.context?.scene));const c=r.method?.length>0;if(l&&c){const h=()=>{const d=r.method[0].toUpperCase()+r.method.slice(1);if(typeof l[d]=="function"){console.warn(`EventList method:
960
- Could not find method ${r.method} on object ${l.name}. Please rename ${r.method} to ${d}?
961
- `,l[d],`
962
- in script: `,l),ye("EventList methods must start with lowercase letter, see console for details");return}else console.warn(`EventList method:
963
- Could not find method ${r.method} on object ${l.name}`,l,typeof l[r.method])};if(typeof l[r.method]!="function"){let d=!1,p=l;for(;p;){const m=Object.getOwnPropertyDescriptor(p,r.method);if(m&&(m.writable===!0||m.set)){d=!0;break}p=Object.getPrototypeOf(p)}!d&&(A()||ft)&&h()}}if(l){let h=r.argument;if(h!==void 0?h=a(h):r.arguments!==void 0&&(h=r.arguments.map(a)),!l[r.method])console.warn(`EventList method not found: "${r.method}" on ${l?.name}`);else{h!==void 0&&!Array.isArray(h)&&(h=[h]);const d=new jo(l,r.method,h,r.enabled);i.push(d)}}else A()&&console.warn(`[Dev] EventList: Could not find event listener in scene (${t.object?.name})`,r)}const n=new he(i);ft&&console.log(n);const s=t.target;return s!==void 0&&t.path!==void 0&&n.setEventTarget(t.path,s),n}}}const PR=new CR,Iu=new WeakMap,OR=Le.prototype.clone;Le.prototype.clone=function(){const o=OR.call(this);return Iu.has(o)||Iu.set(o,this),o};class Fw extends Yi{constructor(){super([_o,Vn])}onSerialize(e,t){}onDeserialize(e,t){if(e instanceof Le&&t.type===_o){let i=e;Iu.has(i)&&(i=Iu.get(i)),i.isRenderTargetTexture=!0,i.flipY=!0,i.offset.y=1,i.repeat.y=-1,i.needsUpdate=!0,i.mipmaps=[],i instanceof zS&&(i.isCompressedTexture=!1,i.format=vd);const n=new _o(i.image.width,i.image.height,{colorSpace:So});return n.texture=i,n}}}new Fw;class Uw extends Yi{constructor(){super([URL])}onSerialize(e,t){return null}onDeserialize(e,t){if(typeof e=="string"&&e.length>0)return ms(t.gltfId,e)}}new Uw;var kR=Object.defineProperty,MR=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&kR(e,t,n),n};class Ka extends R{awake(){si.createIfNoneExists(this.context)}onEnable(){si.get(this.context)?.register(this)}onDisable(){si.get(this.context)?.unregister(this)}}class Ei extends Ka{targets=null;raycastHits=[];ignoreSkinnedMeshes=!1;start(){this.targets=[this.gameObject]}performRaycast(e=null){if(!this.targets)return null;e??=new bs,e.targets=this.targets,e.results=this.raycastHits,e.useAcceleratedRaycast=!0;const t=e.testObject;this.ignoreSkinnedMeshes&&(e.testObject=n=>n instanceof us?"continue in children":t?t(n):!0);const i=this.context.physics.raycast(e);return e.testObject=t,i}}MR([u()],Ei.prototype,"ignoreSkinnedMeshes");class Lu extends Ei{constructor(){super(),this.ignoreSkinnedMeshes=!0}}class ya extends Ka{static allow=!0;performRaycast(e){if(!Z.active||!ya.allow||!e?.ray)return null;const t=e.ray.origin;return this.context.physics.sphereOverlap(t,.015,!1,!0)}}class bf{static getObject(e){const t=e[Mi];return t&&(t.isComponent===!0?e=t.gameObject:e=t),e}static isInteractable(e,t){if(t&&(t.canvasGroup=void 0,t.graphic=void 0),e==null||!e.visible||(e=this.getObject(e),!e.visible))return!1;const i=this.tryFindCanvasGroup(e);if(i?.isCanvasGroup===!0&&(t&&(t.canvasGroup=i),i.blocksRaycasts===!1||i.interactable===!1))return!1;const n=Er(e,s=>{if(s.isGraphic===!0)return s},!1);return t&&n?.isGraphic===!0&&(t.graphic=n),!(n?.raycastTarget===!1||n?.layer===2)}static tryFindCanvasGroup(e){if(!e)return null;const t=Er(e,i=>{if(i.activeAndEnabled){const n=i;if(n.blocksRaycasts!==void 0&&n.interactable!==void 0)return n}},!1);return t!==void 0?t:this.tryFindCanvasGroup(e.parent)}}function _f(o){return o[Mi]||(o.parent?_f(o.parent):null)}function RR(o){return o.isUI===!0||typeof o[Mi]=="object"}function ju(o,e){if(!o)return;const t=o.material;if(t?.isMaterial===!0){const i=o.parent;i&&i.isText,t.side=e.doubleSided??!0?Ci:ps,t.shadowSide=e.doubleSided?Ci:ps,o.castShadow=e.castShadows?e.castShadows:!1,o.receiveShadow=e.receiveShadows?e.receiveShadows:!1}for(const i of o.children)ju(i,e)}function Ja(o,e,t){o[e]===void 0&&console.warn("Field",e,"is undefined on",o);const i=Proxy.revocable(o[e],{set(r,a,l,c){const h=r[a],d=Reflect.set(r,a,l,c);return t(l,h),d}}),n=i.revoke,s=o[e];return i.revoke=()=>{o[e]=s,n()},o[e]=i.proxy,i}const zw=Symbol("Scheduled action");function TR(o,e,t=we.OnBeforeRender){let i=o[zw];i||(i=o[zw]={});const n=e.name;i[t]||(i[t]={});const s=i[t];if(s[n])return;function*r(){e?.call(o),s[n]=null}const a=o.startCoroutine(r(),t);s[n]=a}const Os=v("debugeventsystem");var vf=(o=>(o.BeforeHandleInput="BeforeHandleInput",o.AfterHandleInput="AfterHandleInput",o))(vf||{});bw(o=>{si.createIfNoneExists(o)});class si extends R{static ensureUpdateMeshUI(e,t,i=!1){zc.update(e,t,i)}static markUIDirty(e){zc.markDirty()}static createIfNoneExists(e){e.scene.getComponent(si)||e.scene.addComponent(si)}static get(e){return this.createIfNoneExists(e),e.scene.getComponent(si)}static get instance(){return this.get(z.Current)}raycaster=[];register(e){e&&this.raycaster&&!this.raycaster.includes(e)&&this.raycaster?.push(e)}unregister(e){const t=this.raycaster?.indexOf(e);t!==void 0&&t!==-1&&this.raycaster?.splice(t,1)}get hasActiveUI(){return this.currentActiveMeshUIComponents.length>0}get isHoveringObjects(){return this.hoveredByID.size>0}awake(){this.gameObject!==this.context.scene&&(console.debug(`[Needle Engine] EventSystem is only allowed on the scene root. Disabling EventSystem on '${this.gameObject.name}'`),this.enabled=!1)}start(){this.context.scene.getComponent(Ka)||this.context.scene.addComponent(Ei)}onEnable(){this.context.input.addEventListener(Ee.PointerDown,this.onPointerEvent),this.context.input.addEventListener(Ee.PointerUp,this.onPointerEvent),this.context.input.addEventListener(Ee.PointerMove,this.onPointerEvent)}onDisable(){this.context.input.removeEventListener(Ee.PointerDown,this.onPointerEvent),this.context.input.removeEventListener(Ee.PointerUp,this.onPointerEvent),this.context.input.removeEventListener(Ee.PointerMove,this.onPointerEvent)}pressedByID=new Map;hoveredByID=new Map;onBeforeRender(){this.resetMeshUIStates()}onPointerEvent=e=>{if(e===void 0||e.propagationStopped||e.defaultPrevented||e.used)return;const t=new ud(this.context.input,e);this._currentPointerEventName=e.type,t.inputSource=this.context.input,t.isClick=e.isClick,t.isDoubleClick=e.isDoubleClick,t.isDown=e.type==Ee.PointerDown,t.isUp=e.type==Ee.PointerUp,t.isPressed=this.context.input.getPointerPressed(e.pointerId);const i=new bs;e.hasRay?i.ray=e.ray:i.screenPoint=this.context.input.getPointerPositionRC(e.pointerId),i.allowSlowRaycastFallback=e.isClick||e.isDoubleClick;const n=this.performRaycast(i);if(Os&&(t.isDown?console.log("DOWN",{id:t.pointerId,hits:n.length}):t.isUp&&console.log("UP",{id:t.pointerId,hits:n.length}),t.isClick&&console.log("CLICK",{id:t.pointerId,hits:n.length})),n){for(const r of n)r.event=e,e.intersections.push(r);e.origin.onPointerHits&&e.origin.onPointerHits({sender:this,event:e,hits:n})}Os&&t.isClick&&Te("EventSystem: "+t.pointerId+" - "+this.context.time.frame+" - Up:"+t.isUp+", Down:"+t.isDown);const s={sender:this,args:t,hasActiveUI:this.currentActiveMeshUIComponents.length>0};this.dispatchEvent(new CustomEvent("BeforeHandleInput",{detail:s})),this.handleIntersections(n,t),this.dispatchEvent(new CustomEvent("AfterHandleInput",{detail:s}))};_sortedHits=[];_testObjectsCache=new Map;_currentlyActiveRaycaster=null;_currentPointerEventName=null;shouldRaycastObject=e=>{const t=e&&"getComponent"in e?e.getComponent(Ka):null;if(t&&t!=this._currentlyActiveRaycaster)return!1;let i=null;if(RR(e)&&(i=e[Mi]?.gameObject),this._testObjectsCache.has(e)||i&&this._testObjectsCache.has(i))return this._testObjectsCache.get(e)===!1?"continue in children":!0;{let n=Tu(e,this._currentPointerEventName);if(!n&&i&&(n=Tu(i,this._currentPointerEventName)),n){this._testObjectsCache.set(e,!0);for(const s of e.children)this.shouldRaycastObject_AddToYesCache(s);return!0}return this._testObjectsCache.set(e,!1),"continue in children"}};shouldRaycastObject_AddToYesCache(e){this._testObjectsCache.set(e,!0);for(const t of e.children)this.shouldRaycastObject_AddToYesCache(t)}performRaycast(e){if(!this.raycaster)return null;this._testObjectsCache.clear(),this._sortedHits.length=0,e.testObject=this.shouldRaycastObject;for(const t of this.raycaster){if(!t.activeAndEnabled)continue;this._currentlyActiveRaycaster=t;const i=t.performRaycast(e);this._currentlyActiveRaycaster=null,i&&i.length>0&&this._sortedHits.push(...i)}return this._sortedHits.sort((t,i)=>t.distance-i.distance),this._sortedHits}assignHitInformation(e,t){t?(e.intersection=t,e.point=t.point,e.normal=t.normal,e.face=t.face,e.distance=t.distance,e.instanceId=t.instanceId):(e.intersection=void 0,e.point=void 0,e.normal=void 0,e.face=void 0,e.distance=void 0,e.instanceId=void 0)}handleIntersections(e,t){if(e?.length){e=this.sortCandidates(e);for(const n of e){if(t.event.immediatePropagationStopped)return!1;if(this.assignHitInformation(t,n),this.handleEventOnObject(n.object,t))return!0}}this.assignHitInformation(t,e?.[0]),this.invokePointerCapture(t);const i=this.hoveredByID.get(t.pointerId);return i&&this.propagatePointerExit(i.obj,i.data,null),this.hoveredByID.delete(t.pointerId),t.isUp&&(this.pressedByID.get(t.pointerId)?.handlers.forEach(n=>this.invokeOnPointerUp(t,n)),this.pressedByID.delete(t.pointerId)),!1}_sortingBuffer=[];_noDepthTestingResults=[];sortCandidates(e){this._sortingBuffer.length=0,this._noDepthTestingResults.length=0;for(let t=0;t<e.length;t++){const i=e[t],n=i.object;if(n.material&&n.material.depthTest===!1){this._noDepthTestingResults.push(i);continue}this._sortingBuffer.push(i)}for(const t of this._sortingBuffer)this._noDepthTestingResults.push(t);return this._noDepthTestingResults}out={};handleEventOnObject(e,t){if(!this.testIsVisible(e))return t.isClick&&Os&&console.log("not allowed",e),!1;if(t.pointerId===void 0)return Os&&console.error("Event without pointer can't be handled",t),!1;t.object=e;const i=e.parent,n=t.isClick??!1;let s=null;if(i&&i.isUI){const c=(t.isPressed||t.isClick)??!1;if(i[Mi]){const h=i[Mi].gameObject;if(h){if(!bf.isInteractable(h,this.out))return!1;s=this.out.canvasGroup??null,this.handleMeshUIIntersection(e,c),e=h}}}n&&Os&&console.log(this.context.time.frame,e);const r=this.hoveredByID.get(t.pointerId),a=r?.obj;a!==e&&a&&this.propagatePointerExit(a,r.data,e);const l=this.hoveredByID.get(t.pointerId);if(l?(l.obj=e,l.data=t):this.hoveredByID.set(t.pointerId,{obj:e,data:t}),t.isDown){const c=this.pressedByID.get(t.pointerId);c?(c.obj=e,c.data=t):this.pressedByID.set(t.pointerId,{obj:e,data:t,handlers:new Set})}return(s===null||s.interactable)&&this.handleMainInteraction(e,t,a??null),!0}propagate(e,t){for(;e;)x.foreachComponent(e,i=>{t(i)},!1),e=e.parent}handleMainInteraction(e,t,i){const n=this.pressedByID.get(t.pointerId),s=i!==e;let r=!0;switch(t.event.pointerType){case"mouse":case"touch":const a=this.context.input.getPointerPositionLastFrame(t.pointerId),l=this.context.input.getPointerPosition(t.pointerId);r=a&&!L.approximately(a,l);break}this.propagate(e,a=>{const l=a;l.interactable!==!1&&(!l.activeAndEnabled||!l.enabled||(l.onPointerEnter&&s&&this.handlePointerEnter(l,t),t.isDown&&l.onPointerDown&&(l.onPointerDown(t),n?.handlers.add(l),this.handlePointerCapture(t,l)),l.onPointerMove&&(r&&l.onPointerMove(t),this.handlePointerCapture(t,l)),t.isUp&&(l.onPointerUp&&(this.invokeOnPointerUp(t,l),n?.handlers.delete(l)),l.onPointerExit&&t.event?.pointerType===Vd.Touch&&(this.handlePointerExit(l,t),this.hoveredByID.delete(t.pointerId))),t.isClick&&l.onPointerClick&&l.onPointerClick(t)))}),t.isUp&&(n?.handlers.forEach(a=>{this.invokeOnPointerUp(t,a)}),this.pressedByID.delete(t.pointerId))}propagatePointerExit(e,t,i){this.propagate(e,n=>{if(!n.gameObject||n.destroyed)return;const s=n;if(s.onPointerExit||s.onPointerEnter){if(i&&this.isChild(i,n.gameObject))return;this.handlePointerExit(s,t)}})}invokeOnPointerUp(e,t){t.onPointerUp?.call(t,e),this.releasePointerCapture(e,t)}handlePointerEnter(e,t){e.onPointerEnter&&this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!0)&&e.onPointerEnter(t),this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!1)}handlePointerExit(e,t){e.onPointerExit&&this.updatePointerState(e,t.pointerId,this.pointerExitSymbol,!0)&&e.onPointerExit(t),this.updatePointerState(e,t.pointerId,this.pointerEnterSymbol,!1)}updatePointerState(e,t,i,n){let s=e[i];if(n)return s&&s.includes(t)?!1:(s=s||[],s.push(t),e[i]=s,!0);{if(!s||!s.includes(t))return!1;const r=s.indexOf(t);return r!==-1&&s.splice(r,1),!0}}_capturedPointer={};handlePointerCapture(e,t){if(e.z__pointer_ctured){e.z__pointer_ctured=!1;const i=e.pointerId;if(t.onPointerMove){const n=this._capturedPointer[i]||[];n.push(t),this._capturedPointer[i]=n}else A()&&!t.z__warned_no_pointermove&&(t.z__warned_no_pointermove=!0,console.warn("PointerCapture was requested but the component doesn't implement onPointerMove. It will not receive any pointer events"))}else e.z__pointer_cture_rleased&&(e.z__pointer_cture_rleased=!1,this.releasePointerCapture(e,t))}releasePointerCapture(e,t){const i=e.pointerId;if(this._capturedPointer[i]){const n=this._capturedPointer[i].indexOf(t);n!==-1&&(this._capturedPointer[i].splice(n,1),Os&&console.log("released pointer capture",i,t,this._capturedPointer))}}invokePointerCapture(e){if(e.event.type===Ee.PointerMove){const t=e.pointerId,i=this._capturedPointer[t];if(i){Os&&console.log("Captured",t,i);for(let n=0;n<i.length;n++){const s=i[n];if(s.destroyed){i.splice(n,1),n--;continue}s.onPointerMove?.call(s,e)}}}}pointerEnterSymbol=Symbol("pointerEnter");pointerExitSymbol=Symbol("pointerExit");isChild(e,t){return!e||!t?!1:e===t?!0:e.parent?this.isChild(e.parent,t):!1}handleMeshUiObjectWithoutShadowDom(e,t){return!e||!e.isUI?!0:this.handleMeshUIIntersection(e,t)}currentActiveMeshUIComponents=[];handleMeshUIIntersection(e,t){const i=zc.updateState(e,t);return i&&this.currentActiveMeshUIComponents.push(i),i!==null}resetMeshUIStates(){if(this.context.input.getPointerPressedCount()>0&&zc.resetLastSelected(),!(!this.currentActiveMeshUIComponents||this.currentActiveMeshUIComponents.length<=0)){for(let e=0;e<this.currentActiveMeshUIComponents.length;e++){const t=this.currentActiveMeshUIComponents[e];zc.resetState(t)}this.currentActiveMeshUIComponents.length=0}}testIsVisible(e){return e?x.isActiveSelf(e)?this.testIsVisible(e.parent):!1:!0}}class zc{static lastSelected=null;static lastUpdateFrame=[];static needsUpdate=!1;static markDirty(){this.needsUpdate=!0}static update(e,t,i=!1){if(i){e.update();return}const n=t.time.frameCount;for(const s of this.lastUpdateFrame)if(s.context===t){if(n===s.frame)return;s.frame=n;let r=this.needsUpdate||n<1;s.nextUpdate<=n&&(r=!0),r&&(Os&&console.log("Update threemeshui"),this.needsUpdate=!1,s.nextUpdate=n+60,e.update());return}this.lastUpdateFrame=[{context:t,frame:n,nextUpdate:n+60}],e.update(),this.needsUpdate=!1}static updateState(e,t){let i=null;if(e&&(i=this.findBlockOrTextInParent(e),i&&i!==this.lastSelected)){if(i.interactable===!1)return null;this.needsUpdate=!0}return i}static resetLastSelected(){const e=this.lastSelected;e&&(this.lastSelected=null,this.resetState(e))}static resetState(e){e&&(this.needsUpdate=!0)}static findBlockOrTextInParent(e){return e?e.isBlock||e.isText?e:this.findBlockOrTextInParent(e.parent):null}}var ER=Object.defineProperty,AR=Object.getOwnPropertyDescriptor,Oe=(o,e,t,i)=>{for(var n=i>1?void 0:i?AR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&ER(e,t,n),n};const Bt=v("debugorbit"),wf=v("freecam"),IR=v("debugcamerafit"),Du=v("smoothcam"),LR={LEFT:"",UP:"",RIGHT:"",BOTTOM:""};let xf;class Nc extends CustomEvent{constructor(e,t){super("target-reached",{detail:{controls:e,type:t}})}}class me extends R{get isCameraController(){return!0}get controls(){return this._controls}get controllerObject(){return this._cameraObject}onStartInteraction(e){this.controls?.addEventListener("start",e)}autoTarget=!0;autoFit=!1;enableRotate=!0;autoRotate=!1;autoRotateSpeed=1;minAzimuthAngle=1/0;maxAzimuthAngle=1/0;minPolarAngle=0;maxPolarAngle=Math.PI;enableKeys=!1;enableDamping=!0;dampingFactor=.1;enableZoom=!0;minZoom=0;maxZoom=1/0;zoomSpeed=1;zoomToCursor=!1;enablePan=!0;lookAtConstraint=null;lookAtConstraint01=1;allowInterrupt=!0;middleClickToFocus=!0;doubleClickToFocus=!0;clickBackgroundToFitScene=2;get targetElement(){return this._controls?.domElement??this._targetElement}set targetElement(e){this._targetElement=e,this._controls&&this._controls.domElement!==e&&(this._controls.disconnect(),this._controls.domElement=e,this._controls.connect())}_targetElement=null;debugLog=!1;get targetLerpSpeed(){return 5}set targetLerpSpeed(e){this.targetLerpDuration=1/e}get targetLerpDuration(){return this._lookTargetLerpDuration}set targetLerpDuration(e){this._lookTargetLerpDuration=e}_lookTargetLerpDuration=1;targetBounds=null;rotateLeft(e){this._controls?._rotateLeft(e)}rotateUp(e){this._controls?._rotateUp(e)}pan(e,t){this._controls?._pan(e,t)}zoomIn(e){e>0?this._controls?._dollyIn(1-e):e<0&&this._controls?._dollyOut(1+e)}_controls=null;_cameraObject=null;_lookTargetLerpActive=!1;_lookTargetStartPosition=new b;_lookTargetEndPosition=new b;_lookTargetLerp01=0;_cameraLerpActive=!1;_cameraStartPosition=new b;_cameraEndPosition=new b;_cameraLerp01=0;_cameraLerpDuration=0;_fovLerpActive=!1;_fovLerpStartValue=0;_fovLerpEndValue=0;_fovLerp01=0;_fovLerpDuration=0;_inputs=0;_enableTime=0;_startedListeningToKeyEvents=!1;_eventSystem;_afterHandleInputFn;_camera=null;_syncedTransform;_didSetTarget=0;awake(){Bt&&console.debug("OrbitControls",this),this._didSetTarget=0,this._startedListeningToKeyEvents=!1,this.context.domElement.cameraControls===!1&&(this.enabled=!1)}start(){this._eventSystem=si.get(this.context)??void 0,this._eventSystem&&(this._afterHandleInputFn=this.afterHandleInput.bind(this),this._eventSystem.addEventListener(vf.AfterHandleInput,this._afterHandleInputFn))}onDestroy(){this._controls?.dispose(),this._eventSystem?.removeEventListener(vf.AfterHandleInput,this._afterHandleInputFn)}onEnable(){this._didSetTarget=0,this._enableTime=this.context.time.time;const e=x.getComponent(this.gameObject,hi);this._camera=e;let t=e?.threeCamera;if(!t&&this.gameObject instanceof re&&(t=this.gameObject),t&&Gm(t,this,!0),!this._controls&&t instanceof k){this._cameraObject=t;const i=this.targetElement??this.context.renderer.domElement,n=t?.quaternion.clone();this._controls=new bb(t,i),t?.quaternion.copy(n),xf===void 0&&(xf={...this._controls.keys});const s=J(t),r=this.gameObject.worldForward,a=s.clone().sub(r.multiplyScalar(2.5));this._controls.target.copy(a)}if(this._controls)if(wf&&(this.enablePan=!0,this.enableZoom=!0,this.middleClickToFocus=!0,q.isMobileDevice()&&(this.doubleClickToFocus=!0)),this._controls.addEventListener("start",this.onControlsChangeStarted),this._controls.addEventListener("endMovement",this.onControlsChangeEnded),!this._startedListeningToKeyEvents&&this.enableKeys)this._startedListeningToKeyEvents=!0,this._controls.listenToKeyEvents(this.context.domElement);else try{this._controls.stopListenToKeyEvents()}catch{}this._syncedTransform=x.getComponent(this.gameObject,Pn)??void 0,this.context.pre_render_callbacks.push(this.__onPreRender),this._activePointerEvents=[],this.context.input.addEventListener("pointerdown",this._onPointerDown,{queue:ai.Early}),this.context.input.addEventListener("pointerdown",this._onPointerDownLate,{queue:ai.Late}),this.context.input.addEventListener("pointerup",this._onPointerUp,{queue:ai.Early}),this.context.input.addEventListener("pointerup",this._onPointerUpLate,{queue:ai.Late})}onDisable(){if(this._camera?.threeCamera&&Gm(this._camera.threeCamera,this,!1),this._controls){this._controls.enabled=!1,this._controls.autoRotate=!1,this._controls.removeEventListener("start",this.onControlsChangeStarted),this._controls.removeEventListener("endMovement",this.onControlsChangeEnded);try{this._controls.stopListenToKeyEvents()}catch{}this._startedListeningToKeyEvents=!1}this._activePointerEvents.length=0,this.context.input.removeEventListener("pointerdown",this._onPointerDown),this.context.input.removeEventListener("pointerdown",this._onPointerDownLate),this.context.input.removeEventListener("pointerup",this._onPointerUp),this.context.input.removeEventListener("pointerup",this._onPointerUpLate)}_activePointerEvents;_lastTimeClickOnBackground=-1;_clickOnBackgroundCount=0;_onPointerDown=e=>{this._activePointerEvents.push(e)};_onPointerDownLate=e=>{e.used&&this._controls&&(this._controls.enabled=!1)};_onPointerUp=e=>{for(let t=this._activePointerEvents.length-1;t>=0;t--){const i=this._activePointerEvents[t];if(i.pointerId===e.pointerId&&i.button===e.button){this._activePointerEvents.splice(t,1);break}}if(this.clickBackgroundToFitScene>0&&e.isClick&&e.button===0){if(e.hasRay||e.intersections.push(...this.context.physics.raycast()),e.intersections.length<=0){const t=this.context.time.time-this._lastTimeClickOnBackground;this._lastTimeClickOnBackground=this.context.time.time,this.clickBackgroundToFitScene<=1||t<this.clickBackgroundToFitScene*.15?(this._clickOnBackgroundCount+=1,this._clickOnBackgroundCount>=this.clickBackgroundToFitScene-1&&(this.autoRotate=!1,this.fitCamera({objects:this.context.scene,immediate:!1}))):this._clickOnBackgroundCount=0}Bt&&console.log(this.clickBackgroundToFitScene,e.intersections.length,this._clickOnBackgroundCount)}};_onPointerUpLate=e=>{this.doubleClickToFocus&&e.isDoubleClick&&!e.used&&this.setTargetFromRaycast()};updateTargetNow(e){const t=new vo(this._cameraObject?.worldPosition,this._cameraObject?.worldForward.multiplyScalar(-1)),i=this.context.physics.raycastFromRay(t,e),n=i.length>0?i[0]:void 0;n&&n.distance>this.minZoom&&n.distance<this.maxZoom?(Bt&&B.DrawWireSphere(n.point,.1,16711680,2),this._controls?.target.copy(i[0].point)):Bt&&console.log("OrbitControls: No hit found when updating target",{hits:[...i]})}_orbitStartAngle=0;_zoomStartDistance=0;onControlsChangeStarted=()=>{Bt&&console.debug("OrbitControls: Change started"),this._controls&&(this._orbitStartAngle=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle(),this._zoomStartDistance=this._controls.getDistance()),this._syncedTransform&&this._syncedTransform.requestOwnership()};onControlsChangeEnded=()=>{if(Bt&&console.debug("OrbitControls: Change ended",{autoTarget:this.autoTarget}),this._controls&&this.autoTarget){const e=this._controls.getAzimuthalAngle()+this._controls.getPolarAngle()-this._orbitStartAngle;Math.abs(e)<.01?(Bt&&console.debug("OrbitControls: Update target",{deltaAngle:e}),this.updateTargetNow({allowSlowRaycastFallback:!1})):Bt&&console.debug("OrbitControls: No target update",{deltaAngle:e})}};_shouldDisable=!1;afterHandleInput(e){e.detail.args.pointerId===0&&(e.detail.args.isDown?this._controls&&this._eventSystem&&(this._shouldDisable=this._eventSystem.hasActiveUI):(!e.detail.args.isPressed||e.detail.args.isUp)&&(this._shouldDisable=!1))}onPausedChanged(e){this._controls&&e&&(this._controls.enabled=!1)}onBeforeRender(){if(!!this._controls){if(this._cameraObject!==this.context.mainCamera){this._controls.enabled=!1;return}if(this._controls.enabled=!0,(this.context.input.getPointerDown(1)||this.context.input.getPointerDown(2)||this.context.input.mouseWheelChanged||this.context.input.getPointerPressed(0)&&this.context.input.getPointerPositionDelta(0)?.length())&&(this._inputs+=1),this._inputs>0&&this.allowInterrupt&&(this.enableRotate&&(this.autoRotate=!1),this._cameraLerpActive=!1,this._lookTargetLerpActive=!1),this._inputs=0,this.autoTarget&&this._didSetTarget++===0){const e=x.getComponent(this.gameObject,hi);if(e&&!this.setLookTargetFromConstraint()){this.debugLog&&console.log("NO TARGET");const t=J(e.threeCamera),i=Math.max(.01,t.length()),n=new b(0,0,-i).applyMatrix4(e.threeCamera.matrixWorld);Bt&&B.DrawLine(t,n,5592575,10),this.setLookTargetPosition(n,!0)}if(!this.setLookTargetFromConstraint()){const t=new bs;t.screenPoint=new ee(0,0),t.lineThreshold=.1;const i=this.context.physics.raycast(t);i.length>0&&this.setLookTargetPosition(i[0].point,!0),IR&&console.log("OrbitControls hits",...i)}}if(this.middleClickToFocus&&this.context.input.getPointerClicked(1)&&this.setTargetFromRaycast(),this._lookTargetLerpActive||this._cameraLerpActive||this._fovLerpActive){if(this._cameraLerpActive&&this._cameraObject)if(this._cameraLerp01+=this.context.time.deltaTime/this._cameraLerpDuration,this._cameraLerp01>=1)this._cameraObject.position.copy(this._cameraEndPosition),this._cameraLerpActive=!1,this.dispatchEvent(new Nc(this,"camera"));else{const e=L.easeInOutCubic(this._cameraLerp01);this._cameraObject.position.lerpVectors(this._cameraStartPosition,this._cameraEndPosition,e)}if(this._lookTargetLerpActive)if(this._lookTargetLerp01+=this.context.time.deltaTime/this._lookTargetLerpDuration,this._lookTargetLerp01>=1)this.lerpLookTarget(this._lookTargetEndPosition,this._lookTargetEndPosition,1),this._lookTargetLerpActive=!1,this.dispatchEvent(new Nc(this,"lookat"));else{const e=L.easeInOutCubic(this._lookTargetLerp01);this.lerpLookTarget(this._lookTargetStartPosition,this._lookTargetEndPosition,e)}if(this._fovLerpActive&&this._cameraObject){const e=this._cameraObject;if(this._fovLerp01+=this.context.time.deltaTime/this._fovLerpDuration,this._fovLerp01>=1)e.fov=this._fovLerpEndValue,this._fovLerpActive=!1;else{const t=L.easeInOutCubic(this._fovLerp01);e.fov=L.lerp(this._fovLerpStartValue,this._fovLerpEndValue,t)}e.updateProjectionMatrix()}}if(this.targetBounds){const e=this._controls.target,t=this.targetBounds.worldPosition,i=D(this.targetBounds.worldScale).multiplyScalar(.5),n=D(t).sub(i),s=D(t).add(i),r=D(this._controls.target).clamp(n,s),a=.1;e.lerp(r,this.context.time.deltaTime/a),this._lookTargetLerpActive&&this._lookTargetEndPosition.lerp(r,this.context.time.deltaTime/(a*5)),Bt&&B.DrawWireBox(t,i.multiplyScalar(2),16755200)}if(this._controls){this.debugLog&&(this._controls.domElement=this.context.renderer.domElement);const e=1/(this.context.focusRectSettings?.zoom||1);if(this._controls.enabled=!this._shouldDisable&&this._camera===this.context.mainCameraComponent&&!this.context.isInXR&&!this._activePointerEvents.some(t=>t.used),this._controls.keys=this.enableKeys?xf:LR,this._controls.autoRotate=this.autoRotate,this._controls.autoRotateSpeed=this.autoRotateSpeed,this._controls.enableZoom=this.enableZoom,this._controls.zoomSpeed=this.zoomSpeed,this._controls.zoomToCursor=this.zoomToCursor,this._controls.enableDamping=this.enableDamping,this._controls.dampingFactor=this.dampingFactor,this._controls.enablePan=this.enablePan,this._controls.panSpeed=e,this._controls.enableRotate=this.enableRotate,this._controls.minAzimuthAngle=this.minAzimuthAngle,this._controls.maxAzimuthAngle=this.maxAzimuthAngle,this._controls.minPolarAngle=this.minPolarAngle,this._controls.maxPolarAngle=this.maxPolarAngle,wf||(this._camera?.threeCamera?.type==="PerspectiveCamera"?(this._controls.minDistance=this.minZoom,this._controls.maxDistance=this.maxZoom,this._controls.minZoom=0,this._controls.maxZoom=1/0):(this._controls.minDistance=0,this._controls.maxDistance=1/0,this._controls.minZoom=this.minZoom,this._controls.maxZoom=this.maxZoom)),typeof Du=="number"||Du===!0){this._controls.enableDamping=!0;const t=typeof Du=="number"?Du:.99;this._controls.dampingFactor=Math.max(.001,1-Math.min(1,t))}this.allowInterrupt||(this._lookTargetLerpActive&&(this._controls.enablePan=!1),this._cameraLerpActive&&(this._controls.enableRotate=!1,this._controls.autoRotate=!1),(this._lookTargetLerpActive||this._cameraLerpActive)&&(this._controls.enableZoom=!1)),this.context.isInXR||(!wf&&this.lookAtConstraint?.locked&&!this._lookTargetLerpActive&&this.setLookTargetFromConstraint(0,this.lookAtConstraint01),this._controls.update(this.context.time.deltaTime),Bt&&B.DrawWireSphere(this._controls.target,.1,65280))}}}__onPreRender=()=>{const e=this.context.pre_render_callbacks.indexOf(this.__onPreRender);e>=0&&this.context.pre_render_callbacks.splice(e,1),this.autoFit&&(this.autoFit=!1,this.fitCamera({centerCamera:"y",immediate:!0,objects:this.scene.children}))};setCameraAndLookTarget(e,t=!1){if(!e)return(A()||Bt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is null"),!1;if(!(e instanceof k)&&!(e instanceof hi))return(A()||Bt)&&console.warn("[OrbitControls] setCameraAndLookTarget target is not an Object3D or Camera"),!1;e instanceof hi&&(e=e.gameObject);const i=e.worldPosition,n=e.worldForward;e instanceof NS&&(Bt&&console.debug("[OrbitControls] setCameraAndLookTarget flip forward direction for camera"),n.multiplyScalar(-1));const s=new vo(i,n);return Bt&&B.DrawRay(s.origin,s.direction,16711680,10),this.setTargetFromRaycast(s,t)||this.setLookTargetPosition(s.at(2,D()),t),this.setCameraTargetPosition(i,t),!0}setCameraTargetPosition(e,t=!1){e&&(e instanceof k&&(e=J(e)),this._cameraEndPosition||(this._cameraEndPosition=new b),this._cameraEndPosition.copy(e),t===!0?(this._cameraLerpActive=!1,this._cameraObject&&this._cameraObject.position.copy(this._cameraEndPosition)):this._cameraObject&&(this._cameraLerpActive=!0,this._cameraLerp01=0,this._cameraStartPosition.copy(this._cameraObject?.position),typeof t=="number"?this._cameraLerpDuration=t:this._cameraLerpDuration=this.targetLerpDuration))}get cameraLerpActive(){return this._cameraLerpActive}stopCameraLerp(){this._cameraLerpActive=!1}setFieldOfView(e,t=!1){if(!this._controls||typeof e!="number")return;const i=this._camera?.threeCamera;i&&(t===!0?i.fov=e:(this._fovLerpActive=!0,this._fovLerp01=0,this._fovLerpStartValue=i.fov,this._fovLerpEndValue=e,typeof t=="number"?this._fovLerpDuration=t:this._fovLerpDuration=this.targetLerpDuration))}setLookTargetPosition(e=null,t=!1){this._controls&&e&&(e instanceof k&&(e=J(e)),this._lookTargetEndPosition.copy(e),this._didSetTarget++,Bt&&(console.warn("OrbitControls: setLookTargetPosition",e,t),B.DrawWireSphere(this._lookTargetEndPosition,.2,16711680,2)),t===!0?this.lerpLookTarget(this._lookTargetEndPosition,this._lookTargetEndPosition,1):(this._lookTargetLerpActive=!0,this._lookTargetLerp01=0,this._lookTargetStartPosition.copy(this._controls.target),typeof t=="number"?this._lookTargetLerpDuration=t:this._lookTargetLerpDuration=this.targetLerpDuration))}get lookTargetLerpActive(){return this._lookTargetLerpActive}stopLookTargetLerp(){this._lookTargetLerpActive=!1}setLookTargetFromConstraint(e=0,t=1){if(!this._controls||this.lookAtConstraint?.enabled===!1)return!1;const i=this.lookAtConstraint?.sources;if(i&&i.length>0){const n=i[e];if(n)return n.getWorldPosition(this._lookTargetEndPosition),this.lerpLookTarget(this._controls.target,this._lookTargetEndPosition,t),!0}return!1}lerpLookTarget(e,t,i){this._controls&&(i>=1?this._controls.target.copy(t):this._controls.target.lerpVectors(e,t,i),this.lookAtConstraint&&this.lookAtConstraint.setConstraintPosition(this._controls.target))}setTargetFromRaycast(e,t=!1){if(!this.controls)return!1;const i=e?this.context.physics.raycastFromRay(e):this.context.physics.raycast();for(const n of i)if(n.distance>0&&x.isActiveInHierarchy(n.object)){const s=_f(n.object);if(s&&s.canvas?.screenspace)break;return this.setLookTargetPosition(n.point,t),!0}return!1}fitCamera(e,t){let i;if(Array.isArray(e)||e&&"type"in e?i=e:e&&typeof e=="object"&&!(e instanceof k)&&!Array.isArray(e)&&(t=e,i=t.objects),i&&!Array.isArray(i)&&(i=[i]),(!Array.isArray(i)||i&&i.length<=0)&&(i=this.context.scene.children),!Array.isArray(i)||i.length<=0){console.warn("No objects to fit camera to...");return}const n=Lw({objects:[...i],...t,autoApply:!1,context:this.context,camera:this._cameraObject,currentZoom:this._controls?.getDistance()||void 0,minZoom:this.minZoom,maxZoom:this.maxZoom});n&&(this.setLookTargetPosition(n.lookAt,t?.immediate||!1),this.setCameraTargetPosition(n.position,t?.immediate||!1),this.setFieldOfView(t?.fov,t?.immediate||!1),this.onBeforeRender())}_haveAttachedKeyboardEvents=!1}Oe([u()],me.prototype,"autoTarget",2),Oe([u()],me.prototype,"autoFit",2),Oe([u()],me.prototype,"enableRotate",2),Oe([u()],me.prototype,"autoRotate",2),Oe([u()],me.prototype,"autoRotateSpeed",2),Oe([u()],me.prototype,"minAzimuthAngle",2),Oe([u()],me.prototype,"maxAzimuthAngle",2),Oe([u()],me.prototype,"minPolarAngle",2),Oe([u()],me.prototype,"maxPolarAngle",2),Oe([u()],me.prototype,"enableKeys",2),Oe([u()],me.prototype,"enableDamping",2),Oe([u()],me.prototype,"dampingFactor",2),Oe([u()],me.prototype,"enableZoom",2),Oe([u()],me.prototype,"minZoom",2),Oe([u()],me.prototype,"maxZoom",2),Oe([u()],me.prototype,"zoomSpeed",2),Oe([u()],me.prototype,"enablePan",2),Oe([u(jr)],me.prototype,"lookAtConstraint",2),Oe([u()],me.prototype,"lookAtConstraint01",2),Oe([u()],me.prototype,"allowInterrupt",2),Oe([u()],me.prototype,"middleClickToFocus",2),Oe([u()],me.prototype,"doubleClickToFocus",2),Oe([u()],me.prototype,"clickBackgroundToFitScene",2),Oe([u()],me.prototype,"targetLerpDuration",1),Oe([u(k)],me.prototype,"targetBounds",2);var jR=Object.defineProperty,DR=Object.getOwnPropertyDescriptor,Zt=(o,e,t,i)=>{for(var n=i>1?void 0:i?DR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&jR(e,t,n),n},Br=(o=>(o[o.None=0]="None",o[o.Skybox=1]="Skybox",o[o.SolidColor=2]="SolidColor",o[o.Uninitialized=4]="Uninitialized",o))(Br||{});const ks=v("debugcam"),Nw=v("debugscreenpointtoray"),Ft=class rd extends R{get isCamera(){return!0}get aspect(){return this._cam instanceof re?this._cam.aspect:this.context.domWidth/this.context.domHeight}set aspect(e){this._cam instanceof re&&this._cam.aspect!==e&&(this._cam.aspect=e,this._cam.updateProjectionMatrix())}get fieldOfView(){return this._cam instanceof re?this._cam.fov:this._fov}set fieldOfView(e){const t=this.fieldOfView!=e;if(this._fov=e,t&&this._cam&&this._cam instanceof re){if(this._fov===void 0){console.warn("Can not set undefined fov on PerspectiveCamera");return}this._cam.fov=this._fov,this._cam.updateProjectionMatrix()}}get nearClipPlane(){return this._nearClipPlane}set nearClipPlane(e){const t=this._nearClipPlane!=e;this._nearClipPlane=e,this._cam&&(t||this._cam.near!=e)&&(this._cam.near=e,this._cam.updateProjectionMatrix())}_nearClipPlane=.1;get farClipPlane(){return this._farClipPlane}set farClipPlane(e){const t=this._farClipPlane!=e;this._farClipPlane=e,this._cam&&(t||this._cam.far!=e)&&(this._cam.far=e,this._cam.updateProjectionMatrix())}_farClipPlane=1e3;applyClippingPlane(){this._cam&&(this._cam.near=this._nearClipPlane,this._cam.far=this._farClipPlane,this._cam.updateProjectionMatrix())}get clearFlags(){return this._clearFlags}set clearFlags(e){if(typeof e=="string")switch(e){case"skybox":e=1;break;case"solidcolor":e=2;break;default:e=0;break}e!==this._clearFlags&&(this._clearFlags=e,this.applyClearFlagsIfIsActiveCamera())}orthographic=!1;orthographicSize=5;ARBackgroundAlpha=0;set cullingMask(e){this._cullingMask=e,this._cam&&(this._cam.layers.mask=e)}get cullingMask(){return this._cam?this._cam.layers.mask:this._cullingMask}_cullingMask=4294967295;set cullingLayer(e){this.cullingMask=(1<<e|0)>>>0}set backgroundBlurriness(e){e!==this._backgroundBlurriness&&(e===void 0?this._backgroundBlurriness=void 0:this._backgroundBlurriness=Math.min(Math.max(e,0),1),this.applyClearFlagsIfIsActiveCamera())}get backgroundBlurriness(){return this._backgroundBlurriness}_backgroundBlurriness=void 0;set backgroundIntensity(e){e!==this._backgroundIntensity&&(e===void 0?this._backgroundIntensity=void 0:this._backgroundIntensity=Math.min(Math.max(e,0),10),this.applyClearFlagsIfIsActiveCamera())}get backgroundIntensity(){return this._backgroundIntensity}_backgroundIntensity=void 0;set backgroundRotation(e){e!==this._backgroundRotation&&(e===void 0?this._backgroundRotation=void 0:this._backgroundRotation=e,this.applyClearFlagsIfIsActiveCamera())}get backgroundRotation(){return this._backgroundRotation}_backgroundRotation=void 0;set environmentIntensity(e){this._environmentIntensity=e}get environmentIntensity(){return this._environmentIntensity}_environmentIntensity=void 0;get backgroundColor(){return this._backgroundColor??null}set backgroundColor(e){e&&(this._backgroundColor||(this._backgroundColor=new oe(1,1,1,1)),this._backgroundColor.copy(e),(!("alpha"in e)||e.alpha===void 0)&&(this._backgroundColor.alpha=1),this.applyClearFlagsIfIsActiveCamera())}set targetTexture(e){this._targetTexture=e}get targetTexture(){return this._targetTexture}_targetTexture=null;_backgroundColor;_fov;_cam=null;_clearFlags=2;_skybox;get cam(){return this.threeCamera}get threeCamera(){return this.activeAndEnabled&&this.buildCamera(),this._cam}static _origin=new b;static _direction=new b;screenPointToRay(e,t,i){const n=this.threeCamera,s=rd._origin;s.set(e,t,-1),this.context.input.convertScreenspaceToRaycastSpace(s),Nw&&console.log("screenPointToRay",e.toFixed(2),t.toFixed(2),"now:",s.x.toFixed(2),s.y.toFixed(2),"isInXR:"+this.context.isInXR),s.z=-1,s.unproject(n);const r=rd._direction.set(s.x,s.y,s.z),a=J(n);return r.sub(a),r.normalize(),i?(i.set(a,r),i):new vo(a.clone(),r.clone())}_frustum;getFrustum(){return this._frustum||(this._frustum=new sb,this.updateFrustum()),this._frustum}updateFrustum(){this._frustum||(this._frustum=new sb),this._frustum.setFromProjectionMatrix(this.getProjectionScreenMatrix(this._projScreenMatrix,!0),this.context.renderer.coordinateSystem)}getProjectionScreenMatrix(e,t){return t&&this._projScreenMatrix.multiplyMatrices(this.threeCamera.projectionMatrix,this.threeCamera.matrixWorldInverse),e===this._projScreenMatrix?e:e.copy(this._projScreenMatrix)}_projScreenMatrix=new K;awake(){Nw&&window.addEventListener("pointerdown",e=>{const t=e.clientX,i=e.clientY;console.log("touch",t.toFixed(2),i.toFixed(2));const n=this.screenPointToRay(t,i),s="#"+Math.floor(Math.random()*16777215).toString(16);B.DrawRay(n.origin,n.direction,s,10)})}onEnable(){ks&&console.log(`Camera enabled: "${this.name}". ClearFlags=${Br[this._clearFlags]}`,this),this.buildCamera(),(this.tag=="MainCamera"||!this.context.mainCameraComponent)&&(this.context.setCurrentCamera(this),FR(this)),this.applyClearFlagsIfIsActiveCamera({applySkybox:!0})}onDisable(){this.context.removeCamera(this)}onLeaveXR(e){this.fieldOfView=this._fov}onBeforeRender(){if(this._cam&&(this._frustum&&this.updateFrustum(),this._clearFlags===2&&this.applyClearFlagsIfIsActiveCamera(),this._targetTexture)){this.context.isManagedExternally&&(this._warnedAboutExternalRenderer||(this._warnedAboutExternalRenderer=!0,console.warn("Rendering with external renderer is not supported yet. This may not work or throw errors. Please remove the the target texture from your camera: "+this.name,this.targetTexture))),this.context.composer;const e=this.context.renderer;if(e){const t=this.context.mainCameraComponent;this.applyClearFlags(),this._targetTexture.render(this.context.scene,this._cam,e),t?.applyClearFlags()}}}buildCamera(){if(this._cam)return;const e=this.gameObject.isCamera;let t=null;if(e?(t=this.gameObject,t?.layers.enableAll(),t instanceof re&&(this._fov=t.fov)):t=this.gameObject.children[0],t&&t.isCamera)t instanceof re&&(this._fov&&(t.fov=this._fov),t.near=this._nearClipPlane,t.far=this._farClipPlane,t.updateProjectionMatrix());else if(!this.orthographic)t=new re(this.fieldOfView,window.innerWidth/window.innerHeight,this._nearClipPlane,this._farClipPlane),this.fieldOfView&&(t.fov=this.fieldOfView),this.gameObject.add(t);else{const i=this.orthographicSize*100;t=new fd(window.innerWidth/-i,window.innerWidth/i,window.innerHeight/i,window.innerHeight/-i,this._nearClipPlane,this._farClipPlane),this.gameObject.add(t)}this._cam=t,this._cam.layers.mask=this._cullingMask,this.tag=="MainCamera"&&this.context.setCurrentCamera(this)}applyClearFlagsIfIsActiveCamera(e){this.context.mainCameraComponent===this&&this.applyClearFlags(e)}applyClearFlags(e){if(!this._cam){ks&&console.log("Camera does not exist (apply clear flags)");return}if(this.fieldOfView=this.fieldOfView,ks){const i=`[Camera] Apply ClearFlags: ${Br[this._clearFlags]} - "${this.name}"`;console.debug(i)}const t=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color");switch(this._clearFlags){case 0:return;case 1:if(rd.backgroundShouldBeTransparent(this.context)&&(!this.ARBackgroundAlpha||this.ARBackgroundAlpha<.001)){this.context.scene.background=null,this.context.renderer.setClearColor(0,0);return}(!this.scene.background||!this._skybox||e?.applySkybox===!0)&&this.applySceneSkybox(),this._backgroundBlurriness!==void 0&&!this.context.domElement.getAttribute("background-blurriness")?this.context.scene.backgroundBlurriness=this._backgroundBlurriness:ks&&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:ks&&console.warn(`Camera "${this.name}" has no background intensity`);break;case 2:if(this._backgroundColor&&!t){let i=this._backgroundColor.alpha;rd.backgroundShouldBeTransparent(this.context)&&(i=this.ARBackgroundAlpha??0),this.context.scene.background=null,this.context.xr?.isVR?this.context.renderer.setClearColor(Zb(this._backgroundColor).convertLinearToSRGB()):this.context.renderer.setClearColor(this._backgroundColor,i)}else this._backgroundColor||ks&&console.warn(`[Camera] has no background color "${this.name}" `);break;case 4:t||(this.context.scene.background=null,this.context.renderer.setClearColor(0,0));break}}applySceneSkybox(){this._skybox||(this._skybox=new BR(this)),this._skybox.apply()}static backgroundShouldBeTransparent(e){const t=e.renderer.xr?.getSession();if(!t)return!1;if(typeof t._transparent=="boolean")return t._transparent;const i=t.environmentBlendMode;ks&&Te("Environment blend mode: "+i+" on "+navigator.userAgent);let n=i==="additive"||i==="alpha-blend";return e.isInAR&&i==="opaque"&&(navigator.userAgent?.includes("OculusBrowser")||navigator.userAgent?.includes("Mozilla")&&navigator.userAgent?.includes("Mobile WebXRViewer/v2"))&&(n=!0),t._transparent=n,n}};Zt([u()],Ft.prototype,"aspect",1),Zt([u()],Ft.prototype,"fieldOfView",1),Zt([u()],Ft.prototype,"nearClipPlane",1),Zt([u()],Ft.prototype,"farClipPlane",1),Zt([u()],Ft.prototype,"clearFlags",1),Zt([u()],Ft.prototype,"orthographic",2),Zt([u()],Ft.prototype,"orthographicSize",2),Zt([u()],Ft.prototype,"ARBackgroundAlpha",2),Zt([u()],Ft.prototype,"cullingMask",1),Zt([u()],Ft.prototype,"backgroundBlurriness",1),Zt([u()],Ft.prototype,"backgroundIntensity",1),Zt([u(ot)],Ft.prototype,"backgroundRotation",1),Zt([u()],Ft.prototype,"environmentIntensity",1),Zt([u(oe)],Ft.prototype,"backgroundColor",1),Zt([u(_o)],Ft.prototype,"targetTexture",1);let hi=Ft;class BR{_camera;_skybox;get context(){return this._camera?.context}constructor(e){this._camera=e}apply(){if(this._skybox=this.context.lightmaps.tryGetSkybox(this._camera.sourceId),!this._skybox)this._did_log_failed_to_find_skybox||(this._did_log_failed_to_find_skybox=!0,console.warn(`Camera "${this._camera.name}" has no skybox texture. ${this._camera.sourceId}`));else if(this.context.scene.background!==this._skybox){const e=this.context.domElement.getAttribute("background-image")||this.context.domElement.getAttribute("background-color");ks&&console.debug(`[Camera] Apply Skybox ${this._skybox?.name} ${e} - "${this._camera.name}"`),e?.length||(this._skybox.mapping=Nn,this.context.scene.background=this._skybox)}}}function FR(o){v("freecam")&&o.context.mainCameraComponent===o&&x.getOrAddComponent(o.gameObject,me)}class Do extends R{get listener(){return this._listener==null&&(this._listener=new VS),this._listener}_listener=null;onEnable(){Dn.registerWaitForInteraction(this.onInteraction),this.addListenerIfItExists()}onDisable(){Dn.unregisterWaitForInteraction(this.onInteraction),this.removeListenerIfItExists()}onInteraction=()=>{this.destroyed||this.listener==null||this.addListenerIfItExists()};addListenerIfItExists(){const e=this._listener;if(!e||e?.parent)return;const t=this.context.mainCameraComponent||x.getComponentInParent(this.gameObject,hi);t?.threeCamera?t.threeCamera.add(e):this.gameObject.add(e),e.filter?(e.gain.connect(e.filter),e.filter.connect(e.context.destination)):e.gain.connect(e.context.destination)}removeListenerIfItExists(){const e=this._listener;e&&(e.removeFromParent(),e.filter&&e.filter.disconnect(),e.gain&&e.gain.disconnect())}}var UR=Object.defineProperty,zR=Object.getOwnPropertyDescriptor,On=(o,e,t,i)=>{for(var n=i>1?void 0:i?zR(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&UR(e,t,n),n};const kt=v("debugaudio"),Ji=class ir extends R{static get userInteractionRegistered(){return Dn.userInteractionRegistered}static registerWaitForAllowAudio(e){Dn.registerWaitForInteraction(e)}clip="";playOnAwake=!1;preload=!0;playInBackground=!0;get isPlaying(){return this.sound?.isPlaying??!1}get duration(){return this.sound?.buffer?.duration}get time01(){const e=this.duration;return e&&this.sound?this.sound?.context.currentTime/e:0}set time01(e){const t=this.duration;t&&this.sound&&(this.time=e*t)}get time(){return this.sound?.source?this.sound.source?.context.currentTime-this._lastContextTime+this.sound.offset:0}set time(e){if(this.sound){if(e===this.sound.offset)return;const t=this.isPlaying;this.stop(),this.sound.offset=e,t&&this.play()}}get loop(){return this.sound&&(this._loop=this.sound.getLoop()),this._loop}set loop(e){this._loop=e,this.sound&&this.sound.setLoop(e)}get spatialBlend(){return this._spatialBlend}set spatialBlend(e){e!==this._spatialBlend&&(this._spatialBlend=e,this._needUpdateSpatialDistanceSettings=!0)}get minDistance(){return this._minDistance}set minDistance(e){this._minDistance!==e&&(this._minDistance=e,this._needUpdateSpatialDistanceSettings=!0)}get maxDistance(){return this._maxDistance}set maxDistance(e){this._maxDistance!==e&&(this._maxDistance=e,this._needUpdateSpatialDistanceSettings=!0)}_spatialBlend=0;_minDistance=1;_maxDistance=100;get volume(){return this._volume}set volume(e){this._volume=e,this.sound&&!this.context.application.muted&&(kt&&console.log(this.name,"audio set volume",e),this.sound.setVolume(e))}_volume=1;set pitch(e){this.sound&&this.sound.setPlaybackRate(e)}get pitch(){return this.sound?this.sound.getPlaybackRate():1}rollOffMode=0;_loop=!1;sound=null;helper=null;wasPlaying=!1;audioLoader=null;shouldPlay=!1;_lastClipStartedLoading=null;_audioElement=null;get Sound(){if(!this.sound&&ir.userInteractionRegistered){let e=this.gameObject.getComponent(Do)??this.context.mainCamera.getComponent(Do)??$a(Do,this.context,!1);!e&&this.context.mainCamera&&(e=this.context.mainCamera.addComponent(Do)),e?.listener?(this.sound=new WS(e.listener),this.gameObject?.add(this.sound)):kt&&console.warn("No audio listener found in scene - can not play audio")}return this.sound}get ShouldPlay(){return this.shouldPlay}get audioContext(){return this.sound?.context}awake(){kt&&console.log("[AudioSource]",this),this.audioLoader=new vm,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),ir.userInteractionRegistered?this.playOnAwake&&this.context.application.isVisible&&this.play():ir.registerWaitForAllowAudio(()=>{this.enabled&&!this.destroyed&&this.shouldPlay&&this.onNewClip(this.clip)}),globalThis.addEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.addEventListener(dg.MuteChanged,this.onApplicationMuteChanged)}onDisable(){globalThis.removeEventListener("visibilitychange",this.onVisibilityChanged),this.context.application.removeEventListener(dg.MuteChanged,this.onApplicationMuteChanged),this.pause()}onVisibilityChanged=()=>{switch(document.visibilityState){case"hidden":(this.playInBackground===!1||q.isMobileDevice())&&(this.wasPlaying=this.isPlaying,this.isPlaying&&this.pause());break;case"visible":kt&&console.log("visible",this.enabled,this.playOnAwake,!this.isPlaying,ir.userInteractionRegistered,this.wasPlaying),this.enabled&&this.playOnAwake&&!this.isPlaying&&ir.userInteractionRegistered&&this.wasPlaying&&this.play();break}};onApplicationMuteChanged=()=>{this.context.application.muted?this.sound?.setVolume(0):this.sound?.setVolume(this.volume)};createAudio=e=>{if(this.destroyed){kt&&console.warn("AudioSource destroyed, not creating audio",this.name);return}kt&&console.log("AudioBuffer finished loading",e);const t=this.Sound;if(!t){kt&&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&&ir.userInteractionRegistered,this.applySpatialDistanceSettings(),t.isPlaying&&t.stop(),ir.registerWaitForAllowAudio(this.__onAllowAudioCallback)};__onAllowAudioCallback=()=>{this.shouldPlay&&this.play()};applySpatialDistanceSettings(){const e=this.sound;if(!e)return;this._needUpdateSpatialDistanceSettings=!1;const t=L.lerp(10*this._maxDistance/Math.max(1e-4,this.spatialBlend),this._minDistance,this.spatialBlend);switch(kt&&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?kt&&!this.helper&&(this.helper=new GC(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(kt&&console.log(e),e.endsWith(".mp3")||e.endsWith(".wav")){if(this.audioLoader||(this.audioLoader=new vm),this.shouldPlay=!0,this._lastClipStartedLoading===e){kt&&console.log("Is currently loading:",this._lastClipStartedLoading,this);return}this._lastClipStartedLoading=e,kt&&console.log("load audio",e);const t=await this.audioLoader.loadAsync(e).catch(console.error);if(this.destroyed)return;this._lastClipStartedLoading===e&&(this._lastClipStartedLoading=null),t&&this.createAudio(t)}else console.warn("Unsupported audio clip type",e);else this.shouldPlay=!0,this.createAudio()}play(e=void 0){!e&&this.clip&&(e=this.clip),e!==void 0&&typeof e!="string"&&!(e instanceof MediaStream)&&(A()&&console.warn("Called play on AudioSource with unknown argument type:",e+`
964
- Using the assigned clip instead:`,this.clip),e=this.clip);let t=!this.sound||e&&e!==this.clip;if(typeof e=="string"&&!this.audioLoader&&(t=!0),(e instanceof MediaStream||typeof e=="string")&&(this.clip=e),t){this.shouldPlay=!0,this.onNewClip(e);return}if(this.shouldPlay=!0,this._hasEnded=!1,kt&&console.log("play",this.sound?.getVolume(),this.sound),this.sound&&!this.sound.isPlaying){const i=this.context.application.muted;i&&this.sound.setVolume(0),this.gameObject?.add(this.sound),this.clip instanceof MediaStream?(this.sound.setMediaStreamSource(this.clip),this._audioElement||(this._audioElement=document.createElement("audio"),this._audioElement.style.display="none"),this._audioElement.parentNode||this.context.domElement.shadowRoot?.append(this._audioElement),this._audioElement.srcObject=this.clip,this._audioElement.autoplay=!1):(this._audioElement&&this._audioElement.remove(),this.sound.play(i?.1:0))}}pause(){kt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.isPlaying&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,this.sound.pause()),this._audioElement?.remove()}stop(){kt&&console.log("Pause",this),this._hasEnded=!0,this.shouldPlay=!1,this.sound&&this.sound.source&&(this._lastContextTime=this.sound?.context.currentTime,kt&&console.log(this._lastContextTime),this.sound.stop()),this._audioElement?.remove()}_lastContextTime=0;_hasEnded=!0;_needUpdateSpatialDistanceSettings=!1;update(){this.helper&&(this.isPlaying&&this.helper.update(),this.helper.visible=this.isPlaying),this._needUpdateSpatialDistanceSettings&&this.applySpatialDistanceSettings(),this.sound&&!this.sound.isPlaying&&this.shouldPlay&&!this._hasEnded&&(this._hasEnded=!0,kt&&console.log("Audio clip ended",this.clip),this.dispatchEvent(new CustomEvent("ended",{detail:this})))}};On([u(URL)],Ji.prototype,"clip",2),On([u()],Ji.prototype,"playOnAwake",2),On([u()],Ji.prototype,"preload",2),On([u()],Ji.prototype,"playInBackground",2),On([u()],Ji.prototype,"loop",1),On([u()],Ji.prototype,"spatialBlend",1),On([u()],Ji.prototype,"minDistance",1),On([u()],Ji.prototype,"maxDistance",1),On([u()],Ji.prototype,"volume",1),On([u()],Ji.prototype,"pitch",1),On([u()],Ji.prototype,"rollOffMode",2);let Ai=Ji;const NR=v("debugavatar");class Ie extends R{static getAvatar(e){return e>=0&&e<Ie.instances.length?Ie.instances[e]:null}static instances=[];static onAvatarMarkerCreated(e){return Ie._onNewAvatarMarkerAdded.push(e),e}static onAvatarMarkerDestroyed(e){return Ie._onAvatarMarkerDestroyed.push(e),e}static _onNewAvatarMarkerAdded=[];static _onAvatarMarkerDestroyed=[];connectionId;avatar;awake(){Ie.instances.push(this),NR&&console.log(this);for(const e of Ie._onNewAvatarMarkerAdded)e({avatarMarker:this,gameObject:this.gameObject})}onDestroy(){Ie.instances.splice(Ie.instances.indexOf(this),1);for(const e of Ie._onAvatarMarkerDestroyed)e({avatarMarker:this,gameObject:this.gameObject})}isLocalAvatar(){return this.connectionId===this.context.connection.connectionId}}class Fr{static Pois=[];static LastChangeTime=0;static Add(e,t,i=null){if(t){for(const n of this.Pois)if(n.obj===t)return;this.Pois.push({obj:t,avatar:i}),this.LastChangeTime=e.time.time}}static Remove(e,t){if(t){for(const i of this.Pois)if(i.obj===t){this.Pois.splice(this.Pois.indexOf(i),1),this.LastChangeTime=e?.time.time??z.Current?.time.time;return}}}}class VR{guid;position=new b}class Vc extends R{set controlledTarget(e){this.target=e;const t=C.get("MoveRandom");if(t&&this.target){const i=x.getComponent(this.target,t);i&&i.destroy()}}target=null;avatar=null;_model=null;_targetModel=new VR;_currentTargetObject=null;_lastUpdateTime=0;_lookDuration=0;_lastPoiChangedTime=0;awake(){if(this.avatar=x.getComponentInParent(this.gameObject,Ie),this.avatar){const e=x.getComponentInParent(this.gameObject,Ie);this._model=new fg(this.context.connection,this.guid),e?.isLocalAvatar&&this._model.requestOwnership()}this.context.connection.beginListen("avatar-look-target-changed",e=>{this.target&&e&&e.guid===this.avatar?.guid&&gt(this.target,e.position)})}update(){if((!this.context.connection.isConnected||this._model?.hasOwnership)&&(Fr.LastChangeTime!==this._lastPoiChangedTime&&(this._lastPoiChangedTime=Fr.LastChangeTime,this._lookDuration=0),this.selectTarget(),this._currentTargetObject&&this.context.time.frameCount%10===0&&this.target)){const e=J(this._currentTargetObject);gt(this.target,e),this.context.connection.isConnected&&this.avatar&&(this.context.connection.send("avatar-look-target-changed",this._targetModel),this._targetModel.guid=this.avatar.guid,this._targetModel.position.copy(e))}}selectTarget(){if(this.context.time.time-this._lastUpdateTime>this._lookDuration){this._lastUpdateTime=this.context.time.time,this._lookDuration=Math.random()*.5+.2;const e=Fr.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 Vw(o){const e=o;return!!(e.parser&&e.parser.json)}var Bu=(o=>(o[o.None=0]="None",o[o.DontExport=1]="DontExport",o))(Bu||{});function Ww(o){return o&&o.isComponent}const WR=Symbol("object"),Sf=new Oi(()=>new b,20);class $w{_point;_normal;_tangentVelocity;distance;impulse;friction;get point(){return Sf.get().set(this._point.x,this._point.y,this._point.z)}get normal(){return Sf.get().set(this._normal.x,this._normal.y,this._normal.z)}get tangentVelocity(){return Sf.get().set(this._tangentVelocity.x,this._tangentVelocity.y,this._tangentVelocity.z)}constructor(e,t,i,n,s,r){this._point=e,this.distance=t,this._normal=i,this.impulse=n,this.friction=s,this._tangentVelocity=r}}class Hw{contacts;constructor(e,t,i){this.me=e,this._collider=t,this._gameObject=t.gameObject,this.contacts=i}me;_collider;get collider(){return this._collider}_gameObject;get gameObject(){return this._gameObject}get rigidBody(){return this.collider?.attachedRigidbody}}class Gw{object;collider;constructor(e,t){this.object=e,this.collider=t}}const je=v("debugnetworkingstreams");var Kn=(o=>(o.Connected="peer-user-connected",o.StreamReceived="receive-stream",o.StreamEnded="call-ended",o.Disconnected="peer-user-disconnected",o.UserJoined="user-joined",o))(Kn||{});class Cf{type="call-ended";userId;direction;constructor(e,t){this.userId=e,this.direction=t}}class qw{type="receive-stream";userId;stream;target;constructor(e,t,i){this.userId=e,this.stream=t,this.target=i}}class $R{guid;peerId;dontSave=!0;constructor(e,t){this.guid=e.id,this.peerId=t}}var Xw=(o=>(o.Incoming="incoming",o.Outgoing="outgoing",o))(Xw||{});class HR extends wm{peerId;userId;direction;call;get stream(){return this._stream}_stream=null;_isDisposed=!1;close(){this._isDisposed||(this._isDisposed=!0,this.call.close(),Jn(this._stream))}get isOpen(){return this.call.peerConnection?.connectionState==="connected"}get isOpening(){return this.call.peerConnection?.connectionState==="connecting"}get isClosed(){return!this.isOpen||this._isDisposed}constructor(e,t,i,n=null){super(),this.peerId=t.peer,this.userId=e,this.call=t,this.direction=i,this._stream=n,t.on("stream",s=>{if(je&&console.log("Receive stream",`
965
- Audio:`,s.getAudioTracks(),`
966
- Video:`,s.getVideoTracks()),this._stream=s,i==="incoming"){const r=new qw(e,s,this);this.dispatchEvent(r)}}),t.on("close",()=>{this.dispatchEvent(new Cf(e,i))})}}function Qw(o){return o=o.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1"),o}class ls extends wm{static instances=new Map;static getOrCreate(e,t){if(ls.instances.has(t))return ls.instances.get(t);const i=new ls(e,t);return ls.instances.set(t,i),i}getMyPeerId(){if(this.context.connection.connectionId)return this.getPeerIdFromUserId(this.context.connection.connectionId)}getPeerIdFromUserId(e){return this.id+"-"+e}getUserIdFromPeerId(e){return e.substring(this.id.length+1)}makeCall(e,t){if(!t?.id){je?console.warn("Can not make a call: mediastream has no id or is undefined"):console.debug("Can not make a call: mediastream has no id or is undefined");return}const i={metadata:{userId:this.context.connection.connectionId,streamId:t.id},sdpTransform:s=>Qw(s)},n=this._peer?.call(e,t,i);if(n){const s=this.registerCall(n,"outgoing",t);return je&&console.warn(`\u{1F4DE} CALL ${e}`,`
967
- Outgoing:`,this._outgoingCalls,`
968
- Incoming:`,this._incomingCalls),s}else je&&console.error("Failed to make call",e,t,this._peer)}closeAll(){for(const e of this._incomingCalls)e.close();for(const e of this._outgoingCalls)e.close();this.updateCalls()}updateCalls=()=>{for(let e=this._incomingCalls.length-1;e>=0;e--){const t=this._incomingCalls[e];t.isClosed&&!t.isOpening&&this._incomingCalls.splice(e,1)}for(let e=this._outgoingCalls.length-1;e>=0;e--){const t=this._outgoingCalls[e];let i=!1;t.isClosed&&!t.isOpening&&(t.stream?.active?je&&console.warn("!!! Stream is still active, don't remove call",t.userId,"Your id: "+this.context.connection.connectionId):(je&&console.warn("!!! Remove closed call",t.userId),i=!0)),this.context.connection.userIsInRoom(t.userId)===!1&&(je&&console.warn("!!! User is not in room anymore, remove call",t.userId),i=!0),i&&(t.close(),this._outgoingCalls.splice(e,1))}};get peer(){return this._peer}get incomingCalls(){return this._incomingCalls}id;context;_incomingCalls=[];_outgoingCalls=[];_peer;constructor(e,t){super(),this.context=e,this.id=t,this.setupPeer();const i=Object.getOwnPropertyDescriptor(navigator,"getUserMedia")?.writable;try{i?navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia:je&&console.warn("[PeerJs] getUserMedia is not writable")}catch(n){je&&console.error("[PeerJs] Error setting getUserMedia",n)}}_enabled=!1;_enabledPeer=!1;onConnectRoomFn=this.onConnectRoom.bind(this);enable(){this._enabled||(this._enabled=!0,this.context.connection.beginListen(te.JoinedRoom,this.onConnectRoomFn),this.subscribePeerEvents())}disable(){this._enabled&&(this._enabled=!1,this.context.connection.stopListen(te.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=I_(e):console.error("Failed to setup peerjs because we dont have a connection id",this.context.connection.connectionId)}this._enabled&&this.subscribePeerEvents()}}subscribePeerEvents(){this._peer&&(this._peer.on("open",this.onPeerConnect),this._peer.on("close",this.onPeerClose),this._peer.on("call",this.onPeerReceivingCall),this._peer.on("disconnected",this.onPeerDisconnected),this._peer.on("error",this.onPeerError))}unsubscribePeerEvents(){this._peer&&(this._peer.off("open",this.onPeerConnect),this._peer.off("close",this.onPeerClose),this._peer.off("call",this.onPeerReceivingCall),this._peer.off("disconnected",this.onPeerDisconnected),this._peer.off("error",this.onPeerError))}onPeerConnect=e=>{if(je&&console.log("PEER opened as",e),e===null){console.error("Peer connection failed",e);return}this.context.connection.send("peer-user-connected",new $R(this,e))};onPeerClose=()=>{je&&console.log("PEER closed"),this.updateCalls()};onPeerDisconnected=()=>{je&&console.log("PEER disconnected"),this.updateCalls()};onPeerError=e=>{je&&console.error("PEER error",e)};onPeerReceivingCall=e=>{e.answer(void 0,{sdpTransform:t=>Qw(t)}),this.registerCall(e,"incoming",null)};registerCall(e,t,i){const n=e.metadata;(!n||!n.userId)&&console.error("Missing call metadata",e);const s=n.userId;t==="incoming"&&je?console.warn("\u2190 Receive call from",e.metadata,e.connectionId):je&&console.warn("\u2192 Make call to",e.metadata);const r=t==="incoming"?this._incomingCalls:this._outgoingCalls,a=new HR(s,e,t,i);return r.push(a),e.on("error",l=>{console.error("Call error",l)}),e.on("close",()=>{je&&console.log("Call ended",e.metadata);const l=r.indexOf(a);l!==-1&&r.splice(l,1),a.close(),this.dispatchEvent(new Cf(s,t))}),a.addEventListener("call-ended",l=>{this.dispatchEvent(l)}),t==="incoming"&&(a.addEventListener("receive-stream",l=>{this.dispatchEvent(l)}),e.on("stream",()=>{je&&console.log("Received stream for call",e.metadata);let l=0;const c=setInterval(()=>{const h=l===0;!a.isOpen&&h&&(je&&console.warn("Close call because stream is not active",e.metadata),l+=1,clearInterval(c),a.close())},2e3)})),a}}class pd extends wm{static create(e,t){const i=ls.getOrCreate(e.context,t||e.context.connection.connectionId||e.guid);return new pd(e.context,i)}context;peer;_sendingStreams=new Map;debug=!1;constructor(e,t){if(super(),Ww(e)){const i=e;e=i.context,t=ls.getOrCreate(i.context,i.guid)}else typeof t=="string"&&(t=ls.getOrCreate(e,t));if(e){if(!(e instanceof z))throw new Error("Failed to create NetworkedStreams because context is not an instance of Context")}else throw new Error("Failed to create NetworkedStreams because context is undefined");if(!t)throw new Error("Failed to create NetworkedStreams because peer is undefined");this.context=e,this.peer=t,je&&(this.debug=!0)}startSendingStream(e){this._sendingStreams.has(e)?console.warn("Received start sending stream with stream that is already being sent"):(this._sendingStreams.set(e,[]),this.updateSendingCalls())}stopSendingStream(e){if(e){const t=this._sendingStreams.get(e);if(t){for(const i of t)i.close();t.length=0}this._sendingStreams.delete(e),t&&this.debug&&this.debugLogCurrentState()}this.updateSendingCalls()}_enabled=!1;get enabled(){return this._enabled}enable(){this._enabled||(this._enabled=!0,this.peer.enable(),this.peer.addEventListener("receive-stream",this.onCallStreamReceived),this.peer.addEventListener("call-ended",this.onCallEnded),this.context.connection.beginListen("peer-user-connected",this.onUserConnected),this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.UserJoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.UserLeftRoom,this.onUserLeft),this.context.connection.beginListen(te.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(te.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.UserJoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.UserLeftRoom,this.onUserLeft),this.context.connection.stopListen(te.LeftRoom,this.onLeftRoom),this._tickIntervalId!=null&&(clearInterval(this._tickIntervalId),this._tickIntervalId=void 0))}_tickIntervalId;tick=()=>{this.updateSendingCalls()};onJoinedRoom=e=>{this._sendingStreams.size>0&&(this.debug&&console.warn(`${e?.userId?`User ${e.userId}`:"You"} joined room`,e,this._sendingStreams.size),this.updateSendingCalls())};onLeftRoom=e=>{this.debug&&console.warn(`${e?.userId||"You"} left room`,e),this.stopCallsToUsersThatAreNotInTheRoomAnymore(),this.peer.closeAll()};onCallStreamReceived=e=>{this.debug&&console.log("Call with "+e.userId+" started"),this.dispatchEvent({type:"receive-stream",target:this,stream:e.stream,userId:e.userId}),this.debug&&this.debugLogCurrentState()};onCallEnded=e=>{this.debug&&console.log("Call with "+e.userId+" ended"),this.dispatchEvent(e),this.debug&&this.debugLogCurrentState()};onUserConnected=e=>{if(this.peer.id===e.guid){this.debug&&console.log("PEER USER CONNECTED",e.guid,e,this._sendingStreams.size);const t=this._sendingStreams.keys().next().value;this.peer.makeCall(e.peerId,t)}else je&&console.log("Unknown user connected",e.guid,e.peerId)};onUserLeft=e=>{this.debug&&console.log("User left room: "+e.userId),this.stopCallsToUsersThatAreNotInTheRoomAnymore()};updateSendingCalls(){const e=this.context.connection.connectionId;for(const t of this._sendingStreams.keys()){const i=this._sendingStreams.get(t)||[];for(const n of this.context.connection.usersInRoom()){if(n===e)continue;const s=this.peer.getPeerIdFromUserId(n);if(i.find(r=>r.peerId===s&&r.direction==="outgoing"&&!r.isClosed&&r.stream?.active))je&&console.debug("Already have a call with user "+n+" / peer "+s);else{const r=this.peer.makeCall(s,t);r&&i.push(r)}}this._sendingStreams.set(t,i)}this.stopCallsToUsersThatAreNotInTheRoomAnymore()}stopCallsToUsersThatAreNotInTheRoomAnymore(){for(const e of this._sendingStreams.keys()){const t=this._sendingStreams.get(e);if(t)for(let i=t.length-1;i>=0;i--){const n=t[i];this.context.connection.userIsInRoom(n.userId)?je&&(this.context.connection.connectionId===n.userId?console.warn(`You are still in the room [${i}] ${n.userId}`):console.log(`User is still in room [${i}] ${n.userId}`)):(je&&console.log(`Remove call ${[i]} to user that is not in room anymore ${n.userId}`),n.close(),t.splice(i,1))}}this.peer.updateCalls(),this.debug&&this.debugLogCurrentState()}debugLogCurrentState(){console.warn(`You (${this.context.connection.connectionId}) are currently sending ${this._sendingStreams.size} and receiving ${this.peer.incomingCalls.length} calls (${this.peer.incomingCalls.map(e=>e.userId).join(", ")})`,this.peer.incomingCalls)}}function Jn(o){if(o&&o instanceof MediaStream)for(const e of o.getTracks())e.stop()}var GR=Object.defineProperty,Pf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&GR(e,t,n),n};const qR="noVoip",XR=v("debugvoip");class Ms extends R{autoConnect=!0;runInBackground=!0;createMenuButton=!0;debug=!1;_net;_menubutton;awake(){XR&&(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=pd.create(this)),this.debug&&(this._net.debug=!0),this._net.addEventListener(Kn.StreamReceived,this.onReceiveStream),this._net.addEventListener(Kn.StreamEnded,this.onStreamEnded),this._net.enable(),this.autoConnect&&this.context.connection.isConnected&&this.connect(),this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.addEventListener("visibilitychange",this.onVisibilityChanged)}onDisable(){this._net&&(this._net.stopSendingStream(this._outputStream),this._net.removeEventListener(Kn.StreamReceived,this.onReceiveStream),this._net.removeEventListener(Kn.StreamEnded,this.onStreamEnded),this._net?.disable()),this.context.connection.stopListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.LeftRoom,this.onLeftRoom),this.onEnabledChanged(),this.updateButton(),window.removeEventListener("visibilitychange",this.onVisibilityChanged)}onDestroy(){this._menubutton?.remove(),this._menubutton=void 0}_allowSending=!0;_outputStream=null;get isSending(){return this._outputStream!=null&&this._outputStream.active}async connect(e){if(!this._net)return console.error("Cannot connect to voice chat - NetworkedStreams not initialized. Make sure the component is enabled before calling this method."),!1;if(this.context.connection.isConnected){if(!await q.microphonePermissionsGranted())return console.error("Cannot connect to voice chat - microphone permissions not granted"),this.updateButton(),!1}else return console.error("Cannot connect to voice chat - not connected to server"),this.updateButton(),!1;return this._allowSending=!0,this._net?.stopSendingStream(this._outputStream),Jn(this._outputStream),this._outputStream=await this.getAudioStream(e),this._outputStream?(this.debug&&console.log("VOIP: Got audio stream"),this._net?.startSendingStream(this._outputStream),this.updateButton(),!0):(this.updateButton(),await q.microphonePermissionsGranted()?console.error("VOIP: Could not get audio stream - please make sure to connect an audio device and grant microphone permissions"):lc("Microphone permissions not granted: Please grant microphone permissions to use voice chat"),(this.debug||A())&&console.log("VOIP: Failed to get audio stream"),!1)}disconnect(e){e?.remember&&(this._allowSending=!1),this._net?.stopSendingStream(this._outputStream),Jn(this._outputStream),this._outputStream=null,this.updateButton()}setMuted(e){const t=this._outputStream?.getAudioTracks();if(t)for(const i of t)i.enabled=!e}get isMuted(){if(this._outputStream===null)return!1;const e=this._outputStream?.getAudioTracks();if(e){for(const t of e)if(!t.enabled)return!0}return!1}async updateButton(){if(this.createMenuButton){if(this._menubutton||(this._menubutton=document.createElement("button"),this._menubutton.addEventListener("click",()=>{this.isSending?this.disconnect({remember:!0}):this.connect(),q.microphonePermissionsGranted().then(e=>{e||ye("<strong>Microphone permissions not granted</strong>. Please allow your browser to use the microphone to be able to talk. Click on the button on the left side of your browser's address bar to allow microphone permissions.")})})),this._menubutton){this.context.menu.appendChild(this._menubutton),this.activeAndEnabled?this._menubutton.style.display="":this._menubutton.style.display="none",this._menubutton.title=this.isSending?"Click to disable your microphone":"Click to enable your microphone";let e=(this.isSending,""),t=this.isSending?"mic":"mic_off";await q.microphonePermissionsGranted()||(e="No Permission",t="mic_off",this._menubutton.title="Microphone permissions not granted. Please allow your browser to use the microphone to be able to talk. This can usually be done in the addressbar of the webpage."),this._menubutton.innerText=e,this._menubutton.prepend(Pt(t)),this.context.connection.isConnected==!1?this._menubutton.setAttribute("disabled",""):this._menubutton.removeAttribute("disabled")}}else this.activeAndEnabled||this._menubutton?.remove()}getFrequency(e){return this.unsupported_getfrequency||(this.unsupported_getfrequency=!0,A()&&ye("VOIP: getFrequency is currently not supported"),console.warn("VOIP: getFrequency is currently not supported")),null}async getAudioStream(e){if(!navigator.mediaDevices.getUserMedia)return console.error("No getDisplayMedia support"),null;const t=async n=>await navigator.mediaDevices.getUserMedia({audio:n??!0,video:!1}).catch(s=>(console.warn("VOIP failed getting audio stream",s),null)),i=await t(e);if(!i)return null;if(q.isiOS()&&e?.deviceId===void 0){const n=(await navigator.mediaDevices.enumerateDevices()).find(s=>(s.kind==="audioinput"||s.kind==="audiooutput")&&!s.label.includes("iPhone"));if(n){const s=Object.assign({},e);return s.deviceId=n.deviceId,await t(s)}}return i}onJoinedRoom=async()=>{this.debug&&console.log("VOIP: Joined room"),await Wn(300),this.autoConnect&&!this.isSending&&this._allowSending&&this.connect()};onLeftRoom=()=>{this.debug&&console.log("VOIP: Left room"),this.disconnect();for(const e of this._incomingStreams.values())Jn(e.srcObject);this._incomingStreams.clear()};_incomingStreams=new Map;onReceiveStream=e=>{const t=e.target.userId,i=e.stream;let n=this._incomingStreams.get(t);n||(n=new Audio,this._incomingStreams.set(t,n)),n.srcObject=i,n.setAttribute("autoplay","true"),Dn.registerWaitForInteraction(()=>{n?.play().catch(s=>{console.error("VOIP: Failed to play audio",s)})})};onStreamEnded=e=>{const t=this._incomingStreams.get(e.userId);Jn(t?.srcObject),this._incomingStreams.delete(e.userId)};onEnabledChanged=()=>{for(const e of this._incomingStreams){const t=e[1];t.muted=!this.enabled}};onVisibilityChanged=()=>{if(this.runInBackground)return;const e=document.visibilityState!=="visible";this.setMuted(e);for(const t of this._incomingStreams){const i=t[1];i.muted=e}}}Pf([u()],Ms.prototype,"autoConnect"),Pf([u()],Ms.prototype,"runInBackground"),Pf([u()],Ms.prototype,"createMenuButton");var QR=Object.defineProperty,Yw=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&QR(e,t,n),n};const YR=v("debugmouth");class Wc extends R{idle=[];talking=[];marker=null;voip=null;lastMouthChangeTime=0;mouthChangeLength=0;awake(){setTimeout(()=>{this.voip=x.findObjectOfType(Ms,this.context),this.marker||(this.marker=x.getComponentInParent(this.gameObject,Ie))},3e3)}update(){if(!this.voip||this.context.time.frameCount%10!==0)return;let e=this.marker?.connectionId??null;if(!e){YR&&(e=null);return}const t=this.voip.getFrequency(e)??0;this.updateLips(t)}updateLips(e){if(this.context.time.time-this.lastMouthChangeTime>this.mouthChangeLength){if(this.mouthChangeLength=.05+Math.random()*.1,this.talking&&this.talking.length>0&&e>30){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.talking.length);this.setMouthShapeActive(this.talking,t)}else if(this.idle.length>0&&this.context.time.time-this.lastMouthChangeTime>.5){this.lastMouthChangeTime=this.context.time.time;const t=Math.floor(Math.random()*this.idle.length);this.setMouthShapeActive(this.idle,t)}}}setMouthShapeActive(e,t){if(e){e!=this.idle?this.idle.map(i=>i.visible=!1):this.talking.map(i=>i.visible=!1);for(let i=0;i<e.length;i++){const n=e[i];n&&(n.visible=i===t)}}}}Yw([u(k)],Wc.prototype,"idle"),Yw([u(k)],Wc.prototype,"talking");class Of extends R{voip=null;marker=null;_startPosition=null;awake(){this.voip=x.findObjectOfType(Ms,this.context),this.marker=x.getComponentInParent(this.gameObject,Ie)}update(){if(!this.voip||!this.marker||this.context.time.frameCount%10!==0)return;const e=this.marker.connectionId,t=this.voip.getFrequency(e);if(t==null)return;this._startPosition||(this._startPosition=this.gameObject.position.clone());const i=t/100;this.gameObject.position.y=this._startPosition.y+i*.07}}var ZR=Object.defineProperty,KR=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ZR(e,t,n),n};const el=v("debugxrflags"),Zw=v("disablexrflags");Zw&&console.warn("XRFlags are disabled");var eo=(o=>(o[o.Never=0]="Never",o[o.Browser=1]="Browser",o[o.AR=2]="AR",o[o.VR=4]="VR",o[o.FirstPerson=8]="FirstPerson",o[o.ThirdPerson=16]="ThirdPerson",o[o.All=4294967295]="All",o))(eo||{});class oi{static Global=new oi;Mask=17;Has(e){return(this.Mask&e)!==0}Set(e){el&&console.warn("Set XR flag state to",e),this.Mask=e,en.Apply()}Enable(e){this.Mask|=e,en.Apply()}Disable(e){this.Mask&=~e,en.Apply()}Toggle(e){this.Mask^=e,en.Apply()}EnableAll(){this.Mask=-1,en.Apply()}DisableAll(){this.Mask=0,en.Apply()}}const Kw=class ns extends R{static registry=[];static Apply(){for(const e of this.registry)e.UpdateVisible(oi.Global)}static firstApply;static buffer=new oi;visibleIn;awake(){ns.registry.push(this)}onEnable(){ns.firstApply?this.UpdateVisible(oi.Global):(ns.firstApply=!0,ns.Apply())}onDestroy(){const e=ns.registry.indexOf(this);e>=0&&ns.registry.splice(e,1)}get isOn(){return this.gameObject.visible}UpdateVisible(e=null){if(Zw)return;let t;const i=e;if(i&&typeof i=="number"&&(console.assert(typeof i=="number","XRFlag.UpdateVisible: state must be a number",i),el&&console.log(i),ns.buffer.Mask=i,e=ns.buffer),e instanceof oi?(el&&console.warn(this.name,"use passed in mask",e.Mask,this.visibleIn),t=e.Has(this.visibleIn)):(el&&console.log(this.name,"use global mask"),oi.Global.Has(this.visibleIn)),t!==void 0)if(t)el&&console.log(this.name,"is visible",this.gameObject.uuid),x.setActive(this.gameObject,!0);else{if(el&&console.log(this.name,"is not visible",this.gameObject.uuid),!this.gameObject.visible)return;this.gameObject.visible=!1}}};KR([u()],Kw.prototype,"visibleIn");let en=Kw;var JR=Object.defineProperty,Fu=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&JR(e,t,n),n};class Ur extends R{eyes=[];lastBlinkTime=0;blinkLength=0;eyesOpen=!0;state=null;awake(){this.state=x.getComponentInParent(this.gameObject,en)}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)}}}Fu([u(k)],Ur.prototype,"eyes"),Fu([u()],Ur.prototype,"lastBlinkTime"),Fu([u()],Ur.prototype,"blinkLength"),Fu([u()],Ur.prototype,"eyesOpen");var eT=Object.defineProperty,kf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&eT(e,t,n),n};const Uu=class uS extends R{head=null;eyes=null;target=null;brain=null;awake(){this.brain||(this.brain=x.getComponentInParent(this.gameObject,Vc)),this.brain||(this.brain=x.addComponent(this.gameObject,Vc)),this.brain&&this.target&&(this.brain.controlledTarget=this.target)}vec=new b;static forward=new b(0,0,1);currentTargetPoint=new b;update(){const e=this.target;if(e&&this.head){const t=this.eyes;if(t){const i=J(e);this.currentTargetPoint.lerp(i,this.context.time.deltaTime/.1);const n=J(this.head),s=this.vec.copy(this.currentTargetPoint).sub(n).normalize();if(s.length()<.1)return;const r=uS.forward;if(r.set(0,0,1),r.applyQuaternion(be(this.head)),r.dot(s)>.45)for(let a=0;a<t.length;a++)t[a].lookAt(this.currentTargetPoint)}}}};kf([u(k)],Uu.prototype,"head"),kf([u(k)],Uu.prototype,"eyes"),kf([u(k)],Uu.prototype,"target");let Mf=Uu;var tT=Object.defineProperty,Rf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tT(e,t,n),n};class tl extends R{length=1;depthTest=!0;isGizmo=!1;_axes=null;onEnable(){if(this.isGizmo&&!Sc)return;this._axes||(this._axes=new Si(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)}}Rf([u()],tl.prototype,"length"),Rf([u()],tl.prototype,"depthTest"),Rf([u()],tl.prototype,"isGizmo");class Tf extends R{from;to;hint;desiredDistance=1;onEnable(){}update(){if(!this.from||!this.to||!this.hint)return;const e=J(this.to).clone(),t=J(this.from).clone(),i=e.distanceTo(t),n=e.clone();n.sub(t);const s=t.clone();s.add(e),s.multiplyScalar(.5);const r=J(this.hint).clone();r.sub(s);const a=new b;a.crossVectors(r,n),a.crossVectors(n,a),a.normalize();const l=i*.5,c=Math.max(this.desiredDistance,l),h=Math.sqrt(c*c-l*l),d=a.clone();d.multiplyScalar(h),d.add(s),gt(this.gameObject,d);const p=s.clone();p.sub(a),this.gameObject.lookAt(p)}}const iT=v("gizmos"),nT=v("debugboxhelper");class St extends R{box=null;static testBox=new xi;_lastMatrixUpdateFrame=-1;static _position=new b;static _size=new b(.01,.01,.01);static _emptyObjectSize=new b(.01,.01,.01);isInBox(e){if(!e)return;if(this.box||(this.box=new xi),Xt([e],void 0,void 0,St.testBox),St.testBox.isEmpty()){const i=J(e,St._position);St.testBox.setFromCenterAndSize(i,St._emptyObjectSize)}this.updateBox();const t=this.box?.intersectsBox(St.testBox);return t&&nT&&B.DrawWireBox3(St.testBox,16711680,5),t}intersects(e){return e?this.updateBox(!1).intersectsBox(e):!1}updateBox(e=!1){if(this.box||(this.box=new xi),e||this.context.time.frameCount!=this._lastMatrixUpdateFrame){const t=this._lastMatrixUpdateFrame<0;this._lastMatrixUpdateFrame=this.context.time.frameCount;const i=t,n=J(this.gameObject,St._position,i),s=He(this.gameObject,St._size);this.box.setFromCenterAndSize(n,s)}return this.box}_helper=null;_color=null;awake(){this._helper=null,this._color=null,this.box=null}showHelper(e=null,t=!1){if(!(!iT&&!t)){if(this._helper){e&&this._color?.set(e),this.gameObject.add(this._helper);return}this._helper=Cg(e),this.gameObject.add(this._helper)}}}var oT=Object.defineProperty,di=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&oT(e,t,n),n};class ui extends R{get isCollider(){return!0}attachedRigidbody=null;isTrigger=!1;sharedMaterial;membership=[0];filter;awake(){super.awake(),this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ze))}start(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ze))}onEnable(){this.attachedRigidbody||(this.attachedRigidbody=this.gameObject.getComponentInParent(Ze))}onDisable(){this.context.physics.engine?.removeBody(this)}get body(){return this.context.physics.engine?.getBody(this)}updateProperties=()=>{this.context.physics.engine?.updateProperties(this)};updatePhysicsMaterial(){this.context.physics.engine?.updatePhysicsMaterial(this)}}di([u(Ze)],ui.prototype,"attachedRigidbody"),di([u()],ui.prototype,"isTrigger"),di([u()],ui.prototype,"sharedMaterial"),di([u()],ui.prototype,"membership"),di([u()],ui.prototype,"filter");class il extends ui{radius=.5;center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.addSphereCollider(this),Rd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Dm(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}}di([Ot(),u()],il.prototype,"radius"),di([u(b)],il.prototype,"center");const Ef=class pS extends ui{static add(e,t){const i=Sn(e,pS);return i.autoFit(),t?.rigidbody===!0&&Sn(e,Ze,{isKinematic:!1}),i}size=new b(1,1,1);center=new b(0,0,0);onEnable(){super.onEnable(),this.context.physics.engine?.addBoxCollider(this,this.size),Rd(this.gameObject.scale,this.updateProperties)}onDisable(){super.onDisable(),Dm(this.gameObject.scale,this.updateProperties)}onValidate(){this.updateProperties()}autoFit(e){const t=this.gameObject,i=t.position.clone(),n=t.quaternion.clone(),s=t.scale.clone(),r=t.parent;t.position.set(0,0,0),t.quaternion.set(0,0,0,1),t.scale.set(1,1,1),t.parent=null,t.updateMatrix();const a=Xt([t]);t.position.copy(i),t.quaternion.copy(n),t.scale.copy(s),t.parent=r,e?.debug===!0&&B.DrawWireBox3(a,16768256,20),this.size=a.getSize(new b)||new b(1,1,1),this.center=a.getCenter(new b)||new b(0,0,0),this.size.length()<=0&&this.size.set(.01,.01,.01)}};di([Ot(),u(b)],Ef.prototype,"size"),di([u(b)],Ef.prototype,"center");let zu=Ef;class Rs extends ui{sharedMesh;convex=!1;onEnable(){if(super.onEnable(),!this.context.physics.engine)return;this.sharedMesh?.isMesh||(this.gameObject instanceof G||this.gameObject instanceof xo)&&(this.sharedMesh=this.gameObject);const e=0;if(this.sharedMesh?.isMesh)this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex),Ve.assignMeshLOD(this.sharedMesh,e).then(t=>{t&&this.activeAndEnabled&&this.context.physics.engine&&this.sharedMesh&&(this.context.physics.engine.removeBody(this),this.sharedMesh.geometry=t,this.context.physics.engine.addMeshCollider(this,this.sharedMesh,this.convex))});else{const t=this.sharedMesh;if(t?.isGroup){console.warn(`MeshCollider mesh is a group "${this.sharedMesh?.name||this.gameObject.name}", adding all children as colliders. This is currently not fully supported (colliders can not be removed from world again)`,this);const i=new Array;for(const n in t.children){const s=t.children[n];s.isMesh&&(this.context.physics.engine.addMeshCollider(this,s,this.convex),i.push(Ve.assignMeshLOD(s,e)))}Promise.all(i).then(n=>{if(n.some(r=>r)==!1)return;this.context.physics.engine?.removeBody(this);const s=new G;for(const r of n)r&&this.activeAndEnabled&&(s.geometry=r,this.context.physics.engine?.addMeshCollider(this,s,this.convex))})}else(A()||v("showcolliders"))&&console.warn(`[MeshCollider] A MeshCollider mesh is assigned to an unknown object on "${this.gameObject.name}", but it's neither a Mesh nor a Group. Please double check that you attached the collider component to the right object and report a bug otherwise!`,this)}}}di([u(G)],Rs.prototype,"sharedMesh"),di([u()],Rs.prototype,"convex");class Bo extends ui{center=new b(0,0,0);radius=.5;height=2;onEnable(){super.onEnable(),this.context.physics.engine?.addCapsuleCollider(this,this.height,this.radius)}}di([u(b)],Bo.prototype,"center"),di([u()],Bo.prototype,"radius"),di([u()],Bo.prototype,"height");var sT=Object.defineProperty,Fo=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&sT(e,t,n),n};const Jw=v("debugcharactercontroller");class zr extends R{center=new b(0,0,0);radius=.5;height=2;_rigidbody=null;get rigidbody(){return this._rigidbody?this._rigidbody:(this._rigidbody=this.gameObject.getComponent(Ze),this._rigidbody||(this._rigidbody=this.gameObject.addComponent(Ze)),this.rigidbody)}_activeGroundCollisions;awake(){this._activeGroundCollisions=new Set}onEnable(){const e=this.rigidbody;let t=this.gameObject.getComponent(Bo);t||(t=this.gameObject.addComponent(Bo)),t.center.copy(this.center),t.radius=this.radius,t.height=this.height;const i=new b(0,0,1),n=new b(1,0,0),s=new b(0,1,0),r=this.gameObject.getWorldDirection(new b);r.y=0;const a=n.dot(r)<0?-1:1,l=i.angleTo(r)*a;this.gameObject.setRotationFromAxisAngle(s,l),e.lockRotationX=!0,e.lockRotationY=!0,e.lockRotationZ=!0}move(e){this.gameObject.position.add(e)}onCollisionEnter(e){(e.contacts.length==0||e.contacts.some(t=>t.normal.y>.2))&&(this._activeGroundCollisions.add(e),Jw&&console.log(`Collision(${this._activeGroundCollisions.size}): ${e.contacts.map(t=>t.normal.y.toFixed(2)).join(", ")} - ${this.isGrounded}`))}onCollisionExit(e){this._activeGroundCollisions.delete(e),Jw&&console.log(`Collision(${this._activeGroundCollisions.size}) - ${this.isGrounded}`)}get isGrounded(){return this._activeGroundCollisions.size>0}_contactVelocity=new b;get contactVelocity(){this._contactVelocity.set(0,0,0);for(const e of this._activeGroundCollisions){const t=this.context.physics.engine?.getLinearVelocity(e.collider);t&&(this._contactVelocity.x+=t.x,this._contactVelocity.y+=t.y,this._contactVelocity.z+=t.z)}return this._contactVelocity}}Fo([u(b)],zr.prototype,"center"),Fo([u()],zr.prototype,"radius"),Fo([u()],zr.prototype,"height");class Uo extends R{controller;movementSpeed=2;rotationSpeed=2;jumpForce=1;doubleJumpForce=2;animator;lookForward=!0;awake(){this._currentRotation=new U}update(){const e=this.context.input;e.isKeyPressed("KeyW")?this.moveInput.y+=1:e.isKeyPressed("KeyS")&&(this.moveInput.y-=1),e.isKeyPressed("KeyD")?this.lookInput.x+=1:e.isKeyPressed("KeyA")&&(this.lookInput.x-=1),this.jumpInput||=e.isKeyDown("Space")}move(e){this.moveInput.add(e)}look(e){this.lookInput.add(e)}jump(){this.jumpInput=!0}lookInput=new ee(0,0);moveInput=new ee(0,0);jumpInput=!1;onBeforeRender(){this.handleInput(this.moveInput,this.lookInput,this.jumpInput),this.lookInput.set(0,0),this.moveInput.set(0,0),this.jumpInput=!1}_currentSpeed=new b(0,0,0);_currentAngularSpeed=new b(0,0,0);_temp=new b(0,0,0);_jumpCount=0;_currentRotation;handleInput(e,t,i){if(this.controller?.isGrounded&&(this._jumpCount=0,this.doubleJumpForce>0&&this.animator?.setBool("doubleJump",!1)),this._currentSpeed.z+=e.y*this.movementSpeed*this.context.time.deltaTime,this.animator?.setBool("running",e.length()>.01),this.animator?.setBool("jumping",this.controller?.isGrounded===!0&&i),this._temp.copy(this._currentSpeed),this._temp.applyQuaternion(this.gameObject.quaternion),this.controller?this.controller.move(this._temp):this.gameObject.position.add(this._temp),this._currentAngularSpeed.y+=L.toRadians(-t.x*this.rotationSpeed)*this.context.time.deltaTime,this.lookForward&&Math.abs(this._currentAngularSpeed.y)<.01){const n=this.context.mainCameraComponent.forward;n.y=0,n.normalize(),this._currentRotation.setFromUnitVectors(new b(0,0,1),n),this.gameObject.quaternion.slerp(this._currentRotation,this.context.time.deltaTime*10)}if(this.gameObject.rotateY(this._currentAngularSpeed.y),this._currentSpeed.multiplyScalar(1-this.context.time.deltaTime*10),this._currentAngularSpeed.y*=1-this.context.time.deltaTime*10,this.controller&&i&&this.jumpForce>0){let n=this.controller?.isGrounded;if(this.doubleJumpForce>0&&!this.controller?.isGrounded&&this._jumpCount===1&&(n=!0,this.animator?.setBool("doubleJump",!0)),n){this._jumpCount+=1;const s=this.controller.rigidbody,r=this._jumpCount===2?this.doubleJumpForce:this.jumpForce;s.applyImpulse(new b(0,1,0).multiplyScalar(r))}}if(this.controller){const n=this.controller?.rigidbody.getVelocity().y;if(n<-1){this._raycastOptions.ray||(this._raycastOptions.ray=new vo),this._raycastOptions.ray.origin.copy(J(this.gameObject)),this._raycastOptions.ray.direction.set(0,-1,0);const s=this.layer;this.gameObject.layers.disableAll(),this.gameObject.layers.set(2);const r=this.context.physics.raycast(this._raycastOptions);this.gameObject.layers.set(s),(r.length&&r[0].distance>2||n<-10)&&this.animator?.setBool("falling",!0)}else this.animator?.setBool("falling",!1)}}_raycastOptions=new bs}Fo([u(zr)],Uo.prototype,"controller"),Fo([u()],Uo.prototype,"movementSpeed"),Fo([u()],Uo.prototype,"rotationSpeed"),Fo([u()],Uo.prototype,"jumpForce"),Fo([u()],Uo.prototype,"doubleJumpForce"),Fo([u(yt)],Uo.prototype,"animator");var rT=Object.defineProperty,nl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&rT(e,t,n),n};const $c=v("debugcontactshadows");Cu(o=>{const e=o.domElement.getAttribute("contactshadows")||o.domElement.getAttribute("contact-shadows");if(e!=null&&e!="0"&&e!="false"){console.debug("Auto-creating ContactShadows because of `contactshadows` attribute");const t=Hc.auto(o),i=parseFloat(e);isNaN(i)||(t.opacity=i,t.darkness=i)}});const Nr=class ad extends R{static _instances=new Map;static auto(e,t){if(e||(e=z.Current),!e)throw new Error("No context provided and no current context set.");let i=this._instances.get(e);if(!i||i.destroyed){const n=new k;i=Sn(n,ad,{autoFit:!1,occludeBelowGround:!1}),this._instances.set(e,i)}return e.scene.add(i.gameObject),i.fitShadows(t),i}autoFit=!1;darkness=.5;opacity=.5;blur=4;occludeBelowGround=!1;backfaceShadows=!0;minSize;manualUpdate=!1;set needsUpdate(e){this._needsUpdate=e}get needsUpdate(){return this._needsUpdate}_needsUpdate=!1;shadowsRoot=new k;shadowCamera;shadowGroup=new xo;renderTarget;renderTargetBlur;plane;occluderMesh;blurPlane;depthMaterial;horizontalBlurMaterial;verticalBlurMaterial;textureSize=512;fitShadows(e={}){$c&&console.warn("Fitting shadows to scene"),Id(this.shadowsRoot,!1);const t=e.object||this.context.scene,i=Xt(t,[this.shadowsRoot]),n=Math.max(1,this.blur/32),s=i.max.x-i.min.x,r=i.max.z-i.min.z;i.expandByVector(new b(n*s,0,n*r)),$c&&B.DrawWireBox3(i,16776960,60),this.gameObject.parent&&i.applyMatrix4(this.gameObject.parent.matrixWorld.clone().invert());const a=i.min,l=Math.max(1e-5,(i.max.y-a.y)*.002);i.max.y+=l,this.shadowsRoot.position.set((a.x+i.max.x)/2,a.y-l,(a.z+i.max.z)/2),this.shadowsRoot.scale.set(i.max.x-a.x,i.max.y-a.y,i.max.z-a.z),e.positionOffset&&(e.positionOffset.x!==void 0&&(this.shadowsRoot.position.x+=e.positionOffset.x),e.positionOffset.y!==void 0&&(this.shadowsRoot.position.y+=e.positionOffset.y),e.positionOffset.z!==void 0&&(this.shadowsRoot.position.z+=e.positionOffset.z)),e.scaleFactor&&(e.scaleFactor.x!==void 0&&(this.shadowsRoot.scale.x*=e.scaleFactor.x),e.scaleFactor.y!==void 0&&(this.shadowsRoot.scale.y*=e.scaleFactor.y),e.scaleFactor.z!==void 0&&(this.shadowsRoot.scale.z*=e.scaleFactor.z)),this.applyMinSize(),this.shadowsRoot.matrixWorldNeedsUpdate=!0,$c&&console.log("Fitted shadows to scene",this.shadowsRoot.scale.clone())}awake(){ad._instances.set(this.context,this),this.shadowsRoot.hideFlags=Bu.DontExport,Id(this.shadowsRoot,!1)}start(){$c&&console.log("Create ContactShadows on "+this.gameObject.name,this),this.gameObject.add(this.shadowsRoot),this.shadowsRoot.add(this.shadowGroup),this.renderTarget=new Vn(this.textureSize,this.textureSize),this.renderTarget.texture.generateMipmaps=!1,this.renderTargetBlur=new Vn(this.textureSize,this.textureSize),this.renderTargetBlur.texture.generateMipmaps=!1;const e=new Un(1,1).rotateX(Math.PI/2);this.gameObject instanceof G&&(console.warn("ContactShadows can not be added to a Mesh. Please add it to a Group or an empty Object"),Ao(this.gameObject,!1));const t=new xe({map:this.renderTarget.texture,opacity:this.opacity,color:0,transparent:!0,depthWrite:!1,side:ps});this.plane=new G(e,t),this.plane.scale.y=-1,this.plane.layers.set(2),this.shadowsRoot.add(this.plane),this.plane&&(this.plane.renderOrder=1),this.occluderMesh=new G(this.plane.geometry,new xe({depthWrite:!0,stencilWrite:!0,colorWrite:!1,side:Pd})).translateY(-1e-4),this.occluderMesh.renderOrder=-100,this.occluderMesh.layers.set(2),this.shadowsRoot.add(this.occluderMesh),this.blurPlane=new G(e),this.blurPlane.visible=!1,this.shadowGroup.add(this.blurPlane);const i=0,n=1;this.shadowCamera=new fd(-1/2,1/2,1/2,-1/2,i,n),this.shadowCamera.layers.enableAll(),this.shadowCamera.rotation.x=Math.PI/2,this.shadowGroup.add(this.shadowCamera),this.depthMaterial=new $S,this.depthMaterial.userData.darkness={value:this.darkness},this.depthMaterial.blending=HS,this.depthMaterial.blendEquation=GS,this.depthMaterial.onBeforeCompile=s=>{this.depthMaterial&&(s.uniforms.darkness=this.depthMaterial.userData.darkness,s.fragmentShader=`
969
- uniform float darkness;
970
- ${s.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );","gl_FragColor = vec4( vec3( 1.0 ), ( 1.0 - fragCoordZ ) * darkness * opacity * (gl_FrontFacing ? 1.0 : 0.66) );")}
971
- `)},this.depthMaterial.depthTest=!1,this.depthMaterial.depthWrite=!1,this.horizontalBlurMaterial=new zn(qC),this.horizontalBlurMaterial.depthTest=!1,this.verticalBlurMaterial=new zn(XC),this.verticalBlurMaterial.depthTest=!1,this.shadowGroup.visible=!1,this.autoFit?this.fitShadows():this.applyMinSize()}onEnable(){this._needsUpdate=!0}onDestroy(){ad._instances.get(this.context)===this&&ad._instances.delete(this.context),this.renderTarget?.dispose(),this.renderTargetBlur?.dispose(),this.depthMaterial?.dispose(),this.horizontalBlurMaterial?.dispose(),this.verticalBlurMaterial?.dispose(),this.blurPlane?.geometry.dispose(),this.plane?.geometry.dispose(),this.occluderMesh?.geometry.dispose()}onBeforeRender(e){if(this.manualUpdate&&!this._needsUpdate)return;if(this._needsUpdate=!1,!this.renderTarget||!this.renderTargetBlur||!this.depthMaterial||!this.shadowCamera||!this.blurPlane||!this.shadowGroup||!this.plane||!this.horizontalBlurMaterial||!this.verticalBlurMaterial){$c&&console.error("ContactShadows: not initialized yet");return}const t=this.context.scene,i=this.context.renderer,n=i.getRenderTarget();this.shadowGroup.visible=!0,this.occluderMesh&&(this.occluderMesh.visible=!1);const s=this.plane.visible;this.plane.visible=!1,this.gameObject instanceof G&&Ao(this.gameObject,!1);const r=t.background;t.background=null,t.overrideMaterial=this.depthMaterial,this.backfaceShadows?this.depthMaterial.side=Ci:this.depthMaterial.side=ps;const a=i.getClearAlpha();i.setClearAlpha(0);const l=i.xr.enabled;i.xr.enabled=!1;const c=this.context.scene.matrixWorldAutoUpdate;this.context.scene.matrixWorldAutoUpdate=!1;const h=i.renderLists.get(t,0),d=h.transparent;ex.length=0,h.transparent=ex,Af.length=0;for(const m of h.opaque){if(!m.object.visible)continue;const f=m.material;let g=m.material.colorWrite==!1||f.wireframe===!0||a_(m.object)===!1;!g&&m.material.isLineMaterial&&(g=!0),!g&&m.material.isPointsMaterial&&(g=!0),g&&(Af.push(m.object),m.object["needle:visible"]=m.object.visible,m.object.visible=!1)}i.setRenderTarget(this.renderTarget),i.clear(),i.render(t,this.shadowCamera),h.transparent=d;for(const m of Af)m["needle:visible"]!=null&&(m.visible=m["needle:visible"]);t.overrideMaterial=null;const p=Math.max(this.blur,.05);this.blurShadow(p*2),this.blurShadow(p*.5),this.shadowGroup.visible=!1,this.occluderMesh&&(this.occluderMesh.visible=this.occludeBelowGround),this.plane.visible=s,i.setRenderTarget(n),i.setClearAlpha(a),t.background=r,i.xr.enabled=l,this.context.scene.matrixWorldAutoUpdate=c}blurShadow(e){if(!this.blurPlane||!this.shadowCamera||!this.renderTarget||!this.renderTargetBlur||!this.horizontalBlurMaterial||!this.verticalBlurMaterial)return;this.blurPlane.visible=!0;const t=this.shadowsRoot.worldScale,i=(t.x+t.z)/2,n=t.z/i,s=t.x/i;this.blurPlane.material=this.horizontalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTarget.texture,this.horizontalBlurMaterial.uniforms.h.value=e*1/this.textureSize*n;const r=this.context.renderer,a=r.getRenderTarget();r.setRenderTarget(this.renderTargetBlur),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.material=this.verticalBlurMaterial,this.blurPlane.material.uniforms.tDiffuse.value=this.renderTargetBlur.texture,this.verticalBlurMaterial.uniforms.v.value=e*1/this.textureSize*s,r.setRenderTarget(this.renderTarget),r.render(this.blurPlane,this.shadowCamera),this.blurPlane.visible=!1,r.setRenderTarget(a)}applyMinSize(){this.minSize&&this.shadowsRoot.scale.set(Math.max(this.minSize.x||0,this.shadowsRoot.scale.x),Math.max(this.minSize.y||0,this.shadowsRoot.scale.y),Math.max(this.minSize.z||0,this.shadowsRoot.scale.z))}};nl([u()],Nr.prototype,"autoFit"),nl([u()],Nr.prototype,"darkness"),nl([u()],Nr.prototype,"opacity"),nl([u()],Nr.prototype,"blur"),nl([u()],Nr.prototype,"occludeBelowGround"),nl([u()],Nr.prototype,"backfaceShadows");let Hc=Nr;const ex=[],Af=new Array,aT=v("logstats");class If extends R{onEnable(){console.log(this),aT&&this.startCoroutine(this.run(),we.OnAfterRender)}*run(){for(;this.enabled;){const e=this.context.renderer.info;console.log(e.memory,e.render,e.programs),yield}}}class Gc extends R{isUsed=!0;usedBy=null}class Lf extends R{}const tx=v("debugdeletable");class ar extends St{static _instances=[];onEnable(){ar._instances.push(this)}onDisable(){const e=ar._instances.indexOf(this);e>=0&&ar._instances.splice(e,1)}}class jf extends R{update(){for(const e of ar._instances){const t=this.gameObject;if(e.isInBox(t)===!0){const i=x.getComponentInParent(this.gameObject,Gc);if(i)tx&&console.warn("DeleteBox: Not deleting object with usage marker",this.guid,i);else{if(tx)try{if(e.box){const n=e.box,s=St.testBox;B.DrawWireBox3(n,16711680,5),B.DrawWireBox3(s,255,5),console.log("DeleteBox: Destroying",this.gameObject,{deleteBoxArea:n,deletedObjectArea:s})}else console.log("DeleteBox: Destroying",this.gameObject)}catch{}xc(this.gameObject,this.context.connection)}}}}}var lT=Object.defineProperty,cT=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&lT(e,t,n),n};class Nu extends R{visibleOn;onEnable(){this.apply()}apply(){this.test()||x.setActive(this.gameObject,!1)}test(){return this.visibleOn<0?!0:q.isMobileDevice()?(this.visibleOn&2)!==0:(this.visibleOn&1)!==0}}cT([u()],Nu.prototype,"visibleOn");var hT=Object.defineProperty,Vr=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&hT(e,t,n),n};const to=v("debugdrag"),Df=[];var Bf=(o=>(o[o.XZPlane=0]="XZPlane",o[o.Attached=1]="Attached",o[o.HitNormal=2]="HitNormal",o[o.DynamicViewAngle=3]="DynamicViewAngle",o[o.SnapToSurfaces=4]="SnapToSurfaces",o[o.None=5]="None",o))(Bf||{});const Ts=class ln extends R{static get HasAnySelected(){return this._active>0}static _active=0;static get CurrentlySelected(){Df.length=0;for(const e of this._instances)e._isDragging&&Df.push(e);return Df}static _instances=[];dragMode=3;snapGridResolution=0;keepRotation=!0;xrDragMode=1;xrKeepRotation=!1;xrDistanceDragFactor=1;showGizmo=!1;get draggedObject(){return this._targetObject}setTargetObject(e){this._targetObject=e;for(const i of this._dragHandlers.values())i.setTargetObject(e);const t="_rigidbody-was-kinematic";this._rigidbody?.[t]===!1&&(this._rigidbody.isKinematic=!1,this._rigidbody[t]=void 0),this._rigidbody=null,e&&(this._rigidbody=x.getComponentInChildren(e,Ze),this._rigidbody?.isKinematic===!1&&(this._rigidbody.isKinematic=!0,this._rigidbody[t]=!1))}_rigidbody=null;_targetObject=null;_dragHelper=null;static lastHovered;_draggingRigidbodies=[];_potentialDragStartEvt=null;_dragHandlers=new Map;_totalMovement=new b;_marker=null;_isDragging=!1;_didDrag=!1;awake(){this._potentialDragStartEvt=null,this._dragHandlers=new Map,this._totalMovement=new b,this._marker=null,this._isDragging=!1,this._didDrag=!1,this._dragHelper=null,this._draggingRigidbodies=[]}start(){this.gameObject.getComponentInParent(Ei)||this.gameObject.addComponent(Ei)}onEnable(){ln._instances.push(this)}onDisable(){ln._instances=ln._instances.filter(e=>e!==this)}allowEdit(e=null){return this.context.connection.allowEditing}onPointerEnter(e){if(!this.allowEdit(this.gameObject)||e.mode!=="screen"||(e.event.mode==="tracked-pointer"||e.event.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)return;const t=x.getComponentInParent(e.object,ln);!t||t!==this||(ln.lastHovered=e.object,this.context.domElement.style.cursor="pointer")}onPointerMove(e){(this._isDragging||this._potentialDragStartEvt!==null)&&e.use()}onPointerExit(e){this.allowEdit(this.gameObject)&&e.mode==="screen"&&ln.lastHovered===e.object&&(this.context.domElement.style.cursor="auto")}onPointerDown(e){if(!(!this.allowEdit(this.gameObject)||e.used||(e.mode==="tracked-pointer"||e.mode==="transient-pointer"?this.xrDragMode:this.dragMode)===5)&&(ln.lastHovered=e.object,e.button===0)){this._dragHandlers.size===0&&(this._didDrag=!1,this._totalMovement.set(0,0,0),this._potentialDragStartEvt=e),this._targetObject||this.setTargetObject(this.gameObject),ln._active+=1;const t=new Ff(this,this._targetObject);if(this._dragHandlers.set(e.event.space,t),t.onDragStart(e),this._dragHandlers.size===2){const i=this._dragHandlers.values(),n=i.next().value,s=i.next().value;if(n instanceof Ff&&s instanceof Ff){const r=new dT(this,this._targetObject,n,s);this._dragHandlers.set(this.gameObject,r),r.onDragStart(e)}else console.error("Attempting to construct a MultiTouchDragHandler with invalid DragPointerHandlers. This is likely a bug.",{a:n,b:s})}e.use()}}onPointerUp(e){if(to&&B.DrawLabel(e.point??this.gameObject.worldPosition,"POINTERUP:"+e.pointerId+", "+e.button,.03,3),!this.allowEdit(this.gameObject)||e.button!==0)return;this._potentialDragStartEvt=null;const t=this._dragHandlers.get(e.event.space),i=this._dragHandlers.get(this.gameObject);i&&(i.handlerA===t||i.handlerB===t)&&(this._dragHandlers.delete(this.gameObject),i.onDragEnd(e)),t&&(ln._active>0&&(ln._active-=1),this.setTargetObject(null),t.onDragEnd&&t.onDragEnd(e),this._dragHandlers.delete(e.event.space),this._dragHandlers.size===0&&this.onLastDragEnd(e),e.use())}update(){for(const e of this._dragHandlers.values())e.collectMovementInfo&&e.collectMovementInfo(),e.getTotalMovement&&this._totalMovement.add(e.getTotalMovement());if(this._potentialDragStartEvt){if(!this._didDrag)if(this._totalMovement.length()>3e-4)this._didDrag=!0;else return;const e=this._potentialDragStartEvt;this._potentialDragStartEvt=null,this.onFirstDragStart(e)}for(const e of this._dragHandlers.values())e.onDragUpdate&&e.onDragUpdate(this._dragHandlers.size);this._dragHelper&&this._dragHelper.hasSelected&&this.onAnyDragUpdate()}onFirstDragStart(e){if(!e||!e.object)return;const t=x.getComponentInParent(e.object,ln);if(!t||t!==this&&t._isDragging)return;const i=this._targetObject||this.gameObject;if(!i)return;this._isDragging=!0;const n=x.getComponentInChildren(i,Pn);to&&console.log("DRAG START",n,i),n&&(n.fastMode=!0,n?.requestOwnership()),this._marker=x.addComponent(i,Gc),this._draggingRigidbodies.length=0;const s=x.getComponentsInChildren(i,Ze);s&&this._draggingRigidbodies.push(...s)}onAnyDragUpdate(){if(!this._dragHelper)return;this._dragHelper.showGizmo=this.showGizmo,this._dragHelper.onUpdate(this.context);for(const t of this._draggingRigidbodies)t.wakeUp(),t.resetVelocities(),t.resetForcesAndTorques();const e=this._targetObject||this.gameObject;hn.markDirty(e)}onLastDragEnd(e){if(!this||!this._isDragging)return;this._isDragging=!1;for(const i of this._draggingRigidbodies)i.setVelocity(i.smoothedVelocity);if(this._draggingRigidbodies.length=0,this._targetObject=null,e?.object){const i=x.getComponentInChildren(e.object,Pn);i&&(i.fastMode=!1)}if(this._marker&&this._marker.destroy(),!this._dragHelper)return;const t=this._dragHelper.selected;to&&console.log("DRAG END",t,t?.visible),this._dragHelper.setSelected(null,this.context)}};Vr([u()],Ts.prototype,"dragMode"),Vr([u()],Ts.prototype,"snapGridResolution"),Vr([u()],Ts.prototype,"keepRotation"),Vr([u()],Ts.prototype,"xrDragMode"),Vr([u()],Ts.prototype,"xrKeepRotation"),Vr([u()],Ts.prototype,"xrDistanceDragFactor"),Vr([u()],Ts.prototype,"showGizmo");let Wr=Ts;class dT{handlerA;handlerB;context;settings;gameObject;_handlerAAttachmentPoint=new b;_handlerBAttachmentPoint=new b;_followObject;_manipulatorObject;_deviceMode;_followObjectStartWorldQuaternion=new U;constructor(e,t,i,n){this.context=e.context,this.settings=e,this.gameObject=t,this.handlerA=i,this.handlerB=n,this._followObject=new k,this._manipulatorObject=new k,this.context.scene.add(this._manipulatorObject);const s=Z.active?.rig?.gameObject;if(!this.handlerA||!this.handlerB||!this.handlerA.hitPointInLocalSpace||!this.handlerB.hitPointInLocalSpace){console.error("Invalid: MultiTouchDragHandler needs two valid DragPointerHandlers with hitPointInLocalSpace set.");return}if(this._tempVec1.copy(this.handlerA.hitPointInLocalSpace),this._tempVec2.copy(this.handlerB.hitPointInLocalSpace),this.gameObject.localToWorld(this._tempVec1),this.gameObject.localToWorld(this._tempVec2),s&&(s.worldToLocal(this._tempVec1),s.worldToLocal(this._tempVec2)),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.02?(to&&console.log("Finding alternative drag attachment points since initial distance is too low: "+this._initialDistance.toFixed(2)),this.handlerA.followObject.parent.getWorldPosition(this._tempVec1),this.handlerB.followObject.parent.getWorldPosition(this._tempVec2),this._handlerAAttachmentPoint.copy(this._tempVec1),this._handlerBAttachmentPoint.copy(this._tempVec2),this.gameObject.worldToLocal(this._handlerAAttachmentPoint),this.gameObject.worldToLocal(this._handlerBAttachmentPoint),this._initialDistance=this._tempVec1.distanceTo(this._tempVec2),this._initialDistance<.001&&(console.warn("Not supported right now \u2013 controller drag points for multitouch are too close!"),this._initialDistance=1)):(this._handlerAAttachmentPoint.copy(this.handlerA.hitPointInLocalSpace),this._handlerBAttachmentPoint.copy(this.handlerB.hitPointInLocalSpace)),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._initialScale.copy(t.scale),to){this._followObject.add(new Si(2)),this._manipulatorObject.add(new Si(5));const r=a=>`${a.x.toFixed(2)}, ${a.y.toFixed(2)}, ${a.z.toFixed(2)}`;B.DrawLine(this._tempVec1,this._tempVec2,65535,0,!1),B.DrawLabel(this._tempVec3,"A:B "+this._initialDistance.toFixed(2)+`
972
- `+r(this._tempVec1)+`
973
- `+r(this._tempVec2),.03,5)}}onDragStart(e){this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.matrix.identity(),this._deviceMode=e.mode,this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this.alignManipulator(),this._manipulatorObject.attach(this._followObject),this._manipulatorPosOffset.copy(this._followObject.position),this._manipulatorRotOffset.copy(this._followObject.quaternion),this._manipulatorScaleOffset.copy(this._followObject.scale)}onDragEnd(e){if(!this.handlerA||!this.handlerB){console.error("onDragEnd called on MultiTouchDragHandler without valid handlers. This is likely a bug.");return}this.handlerA.recenter(),this.handlerB.recenter(),this._manipulatorObject.removeFromParent(),this._followObject.removeFromParent(),this._manipulatorObject.destroy(),this._followObject.destroy()}_manipulatorPosOffset=new b;_manipulatorRotOffset=new U;_manipulatorScaleOffset=new b;_tempVec1=new b;_tempVec2=new b;_tempVec3=new b;tempLookMatrix=new K;_initialScale=new b;_initialDistance=0;alignManipulator(){if(!this.handlerA||!this.handlerB){console.error("alignManipulator called on MultiTouchDragHandler without valid handlers. This is likely a bug.",this);return}if(!this.handlerA.followObject||!this.handlerB.followObject){console.error("alignManipulator called on MultiTouchDragHandler without valid follow objects. This is likely a bug.",this.handlerA,this.handlerB);return}this._tempVec1.copy(this._handlerAAttachmentPoint),this._tempVec2.copy(this._handlerBAttachmentPoint),this.handlerA.followObject.localToWorld(this._tempVec1),this.handlerB.followObject.localToWorld(this._tempVec2),this._tempVec3.lerpVectors(this._tempVec1,this._tempVec2,.5),this._manipulatorObject.position.copy(this._tempVec3);const e=this.context.mainCamera;this.tempLookMatrix.lookAt(this._tempVec3,this._tempVec2,e.worldUp),this._manipulatorObject.quaternion.setFromRotationMatrix(this.tempLookMatrix);const t=this._tempVec1.distanceTo(this._tempVec2);this._manipulatorObject.scale.copy(this._initialScale).multiplyScalar(t/this._initialDistance),this._manipulatorObject.updateMatrix(),this._manipulatorObject.updateMatrixWorld(!0),to&&(B.DrawLabel(this._tempVec3.clone().add(new b(0,.2,0)),"A:B "+t.toFixed(2),.03),B.DrawLine(this._tempVec1,this._tempVec2,65280,0,!1))}onDragUpdate(){this.alignManipulator();const e=30,t=1;this._followObject.position.copy(this._manipulatorPosOffset),this._followObject.quaternion.copy(this._manipulatorRotOffset),this._followObject.scale.copy(this._manipulatorScaleOffset);const i=this.gameObject,n=this._followObject;if(!i){console.error("MultiTouchDragHandler has no dragged object. This is likely a bug.");return}n.updateMatrix(),n.updateMatrixWorld(!0);const s=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrKeepRotation:this.settings.keepRotation;if(this.settings.snapGridResolution>0){const h=this._followObject.worldPosition,d=this.settings.snapGridResolution;h.x=Math.round(h.x/d)*d,h.y=Math.round(h.y/d)*d,h.z=Math.round(h.z/d)*d,this._followObject.worldPosition=h,this._followObject.updateMatrix()}s&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const r=L.clamp01(this.context.time.deltaTime*e*t),a=i.worldPosition;a.lerp(n.worldPosition,r),i.worldPosition=a;const l=i.worldQuaternion;l.slerp(n.worldQuaternion,r),i.worldQuaternion=l;const c=i.worldScale;c.lerp(n.worldScale,r),i.worldScale=c}setTargetObject(e){this.gameObject=e}}class Ff{getTotalMovement(){return this._totalMovement}get followObject(){return this._followObject}get hitPointInLocalSpace(){return this._hitPointInLocalSpace}context;gameObject;settings;_lastRig=void 0;_followObject;_totalMovement=new b;_totalMovementAlongRayDirection=0;_grabStartDistance=0;_deviceMode;_followObjectStartPosition=new b;_followObjectStartQuaternion=new U;_followObjectStartWorldQuaternion=new U;_lastDragPosRigSpace;_tempVec=new b;_tempMat=new K;_hitPointInLocalSpace=new b;_hitNormalInLocalSpace=new b;_bottomCenter=new b;_backCenter=new b;_backBottomCenter=new b;_bounds=new xi;_dragPlane=new hr(new b(0,1,0));_draggedOverObject=null;_draggedOverObjectLastSetUp=null;_draggedOverObjectLastNormal=new b;_draggedOverObjectDuration=0;setTargetObject(e){this.gameObject=e}constructor(e,t){this.settings=e,this.context=e.context,this.gameObject=t,this._followObject=new k}recenter(){if(!this._followObject.parent){console.warn("Error: space follow object doesn't have parent but recenter() is called. This is likely a bug");return}if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}const e=this._followObject.parent;this.gameObject.add(this._followObject),this._followObject.matrixAutoUpdate=!1,this._followObject.position.set(0,0,0),this._followObject.quaternion.set(0,0,0,1),this._followObject.scale.set(1,1,1),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0),e.attach(this._followObject),this._followObjectStartPosition.copy(this._followObject.position),this._followObjectStartQuaternion.copy(this._followObject.quaternion),this._followObjectStartWorldQuaternion.copy(this._followObject.worldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const t=this._hitPointInLocalSpace.clone();this.gameObject.localToWorld(t),this._grabStartDistance=t.distanceTo(e.worldPosition);const i=Z.active?.rig?.gameObject?.worldScale.x||1;this._grabStartDistance/=i,this._totalMovementAlongRayDirection=0,this._lastDragPosRigSpace=void 0,to&&(B.DrawLine(t,e.worldPosition,65280,.5,!1),B.DrawLabel(e.worldPosition.add(new b(0,.1,0)),this._grabStartDistance.toFixed(2),.03,.5))}onDragStart(e){if(!this.gameObject){console.warn("Error: space follow object doesn't have a gameObject");return}if(e.event.space.add(this._followObject),this._lastDragPosRigSpace=void 0,e.point&&e.normal)this._hitPointInLocalSpace.copy(e.point),this.gameObject.worldToLocal(this._hitPointInLocalSpace),this._hitNormalInLocalSpace.copy(e.normal);else if(e){const m=e.event.space,f=m.worldPosition;this.gameObject.worldToLocal(f),this._hitPointInLocalSpace.copy(f);const g=m.worldUp;this._tempMat.copy(this.gameObject.matrixWorld).invert(),g.transformDirection(this._tempMat),this._hitNormalInLocalSpace.copy(g)}this.recenter(),this._totalMovement.set(0,0,0),this._deviceMode=e.mode;const t=this._followObject.parent.worldForward,i=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer"?this.settings.xrDragMode:this.settings.dragMode,n=this._hitPointInLocalSpace.clone();switch(this.gameObject.localToWorld(n),i){case 0:const m=new b(0,1,0);this.gameObject.parent&&m.transformDirection(this.gameObject.parent.matrixWorld.clone().invert()),this._dragPlane.setFromNormalAndCoplanarPoint(m,n);break;case 2:const f=this._hitNormalInLocalSpace.clone();f.transformDirection(this.gameObject.matrixWorld),this._dragPlane.setFromNormalAndCoplanarPoint(f,n);break;case 1:this._dragPlane.setFromNormalAndCoplanarPoint(t,n);break;case 3:this.setPlaneViewAligned(n,!0);break;case 4:this.setPlaneViewAligned(n,!1);break}const s=this.gameObject.parent,r=this.gameObject.position.clone(),a=this.gameObject.quaternion.clone(),l=this.gameObject.scale.clone(),c=this.gameObject.matrixWorld.clone();s&&s.remove(this.gameObject),this.gameObject.position.set(0,0,0),this.gameObject.quaternion.set(0,0,0,1),this.gameObject.scale.set(1,1,1);const h=Xt([this.gameObject]);h.expandByPoint(this.gameObject.worldPosition);const d=new b;h.getCenter(d);const p=new b;h.getSize(p),this._bottomCenter.copy(d.clone().add(new b(0,-p.y/2,0))),this._backCenter.copy(d.clone().add(new b(0,0,p.z/2))),this._backBottomCenter.copy(d.clone().add(new b(0,-p.y/2,p.z/2))),this._bounds.copy(h),s&&s.add(this.gameObject),this.gameObject.position.copy(r),this.gameObject.quaternion.copy(a),this.gameObject.scale.copy(l),this.gameObject.matrixWorld.copy(c),this._draggedOverObject=null,this._draggedOverObjectLastSetUp=null,this._draggedOverObjectLastNormal.set(0,1,0),this._draggedOverObjectDuration=0}collectMovementInfo(){if(!this._followObject.parent)return;const e=this._followObject.parent;this._followObject.updateMatrix();const t=e.worldPosition,i=Z.active?.rig?.gameObject;i&&i.worldToLocal(t),(this._lastDragPosRigSpace===void 0||i!=this._lastRig)&&(this._lastDragPosRigSpace=t.clone(),this._lastRig=i),this._tempVec.copy(t).sub(this._lastDragPosRigSpace);const n=e.worldForward;if(i&&(this._tempMat.copy(i.matrixWorld).invert(),n.transformDirection(this._tempMat)),this._totalMovementAlongRayDirection+=n.dot(this._tempVec),this._tempVec.x=Math.abs(this._tempVec.x),this._tempVec.y=Math.abs(this._tempVec.y),this._tempVec.z=Math.abs(this._tempVec.z),this._totalMovement.add(this._tempVec),this._lastDragPosRigSpace.copy(t),to){let s=t;i&&(s=s.clone(),s.transformDirection(i.matrixWorld)),B.DrawRay(s,n,255)}}onDragUpdate(e){if(e>1)return;const t=this.gameObject;if(!t||!this._followObject){console.warn("Warning: DragPointerHandler doesn't have a dragged object. This is likely a bug.");return}const i=this._followObject.parent;if(!i){console.warn("Warning: DragPointerHandler doesn't have a drag source. This is likely a bug.");return}this._followObject.updateMatrix();const n=i.worldPosition,s=i.worldForward,r=this._deviceMode==="tracked-pointer"||this._deviceMode==="transient-pointer",a=r?this.settings.xrKeepRotation:this.settings.keepRotation,l=r?this.settings.xrDragMode:this.settings.dragMode;if(l===5)return;const c=10;a&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion),this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);let h=1,d=2;if(r&&this._grabStartDistance>.5){const w=1+this._totalMovementAlongRayDirection*(2*this.settings.xrDistanceDragFactor);h=Math.max(0,w),h=h*h*h}else this._grabStartDistance<=.5&&(d=3);this._followObject.position.copy(this._followObjectStartPosition),a||this._followObject.quaternion.copy(this._followObjectStartQuaternion),this._followObject.position.multiplyScalar(h),this._followObject.updateMatrix();const p=this._hasLastSurfaceHitPoint;this._hasLastSurfaceHitPoint=!1;const m=new vo(n,s);if(l==4){const w=this.context.physics.raycastFromRay(m,{testObject:P=>P!==this.followObject&&P!==i&&P!==t});if(w.length>0){const P=w[0];if(this._draggedOverObject===P.object?this._draggedOverObjectDuration+=this.context.time.deltaTime:(this._draggedOverObject=P.object,this._draggedOverObjectDuration=0),P.face){this._hasLastSurfaceHitPoint=!0,this._lastSurfaceHitPoint.copy(P.point);const M=this._draggedOverObjectDuration>=.15,O=this._totalMovement.length()>=.001,j=D(P.normal||P.face.normal).applyQuaternion(P.object.worldQuaternion);if((M||O)&&(this._draggedOverObjectLastSetUp!==this._draggedOverObject||this._draggedOverObjectLastNormal.dot(j)<.999999||this.context.time.frame%60===0)){this._draggedOverObjectLastSetUp=this._draggedOverObject,this._draggedOverObjectLastNormal.copy(P.face.normal);const I=D(),N=D();this._bounds.getCenter(I),this._bounds.getSize(N),I.sub(N.multiplyScalar(.5).multiply(j)),this._hitPointInLocalSpace.copy(I),this._hitNormalInLocalSpace.copy(P.face.normal),this._bounds.getCenter(I),this._bounds.getSize(N),I.add(N.multiplyScalar(.5).multiply(P.face.normal));const V=D(this._hitPointInLocalSpace).add(I);this._followObject.localToWorld(V);const H=P.point;this._dragPlane.setFromNormalAndCoplanarPoint(j,H)}else if(!(M||O))return}}else p&&this.gameObject&&this.setPlaneViewAligned(this.gameObject.worldPosition,!1)}if(l!==1&&m.intersectPlane(this._dragPlane,this._tempVec)){this._followObject.worldPosition=this._tempVec,this._followObject.updateMatrix(),this._followObject.updateMatrixWorld(!0);const w=D(this._hitPointInLocalSpace);this._followObject.localToWorld(w),to&&B.DrawLine(w,this._tempVec,65535,0,!1),this._followObject.worldPosition=this._tempVec.multiplyScalar(2).sub(w),this._followObject.updateMatrix(),this._followObject.updateMatrix()}if(this.settings.snapGridResolution>0){const w=this._followObject.worldPosition,P=this.settings.snapGridResolution;w.x=Math.round(w.x/P)*P,w.y=Math.round(w.y/P)*P,w.z=Math.round(w.z/P)*P,this._followObject.worldPosition=w,this._followObject.updateMatrix()}a&&(this._followObject.worldQuaternion=this._followObjectStartWorldQuaternion,this._followObject.updateMatrix());const f=L.clamp01(this.context.time.deltaTime*c*d),g=L.clamp01(this.context.time.deltaTime*c*.5*d),y=t.worldPosition;y.lerp(this._followObject.worldPosition,f),t.worldPosition=y;const _=t.worldQuaternion;if(_.slerp(this._followObject.worldQuaternion,g),t.worldQuaternion=_,to){const w=this._hitPointInLocalSpace.clone();t.localToWorld(w),B.DrawSphere(w,.02,16711680);const P=this._hitNormalInLocalSpace.clone();P.applyQuaternion(_),B.DrawRay(w,P,16711680),B.DrawLabel(y.add(new b(0,.25,0)),`Distance: ${this._totalMovement.length().toFixed(2)}
974
-
975
- Along Ray: ${this._totalMovementAlongRayDirection.toFixed(2)}
976
-
977
- Session: ${!!Z.active}
978
-
979
- Device: ${this._deviceMode}
980
-
981
- `,.03);const M=this._bottomCenter.clone(),O=this._backCenter.clone(),j=this._backBottomCenter.clone();t.localToWorld(M),t.localToWorld(O),t.localToWorld(j),B.DrawSphere(M,.01,65280,0,!1),B.DrawSphere(O,.01,255,0,!1),B.DrawSphere(j,.01,16711935,0,!1),B.DrawLine(M,j,65535,0,!1),B.DrawLine(j,O,65535,0,!1)}}onDragEnd(e){console.assert(this._followObject.parent===e.event.space,"Drag end: _followObject is not parented to the space object"),this._followObject.removeFromParent(),this._followObject.destroy(),this._lastDragPosRigSpace=void 0}_hasLastSurfaceHitPoint=!1;_lastSurfaceHitPoint=new b;setPlaneViewAligned(e,t){if(!this._followObject.parent)return!1;const i=this._followObject.parent.worldForward,n=D(0,1,0),s=i,r=n.angleTo(s),a=.5;return t&&(r>Math.PI/2+a||r<Math.PI/2-a)?this._dragPlane.setFromNormalAndCoplanarPoint(n,e):this._dragPlane.setFromNormalAndCoplanarPoint(i,e),!0}}class mS{showGizmo=!0;useViewAngle=!0;get hasSelected(){return this._selected!==null&&this._selected!==void 0}get selected(){return this._selected}_selected=null;_context=null;_camera;_cameraPlane=new hr;_hasGroundPlane=!1;_groundPlane=new hr;_groundOffset=new b;_groundOffsetFactor=0;_groundDistance=0;_groundPlanePoint=new b;_raycaster=new bd;_cameraPlaneOffset=new b;_intersection=new b;_worldPosition=new b;_inverseMatrix=new K;_rbs=[];_groundLine;_groundMarker;static geometry=new gn().setFromPoints([new b(0,0,0),new b(0,-1,0)]);constructor(e){this._camera=e;const t=new Oa(mS.geometry),i=t.material;i.color=new ne(.4,.4,.4),t.layers.set(2),t.name="line",t.scale.y=1,this._groundLine=t;const n=new yd(.5,22,22),s=new xe({color:i.color}),r=new G(n,s);r.visible=!1,r.layers.set(2),this._groundMarker=r}setSelected(e,t){if(this._selected&&t)for(const i of this._rbs)i.wakeUp(),i.setVelocity(0,0,0);if(this._selected&&Fr.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}Fr.Add(t,this._selected,null),this._groundOffsetFactor=0,this._hasGroundPlane=!0,this._groundOffset.set(0,0,0),this._requireUpdateGroundPlane=!0,this.onUpdateScreenSpacePlane()}}_groundOffsetVector=new b(0,1,0);_requireUpdateGroundPlane=!0;_didDragOnGroundPlaneLastFrame=!1;onUpdate(e){this._selected}onUpdateWorldPosition(e,t,i){if(this._selected){if(i){const n=J(this._selected);n.y=e.y,e=n}if(gt(this._selected,e),gt(this._groundLine,e),this._hasGroundPlane?this._groundLine.scale.y=this._groundDistance:this._groundLine.scale.y=1e3,this._groundLine.visible=this.showGizmo,this._groundMarker.visible=t!==null&&this.showGizmo,t){const n=J(this._camera).distanceTo(t)*.01;this._groundMarker.scale.set(n,n,n),gt(this._groundMarker,t)}}}onUpdateScreenSpacePlane(){if(!this._selected||!this._context)return;const e=this._context.input.getPointerPositionRC(0);e&&(this._raycaster.setFromCamera(e,this._camera),this._cameraPlane.setFromNormalAndCoplanarPoint(this._camera.getWorldDirection(this._cameraPlane.normal),this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld)),this._raycaster.ray.intersectPlane(this._cameraPlane,this._intersection)&&this._selected.parent&&(this._inverseMatrix.copy(this._selected.parent.matrixWorld).invert(),this._cameraPlaneOffset.copy(this._intersection).sub(this._worldPosition.setFromMatrixPosition(this._selected.matrixWorld))))}onUpdateGroundPlane(){if(!this._selected||!this._context)return;const e=J(this._selected),t=new vo(D(0,.1,0).add(e),D(0,-1,0)),i=new bs;i.testObject=s=>s!==this._selected;const n=this._context.physics.raycastFromRay(t,i);for(let s=0;s<n.length;s++){const r=n[s];if(!r.face||this.contains(this._selected,r.object))continue;const a=D(0,1,0);this._groundPlane.setFromNormalAndCoplanarPoint(a,r.point);break}this._hasGroundPlane=!0,this._groundPlane.setFromNormalAndCoplanarPoint(t.direction.multiplyScalar(-1),t.origin),this._raycaster.ray.intersectPlane(this._groundPlane,this._intersection),this._groundDistance=this._intersection.distanceTo(e),this._groundOffset.copy(this._intersection).sub(e)}contains(e,t){if(e===t)return!0;if(e.children){for(const i of e.children)if(this.contains(i,t))return!0}return!1}}var ix=(o=>(o.File_Spawned="file-spawned",o))(ix||{});class uT{guid;file_name;file_hash;file_size;position;scale;seed;sender;downloadUrl;parentGuid;boundsSize;constructor(e,t,i,n,s,r,a,l,c){this.seed=t,this.guid=i,this.file_name=n,this.file_hash=s,this.file_size=r,this.position=a,this.scale=l,this.sender=e,this.downloadUrl=c}}var Es;(o=>{const e=new Map;function t(n){e.has(n.guid)&&i(n.guid);const s=new k;e.set(n.guid,s);const r=new k;r.position.y=-.5,s.add(r);const a=new G(new Pa(1,1,1,1,1,1),new xe({color:14540253,wireframe:!0,transparent:!0,opacity:.3}));a.position.y=.5,r.add(a);const l=new k;r.add(l);const c=new G(new Pa(1,1,1,1,1,1),new xe({color:12307660,transparent:!0,opacity:.4}));c.position.y=.5,l.scale.y=.01,l.add(c);const h=new G(new Un(1,1,1,1),new xe({color:34,transparent:!0,opacity:.05,depthTest:!1}));return h.rotateX(-Math.PI/2),h.position.y=.51,c.add(h),n.parent.add(s),s.rotateY(Math.PI/2),n.position&&s.position?.copy(n.position),n.size&&(s.worldScale=new b().copy(n.size)),s.position.y=s.scale.y/2,{object:s,onProgress:d=>{l instanceof k&&l.scale.set(1,d,1)}}}o.addPreview=t;function i(n){const s=e.get(n);s&&(e.delete(n),s.removeFromParent())}o.removePreview=i})(Es||(Es={}));const ol=[],Vu=[];var Uf;(o=>{function e(i,n){const s={name:n?.name,priority:n?.priority??0,callback:i};return ol.push(s),ol.sort((r,a)=>r.priority===a.priority?0:r.priority>a.priority?-1:1),()=>{const r=ol.indexOf(s);r>=0&&ol.splice(r,1)}}o.onCreateCustomModelLoader=e;function t(i){return Vu.push(i),()=>{const n=Vu.indexOf(i);n>=0&&Vu.splice(n,1)}}o.onDetermineModelMimetype=t})(Uf||(Uf={}));const qc=v("debugfileformat");function nx(o){switch((o.split(".").pop()||o).toUpperCase()){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj";default:return null}}async function ox(o,e){const{useExtension:t=!0}=e;if(t){const s=o,r=new URL(s,globalThis.location.href);let a=null;const l=r.searchParams.get("filetype");switch(l&&(a=l.toUpperCase()),a?.length||(a=r.pathname.split(".").pop()?.toUpperCase()),qc&&console.warn(`[Needle Engine] Try to use file extension to determine type: '${a}'`),a){case"GLTF":return"model/gltf+json";case"VRM":return"model/vrm";case"GLB":return"model/gltf-binary";case"FBX":return"model/fbx";case"USD":return"model/vnd.usd+zip";case"USDA":return"model/vnd.usda+zip";case"USDZ":return"model/vnd.usdz+zip";case"OBJ":return"model/obj"}}const i=o;if(!o.startsWith("blob:")){const s=new URL(o,globalThis.location.href);s.searchParams.append("range","true"),o=s.toString()}const n=await fetch(o,{method:"GET",headers:{range:"bytes=0-32"}}).catch(s=>null);if(n?.ok){const s=await n.arrayBuffer(),r=sx(i,s,n);return qc&&console.log("[Needle Engine] Determined file type from header: "+r),r}return"unknown"}function sx(o,e,t){if(e.byteLength<4)return"unknown";const i=new Uint8Array(e);qc&&console.warn(`[Needle Engine] Trying to determine file type from binary data
982
- `,'"'+new TextDecoder().decode(e)+`"
983
- `,i);const n=new TextDecoder().decode(e).replace(/\s/g,"");if(n[0]==="{"&&n[1]==='"')return console.debug("GLTF detected"),"model/gltf+json";if(i[0]==103&&i[1]==108&&i[2]==84&&i[3]==70&&(i[4]==10||i[4]===2))return console.debug("GLTF .bin detected"),"model/gltf+json";if(i[0]==103&&i[1]==108&&i[2]==84&&i[3]==70&&i[4]==98)return console.debug("GLB detected"),"model/gltf-binary";if(i[0]==80&&i[1]==75&&i[2]==3&&i[3]==4)return console.debug("USDZ detected"),"model/vnd.usdz+zip";if(i[0]==80&&i[1]==88&&i[2]==82&&i[3]==45&&i[4]==85&&i[5]==83&&i[6]==68&&i[7]==67)return console.debug("Binary USD detected"),"model/vnd.usd";if(i[0]==35&&i[1]==117&&i[2]==115&&i[3]==100&&i[4]==97)return console.debug("ASCII USD detected"),"model/vnd.usda";if(i[0]==75&&i[1]==97&&i[2]==121&&i[3]==100&&i[4]==97&&i[5]==114&&i[6]==97&&i[7]==32)return console.debug("Binary FBX detected"),"model/fbx";if(i[0]==59&&i[1]==32&&i[2]==70&&i[3]==66&&i[4]==88&&i[5]==32)return console.debug("ASCII FBX detected"),"model/fbx";if(i[0]==35&&i[1]==32&&i[2]==66&&i[3]==108&&i[4]==101&&i[5]==110&&i[6]==100&&i[7]==101&&i[8]==114&&i[9]==32||i[0]==35&&i[1]==32&&i[2]==65&&i[3]==108&&i[4]==105&&i[5]==97&&i[6]==115&&i[7]==32&&i[8]==79&&i[9]==66&&i[10]==74)return console.debug("OBJ detected"),"model/obj";if(t.headers.has("content-type")){const s=t.headers.get("content-type");if(s?.startsWith("image/"))return console.debug("Image detected, not a model file"),"unsupported";switch(console.debug("Content-Type: "+s),s){case"model/gltf+json":case"model/gltf-binary":case"model/vrm":case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usd":case"model/vnd.usda+zip":case"model/vnd.usda":case"model/vnd.usdc":case"model/fbx":case"model/vnd.autodesk.fbx":case"model/obj":return s}}if(i[0]==118&&i[1]==32||i[0]==102&&i[1]==32)return console.debug("OBJ detected (the file has no header and starts with vertex or face)"),"obj";if(i[0]==35&&i[1]==32&&i[2]==70&&i[3]==105&&i[4]==108&&i[5]==101&&i[6]==32&&i[7]==101&&i[8]==120&&i[9]==112&&i[10]==111&&i[11]==114&&i[12]==116&&i[13]==101&&i[14]==100&&i[15]==32&&i[16]==98&&i[17]==121&&i[18]==32&&i[19]==90&&i[20]==66&&i[21]==114&&i[22]==117&&i[23]==115&&i[24]==104)return console.debug("OBJ detected (exported by ZBrush)"),"obj";if(i[0]==109&&i[1]==116&&i[2]==108&&i[3]==108&&i[4]==105&&i[5]==98)return console.debug("OBJ detected (mtllib)"),"obj";for(const s of Vu){const r=s({url:o,response:t,contentType:t.headers.get("content-type"),bytes:i});if(r)return qc&&console.debug(`Mimetype callback returned: ${r}`),r}if(A()||qc){const s=new TextDecoder().decode(e.slice(0,Math.min(e.byteLength,32)));console.warn(`Could not determine file type.
984
-
985
- Consider registering a custom loader via the 'onCreateCustomModelLoader' callback: 'NeedleEngineModelLoader.onCreateCustomModelLoader(args => { })'
986
-
987
- Content-Type: "${t.headers.get("content-type")}
988
- "Text: "${s}"
989
- Binary:`,i)}else console.debug("Could not determine file type from binary data");return"unknown"}const zf=v("debugstencil");function pT(o,e){return(o&1<<e.layer)!=0}const mT=Symbol("stencils");class rr{get name(){return"NEEDLE_render_objects"}static stencils={};static applyStencil(e){if(!e)return;const t=e.sourceId;if(zf&&console.log(t,rr.stencils),!t)return;const i=rr.stencils[t];if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];if(pT(s.layer,e)){zf&&console.log(s),setTimeout(()=>{$i()&&cu(e.gameObject)&&(ye("Stencil not supported on instanced objects"),console.warn("Stencil not supported on instanced objects",e))},500);for(let r=0;r<e.sharedMaterials.length;r++){let a=e.sharedMaterials[r];a&&(a=a.clone(),a[mT]=!0,a.stencilWrite=!0,a.stencilWriteMask=255,a.stencilFuncMask=255,a.stencilRef=s.value,a.stencilFunc=s.compareFunc,a.stencilZPass=s.passOp,a.stencilFail=s.failOp,a.stencilZFail=s.zFailOp,e.sharedMaterials[r]=a)}e.gameObject.renderOrder=s.event*1e3+s.index*50;break}}}parser;source;constructor(e,t){this.parser=e,this.source=t}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[fT];if(i){zf&&console.log(i);const n=i.stencil;if(n&&Array.isArray(n))for(const s of n){const r={...s};r.compareFunc=gT(r.compareFunc),r.passOp=Nf(r.passOp),r.failOp=Nf(r.failOp),r.zFailOp=Nf(r.zFailOp),rr.stencils[this.source]||(rr.stencils[this.source]=[]),rr.stencils[this.source].push(r)}}}return null}}function Nf(o){switch(o){case 0:return aC;case 1:return rC;case 2:return sC;case 3:return oC;case 4:return nC;case 6:return iC;case 7:return tC;case 5:return eC}return 0}function gT(o){switch(o){case 1:return rb;case 2:return JS;case 3:return KS;case 4:return ZS;case 5:return YS;case 6:return QS;case 7:return XS;case 8:return qS}return rb}const fT="NEEDLE_render_objects";var yT=Object.defineProperty,rx=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&yT(e,t,n),n};const sl=v("debugreflectionprobe"),ax=v("noreflectionprobe"),Vf=Symbol("reflectionProbeKey"),lx=Symbol("original material"),Wf=class os extends R{static _probes=new Map;static isUsingReflectionProbe(e){return!!(e[Vf]||e[lx]?.[Vf])}static get(e,t,i,n){if(!e||e.isObject3D!==!0||ax)return null;const s=os._probes.get(t);if(s){for(const r of s)if(r.__didAwake||r.__internalAwake(),r.activeAndEnabled){if(n){if(r.gameObject===n)return r}else if(r.isInBox(e))return sl&&console.log("Found reflection probe",e.name,r.name),r}}return sl&&console.debug("Did not find reflection probe",e.name,i,e),null}_texture;set texture(e){this._texture!==e&&(this._texture=e,sl&&console.debug("[ReflectionProbe] Set reflection probe texture "+(e?.name||"(removed)")),e&&(e instanceof ab||e.mapping!==Nn&&(e.mapping=Nn),e.colorSpace=So,e.needsUpdate=!0))}get texture(){return this._texture}center;size;_boxHelper;isInBox(e){return this._boxHelper?.isInBox(e)}constructor(){super(),os._probes.has(this.context)||os._probes.set(this.context,[]),os._probes.get(this.context)?.push(this)}awake(){this._boxHelper=this.gameObject.addComponent(St),this._boxHelper.updateBox(!0),sl&&this._boxHelper.showHelper(5592320,!0),this._texture&&(this._texture.mapping=Nn,this._texture.colorSpace=So,this._texture.needsUpdate=!0)}start(){this._texture||console.warn(`[ReflectionProbe] Missing texture. Please assign a custom cubemap texture. To use reflection probes assign them to your renderer's "anchor" property.`)}onDestroy(){const e=os._probes.get(this.context);if(e){const t=e.indexOf(this);t>=0&&e.splice(t,1)}}static _rendererMaterialsCache=new Map;onSet(e){if(ax||!this.enabled||e.sharedMaterials?.length<=0||!this.texture)return;let t=os._rendererMaterialsCache.get(e);t||(t=[],os._rendererMaterialsCache.set(e,t));for(let i=0;i<e.sharedMaterials.length;i++){const n=e.sharedMaterials[i];if(!n||n.envMap===void 0||n instanceof xe)continue;let s=t[i];const r=n===s?.copy,a=!s||s.material.uuid!==n.uuid||s.copy.version!==n.version;if(!r&&a){if(sl){let h="";s?s.material!==n?h="reference changed; cached instance?: "+r:s.copy.version!==n.version&&(h="version changed"):h="not cached",console.warn("Cloning material",n.name,n.version,"Reason:",h,`
990
- `,n.uuid,`
991
- `,s?.copy.uuid,`
992
- `,e.name)}const c=n.clone();c.version=n.version,s?(s.copy=c,s.material=n):(s={material:n,copy:c},t.push(s)),c[Vf]=this,c[lx]=n,sl&&console.log("Set reflection",e.name,e.guid)}s&&s.copy&&(s.copy.onBeforeCompile=n.onBeforeCompile);const l=s?.copy;"envMap"in l&&(l.envMap=this.texture,l.needsUpdate=!0),e.sharedMaterials[i]=l}}onUnset(e){const t=os._rendererMaterialsCache.get(e);if(t)for(let i=0;i<t.length;i++){const n=t[i];e.sharedMaterials[i]=n.material}}};rx([u(b)],Wf.prototype,"center"),rx([u(b)],Wf.prototype,"size");let Xc=Wf;const $f=v("debugexr");class bT{get name(){return"EXT_texture_exr"}parser;constructor(e){this.parser=e,$f&&console.log(e)}loadTexture(e){const t=this.name,i=this.parser,n=i.json.textures[e];if($f&&console.log("EXT_texture_exr.loadTexture",e,n),!n.extensions||!n.extensions[t])return null;const s=n.extensions[t],r=new km(i.options.manager);return $f&&console.log("EXT_texture_exr.loadTexture",s),i.loadTextureImage(e,s.source,r)}}typeof window<"u"&&window.addEventListener("unhandledrejection",o=>{});const io=ft,Wu="$___Export_Components",_T="NEEDLE_components";class vT{[_r]}class wT{node;nodeIndex;nodeDef;constructor(e,t,i){this.node=e,this.nodeIndex=t,this.nodeDef=i}}class cx{get name(){return _T}exportContext;objectToNodeMap={};context;writer;registerExport(e){e.register(t=>{if("serializeUserData"in t){const i=t.serializeUserData.bind(t);this.writer=t,t.serializeUserData=(n,s)=>{try{this.serializeUserData(n,s)&&(t.extensionsUsed[this.name]=!0),i(n,s)}finally{this.afterSerializeUserData(n,s)}}}return this})}beforeParse(){this.exportContext={},this.objectToNodeMap={}}serializeUserData(e,t){const i=e.userData?.components;return!i||i.length<=0?!1:(delete e.userData.components,e[Wu]=i,!0)}afterSerializeUserData(e,t){if(e.type==="Scene"&&io&&console.log("DONE",JSON.stringify(t)),e[Wu]===void 0)return;const i=e[Wu];delete e[Wu],i!==null&&(e.userData.components=i)}writeNode(e,t){const i=this.writer.json.nodes.length;io&&console.log(e.name,i,e.uuid);const n=new wT(e,i,t);this.exportContext[i]=n,this.objectToNodeMap[e.uuid]=i}afterParse(e){io&&console.log("AFTER",e);for(const t in this.exportContext){const i=this.exportContext[t],n=i.node,s=i.nodeDef,r=i.nodeIndex,a=n.userData?.components;if(!a||a.length<=0)continue;const l=new vT;s.extensions=s.extensions||{},s.extensions[this.name]=l,this.context.object=n,this.context.nodeId=r,this.context.objectToNode=this.objectToNodeMap;const c=[];for(const h of a){this.context.target=h;const d=_n().writeBuiltinComponentData(h,this.context);d!==null&&c.push(d)}c.length>0&&(l[_r]=c,io&&console.log("DID WRITE",n,"nodeIndex",r,c))}}parser;nodeToObjectMap={};gltf=null;beforeRoot(){return io&&console.log("BEGIN LOAD"),this.nodeToObjectMap={},null}async afterRoot(e){this.gltf=e;const t=e.parser,i=t?.extensions;if(!i)return;const n=i[this.name];io&&console.log("After root",e,this.parser,i);const s=[];if(n===!0){const r=t.json.nodes;if(r){for(let a=0;a<r.length;a++){const l=await t.getDependency("node",a);this.nodeToObjectMap[a]=l}for(let a=0;a<r.length;a++){const l=r[a],c=a,h=l.extensions;if(!h)continue;const d=h[this.name];if(!d)continue;io&&console.log("NODE",l);const p=this.nodeToObjectMap[c];if(!p){console.error("Could not find object for node index: "+c,l,t);continue}au(p),s.push(this.createComponents(e,l,p,d))}}}await Promise.all(s);for(const r of t.associations.keys()){const a=t.associations.get(r);if(a?.materials!=null){const l="/materials/"+a.materials;Lk(r,l)}}}async createComponents(e,t,i,n){if(!n)return;const s=n[_r];if(s){const r=new Array;io&&console.log(i.name,s);for(const a in s){const l=s[a];if(io&&console.log("Serialized data",JSON.parse(JSON.stringify(l))),(l?.name==="MeshRenderer"||l?.name==="SkinnedMeshRenderer")&&!l.sharedMaterials){let c=!1;if("mesh"in t){const h=t.mesh;if(typeof h=="number"&&e.parser){const d=e.parser.json.meshes?.[h];d?.primitives&&(l.sharedMaterials=d.primitives.map(p=>"/materials/"+(p.material??0)),c=!0)}}!c&&(io||A())&&console.warn(`[NEEDLE_components] Component '${l.name}' on object '${i.name}' is not added to a mesh or failed to retrieve materials from glTF.`)}l&&this.parser&&r.push(Ng(this.parser,l).catch(c=>console.error(`Error while resolving references (see console for details)
993
- `,c,i,l))),i.userData=i.userData||{},i.userData[_r]=i.userData[_r]||[],i.userData[_r].push(l)}await Promise.all(r).catch(a=>{console.error("Error while loading components",a)})}}}const hx="NEEDLE_gameobject_data";class xT{get name(){return hx}parser;constructor(e){this.parser=e}afterRoot(e){const t=[];for(let i=0;i<this.parser.json.nodes?.length;i++){const n=this.parser.json.nodes[i];if(n&&n.extensions){const s=n.extensions[hx];if(s){const r=this.findAndApplyExtensionData(i,s);t.push(r)}}}return Promise.all(t).then(()=>null)}async findAndApplyExtensionData(e,t){const i=await this.parser.getDependency("node",e);i&&this.applyExtensionData(i,t)}applyExtensionData(e,t){t.layers===void 0&&(t.layers=0),e.userData.layer=t.layers,e.layers.disableAll(),e.layers.set(t.layers),e.userData.tag=t.tag??"none",e.hideFlags=0,e.userData.static=t.static??!1,e.visible=t.activeSelf??!0,e.guid=t.guid}}const dx="NEEDLE_lighting_settings",rl=v("debugenvlight");class ST{get name(){return dx}parser;sourceId;context;constructor(e,t,i){this.parser=e,this.sourceId=t,this.context=i}afterRoot(e){const t=this.parser.json.extensions;if(t){const i=t[dx];if(i){rl&&console.log('Loaded "'+this.name+'", src: "'+this.sourceId+'"',i);let n;if(e.scene.children.length===1){const s=e.scene.children[0];n=x.addComponent(s,$u,{},{callAwake:!1})}else{const s=new k;s.name="LightSettings "+this.sourceId,e.scene.add(s),n=x.addComponent(s,$u,{},{callAwake:!1})}n.sourceId=this.sourceId,n.ambientIntensity=i.ambientIntensity,n.ambientLight=new ne().fromArray(i.ambientLight),Array.isArray(i.ambientTrilight)&&(n.ambientTrilight=i.ambientTrilight.map(s=>new ne().fromArray(s))),n.ambientMode=i.ambientMode,n.environmentReflectionSource=i.environmentReflectionSource}}return null}}ue.registerCallback(de.ContextCreated,o=>{const e=o.context,t=x.findObjectOfType($u,e);t?.sourceId&&(t.enabled=!0)});class $u extends R{ambientMode=Ya.Skybox;ambientLight;ambientTrilight;ambientIntensity=1;environmentReflectionSource=fu.Skybox;_hasReflection=!1;_ambientLightObj;_hemisphereLightObj;awake(){if(this.sourceId){const t=this.environmentReflectionSource===fu.Skybox?qn.Skybox:qn.Reflection,i=this.context.lightmaps.tryGet(this.sourceId,t,0);this._hasReflection=i!=null,i&&this.context.sceneLighting.internalRegisterReflection(this.sourceId,i)}this.enabled=!1,this.context.sceneLighting.internalRegisterSceneLightSettings(this),rl&&window.addEventListener("keydown",t=>{if(!this.destroyed)switch(t.key){case"l":this.enabled=!this.enabled;break}});const e=this.gameObject.userData?.components;if(e){const t=e.indexOf(this);e.splice(t,1),e.push(this)}}onDestroy(){this.context.sceneLighting.internalUnregisterSceneLightSettings(this)}calculateIntensityFactor(e){const t=Math.max(e.r,e.g,e.b);return 2.2*L.lerp(0,1.33,t)}onEnable(){if(rl&&console.warn("\u{1F4A1}\u{1F7E1} >>> Enable lighting",this.sourceId,this.enabled,this),this.ambientMode==Ya.Flat){if(this.ambientLight&&!this._ambientLightObj){const e=this.calculateIntensityFactor(this.ambientLight);this._ambientLightObj=new lC(this.ambientLight,this.ambientIntensity*e),rl&&console.log("Created ambient light",this.sourceId,this._ambientLightObj,this.ambientIntensity,e)}this._ambientLightObj&&this.gameObject.add(this._ambientLightObj)}else if(this.ambientMode===Ya.Trilight){if(this.ambientTrilight){const e=this.ambientTrilight[0],t=this.ambientTrilight[this.ambientTrilight.length-1],i=this.calculateIntensityFactor(t);this._hemisphereLightObj=new cC(t,e,this.ambientIntensity*i),this.gameObject.add(this._hemisphereLightObj),rl&&console.log("Created hemisphere ambient light",this.sourceId,this._hemisphereLightObj,this.ambientIntensity,i)}}else this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent();this.sourceId&&(this.context.domElement.getAttribute("environment-image")||this.context.sceneLighting.internalEnableReflection(this.sourceId))}onDisable(){rl&&console.warn("\u{1F4A1}\u26AB <<< Disable lighting:",this.sourceId,this),this._ambientLightObj&&this._ambientLightObj.removeFromParent(),this._hemisphereLightObj&&this._hemisphereLightObj.removeFromParent(),this.sourceId&&this.context.sceneLighting.internalDisableReflection(this.sourceId)}}var ux=(o=>(o[o.INT=5124]="INT",o[o.FLOAT=5126]="FLOAT",o[o.FLOAT_VEC2=35664]="FLOAT_VEC2",o[o.FLOAT_VEC3=35665]="FLOAT_VEC3",o[o.FLOAT_VEC4=35666]="FLOAT_VEC4",o[o.INT_VEC2=35667]="INT_VEC2",o[o.INT_VEC3=35668]="INT_VEC3",o[o.INT_VEC4=35669]="INT_VEC4",o[o.BOOL=35670]="BOOL",o[o.BOOL_VEC2=35671]="BOOL_VEC2",o[o.BOOL_VEC3=35672]="BOOL_VEC3",o[o.BOOL_VEC4=35673]="BOOL_VEC4",o[o.FLOAT_MAT2=35674]="FLOAT_MAT2",o[o.FLOAT_MAT3=35675]="FLOAT_MAT3",o[o.FLOAT_MAT4=35676]="FLOAT_MAT4",o[o.SAMPLER_2D=35678]="SAMPLER_2D",o[o.SAMPLER_3D=35680]="SAMPLER_3D",o[o.SAMPLER_CUBE=35681]="SAMPLER_CUBE",o[o.UNKNOWN=0]="UNKNOWN",o))(ux||{});const no=v("debugcustomshader"),al="NEEDLE_techniques_webgl";class CT{objectToWorldMatrix=new K;worldToObjectMatrix=new K;objectToWorld=new Array;worldToObject=new Array;updateFrom(e){this.objectToWorldMatrix.copy(e.matrixWorld),gu(this.objectToWorldMatrix,this.objectToWorld),this.worldToObjectMatrix.copy(e.matrixWorld).invert(),gu(this.worldToObjectMatrix,this.worldToObject)}}class Re extends lb{identifier;onBeforeRenderSceneCallback=this.onBeforeRenderScene.bind(this);clone(){const e=super.clone();return px(e),e}constructor(e,...t){super(...t),this.identifier=e,no&&console.log(this),this.type="NEEDLE_CUSTOM_SHADER",this.uniforms[this._objToWorldName]||(this.uniforms[this._objToWorldName]={value:[]}),this.uniforms[this._worldToObjectName]||(this.uniforms[this._worldToObjectName]={value:[]}),this.uniforms[this._viewProjectionName]||(this.uniforms[this._viewProjectionName]={value:[]}),this.uniforms[this._sphericalHarmonicsName],(this.depthTextureUniform||this.opaqueTextureUniform)&&z.Current.pre_render_callbacks.push(this.onBeforeRenderSceneCallback)}dispose(){super.dispose();const e=z.Current.pre_render_callbacks.indexOf(this.onBeforeRenderSceneCallback);e>=0&&z.Current.pre_render_callbacks.splice(e,1)}_sphericalHarmonicsName="unity_SpecCube0";_objToWorldName="hlslcc_mtx4x4unity_ObjectToWorld";_worldToObjectName="hlslcc_mtx4x4unity_WorldToObject";static viewProjection=new K;static _viewProjectionValues=[];_viewProjectionName="hlslcc_mtx4x4unity_MatrixVP";static viewMatrix=new K;static _viewMatrixValues=[];_viewMatrixName="hlslcc_mtx4x4unity_MatrixV";static _worldSpaceCameraPosName="_WorldSpaceCameraPos";static _worldSpaceCameraPos=new b;static _mainLightColor=new pe;static _mainLightPosition=new b;static _lightData=new pe;_rendererData=new CT;get depthTextureUniform(){if(this.uniforms)return this.uniforms._CameraDepthTexture}get opaqueTextureUniform(){if(this.uniforms)return this.uniforms._CameraOpaqueTexture}onBeforeRenderScene(){this.opaqueTextureUniform&&z.Current.setRequireColor(!0),this.depthTextureUniform&&z.Current.setRequireDepth(!0)}onBeforeRender(e,t,i,n,s,r){n.attributes.tangent||n.computeTangents(),this.onUpdateUniforms(i,s)}onUpdateUniforms(e,t){const i=z.Current;if(e&&(Re.viewProjection&&this.uniforms[this._viewProjectionName]&&(Re.viewProjection.copy(e.projectionMatrix).multiply(e.matrixWorldInverse),gu(Re.viewProjection,Re._viewProjectionValues)),Re.viewMatrix&&this.uniforms[this._viewMatrixName]&&(Re.viewMatrix.copy(e.matrixWorldInverse),gu(Re.viewMatrix,Re._viewMatrixValues)),this.uniforms[Re._worldSpaceCameraPosName]&&Re._worldSpaceCameraPos.setFromMatrixPosition(e.matrixWorld)),this.uniforms._TimeParameters&&(this.uniforms._TimeParameters.value=i.sceneLighting.timeVec4),this.uniforms._Time){const a=this.uniforms._Time.value;a.x=i.sceneLighting.timeVec4.x/20,a.y=i.sceneLighting.timeVec4.x,a.z=i.sceneLighting.timeVec4.x*2,a.w=i.sceneLighting.timeVec4.x*3}if(this.uniforms._SinTime){const a=this.uniforms._SinTime.value;a.x=Math.sin(i.sceneLighting.timeVec4.x/8),a.y=Math.sin(i.sceneLighting.timeVec4.x/4),a.z=Math.sin(i.sceneLighting.timeVec4.x/2),a.w=Math.sin(i.sceneLighting.timeVec4.x)}if(this.uniforms._CosTime){const a=this.uniforms._CosTime.value;a.x=Math.cos(i.sceneLighting.timeVec4.x/8),a.y=Math.cos(i.sceneLighting.timeVec4.x/4),a.z=Math.cos(i.sceneLighting.timeVec4.x/2),a.w=Math.cos(i.sceneLighting.timeVec4.x)}if(this.uniforms.unity_DeltaTime){const a=this.uniforms.unity_DeltaTime.value;a.x=i.time.deltaTime,a.y=1/i.time.deltaTime,a.z=i.time.smoothedDeltaTime,a.w=1/i.time.smoothedDeltaTime}const n=i.mainLight;if(n){const a=J(n.gameObject,Re._mainLightPosition);this.uniforms._MainLightPosition={value:a.normalize()},Re._mainLightColor.set(n.color.r,n.color.g,n.color.b,0),this.uniforms._MainLightColor={value:Re._mainLightColor};const l=n.intensity;Re._lightData.z=l,this.uniforms.unity_LightData={value:Re._lightData}}if(e&&(Re.viewProjection&&this.uniforms[this._viewProjectionName]&&(this.uniforms[this._viewProjectionName].value=Re._viewProjectionValues),Re.viewMatrix&&this.uniforms[this._viewMatrixName]&&(this.uniforms[this._viewMatrixName].value=Re._viewMatrixValues),this.uniforms[Re._worldSpaceCameraPosName]&&(this.uniforms[Re._worldSpaceCameraPosName]={value:Re._worldSpaceCameraPos}),i.mainCameraComponent)){if(this.uniforms._ProjectionParams){const a=this.uniforms._ProjectionParams.value;a.x=1,a.y=i.mainCameraComponent.nearClipPlane,a.z=i.mainCameraComponent.farClipPlane,a.w=1/a.z,this.uniforms._ProjectionParams.value=a}if(this.uniforms._ZBufferParams){const a=this.uniforms._ZBufferParams.value,l=i.mainCameraComponent;a.x=1-l.farClipPlane/l.nearClipPlane,a.y=l.farClipPlane/l.nearClipPlane,a.z=a.x/l.farClipPlane,a.w=a.y/l.farClipPlane,this.uniforms._ZBufferParams.value=a}if(this.uniforms._ScreenParams){const a=this.uniforms._ScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScreenParams.value=a}if(this.uniforms._ScaledScreenParams){const a=this.uniforms._ScaledScreenParams.value;a.x=i.domWidth,a.y=i.domHeight,a.z=1+1/a.x,a.w=1+1/a.y,this.uniforms._ScaledScreenParams.value=a}}const s=this.depthTextureUniform;s&&(s.value=i.depthTexture);const r=this.opaqueTextureUniform;if(r&&(r.value=i.opaqueColorTexture),t){const a=this._rendererData;a.updateFrom(t),this.uniforms[this._worldToObjectName].value=a.worldToObject,this.uniforms[this._objToWorldName].value=a.objectToWorld}this.uniformsNeedUpdate=!0}}class PT{get name(){return al}parser;identifier;constructor(e,t){this.parser=e,this.identifier=t}loadMaterial(e){const t=this.parser.json.materials[e];if(!t)return no&&console.log(e,this.parser.json.materials),null;if(!t.extensions||!t.extensions[al])return no&&console.log(`Material ${e} does not use NEEDLE_techniques_webgl`),null;no&&console.log(`Material ${e} uses NEEDLE_techniques_webgl`,t);const i=t.extensions[al].technique;if(i<0)return console.debug(`Material ${e} does not have a valid technique index`),null;const n=this.parser.json.extensions[al];if(!n)return no?console.error("Missing shader data",this.parser.json.extensions):console.debug("Missing custom shader data in parser.json.extensions"),null;no&&console.log(n);const s=n.techniques[i];return s?new Promise(async(r,a)=>{const l=await mM(n,s.program),c=l?.fragmentShader,h=l?.vertexShader;if(!c||!h)return a();no&&console.log("loadMaterial",t,l);const d={},p=s.uniforms;(h.includes("_Time")||c.includes("_Time"))&&(d._Time={value:new pe(0,0,0,0)}),(h.includes("_SinTime")||c.includes("_SinTime"))&&(d._SinTime={value:new pe(0,0,0,0)}),(h.includes("_CosTime")||c.includes("_CosTime"))&&(d._CosTime={value:new pe(0,0,0,0)}),(h.includes("unity_DeltaTime")||c.includes("unity_DeltaTime"))&&(d.unity_DeltaTime={value:new pe(0,0,0,0)});for(const g in p){const y=g;switch(y){case"_TimeParameters":const _=new pe;d[y]={value:_};break;case"hlslcc_mtx4x4unity_MatrixV":case"hlslcc_mtx4x4unity_MatrixVP":d[y]={value:[]};break;case"_MainLightPosition":case"_MainLightColor":case"_WorldSpaceCameraPos":d[y]={value:[0,0,0,1]};break;case"unity_OrthoParams":break;case"unity_SpecCube0":d[y]={value:null};break;default:case"_ScreenParams":case"_ZBufferParams":case"_ProjectionParams":d[y]={value:[0,0,0,0]};break;case"_CameraOpaqueTexture":case"_CameraDepthTexture":d[y]={value:null};break}}let m=!1;if(t.extensions&&t.extensions[al]){const g=t.extensions[al];if(g.technique===i){no&&console.log(t.name,"Material Properties",g);for(const y in g.values){const _=g.values[y];if(typeof _=="string"){if(_.startsWith("/textures/")){const w=_.substring(10),P=Number.parseInt(w);if(P>=0){const M=await this.parser.getDependency("texture",P);M instanceof Le&&(M.colorSpace=So,M.needsUpdate=!0),d[y]={value:M};continue}}switch(y){case"alphaMode":_==="BLEND"&&(m=!0);continue}}if(Array.isArray(_)&&_.length===4){d[y]={value:new pe(_[0],_[1],_[2],_[3])};continue}d[y]={value:_}}}}const f=new Re(this.identifier,{name:t.name??"",uniforms:d,vertexShader:h,fragmentShader:c,lights:!1});switch(f.glslVersion=hC,f.vertexShader=f.vertexShader.replace("#version 300 es",""),f.fragmentShader=f.fragmentShader.replace("#version 300 es",""),d._Cull?.value){case 0:f.side=Ci;break;case 1:f.side=Pd;break;case 2:f.side=ps;break;default:f.side=ps;break}switch(d._ZTest?.value){case 3:f.depthTest=!0,f.depthFunc=yC;break;case 6:f.depthTest=!0,f.depthFunc=fC;break;case 2:f.depthTest=!0,f.depthFunc=gC;break;case 4:f.depthTest=!0,f.depthFunc=mC;break;case 5:f.depthTest=!0,f.depthFunc=pC;break;case 7:f.depthTest=!0,f.depthFunc=uC;break;case 8:f.depthTest=!1,f.depthFunc=dC;break}f.transparent=m,m&&(f.depthWrite=!1),uM(d),f.onUpdateUniforms();for(const g in p){const y=g,_=p[g].type;if(d[y]?.value===void 0)switch(_){case ux.SAMPLER_2D:d[y]={value:hM},console.warn("Missing/unassigned texture, fallback to white: "+y);break;default:y==="unity_OrthoParams"||console.warn("TODO: EXPECTED UNIFORM / fallback NOT SET: "+y,p[g]);break}}no&&console.log(f.uuid,d),px(f),r(f)}):null}}function px(o){if(o.uniforms){no&&console.log("Uniforms:",o.uniforms);for(const t in o.uniforms)switch(e(t,t),t){case"_Color":e("color",t);break}}function e(t,i){Object.getOwnPropertyDescriptor(o,t)||Object.defineProperty(o,t,{get:()=>o.uniforms[i].value,set:n=>{o.uniforms[i].value=n,o.needsUpdate=!0}})}}const OT=v("debugextensions");let Hu;const kT=import("./vendor-BKGa4GE0.min.js").then(o=>o.index$2).then(async o=>(Hu=o.GLTFAnimationPointerExtension,Hu)).catch(o=>{console.warn("Failed to import GLTFLoaderAnimationPointer. Please use @needle-tools/three-animationpointer for full KHR_animation support",o)}),$r=new Array;function MT(o){$r.includes(o)||$r.push(o)}function RT(o){const e=$r.indexOf(o);e>=0&&$r.splice(e,1)}function Hf(o){if(o instanceof Po){const e=new cx;return o.register(t=>(e.parser=t,e)),e}return null}class TT{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 Gu(o,e,t,i){const n=t.indexOf("?");n>=0&&(t=t.substring(0,n)),i||(i=t),(i.startsWith("blob:")||i.startsWith("data:"))&&console.debug("[GLTFLoader] Suspicious sourceId detected"),o.register(s=>new xT(s)),o.register(s=>new Dk(s)),o.register(s=>new rM(s,e.lightmaps,i)),o.register(s=>new ST(s,i,e)),o.register(s=>new PT(s,i)),o.register(s=>new rr(s,i)),o.register(s=>new Ve(s)),o.register(s=>new bT(s)),ev()&&o.register(s=>new Gl(s)),await kT.catch(s=>{}),o.register(s=>{if(Hu){const r=new Hu(s);return r.setAnimationPointerResolver.bind(r)(new TT),r}else return(OT||A())&&console.error("Missing KHR_animation_pointer extension..."),{name:"KHR_animation_pointer_NOT_AVAILABLE"}});for(const s of $r)s.onImport&&s.onImport(o,t,e)}function Gf(o,e){for(const t of $r)t.onExport&&t.onExport(o,e)}function mx(o,e,t){for(const i of $r)i.onLoaded&&i.onLoaded(o,e,t)}const Ut=v("debuginstancing");class _a{static instance=new _a;static getStartInstanceCount=e=>4;objs=[];setup(e,t,i,n,s,r=0){e.applySettings(t);const a=this.tryCreateOrAddInstance(t,i,s);if(a){n===null&&(n=[]),n.push(a);const l=a.object.material;Array.isArray(l)?l.forEach(d=>Ve.assignTextureLOD(d,0)):Ve.assignTextureLOD(l,0);const c=a.object,h=c.geometry;Ve.assignMeshLOD(c,0).then(d=>{d&&h!=d&&a.setGeometry(d)})}else if(r<=0&&t.type!=="Mesh"){const l=r+1;for(const c of t.children)n=this.setup(e,c,i,n,s,l)}return r===0&&s.useMatrixWorldAutoUpdate&&n&&n.length>=0&&this.autoUpdateInstanceMatrix(t),n}tryCreateOrAddInstance(e,t,i){if(e.type==="Mesh"){const n=i.foundMeshes;if(i.foundMeshes+=1,!i.rend.enableInstancing)return null;if(i.rend.enableInstancing!==!0){if(n>=i.rend.enableInstancing.length)return Ut&&console.error("Something is wrong with instance setup",e,i.rend.enableInstancing,n),null;if(!i.rend.enableInstancing[n])return null}const s=e,r=s.material;for(const h of this.objs)if(!!h.canAdd(s.geometry,r))return h.addInstance(s);let a=_a.getStartInstanceCount(e);(!a||a<0)&&(a=4);let l=e.name;l?.length||(l=Bb());const c=new ET(l,s.geometry,r,a,t);return this.objs.push(c),c.addInstance(s)}return null}autoUpdateInstanceMatrix(e){const t=e.matrixWorld.multiplyMatrices.bind(e.matrixWorld),i=e.matrixWorld.clone(),n=(s,r)=>{const a=t(s,r);return(e[bc]||i.equals(a)===!1)&&(i.copy(a),e[bc]=!0),a};e.matrixWorld.multiplyMatrices=n}}class Sa{static all=[];get name(){return this.object.name}get isActive(){return this.__instanceIndex>=0}get vertexCount(){return this.object.geometry.attributes.position.count}get maxVertexCount(){return Math.max(this.meshInformation.vertexCount,this.vertexCount)}get reservedVertexCount(){return this.__reservedVertexRange}get indexCount(){return this.object.geometry.index?this.object.geometry.index.count:0}get maxIndexCount(){return Math.max(this.meshInformation.indexCount,this.indexCount)}get reservedIndexCount(){return this.__reservedIndexRange}object;renderer;__instanceIndex=-1;__reservedVertexRange=0;__reservedIndexRange=0;__geometryIndex=-1;meshInformation;constructor(e,t){this.__instanceIndex=-1,this.object=e,this.renderer=t,e[rv]=t,this.meshInformation=Hr(e.geometry),Sa.all.push(this)}updateMeshInformation(){const e=Hr(this.object.geometry),t=this.meshInformation.vertexCount,i=this.meshInformation.indexCount;return Object.assign(this.meshInformation,e),t!==this.meshInformation.vertexCount||i!==this.meshInformation.indexCount}updateInstanceMatrix(e=!1,t=!0){this.__instanceIndex<0||(t&&this.object.updateWorldMatrix(!0,e),this.renderer.updateInstance(this.object.matrixWorld,this.__instanceIndex))}setMatrix(e){this.__instanceIndex<0||this.renderer.updateInstance(e,this.__instanceIndex)}setGeometry(e){if(this.__geometryIndex<0)return!1;const t=this;if(this.vertexCount>this.__reservedVertexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);if(this.indexCount>this.__reservedIndexRange)return i(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);return this.renderer.updateGeometry(e,this.__geometryIndex);function i(n){return t.updateMeshInformation()&&(t.renderer.remove(t,!0),t.renderer.add(t))?!0:((A()||Ut)&&console.error(n),!1)}}add(){this.__instanceIndex>=0||(this.renderer.add(this),x.markAsInstancedRendered(this.object,!0))}remove(e){if(!(this.__instanceIndex<0)&&(this.renderer.remove(this,e),x.markAsInstancedRendered(this.object,!1),e)){const t=Sa.all.indexOf(this);t>=0&&Sa.all.splice(t,1)}}}class ET{get batchedMesh(){return this._batchedMesh}get visible(){return this._batchedMesh.visible}set visible(e){this._batchedMesh.visible=e}get castShadow(){return this._batchedMesh.castShadow}set castShadow(e){this._batchedMesh.castShadow=e}set receiveShadow(e){this._batchedMesh.receiveShadow=e}allowResize=!0;name="";geometry;material;get count(){return this._currentInstanceCount}updateBounds(e=!0,t=!0){if(this._needUpdateBounds=!1,e&&this._batchedMesh.computeBoundingBox(),t&&this._batchedMesh.computeBoundingSphere(),Ut&&this._batchedMesh.boundingSphere){const i=this._batchedMesh.boundingSphere;B.DrawWireSphere(i.center,i.radius,65280)}}_context;_batchedMesh;_handles=[];_geometryIds=new WeakMap;_maxInstanceCount;_currentInstanceCount=0;_currentVertexCount=0;_currentIndexCount=0;_maxVertexCount;_maxIndexCount;static nullMatrix=new K;canAdd(e,t){return this._maxVertexCount>1e7||t!==this.material||!this.validateGeometry(e)?!1:!!(!this.mustGrow(e)||this.allowResize)}_needUpdateBounds=!1;_debugMaterial=null;getBatchedMeshName(){return this.name?`${this.name} (BatchedMesh)`:"BatchedMesh"}constructor(e,t,i,n,s){this.name=e,this.geometry=t,this.material=i,this._context=s,this._maxInstanceCount=Math.max(2,n),Ut&&(this._debugMaterial=gx());const r=this.tryEstimateVertexCountSize(this._maxInstanceCount,[t],n);this._maxVertexCount=r.vertexCount,this._maxIndexCount=r.indexCount,this._batchedMesh=new cb(this._maxInstanceCount,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material),this._batchedMesh.name=this.getBatchedMeshName(),this._batchedMesh[_c]=!0,this._batchedMesh.visible=!0,this._context.scene.add(this._batchedMesh),i instanceof lb&&(i.defines.USE_INSTANCING=!0,i.needsUpdate=!0),s.pre_render_callbacks.push(this.onBeforeRender),s.post_render_callbacks.push(this.onAfterRender),Ut&&console.log(`Instanced renderer (${this.name}) created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for "${e}"`)}dispose(){Ut&&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 Sa(e,this);e.castShadow===!0&&this._batchedMesh.castShadow===!1&&(this._batchedMesh.castShadow=!0),e.receiveShadow===!0&&this._batchedMesh.receiveShadow===!1&&(this._batchedMesh.receiveShadow=!0);try{this.add(t)}catch(i){if(console.error(`Failed adding mesh to instancing (object name: "${e.name}", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})
994
- `,i),A()){lc("Failed instancing mesh. See the browser console for details.");debugger}return null}return t}add(e){const t=e.object.geometry;if(!t||!t.attributes)return console.error("Cannot add object to instancing without geometry",e.name),!1;if(this._currentInstanceCount+1>this._maxInstanceCount||this.mustGrow(t))if(this.allowResize)this.grow(t);else return console.error("Cannot add instance, max count reached",this.name,this.count,this._maxInstanceCount),!1;return e.object.updateWorldMatrix(!0,!0),this.addGeometry(e),this._handles[e.__instanceIndex]=e,this._currentInstanceCount+=1,this.markNeedsUpdate(),this._currentInstanceCount>0&&(this._batchedMesh.visible=!0),!0}remove(e,t){e&&(e.__instanceIndex<0||this._handles[e.__instanceIndex]!=e||this._currentInstanceCount<=0||(this.removeGeometry(e,t),this._handles[e.__instanceIndex]=null,e.__instanceIndex=-1,this._currentInstanceCount>0&&(this._currentInstanceCount-=1),this._currentInstanceCount<=0&&(this._batchedMesh.visible=!1),this.markNeedsUpdate()))}updateInstance(e,t){this._batchedMesh.setMatrixAt(t,e),this.markNeedsUpdate()}updateGeometry(e,t){return this.validateGeometry(e)?(this.mustGrow()&&this.grow(e),Ut&&console.debug("[Instancing] UPDATE GEOMETRY at "+t,this._batchedMesh._geometryCount,e.name,Hr(e),e.attributes.position.count,e.index?e.index.count:0),this._batchedMesh.setGeometryAt(t,e),this._geometryIds.set(e,t),this.markNeedsUpdate(),!0):!1}onBeforeRender=()=>{this._batchedMesh.layers.enableAll(),this._needUpdateBounds&&this._batchedMesh[_c]===!0&&(Ut==="verbose"&&console.log("Update instancing bounds",this.name,this._batchedMesh.matrixWorldNeedsUpdate),this.updateBounds())};onAfterRender=()=>{this._batchedMesh.layers.disableAll()};validateGeometry(e){const t=this.geometry;for(const i in t.attributes)if(i!=="batchId"&&!e.hasAttribute(i))return A()&&console.warn(`BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`),!1;return!0}markNeedsUpdate(){Ut==="verbose"&&console.warn("Marking instanced mesh dirty",this.name),this._needUpdateBounds=!0}mustGrow(e){if(this.count>=this._maxInstanceCount)return!0;if(!e||!e.attributes||this._geometryIds.has(e))return!1;const t=Hr(e),i=t.vertexCount,n=t.indexCount;return this._currentVertexCount+i>this._maxVertexCount||this._currentIndexCount+n>this._maxIndexCount}_growId=0;grow(e){const t=++this._growId,i=Math.ceil(this._maxInstanceCount*2),n=this.tryEstimateVertexCountSize(i,[e]),s=Math.max(this._maxVertexCount,n.vertexCount),r=Math.max(this._maxIndexCount,n.indexCount);if(Ut){const c=Hr(e);console.warn(`[Instancing] Growing Buffer
995
- Mesh: "${this.name}${e.name?.length?"/"+e.name:""}" (${c.vertexCount.toLocaleString()} vertices, ${c.indexCount.toLocaleString()} indices)
996
- Max count ${this._maxInstanceCount.toLocaleString()} \u2192 ${i.toLocaleString()}
997
- Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${s.toLocaleString()}
998
- Max index count ${this._maxIndexCount.toLocaleString()} -> ${r.toLocaleString()}`),this._debugMaterial=gx()}else A()&&console.debug(`[Instancing] Growing Buffer
999
- Mesh: "${this.name}${e.name?.length?"/"+e.name:""}"
1000
- Max count ${this._maxInstanceCount} \u2192 ${i}
1001
- Max vertex count ${this._maxVertexCount.toLocaleString()} -> ${s.toLocaleString()}
1002
- Max index count ${this._maxIndexCount.toLocaleString()} -> ${r.toLocaleString()}`);this._maxVertexCount=s,this._maxIndexCount=r;const a=new cb(i,this._maxVertexCount,this._maxIndexCount,this._debugMaterial??this.material);a.name=this.getBatchedMeshName(),a.layers=this._batchedMesh.layers,a.castShadow=this._batchedMesh.castShadow,a.receiveShadow=this._batchedMesh.receiveShadow,a.visible=this._batchedMesh.visible,a[_c]=this._batchedMesh[_c],a.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,a.matrixWorldNeedsUpdate=this._batchedMesh.matrixWorldNeedsUpdate,a.matrixAutoUpdate=this._batchedMesh.matrixAutoUpdate,a.matrixWorld.copy(this._batchedMesh.matrixWorld),a.matrix.copy(this._batchedMesh.matrix),this._batchedMesh.dispose(),this._batchedMesh.removeFromParent(),this._geometryIds=new WeakMap,this._batchedMesh=a,this._maxInstanceCount=i;const l=[...this._handles];this._handles=[];for(const c of l){if(t!==this._growId){Ut&&console.warn("[Instancing] Aborting grow since another grow happened in the meantime");return}c&&c.__instanceIndex>=0&&(this.addGeometry(c),this._handles[c.__instanceIndex]=c)}this._context.scene.add(a)}tryEstimateVertexCountSize(e,t,i=1){const n=new Map;for(const h of this._handles)if(h&&h.__instanceIndex>=0&&h.object.geometry){if(n.has(h.object.geometry)){const d=n.get(h.object.geometry);d.count+=1}else{const d={count:1,...Hr(h.object.geometry)};n.set(h.object.geometry,d)}if(t&&t?.length>0){const d=t.indexOf(h.object.geometry);d!==-1&&t.splice(d,1)}}let s=0,r=0,a=0;for(const[h,d]of n)a+=1,s+=d.vertexCount,r+=d.indexCount;let l=Math.ceil(s/Math.max(1,a))*a,c=Math.ceil(r/Math.max(1,a))*a;if(t)for(const h of t){const d=Hr(h);d!=null&&(l+=d.vertexCount*i,c+=d.indexCount*i)}return Ut&&console.log(`[Instancing] Estimated size for new buffer ${this.name}
1003
- Geometries: ${a} (New: ${t?.length||0})
1004
- Instances: ${e}
1005
- Estimated Vertices: ${l.toLocaleString()}
1006
- Estimated Indices: ${c.toLocaleString()}`),{vertexCount:l,indexCount:c}}addGeometry(e){const t=e.object.geometry;if(!t)return;let i=this._geometryIds.get(t);i==null?(Ut&&console.warn(`[Instancing] > ADD NEW GEOMETRY "${e.name} (${t.name}; ${t.uuid})"
1007
- Current Instances: ${this._currentInstanceCount}
1008
- Max Vertices: ${e.maxVertexCount.toLocaleString()}
1009
- Max Indices: ${e.maxIndexCount.toLocaleString()}
1010
- Max Triangles: ${(e.maxIndexCount/3).toLocaleString()}`),i=this._batchedMesh.addGeometry(t,e.maxVertexCount,e.maxIndexCount),this._geometryIds.set(t,i),this._currentVertexCount+=e.maxVertexCount,this._currentIndexCount+=e.maxIndexCount):Ut==="verbose"&&console.log(`[Instancing] > ADD INSTANCE "${e.name}"
1011
- GEOMETRY_ID=${i}
1012
- ${this._currentInstanceCount} instances`);const n=this._batchedMesh.addInstance(i);e.__geometryIndex=i,e.__instanceIndex=n,e.__reservedVertexRange=e.maxVertexCount,e.__reservedIndexRange=e.maxIndexCount,this._batchedMesh.setMatrixAt(n,e.object.matrixWorld),Ut&&console.debug(`[Instancing] > ADDED INSTANCE "${e.name}"
1013
- GEOMETRY_ID=${i}
1014
- ${this._currentInstanceCount} instances
1015
- Index: ${e.__instanceIndex}
1016
- Vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()},
1017
- Indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()}`)}removeGeometry(e,t){if(e.__instanceIndex<0){console.warn("Cannot remove geometry, instance index is invalid",e.name);return}Ut&&console.debug(`[Instancing] < REMOVE INSTANCE "${e.name}" at [${e.__instanceIndex}]
1018
- GEOMETRY_ID=${e.__geometryIndex}
1019
- ${this._currentInstanceCount} instances
1020
- Index: ${e.__instanceIndex}`),this._batchedMesh.deleteInstance(e.__instanceIndex)}}function Hr(o){if(!o)return A()&&console.error("Cannot get mesh information from null geometry"),{vertexCount:0,indexCount:0};let e=o.attributes?.position?.count||0,t=o.index?o.index.count:0;const i=Ve.getMeshLODExtension(o);if(i){const n=i.lods[0];let s=n.vertexCount,r=n.indexCount;const a=Math.min(200,Math.ceil(s*.05));s+=a,r+=20,e=Math.max(e,s),t=Math.max(t,r)}return e=Math.ceil(e),t=Math.ceil(t),{vertexCount:e,indexCount:t}}function gx(){const o=new pt({color:new ne(Math.random(),Math.random(),Math.random())});return o.emissive=o.color,o.emissiveIntensity=.3,v("wireframe")&&(o.wireframe=!0),o}const ll=v("debuglightmaps");let qf=0;const Xf=Symbol("lightmap-material-version");class Qf{get lightmap(){return this.lightmapTexture}set lightmap(e){e!==this.lightmapTexture&&(this.lightmapTexture=e,this.applyLightmap(),this.lightmapTexture&&Ve.assignTextureLOD(this.lightmapTexture,0).then(t=>{t?.isTexture&&(this.lightmapTexture=t)}))}lightmapIndex=-1;lightmapScaleOffset=new pe(1,1,0,0);renderer;clonedMaterials=new Array;get context(){return this.renderer.context}get gameObject(){return this.renderer.gameObject}lightmapTexture=null;lightmapScaleOffsetUniform={value:new pe(1,1,0,0)};lightmapUniform={value:null};constructor(e){this.renderer=e}init(e,t,i){console.assert(this.gameObject!==void 0&&this.gameObject!==null,"Missing gameobject",this),this.lightmapIndex=e,!(this.lightmapIndex<0)&&(this.lightmapScaleOffset=t,this.lightmapTexture=i,Ve.assignTextureLOD(i,0).then(n=>{n?.isTexture&&(this.lightmapTexture=n)}),ll=="show"?(console.log("Lightmap:",this.gameObject.name,e,`
1021
- ScaleOffset:`,t,`
1022
- Texture:`,i),this.setLightmapDebugMaterial()):ll&&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"){ll&&console.warn("Can not add lightmap. Is this object missing a renderer?",this.gameObject.name);return}const e=this.gameObject;this.ensureLightmapUvs(e);for(let t=0;t<this.renderer.sharedMaterials.length;t++){const i=this.renderer.sharedMaterials[t];if(!i)continue;const n=this.ensureLightmapMaterial(i,t);i!==n&&(this.renderer.sharedMaterials[t]=n)}if(this.lightmapIndex>=0&&this.lightmapTexture){this.lightmapTexture.channel=1;for(const t of this.renderer.sharedMaterials)t&&this.assignLightmapTexture(t)}}ensureLightmapUvs(e){if(e instanceof G)e.geometry.getAttribute("uv1")||e.geometry.setAttribute("uv1",e.geometry.getAttribute("uv"));else if(e instanceof xo)for(const t of e.children)this.ensureLightmapUvs(t)}ensureLightmapMaterial(e,t){if(e.userData||(e.userData={}),this.clonedMaterials[t]!==e){ll&&(++qf,qf++<1e3?console.warn(`Cloning material for lightmap ${this.renderer.name}: '${e.name}'`):qf===1e3&&console.warn("Further material cloning for lightmaps suppressed to avoid flooding the console."));const i=e.clone();i.name?.includes("(lightmap)")||(i.name=e.name+" (lightmap)"),e=i,e.onBeforeCompile=this.onBeforeCompile,this.clonedMaterials[t]=e}return e}assignLightmapTexture(e){!e||e instanceof xm&&e.transmission>0||!(e.lightMap!==this.lightmapTexture||e[Xf]!==e.version)||(ll&&console.log(`Assigning lightmap texture ${this.renderer.name}: '${e.name}' (${e.version} ${e[Xf]})`),e.lightMap=this.lightmapTexture,e.needsUpdate=!0,e[Xf]=e.version)}onBeforeCompile=(e,t)=>{ll==="verbose"&&console.log(`Lightmaps, before compile
1023
- `,e),this.lightmapScaleOffsetUniform.value=this.lightmapScaleOffset,this.lightmapUniform.value=this.lightmapTexture,e.uniforms.lightmapScaleOffset=this.lightmapScaleOffsetUniform};setLightmapDebugMaterial(){this.gameObject.material=new zn({vertexShader:`
1024
- varying vec2 vUv1;
1025
- void main()
1026
- {
1027
- vUv1 = uv1;
1028
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1029
- }
1030
- `,fragmentShader:`
1031
- uniform sampler2D lightMap;
1032
- uniform float lightMapIntensity;
1033
- uniform vec4 lightmapScaleOffset;
1034
- varying vec2 vUv1;
1035
-
1036
- // took from threejs 05fc79cd52b79e8c3e8dec1e7dca72c5c39983a4
1037
- vec4 conv_sRGBToLinear( in vec4 value ) {
1038
- return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );
1039
- }
1040
-
1041
- void main() {
1042
- vec2 lUv = vUv1.xy * lightmapScaleOffset.xy + vec2(lightmapScaleOffset.z, (1. - (lightmapScaleOffset.y + lightmapScaleOffset.w)));
1043
-
1044
- vec4 lightMapTexel = texture2D( lightMap, lUv);
1045
- gl_FragColor = lightMapTexel;
1046
- gl_FragColor.a = 1.;
1047
- }
1048
- `,defines:{USE_LIGHTMAP:""}})}}var AT=Object.defineProperty,zo=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&AT(e,t,n),n};const cl=v("debugrenderer"),fx=v("debugskinnedmesh"),yx=v("noinstancing"),IT=v("wireframe");class bx{path=null;asset=null;default}class LT{_renderer;_targets=[];_indexMapMaxIndex;_indexMap;_changed=!1;get changed(){return this._changed}set changed(e){e===!0&&cl&&console.warn("SharedMaterials have changed: "+this._renderer.name),this._changed=e}is(e){return this._renderer===e}constructor(e,t){this._renderer=e;const i=this.setMaterial.bind(this),n=this.getMaterial.bind(this),s=e.gameObject;if(this._targets=[],s)switch(s.type){case"Group":this._targets=[...s.children];break;case"SkinnedMesh":case"Mesh":this._targets.push(s);break}let r=!1,a,l=0;for(let c=0;c<this._targets.length;c++){const h=this._targets[c];if(!h)continue;const d=h.material;if(d){d.shadowSide=d.side;for(let p=0;p<t.length;p++){const m=t[p];if(!m){r=!0;continue}if(d.name===m.name){a===void 0&&(a=new Map),a.set(p,c),l=Math.max(l,p);break}}}}if(r){this._indexMapMaxIndex=l,this._indexMap=a;const c=`Renderer ${e.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;console.warn(c),$i()&&ye("Found renderer with missing materials: please check the console for details.")}return new Proxy(this,{get(c,h){if(typeof h=="string"){const d=parseInt(h);if(!isNaN(d))return n(d)}return c[h]},set(c,h,d){return typeof h=="string"&&i(d,Number.parseInt(h)),Reflect.set(c,h,d)?(d instanceof ve&&(c.changed=!0),!0):!1}})}get length(){return this._indexMapMaxIndex!==void 0?this._indexMapMaxIndex+1:this._targets.length}*[Symbol.iterator](){for(let e=0;e<this.length;e++)yield this.getMaterial(e)}resolveIndex(e){const t=this._indexMap;return t&&t.has(e)?t.get(e):e}setMaterial(e,t){if(t=this.resolveIndex(t),t<0||t>=this._targets.length)return;const i=this._targets[t];!i||i.material===void 0||(i.material=e,this.changed=!0)}getMaterial(e){if(e=this.resolveIndex(e),e<0)return null;const t=this._targets;if(e>=t.length)return null;const i=t[e];return i?i.material:null}}const oo=class sm extends R{static setInstanced(e,t){const i=Cc(e,sm);return i.setInstancingEnabled(t),i}static isInstanced(e){const t=Mr(e,sm);return t?t.isInstancingActive:hn.isUsingInstancing(e)}static setVisible(e,t){Ao(e,t)}receiveShadows=!1;shadowCastingMode=0;lightmapIndex=-1;lightmapScaleOffset=new pe(1,1,0,0);enableInstancing=void 0;renderOrder=void 0;allowOcclusionWhenDynamic=!0;probeAnchor;reflectionProbeUsage=0;_lightmaps;get sharedMesh(){if(this.gameObject.type==="Mesh")return this.gameObject;if(this.gameObject.type==="SkinnesMesh")return this.gameObject;if(this.gameObject.type==="Group")return this.gameObject.children[0]}_sharedMeshes=[];get sharedMeshes(){if(this.destroyed||!this.gameObject)return this._sharedMeshes;if(this._sharedMeshes.length=0,this.gameObject.type==="Group")for(const e of this.gameObject.children)(e.type==="Mesh"||e.type==="SkinnedMesh")&&this._sharedMeshes.push(e);else(this.gameObject.type==="Mesh"||this.gameObject.type==="SkinnedMesh")&&this._sharedMeshes.push(this.gameObject);return this._sharedMeshes}get sharedMaterial(){return this.sharedMaterials?.[0]}set sharedMaterial(e){this.sharedMaterials[0]!==e&&(this.sharedMaterials[0]=e,this.applyLightmapping())}get material(){return this.sharedMaterials?.[0]}set material(e){this.sharedMaterial=e}_sharedMaterials;_originalMaterials;_probeAnchorLastFrame;set sharedMaterials(e){if(!this._originalMaterials)this._originalMaterials=e;else if(e){let t=!1;for(let i=0;i<this._sharedMaterials.length;i++){const n=i<e.length?e[i]:null;n&&n instanceof ve?this.sharedMaterials[i]=n:t||(t=!0,console.warn("Can not assign null as material: "+this.name,n))}}}get sharedMaterials(){if(this._originalMaterials===void 0)if(this.__didAwake)this._originalMaterials=[];else return null;return(!this._sharedMaterials||!this._sharedMaterials.is(this))&&(this._originalMaterials||(this._originalMaterials=[]),this._sharedMaterials=new LT(this,this._originalMaterials)),this._sharedMaterials}static get shouldSuppressInstancing(){return yx}_lightmapTextureOverride=void 0;get lightmap(){return this._lightmaps?.length?this._lightmaps[0].lightmap:null}set lightmap(e){if(this._lightmapTextureOverride=e,e===void 0&&(e=this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex)),this._lightmaps?.length)for(const t of this._lightmaps)t.lightmap=e}get hasLightmap(){return this.lightmap!=null}allowProgressiveLoading=!0;_firstFrame=-1;registering(){this.enabled||this.setVisibility(!1)}awake(){if(this._firstFrame=this.context.time.frame,cl&&console.log("Renderer ",this.name,this),this.clearInstancingState(),this.probeAnchor&&cl&&this.probeAnchor.add(new Si(.2)),this._reflectionProbe=null,this.isMultiMaterialObject(this.gameObject)){for(const e of this.gameObject.children)this.context.addBeforeRenderListener(e,this.onBeforeRenderThree),e.layers.mask=this.gameObject.layers.mask;if(this.renderOrder!==void 0){let e=0;for(let t=0;t<this.gameObject.children.length;t++){const i=this.gameObject.children[t];if(!(!this.isMeshOrSkinnedMesh(i)||x.getComponent(i,sm))){if(this.renderOrder.length<=e){console.warn("Incorrect renderOrder element count",this,this.renderOrder.length+" but expected "+this.gameObject.children.length,"Index: "+e,"ChildElement:",i);continue}i.renderOrder=this.renderOrder[e],e+=1}}}}else this.isMeshOrSkinnedMesh(this.gameObject)?(this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree),this.renderOrder!==void 0&&this.renderOrder.length>0&&(this.gameObject.renderOrder=this.renderOrder[0])):this.context.addBeforeRenderListener(this.gameObject,this.onBeforeRenderThree);if(this._lightmaps=void 0,this.applyLightmapping(),IT)for(let e=0;e<this.sharedMaterials.length;e++){const t=this.sharedMaterials[e];t&&(t.wireframe=!0)}}applyLightmapping(){if(this.lightmapIndex>=0&&!this._lightmaps){const e=this._lightmapTextureOverride!==void 0?this._lightmapTextureOverride:this.context.lightmaps.tryGetLightmap(this.sourceId,this.lightmapIndex);if(e){this._lightmaps||(this._lightmaps=[]);const t=new Qf(this);t.init(this.lightmapIndex,this.lightmapScaleOffset,e),this._lightmaps.push(t)}else cl&&console.warn(`[Renderer] No lightmaps found ${this.name} (${this.sourceId}, ${this.lightmapIndex})`)}}_isInstancingEnabled=!1;_handles=void 0;get isInstancingActive(){return this._handles!=null&&this._handles.length>0&&this._isInstancingEnabled}get instances(){if(!this._handles||this._handles.length<=0)return null;if(this._handlesTempArray.length=0,this._handles)for(const e of this._handles)this._handlesTempArray.push(e);return this._handlesTempArray}_handlesTempArray=[];setInstancingEnabled(e){if(this._isInstancingEnabled===e)return e&&(this._handles===void 0||this._handles!=null&&this._handles.length>0);if(this._isInstancingEnabled=e,e){if(this.enableInstancing===void 0&&(this.enableInstancing=!0),this._handles===void 0){if(this._handles=_a.instance.setup(this,this.gameObject,this.context,null,{rend:this,foundMeshes:0,useMatrixWorldAutoUpdate:this.useInstanceMatrixWorldAutoUpdate()}),this._handles)return x.markAsInstancedRendered(this.gameObject,!0),!0}else if(this._handles!==null){for(const t of this._handles)t.updateInstanceMatrix(!0),t.add();return x.markAsInstancedRendered(this.gameObject,!0),!0}}else{if(this._handles)for(const t of this._handles)t.remove(this.destroyed);return!0}return!1}clearInstancingState(){this._isInstancingEnabled=!1,this._handles=void 0}useInstanceMatrixWorldAutoUpdate(){return!0}start(){if(this.enableInstancing&&!yx&&(this.setInstancingEnabled(!0),hn.markDirty(this.gameObject)),this.gameObject.frustumCulled=this.allowOcclusionWhenDynamic,this.isMultiMaterialObject(this.gameObject))for(let e=0;e<this.gameObject.children.length;e++){const t=this.gameObject.children[e];t.frustumCulled=this.allowOcclusionWhenDynamic}}onEnable(){this.sharedMeshes,this.setVisibility(!0),this._isInstancingEnabled||this.enableInstancing==!0||Array.isArray(this.enableInstancing)&&this.enableInstancing.some(e=>e)?this.__internalDidAwakeAndStart&&this.setInstancingEnabled(!0):this.enabled&&this.applyStencil(),this.updateReflectionProbe()}onDisable(){this.setVisibility(!1),this._handles&&this._handles.length>0&&this.setInstancingEnabled(!1)}onDestroy(){if(this._handles=null,this.isMultiMaterialObject(this.gameObject))for(const e of this.gameObject.children)this.context.removeBeforeRenderListener(e,this.onBeforeRenderThree);else this.context.removeBeforeRenderListener(this.gameObject,this.onBeforeRenderThree)}onBeforeRender(){if(this.gameObject){if(this._probeAnchorLastFrame!==this.probeAnchor&&(this._reflectionProbe?.onUnset(this),this.updateReflectionProbe()),cl==this.name&&this.gameObject instanceof G){this.gameObject.geometry.computeBoundingSphere();const e=D(this.gameObject.geometry.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);B.DrawWireSphere(e,this.gameObject.geometry.boundingSphere.radius,56831)}if(this.isMultiMaterialObject(this.gameObject)&&this.gameObject.children?.length>0)for(const e of this.gameObject.children)this.applySettings(e);else this.applySettings(this.gameObject);if(this.sharedMaterials?.changed&&(this.sharedMaterials.changed=!1,this.applyLightmapping()),this._handles?.length&&this.gameObject[bc]===!0){this.gameObject[bc]=!1;for(let e=this._handles.length-1;e>=0;e--)this._handles[e].updateInstanceMatrix();this.gameObject.matrixWorldNeedsUpdate=!1}if(this._handles&&this._handles.length<=0&&x.markAsInstancedRendered(this.gameObject,!1),this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Ao(t.object,!1)}if(this.reflectionProbeUsage!==0&&this._reflectionProbe&&(this._lightmaps?.length||this._reflectionProbe.onSet(this)),this._sharedMaterials)for(const e of this._sharedMaterials)e&&"envMap"in e&&"envMapIntensity"in e&&!Xc.isUsingReflectionProbe(e)&&(e.envMap=this.context.scene.environment,e.envMapRotation=this.context.scene.environmentRotation);else cl&&console.warn("[Renderer] sharedMaterials not initialized yet: "+this.name)}}onBeforeRenderThree=(e,t,i,n,s,r)=>{if(s.envMapIntensity!==void 0){const a=this.hasLightmap?Math.PI:1,l=this.context.scene.environmentIntensity;s.envMapIntensity=Math.max(0,l*this.context.sceneLighting.environmentIntensity/a)}if(this._lightmaps)for(const a of this._lightmaps)a.updateLightmapUniforms(s),a.applyLightmap()};onAfterRender(){if(this._isInstancingEnabled&&this._handles)for(let e=0;e<this._handles.length;e++){const t=this._handles[e];Ao(t.object,!0)}this.reflectionProbeUsage!==0&&this._reflectionProbe&&this._reflectionProbe.onUnset(this),this.static&&this.gameObject.matrixAutoUpdate&&(this.gameObject.matrixAutoUpdate=!1)}applyStencil(){rr.applyStencil(this)}applySettings(e){e.receiveShadow=this.receiveShadows,this.shadowCastingMode==1?e.castShadow=!0:e.castShadow=!1}_reflectionProbe=null;updateReflectionProbe(){this._reflectionProbe=null,this.reflectionProbeUsage!==0&&(this.startCoroutine(this._updateReflectionProbe(),we.LateUpdate),this._probeAnchorLastFrame=this.probeAnchor)}*_updateReflectionProbe(){const e=this.probeAnchor||this.gameObject,t=!!this.probeAnchor;this._reflectionProbe=Xc.get(e,this.context,t,this.probeAnchor)}setVisibility(e){if(!this.isMultiMaterialObject(this.gameObject))Ao(this.gameObject,e);else for(const t of this.gameObject.children)this.isMeshOrSkinnedMesh(t)&&Ao(t,e)}isMultiMaterialObject(e){return e.type==="Group"}isMeshOrSkinnedMesh(e){return e.type==="Mesh"||e.type==="SkinnedMesh"}};zo([u()],oo.prototype,"receiveShadows"),zo([u()],oo.prototype,"shadowCastingMode"),zo([u()],oo.prototype,"lightmapIndex"),zo([u(pe)],oo.prototype,"lightmapScaleOffset"),zo([u()],oo.prototype,"enableInstancing"),zo([u()],oo.prototype,"renderOrder"),zo([u()],oo.prototype,"allowOcclusionWhenDynamic"),zo([u(k)],oo.prototype,"probeAnchor"),zo([u()],oo.prototype,"reflectionProbeUsage");let Kt=oo;class Qc extends Kt{}class Yf extends Qc{_needUpdateBoundingSphere=!1;awake(){super.awake(),fx&&console.log('SkinnedMeshRenderer for "'+this.name+'"',this),this.allowOcclusionWhenDynamic=!1;for(const e of this.sharedMeshes)e.parent?.updateWorldMatrix(!1,!0),this.markBoundsDirty()}onAfterRender(){if(super.onAfterRender(),this._needUpdateBoundingSphere){for(const e of this.sharedMeshes)if(e instanceof us){this._needUpdateBoundingSphere=!1;try{const t=e.geometry,i=mb(e);i&&(e.geometry=i),e.computeBoundingSphere(),e.geometry=t}catch(t){console.error(`Error updating bounding sphere for ${e.name}`,t)}}}if(fx){for(const e of this.sharedMeshes)if(e instanceof us&&e.boundingSphere){const t=D(e.boundingSphere.center).applyMatrix4(e.matrixWorld);B.DrawWireSphere(t,e.boundingSphere.radius,"red")}}}markBoundsDirty(){this._needUpdateBoundingSphere=!0}}var jT=Object.defineProperty,hl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jT(e,t,n),n};const pi=v("debugdroplistener");class DT extends CustomEvent{constructor(e){super("object-added",{detail:e})}}const BT="blob";class No extends R{dropArea;fitIntoVolume=!1;fitVolumeSize=new b(1,1,1);placeAtHitPosition=!0;useNetworking=!1;onDropped=new he;loadFromURL(e,t){return this.addFromUrl(e,{screenposition:new ee,point:t?.point,size:t?.size},!1)}forgetObjects(){this.removePreviouslyAddedObjects(!1)}awake(){for(const e of this.gameObject.children)this.dropArea&&e.contains(this.dropArea)||this._addedObjects.push(e)}onEnable(){this.context.renderer.domElement.addEventListener("dragover",this.onDrag),this.context.renderer.domElement.addEventListener("drop",this.onDrop),window.addEventListener("paste",this.handlePaste),this.context.connection.beginListen("droplistener",this.onNetworkEvent),A()&&this.dropArea&&(this.dropArea.getComponentInChildren(Kt)||console.warn("[DropListener] The assigned DropArea does not seem to have a renderer/mesh. Drag and Drop events will not be detected."))}onDisable(){this.context.renderer.domElement.removeEventListener("dragover",this.onDrag),this.context.renderer.domElement.removeEventListener("drop",this.onDrop),window.removeEventListener("paste",this.handlePaste),this.context.connection.stopListen("droplistener",this.onNetworkEvent)}onNetworkEvent=e=>{if(!this.useNetworking){pi&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(e.guid?.startsWith(this.guid)){const t=e.url;if(console.debug("[DropListener] Received networked event",e),t)if(Array.isArray(t))for(const i of t)this.addFromUrl(i,{screenposition:new ee,point:e.point,size:e.size},!0);else this.addFromUrl(t,{screenposition:new ee,point:e.point,size:e.size},!0)}};handlePaste=e=>{this.context.connection.allowEditing===!1||e.defaultPrevented||navigator.clipboard.readText().then(t=>{if(t&&(t.startsWith("http")||t.startsWith("https")||t.startsWith("blob"))){const i={screenposition:new ee(this.context.input.mousePosition.x,this.context.input.mousePosition.y)};this.testIfIsInDropArea(i)&&this.addFromUrl(t,i,!1)}}).catch(console.warn)};onDrag=e=>{pi&&console.debug("DropListener Drag",e,this.context.connection.allowEditing),this.context.connection.allowEditing!==!1&&e.preventDefault()};onDrop=async e=>{if(pi&&console.debug("DropListener Drop",e,this.context.connection.allowEditing),this.context.connection.allowEditing===!1||!e?.dataTransfer||e["droplistener:handled"])return;e.preventDefault();const t={screenposition:new ee(e.offsetX,e.offsetY)};if(this.dropArea&&this.testIfIsInDropArea(t)===!1)return;e["droplistener:handled"]=!0;const i=e.dataTransfer.items;if(!i)return;const n=[];for(const s in i){const r=i[s];if(r.kind==="file"){const a=r.getAsFile();if(!a)continue;n.push(a)}else r.kind==="string"&&r.type=="text/plain"&&r.getAsString(a=>{this.addFromUrl(a,t,!1)})}n.length>0&&await this.addFromFiles(n,t)};async addFromUrl(e,t,i){pi&&console.log("dropped url",e);try{if(e.startsWith("https://github.com/")){const r=e.split("/"),a=r[3],l=r[4],c=r[6],h=r.slice(7).join("/");e=`https://raw.githubusercontent.com/${a}/${l}/${c}/${h}`}else e.startsWith("https://polyhaven.com/a")&&(e=FT(e));if(!e)return null;const n=e.toLowerCase();if(n.endsWith(".hdr")||n.endsWith(".hdri")||n.endsWith(".exr")||n.endsWith(".png")||n.endsWith(".jpg")||n.endsWith(".jpeg"))return console.warn(`Fileformat is not supported: ${n}`),null;this.removePreviouslyAddedObjects();const s=await qu.loadFileFromURL(new URL(e),{guid:this.guid,context:this.context,parent:this.gameObject,point:t.point,size:t.size});if(s&&this._addedObjects.length<=0)return t.url=e,this.onObjectLoaded(s,t,i)}catch{console.warn("String is not a valid URL",e)}return null}_abort=null;async addFromFiles(e,t){if(pi&&console.log("Add files",e),!!Array.isArray(e)&&e.length){this.deleteDropEvent(),this.removePreviouslyAddedObjects(),ec(BT,null),this._abort?.abort("New files dropped"),this._abort=new AbortController;for(const i of e){if(!i)continue;if(i.type.startsWith("image/")){pi&&console.warn("Ignoring dropped image file",i.name,i.type);continue}else if(i.name.endsWith(".bin")){pi&&console.warn("Ignoring dropped binary file",i.name,i.type);continue}console.debug("Load file "+i.name+" + "+i.type);const n=await qu.loadFile(i,this.context,{guid:this.guid});if(n){this.dispatchEvent(new CustomEvent("file-dropped",{detail:i})),t.file=i;const s=this.onObjectLoaded(n,t,!1);s&&this.context.connection.isConnected&&this.useNetworking&&(console.debug("Uploading dropped file to blob storage"),Ar.upload(i,{abort:this._abort?.signal}).then(r=>{r?.download_url&&this._addedObjects.includes(s)&&this.sendDropEvent(r.download_url,s,n.contentMD5)}).catch(console.warn));break}}}}_addedObjects=new Array;_addedModels=new Array;removePreviouslyAddedObjects(e=!0){if(e)for(const t of this._addedObjects)t.parent===this.gameObject&&t.destroy();this._addedObjects.length=0,this._addedModels.length=0}onObjectLoaded(e,t,i){const{model:n,contentMD5:s}=e;if(pi&&console.log(`Dropped ${this.gameObject.name}`,n),!n?.scene)return console.warn("No object specified to add to scene",n),null;this.removePreviouslyAddedObjects();const r=n.scene;this.gameObject.attach(r),r.position.set(0,0,0),r.quaternion.identity(),this._addedObjects.push(r),this._addedModels.push(n);const a=new xi().setFromCenterAndSize(new b(0,this.fitVolumeSize.y*.5,0).add(this.gameObject.worldPosition),this.fitVolumeSize);if(pi&&B.DrawWireBox3(a,255,5),this.fitIntoVolume&&l_(r,a,{position:!this.placeAtHitPosition}),this.placeAtHitPosition&&t&&t.screenposition){r.visible=!1;const c=this.context.physics.raycast({screenPoint:this.context.input.convertScreenspaceToRaycastSpace(t.screenposition.clone())});if(r.visible=!0,c&&c.length>0)for(const h of c){const d=h.point.clone();pi&&console.log("Place object at hit",h),c_(r,d);break}}vs.autoplayAnimations(n);const l=new DT({sender:this,gltf:n,model:n,object:r,contentMD5:s,dropped:t.file||(t.url?new URL(t.url):void 0)});return this.dispatchEvent(l),this.onDropped?.invoke(l.detail),!i&&t.url?.startsWith("http")&&this.context.connection.isConnected&&r&&this.sendDropEvent(t.url,r,s),r}async sendDropEvent(e,t,i){if(!this.useNetworking){pi&&console.debug("[DropListener] Ignoring networked event because networking is disabled",e);return}if(this.context.connection.isConnected){console.debug('Sending drop event "'+t.name+'"',e);const n=Xt([t]),s={name:t.name,guid:this.guid,url:e,point:t.worldPosition.clone(),size:n.getSize(new b),contentMD5:i};this.context.connection.send("droplistener",s)}}deleteDropEvent(){this.context.connection.sendDeleteRemoteState(this.guid)}testIfIsInDropArea(e){const t=this.context.input.convertScreenspaceToRaycastSpace(e.screenposition.clone()),i=this.context.physics.raycast({screenPoint:t,recursive:!0,testObject:s=>!this._addedObjects.some(r=>r.contains(s))});if(!i.length)return A()&&console.log(`Dropped outside of drop area for DropListener "${this.name}".`),!1;const n=i[0];return!!(this.dropArea&&this.dropArea.contains(n.object))}}hl([u(k)],No.prototype,"dropArea"),hl([u()],No.prototype,"fitIntoVolume"),hl([u(b)],No.prototype,"fitVolumeSize"),hl([u()],No.prototype,"placeAtHitPosition"),hl([u()],No.prototype,"useNetworking"),hl([u(he)],No.prototype,"onDropped");function FT(o){if(!o.startsWith("https://polyhaven.com/"))return o;const e="https://dl.polyhaven.org/file/ph-assets/Models/gltf/4k/",t=new URL(o).pathname.split("/").pop(),i=`${e}${t}/${t}_4k.gltf`;return console.log("Resolved polyhaven asset url",o,"\u2192",i),i}var qu;(o=>{async function e(i,n,s){const r=s.guid,a=new Lt(r),l=new Blob([i],{type:i.type||nx(i.name)||void 0}),c=URL.createObjectURL(l),h=await _n().loadSync(n,c,i.name,a).catch(d=>(console.error(`Failed to load file "${i.name}" (${i.type}):`,d),null));return URL.revokeObjectURL(c),h?new Promise((d,p)=>{const m=new FileReader;m.readAsArrayBuffer(i),m.onloadend=async f=>{const g=m.result,y=Ar.hashMD5(g);return d({model:h,contentMD5:y})}}):(console.warn(`Failed to load "${i.name}" (${i.type})`),null)}o.loadFile=e;async function t(i,n){return new Promise(async(s,r)=>{const a=new Lt(n.guid),l=i.toString();pi&&B.DrawWireSphere(n.point,.1,16711680,3);const c=Es.addPreview({guid:n.guid,parent:n.parent,position:n?.point,size:n?.size}),h=await _n().loadSync(n.context,l,l,a,d=>{c.onProgress(d.loaded/d.total)}).catch(console.warn);if(h){const d=await fetch(l).then(m=>m.arrayBuffer()),p=Ar.hashMD5(d);pi?setTimeout(()=>Es.removePreview(n.guid),3e3):Es.removePreview(n.guid),s({model:h,contentMD5:p})}else pi?setTimeout(()=>Es.removePreview(n.guid),3e3):Es.removePreview(n.guid),console.warn("Unsupported file type: "+i.toString())})}o.loadFileFromURL=t})(qu||(qu={}));var UT=Object.defineProperty,Zf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&UT(e,t,n),n};const Xu=class gS extends R{parent=null;object=null;limitCount=60;_currentCount=0;_startPosition=null;_startQuaternion=null;start(){if(this._currentCount=0,this._startPosition=null,this._startQuaternion=null,this.object||(this.object=this.gameObject),this.object){if(this.object===this.gameObject){const t=new Lt(this.guid);this.object=x.instantiate(this.object,{idProvider:t,keepWorldPosition:!1}),x.getComponent(this.object,gS)?.destroy();let i=this.object.getComponentInChildren(Wr);i||(i=this.object.addComponent(Wr,{dragMode:Bf.SnapToSurfaces}),i.guid=t.generateUUID());let n=x.getComponent(i.gameObject,Pn);n||(n=i.gameObject.addComponent(Pn),n.guid=t.generateUUID())}this.object.visible=!1;const e=this.gameObject.getComponent(Wr);e&&(e.enabled=!1),this._startPosition=this.object.position?.clone()??new b(0,0,0),this._startQuaternion=this.object.quaternion?.clone()??new U(0,0,0,1)}this.gameObject.getComponentInParent(Ei)||this.gameObject.addComponent(Ei)}onEnable(){this.startCoroutine(this.cloneLimitIntervalFn())}_forwardPointerEvents=new Map;onPointerEnter(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.setCursor("pointer")}onPointerExit(e){e.used||this.object&&this.context.connection.allowEditing&&e.button===0&&this.context.input.unsetCursor("pointer")}onPointerDown(e){if(e.used||!this.object||!this.context.connection.allowEditing||e.button!==0)return;const t=this.handleDuplication();if(t){const i=x.getComponent(t,Wr);i?(i.onPointerDown(e),this._forwardPointerEvents.set(e.event.space,i)):A()&&console.warn(`Duplicated object (${t.name}) does not have DragControls`)}else this._currentCount>=this.limitCount?console.warn(`[Duplicatable] Limit of ${this.limitCount} objects created within a few seconds reached. Please wait a moment before creating more objects.`):console.warn("[Duplicatable] Could not duplicate object.")}onPointerUp(e){if(e.used)return;const t=this._forwardPointerEvents.get(e.event.space);t&&(t.onPointerUp(e),this._forwardPointerEvents.delete(e.event.space))}*cloneLimitIntervalFn(){for(;this.activeAndEnabled&&!this.destroyed;)this._currentCount>0?this._currentCount-=1:this._currentCount<0&&(this._currentCount=0),yield Kg(1)}handleDuplication(){if(!this.object||this.limitCount>0&&this._currentCount>=this.limitCount||this.object===this.gameObject)return null;if(x.isDestroyed(this.object))return this.object=null,null;this.object.visible=!0,this._startPosition&&this.object.position.copy(this._startPosition),this._startQuaternion&&this.object.quaternion.copy(this._startQuaternion);const e=new Bn;this.parent||(this.parent=this.gameObject.parent),this.parent&&(e.parent=this.parent.guid??this.parent.userData?.guid,e.keepWorldPosition=!0),e.position=this.worldPosition,e.rotation=this.worldQuaternion,e.context=this.context,this._currentCount+=1;const t=x.instantiateSynced(this.object,e);return console.assert(t!==this.object,"Duplicated object is original"),this.object.visible=!1,this._startPosition&&this.object.position.clone().copy(this._startPosition),this._startQuaternion&&this.object.quaternion.clone().copy(this._startQuaternion),t}};Zf([u(k)],Xu.prototype,"parent"),Zf([u(k)],Xu.prototype,"object"),Zf([u()],Xu.prototype,"limitCount");let Kf=Xu;var Vo=(o=>(o[o.PointerEnter=0]="PointerEnter",o[o.PointerExit=1]="PointerExit",o[o.PointerDown=2]="PointerDown",o[o.PointerUp=3]="PointerUp",o[o.PointerClick=4]="PointerClick",o[o.Drag=5]="Drag",o[o.Drop=6]="Drop",o[o.Scroll=7]="Scroll",o[o.UpdateSelected=8]="UpdateSelected",o[o.Select=9]="Select",o[o.Deselect=10]="Deselect",o[o.Move=11]="Move",o[o.InitializePotentialDrag=12]="InitializePotentialDrag",o[o.BeginDrag=13]="BeginDrag",o[o.EndDrag=14]="EndDrag",o[o.Submit=15]="Submit",o[o.Cancel=16]="Cancel",o))(Vo||{}),zT=Object.defineProperty,Jf=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&zT(e,t,n),n};class ey{eventID;callback=new he}Jf([u()],ey.prototype,"eventID"),Jf([u(he)],ey.prototype,"callback");class Qu extends R{triggers=[];invoke(e){if(this.triggers)for(const t of this.triggers)t.eventID===e&&t.callback?.invoke()}hasTrigger(e){return this.triggers?.some(t=>t.eventID===e)??!1}shouldChangeCursor(){return this.hasTrigger(Vo.PointerClick)||this.hasTrigger(Vo.PointerDown)||this.hasTrigger(Vo.PointerUp)}onPointerClick(e){this.invoke(Vo.PointerClick)}onPointerEnter(e){this.shouldChangeCursor()&&this.context.input.setCursor("pointer"),this.invoke(Vo.PointerEnter)}onPointerExit(e){this.shouldChangeCursor()&&this.context.input.unsetCursor("pointer"),this.invoke(Vo.PointerExit)}onPointerDown(e){this.invoke(Vo.PointerDown)}onPointerUp(e){this.invoke(Vo.PointerUp)}}Jf([u(ey)],Qu.prototype,"triggers");class _x{writer;constructor(e){this.writer=e}writeNode(e){}}class NT extends _x{beforeWriteNode(e,t){B.isGizmo(e)&&(t.keep=!1)}}class vx extends _x{beforeWriteTexture(e,t){e.isRenderTargetTexture&&(t.newTexture=ef(new oe(1,1,1,0)))}}function ty(o){const e=Bu.DontExport;return!(o.hideFlags&e)}class wx{constructor(e){this.writer=e,this.name="EXT_mesh_gpu_instancing"}writeNode(e,t){if(e.constructor.name!=="InstancedMesh")return;const i=this.writer,n=i.extensionsUsed,s={};t.extensions=t.extensions||{},t.extensions[this.name]=s;let r=new K;const a=new Array,l=new Array,c=new Array;for(let m=0;m<e.count;m++){e.getMatrixAt(m,r);let f=new b,g=new U,y=new b;r.decompose(f,g,y),a.push(f.x,f.y,f.z),l.push(g.x,g.y,g.z,g.w),c.push(y.x,y.y,y.z)}const h=new Float32Array(a),d=new Float32Array(l),p=new Float32Array(c);s.attributes={TRANSLATION:i.processAccessor(new mt(h,3)),ROTATION:i.processAccessor(new mt(d,4)),SCALE:i.processAccessor(new mt(p,3))},n[this.name]=!0}}var VT=Object.defineProperty,xx=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&VT(e,t,n),n};const Yu=v("debuggltfexport");class iy extends St{sceneRoot}const ny=class Vl extends R{binary=!0;objects=[];ext;async exportNow(e,t){Yu&&console.log("Exporting objects as glTF",this.objects),e||(e="scene"),(!this.objects||this.objects.length<=0)&&(this.objects=[this.context.scene]);const i={binary:this.binary,pivot:Vl.calculateCenter(this.objects),...t},n=await this.export(this.objects,i).catch(s=>(console.error(s),!1));return n===!1?!1:(this.binary?e.endsWith(".glb")||(e+=".glb"):e.endsWith(".gltf")||(e+=".gltf"),this.binary?Vl.saveArrayBuffer(n,e):Vl.saveJson(n,e),!0)}async export(e,t){if(!e||e.length<=0){console.warn("No objects set to export");return}const i=new _b;i.register(c=>new wx(c)),i.register(c=>new vx(c)),Gf(i,this.context),Vl.filterTopmostParent(e);const n={trs:!1,onlyVisible:!0,truncateDrawRange:!1,binary:!0,maxTextureSize:1/0,embedImages:!0,includeCustomExtensions:!0,animations:t?.animations||Vl.collectAnimations(e),...t},s=new Array,r=new k;t?.pivot&&r.position.sub(t.pivot),Yu&&console.log("EXPORT",e),e.forEach(c=>{c&&ty(c)&&(r.children.push(c),c.matrixAutoUpdate=!1,c.matrix.copy(c.matrixWorld),x.getComponentsInChildren(c,Kt).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}),c.traverse(h=>{if(!ty(h)){const d=h.parent;h.removeFromParent(),s.push(()=>{d&&d.add(h)})}}))});const a=new $g(r);return t?.needleComponents&&(this.ext=new cx),this.ext&&(this.ext.registerExport(i),this.ext.context=a),new Promise((c,h)=>{Yu&&console.log("Starting glTF export.");try{i?.parse(r,d=>{l(),c(d)},d=>{l(),h(d)},n)}catch(d){console.error(d),h(d)}finally{s.forEach(d=>d()),Yu&&console.log("Finished glTF export.")}});function l(){e.forEach(c=>{c&&(c.matrixAutoUpdate=!0,x.getComponentsInChildren(c,Kt).forEach(h=>{x.isActiveInHierarchy(h.gameObject)&&h.setInstancingEnabled(!1)}))})}}static saveArrayBuffer(e,t){this.save(new Blob([e],{type:"application/octet-stream"}),t)}static saveJson(e,t){this.save("data: text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(e)),t)}static save(e,t){const i=document.createElement("a");i.style.display="none",document.body.appendChild(i),typeof e=="string"?i.href=e:i.href=URL.createObjectURL(e),i.download=t,i.click(),i.remove()}static collectAnimations(e,t){t=t||[];for(const i of e)i&&i.traverseVisible(n=>{n.animations&&n.animations.length>0&&t.push(...n.animations)});return t}static calculateCenter(e,t){const i=t||new b;return i.set(0,0,0),e.forEach(n=>{i.add(J(n))}),i.divideScalar(e.length),i}static filterTopmostParent(e){if(!(e.length<=0))for(let t=0;t<e.length;t++){let i=e[t];if(!i){e.splice(t,1),t--;continue}for(;i.parent;){if(e.includes(i.parent)){e.splice(t,1),t--;break}i=i.parent}}}};xx([u()],ny.prototype,"binary"),xx([u(k)],ny.prototype,"objects");let oy=ny;typeof globalThis!==void 0&&!("OffscreenCanvas"in globalThis)&&(globalThis.OffscreenCanvas=class{canvas;constructor(o,e){return this.canvas=document.createElement("canvas"),this.canvas.width=o,this.canvas.height=e,this.canvas.convertToBlob=(t,i)=>new Promise(n=>{this.canvas.toBlob(n,t,i)}),this.canvas}});const WT=v("debugprogress");function Sx(o){o=o||new Date;const e=o.getMonth()+1,t=o.getDate(),i=o.getHours(),n=o.getMinutes(),s=o.getSeconds(),r=(e<10?"0":"")+e,a=(t<10?"0":"")+t,l=(i<10?"0":"")+i,c=(n<10?"0":"")+n,h=(s<10?"0":"")+s;return o.getFullYear()+r+a+"-"+l+c+h}class ae{static start(e,t){typeof t=="string"&&(t={parentScope:t});const i=new $T(e,t);Yc.set(e,i)}static report(e,t){const i=Yc.get(e);if(!i){console.warn("Reporting progress for non-existing scope",e);return}typeof t=="string"&&(t={message:t,autoStep:!0}),i.report(t)}static end(e){const t=Yc.get(e);t&&(t.end(),Yc.delete(e))}}const Yc=new Map;class $T{scopeLabel;parentScope;childScopes=[];parentDepth=0;lastStep=0;lastAutoStepWeight=1;lastTotalSteps=0;onProgress;showLogs=!1;selfProgress=0;totalProgress=0;selfReports=0;totalReports=0;constructor(e,t){this.parentScope=t?.parentScope?Yc.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??!!WT,this.showLogs&&console.time(this.scopeLabel),this.onProgress=t?.onProgress}report(e,t=!1){if(e){if(e.totalSteps!==void 0&&(this.lastTotalSteps=e.totalSteps),e.currentStep!==void 0&&(this.lastStep=e.currentStep),e.autoStep!==void 0){if(e.currentStep===void 0){this.lastStep===void 0&&(this.lastStep=0);const n=typeof e.autoStep=="number"?e.autoStep:1;this.lastStep+=this.lastAutoStepWeight,this.lastAutoStepWeight=n,e.currentStep=this.lastStep}e.totalSteps=this.lastTotalSteps}e.progress!==void 0?this.selfProgress=e.progress:e.currentStep!==void 0&&e.totalSteps!==void 0&&(this.selfProgress=e.currentStep/e.totalSteps)}if(this.childScopes.length>0){let n=0,s=0;for(const a of this.childScopes)n+=a.selfProgress,s+=1;s>0&&(n/=s);const r=this.lastAutoStepWeight/(this.lastTotalSteps??1);this.totalProgress=this.selfProgress+n*r}else this.totalProgress=this.selfProgress;this.selfProgress=Math.min(1,this.selfProgress),this.totalProgress=Math.min(1,this.totalProgress);let i=(this.totalProgress*100).toFixed(3)+"%";this.childScopes.length>0&&(i+=" ("+(this.selfProgress*100).toFixed(3)+"% self)"),e?.message&&(i=e.message+" \u2013 "+i),this.lastStep!==void 0&&this.lastTotalSteps!==void 0&&(i="Step "+(this.lastStep+(this.lastAutoStepWeight!=1?"\u2013"+(this.lastStep+this.lastAutoStepWeight):"")+"/"+this.lastTotalSteps)+" "+i),t?this.totalReports++:(this.selfReports++,this.totalReports++),this.showLogs&&console.timeLog(this.scopeLabel,i),this.onProgress&&this.onProgress(this.totalProgress),this.parentScope&&this.parentScope.report(void 0,!0)}end(){this.report({progress:1,autoStep:!0},!0),this.showLogs&&(console.timeLog(this.scopeLabel,"Total reports: "+this.totalReports,"Self reports: "+this.selfReports),console.timeEnd(this.scopeLabel));let e=!1;for(const t of this.childScopes)if(!(t.selfProgress>=1)){e=!0;break}e&&console.warn("Progress end with child scopes that are still running",this),this.onProgress=void 0}}const De="</StageRoot/Materials";function HT(o,e,t){const i=new Map,n=g=>{const y=g.type___needle,_=i.get(y)||new Map;if(i.set(y,_),!_.has(g)){const w=`${y}${_.size?`_${_.size}`:""}`;_.set(g,w)}return _.get(g)},s=o.colorNode?Zu(o.colorNode):[],r=o.colorNode?`color3f inputs:diffuseColor.connect = ${De}/${e}/${n(s.values().next().value)}.outputs:out>`:"",a=o.roughnessNode?Zu(o.roughnessNode):[],l=o.roughnessNode?`float inputs:roughness.connect = ${De}/${e}/${n(a.values().next().value)}.outputs:out>`:"",c=o.normalNode?Zu(o.normalNode):[],h=o.normalNode?`float3 inputs:normal.connect = ${De}/${e}/${n(c.values().next().value)}.outputs:out>`:"",d=o.metalnessNode?Zu(o.metalnessNode):[],p=o.metalnessNode?`float inputs:metallic.connect = ${De}/${e}/${n(d.values().next().value)}.outputs:out>`:"",m=new Set([...s,...a,...c,...d]),f=XT(m,e,t,n);return console.debug(f),`
1049
-
1050
- def Material "${e}" ${o.name?`(
1051
- displayName = "${o.name}"
1052
- )`:""}
1053
- {
1054
- token outputs:mtlx:surface.connect = ${De}/${e}/N_mtlxsurface.outputs:surface>
1055
-
1056
- def Shader "N_mtlxsurface"
1057
- {
1058
- uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
1059
- ${r}
1060
- ${l}
1061
- ${h}
1062
- ${p}
1063
- token outputs:surface
1064
- }
1065
-
1066
- ${f}
1067
-
1068
- }`}function Zu(o){const e=g=>{if(g.nodeType)return g.nodeType;switch(g.type){case"TimerNode":return"float";case"TextureNode":return;case"ConvertNode":return g.convertTo;default:return}},t=g=>{const y=new Set,_=w=>{if(!(!w.isNode||y.has(w))){w.nodeType___needle||(w.nodeType___needle=e(w)),w.shaderNode?(w.type___needle="ShaderCallNodeInternal",w.shaderNodeLayoutName___needle=w.shaderNode.layout.name.slice(3)):w.type___needle=w.type,y.add(w);for(const P in w)w[P]?.isNode&&(_(w[P]),w.nodeType___needle||=w[P].nodeType___needle),Array.isArray(w[P])&&w[P].forEach(M=>{M.isNode&&(_(M),w.nodeType___needle||=M.nodeType___needle)})}};return _(g),y},i=g=>{if(g.type==="ConvertNode"){if(g.convertTo===g.node.nodeType___needle)return!0;if(g.node.type==="ConstNode"){if(g.convertTo==="vec4"&&g.node.value.isVector4||g.convertTo==="vec3"&&g.node.value.isVector3||g.convertTo==="vec2"&&g.node.value.isVector2||g.convertTo==="color"&&g.node.value.isColor||g.convertTo==="float"&&typeof g.node.value=="number")return!0}else if(g.node.type=="SplitNode"&&g.convertTo=="float"&&g.node.components.length===1)return!0}return!1},n=g=>{for(;s(g);)!g.node&&g.shaderNode?g=g.inputNodes[0]:g=g.node??g.aNode??g.bNode??g.cNode;return g},s=g=>{const y=["UniformNode","UniformGroupNode","ShaderNodeInternal"];return!g||i(g)||y.includes(g.type___needle)||g.type___needle===void 0},r=(g,y)=>{for(const _ of y)for(const w in _){if(_[w]?.isNode&&_[w]===g)return{parent:_,label:w};if(Array.isArray(_[w])&&_[w].find(P=>P.isNode&&P===g))return{parent:_,label:w}}return null},a=(g,y)=>{if(g.shaderNode)g.inputNodes[0]=n(g.inputNodes[0]);else if(Array.isArray(g.nodes))for(let _=0;_<g.nodes.length;_++)g.nodes[_]&&s(g.nodes[_])&&(g.nodes[_]=n(g.nodes[_]));else y.forEach(_=>{g[_]&&s(g[_])&&(g[_]=n(g[_]))})},l=g=>{g.type==="MathNode"&&g.method==="mix"&&(g.cNode.nodeType___needle="float",g.cNode.type==="ConvertNode"&&(g.cNode.convertTo="float"))},c=(g,y)=>{y.label==="cNode"&&y.parent.type==="MathNode"&&y.parent.method==="mix"||(y.parent.type==="JoinNode"?g.nodeType___needle="float":g.nodeType___needle=y.parent.nodeType___needle)},h=g=>g?.type==="ConvertNode"&&g.nodeType___needle==="color"&&g.node.nodeType___needle==="vec4",d=(g,y)=>{g.convertTo="vec3",g.nodeType___needle="vec3";const _={type:"ConvertNode",convertTo:"color",node:g,isNode:!0,nodeType___needle:"color",type___needle:"ConvertNode"},w=r(g,y);return w?.parent&&(w.parent[w.label]=_),_},p=g=>g?.type==="ConvertNode"&&g.node.type==="TextureNode"&&g.nodeType___needle!==g.node.nodeType___needle,m=g=>{const y=new Set;for(let _ of g)if(!s(_)){if(l(_),_.type=="SplitNode"){const w=r(_,g);if(_.components.length===1)_.nodeType___needle="float";else if(w)_.nodeType___needle=w.parent.nodeType___needle;else throw new Error("SplitNode without parent found, this should not happen")}if(a(_,["node","aNode","bNode","cNode"]),_.type=="ConstNode"&&_.nodeType==null&&c(_,r(_,g)),h(_)&&y.add(d(_,g)),p(_)){_.node.nodeType___needle=_.convertTo;const w=r(_,g);w?.parent&&(w.parent[w.label]=_.node),_=_.node}y.add(_)}return y},f=t(o);return m(f)}function GT(o,e){switch(e){case"float4":return o.isVector4?`(${o.x}, ${o.y}, ${o.z}, ${o.w})`:`(${o}, ${o}, ${o}, ${o})`;case"float3":return o.isVector3?`(${o.x}, ${o.y}, ${o.z})`:`(${o}, ${o}, ${o})`;case"float2":return o.isVector2?`(${o.x}, ${o.y})`:`(${o}, ${o})`;case"color3f":return o.isColor?`(${o.r}, ${o.g}, ${o.b})`:`(${o}, ${o}, ${o})`;default:return o.isVector4||o.isVector3||o.isVector2?`${o.x}`:o.isColor?`${o.r}`:`${o}`}}function qT(o,e,t,i){const n=" ",s=m=>({float:"float",vec2:"vector2",vec3:"vector3",vec4:"vector4",color:"color3"})[m]||"float",r=m=>({float:"float",vec2:"float2",vec3:"float3",vec4:"float4",color:"color3f"})[m]||"float",a=o.type___needle,l=o.nodeType___needle,c=s(l);let h=r(l),d="";const p=new Array;switch(a){case"UniformGroupNode":case"UniformNode":return"";case"TimerNode":d="time_float";break;case"ConstNode":d="constant_"+c,p.push(`${h} inputs:value = ${GT(o.value,h)}`);break;case"JoinNode":d="combine"+o.nodes.length+"_"+c;let m=1;for(const w of o.nodes)p.push(`float inputs:in${m++}.connect = ${De}/${e}/${t(w)}.outputs:out>`);break;case"ConvertNode":d="convert_"+s(o.node.nodeType___needle)+"_"+c,o.node&&p.push(`${r(o.node.nodeType___needle)} inputs:in.connect = ${De}/${e}/${t(o.node)}.outputs:out>`);break;case"MathNode":d=o.method+"_"+c,o.aNode&&!o.bNode&&p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode&&!o.cNode&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in1.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:in2.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`)),o.aNode&&o.bNode&&o.cNode&&o.method=="clamp"&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:low.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.cNode.nodeType___needle)} inputs:high.connect = ${De}/${e}/${t(o.cNode)}.outputs:out>`)),o.aNode&&o.bNode&&o.cNode&&o.method=="mix"&&(p.push(`${r(o.aNode.nodeType___needle)} inputs:fg.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`),p.push(`${r(o.bNode.nodeType___needle)} inputs:bg.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`float inputs:mix.connect = ${De}/${e}/${t(o.cNode)}.outputs:out>`));break;case"OperatorNode":let f="";switch(o.op){case"*":f="multiply";break;case"/":f="divide";break;case"+":f="add";break;case"-":f="subtract";break}if(d=f+"_"+c,o.aNode&&!o.bNode&&p.push(`${r(o.aNode.nodeType___needle)} inputs:in.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),o.aNode&&o.bNode){const w=r(o.aNode.nodeType___needle),P=r(o.bNode.nodeType___needle);(w==="color3f"&&P==="float"||P==="float"&&P==="color3f")&&(d=f+"_color3FA"),p.push(`${w} inputs:in1.connect = ${De}/${e}/${t(o.aNode)}.outputs:out>`),p.push(`${P} inputs:in2.connect = ${De}/${e}/${t(o.bNode)}.outputs:out>`)}break;case"TextureNode":o.uvNode?(d="tiledimage_"+c,p.push(`float2 inputs:texcoord.connect = ${De}/${e}/${t(o.uvNode)}.outputs:out>`)):d="image_"+c;const g=o._value,y=dy.includes(g.format),_=QT(g);p.push(`asset inputs:file = @textures/${_}.${y?"png":"jpg"}@`),i[_]={texture:g,scale:void 0};break;case"NormalMapNode":h="float3",d="normalmap",p.push(`${h} inputs:in.connect = ${De}/${e}/${t(o.node)}.outputs:out>`);break;case"AttributeNode":d="geompropvalue_"+c,p.push('string inputs:geomprop = "st"');break;case"ShaderCallNodeInternal":d=o.shaderNodeLayoutName___needle+"_"+c,p.push(`${h} inputs:in.connect = ${De}/${e}/${t(o.inputNodes[0])}.outputs:out>`);break;case"SplitNode":d="swizzle_"+s(o.node.nodeType___needle)+"_"+c,p.push(`${r(o.node.nodeType___needle)} inputs:in.connect = ${De}/${e}/${t(o.node)}.outputs:out>`),p.push(`string inputs:channels = "${o.components}"`);break}return`
1069
- ${n}def Shader "${t(o)}"
1070
- ${n}{
1071
- ${n}uniform token info:id = "ND_${d}"
1072
- ${n}${h} outputs:out
1073
- ${n}${p.length>0?p.join(`
1074
- `):""}
1075
- ${n}}
1076
- `}function XT(o,e,t,i){let n="";for(const s of o)n+=qT(s,e,i,t);return n}function QT(o){return Ii(o.name)+"_"+(o.source?.id??o.id)}function Ii(o){return o=o.replace(/[^a-zA-Z0-9_]/g,""),o.match(/^[a-zA-Z_]/)||(o="_"+o),o}function Cx(o){return o=o.replace('"','\\"'),o}function Px(o){if(o.length===0)return null;const e=o.map(t=>{const i=new Array;for(;t.parent;)i.unshift(t.parent),t=t.parent;return i});return e[0].findLast(t=>e.every(i=>i.includes(t)))||null}function Ox(o){const e=Px(o),t=new Set;for(const i of o){let n=i.parent;for(;n&&n!==e;)o.includes(n)||t.add(n),n=n.parent}return t}const YT=new b,ZT=new U,KT=new b(1,1,1);class nt{static USDObject_export_id=0;uuid;name;type;extraSchemas=[];displayName;visibility;getMatrix(){if(!this.transform)return new K;const{position:e,quaternion:t,scale:i}=this.transform,n=new K;return n.compose(e||YT,t||ZT,i||KT),n}setMatrix(e){if(!e||!(e instanceof K)){this.transform=null;return}const t=new b,i=new U,n=new b;e.decompose(t,i,n),this.transform={position:t,quaternion:i,scale:n}}get matrix(){return this.getMatrix()}set matrix(e){this.setMatrix(e)}transform=null;_isDynamic;get isDynamic(){return this._isDynamic}set isDynamic(e){this._isDynamic=e}geometry;material;camera;parent;skinnedMesh;children=[];animations;_eventListeners;needsTranslate=!1;needsOrient=!1;needsScale=!1;static createEmptyParent(e){const t=new nt(wo.generateUUID(),e.name+"_empty_"+nt.USDObject_export_id++,e.transform),i=e.parent;return i&&i.add(t),t.add(e),t.isDynamic=!0,e.transform=null,t}static createEmpty(){const e=new nt(wo.generateUUID(),"Empty_"+nt.USDObject_export_id++);return e.isDynamic=!0,e}constructor(e,t,i=null,n=null,s=null,r=null,a=null,l=null){this.uuid=e,this.name=Ii(t),this.displayName=t,i?this.transform={position:i.position?.clone()||null,quaternion:i.quaternion?.clone()||null,scale:i.scale?.clone()||null}:this.transform=null,this.geometry=n,this.material=s,this.camera=r,this.parent=null,this.children=[],this._eventListeners={},this._isDynamic=!1,this.skinnedMesh=a,this.animations=l}is(e){return e?this.uuid===e.uuid:!1}isEmpty(){return!this.geometry}clone(){const e=new nt(wo.generateUUID(),this.name,this.transform,this.geometry,this.material);return e.isDynamic=this.isDynamic,e}deepClone(){const e=this.clone();for(const t of this.children)t&&e.add(t.deepClone());return e}getPath(){let e=this.parent,t=this.name;for(;e;)t=(e.parent?e.name:e.name+"/Scenes/Scene")+"/"+t,e=e.parent;return"</"+t+">"}add(e){e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}addEventListener(e,t){this._eventListeners[e]||(this._eventListeners[e]=[]),this._eventListeners[e].push(t)}removeEventListener(e,t){if(!this._eventListeners[e])return;const i=this._eventListeners[e].indexOf(t);i>=0&&this._eventListeners[e].splice(i,1)}onSerialize(e,t){const i=this._eventListeners.serialize;i&&i.forEach(n=>n(e,t))}}class sy extends nt{stageLength;get isDocumentRoot(){return!0}get isDynamic(){return!1}constructor(){super(void 0,"StageRoot",null,null,null,null),this.children=[],this.stageLength=200}add(e){e.parent=this,this.children.push(e)}remove(e){const t=this.children.indexOf(e);t>=0&&(e.parent===this&&(e.parent=null),this.children.splice(t,1))}traverse(e,t=null){if(t!==null?e(t):t=this,t.children)for(const i of t.children)this.traverse(e,i)}findById(e){let t=!1;function i(n){if(!t){if(n.uuid===e)return t=!0,n;if(n.children)for(const s of n.children){if(!s)continue;const r=i(s);if(r)return r}}}return i(this)}buildHeader(e){const t=e.extensions?.find(h=>h?.extensionName==="animation"),i=e.extensions?.find(h=>h?.extensionName==="Behaviour"),n=e.extensions?.find(h=>h?.extensionName==="Physics"),s=t?.getStartTimeCode()??0,r=t?.getEndTimeCode()??0;let a="";const l=t?.registeredClips;if(l)for(const h of l)a+=` # Animation: ${h.name}, start=${t.getStartTimeByClip(h)*60}, length=${h.duration*60}
1077
- `;const c=a;return`#usda 1.0
1078
- (
1079
- customLayerData = {
1080
- string creator = "Needle Engine ${bn}"
1081
- dictionary Needle = {
1082
- bool animations = ${t?1:0}
1083
- bool interactive = ${i?1:0}
1084
- bool physics = ${n?1:0}
1085
- bool quickLookCompatible = ${e.quickLookCompatible?1:0}
1086
- }
1087
- }
1088
- defaultPrim = "${Ii(this.name)}"
1089
- metersPerUnit = 1
1090
- upAxis = "Y"
1091
- startTimeCode = ${s}
1092
- endTimeCode = ${r}
1093
- timeCodesPerSecond = 60
1094
- framesPerSecond = 60
1095
- doc = """Generated by Needle Engine USDZ Exporter ${bn}"""
1096
- ${c}
1097
- )
1098
- `}}const dl=`
1099
- `,Jt="</StageRoot/Materials";class kx{str;indent;constructor(){this.str="",this.indent=0}clear(){this.str="",this.indent=0}beginBlock(e=void 0,t="{",i=!0){e!==void 0?(e=this.applyIndent(e),this.str+=e,i?(this.str+=dl,this.str+=this.applyIndent(t)):this.str+=" "+t):this.str+=this.applyIndent(t),this.str+=dl,this.indent+=1}closeBlock(e="}"){this.indent-=1,this.str+=this.applyIndent(e)+dl}beginArray(e){e=this.applyIndent(e+" = ["),this.str+=e,this.str+=dl,this.indent+=1}closeArray(){this.indent-=1,this.str+=this.applyIndent("]")+dl}appendLine(e=""){e=this.applyIndent(e),this.str+=e,this.str+=dl}toString(){return this.str}applyIndent(e){let t="";for(let i=0;i<this.indent;i++)t+=" ";return t+e}}class JT{root;exporter;extensions=[];quickLookCompatible;exportInvisible;materials;textures;files;document;output;animations;constructor(e,t,i){this.root=e||void 0,this.exporter=t,this.quickLookCompatible=i.quickLookCompatible,this.exportInvisible=i.exportInvisible,i.extensions&&(this.extensions=i.extensions),this.materials=new Map,this.textures={},this.files={},this.document=new sy,this.output="",this.animations=[]}makeNameSafe(e){return Ii(e)}}const Mx=()=>({ar:{anchoring:{type:"plane"},planeAnchoring:{alignment:"horizontal"}},quickLookCompatible:!1,extensions:[],maxTextureSize:4096,exportInvisible:!1});let Rx=class{debug;pruneUnusedNodes;sceneAnchoringOptions=Mx();extensions=[];keepObject;beforeWritingDocument;constructor(){this.debug=!1,this.pruneUnusedNodes=!0}async parse(o,e=Mx()){e=Object.assign({},e),this.sceneAnchoringOptions=e;const t=new JT(o,this,e);this.extensions=t.extensions;const i=t.files,n="model.usda";i[n]=null,t.materials;const s=t.textures;ae.report("export-usdz","Invoking onBeforeBuildDocument"),await Ku(t,"onBeforeBuildDocument"),ae.report("export-usdz","Done onBeforeBuildDocument"),ae.report("export-usdz","Reparent bones to common ancestor");const r=[],a=new Set;o?.traverse(f=>{if(!(!e.exportInvisible&&!f.visible)&&f instanceof us){const g=f.skeleton.bones,y=Px(g);if(y){const _={object:f,originalParent:f.parent,newParent:y};r.push(_),a.add(_.object.uuid),_.newParent&&a.add(_.newParent.uuid),_.originalParent&&a.add(_.originalParent.uuid)}}});for(const f of r){const{object:g,originalParent:y,newParent:_}=f;_.add(g)}ae.report("export-usdz","Traversing hierarchy"),o&&Tx(o,t.document,t,this.keepObject),ae.report("export-usdz","Invoking onAfterBuildDocument"),await Ku(t,"onAfterBuildDocument");const l=t.extensions.find(f=>f.extensionName==="Behaviour")?.getAllTargetUuids()??new Set;if(this.pruneUnusedNodes){const f={allBehaviorTargets:l,debug:!1,boneReparentings:a,quickLookCompatible:t.quickLookCompatible};this.debug&&Ex(t.document,"Hierarchy BEFORE pruning",f),Ax(t.document,f),this.debug&&Ex(t.document,"Hierarchy AFTER pruning")}else this.debug&&console.log("Pruning of empty nodes is disabled. This may result in a larger USDZ file.");ae.report("export-usdz",{message:"Parsing document",autoStep:10}),await eE(t,e),ae.report("export-usdz","Invoking onAfterSerialize"),await Ku(t,"onAfterSerialize");for(const f of r){const{object:g,originalParent:y,newParent:_}=f;y&&y.add(g)}t.exporter?.beforeWritingDocument?.();const c=t.document.buildHeader(t)+`
1100
- `+t.output;this.debug&&console.debug(c),i[n]=vb(c),t.output="",ae.report("export-usdz",{message:"Exporting textures",autoStep:10}),ae.start("export-usdz-textures",{parentScope:"export-usdz",logTimings:!1});const h=new cr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}),d=Object.keys(s).length;ae.report("export-usdz-textures",{totalSteps:d*3,currentStep:0});const p=async f=>{const g=s[f],y=g.texture,_=dy.includes(y.format);let w={imageData:y.image};ae.report("export-usdz-textures",{message:"read back texture",autoStep:!0});const P=g.scale!==void 0&&g.scale.x!==1&&g.scale.y!==1&&g.scale.z!==1&&g.scale.w!==1;(y.isCompressedTexture||y.isRenderTargetTexture||P)&&(w=await Lx(y,e.maxTextureSize,h,g.scale)),ae.report("export-usdz-textures",{message:"convert texture to canvas",autoStep:!0});const M=await iE(w.imageBitmap||w.imageData,e.maxTextureSize).catch(O=>{console.error("Error converting texture to canvas",y,O)});if(M){ae.report("export-usdz-textures",{message:"convert canvas to blob",autoStep:!0});const O=await M.convertToBlob({type:_?"image/png":"image/jpeg",quality:.95});i[`textures/${f}.${_?"png":"jpg"}`]=new Uint8Array(await O.arrayBuffer())}else console.warn("Can`t export texture: ",y)};for(const f in s)await p(f);h.dispose(),ae.end("export-usdz-textures");let m=0;for(const f in i){const g=i[f],y=34+f.length;m+=y;const _=m&63;if(_!==4){const w=64-_,P=new Uint8Array(w);i[f]=[g,{extra:{12345:P}}]}m=g.length}return ae.report("export-usdz","zip archive"),QC(i,{level:0})}};function Tx(o,e,t,i){if(!t.exportInvisible&&!o.visible)return;let n,s,r;const a={position:o.position,quaternion:o.quaternion,scale:o.scale};if(o.position.x===0&&o.position.y===0&&o.position.z===0&&(a.position=null),o.quaternion.x===0&&o.quaternion.y===0&&o.quaternion.z===0&&o.quaternion.w===1&&(a.quaternion=null),o.scale.x===1&&o.scale.y===1&&o.scale.z===1&&(a.scale=null),(o instanceof G||o instanceof us)&&(s=o.geometry,r=o.material),i&&!i(o)&&(s=void 0,r=void 0),(o instanceof G||o instanceof us)&&r&&typeof r=="object"&&(r instanceof pt||r instanceof xe||r.isMeshPhysicalNodeMaterial||r instanceof ve&&r.type==="MeshLineMaterial")){const l=tp(o),c=o instanceof us?o:null;n=new nt(o.uuid,l,a,s,r,void 0,c,o.animations)}else if(o instanceof re||o instanceof fd){const l=tp(o);n=new nt(o.uuid,l,a,void 0,void 0,o)}else{const l=tp(o);n=new nt(o.uuid,l,a,void 0,void 0,void 0,void 0,o.animations)}if(n){if(n.displayName=o.userData?.name||o.name,n.visibility=o.visible?void 0:"invisible",e&&e.add(n),e=n,t.extensions)for(const l of t.extensions)l.onExportObject&&l.onExportObject.call(l,o,n,t)}else{const l=tp(o),c=new nt(o.uuid,l,{position:o.position,quaternion:o.quaternion,scale:o.scale});e&&e.add(c),e=c}for(const l of o.children)Tx(l,e,t,i)}function Ex(o,e,...t){const i={};let n=0;function s(r,a){n++;let l=r.displayName||r.name;l+=" ("+r.uuid+")",(r.geometry||r.material||r.camera||r.skinnedMesh)&&(l+=" ("+(r.geometry?"geo, ":"")+(r.material?"mat, ":"")+(r.camera?"cam, ":"")+(r.skinnedMesh?"skin, ":"")+")"),a[l]={};const c={object:r};r.material&&(c.mat=!0),r.geometry&&(c.geo=!0),r.camera&&(c.cam=!0),r.skinnedMesh&&(c.skin=!0),a[l]._self=c;for(const h of r.children)h&&s(h,a[l])}s(o,i),console.log(e+" ("+n+" nodes)",i,...t)}function Ax(o,e){let t=!0;const i=new Array,n=new Array;if(o.children.length===0)t=!0;else{const c=[...o.children];for(const h of c)if(h){const d=Ax(h,e);e.debug&&(d?i.push(h):n.push(h)),t=t&&d}}const s=e.allBehaviorTargets.has(o.uuid),r=o.geometry||o.material||o.camera&&!e.quickLookCompatible||o.skinnedMesh||!1,a=e.boneReparentings.has(o.uuid),l=t&&!s&&!r&&!a;return l?(e.debug&&console.log("Pruned object:",(o.displayName||o.name)+" ("+o.uuid+")",{isVisible:r,isBehaviorSourceOrTarget:s,allChildsWerePruned:t,isBoneReparenting:a,object:o,prunedChilds:i,keptChilds:n}),o.parent?.remove(o)):e.debug&&console.log("Kept object:",(o.displayName||o.name)+" ("+o.uuid+")",{isVisible:r,isBehaviorSourceOrTarget:s,allChildsWerePruned:t,isBoneReparenting:a,object:o,prunedChilds:i,keptChilds:n}),l}async function eE(o,e){ae.start("export-usdz-resources","export-usdz");const t=[];for(const c of o.document.children)Ix(c,o,t);const i=t.length;for(let c=0;c<i;c++)ae.report("export-usdz-resources",{totalSteps:i,currentStep:c}),await new Promise((h,d)=>{t[c](),h()});ae.end("export-usdz-resources");const n=new kx,s=o.exporter.sceneAnchoringOptions.ar;n.beginBlock(`def Xform "${o.document.name}"`),n.beginBlock(`def Scope "Scenes" (
1101
- kind = "sceneLibrary"
1102
- )`),n.beginBlock('def Xform "Scene"',"(",!1),n.appendLine('apiSchemas = ["Preliminary_AnchoringAPI"]'),n.appendLine("customData = {"),n.appendLine(" bool preliminary_collidesWithEnvironment = 0"),n.appendLine(' string sceneName = "Scene"'),n.appendLine("}"),n.appendLine('sceneName = "Scene"'),n.closeBlock(")"),n.beginBlock(),n.appendLine(`token preliminary:anchoring:type = "${s.anchoring.type}"`),s.anchoring.type==="plane"&&n.appendLine(`token preliminary:planeAnchoring:alignment = "${s.planeAnchoring.alignment}"`),s.anchoring.type==="image"&&n.appendLine(`rel preliminary:imageAnchoring:referenceImage = </${o.document.name}/Scenes/Scene/AnchoringReferenceImage>`),n.appendLine();const r=c=>{if(!c)return 0;let h=1;for(const d of c.children)h+=r(d);return h},a=r(o.document);ae.start("export-usdz-xforms","export-usdz"),ae.report("export-usdz-xforms",{totalSteps:a,currentStep:1});for(const c of o.document.children)Bx(c,n,o);ae.end("export-usdz-xforms"),ae.report("export-usdz","invoke onAfterHierarchy"),await Ku(o,"onAfterHierarchy",n),n.closeBlock(),n.closeBlock(),ae.report("export-usdz","Building materials");const l=lE(o.materials,o.textures,e.quickLookCompatible);n.appendLine(l),n.closeBlock(),ae.report("export-usdz","write to string"),o.output+=n.toString()}function Ix(o,e,t){if(!o)return;const i=o.geometry,n=o.material;if(i)if(n&&("isMeshStandardMaterial"in n&&n.isMeshStandardMaterial||"isMeshBasicMaterial"in n&&n.isMeshBasicMaterial||n.type==="MeshLineMaterial")){const s="geometries/"+ay(i,o.name)+".usda";if(!(s in e.files)){const r=()=>{const a=sE(i,o.skinnedMesh?.skeleton?.bones,e.quickLookCompatible);e.files[s]=oE(a)};t.push(r)}}else console.warn("NeedleUSDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)",n?.name);n&&e.materials.get(n.uuid)===void 0&&(e.materials[n.uuid]=n);for(const s of o.children)Ix(s,e,t)}async function Ku(o,e,t=null){if(o.extensions){for(const i of o.extensions)if(i&&typeof i[e]=="function"){const n=i[e].call(i,o,t);n instanceof Promise&&await n}}}let Ju=null,ei=null,ry,ul,ep;async function Lx(o,e=1/0,t=null,i=void 0){ry||(ry=new Un(2,2,1,1)),ul||(ul=new zn({uniforms:{blitTexture:new Wi(o),flipY:new Wi(!1),scale:new Wi(new pe(1,1,1,1))},vertexShader:`
1103
- varying vec2 vUv;
1104
- uniform bool flipY;
1105
- void main(){
1106
- vUv = uv;
1107
- if (flipY)
1108
- vUv.y = 1. - vUv.y;
1109
- gl_Position = vec4(position.xy * 1.0,0.,.999999);
1110
- }`,fragmentShader:`
1111
- uniform sampler2D blitTexture;
1112
- uniform vec4 scale;
1113
- varying vec2 vUv;
1114
-
1115
- void main(){
1116
- gl_FragColor = vec4(vUv.xy, 0, 1);
1117
-
1118
- #ifdef IS_SRGB
1119
- gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
1120
- #else
1121
- gl_FragColor = texture2D( blitTexture, vUv);
1122
- #endif
1123
-
1124
- gl_FragColor.rgba *= scale.rgba;
1125
- }`}));const n=ul.uniforms;n.blitTexture.value=o,n.flipY.value=!1,n.scale.value=new pe(1,1,1,1),i!==void 0&&n.scale.value.copy(i),ul.defines.IS_SRGB=o.colorSpace==Co,ul.needsUpdate=!0,ep||(ep=new G(ry,ul),ep.frustumCulled=!1);const s=new re,r=new wi;r.add(ep),t||(t=Ju=new cr({antialias:!1,alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0}));const a=Math.min(o.image.width,e),l=Math.min(o.image.height,e);ei&&(ei.width!==a||ei.height!==l)&&(ei.dispose(),ei=null),ei||(ei=new Vn(a,l,{format:vd,type:bC,minFilter:Od,magFilter:Od})),t.setRenderTarget(ei),t.setSize(a,l),t.clear(),t.render(r,s),Ju&&(Ju.dispose(),Ju=null);const c=new Uint8ClampedArray(ei.width*ei.height*4);t.readRenderTargetPixels(ei,0,0,ei.width,ei.height,c);const h=new ImageData(c,ei.width,ei.height,void 0),d=await createImageBitmap(h,{premultiplyAlpha:"none"});return{imageData:h,imageBitmap:d}}function tE(o){return typeof HTMLImageElement<"u"&&o instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&o instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&o instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&o instanceof ImageBitmap}async function iE(o,e=4096){const t=e/Math.max(o.width,o.height),i=o.width*Math.min(1,t),n=o.height*Math.min(1,t),s=new OffscreenCanvas(i,n),r={premultiplyAlpha:"none"};o.width!==i&&(r.resizeWidth=i),o.height!==n&&(r.resizeHeight=n);const a=await createImageBitmap(o,r),l=s.getContext("bitmaprenderer");return l&&l.transferFromImageBitmap(a),s}async function jx(o,e=void 0,t=!1,i=4096){if(tE(o)){const n=i/Math.max(o.width,o.height),s=new OffscreenCanvas(o.width*Math.min(1,n),o.height*Math.min(1,n)),r=s.getContext("2d",{alpha:!0,premultipliedAlpha:!1});if(!r)throw new Error("Could not get canvas 2D context");if(t===!0&&(r.translate(0,s.height),r.scale(1,-1)),r.drawImage(o,0,0,s.width,s.height),e!==void 0){const a=e.x,l=e.y,c=e.z,h=e.w,d=r.getImageData(0,0,s.width,s.height),p=d.data;for(let m=0;m<p.length;m+=4)p[m+0]=p[m+0]*a,p[m+1]=p[m+1]*l,p[m+2]=p[m+2]*c,p[m+3]=p[m+3]*h;r.putImageData(d,0,0)}return s}else throw new Error("NeedleUSDZExporter: No valid image data found. Unable to process texture.")}const ke=7;function nE(){return`#usda 1.0
1126
- (
1127
- customLayerData = {
1128
- string creator = "Needle Engine USDZExporter"
1129
- }
1130
- metersPerUnit = 1
1131
- upAxis = "Y"
1132
- )
1133
- `}function oE(o,e){let t=nE();return t+=o,vb(t)}function tp(o){return o.name.replace(/[-<>\(\)\[\]§$%&\/\\\=\?\,\;]/g,"")+"_"+o.id}function Dx(o){return Ii(o.name||"bone_"+o.uuid)}function ay(o,e){return Ii(o.name||"Geometry")+"_"+o.id}function ip(o){return Ii(o.name||"Material")+"_"+o.id}function pl(o,e){let t=Dx(o),i=o.parent;for(;i&&i!==e;)t=Dx(i)+"/"+t,i=i.parent;return t}function Bx(o,e,t){if(o==null)return;ae.report("export-usdz-xforms",{message:"buildXform "+o.displayName||o.name,autoStep:!0});const i=o.transform,n=o.geometry,s=o.material,r=o.camera,a=o.name;if(o.animations)for(const m of o.animations)t.animations.push(m);const l=n&&n.isBufferGeometry&&n.attributes.skinIndex!==void 0&&n.attributes.skinIndex.count>0,c=l?"SkelRoot":"Xform",h=new Array,d=s&&s instanceof xe&&s.color&&s.color.r===1&&s.color.g===1&&s.color.b===1&&!s.map&&s.opacity===1&&n?.attributes.color;if(n?.attributes.color&&!d&&console.warn("NeedleUSDZExporter: Geometry has vertex colors. Vertex colors will only be shown in QuickLook for unlit materials with white color and no texture. Otherwise, they will be ignored.",o.displayName),e.appendLine(),n?(e.beginBlock(`def ${c} "${a}"`,"(",!1),t.quickLookCompatible&&s&&s.side===Ci&&!l?e.appendLine(`prepend references = @./geometries/${ay(n)}.usda@</Geometry_doubleSided>`):e.appendLine(`prepend references = @./geometries/${ay(n)}.usda@</Geometry>`),d||h.push("MaterialBindingAPI"),l&&h.push("SkelBindingAPI")):r&&!t.quickLookCompatible?e.beginBlock(`def Camera "${a}"`,"(",!1):o.type!==void 0?e.beginBlock(`def ${o.type} "${a}"`):e.beginBlock(`def Xform "${a}"`,"(",!1),o.type===void 0&&(o.extraSchemas?.length&&h.push(...o.extraSchemas),h.length&&e.appendLine(`prepend apiSchemas = [${h.map(m=>`"${m}"`).join(", ")}]`)),o.displayName&&e.appendLine(`displayName = "${Cx(o.displayName)}"`),(r||o.type===void 0)&&(e.closeBlock(")"),e.beginBlock()),n&&s){if(!d){const m=ip(s);e.appendLine(`rel material:binding = </StageRoot/Materials/${m}>`)}!t.quickLookCompatible&&s.side===Ci&&(e.beginBlock('over "Geometry" '),e.appendLine("uniform bool doubleSided = 1"),e.closeBlock())}let p=!1;if(l?(e.appendLine("rel skel:skeleton = <Rig>"),e.appendLine("rel skel:animationSource = <Rig/_anim>"),p=!1):o.type===void 0&&i&&(p=p||i.position!==null||i.quaternion!==null||i.scale!==null,i.position&&(o.needsTranslate=!0,e.appendLine(`double3 xformOp:translate = (${le(i.position.x)}, ${le(i.position.y)}, ${le(i.position.z)})`)),i.quaternion&&(o.needsOrient=!0,e.appendLine(`quatf xformOp:orient = (${le(i.quaternion.w)}, ${le(i.quaternion.x)}, ${le(i.quaternion.y)}, ${le(i.quaternion.z)})`)),i.scale&&(o.needsScale=!0,e.appendLine(`double3 xformOp:scale = (${le(i.scale.x)}, ${le(i.scale.y)}, ${le(i.scale.z)})`))),o.visibility!==void 0&&e.appendLine(`token visibility = "${o.visibility}"`),r&&!t.quickLookCompatible&&("isOrthographicCamera"in r&&r.isOrthographicCamera?(e.appendLine(`float2 clippingRange = (${r.near}, ${r.far})`),e.appendLine(`float horizontalAperture = ${((Math.abs(r.left)+Math.abs(r.right))*10).toPrecision(ke)}`),e.appendLine(`float verticalAperture = ${((Math.abs(r.top)+Math.abs(r.bottom))*10).toPrecision(ke)}`),e.appendLine('token projection = "orthographic"')):"isPerspectiveCamera"in r&&r.isPerspectiveCamera&&(e.appendLine(`float2 clippingRange = (${r.near.toPrecision(ke)}, ${r.far.toPrecision(ke)})`),e.appendLine(`float focalLength = ${r.getFocalLength().toPrecision(ke)}`),e.appendLine(`float focusDistance = ${r.focus.toPrecision(ke)}`),e.appendLine(`float horizontalAperture = ${r.getFilmWidth().toPrecision(ke)}`),e.appendLine('token projection = "perspective"'),e.appendLine(`float verticalAperture = ${r.getFilmHeight().toPrecision(ke)}`))),o.onSerialize&&o.onSerialize(e,t),o.type===void 0){const m=new Array;o.needsTranslate&&m.push('"xformOp:translate"'),o.needsOrient&&m.push('"xformOp:orient"'),o.needsScale&&m.push('"xformOp:scale"'),m.length&&e.appendLine(`uniform token[] xformOpOrder = [${m.join(", ")}]`)}if(o.children){e.appendLine();for(const m of o.children)Bx(m,e,t)}e.closeBlock()}function le(o){return Number.isInteger(o)?o.toString():o.toFixed(10)}function Fx(o){const e=o.elements;return`( ${np(e,0)}, ${np(e,4)}, ${np(e,8)}, ${np(e,12)} )`}function np(o,e){return`(${le(o[e+0])}, ${le(o[e+1])}, ${le(o[e+2])}, ${le(o[e+3])})`}function sE(o,e=[],t=!0){return`
1134
- def "Geometry"
1135
- ${rE(o,e,t)}
1136
- `}function rE(o,e=[],t=!0){const i="Geometry",n=o.attributes,s=n.position.count,r=e&&e.length>0,a=[],l=[];let c=new Array,h=n.skinIndex;if(r){const p=[];for(const y of e)a.push({bone:y,index:e.indexOf(y)}),p.push(y.uuid);let m=1e4;for(;p.length<e.length&&m-- >0;)for(const y of a){const _=y.bone.children;for(const w of _)p.indexOf(w.uuid)===-1&&e.indexOf(w)!==-1&&(a.push({bone:w,index:e.indexOf(w)}),p.push(w.uuid))}m<=0&&console.error("Failed to sort bones in skinned mesh",a,e,p);for(const y of Ox(e))a.push({bone:y,index:a.length});const f=a[0].bone.parent;a.sort((y,_)=>pl(y.bone,f)>pl(_.bone,f)?1:-1),a.map(y=>'"'+pl(y.bone,f)+'"').join(", ");for(const y in a)l[a[y].index]=parseInt(y);const g=n.skinIndex;c=new Array;for(let y=0;y<g.count;y++){const _=g.getX(y),w=g.getY(y),P=g.getZ(y),M=g.getW(y);c.push(l[_],l[w],l[P],l[M])}h=new mt(new Uint16Array(c),4)}const d=n.skinWeight&&n.skinIndex;return`
1137
- {
1138
- def Mesh "${i}" ${d?`(
1139
- prepend apiSchemas = ["SkelBindingAPI"]
1140
- )`:""}
1141
- {
1142
- int[] faceVertexCounts = [${ly(o)}]
1143
- int[] faceVertexIndices = [${cy(o)}]
1144
- ${n.normal||t?`normal3f[] normals = [${op(n.normal,s)}] (
1145
- interpolation = "vertex"
1146
- )`:""}
1147
- point3f[] points = [${op(n.position,s)}]
1148
- ${n.uv?`texCoord2f[] primvars:st = [${zx(n.uv,s,!0)}] (
1149
- interpolation = "vertex"
1150
- )`:""}
1151
- ${n.uv1?hy("st1",n.uv1):""}
1152
- ${n.uv2?hy("st2",n.uv2):""}
1153
- ${n.uv3?hy("st3",n.uv3):""}
1154
- ${d?`matrix4d primvars:skel:geomBindTransform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) (
1155
- elementSize = 1
1156
- interpolation = "constant"
1157
- )`:""}
1158
- ${n.skinIndex?`int[] primvars:skel:jointIndices = [${Ux(h,!0)}] (
1159
- elementSize = 4
1160
- interpolation = "vertex"
1161
- )`:""}
1162
- ${n.skinWeight?`float[] primvars:skel:jointWeights = [${Ux(n.skinWeight)}] (
1163
- elementSize = 4
1164
- interpolation = "vertex"
1165
- )`:""}
1166
- ${n.color?`color3f[] primvars:displayColor = [${op(n.color,s)}] (
1167
- interpolation = "vertex"
1168
- )`:""}
1169
- uniform token subdivisionScheme = "none"
1170
- }
1171
- }
1172
- ${t?`
1173
- # This is a workaround for QuickLook/RealityKit not supporting the doubleSided attribute. We're adding a second
1174
- # geometry definition here, that uses the same mesh data but appends extra faces with reversed winding order.
1175
- def "${i}_doubleSided" (
1176
- prepend references = </Geometry>
1177
- )
1178
- {
1179
- over "Geometry"
1180
- {
1181
- int[] faceVertexCounts = [${ly(o)+", "+ly(o)}]
1182
- int[] faceVertexIndices = [${cy(o)+", "+cy(o,!0)}]
1183
- }
1184
- }
1185
- `:""}
1186
- `}function ly(o){const e=o.index!==null?o.index.count:o.attributes.position.count;return Array(Math.floor(e/3)).fill(3).join(", ")}function cy(o,e=!1){const t=o.index,i=[];if(t!==null)for(let n=0;n<t.count;n++){let s=n;e&&(s=n%3===0?n+2:n%3===2?n-2:n),i.push(t.getX(s))}else{const n=o.attributes.position.count;for(let s=0;s<n;s++){let r=s;e&&(r=s%3===0?s+2:s%3===2?s-2:s),i.push(r)}}return i.join(", ")}function hy(o,e){const t=e.itemSize;switch(t){case 2:return`texCoord2f[] primvars:${o} = [${zx(e,t,!0)}] (
1187
- interpolation = "vertex"
1188
- )`;case 3:return`texCoord3f[] primvars:${o} = [${op(e,t)}] (
1189
- interpolation = "vertex"
1190
- )`;case 4:return`double4[] primvars:${o} = [${aE(e,t)}] (
1191
- interpolation = "vertex"
1192
- )`;default:return console.warn("USDZExporter: Attribute with "+t+" components are currently not supported. Results may be undefined for "+o+"."),""}}function op(o,e){if(o===void 0)return console.warn("USDZExporter: A mesh attribute is missing and will be set with placeholder data. The result may look incorrect."),Array(e).fill("(0, 0, 1)").join(", ");const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i);t.push(`(${n.toPrecision(ke)}, ${s.toPrecision(ke)}, ${r.toPrecision(ke)})`)}return t.join(", ")}function aE(o,e){if(o===void 0)return console.warn("USDZExporter: Attribute is missing. Results may be undefined."),Array(e).fill("(0, 0, 0, 0)").join(", ");const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i)||0,a=o.getW(i)||0;t.push(`(${n.toPrecision(ke)}, ${s.toPrecision(ke)}, ${r.toPrecision(ke)}, ${a.toPrecision(ke)})`)}return t.join(", ")}function Ux(o,e=!1){const t=[];for(let i=0;i<o.count;i++){const n=o.getX(i),s=o.getY(i),r=o.getZ(i),a=o.getW(i);t.push(`${e?n:n.toPrecision(ke)}`),t.push(`${e?s:s.toPrecision(ke)}`),t.push(`${e?r:r.toPrecision(ke)}`),t.push(`${e?a:a.toPrecision(ke)}`)}return t.join(", ")}function zx(o,e,t=!1){if(o===void 0)return console.warn("USDZExporter: UVs missing."),Array(e).fill("(0, 0)").join(", ");const i=[];for(let n=0;n<o.count;n++){const s=o.getX(n);let r=o.getY(n);t&&(r=1-r),i.push(`(${s.toPrecision(ke)}, ${r.toPrecision(ke)})`)}return i.join(", ")}function lE(o,e,t=!1){const i=[];for(const n in o){const s=o[n];i.push(cE(s,e,t))}return`
1193
- def "Materials"
1194
- {
1195
- ${i.join("")}
1196
- }`}function tn(o){return Ii(o.name)+"_"+(o.source?.id??o.id)}function As(o,e,t,i,n,s,r=void 0,a=void 0){const l=tn(o),c=l+(a!==void 0&&a!==1?"_"+a:""),h=t&&a!==void 0&&a!==1,d=h?new pe(1,1,1,a):void 0;a===void 0&&(a=1),h&&(a=1),d&&d.w<=.05&&(d.w=.05),i[c]={texture:o,scale:d};const p=o.channel>0?"st"+o.channel:"st";s.add(o.channel);const m=dy.includes(o.format),f={1e3:"repeat",1001:"clamp",1002:"mirror"},g=o.repeat.clone(),y=o.offset.clone(),_=o.rotation,w=Math.sin(_),P=Math.cos(_);y.y=1-y.y-g.y,t?(g.x===0&&(g.x=1e-4),g.y===0&&(g.y=1e-4),y.x=y.x/g.x,y.y=y.y/g.y,y.x+=w/g.x,y.y+=P-1):(y.x+=w*g.x,y.y+=(1-P)*g.y);const M=ip(n),O=g.x!=1||g.y!=1||y.x!=0||y.y!=0||_!=0,j=`${Jt}/${M}/${"uvReader_"+p}.outputs:result>`,I=`${Jt}/${M}/Transform2d_${e}.outputs:result>`,N=e!=="normal"&&r&&(r.r!==1||r.g!==1||r.b!==1||a!==1)||!1,V=e==="normal",H=n instanceof pt&&n.normalScale?n.normalScale.x*2:2,X=H.toFixed(ke),T=(-1*(H/2)).toFixed(ke),$=(1-H).toFixed(ke);return`
1197
- ${O?`def Shader "Transform2d_${e}" (
1198
- sdrMetadata = {
1199
- string role = "math"
1200
- }
1201
- )
1202
- {
1203
- uniform token info:id = "UsdTransform2d"
1204
- float2 inputs:in.connect = ${j}
1205
- float2 inputs:scale = ${Vx(g)}
1206
- float2 inputs:translation = ${Vx(y)}
1207
- float inputs:rotation = ${(_/Math.PI*180).toFixed(ke)}
1208
- float2 outputs:result
1209
- }
1210
- `:""}
1211
- def Shader "${l}_${e}"
1212
- {
1213
- uniform token info:id = "UsdUVTexture"
1214
- asset inputs:file = @textures/${c}.${m?"png":"jpg"}@
1215
- token inputs:sourceColorSpace = "${o.colorSpace==="srgb"?"sRGB":"raw"}"
1216
- float2 inputs:st.connect = ${O?I:j}
1217
- ${N?`
1218
- float4 inputs:scale = (${r?r.r+", "+r.g+", "+r.b:"1, 1, 1"}, ${a})
1219
- `:""}
1220
- ${V?`
1221
- float4 inputs:scale = (${X}, ${X}, ${X}, 1)
1222
- float4 inputs:bias = (${T}, ${T}, ${$}, 0)
1223
- `:""}
1224
- token inputs:wrapS = "${f[o.wrapS]}"
1225
- token inputs:wrapT = "${f[o.wrapT]}"
1226
- float outputs:r
1227
- float outputs:g
1228
- float outputs:b
1229
- float3 outputs:rgb
1230
- ${n.transparent||n.alphaTest>0?"float outputs:a":""}
1231
- }`}function cE(o,e,t=!1){const i=ip(o);if(o.colorWrite===!1||o.userData?.isShadowCatcherMaterial||o.userData?.isLightBlendMaterial){const d=o.userData.isLightBlendMaterial||o.userData.isShadowCatcherMaterial?"ND_realitykit_shadowreceiver_surfaceshader":"ND_realitykit_occlusion_surfaceshader";return`
1232
-
1233
- def Material "${i}" ${o.name?`(
1234
- displayName = "${o.name}"
1235
- )`:""}
1236
- {
1237
- token outputs:mtlx:surface.connect = ${Jt}/${i}/Occlusion.outputs:out>
1238
-
1239
- def Shader "Occlusion"
1240
- {
1241
- uniform token info:id = "${d}"
1242
- token outputs:out
1243
- }
1244
- }`}const n=" ",s=[],r=[],a=new Set;if(o.isMeshPhysicalNodeMaterial===!0)return HT(o,i,e);let l=o.transparent||o.alphaTest?o.opacity:1,c=!1,h=!1;if(o instanceof xm&&o.transmission!==void 0&&(l*=1-o.transmission*(1-o.roughness*.5)),o.map?(s.push(`${n}color3f inputs:diffuseColor.connect = ${Jt}/${i}/${tn(o.map)}_diffuse.outputs:rgb>`),o instanceof xe&&o.transparent&&o.alphaTest==0&&t?(s.push(`${n}float inputs:opacity.connect = ${Jt}/${i}/${tn(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${1e-10}`),h=!0):o.transparent?(s.push(`${n}float inputs:opacity.connect = ${Jt}/${i}/${tn(o.map)}_diffuse.outputs:a>`),c=!0):o.alphaTest>0&&(s.push(`${n}float inputs:opacity.connect = ${Jt}/${i}/${tn(o.map)}_diffuse.outputs:a>`),c=!0,s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0),r.push(As(o.map,"diffuse",t,e,o,a,o.color,l))):s.push(`${n}color3f inputs:diffuseColor = ${Nx(o.color)}`),o.alphaHash&&t&&(h?console.warn("Opacity threshold for "+o.name+" was already connected. Skipping alphaHash opacity threshold."):(s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),h=!0)),o.aoMap&&(s.push(`${n}float inputs:occlusion.connect = ${Jt}/${i}/${tn(o.aoMap)}_occlusion.outputs:r>`),r.push(As(o.aoMap,"occlusion",t,e,o,a))),o.alphaMap?(s.push(`${n}float inputs:opacity.connect = ${Jt}/${i}/${tn(o.alphaMap)}_opacity.outputs:r>`),s.push(`${n}float inputs:opacityThreshold = 0.0000000001`),c=!0,h=!0,r.push(As(o.alphaMap,"opacity",t,e,o,a,new ne(1,1,1),l))):(c?console.warn("Opacity for "+o.name+" was already connected. Skipping default opacity."):(s.push(`${n}float inputs:opacity = ${l}`),c=!0),o.alphaTest>0&&(h?console.warn("Opacity threshold for "+o.name+" was already connected. Skipping default opacity threshold."):(s.push(`${n}float inputs:opacityThreshold = ${o.alphaTest}`),h=!0))),o instanceof pt){if(o.emissiveMap){s.push(`${n}color3f inputs:emissiveColor.connect = ${Jt}/${i}/${tn(o.emissiveMap)}_emissive.outputs:rgb>`);const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),r.push(As(o.emissiveMap,"emissive",t,e,o,a,d))}else if(o.emissive?.getHex()>0){const d=o.emissive.clone();d.multiplyScalar(o.emissiveIntensity),s.push(`${n}color3f inputs:emissiveColor = ${Nx(d)}`)}o.normalMap&&(s.push(`${n}normal3f inputs:normal.connect = ${Jt}/${i}/${tn(o.normalMap)}_normal.outputs:rgb>`),r.push(As(o.normalMap,"normal",t,e,o,a))),o.roughnessMap&&o.roughness===1?(s.push(`${n}float inputs:roughness.connect = ${Jt}/${i}/${tn(o.roughnessMap)}_roughness.outputs:g>`),r.push(As(o.roughnessMap,"roughness",t,e,o,a))):s.push(`${n}float inputs:roughness = ${o.roughness!==void 0?o.roughness:1}`),o.metalnessMap&&o.metalness===1?(s.push(`${n}float inputs:metallic.connect = ${Jt}/${i}/${tn(o.metalnessMap)}_metallic.outputs:b>`),r.push(As(o.metalnessMap,"metallic",t,e,o,a))):s.push(`${n}float inputs:metallic = ${o.metalness!==void 0?o.metalness:0}`)}return o instanceof xm&&(s.push(`${n}float inputs:clearcoat = ${o.clearcoat}`),s.push(`${n}float inputs:clearcoatRoughness = ${o.clearcoatRoughness}`),s.push(`${n}float inputs:ior = ${o.ior}`),!o.transparent&&!(o.alphaTest>0)&&o.transmissionMap&&(s.push(`${n}float inputs:opacity.connect = ${Jt}/${i}/${tn(o.transmissionMap)}_transmission.outputs:r>`),r.push(As(o.transmissionMap,"transmission",t,e,o,a)))),a.size>2?console.warn("USDZExporter: Material "+o.name+" uses more than 2 UV channels. Currently, only UV0 and UV1 are supported."):a.size===2&&(!a.has(0)||!a.has(1))&&console.warn("USDZExporter: Material "+o.name+" uses UV channels other than 0 and 1. Currently, only UV0 and UV1 are supported."),`
1245
-
1246
- def Material "${i}" ${o.name?`(
1247
- displayName = "${Cx(o.name)}"
1248
- )`:""}
1249
- {
1250
- token outputs:surface.connect = ${Jt}/${i}/PreviewSurface.outputs:surface>
1251
-
1252
- def Shader "PreviewSurface"
1253
- {
1254
- uniform token info:id = "UsdPreviewSurface"
1255
- ${s.join(`
1256
- `)}
1257
- int inputs:useSpecularWorkflow = ${o instanceof xe?"1":"0"}
1258
- token outputs:surface
1259
- }
1260
- ${r.length>0?`
1261
- ${a.has(0)?`
1262
- def Shader "uvReader_st"
1263
- {
1264
- uniform token info:id = "UsdPrimvarReader_float2"
1265
- token inputs:varname = "st"
1266
- float2 inputs:fallback = (0.0, 0.0)
1267
- float2 outputs:result
1268
- }
1269
- `:""}
1270
- ${a.has(1)?`
1271
- def Shader "uvReader_st1"
1272
- {
1273
- uniform token info:id = "UsdPrimvarReader_float2"
1274
- token inputs:varname = "st1"
1275
- float2 inputs:fallback = (0.0, 0.0)
1276
- float2 outputs:result
1277
- }
1278
- `:""}
1279
- ${r.join(`
1280
- `)}`:""}
1281
- }`}function Nx(o){return`(${o.r}, ${o.g}, ${o.b})`}function Vx(o){return`(${o.x}, ${o.y})`}const dy=[1023,33777,33778,33779,35842,35843,37496,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,36492];v("debugusdz");class It{static global_id=0;id;trigger;action;exclusive=!1;makeExclusive(e){return this.exclusive=e,this}constructor(e,t,i){this.id="Behavior_"+Ii(e)+"_"+It.global_id++,this.trigger=t,this.action=i}writeTo(e,t,i){if(!this.trigger||!this.action)return;i.beginBlock(`def Preliminary_Behavior "${this.id}"`);let n="";if(Array.isArray(this.trigger)){n="[";for(let s=0;s<this.trigger.length;s++){const r=this.trigger[s];n+="<"+r.id+">",s+1<this.trigger.length&&(n+=", ")}n+="]"}else n=`<${this.trigger.id}>`;if(i.appendLine(`rel triggers = ${n}`),i.appendLine(`rel actions = <${this.action.id}>`),i.appendLine(`uniform bool exclusive = ${this.exclusive?1:0}`),i.appendLine(),Array.isArray(this.trigger))for(const s of this.trigger)s.writeTo(t,i),i.appendLine();else this.trigger.writeTo(t,i);i.appendLine(),this.action.writeTo(t,i),i.closeBlock()}}const ml=new Set;function uy(o,e){let t="";if(Array.isArray(o)){ml.clear();let i="[ ";for(let n=0;n<o.length;n++){let s=o[n];if(!s){console.warn("Invalid target object in behavior",o+". Is the object exported?");continue}if(typeof s=="string"){if(ml.has(s))continue;i+=s,ml.add(s)}else if(typeof s=="object"){if(s.isObject3D&&(s=e.findById(s.uuid),!s)){console.warn("Invalid target object in behavior",o+". Is the object exported?");continue}const r=s.getPath?.call(s);if(ml.has(r))continue;i+=r,ml.add(r)}n+1<o.length&&(i+=", ")}i+=" ]",t=i,ml.clear()}else if(typeof o=="object"){const i=o;if(i.isObject3D&&(o=e.findById(i.uuid)),!o)throw console.error("Invalid target object in behavior, the target object is likely missing from USDZ export. Is the object exported?",i),new Error(`Invalid target object in behavior, the target object is likely missing from USDZ export. Please report a bug. uuid: ${i.uuid}.`);t=o.getPath?.call(o)}return t}class nr{static global_id=0;id;targetId;tokenId;type;distance;constructor(e,t){e&&(this.targetId=e),t?this.id=t:this.id="Trigger_"+nr.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Trigger "${this.id}"`),this.targetId&&(typeof this.targetId!="string"&&(this.targetId=uy(this.targetId,e)),t.appendLine("rel affectedObjects = "+this.targetId)),this.tokenId&&t.appendLine(`token info:id = "${this.tokenId}"`),this.type&&t.appendLine(`token type = "${this.type}"`),typeof this.distance=="number"&&t.appendLine(`double distance = ${this.distance}`),t.closeBlock()}}function Wx(o,e={direct:!0,indirect:!0}){const t=nt.createEmpty();t.name="InputTarget_"+t.name,t.displayName=void 0,t.type="RealityKitComponent",t.onSerialize=i=>{i.appendLine("bool allowsDirectInput = "+(e.direct?1:0)),i.appendLine("bool allowsIndirectInput = "+(e.indirect?1:0)),i.appendLine('uniform token info:id = "RealityKit.InputTarget"')},o.add(t)}class zt{static __sceneStartTrigger;static sceneStartTrigger(){if(this.__sceneStartTrigger!==void 0)return this.__sceneStartTrigger;const e=new nr(void 0,"SceneStart");return e.tokenId="SceneTransition",e.type="enter",this.__sceneStartTrigger=e,e}static tapTrigger(e,t={direct:!0,indirect:!0}){const i=new nr(e);if(Array.isArray(e)&&e.length>1)for(const n of e)n instanceof nt&&Wx(n,t);else e instanceof nt&&Wx(e,t);return i.tokenId="TapGesture",i}static isTapTrigger(e){return e?.tokenId==="TapGesture"}static proximityToCameraTrigger(e,t){const i=new nr(e);return i.tokenId="ProximityToCamera",i.distance=t,i}}class Gr{static global_id=0;static getId(){return this.global_id++}id;actions;loops=0;performCount=1;type="serial";multiplePerformOperation=void 0;constructor(e,t){this.id=e,this.actions=t}addAction(e){return this.actions.push(e),this}makeParallel(){return this.type="parallel",this}makeSequence(){return this.type="serial",this}makeLooping(){return this.loops=1,this.performCount=0,this}makeRepeat(e){return this.performCount=e,this}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),t.beginArray("rel actions");for(const i of this.actions){if(!i)continue;const n=i===this.actions[this.actions.length-1];t.appendLine("<"+i.id+">"+(n?"":", "))}t.closeArray(),t.appendLine(),t.appendLine('token info:id = "Group"'),t.appendLine(`bool loops = ${this.loops}`),t.appendLine(`int performCount = ${this.loops>0?0:Math.max(0,this.performCount)}`),t.appendLine(`token type = "${this.type}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),t.appendLine();for(const i of this.actions)i&&(i.writeTo(e,t),t.appendLine());t.closeBlock()}}class vi{static global_id=0;id;tokenId;affectedObjects;easeType;motionType=void 0;duration;moveDistance;style;type;front;up;start;animationSpeed;reversed;pingPong;xFormTarget;audio;gain;auralMode;multiplePerformOperation;velocity;comment;animationName;clone(){const e=new vi,t=e.id;return Object.assign(e,this),e.id=t,e}constructor(e,t){e&&(this.affectedObjects=e),t?this.id=t:this.id="Action",this.id+="_"+vi.global_id++}writeTo(e,t){t.beginBlock(`def Preliminary_Action "${this.id}"`),this.comment&&t.appendLine(`# ${this.comment}`),this.affectedObjects&&(typeof this.affectedObjects!="string"&&(this.affectedObjects=uy(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=uy(this.xFormTarget,e)),t.appendLine(`rel xformTarget = ${this.xFormTarget}`)),typeof this.audio=="string"&&t.appendLine(`asset audio = @${this.audio}@`),typeof this.gain=="number"&&t.appendLine(`double gain = ${this.gain}`),typeof this.auralMode=="string"&&t.appendLine(`token auralMode = "${this.auralMode}"`),typeof this.multiplePerformOperation=="string"&&t.appendLine(`token multiplePerformOperation = "${this.multiplePerformOperation}"`),typeof this.velocity=="object"&&t.appendLine(`vector3d velocity = (${this.velocity.x}, ${this.velocity.y}, ${this.velocity.z})`),t.closeBlock()}}class pn{x=0;y=0;z=0;constructor(e,t,i){this.x=e,this.y=t,this.z=i}static get up(){return new pn(0,1,0)}static get right(){return new pn(1,0,0)}static get forward(){return new pn(0,0,1)}static get back(){return new pn(0,0,-1)}static get zero(){return new pn(0,0,0)}}class ge{static sequence(...e){return new Gr("Group_"+Gr.getId(),e).makeSequence()}static parallel(...e){return new Gr("Group_"+Gr.getId(),e).makeParallel()}static fadeAction(e,t,i){const n=new vi(e);return n.tokenId="Visibility",n.type=i?"show":"hide",n.duration=t,n.style="basic",n.motionType="none",n.moveDistance=0,n.easeType="none",n}static startAnimationAction(e,t,i=!1,n=!1){const s=new vi(e);s.tokenId="StartAnimation";const r=t.start,a=t.duration,l=t.speed,c=t.clipName;if(s.comment=`Animation: ${c}, start=${r*60}, length=${a*60}, end=${(r+a)*60}`,s.animationName=c,s.start=r,s.duration=a,s.animationSpeed=l,s.reversed=i,s.pingPong=n,s.multiplePerformOperation="allow",i&&(s.start-=a),n){s.pingPong=!1;const h=s.clone();return h.reversed=!i,h.start=s.start,h.reversed&&(h.start-=a),ge.sequence(s,h)}return s}static waitAction(e){const t=new vi;return t.tokenId="Wait",t.duration=e,t.motionType=void 0,t}static lookAtCameraAction(e,t,i,n){const s=new vi(e);return s.tokenId="LookAtCamera",s.duration=t===void 0?9999999999999:t,s.front=i??pn.forward,s.up=n??pn.up,s}static emphasize(e,t,i="bounce",n=1,s="basic"){const r=new vi(e);return r.tokenId="Emphasize",r.duration=t,r.style=s??"basic",r.motionType=i,r.moveDistance=n,r}static transformAction(e,t,i,n,s="inout"){const r=new vi(e);return r.tokenId="Transform",r.duration=i,r.duration=Math.max(1e-6,i),r.type=n,r.easeType=i>0?s:"none",Array.isArray(t)&&console.error("Transform target must not be an array",t),r.xFormTarget=t,r}static playAudioAction(e,t,i="play",n=1,s="spatial"){const r=new vi(e);return r.tokenId="Audio",r.type=i,r.audio=t,r.gain=n,r.auralMode=s,r.multiplePerformOperation="allow",r}static impulseAction(e,t){const i=new vi(e);return i.tokenId="Impulse",i.velocity=t,i}}class hE{get id(){return this.object.uuid}object;model;constructor(e){this.object=e}apply(e){if(!this.model&&(this.model=e.findById(this.object.uuid),!this.model)){console.error("could not find model with id "+this.object.uuid);return}this.onApply(e)}}class py extends hE{constructor(e,t,i,n){super(e),this.matrix=t,this.material=i,this.geometry=n}matrix;material;geometry;onApply(e){const t=this.model;if(!t)return;t.parent?.isDynamic||nt.createEmptyParent(t);const i=t.clone();this.matrix&&i.setMatrix(this.matrix),this.material&&(i.material=this.material),this.geometry&&(i.geometry=this.geometry),t.parent?.add(i)}_enableAction;_disableAction;enable(){return this._enableAction?this._enableAction:(this._enableAction=ge.fadeAction(this.object,0,!0),this._enableAction)}disable(){return this._disableAction?this._disableAction:(this._disableAction=ge.fadeAction(this.object,0,!1),this._disableAction)}}class $x{actions;sortedActions;constructor(e){this.actions=[...e]}organize(){this.sortedActions={};for(const e of this.actions){const t=e.id;this.sortedActions[t]||(this.sortedActions[t]=[]),this.sortedActions[t].push(e)}}getActions(e){return this.sortedActions||this.organize(),this.sortedActions[e.uuid]}}const so=v("debugusdzanimation"),my=v("debugusdzanimationserialization");class lr{_start;get start(){return this._start===void 0&&(this._start=this.ext.getStartTimeByClip(this.clip)),this._start}get duration(){return this.clip?.duration??Ne.restPoseClipDuration}get nearestAnimatedRoot(){return this._nearestAnimatedRoot}get clipName(){return this.clip?.name??"rest"}ext;root;_nearestAnimatedRoot=void 0;clip;speed;constructor(e,t,i){this.ext=e,this.root=t,this.clip=i,this._nearestAnimatedRoot=this.getNearestAnimatedRoot()}static isDescendantOf(e,t){let i=t;if(!i||!e)return!1;for(;i;){if(!i)return!1;if(i===e)return!0;i=i.parent}return!1}getNearestAnimatedRoot(){let e;try{for(const t of this.clip?.tracks??[]){const i=ka.parseTrackName(t.name);let n=ka.findNode(this.root,i.nodeName);if(n)if(!e)e=n;else{if(n===e||lr.isDescendantOf(e,n))continue;if(!lr.isDescendantOf(n,e)){for(;!lr.isDescendantOf(n,e)&&n.parent;)n=n.parent;lr.isDescendantOf(n,e)||console.error("USDZExporter: Animation clip targets multiple roots that are not parent/child. Please report a bug",this.root,this.clip,e,n)}e=n}}}catch(t){console.error("USDZExporter: Exception when trying to find nearest animated root. Please report a bug",t),e=void 0}return e}}class Ne{clip;pos;rot;scale;root;target;duration=0;useRootMotion=!1;static frameRate=60;static animationDurationPadding=6/60;static restPoseClipDuration=6/60;constructor(e,t,i){if(this.root=e,this.target=t,this.clip=i,i?this.duration=i.duration:this.duration=Ne.restPoseClipDuration,i&&i.tracks){const s=Math.max(...i.tracks.map(r=>r.times[r.times.length-1]));s!==this.duration&&(console.warn("USDZExporter: Animation clip duration does not match the maximum time value in the tracks.",i,s,this.duration),this.duration=s)}const n=x.getComponent(e,yt);n&&(this.useRootMotion=n.applyRootMotion)}addTrack(e){if(!this.clip){console.error("This is a rest clip but you're trying to add tracks to it \u2013 this is likely a bug");return}e.name.endsWith("position")?this.pos=e:e.name.endsWith("quaternion")?this.rot=e:e.name.endsWith("scale")?this.scale=e:(e.name.endsWith("activeSelf")?console.warn("[USDZ] Animation of enabled/disabled state is not supported for USDZ export and will NOT be exported: "+e.name+" on "+(this.root?.name??this.target.name)+". Animate scale 0/1 instead."):console.warn("[USDZ] Animation track type not supported for USDZ export and will NOT be exported: "+e.name+" on "+(this.root?.name??this.target.name)+". Only .position, .rotation, .scale are supported."),A()&&ye("[USDZ] Some animations can't be exported. See console for details."))}getFrames(){return this.clip?Math.max(this.pos?.times?.length??0,this.rot?.times?.length??0,this.scale?.times?.length??0):2}getDuration(){return this.duration}getSortedTimesArray(e=!0,t=!0,i=!0){if(!this.clip)return[0,this.duration];const n=this.pos?.times,s=this.rot?.times,r=this.scale?.times,a=[];if(e&&n)for(const l of n)a.push(l);if(t&&s)for(const l of s)a.push(l);if(i&&r)for(const l of r)a.push(l);return a.includes(0)||a.push(0),a.sort((l,c)=>l-c),[...new Set(a)]}*getValues(e,t=!0,i=!0,n=!0){const s=new b,r=new U,a=new b(1,1,1),l=this.target,c=t?this.pos?.createInterpolant():void 0,h=i?this.rot?.createInterpolant():void 0,d=n?this.scale?.createInterpolant():void 0;c||s.set(l.position.x,l.position.y,l.position.z),h||r.set(l.quaternion.x,l.quaternion.y,l.quaternion.z,l.quaternion.w),d||a.set(l.scale.x,l.scale.y,l.scale.z),c&&c.valueSize!==3&&(c.valueSize=3),h&&h.valueSize!==4&&(h.valueSize=4),d&&d.valueSize!==3&&(d.valueSize=3);const p=0;for(let m=0-p;m<e.length+p;m++){let f=0,g=0;if(m<0?(f=e[0],g=f-Ne.animationDurationPadding/2+1/60):m>=e.length?(f=e[e.length-1],g=f+Ne.animationDurationPadding/2-1/60):(f=e[m],g=f),c){const y=c.evaluate(f);s.set(y[0],y[1],y[2])}if(h){const y=h.evaluate(f);r.set(y[0],y[1],y[2],y[3])}if(d){const y=d.evaluate(f);a.set(y[0],y[1],y[2])}if(this.useRootMotion&&l===this.root){const y=new K;y.compose(s,r,a),y.multiply(l.matrix),y.decompose(s,r,a)}yield{time:g,translation:s,rotation:r,scale:a,index:m}}}}class sp{get extensionName(){return"animation"}get animationData(){return this.dict}get registeredClips(){return this.clipToStartTime.keys()}get animatedRoots(){return this.rootTargetMap.keys()}get holdClipMap(){return this.clipToHoldClip}dict=new Map;rootTargetMap=new Map;rootAndClipToRegisteredAnimationMap=new Map;rootToRegisteredClip=new Map;lastClipEndTime=0;clipToStartTime=new Map;clipToHoldClip=new Map;serializers=[];injectRestPoses=!1;injectImplicitBehaviours=!1;constructor(e){this.injectRestPoses=e,this.injectImplicitBehaviours=e}getStartTimeCode(){return!this.injectRestPoses||this.rootAndClipToRegisteredAnimationMap.size===0?0:(Ne.restPoseClipDuration+Ne.animationDurationPadding)*60}getEndTimeCode(){let e=0;for(const[t,i]of this.rootAndClipToRegisteredAnimationMap){const n=i.start+i.duration;n>e&&(e=n)}return e*60}getClipCount(e){return this.rootToRegisteredClip.get(e)?.length??0??0}getStartTimeByClip(e){return e?this.clipToStartTime.has(e)?this.clipToStartTime.get(e):(console.error("USDZExporter: Missing start time for clip \u2013 please report a bug.",e),0):0}registerAnimation(e,t){if(!e)return null;this.rootTargetMap.has(e)||this.rootTargetMap.set(e,[]);const i=e.uuid+(t?.uuid??"-rest");if(this.rootAndClipToRegisteredAnimationMap.has(i))return this.rootAndClipToRegisteredAnimationMap.get(i);so&&console.log("registerAnimation",e,t);const n=this.injectRestPoses?1:0,s=(this.rootToRegisteredClip.get(e)?.length??0)+n,r=this.rootTargetMap.get(e),a=new Set(r);if(t&&t.tracks)for(const c of t.tracks){const h=ka.parseTrackName(c.name),d=ka.findNode(e,h.nodeName);if(!d){console.warn("no object found for track",c.name,"using "+e.name+" instead");continue}this.dict.has(d)||this.dict.set(d,[]);const p=this.dict.get(d);if(!p){console.warn("no transform data found for target ",d,"at slot "+s+", this is likely a bug");continue}a.delete(d),this.injectRestPoses&&!p[0]&&(console.log("Injecting rest pose",d,t,"at slot",s),p[0]=new Ne(null,d,null));let m=p[s];m||(m=new Ne(e,d,t),p[s]=m),m.addTrack(c),r?.includes(d)||r?.push(d)}so&&console.log("Unregistered nodes for this clip",a,"clip",t,"at slot",s,"for root",e,"targets",r);for(const c of a){const h=this.dict.get(c);if(!h)continue;if(this.injectRestPoses&&!h[0]){console.warn("Adding rest pose for ",c,t,"at slot",s,"This is likely a bug, should have been added earlier.");const p=new Ne(null,c,null);h[0]=p}let d=h[s];d||(so&&console.log("Adding padding clip for ",c,t,"at slot",s),d=new Ne(e,c,t),h[s]=d)}const l=new lr(this,e,t);if(this.rootAndClipToRegisteredAnimationMap.set(i,l),so&&console.log({root:e,clip:t,info:l}),t){const c=this.rootToRegisteredClip.get(e);if(c?c.push(t):this.rootToRegisteredClip.set(e,[t]),!this.clipToStartTime.get(t)){this.lastClipEndTime==null&&(this.lastClipEndTime=Ne.restPoseClipDuration);let h=this.lastClipEndTime+Ne.animationDurationPadding,d=h+t.duration;const p=Math.round(h*60)/60,m=Math.round(d*60)/60;Math.abs(p-h)<.01&&(h=p),Math.abs(m-d)<.01&&(d=m),h=Math.ceil(h),d=h+t.duration,this.clipToStartTime.set(t,h),this.lastClipEndTime=d}}return l}onAfterHierarchy(e){so&&console.log("Animation clips per animation target node",this.dict)}onAfterBuildDocument(e){so&&console.log("Animation data",{dict:this.dict,rootTargetMap:this.rootTargetMap,rootToRegisteredClip:this.rootToRegisteredClip});for(const t of this.rootTargetMap.keys()){const i=this.rootTargetMap.get(t);if(!i)continue;let n;const s=[];for(const r of i){const a=this.dict.get(r);if(!a){console.error("No data found for target on USDZ export \u2013 please report a bug!",r);continue}n===void 0&&(n=a?.length),n!==a?.length&&console.error("Different array lengths for targets \u2013 please report a bug!",a);for(let l=0;l<a.length;l++){let c=a[l];if(!c){const d=l-(this.injectRestPoses?1:0);a[l]=new Ne(null,r,this.rootToRegisteredClip.get(t)[d]),c=a[l]}const h=c.getDuration();if(s[l]===void 0)s[l]=h;else if(s[l]!==h){console.error("Error during UDSZ export: Encountered different animation durations for animated targets. Please report a bug!",{datas:a,target:r}),s[l]=h;continue}}}}for(const t of this.serializers){const i=t.model?.parent,n=i?.isDynamic===!0;my&&console.log(n,t.model?.parent),n&&t.registerCallback(i)}}onExportObject(e,t,i){x.foreachComponent(e,s=>{const r=s;typeof r.createAnimation=="function"&&r.createAnimation(this,t,i)},!1);const n=new dE(e,this);this.serializers.push(n),n.registerCallback(t)}}class dE{model=void 0;object;animationData;ext;callback;constructor(e,t){this.object=e,this.animationData=t.animationData,this.ext=t}registerCallback(e){this.model&&this.callback&&this.model.removeEventListener("serialize",this.callback),this.callback||(this.callback=this.onSerialize.bind(this)),my&&console.log("REPARENT",e),this.model=e,this.callback&&this.model.addEventListener("serialize",this.callback)}skinnedMeshExport(e,t,i){const n=this.model,s=this.animationData;if(n&&n.skinnedMesh){let r=function(T){const $=[];for(const[W,se]of T){let ce=`${W} : [`;const fe=[];for(const Se of se)fe.push(`(${le(Se.x)}, ${le(Se.y)}, ${le(Se.z)})`);ce=ce.concat(fe.join(", ")),ce=ce.concat("],"),$.push(ce)}return $},a=function(T){const $=[];for(const[W,se]of T){let ce=`${W} : [`;const fe=[];for(const Se of se)fe.push(`(${le(Se.w)}, ${le(Se.x)}, ${le(Se.y)}, ${le(Se.z)})`);ce=ce.concat(fe.join(", ")),ce=ce.concat("],"),$.push(ce)}return $},l=function(T){let $,W=!0;const se=new Map;for(const[fe,Se]of T){$===void 0&&($=Se.length),$!==Se.length&&(W=!1);let Ct=0;for(const Vi of Se)Ct++,Vi||(se.has(fe)||se.set(fe,[]),se.get(fe).push(Ct))}so&&console.log("Bone count: ",T.size,"TransformData entries per bone: ",$,"Undefined bone entries: ",se),console.assert(W,"All bones should have the same number of TransformData entries",T),console.assert(se.size===0,"All TransformData entries should be set",se);const ce=[];for(const[fe,Se]of T)for(let Ct=0;Ct<Se.length;Ct++){const Vi=Se[Ct],gd=i.getStartTimeByClip(Vi.clip);ce.length<=Ct&&ce.push({pos:[],rot:[],scale:[],timeOffset:gd});const hs=ce[Ct];hs.pos.push(...Vi.getSortedTimesArray(!0,!1,!1)),hs.rot.push(...Vi.getSortedTimesArray(!1,!0,!1)),hs.scale.push(...Vi.getSortedTimesArray(!1,!1,!0))}for(const fe of ce)fe.pos.sort((Se,Ct)=>Se-Ct),fe.rot.sort((Se,Ct)=>Se-Ct),fe.scale.sort((Se,Ct)=>Se-Ct),fe.pos=[...new Set(fe.pos)],fe.rot=[...new Set(fe.rot)],fe.scale=[...new Set(fe.scale)];return ce},c=function(T,$,W){const se=new Map,ce=new Map,fe=new Map,Se=$.length;for(const Ct of W){const Vi=T.get(Ct);let gd;Vi?console.assert(Vi.length===Se,"We should have the same number of TransformData entries for each bone",Vi,$):gd=new Ne(null,Ct,null);for(let hs=0;hs<Se;hs++){const dm=Vi?Vi[hs]:gd,Ca=$[hs];for(const{time:Yl,translation:Zl}of dm.getValues(Ca.pos,!0,!1,!1)){const mn=(Yl+Ca.timeOffset)*60;se.has(mn)||se.set(mn,new Array),se.get(mn).push(Zl.clone())}for(const{time:Yl,rotation:Zl}of dm.getValues(Ca.rot,!1,!0,!1)){const mn=(Yl+Ca.timeOffset)*60;ce.has(mn)||ce.set(mn,new Array),ce.get(mn).push(Zl.clone())}for(const{time:Yl,scale:Zl}of dm.getValues(Ca.scale,!1,!1,!0)){const mn=(Yl+Ca.timeOffset)*60;fe.has(mn)||fe.set(mn,new Array),fe.get(mn).push(Zl.clone())}}}return{position:se.size==0?void 0:se,quaternion:ce.size==0?void 0:ce,scale:fe.size==0?void 0:fe}},h=function(T){const $=[];for(const W of T)$.push(`(${le(W.x)}, ${le(W.y)}, ${le(W.z)})`);return $.join(", ")},d=function(T){const $=[];for(const W of T)$.push(`(${le(W.w)}, ${le(W.x)}, ${le(W.y)}, ${le(W.z)})`);return $.join(", ")},p=function(T){const $=new Map;if(so){const W=new Array;for(const[se,ce]of s)W.push(se.uuid+": "+ce.length+" "+ce.map(fe=>fe.clip?.uuid.substring(0,6)).join(" "));console.log(`getPerBoneTransformData
1282
- `+W.join(`
1283
- `))}for(const W of T){const se=s.get(W);se&&$.set(W,se)}return $},m=function(T){const $=p(T),W=l($);return c($,W,T)};const f=n.skinnedMesh.skeleton,g=new Array,y=[],_=[];for(const T of f.bones){y.push(T),_.push(T.uuid);const $=f.boneInverses[f.bones.indexOf(T)];g.push({bone:T,inverse:$})}let w=1e4;for(;_.length<f.bones.length&&w-- >0;)for(const T of y){const $=T.children;for(const W of $)if(_.indexOf(W.uuid)===-1&&f.bones.indexOf(W)!==-1){y.push(W),_.push(W.uuid);const se=f.boneInverses[f.bones.indexOf(W)];g.push({bone:W,inverse:se})}}w<=0&&console.error("Failed to sort bones in skinned mesh",n.skinnedMesh,f.bones,_);for(const T of Ox(f.bones))g.push({bone:T,inverse:T.matrixWorld.clone().invert()});const P=g[0].bone.parent;P||console.error("No bone parent found for skinned mesh during USDZ export",n.skinnedMesh),g.sort((T,$)=>pl(T.bone,P)>pl($.bone,P)?1:-1);const M=t.quickLookCompatible,O=[],j=[],I=[],N=[];for(const{bone:T}of g){if(M){const $=T.scale;$.x==0&&($.x=1e-5),$.y==0&&($.y=1e-5),$.z==0&&($.z=1e-5),O.push(new K().compose(T.position,T.quaternion,T.scale))}else O.push(T.matrix.clone());j.push(T.position),I.push(T.quaternion),N.push(T.scale)}const V=g.map(T=>'"'+pl(T.bone,P)+'"').join(", "),H=g.map(T=>Fx(T.inverse.clone().invert())).join(", ");e.beginBlock('def Skeleton "Rig"'),e.appendLine(`uniform matrix4d[] bindTransforms = [${H}]`),e.appendLine(`uniform token[] joints = [${V}]`),e.appendLine('uniform token purpose = "guide"'),e.appendLine(`uniform matrix4d[] restTransforms = [${O.map(T=>Fx(T)).join(", ")}]`);const X=m(g.map(T=>T.bone));if(so){let T=1e7,$=0;for(const W of X.position?.keys()??[])T=Math.min(T,W),$=Math.max($,W);console.log("Time samples",T,$,X)}if(e.beginBlock('def SkelAnimation "_anim"'),e.appendLine(`uniform token[] joints = [${V}]`),e.appendLine(`quatf[] rotations = [${d(I)}]`),X&&X.quaternion){e.beginBlock("quatf[] rotations.timeSamples = {","");const T=a(X.quaternion);for(const $ of T)e.appendLine($);e.closeBlock()}if(e.appendLine(`half3[] scales = [${h(N)}]`),X&&X.scale){e.beginBlock("half3[] scales.timeSamples = {","");const T=r(X.scale);for(const $ of T)e.appendLine($);e.closeBlock()}if(e.appendLine(`float3[] translations = [${h(j)}]`),X&&X.position){e.beginBlock("float3[] translations.timeSamples = {","");const T=r(X.position);for(const $ of T)e.appendLine($);e.closeBlock()}e.closeBlock(),e.closeBlock()}}onSerialize(e,t){if(!this.model)return;const i=this.animationData.get(this.object);if(i)for(let h=0;h<i.length;h++)i[h]===void 0&&(i[h]=new Ne(null,this.object,null));const n=this.ext;this.skinnedMeshExport(e,t,n);const s=this.object,r=this.model,a=this.animationData.get(s);if(!a||s.isSkinnedMesh)return;my&&console.log("SERIALIZE",this.model.name,this.object.type,a);const l=Intl.NumberFormat("en-US",{maximumFractionDigits:3,minimumFractionDigits:0,useGrouping:!1});function c(h,d){if(h.some(p=>p&&{position:p.pos,rotation:p.rot,scale:p.scale}[d])){switch(d){case"position":r.needsTranslate=!0,e.beginBlock("double3 xformOp:translate.timeSamples = {","");break;case"rotation":r.needsOrient=!0,e.beginBlock("quatf xformOp:orient.timeSamples = {","");break;case"scale":r.needsScale=!0,e.beginBlock("double3 xformOp:scale.timeSamples = {","");break}for(let p=0;p<h.length;p++){const m=h[p];if(!m)continue;const f=n.getStartTimeByClip(m.clip),g=m.getSortedTimesArray(d==="position",d==="rotation",d==="scale");if(!g||g.length===0){console.error("got an animated object but no time values?",s,m);continue}const y=!m.clip,_=d==="position"&&(m.pos||y),w=d==="rotation"&&(m.rot||y),P=d==="scale"&&(m.scale||y);if(_||w||P){const M=m.clip?.name??"rest",O=m.getDuration();so&&console.log("Write .timeSamples:",M,f,O,h),e.appendLine("# "+M+": start="+l.format(f*Ne.frameRate)+", length="+l.format(O*Ne.frameRate)+", frames="+m.getFrames())}if(_)for(const{time:M,translation:O}of m.getValues(g,!0,!1,!1)){const j=`${l.format((f+M)*Ne.frameRate)}: (${le(O.x)}, ${le(O.y)}, ${le(O.z)}),`;e.appendLine(j)}if(w)for(const{time:M,rotation:O}of m.getValues(g,!1,!0,!1)){const j=`${l.format((f+M)*Ne.frameRate)}: (${le(O.w)}, ${le(O.x)}, ${le(O.y)}, ${le(O.z)}),`;e.appendLine(j)}if(P)for(const{time:M,scale:O}of m.getValues(g,!1,!1,!0)){const j=`${l.format((f+M)*Ne.frameRate)}: (${le(O.x)}, ${le(O.y)}, ${le(O.z)}),`;e.appendLine(j)}}e.closeBlock()}}c(a,"position"),c(a,"rotation"),c(a,"scale")}}const uE=v("debugusdz");class ba{static getName(e){const t=e.split(".").pop();let i=e.split(".").slice(0,-1).join(".").split("/").pop()?.replace(".","_");return i||(i="Audio_"+Math.random().toString(36).substring(2,15)),Ii(i)+"."+t}get extensionName(){return"Audio"}files=new Array;onExportObject(e,t,i){const n=x.getComponents(e,Ai);if(n.length)for(const s of n){if(!s.clip||typeof s.clip!="string"||!s.playOnAwake)continue;const r=s.clip.split("/").pop()||"Audio",a=ba.getName(s.clip),l=Ii(a);if(!this.files.some(c=>c.path===s.clip)){this.files.push({path:s.clip,name:a});const c=a.toLowerCase();i.quickLookCompatible&&!c.endsWith(".mp3")&&!c.endsWith(".wav")&&!c.endsWith(".m4a")&&console.error("Audio file "+s.clip+" from "+s.name+" is not an MP3 or WAV file. QuickLook may not support playing it.")}i.quickLookCompatible||t.addEventListener("serialize",(c,h)=>{c.appendLine(),c.beginBlock(`def SpatialAudio "${l}"`,"(",!1),c.appendLine(`displayName = "${r}"`),c.closeBlock(")"),c.beginBlock(),c.appendLine(`uniform asset filePath = @audio/${a}@`),c.appendLine(`uniform token auralMode = "${s.spatialBlend>0?"spatial":"nonSpatial"}"`),c.appendLine(`uniform token playbackMode = "${s.loop?"loopFromStage":"onceFromStart"}"`),c.appendLine(`uniform float gain = ${s.volume}`),c.closeBlock()})}}async onAfterSerialize(e){for(const t of this.files){const i="audio/"+t.name;if(e.files[i]){uE&&console.warn("Audio file with name "+i+" already exists in the context. Skipping.");continue}const n=await(await(await fetch(t.path)).blob()).arrayBuffer(),s=new Uint8Array(n);e.files[i]=s}}}var pE=Object.defineProperty,Be=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&pE(e,t,n),n};const Hx=v("debugusdzbehaviours");function Zc(o){o&&(o.getComponentInParent(Ka)||(A()&&console.debug('Raycaster on "'+o.name+'" was automatically added, because no raycaster was found in the parent hierarchy.'),o.addComponent(Ei)))}class qr extends R{object;target;duration=1;relativeMotion=!1;coroutine=null;targetPos=new b;targetRot=new U;targetScale=new b;start(){Zc(this.gameObject)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),this.coroutine&&this.stopCoroutine(this.coroutine),this.relativeMotion?this.coroutine=this.startCoroutine(this.moveRelative()):this.coroutine=this.startCoroutine(this.moveToTarget())}*moveToTarget(){if(!this.target||!this.object)return;const e=J(this.object).clone(),t=J(this.target).clone(),i=be(this.object).clone(),n=be(this.target).clone(),s=He(this.object).clone(),r=He(this.target).clone(),a=e.distanceTo(t),l=i.angleTo(n),c=s.distanceTo(r);if(a<.01&&l<.01&&c<.01){gt(this.object,t),yn(this.object,n),Aa(this.object,r),this.coroutine=null;return}let h=0,d=0;for(;h<1;)h+=this.context.time.deltaTime/this.duration,h>1&&(h=1),d=h<.5?4*h*h*h:1-Math.pow(-2*h+2,3)/2,this.targetPos.lerpVectors(e,t,d),this.targetRot.slerpQuaternions(i,n,d),this.targetScale.lerpVectors(s,r,d),gt(this.object,this.targetPos),yn(this.object,this.targetRot),Aa(this.object,this.targetScale),yield;this.coroutine=null}*moveRelative(){if(!this.target||!this.object)return;const e=this.object.position.clone(),t=this.object.quaternion.clone(),i=this.object.scale.clone(),n=this.target.position.clone(),s=this.target.quaternion.clone(),r=this.target.scale.clone();n.applyQuaternion(this.object.quaternion),this.targetPos.copy(this.object.position).add(n),this.targetRot.copy(this.object.quaternion).multiply(s),this.targetScale.copy(this.object.scale).multiply(r);let a=0,l=0;for(;a<1;)a+=this.context.time.deltaTime/this.duration,a>1&&(a=1),l=a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,this.object.position.lerpVectors(e,this.targetPos,l),this.object.quaternion.slerpQuaternions(t,this.targetRot,l),this.object.scale.lerpVectors(i,this.targetScale,l),yield;this.coroutine=null}beforeCreateDocument(e){if(this.target&&this.object&&this.gameObject){const t=new It("Move to "+this.target?.name,zt.tapTrigger(this.gameObject),ge.transformAction(this.object,this.target,this.duration,this.relativeMotion?"relative":"absolute"));e.addBehavior(t)}}}Be([u(k)],qr.prototype,"object"),Be([u(k)],qr.prototype,"target"),Be([u()],qr.prototype,"duration"),Be([u()],qr.prototype,"relativeMotion");const rp=class ni extends R{materialToSwitch;variantMaterial;fadeDuration=0;start(){this._objectsWithThisMaterial=this.objectsWithThisMaterial,Zc(this.gameObject),A()&&this._objectsWithThisMaterial.length<=0&&console.warn('ChangeMaterialOnClick: No objects found with material "'+this.materialToSwitch?.name+'"')}onPointerEnter(e){this.context.input.setCursor("pointer")}onPointerExit(e){this.context.input.unsetCursor("pointer")}onPointerClick(e){if(e.use(),!!this.variantMaterial)for(let t=0;t<this.objectsWithThisMaterial.length;t++){const i=this.objectsWithThisMaterial[t];i.material=this.variantMaterial}}_objectsWithThisMaterial=null;get objectsWithThisMaterial(){return this._objectsWithThisMaterial!=null?this._objectsWithThisMaterial:(this._objectsWithThisMaterial=[],this.variantMaterial&&this.materialToSwitch&&this.context.scene.traverse(e=>{if(e instanceof G)if(Array.isArray(e.material)){for(const t of e.material)if(t===this.materialToSwitch){this.objectsWithThisMaterial.push(e);break}}else e.material===this.materialToSwitch?this.objectsWithThisMaterial.push(e):wv(e.material,this.materialToSwitch)&&this.objectsWithThisMaterial.push(e)}),this._objectsWithThisMaterial)}selfModel;targetModels;static _materialTriggersPerId={};static _startHiddenBehaviour=null;static _parallelStartHiddenActions=[];async beforeCreateDocument(e,t){this.targetModels=[],ni._materialTriggersPerId={},ni.variantSwitchIndex=0,this.materialToSwitch&&await Ve.assignTextureLOD(this.materialToSwitch,0),this.variantMaterial&&await Ve.assignTextureLOD(this.variantMaterial,0)}createBehaviours(e,t,i){this.objectsWithThisMaterial.find(n=>n.uuid===t.uuid)&&this.targetModels.push(t),this.gameObject.uuid===t.uuid&&(this.selfModel=t,this.materialToSwitch&&(ni._materialTriggersPerId[this.materialToSwitch.uuid]||(ni._materialTriggersPerId[this.materialToSwitch.uuid]=[]),ni._materialTriggersPerId[this.materialToSwitch.uuid].push(this)))}afterCreateDocument(e,t){if(!this.materialToSwitch)return;const i=ni._materialTriggersPerId[this.materialToSwitch.uuid];if(i){const n={};for(const s of i){const r=s.createVariants();r&&r.length>0&&(n[s.selfModel.uuid]=r)}for(const s of i){const r=[];for(const a in n)a!==s.selfModel.uuid&&r.push(...n[a]);s.createAndAttachBehaviors(e,n[s.selfModel.uuid],r)}}delete ni._materialTriggersPerId[this.materialToSwitch.uuid]}createAndAttachBehaviors(e,t,i){const n=[],s=Math.max(0,this.fadeDuration);n.push(ge.fadeAction([...this.targetModels,...i],s,!1)),n.push(ge.fadeAction(t,s,!0)),e.addBehavior(new It("Select_"+this.selfModel.name,zt.tapTrigger(this.selfModel),ge.parallel(...n))),ni._parallelStartHiddenActions.push(...t),ni._startHiddenBehaviour||(ni._startHiddenBehaviour=new It("StartHidden_"+this.selfModel.name,zt.sceneStartTrigger(),ge.fadeAction(ni._parallelStartHiddenActions,s,!1)),e.addBehavior(ni._startHiddenBehaviour))}static getMaterialName(e){return Ii(e.name||"Material")+"_"+e.id}static variantSwitchIndex=0;createVariants(){if(!this.variantMaterial)return null;const e=[];for(const t of this.targetModels){const i=t.clone();i.name+="_Variant_"+ni.variantSwitchIndex+++"_"+ni.getMaterialName(this.variantMaterial),i.displayName=i.displayName+": Variant with material "+this.variantMaterial.name,i.material=this.variantMaterial,i.geometry=t.geometry,i.transform=t.transform,(!t.parent||!t.parent.isEmpty())&&nt.createEmptyParent(t),t.parent&&t.parent.add(i),e.push(i)}return e}};Be([u(ve)],rp.prototype,"materialToSwitch"),Be([u(ve)],rp.prototype,"variantMaterial"),Be([u()],rp.prototype,"fadeDuration");let gy=rp;const Kc=class ze extends R{target;toggleOnClick=!1;targetState=!0;hideSelf=!0;start(){Zc(this.gameObject)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),!this.toggleOnClick&&this.hideSelf&&(this.gameObject.visible=!1),this.target&&(this.target.visible=this.toggleOnClick?!this.target.visible:this.targetState)}selfModel;selfModelClone;targetModel;toggleModel;createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.selfModel=t,this.selfModelClone=t.clone())}stateBeforeCreatingDocument=!1;targetStateBeforeCreatingDocument=!1;static clonedToggleIndex=0;static wasVisible=Symbol("usdz_SetActiveOnClick_wasVisible");static toggleClone=Symbol("clone for toggling");static reverseToggleClone=Symbol("clone for reverse toggling");beforeCreateDocument(){this.target&&(this.gameObject[ze.wasVisible]===void 0&&(this.gameObject[ze.wasVisible]=this.gameObject.activeSelf),this.target[ze.wasVisible]===void 0&&(this.target[ze.wasVisible]=this.target.activeSelf),this.stateBeforeCreatingDocument=this.gameObject[ze.wasVisible],this.targetStateBeforeCreatingDocument=this.target[ze.wasVisible],this.gameObject.visible=!0,this.target.visible=!0)}afterCreateDocument(e,t){if(!this.target)return;this.targetModel=t.document.findById(this.target.uuid);const i=this.selfModel;if(this.selfModel&&this.targetModel){let n=this.selfModel,s=this.targetState;if(this.toggleOnClick)if(s=!this.targetStateBeforeCreatingDocument,!this.selfModelClone.geometry)(!this.selfModel.parent||this.selfModel.parent.isEmpty())&&sy.createEmptyParent(this.selfModel),this.toggleModel=this.selfModel.deepClone(),this.toggleModel.name+="_toggle",this.selfModel.parent.add(this.toggleModel);else{if(!this.gameObject[ze.toggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new K),l.name+="_toggle"+ze.clonedToggleIndex++,i.add(l),this.gameObject[ze.toggleClone]=l,console.warn("USDZExport: Toggle "+this.gameObject.name+" doesn't have geometry. It will be deep cloned and nested behaviours will likely not work.")}const a=this.gameObject[ze.toggleClone];if(!this.gameObject[ze.reverseToggleClone]){const l=this.selfModelClone.clone();l.setMatrix(new K),l.name+="_toggleReverse"+ze.clonedToggleIndex++,i.add(l),this.gameObject[ze.reverseToggleClone]=l}this.toggleModel=this.gameObject[ze.reverseToggleClone],(!this.toggleModel.geometry||!a.geometry)&&console.error("triggers without childs and without geometry won't work!",this,i.geometry),n=a,i.geometry=null,i.material=null}if(this.toggleModel){if(this.toggleOnClick){const a=[];a.push(ge.fadeAction(n,0,!1)),a.push(ge.fadeAction(this.toggleModel,0,!0)),a.push(ge.fadeAction(this.targetModel,0,s)),e.addBehavior(new It("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),zt.tapTrigger(n),ge.parallel(...a)));const l=[];l.push(ge.fadeAction(this.toggleModel,0,!1)),l.push(ge.fadeAction(n,0,!0)),l.push(ge.fadeAction(this.targetModel,0,!s)),e.addBehavior(new It("Toggle_"+n.name+"_ToggleTo"+(s?"Off":"On"),zt.tapTrigger(this.toggleModel),ge.parallel(...l)))}}else{const a=[];this.hideSelf&&a.push(ge.fadeAction(n,0,!1)),a.push(ge.fadeAction(this.targetModel,0,s)),e.addBehavior(new It("Toggle_"+n.name+"_ToggleTo"+(s?"On":"Off"),zt.tapTrigger(n),a.length>1?ge.parallel(...a):a[0]))}const r=new Array;this.targetStateBeforeCreatingDocument||r.push(this.targetModel),this.stateBeforeCreatingDocument||r.push(i),this.toggleModel&&r.push(this.toggleModel),un.add(r,e)}}afterSerialize(e,t){this.gameObject[ze.wasVisible]!==void 0&&(this.gameObject.visible=this.gameObject[ze.wasVisible],delete this.gameObject[ze.wasVisible]),this.target&&this.target[ze.wasVisible]!==void 0&&(this.target.visible=this.target[ze.wasVisible],delete this.target[ze.wasVisible]),delete this.gameObject[ze.toggleClone],delete this.gameObject[ze.reverseToggleClone]}};Be([u(k)],Kc.prototype,"target"),Be([u()],Kc.prototype,"toggleOnClick"),Be([u()],Kc.prototype,"targetState"),Be([u()],Kc.prototype,"hideSelf");let fy=Kc;class un extends R{static _fadeBehaviour;static _fadeObjects=[];static add(e,t){const i=Array.isArray(e)?e:[e];for(const n of i)un._fadeObjects.includes(n)||(console.log("adding hide on start",n),un._fadeObjects.push(n));un._fadeBehaviour===void 0&&(un._fadeBehaviour=new It("HideOnStart",zt.sceneStartTrigger(),ge.fadeAction(un._fadeObjects,0,!1)),t.addBehavior(un._fadeBehaviour))}start(){x.setActive(this.gameObject,!1)}createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.wasVisible||un.add(t,e))}wasVisible=!1;beforeCreateDocument(){this.wasVisible=x.isActiveSelf(this.gameObject)}}class gl extends R{target;duration=.5;motionType="bounce";beforeCreateDocument(){}createBehaviours(e,t,i){if(this.target&&t.uuid===this.gameObject.uuid){const n=new It("emphasize "+this.name,zt.tapTrigger(this.gameObject),ge.emphasize(this.target,this.duration,this.motionType,void 0,"basic"));e.addBehavior(n)}}afterCreateDocument(e,t){}}Be([u()],gl.prototype,"target"),Be([u()],gl.prototype,"duration"),Be([u()],gl.prototype,"motionType");class Is extends R{target;clip="";toggleOnClick=!1;trigger="tap";start(){Zc(this.gameObject)}ensureAudioSource(){if(!this.target){const e=this.gameObject.addComponent(Ai);e&&(this.target=e,e.spatialBlend=1,e.volume=1,e.loop=!1,e.preload=!0)}}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),!(!this.target?.clip&&!this.clip)&&(this.ensureAudioSource(),this.target&&(this.target.isPlaying&&this.toggleOnClick?this.target.stop():(!this.toggleOnClick&&this.target.isPlaying&&this.target.stop(),this.clip?this.target.play(this.clip):this.target.play())))}createBehaviours(e,t,i){if(!(!this.target&&!this.clip)&&t.uuid===this.gameObject.uuid){const n=this.clip?this.clip:this.target?this.target.clip:void 0;if(!n||typeof n!="string")return;const s=this.target?this.target.gameObject:this.gameObject;ba.getName(n);const r=this.target?this.target.volume:1,a=this.target&&this.target.spatialBlend==0?"nonSpatial":"spatial";let l=!1;this.gameObject.traverse(p=>{p instanceof G&&p.visible&&(l=!0)}),l=!0;const c=e.addAudioClip(n);let h=ge.playAudioAction(s,c,"play",r,a);this.target&&this.target.loop&&(h=ge.sequence(h).makeLooping());const d=this.name?"_"+this.name:"";if(l&&this.trigger==="tap"){this.toggleOnClick&&(h.multiplePerformOperation="stop");const p=new It("playAudio"+d,zt.tapTrigger(t),h);e.addBehavior(p)}if(this.target&&this.target.playOnAwake&&this.target.enabled)if(l&&this.trigger==="tap")console.warn("USDZExport: Audio sources that are played on tap can't also auto-play at scene start due to a QuickLook bug.");else{const p=new It("playAudioOnStart"+d,zt.sceneStartTrigger(),h);e.addBehavior(p)}}}}Be([u(Ai)],Is.prototype,"target"),Be([u(URL)],Is.prototype,"clip"),Be([u()],Is.prototype,"toggleOnClick");const yy=class yo extends R{animator;stateName;trigger="tap";animation;get target(){return this.animator?.gameObject||this.animation?.gameObject}start(){Zc(this.gameObject)}onPointerEnter(){this.context.input.setCursor("pointer")}onPointerExit(){this.context.input.unsetCursor("pointer")}onPointerClick(e){e.use(),this.target&&this.stateName&&this.animator?.play(this.stateName,0,0,.1)}selfModel;stateAnimationModel;animationSequence=new Array;animationLoopAfterSequence=new Array;randomOffsetNormalized=0;createBehaviours(e,t,i){t.uuid===this.gameObject.uuid&&(this.selfModel=t)}static animationActions=[];static rootsWithExclusivePlayback=new Set;afterSerialize(){if(yo.rootsWithExclusivePlayback.size>1){const e='Multiple root objects targeted by more than one animation. To work around QuickLook bug FB13410767, animations will be set as "exclusive" and activating them will stop other animations being marked as exclusive.';A()&&ye(e),console.warn(e,...yo.rootsWithExclusivePlayback)}yo.animationActions=[],yo.rootsWithExclusivePlayback=new Set}afterCreateDocument(e,t){if(this.animationSequence===void 0&&this.animationLoopAfterSequence===void 0||!this.stateAnimationModel||!this.target)return;const i=t.document,n=t.extensions.find(a=>a instanceof sp);if(!n)return;const s=n.getClipCount(this.target)>1;s&&(A()&&console.warn("Setting exclusive playback for "+this.target.name+"@"+this.stateName+" because it has "+n.getClipCount(this.target)+" animations. This works around QuickLook bug FB13410767."),yo.rootsWithExclusivePlayback.add(this.target));const r=this.name?this.name:"";i.traverse(a=>{if(a.uuid===this.target?.uuid){const l=yo.getActionForSequences(i,a,this.animationSequence,this.animationLoopAfterSequence,this.randomOffsetNormalized),c=new It(this.trigger+"_"+r+"_toPlayAnimation_"+this.stateName+"_on_"+this.target?.name,this.trigger=="tap"?zt.tapTrigger(this.selfModel):zt.sceneStartTrigger(),l);s&&c.makeExclusive(!0),e.addBehavior(c)}})}static getActionForSequences(e,t,i,n,s){const r=(l,c)=>{let h=yo.animationActions.find(d=>d.affectedObjects==l&&d.start==c.start&&d.duration==c.duration&&d.animationSpeed==c.speed);return h||(h=ge.startAnimationAction(l,c),yo.animationActions.push(h)),h},a=ge.sequence();if(i&&i.length>0)for(const l of i)a.addAction(r(t,l));if(n&&n.length>0){const l=a.actions.length==0?a:ge.sequence();for(const c of n)l.addAction(r(t,c));l.makeLooping(),a!==l&&a.addAction(l)}return s&&s>0&&a.actions.unshift(ge.waitAction(s)),a}static getAndRegisterAnimationSequences(e,t,i){if(!t)return;const n=t.getComponent(yt),s=t.getComponent(Dt);if(!n&&!s)return;if(n&&!i)throw new Error("PlayAnimationOnClick: No stateName specified for animator "+n.name+" on "+t.name);let r=[],a=[];if(s){const f=e.registerAnimation(t,s.clip);f&&(s.loop?a.push(f):r.push(f));let g=0;if(s.minMaxOffsetNormalized){const y=s.minMaxOffsetNormalized.x,_=s.minMaxOffsetNormalized.y;g=(s.clip?.duration||1)*(y+Math.random()*(_-y))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:g}}const l=n?.runtimeAnimatorController;let c=l?.findState(i),h=[],d=[];if(l&&c){const f=new Array;f.push(c);let g=!1;for(;f.length<100;){if(!c||c===null||!c.transitions||c.transitions.length===0){c.motion?.isLooping&&(g=!0);break}const y=c.transitions.find(w=>w.conditions.length===0),_=y?l.getState(y.destinationState,0):null;if(_&&f.includes(_)){c=_,g=!0;break}else if(y){if(c=_,!c)break;f.push(c)}else{g=c.motion?.isLooping??!1;break}}if(g&&c){const y=f.indexOf(c);h=f.slice(0,y),d=f.slice(y),Hx&&console.log("found loop from "+i,"states until loop",h,"states looping",d)}else h=f,d=[],Hx&&console.log("found no loop from "+i,"states",h);if(!d.length){const y=h[h.length-1],_=y.motion?.clip;if(_){let w;if(e.holdClipMap.has(_))w=e.holdClipMap.get(_);else{const P=y.name+"_hold";w=_.clone(),w.duration=1,w.name=P;const M=_.duration;w.tracks=_.tracks.map(O=>{const j=O.clone();j.times=new Float32Array([0,M]);const I=O.values.length,N=O.getValueSize(),V=O.values.slice(I-N,I);return j.values=new Float32Array(2*N),j.values.set(V,0),j.values.set(V,N),j}),w.name=P,e.holdClipMap.set(_,w)}if(w){const P={name:w.name,motion:{clip:w,isLooping:!1,name:w.name},speed:1,transitions:[],behaviours:[],hash:y.hash+1};d.push(P)}}}}if(h.length===1&&(!h[0].motion?.clip||h[0].motion?.clip.tracks?.length===0)){r=new Array;const f=e.registerAnimation(t,null);f&&r.push(f);return}if(h=h.filter(f=>f.motion?.clip&&f.motion?.clip.tracks?.length>0),d=d.filter(f=>f.motion?.clip&&f.motion?.clip.tracks?.length>0),h.length===0&&d.length===0){console.warn("No clips found for state "+i+" on "+n?.name+", can't export animation data");return}const p=(f,g)=>{if(!t)return;const y=e.registerAnimation(t,f.motion.clip??null);y?(y.speed=f.speed,g.push(y)):console.warn("Couldn't register animation for state "+f.name+" on "+n?.name)};if(h.length>0){r=new Array;for(const f of h)p(f,r)}if(d.length>0){a=new Array;for(const f of d)p(f,a)}let m=0;if(n&&l&&n.minMaxOffsetNormalized){const f=n.minMaxOffsetNormalized.x,g=n.minMaxOffsetNormalized.y;m=((h.length?h[0]:d.length?d[0]:null)?.motion.clip?.duration||1)*(f+Math.random()*(g-f))}return{animationSequence:r,animationLoopAfterSequence:a,randomTimeOffset:m}}createAnimation(e,t,i){if(!this.target||!this.animator&&!this.animation)return;const n=yo.getAndRegisterAnimationSequences(e,this.target,this.stateName);n&&(this.animationSequence=n.animationSequence,this.animationLoopAfterSequence=n.animationLoopAfterSequence,this.randomOffsetNormalized=n.randomTimeOffset,this.stateAnimationModel=t)}};Be([u(yt)],yy.prototype,"animator"),Be([u()],yy.prototype,"stateName");let Jc=yy;class fl extends R{getType(){}target;getDuration(){}}Be([u(k)],fl.prototype,"target");class eh extends R{target}Be([u(fl)],eh.prototype,"target");class th extends fl{type=1;duration=1;getType(){switch(this.type){case 1:return"hide";case 0:return"show"}}getDuration(){return this.duration}}Be([u()],th.prototype,"type"),Be([u()],th.prototype,"duration");class by extends eh{}class or{static _instance;static create(){return new or}static getOrCreate(){return this._instance||(this._instance=this.create()),this._instance}get isSecureConnection(){return window.location.protocol==="https:"}get quicklookButton(){return this._quicklookButton}_quicklookButton;get arButton(){return this._arButton}_arButton;get vrButton(){return this._vrButton}_vrButton;get sendToQuestButton(){return this._sendToQuestButton}_sendToQuestButton;get qrButton(){return Fn.getOrCreate().createQRCode()}createQuicklookButton(){if(this._quicklookButton)return this._quicklookButton;const e=document.createElement("button");this._quicklookButton=e,e.dataset.needle="quicklook-button";const t=q.supportsQuickLookAR();e.innerText="View in AR",e.prepend(Pt("view_in_ar"));let i=!1,n=null;return e.addEventListener("click",()=>{n=$a(Tn),n||(i=!0,n=new Tn),i&&(n.objectToExport=z.Current.scene),n?(e.classList.add("this-mode-is-requested"),n.exportAndOpen().then(()=>{e.classList.remove("this-mode-is-requested")}).catch(s=>{e.classList.remove("this-mode-is-requested"),console.error(s)})):console.warn("No USDZExporter component found in the scene")}),this.hideElementDuringXRSession(e),e}createARButton(e){if(this._arButton)return this._arButton;const t="immersive-ar",i=document.createElement("button");return this._arButton=i,i.classList.add("webxr-button"),i.dataset.needle="webxr-ar-button",i.innerText="Enter AR",i.prepend(Pt("view_in_ar")),i.title="Click to start an AR session",i.addEventListener("click",()=>Z.start(t,e)),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),q.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>this.updateSessionSupported(i,t)),i}createVRButton(e){if(this._vrButton)return this._vrButton;const t="immersive-vr",i=document.createElement("button");return this._vrButton=i,i.classList.add("webxr-button"),i.dataset.needle="webxr-vr-button",i.innerText="Enter VR",i.prepend(Pt("panorama_photosphere")),i.title="Click to start a VR session",i.addEventListener("click",()=>Z.start(t,e)),this.updateSessionSupported(i,t),this.listenToXRSessionState(i,t),this.hideElementDuringXRSession(i),this.isSecureConnection||(i.disabled=!0,i.title="WebXR requires a secure connection (HTTPS)"),q.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>this.updateSessionSupported(i,t)),i}createSendToQuestButton(){if(this._sendToQuestButton)return this._sendToQuestButton;const e="https://oculus.com/open_url/?url=",t=document.createElement("button");return this._sendToQuestButton=t,t.dataset.needle="webxr-sendtoquest-button",t.innerText="Open on Quest",t.prepend(Pt("share_windows")),t.title="Click to send this page to the Oculus Browser on your Quest",t.addEventListener("click",()=>{const i=encodeURIComponent(window.location.href),n=e+i;window.open(n)==null&&Te("This page doesn't allow popups. Please paste "+n+" into your browser.")}),this.listenToXRSessionState(t),this.hideElementDuringXRSession(t),q.isMozillaXR()||navigator.xr?.addEventListener("devicechange",()=>{navigator.xr?.isSessionSupported("immersive-vr")?t.style.display="none":t.style.display=""}),t}createQRCode(){return Fn.getOrCreate().createQRCode()}updateSessionSupported(e,t){if(!("xr"in navigator)){e.style.display="none";return}Z.isSessionSupported(t).then(i=>{e.style.display=i?"":"none",A()&&!i&&console.log('[WebXR] "'+t+'" is not supported on this device \u2013 make sure your server runs using HTTPS and you have a device connected that supports '+t)})}hideElementDuringXRSession(e){Nd(t=>{e["previous-display"]=e.style.display,e.style.display="none"}),cg(t=>{e["previous-display"]!=null&&(e.style.display=e["previous-display"])})}listenToXRSessionState(e,t){t&&(Z.onSessionRequestStart(i=>{i.mode===t?e.classList.add("this-mode-is-requested"):(e["was-disabled"]=e.disabled,e.disabled=!0,e.classList.add("other-mode-is-requested"))}),Z.onSessionRequestEnd(i=>{e.classList.remove("this-mode-is-requested"),e.classList.remove("other-mode-is-requested"),e.disabled=e["was-disabled"]}))}}var mE=Object.defineProperty,gE=Object.getOwnPropertyDescriptor,_t=(o,e,t,i)=>{for(var n=i>1?void 0:i?gE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&mE(e,t,n),n};const ih=v("debugspriterenderer"),fE=v("wireframe");class va{static cache={};static getOrCreateGeometry(e){if(e.__cached_geometry)return e.__cached_geometry;if(e.guid&&va.cache[e.guid])return ih&&console.log("Take cached geometry for sprite",e.guid),va.cache[e.guid];const t=new gn;e.__cached_geometry=t;const i=new Float32Array(e.triangles.length*3),n=new Float32Array(e.triangles.length*2);for(let s=0;s<e.triangles.length;s+=1){const r=e.triangles[s];i[s*3]=-e.vertices[r].x,i[s*3+1]=e.vertices[r].y,i[s*3+2]=0;const a=e.uv[r];n[s*2]=a.x,n[s*2+1]=1-a.y}return t.setAttribute("position",new mt(i,3)),t.setAttribute("uv",new mt(n,2)),e.guid&&(this.cache[e.guid]=t),ih&&console.log("Built sprite geometry",e,t),t}}class yE{x;y}function Gx(o){o&&(o.colorSpace!=Co&&(o.colorSpace=Co,o.needsUpdate=!0),o.minFilter==Cd&&o.magFilter==Cd&&(o.anisotropy=1,o.needsUpdate=!0))}let Wo=class{constructor(o){o&&(this.texture=o,this.triangles=[0,1,2,0,2,3],this.uv=[{x:0,y:0},{x:1,y:0},{x:1,y:1},{x:0,y:1}],this.vertices=[{x:-.5,y:-.5},{x:.5,y:-.5},{x:.5,y:.5},{x:-.5,y:.5}])}guid;texture;triangles;uv;vertices;__cached_geometry;get mesh(){return this._mesh||(this._mesh=new G(va.getOrCreateGeometry(this),this.material)),this._mesh}_mesh;get material(){return this._material||(this.texture&&Gx(this.texture),this._material=new xe({map:this.texture,color:16777215,side:Ci,transparent:!0})),this._material}_material;getGeometry(){return va.getOrCreateGeometry(this)}};_t([u()],Wo.prototype,"guid",2),_t([u(Le)],Wo.prototype,"texture",2),_t([qe()],Wo.prototype,"triangles",2),_t([qe()],Wo.prototype,"uv",2),_t([qe()],Wo.prototype,"vertices",2);const _y=Symbol("spriteOwner");class yl{sprites;constructor(){this.sprites=[]}}_t([u(Wo)],yl.prototype,"sprites",2);const vy=class X0{static create(){const e=new X0;return e.spriteSheet=new yl,e}constructor(){}clone(){const e=new X0;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 yl,this.spriteSheet.sprites=[e],this.index=0))}get sprite(){if(this.spriteSheet)return this.spriteSheet.sprites[this.index]}spriteSheet;index=0;update(e){if(!this.spriteSheet)return;const t=this.index;if(t<0||t>=this.spriteSheet.sprites.length)return;const i=this.spriteSheet.sprites[t],n=i?.texture;if(n&&(Gx(n),!i.__hasLoadedProgressive)){i.__hasLoadedProgressive=!0;const s=n;Ve.assignTextureLOD(n,0).then(r=>{r instanceof Le&&(i.texture=r,e?.map===s&&(e.map=r,e.needsUpdate=!0))})}}};_t([u(yl)],vy.prototype,"spriteSheet",2),_t([u()],vy.prototype,"index",2);let bl=vy;class mi extends R{drawMode=0;size={x:1,y:1};color;sharedMaterial;transparent=!0;cutoutThreshold=0;castShadows=!1;renderOrder=0;toneMapped=!0;set texture(e){if(!this._spriteSheet)return;const t=this._spriteSheet.spriteSheet?.sprites[this.spriteIndex];t&&(t.texture=e,this.updateSprite())}addSprite(e,t=!1){if(this._spriteSheet||(this._spriteSheet=bl.create()),!this._spriteSheet.spriteSheet)return-1;this._spriteSheet.spriteSheet?.sprites.push(e);const i=this._spriteSheet.spriteSheet?.sprites.length-1;return t&&(this.spriteIndex=i),i}get sprite(){return this._spriteSheet}set sprite(e){if(e!==this._spriteSheet)if(typeof e=="number"){const t=Math.round(e);ih&&console.log("[SpriteSheet] Set index to "+t+" (was "+this.spriteIndex+")",e),this.spriteIndex=t}else e instanceof Wo?(this._spriteSheet||(this._spriteSheet=bl.create()),this._spriteSheet.sprite!=e&&(this._spriteSheet.sprite=e),this.updateSprite()):e!=this._spriteSheet&&(this._spriteSheet=e,this.updateSprite())}set spriteIndex(e){this._spriteSheet&&(this._spriteSheet.index=e,this.updateSprite())}get spriteIndex(){return this._spriteSheet?.index??0}get spriteFrames(){return this._spriteSheet?.spriteSheet?.sprites.length??0}_spriteSheet;_currentSprite;awake(){this._currentSprite=void 0,this._spriteSheet?this._spriteSheet=this._spriteSheet.clone():this._spriteSheet=bl.create(),ih&&console.log("Awake",this.name,this,this.sprite)}start(){this._currentSprite?this.gameObject&&this.gameObject.add(this._currentSprite):this.updateSprite()}updateSprite(e=!1){if(!this.__didAwake&&!e)return!1;const t=this._spriteSheet;if(!t?.spriteSheet?.sprites)return console.warn("SpriteRenderer has no data or spritesheet assigned..."),!1;const i=t.spriteSheet.sprites[this.spriteIndex];if(!i)return ih&&console.warn("Sprite not found",this.spriteIndex,t.spriteSheet.sprites),!1;if(this._currentSprite)this._currentSprite.geometry=va.getOrCreateGeometry(i),this._currentSprite.material.map=i.texture;else{const n=new xe({color:16777215,side:Ci});if(fE&&(n.wireframe=!0),this.color&&(n.color||(n.color=new ne),n.color.copy(this.color),n.opacity=this.color.alpha),n.transparent=!0,n.toneMapped=this.toneMapped,n.depthWrite=!1,i.texture&&!n.wireframe){let s=i.texture;s[_y]!==void 0&&s[_y]!==this&&this.spriteFrames>1&&(s=i.texture=s.clone()),s[_y]=this,n.map=s}this.sharedMaterial=n,this._currentSprite=new G(va.getOrCreateGeometry(i),n),this._currentSprite.renderOrder=Math.round(this.renderOrder),Ve.assignTextureLOD(n,0)}return this._currentSprite.parent!==this.gameObject&&(this.drawMode===2&&this._currentSprite.scale.set(this.size.x,this.size.y,1),this.gameObject&&this.gameObject.add(this._currentSprite)),this._currentSprite&&this._currentSprite.layers.set(this.layer),this.sharedMaterial&&(this.sharedMaterial.alphaTest=this.cutoutThreshold,this.sharedMaterial.transparent=this.transparent),this._currentSprite.castShadow=this.castShadows,t?.update(this.sharedMaterial),!0}}_t([u()],mi.prototype,"drawMode",2),_t([u(yE)],mi.prototype,"size",2),_t([u(oe)],mi.prototype,"color",2),_t([u(ve)],mi.prototype,"sharedMaterial",2),_t([u()],mi.prototype,"transparent",2),_t([u()],mi.prototype,"cutoutThreshold",2),_t([u()],mi.prototype,"castShadows",2),_t([u()],mi.prototype,"renderOrder",2),_t([u()],mi.prototype,"toneMapped",2),_t([u(bl)],mi.prototype,"sprite",1);const qx=v("debugwebxr"),bE=new K().makeRotationY(Math.PI);class Ni extends R{static _eventListeners={};static onPlaced(e){const t="placed";return this._eventListeners[t]||(this._eventListeners[t]=[]),this._eventListeners[t].push(e),()=>{const i=this._eventListeners[t].indexOf(e);i>=0&&this._eventListeners[t].splice(i,1)}}static _hasPlaced=!1;static get hasPlaced(){return this._hasPlaced}get arScale(){return this._arScale}set arScale(e){this._arScale=Math.max(1e-6,e),this.onSetScale()}_arScale=1;invertForward=!1;customReticle;arTouchTransform=!0;autoPlace=!1;autoCenter=!1;useXRAnchor=!1;_isPlacing=!0;_startOffset=new K;_createdPlacementObject=null;_reparentedComponents=[];_placementScene=new wi;_reticle=[];_hits=[];_placementStartTime=-1;_rigPlacementMatrix;_anchor=null;userInput;onEnable(){this.customReticle?.preload()}supportsXR(e){return e==="immersive-ar"}onEnterXR(e){qx&&console.log("ENTER WEBXR: SessionRoot start..."),this._anchor=null,Ni._hasPlaced=!1,this.gameObject.updateMatrixWorld(),this._startOffset.copy(this.gameObject.matrixWorld);const t=new k;this._createdPlacementObject=t,t.name="AR Session Root",this._placementScene.name="AR Placement Scene",this._placementScene.children.length=0;for(let i=this.context.scene.children.length-1;i>=0;i--){const n=this.context.scene.children[i];this._placementScene.add(n)}if(this.context.scene.add(t),this.autoCenter){const i=Xt(this._placementScene.children),n=i.getCenter(new b),s=i.getSize(new b),r=new K;r.makeTranslation(n.x,n.y-s.y*.5,n.z),this._startOffset.multiply(r)}this._reparentedComponents.length=0,this._reparentedComponents.push({comp:this,originalObject:this.gameObject}),x.addComponent(t,this);for(const i of this._reticle)Zi(i);this._reticle.length=0,this._isPlacing=!0,this.context.input.addEventListener("pointerup",this.onPlaceScene,{queue:ai.Early})}onLeaveXR(){this.context.input.removeEventListener("pointerup",this.onPlaceScene,{queue:ai.Early}),this.onRevertSceneChanges(),this._anchor=null,Ni._hasPlaced=!1,this._rigPlacementMatrix=void 0}onUpdateXR(e){if(e.xr.isTrackingImages){for(const t of this._reticle)t.visible=!1;return}if(this._isPlacing){const t=e.xr.rig?.gameObject;t&&t.parent!==this.context.scene&&this.context.scene.add(t);let i=!1;if(e.xr.isPassThrough&&e.xr.controllers.length>0&&!this.autoPlace)for(const n of e.xr.controllers){const s=n.getHitTest();s&&(i=!0,this.updateReticleAndHits(e.xr,n.index,s,e.xr.rigScale))}if(!i){const n=e.xr.getHitTest();n&&this.updateReticleAndHits(e.xr,0,n,e.xr.rigScale)}}else{if(this._anchor&&e.xr.referenceSpace){const t=e.xr.frame.getPose(this._anchor.anchorSpace,e.xr.referenceSpace);if(t&&this.context.time.frame%20===0){const i=e.xr.convertSpace(t.transform),n=this._reticle[0];n&&(n.position.copy(i.position),n.quaternion.copy(i.quaternion),this.onApplyPose(n))}}if(this.arTouchTransform?(this.userInput||(this.userInput=new hm(this.context)),this.userInput?.enable()):this.userInput?.disable(),this.arTouchTransform&&this.userInput?.hasChanged){if(e.xr.rig){const t=e.xr.rig.gameObject;this.userInput.applyMatrixTo(t.matrix,!0),t.matrix.decompose(t.position,t.quaternion,t.scale),this.userInput.factor=t.scale.x}this.userInput.reset()}}}updateReticleAndHits(e,t,i,n){this._hits[t]=i.hit;let s=this._reticle[t];if(!s){if(this.customReticle)if(this.customReticle.asset)s=qa(this.customReticle.asset);else{this.customReticle.loadAssetAsync();return}else s=new G(new _C(.07,.09,32).rotateX(-Math.PI/2),new xe({side:Ci,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1,color:15658734})),s.name="AR Placement Reticle";if(qx){const r=new Si(1);r.position.y+=.01,s.add(r)}this._reticle[t]=s,s.matrixAutoUpdate=!1,s.visible=!1}if(s.lastPos=s.lastPos||i.position.clone(),s.lastQuat=s.lastQuat||i.quaternion.clone(),s.position.copy(s.lastPos.lerp(i.position,this.context.time.deltaTime/.1)),s.lastPos.copy(s.position),s.quaternion.copy(s.lastQuat.slerp(i.quaternion,this.context.time.deltaTime/.05)),s.lastQuat.copy(s.quaternion),s.scale.set(n,n,n),this.customReticle&&this.applyViewBasedTransform(s),s.updateMatrix(),s.visible=!0,s.parent!==this.context.scene&&this.context.scene.add(s),this._placementStartTime<0&&(this._placementStartTime=this.context.time.realtimeSinceStartup),this.autoPlace)if(this.upVec.set(0,1,0).applyQuaternion(s.quaternion),this.upVec.dot(D(0,1,0))>.9){let r=s["autoplace:timer"]||0;r>=1?(s.visible=!1,this.onPlaceScene(null)):(r+=this.context.time.deltaTime,s["autoplace:timer"]=r)}else s["autoplace:timer"]=0}onPlaceScene=e=>{if(this._isPlacing==!1||e?.used)return;let t=this._reticle[0];if(!t){console.warn("No reticle to place...");return}if(!t.visible&&!this.autoPlace){console.warn("Reticle is not visible (can not place)");return}if(Z.active?.isTrackingImages){console.warn("Scene Placement is disabled while images are being tracked");return}let i=this._hits[0];if(e&&e.origin instanceof hg){const n=this._reticle[e.origin.index];n&&(t=n,i=this._hits[e.origin.index])}if(e&&(e.stopImmediatePropagation(),e.stopPropagation(),e.use()),this._isPlacing=!1,this.context.input.removeEventListener("pointerup",this.onPlaceScene),this.onRevertSceneChanges(),t.position.copy(t.lastPos),t.quaternion.copy(t.lastQuat),this.onApplyPose(t),Ni._hasPlaced=!0,this.useXRAnchor&&this.onCreateAnchor(Z.active,i),this.context.xr)for(const n of this.context.xr.controllers)n.cancelHitTestSource()};onSetScale(){if(!Ni._hasPlaced)return;const e=Z.active?.rig?.gameObject;if(e){const t=Z.active?.rigScale||1,i=1/this._arScale*t,n=new K().makeScale(i,i,i).invert();e.matrix.premultiply(n),e.matrix.decompose(e.position,e.quaternion,e.scale)}}onRevertSceneChanges(){for(const e of this._reticle)e&&(e.visible=!1,e?.removeFromParent());this._reticle.length=0;for(let e=this._placementScene.children.length-1;e>=0;e--){const t=this._placementScene.children[e];this.context.scene.add(t)}this._createdPlacementObject?.removeFromParent();for(const e of this._reparentedComponents)x.addComponent(e.originalObject,e.comp)}async onCreateAnchor(e,t){if(t.createAnchor===void 0){console.warn("Hit does not support creating an anchor",t),A()&&ye("Hit does not support creating an anchor");return}else{const i=await t.createAnchor(e.viewerPose.transform);e.running&&i&&(this._anchor=i)}}upVec=new b(0,1,0);lookPoint=new b;worldUpVec=new b(0,1,0);applyViewBasedTransform(e){const t=this.context.mainCamera,i=e,n=t.worldPosition,s=i.worldPosition;this.upVec.set(0,1,0).applyQuaternion(e.quaternion);const r=t.worldPosition;r&&e.position.clone().sub(r).angleTo(this.upVec)<Math.PI/2&&this.upVec.negate();const a=this.upVec.angleTo(this.worldUpVec)*180/Math.PI,l=30;a>l&&a<180-l||a<-l&&a>-180+l?(this.lookPoint.copy(e.position).add(this.upVec),this.lookPoint.y=e.position.y,e.lookAt(this.lookPoint)):(n.y=s.y,e.lookAt(n))}onApplyPose(e){const t=Z.active?.rig?.gameObject;if(!t){console.warn("No rig object to place");return}const i=t.parent||this.context.scene;this._rigPlacementMatrix?this._rigPlacementMatrix?.decompose(t.position,t.quaternion,t.scale):this._rigPlacementMatrix=t.matrix.clone(),this.applyViewBasedTransform(e),e.updateMatrix(),this.context.scene.add(e),e.attach(t),e.removeFromParent(),t.scale.set(this.arScale,this.arScale,this.arScale),t.position.multiplyScalar(this.arScale),t.updateMatrix(),this.invertForward&&t.matrix.premultiply(bE),t.matrix.premultiply(this._startOffset),t.matrix.decompose(t.position,t.quaternion,t.scale),i.add(t)}}class hm{static up=new b(0,1,0);static zero=new b(0,0,0);static one=new b(1,1,1);oneFingerDrag=!0;twoFingerRotate=!0;twoFingerScale=!0;factor=1;context;offset;plane;_scale=1;_hasChanged=!1;get scale(){return this._scale}constructor(e){this.context=e,this.offset=new K,this.plane=new hr,this.plane.setFromNormalAndCoplanarPoint(hm.up,hm.zero)}_enabled=!1;reset(){this._scale=1,this.offset.identity(),this._hasChanged=!0}get hasChanged(){return this._hasChanged}applyMatrixTo(e,t){this._hasChanged=!1,t?(this.offset.invert(),e.premultiply(this.offset)):e.multiply(this.offset)}currentlyUsedPointerIds=new Set;currentlyUnusedPointerIds=new Set;get isActive(){return this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.size>0}enable(){this._enabled||(this._enabled=!0,this.context.input.addEventListener("pointerdown",this.onPointerDownEarly,{queue:ai.Early}),this.context.input.addEventListener("pointerdown",this.onPointerDownLate,{queue:ai.Late}),this.context.input.addEventListener("pointerup",this.onPointerUpEarly,{queue:ai.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:ai.Early}),this.context.input.removeEventListener("pointerdown",this.onPointerDownLate,{queue:ai.Late}),this.context.input.removeEventListener("pointerup",this.onPointerUpEarly,{queue:ai.Early}),window.removeEventListener("touchstart",this.touchStart),window.removeEventListener("touchmove",this.touchMove),window.removeEventListener("touchend",this.touchEnd))}onPointerDownEarly=e=>{this.isActive&&e.stopPropagation()};onPointerDownLate=e=>{e.used?this.currentlyUsedPointerIds.add(e.pointerId):this.currentlyUsedPointerIds.size<=0&&this.currentlyUnusedPointerIds.add(e.pointerId)};onPointerUpEarly=e=>{this.currentlyUsedPointerIds.delete(e.pointerId),this.currentlyUnusedPointerIds.delete(e.pointerId)};prev=new Map;_didMultitouch=!1;touchStart=e=>{if(!e.defaultPrevented)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=q.isAndroidDevice()&&i.clientY<window.innerHeight*.1;this.prev.has(i.identifier)||this.prev.set(i.identifier,{ignore:n,x:0,z:0,screenx:0,screeny:0});const s=this.prev.get(i.identifier);if(s){const r=this.getPositionOnPlane(i.clientX,i.clientY);s.x=r.x,s.z=r.z,s.screenx=i.clientX,s.screeny=i.clientY}}};touchEnd=e=>{e.touches.length<=0&&(this._didMultitouch=!1);for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t];this.prev.delete(i.identifier)}};touchMove=e=>{if(!e.defaultPrevented&&this.isActive){if(e.touches.length===1){if(this._didMultitouch)return;const t=e.touches[0],i=this.prev.get(t.identifier);if(!i||i.ignore)return;const n=this.getPositionOnPlane(t.clientX,t.clientY),s=n.x-i.x,r=n.z-i.z;if(s===0&&r===0)return;this.oneFingerDrag&&this.addMovement(s,r),i.x=n.x,i.z=n.z,i.screenx=t.clientX,i.screeny=t.clientY;return}else if(e.touches.length===2){this._didMultitouch=!0;const t=e.touches[0],i=e.touches[1],n=this.prev.get(t.identifier),s=this.prev.get(i.identifier);if(!n||!s)return;if(this.twoFingerRotate){const r=Math.atan2(t.clientY-i.clientY,t.clientX-i.clientX),a=Math.atan2(n.screeny-s.screeny,n.screenx-s.screenx),l=r-a;Math.abs(l)>.001&&this.addRotation(l)}if(this.twoFingerScale){const r=t.clientX-i.clientX,a=t.clientY-i.clientY,l=Math.sqrt(r*r+a*a),c=n.screenx-s.screenx,h=n.screeny-s.screeny,d=Math.sqrt(c*c+h*h),p=l-d;Math.abs(p)>2&&this.addScale(p)}n.screenx=t.clientX,n.screeny=t.clientY,s.screenx=i.clientX,s.screeny=i.clientY}}};_raycaster=new bd;_intersection=new b;_screenPos=new b;getPositionOnPlane(e,t){const i=this.context.mainCamera;return this._screenPos.x=e/window.innerWidth*2-1,this._screenPos.y=-(t/window.innerHeight)*2+1,this._screenPos.z=1,this._screenPos.unproject(i),this._raycaster.set(i.position,this._screenPos.sub(i.position)),this._raycaster.ray.intersectPlane(this.plane,this._intersection),this._intersection}addMovement(e,t){e/=this._scale,t/=this._scale,e*=this.factor,t*=this.factor,this.offset.elements[12]+=e,this.offset.elements[14]+=t,(e!==0||t!==0)&&(this._hasChanged=!0)}_tempMatrix=new K;addScale(e){e/=window.innerWidth,e*=-1,this._scale*=1+e,this._tempMatrix.makeScale(1-e,1-e,1-e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}addRotation(e){e*=-1,this._tempMatrix.makeRotationY(e),this.offset.premultiply(this._tempMatrix),e!==0&&(this._hasChanged=!0)}}const Ls=v("debugautosync"),wy=Symbol("syncerId");class _E{_syncers={};getOrCreateSyncer(e){if(!e.guid)return null;if(this._syncers[e.guid])return this._syncers[e.guid];const t=new vE(e);return t[wy]=e.guid,this._syncers[t[wy]]=t,t}removeSyncer(e){delete this._syncers[e[wy]]}}const xy=new _E;class vE{comp;constructor(e){this.comp=e}hasChanges=!1;changedProperties={};get networkingKey(){return this.comp.guid}_isReceiving=!1;_isInit=!1;init(e){if(this._isInit)return;this._isInit=!0,this.comp=e,this.comp.context.post_render_callbacks.push(this.onHandleSending),this.comp.context.connection.beginListen(this.networkingKey,this.onHandleReceiving);const t=this.comp.context.connection.tryGetState(this.comp.guid);t&&this.onHandleReceiving(t)}destroy(){this._isInit&&(this.comp.context.post_render_callbacks.splice(this.comp.context.post_render_callbacks.indexOf(this.onHandleSending),1),this.comp.context.connection.stopListen(this.networkingKey,this.onHandleReceiving),this.comp=null,this._isInit=!1)}notifyChanged(e,t){this._isReceiving||(Ls&&console.log("Property changed: "+e,t),this.hasChanges=!0,this.changedProperties[e]=t)}onHandleSending=()=>{if(!this.hasChanges)return;this.hasChanges=!1;const e=this.comp.context.connection;if(!e||!e.isConnected||!e.isInRoom){for(const t in this.changedProperties)delete this.changedProperties[t];return}for(const t in this.changedProperties){const i=this.changedProperties[t];Ls&&console.log("SEND",this.comp.guid,this.networkingKey),e.send(this.networkingKey,{guid:this.comp.guid,property:t,data:i},vn.Queued),delete this.changedProperties[t]}};onHandleReceiving=e=>{if(Ls&&console.log("SYNCFIELD RECEIVE",this.comp.name,this.comp.guid,e),!!this._isInit&&this.comp&&e.guid===this.comp.guid)try{this._isReceiving=!0,this.comp[e.property]=e.data}catch(t){console.error(t)}finally{this._isReceiving=!1}}}function wE(o,e){let t=e!==o;return!t&&o&&e&&(Array.isArray(o)&&Array.isArray(e)||typeof o=="object"&&typeof e=="object")&&(t=!0),t}const nh=Symbol("AutoSyncHandler");function xE(o){if(o[nh])return o[nh];const e=xy.getOrCreateSyncer(o);return e?.init(o),o[nh]=e,e}function SE(o){const e=o[nh];e&&(xy.removeSyncer(e),e.destroy(),delete o[nh])}const Sy=function(o=null){return function(e,t){let i="";typeof t=="string"?i=t:i=t.name;let n=null,s;typeof o=="string"?s=e[o]:typeof o=="function"&&(s=o),s==null&&(A()||Ls)&&o!=null&&console.warn('syncField: no callback function found for property "'+i+'"','"'+o+'"');const r=e,a=r.__internalAwake;if(typeof a!="function"){(Ls||A())&&console.error('@syncField can currently only used on Needle Engine Components, custom object of type "'+e?.constructor?.name+'" is not supported',e);return}Ls&&console.log(i);const l=Symbol(i);r.__internalAwake=function(){if(this[l]===void 0){if(this[l]=this[i],n=xy.getOrCreateSyncer(this),Object.getOwnPropertyDescriptor(this,i)?.set===void 0){let h=!1;Object.defineProperty(this,i,{set:function(d){const p=this[l];if(this[l]=d,h){(A()||Ls)&&console.warn("Recursive call detected",i);return}h=!0;try{const m=wE(d,p);Ls&&console.log("SyncField assignment",i,"changed?",m,d,s),m&&s?.call(this,d,p)!==!1&&xE(this)?.notifyChanged(i,d)}finally{h=!1}},get:function(){return this[l]},configurable:!0,enumerable:!0})}n?.init(this),a.call(this)}};const c=r.__internalDestroy;r.__internalDestroy=function(){SE(this),c.call(this)}}};var CE=Object.defineProperty,ap=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&CE(e,t,n),n};const ti=v("debugplayersync"),lp=class fS extends R{static async setupFrom(e,t){const i=ie.getOrCreateFromUrl(e);if(!i.asset){const r=await i.loadAssetAsync();r&&x.getOrAddComponent(r,kn)}const n=new fS;n._internalInit(t),n.asset=i;const s=new k;return s.guid=e,x.addComponent(s,n),n}autoSync=!0;asset;onPlayerSpawned;_localInstance;awake(){this.watchTabVisible(),this.onPlayerSpawned||(this.onPlayerSpawned=new he)}onEnable(){this.context.connection.beginListen(te.RoomStateSent,this.onJoinedRoom),this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(te.LeftRoom,this.destroyInstance),this.context.connection.isInRoom&&this.onJoinedRoom()}onDisable(){this.context.connection.stopListen(te.RoomStateSent,this.onJoinedRoom),this.context.connection.stopListen(te.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(te.LeftRoom,this.destroyInstance)}onJoinedRoom=()=>{ti&&console.log("PlayerSync.joinedRoom. autoSync is set to "+this.autoSync),this.autoSync&&this.getInstance()};async getInstance(){if(this._localInstance)return this._localInstance;if(ti&&console.log("PlayerSync.createInstance",this.asset?.url),!this.asset?.asset&&!this.asset?.url)return console.error('PlayerSync: can not create an instance because "asset" is not set and or has no URL!'),null;this.gameObject.guid||console.warn("PlayerSync: gameObject has no guid! This might cause issues with syncing the player state."),this._localInstance=this.asset?.instantiateSynced({parent:this.gameObject,deleteOnDisconnect:!0},!0);const e=await this._localInstance;if(e){const t=x.getComponentsInChildren(e,kn);if(ti&&console.log(`PlayerSync.createInstance: found ${t?.length} PlayerState components. Owner: ${this.context.connection.connectionId}`),t?.length){for(const i of t)i.owner=this.context.connection.connectionId;this.onPlayerSpawned?.invoke(e)}else this._localInstance=void 0,console.error("<strong>Failed finding PlayerState on "+this.asset?.url+"</strong>: please make sure the asset has a PlayerState component!"),x.destroySynced(e)}else this._localInstance=void 0,console.warn("PlayerSync: failed instantiating asset!");return this._localInstance}destroyInstance=()=>{this._localInstance?.then(e=>{ti&&console.log("PlayerSync.destroyInstance",e),xc(e,this.context.connection,!0,{saveInRoom:!1})}),this._localInstance=void 0};watchTabVisible(){window.addEventListener("visibilitychange",e=>{if(document.visibilityState==="visible")for(let t=kn.all.length-1;t>=0;t--){const i=kn.all[t];(!i.owner||!this.context.connection.userIsInRoom(i.owner))&&i.doDestroy()}})}};ap([u()],lp.prototype,"autoSync"),ap([u(ie)],lp.prototype,"asset"),ap([u(he)],lp.prototype,"onPlayerSpawned");let Cy=lp;var Xx=(o=>(o.OwnerChanged="ownerChanged",o))(Xx||{});const Py=class Et extends R{static _all=[];static get all(){return Et._all}static _local=[];static get local(){return Et._local}static getFor(e){if(e instanceof k)return x.getComponentInParent(e,Et);if(e instanceof R)return x.getComponentInParent(e.gameObject,Et)}static isLocalPlayer(e){return Et.getFor(e)?.isLocalPlayer??!1}static _callbacks={};static addEventListener(e,t){return this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t),t}static removeEventListener(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i>=0&&this._callbacks[e].splice(i,1)}static dispatchEvent(e,t){if(this._callbacks[e])for(const i of this._callbacks[e])i(t)}onOwnerChangeEvent=new he;onFirstOwnerChangeEvent=new he;hasOwner=!1;owner;dontDestroy=!1;get isLocalPlayer(){return this.owner===this.context.connection.connectionId}onOwnerChange(e,t){ti&&console.log(`PlayerSync.onOwnerChange: ${t} \u2192 ${e} (me: ${this.context.connection.connectionId})`);const i=Et._local.indexOf(this);i>=0&&Et._local.splice(i,1);const n={playerState:this,oldValue:t,newValue:e};if(this.hasOwner||(this.hasOwner=!0,this.onFirstOwnerChangeEvent?.invoke(n)),this.onOwnerChangeEvent?.invoke(n),this.owner===this.context.connection.connectionId){Et._local.push(this);const r=new CustomEvent("local-owner-changed",{detail:n});this.dispatchEvent(r)}const s=new CustomEvent("owner-changed",{detail:n});this.dispatchEvent(s),Et.dispatchEvent("ownerChanged",s)}awake(){Et.all.push(this),ti&&console.log("Registered new PlayerState",this.guid,Et.all.length-1,Et.all),this.context.connection.beginListen(te.UserLeftRoom,this.onUserLeftRoom)}async start(){ti&&console.log("PLAYERSTATE.START, owner: "+this.owner,this.context.connection.usersInRoom([])),this.owner?(this.context.connection.isInRoom||await Wn(300),this.context.connection.userIsInRoom(this.owner)==!1&&(ti&&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||(ti&&console.warn("PlayerState.start \u2192 owner is undefined!",this.name),setTimeout(()=>{!this.destroyed&&!this.owner?this.dontDestroy?ti&&console.warn("PlayerState.start \u2192 owner is still undefined but dontDestroy is set to true",this.name):(ti&&console.warn(`PlayerState.start \u2192 owner is still undefined: destroying "${this.name}" instance now`),this.doDestroy()):ti&&console.log("PlayerState.start \u2192 owner is assigned",this.owner)},2e3))}doDestroy(){ti&&console.log("PlayerSync.doDestroy \u2192 syncDestroy",this.name),xc(this.gameObject,this.context.connection,!0,{saveInRoom:!1})}onDestroy(){if(ti&&console.warn("PlayerState.onDestroy",this.owner),this.context.connection.stopListen(te.UserLeftRoom,this.onUserLeftRoom),Et.all.splice(Et.all.indexOf(this),1),this.isLocalPlayer){const e=Et._local.indexOf(this);e>=0&&Et._local.splice(e,1)}}onUserLeftRoom=e=>{if(e.userId===this.owner){ti&&console.log("PLAYERSYNC LEFT",this.owner),this.doDestroy();return}}};ap([Sy(Py.prototype.onOwnerChange)],Py.prototype,"owner");let kn=Py;var PE=Object.defineProperty,_l=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&PE(e,t,n),n};class ro extends R{position="bottom";showNeedleLogo=!1;showSpatialMenu;createFullscreenButton;createMuteButton;createQRCodeButton;onEnable(){this.applyOptions()}applyOptions(){this.context.menu.setPosition(this.position),this.context.menu.showNeedleLogo(this.showNeedleLogo),this.createFullscreenButton===!0&&this.context.menu.showFullscreenOption(!0),this.createMuteButton===!0&&this.context.menu.showAudioPlaybackOption(!0),this.showSpatialMenu===!0&&this.context.menu.showSpatialMenu(this.showSpatialMenu),this.createQRCodeButton===!0&&(q.isMobileDevice()||this.context.menu.showQRCodeButton(!0))}}_l([u()],ro.prototype,"position"),_l([u()],ro.prototype,"showNeedleLogo"),_l([u()],ro.prototype,"showSpatialMenu"),_l([u()],ro.prototype,"createFullscreenButton"),_l([u()],ro.prototype,"createMuteButton"),_l([u()],ro.prototype,"createQRCodeButton");var OE=Object.defineProperty,Oy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&OE(e,t,n),n};const oh=v("debugwebxr"),Qx=new U().setFromAxisAngle(new b(0,1,0),Math.PI);class js extends R{head;leftHand;rightHand;_leftHandMeshes;_rightHandMeshes;_syncTransforms;async onEnterXR(e){if(!this.activeAndEnabled)return;oh&&console.warn("AVATAR ENTER XR",this.guid,this.sourceId,this,this.activeAndEnabled),this._syncTransforms&&(this._syncTransforms.length=0),await this.prepareAvatar();const t=kn.getFor(this);if(t?.owner){const i=this.gameObject.addComponent(Ie);i.avatar=this.gameObject,i.connectionId=t.owner}else this.context.connection.isConnected?console.error("No player state found for avatar",this):t&&!this.context.connection.isConnected&&(t.dontDestroy=!0)}onLeaveXR(e){const t=this.gameObject.getComponent(Ie);t&&t.destroy()}onUpdateXR(e){if(!this.activeAndEnabled)return;const t=kn.isLocalPlayer(this);if(!t)return;const i=e.xr;if(i.rig&&i.rig.gameObject!==this.gameObject.parent&&(this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),this.gameObject.scale.set(1,1,1),i.rig.gameObject.add(this.gameObject)),this._syncTransforms&&t)for(const l of this._syncTransforms)l.fastMode=!0,l.isOwned()||l.requestOwnership();if(this.head&&this.context.mainCamera){const l=this.head.asset;if(l.position.copy(this.context.mainCamera.position),l.position.x*=-1,l.position.z*=-1,l.quaternion.copy(this.context.mainCamera.quaternion),l.quaternion.x*=-1,this.context.time.frameCount%10===0&&this.head.asset){const c=x.getComponentsInChildren(this.head.asset,en);for(const h of c)h.enabled=!1,h.gameObject.visible=!1}}const n=e.xr.leftController,s=this.leftHand?.asset;n&&s?(s.position.copy(n.gripPosition),s.quaternion.copy(n.gripQuaternion),s.quaternion.multiply(Qx),s.visible=n.isTracking,this.updateHandVisibility(n,s,this._leftHandMeshes)):s&&s.visible&&(s.visible=!1);const r=e.xr.rightController,a=this.rightHand?.asset;r&&a?(a.position.copy(r.gripPosition),a.quaternion.copy(r.gripQuaternion),a.quaternion.multiply(Qx),a.visible=r.isTracking,this.updateHandVisibility(r,a,this._rightHandMeshes)):a&&a.visible&&(a.visible=!1)}onBeforeRender(){this.context.xr&&this.context.time.frame%10===0&&this.updateRemoteAvatarVisibility()}updateHandVisibility(e,t,i){if(i){const n=e.model&&e.model.visible&&e.model!==t;i.forEach(s=>{Ao(s,!n)})}}updateRemoteAvatarVisibility(){if(this.context.connection.isConnected){const e=kn.getFor(this);if(e&&e.isLocalPlayer==!1){const t=Z.getXRSync(this.context);if(t&&t.hasState(e.owner)){this.tryFindAvatarObjectsIfMissing();const i=this.leftHand?.asset;i&&(i.visible=t?.isTracking(e.owner,"left")??!1);const n=this.rightHand?.asset;n&&(n.visible=t?.isTracking(e.owner,"right")??!1)}if(this.head?.asset){const i=x.getComponentsInChildren(this.head.asset,en);for(const n of i)n.enabled=!1,n.gameObject.visible=!0}}}}tryFindAvatarObjectsIfMissing(){if(!this.head||!this.leftHand||!this.rightHand){const e={head:this.head,leftHand:this.leftHand,rightHand:this.rightHand};G_.tryFindAvatarObjects(this.gameObject,this.sourceId||"",e),e.head&&(this.head=e.head),e.leftHand&&(this.leftHand=e.leftHand),e.rightHand&&(this.rightHand=e.rightHand)}}async prepareAvatar(){if(this.tryFindAvatarObjectsIfMissing(),this.head)this.head instanceof k&&(this.head=new ie("",this.sourceId,this.head));else{const e=new k;e.name="Head";const t=Sr.createPrimitive(xr.Cube);e.add(t),this.gameObject.add(e),this.head=new ie("",this.sourceId,e),oh&&console.log("Create head",e)}if(this.rightHand)this.rightHand instanceof k&&(this.rightHand=new ie("",this.sourceId,this.rightHand));else{const e=new k;e.name="Right Hand",this.gameObject.add(e),this.rightHand=new ie("",this.sourceId,e),oh&&console.log("Create right hand",e)}if(this.leftHand)this.leftHand instanceof k&&(this.leftHand=new ie("",this.sourceId,this.leftHand));else{const e=new k;e.name="Left Hand",this.gameObject.add(e),this.leftHand=new ie("",this.sourceId,e),oh&&console.log("Create left hand",e)}await this.loadAvatarObjects(this.head,this.leftHand,this.rightHand),this._leftHandMeshes=[],this.leftHand.asset?.traverse(e=>{e?.isMesh&&this._leftHandMeshes.push(e)}),this._rightHandMeshes=[],this.rightHand.asset?.traverse(e=>{e?.isMesh&&this._rightHandMeshes.push(e)}),kn.isLocalPlayer(this.gameObject)&&(this._syncTransforms=x.getComponentsInChildren(this.gameObject,Pn))}async loadAvatarObjects(e,t,i){const n=e.loadAssetAsync(),s=t.loadAssetAsync(),r=i.loadAssetAsync(),a=new Array;n&&a.push(n),s&&a.push(s),r&&a.push(r);const l=await zm(a);oh&&console.log("Avatar loaded results:",l)}}Oy([u(ie)],js.prototype,"head"),Oy([u(ie)],js.prototype,"leftHand"),Oy([u(ie)],js.prototype,"rightHand");var kE=Object.defineProperty,cp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&kE(e,t,n),n};const Ds=v("debugwebxr"),Bs=new Array;class $o extends R{createControllerModel=!0;createHandModel=!0;customLeftHand;customRightHand;static factory=new YC;supportsXR(e){return e==="immersive-vr"||e==="immersive-ar"}_models=new Array;async onXRControllerAdded(e){if(!(e.xr.isVR||e.xr.isPassThrough))return;console.debug("XR Controller Added",e.controller.side,e.controller.index);const{controller:t}=e;if(this.createControllerModel||this.createHandModel){if(t.hand){if(this.createHandModel){const i=await this.loadHandModel(this,t);if(!i||!t.connected||!t.isHand){i?.handObject&&Ga(i.handObject,!1),i?.handObject?.destroy();return}this._models.push({controller:t,model:i.handObject,handmesh:i.handmesh}),this._models.sort((n,s)=>n.controller.index-s.controller.index),this.scene.add(i.handObject),t.model=i.handObject}}else if(this.createControllerModel){const i=await t.getModelUrl();if(i){const n=await this.loadModel(t,i);if(!n||!t.connected||t.isHand)return;this._models.push({controller:t,model:n}),this._models.sort((s,r)=>s.controller.index-r.controller.index),this.scene.add(n),n.traverse(s=>{s.layers.set(2),s.matrixAutoUpdate=!1,s.updateMatrix()}),t.model=n}else t.targetRayMode!=="transient-pointer"&&console.warn("XRControllerModel: no model found for "+t.side)}}}onXRControllerRemoved(e){console.debug("XR Controller Removed",e.controller.side,e.controller.index);const t=this._models.findIndex(n=>n.controller===e.controller),i=this._models[t];i&&(this._models.splice(t,1),i.model&&(Ga(i.model,!1),i.model.destroy(),i.model=void 0))}onBeforeXR(e,t){this.createHandModel&&(this.customLeftHand||this.customRightHand)&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("hand-tracking")||t.optionalFeatures.push("hand-tracking"))}onLeaveXR(e){for(const t of this._models)t&&(t.model&&(Ga(t.model,!1),t.model.destroy(),t.model=void 0),t.controller.model===t.model&&(t.controller.model=null));this._models.length=0}onBeforeRender(){if(Z.active&&(Ds&&(Bs[0]=Date.now()),this.updateRendering(Z.active),Ds)){const e=Date.now()-Bs[0];Bs.push(e),Bs.length>=30&&(Bs[0]=0,Bs.reduce((t,i)=>t+i,0)/Bs.length,Bs.length=0)}}updateRendering(e){for(let t=0;t<this._models.length;t++){const i=this._models[t];if(!i)continue;const n=i.controller;if(!n.connected){Ds&&console.warn("XRControllerModel.onUpdateXR: controller is not connected anymore",n.side,n.hand);continue}if(i.model&&!i.handmesh)i.model.matrixAutoUpdate=!1,i.model.matrix.copy(n.gripMatrix),i.model.visible=n.isTracking,e.rig?.gameObject.add(i.model);else if(n.inputSource.hand&&i.handmesh){const s=e.referenceSpace,r=this.context.renderer.xr.getHand(n.index);if(s&&e.frame.getJointPose){for(const a of n.inputSource.hand.values()){const l=r.joints[a.jointName];if(l){const c=n.getHandJointPose(a);if(c){const h=c.transform.position,d=c.transform.orientation;l.position.copy(h),l.quaternion.copy(d),l.matrixAutoUpdate=!1}l.visible=c!=null}}i.model&&(i.model.visible=n.isTracking,i.model.visible&&i.model.parent!==e.rig?.gameObject&&e.rig?.gameObject.add(i.model)),i.model?.visible&&(i.handmesh?.updateMesh(),i.model.matrixAutoUpdate=!1,i.model.matrix.identity(),i.model.applyMatrix4(Da))}}}}async loadModel(e,t){if(!e.connected)return console.warn("XRControllerModel.onXRControllerAdded: controller is not connected anymore",e.side),null;const i=await ie.getOrCreate("",t).instantiate();return Ga(i),Z.active?.isPassThrough&&i.traverseVisible(n=>{this.makeOccluder(n)}),i}async loadHandModel(e,t){const i=this.context,n=i.renderer.xr.getHand(t.index);n||(Ds?B.DrawLabel(t.rayWorldPosition,"No hand found for index "+t.index,.05,5):console.warn("No hand found for index "+t.index));const s=new Po;pf(s,i),await Gu(s,i,this.sourceId??"",this.sourceId??"");const r=Hf(s);let a="";const l=t.side==="left"?this.customLeftHand:this.customRightHand;l?(a=l.url.split(".").slice(0,-1).join("."),s.setPath("")):(a=t.inputSource.handedness==="left"?"left":"right",s.setPath("https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/"));const c=new k;Ga(c);const h=new ZC(c,n,s.path,a,s,d=>{const p=r?.gltf;p?.scene.children?.length===0&&(p.scene.children[0]=d),r?.gltf&&_n().createBuiltinComponents(e.context,e.sourceId||a,r.gltf,null,r),d.traverse(m=>{m.layers.set(2),Z.active?.isPassThrough&&!l&&this.makeOccluder(m),m instanceof G&&Ve.assignMeshLOD(m,0)}),t.connected||(Ds&&B.DrawLabel(t.rayWorldPosition,"Hand is loaded but not connected anymore",.05,5),d.removeFromParent())});if(Ds&&c.add(new Si(.5)),t.inputSource.hand){Ds&&console.log(t.inputSource.hand);for(const d of t.inputSource.hand.values())if(n.joints[d.jointName]===void 0){const p=new xo;p.matrixAutoUpdate=!1,p.visible=!0,n.joints[d.jointName]=p,n.add(p)}}else Ds&&B.DrawLabel(t.rayWorldPosition,"No inputSource.hand found for index "+t.index,.05,5);return{handObject:c,handmesh:h}}makeOccluder(e){if(e instanceof G){let t=e.material;t instanceof ve&&(t=e.material=t.clone(),t.depthWrite=!0,t.depthTest=!0,t.colorWrite=!1,e.receiveShadow=!1,e.renderOrder=-100)}}}cp([u()],$o.prototype,"createControllerModel"),cp([u()],$o.prototype,"createHandModel"),cp([u(ie)],$o.prototype,"customLeftHand"),cp([u(ie)],$o.prototype,"customRightHand");class hp extends R{}var ME=Object.defineProperty,Fs=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ME(e,t,n),n};const ky=v("debugwebxr");class Li extends R{movementSpeed=1.5;rotationStep=30;useTeleport=!0;usePinchToTeleport=!0;useTeleportTarget=!1;useTeleportFade=!1;showRays=!0;showHits=!0;isXRMovementHandler=!0;xrSessionMode="immersive-vr";_didApplyRotation=!1;_didTeleport=!1;onUpdateXR(e){const t=e.xr.rig;if(!t?.gameObject||e.xr.isPassThrough)return;const i=e.xr.leftController,n=e.xr.rightController;i&&this.onHandleMovement(i,t.gameObject),n&&(this.onHandleRotation(n,t.gameObject),this.useTeleport&&this.onHandleTeleport(n,t.gameObject))}onLeaveXR(e){for(const t of this._lines)t.removeFromParent();for(const t of this._hitDiscs)t?.removeFromParent()}onBeforeRender(){this.context.xr?.running&&(this.showRays&&this.renderRays(this.context.xr),this.showHits&&this.renderHits(this.context.xr))}onHandleMovement(e,t){const i=e.getStick("xr-standard-thumbstick");if(i.x!=0||i.y!=0){const n=D(i.x,0,i.y);n.multiplyScalar(this.context.time.deltaTimeUnscaled*this.movementSpeed);const s=He(t);n.multiplyScalar(s.x),n.applyQuaternion(e.xr.poseOrientation),n.y=0,n.applyQuaternion(t.worldQuaternion),A()&&Number.isNaN(n.x)&&console.error("Stick movement resulted in NaN",{stick:i,vec:n}),t.position.add(n),t.updateWorldMatrix(!1,!1);for(const r of t.children)r.updateWorldMatrix(!1,!1)}}onHandleRotation(e,t){if(e._isMxInk)return;const i=e.getStick("xr-standard-thumbstick").x;if(this._didApplyRotation)Math.abs(i)<.3&&(this._didApplyRotation=!1);else if(Math.abs(i)>.5){this._didApplyRotation=!0;const n=i>0?1:-1,s=J(this.context.mainCamera).clone();t.rotateY(n*L.toRadians(this.rotationStep));const r=J(this.context.mainCamera).clone().sub(s);r.y=0,t.position.sub(r)}}_teleportBuffer=new Array;onHandleTeleport(e,t){let i=0;if(e.hand&&this.usePinchToTeleport&&e.isTeleportGesture){const n=e.getPointerId("primary");if(n!=null&&this.context.input.getIsPointerIdInUse(n))return;const s=e.getGesture("pinch");s&&(i=s.value)}else i=e.getStick("xr-standard-thumbstick")?.y;if(this._didTeleport)i>=0&&i<.4?this._didTeleport=!1:i<0&&i>-.4&&(this._didTeleport=!1);else if(i>.8){this._didTeleport=!0;const n=this.context.physics.raycastFromRay(e.ray)[0];if(n&&n.object instanceof Ra){const r=n.normal?.dot(D(0,1,0));if(r!==void 0&&r<.4)return}let s=n?.point;if(!s&&!this.useTeleportTarget){this._plane||(this._plane=new hr(new b(0,1,0),0));const r=t.worldPosition;this._plane.setFromNormalAndCoplanarPoint(new b(0,1,0),r);const a=e.ray;s=r.clone(),this._plane.intersectLine(new vC(a.origin,D(a.direction).multiplyScalar(1e4).add(a.origin)),s),s.distanceTo(r)>t.scale.x*10&&(s=null)}if(s){if(this.useTeleportTarget&&!x.getComponentInParent(n.object,hp))return;const r=s.clone();if(ky&&B.DrawSphere(s,.025,16711680,5),this.context.mainCamera?.position){const a=this.context.xr?.getUserOffsetInRig();a&&(a.y=0,r.sub(a),ky&&B.DrawWireSphere(a.add(r),.025,65280,5))}this._teleportBuffer.push(t.matrix.clone()),this._teleportBuffer.length>10&&this._teleportBuffer.shift(),this.useTeleportFade?e.xr.fadeTransition()?.then(()=>{t.worldPosition=r}):t.worldPosition=r}}else if(i<-.8&&(this._didTeleport=!0,this._teleportBuffer.length>0)){const n=this._teleportBuffer.pop();n&&n.decompose(t.position,t.quaternion,t.scale)}}_plane=null;_lines=[];_hitDiscs=[];_hitDistances=[];_lastHitDistances=[];renderRays(e){for(let t=0;t<this._lines.length;t++){const i=this._lines[t];i&&(i.visible=!1)}for(let t=0;t<e.controllers.length;t++){const i=e.controllers[t];let n=this._lines[t];if(!i.connected||!i.isTracking||!i.ray||i.targetRayMode==="transient-pointer"||!i.hasSelectEvent){n&&(n.visible=!1);continue}n||(n=this.createRayLineObject(),n.scale.z=.5,this._lines[t]=n),i.updateRayWorldPosition(),i.updateRayWorldQuaternion();const s=i.rayWorldPosition,r=i.rayWorldQuaternion;n.position.copy(s),n.quaternion.copy(r);const a=e.rigScale,l=this.usePinchToTeleport&&i.isTeleportGesture,c=this._lastHitDistances[t],h=this._hitDistances[t]!=null,d=c??a;n.scale.set(a,a,d),n.visible=!0,n.layers.disableAll(),n.layers.enable(2);let p=n.material.opacity;l?p=1:this.showHits&&d<e.rigScale*.5?p=0:i.getButton("primary")?.pressed?p=.5:p=h?.2:.1,n.material.opacity=L.lerp(n.material.opacity,p,this.context.time.deltaTimeUnscaled/.1),n.parent!==this.context.scene&&this.context.scene.add(n)}}renderHits(e){for(const t of this._hitDiscs){if(!t)continue;const i=t.controller;if(!i||!i.connected||!i.isTracking){t.visible=!1;continue}}for(let t=0;t<e.controllers.length;t++){const i=e.controllers[t];if(!i.connected||!i.isTracking||!i.ray||!i.hasSelectEvent)continue;let n=this._hitDiscs[t],s=!0;const r=i.getPointerId("primary");r!=null&&this.context.input.getIsPointerIdInUse(r)&&(n&&(n.visible=!1),this._hitDistances[t]=null,this._lastHitDistances[t]=0,s=!1);const a=this.context.time.smoothedFps>=59?1:10;if((this.context.time.frame+i.index)%a!==0&&(s=!1),!s){const h=this._hitDiscs[t];h&&h.visible&&h.hit&&this.updateHitPointerPosition(i,h,h.hit.distance);continue}const l=this.context.physics.raycastFromRay(i.ray,{testObject:this.hitPointRaycastFilter,precise:!1});let c=l.find(h=>this.usePinchToTeleport&&i.isTeleportGesture?!0:this.isObjectWithInteractiveComponent(h.object));if(c||(c=l[0]),n&&(n.controller=i,n.hit=c),this._hitDistances[t]=c?.distance||null,c){this._lastHitDistances[t]=c.distance;const h=e.rigScale??1;ky&&(B.DrawWireSphere(c.point,.025*h,16711680),B.DrawLabel(D(0,.2,0).add(c.point),c.object.name,.02,0)),n||(n=this.createHitPointObject(),this._hitDiscs[t]=n),n.hit=c,n.visible=c.distance>h*.05;let d=.01*(h+c.distance);const p=i.getButton("primary")?.pressed;p&&(d*=1.1),n.scale.set(d,d,d),n.layers.set(2);let m=n.material.opacity;if(p?m=1:m=c.distance<.15*h?.2:.6,n.material.opacity=L.lerp(n.material.opacity,m,this.context.time.deltaTimeUnscaled/.1),n.visible){if(c.normal){this.updateHitPointerPosition(i,n,c.distance);const f=c.normal.applyQuaternion(be(c.object));n.quaternion.setFromUnitVectors(RE,f)}else this.updateHitPointerPosition(i,n,c.distance);n.parent!==this.context.scene&&this.context.scene.add(n)}}else this._hitDiscs[t]&&(this._hitDiscs[t].visible=!1)}}isObjectWithInteractiveComponent(e,t=0){return Tu(e)||e.isUI===!0?!0:e.isScene?!1:e.parent?this.isObjectWithInteractiveComponent(e.parent,t+1):!1}updateHitPointerPosition(e,t,i){const n=D(e.rayWorldPosition);n.add(D(0,0,i-.01).applyQuaternion(e.rayWorldQuaternion)),t.position.lerp(n,this.context.time.deltaTimeUnscaled/.05)}hitPointRaycastFilter=e=>e.type==="SkinnedMesh"?"continue in children":!0;createHitPointObject(){const e=new G(new yd(.3,6,6),new xe({color:15658734,opacity:.7,transparent:!0,depthTest:!1,depthWrite:!1,side:Ci}));return e.layers.disableAll(),e.layers.enable(2),e}createRayLineObject(){const e=new KC;e.layers.disableAll(),e.layers.enable(2);const t=new JC;e.geometry=t;const i=new Float32Array(9);i.set([0,0,.02,0,0,.4,0,0,1]),t.setPositions(i);const n=new Float32Array(9);n.set([1,1,1,.1,.1,.1,0,0,0]),t.setColors(n);const s=new eP({color:16777215,vertexColors:!0,worldUnits:!0,linewidth:.004,transparent:!0,depthWrite:!1,blending:hb,dashed:!1});return e.material=s,e}}Fs([u()],Li.prototype,"movementSpeed"),Fs([u()],Li.prototype,"rotationStep"),Fs([u()],Li.prototype,"useTeleport"),Fs([u()],Li.prototype,"usePinchToTeleport"),Fs([u()],Li.prototype,"useTeleportTarget"),Fs([u()],Li.prototype,"useTeleportFade"),Fs([u()],Li.prototype,"showRays"),Fs([u()],Li.prototype,"showHits");const RE=new b(0,1,0);var TE=Object.defineProperty,vt=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&TE(e,t,n),n};const sh=v("debugwebxr"),EE=v("debugusdz"),at=class Wl extends R{createVRButton=!0;createARButton=!0;createSendToQuestButton=!0;createQRCode=!0;useDefaultControls=!0;showControllerModels=!0;showHandModels=!0;usePlacementReticle=!0;customARPlacementReticle;usePlacementAdjustment=!0;arScale=1;useXRAnchor=!1;autoPlace=!1;autoCenter=!1;useQuicklookExport=!1;useDepthSensing=!1;useSpatialGrab=!0;defaultAvatar;_playerSync;_createdComponentsInSession=[];_usdzExporter;static activeWebXRComponent=null;awake(){Z.getXRSync(this.context)}onEnable(){window.location.protocol!=="https:"&&ye('<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API" target="_blank">WebXR</a> only works on secure connections (https).'),this.useQuicklookExport&&(x.findObjectOfType(Tn)||(sh&&console.log("WebXR: Adding USDZExporter"),this._usdzExporter=x.addComponent(this.gameObject,Tn),this._usdzExporter.objectToExport=this.context.scene,this._usdzExporter.autoExportAnimations=!0,this._usdzExporter.autoExportAudioSources=!0)),this.handleCreatingHTML(),this.handleOfferSession(),this.defaultAvatar===!0&&(sh&&console.warn("WebXR: No default avatar set, using static default avatar"),this.defaultAvatar=new ie("https://cdn.needle.tools/static/avatars/DefaultAvatar.glb")),this.defaultAvatar&&(this._playerSync=this.gameObject.getOrAddComponent(Cy),this._playerSync.autoSync=!1),this._playerSync&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,this._playerSync.onPlayerSpawned?.removeEventListener(this.onAvatarSpawned),this._playerSync.onPlayerSpawned?.addEventListener(this.onAvatarSpawned))}onDisable(){this._usdzExporter?.destroy(),this.removeButtons()}async handleOfferSession(){return this.createVRButton&&await Z.isVRSupported()&&this.createVRButton?Z.offerSession("immersive-vr","default",this.context):this.createARButton&&await Z.isARSupported()&&this.createARButton?Z.offerSession("immersive-ar","default",this.context):!1}get session(){return Z.active??null}get sessionMode(){return Z.activeMode??null}get arSessionRoot(){return this._activeWebARSessionRoot}async enterVR(e){return Z.start("immersive-vr",e,this.context)}async enterAR(e){return Z.start("immersive-ar",e,this.context)}exitXR(){Z.stop()}_exitXRMenuButton;_previousXRState=0;_spatialGrabRaycaster;_activeWebARSessionRoot=null;get isActiveWebXR(){return!Wl.activeWebXRComponent||Wl.activeWebXRComponent===this}onBeforeXR(e,t){if(!this.isActiveWebXR){console.warn(`WebXR: another WebXR component is already active (${Wl.activeWebXRComponent?.name}). This is ignored: ${this.name}`);return}if(this.activeAndEnabled===!1||this.destroyed){console.debug("[WebXR] onBeforeXR called on disabled or destroyed component");return}Wl.activeWebXRComponent=this,e=="immersive-ar"&&this.useDepthSensing&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("depth-sensing"))}async onEnterXR(e){if(!this.isActiveWebXR)return;sh&&console.log("WebXR onEnterXR"),this._previousXRState=oi.Global.Mask;const t=e.xr.isVR;if(oi.Global.Set(t?eo.VR:eo.AR),e.xr.isAR){let i=x.findObjectOfType(Ni);if(!i)if(this.usePlacementReticle){const n=new k;for(const s of this.context.scene.children)n.add(s);this.context.scene.add(n),i=x.addComponent(n,Ni),this._createdComponentsInSession.push(i)}else(sh||A())&&console.warn("WebXR: No WebARSessionRoot found in scene and usePlacementReticle is disabled in WebXR component.");this._activeWebARSessionRoot=i,i&&(i.customReticle=this.customARPlacementReticle,i.arScale=this.arScale,i.arTouchTransform=this.usePlacementAdjustment,i.autoPlace=this.autoPlace,i.autoCenter=this.autoCenter,i.useXRAnchor=this.useXRAnchor)}this.useDefaultControls&&this.setDefaultMovementEnabled(!0),(this.showControllerModels||this.showHandModels)&&this.setDefaultControllerRenderingEnabled(!0),this.useSpatialGrab&&(this._spatialGrabRaycaster=x.findObjectOfType(ya)??void 0,this._spatialGrabRaycaster||(this._spatialGrabRaycaster=this.gameObject.addComponent(ya))),this.createLocalAvatar(e.xr),e.xr.isScreenBasedAR||(this._exitXRMenuButton=this.context.menu.appendChild({label:"Quit XR",onClick:()=>this.exitXR(),icon:"exit_to_app",priority:2e4}))}onUpdateXR(e){this.isActiveWebXR&&this._spatialGrabRaycaster&&(this._spatialGrabRaycaster.enabled=this.useSpatialGrab)}onLeaveXR(e){if(this._exitXRMenuButton?.remove(),!!this.isActiveWebXR){oi.Global.Set(this._previousXRState),this._playerSync?.destroyInstance();for(const t of this._createdComponentsInSession)t.destroy();this._createdComponentsInSession.length=0,this._activeWebARSessionRoot=null,this.handleOfferSession(),ic(1).then(()=>Wl.activeWebXRComponent=null)}}setDefaultMovementEnabled(e){let t=this.gameObject.getComponent(Li);return!t&&e&&(t=this.gameObject.addComponent(Li),this._createdComponentsInSession.push(t)),t&&(t.enabled=e),t}setDefaultControllerRenderingEnabled(e){let t=this.gameObject.getComponent($o);return!t&&e&&(t=this.gameObject.addComponent($o),this._createdComponentsInSession.push(t),t.createControllerModel=this.showControllerModels,t.createHandModel==this.showHandModels),t&&(t.enabled=e),t}async createLocalAvatar(e){this._playerSync&&e.running&&typeof this.defaultAvatar!="boolean"&&(this._playerSync.asset=this.defaultAvatar,await this._playerSync.getInstance())}onAvatarSpawned=e=>{sh&&console.log("WebXR.onAvatarSpawned",e);let t=x.getComponentInChildren(e,js);t??=x.addComponent(e,js)};getButtonsContainer(){return this.getButtonsFactory()}getButtonsFactory(){return this._buttonFactory||(this._buttonFactory=or.getOrCreate()),this._buttonFactory}_buttonFactory;handleCreatingHTML(){if(this.createARButton||this.createVRButton||this.useQuicklookExport){if((q.isiOS()&&q.isSafari()||EE)&&this.useQuicklookExport){const e=x.findObjectOfType(Tn);if(!e||e&&e.allowCreateQuicklookButton){const t=this.getButtonsFactory().createQuicklookButton();this.addButton(t,50)}}if(this.createARButton){const e=this.getButtonsFactory().createARButton();this.addButton(e,50)}if(this.createVRButton){const e=this.getButtonsFactory().createVRButton();this.addButton(e,50)}}if(this.createSendToQuestButton&&!q.isQuest()&&Z.isVRSupported().then(e=>{if(!e){const t=this.getButtonsFactory().createSendToQuestButton();this.addButton(t,50)}}),this.createQRCode){const e=$a(ro);if(e&&e.createQRCodeButton===!1)A()&&console.warn("WebXR: QRCode button is disabled in the Needle Menu component");else if(!q.isMobileDevice()){const t=Fn.getOrCreate().createQRCode();this.addButton(t,50)}}}_buttons=[];addButton(e,t){this._buttons.push(e),e.setAttribute("priority",t.toString()),this.context.menu.appendChild(e)}removeButtons(){for(const e of this._buttons)e.remove();this._buttons.length=0}};vt([u()],at.prototype,"createVRButton"),vt([u()],at.prototype,"createARButton"),vt([u()],at.prototype,"createSendToQuestButton"),vt([u()],at.prototype,"createQRCode"),vt([u()],at.prototype,"useDefaultControls"),vt([u()],at.prototype,"showControllerModels"),vt([u()],at.prototype,"showHandModels"),vt([u()],at.prototype,"usePlacementReticle"),vt([u(ie)],at.prototype,"customARPlacementReticle"),vt([u()],at.prototype,"usePlacementAdjustment"),vt([u()],at.prototype,"arScale"),vt([u()],at.prototype,"useXRAnchor"),vt([u()],at.prototype,"autoPlace"),vt([u()],at.prototype,"autoCenter"),vt([u()],at.prototype,"useQuicklookExport"),vt([u()],at.prototype,"useDepthSensing"),vt([u()],at.prototype,"useSpatialGrab"),vt([u(ie)],at.prototype,"defaultAvatar");let dp=at;const up=v("debugusdzbehaviours");class My{get extensionName(){return"Behaviour"}behaviours=[];addBehavior(e){this.behaviours.push(e)}addAudioClip(e){if(!e||typeof e!="string")return"";const t="audio/"+ba.getName(e);return this.audioClips.push({clipUrl:e,filesKey:t}),t}behaviourComponents=[];behaviourComponentsCopy=[];audioClips=[];audioClipsCopy=[];targetUuids=new Set;getAllTargetUuids(){return this.targetUuids}onBeforeBuildDocument(e){if(!e.root)return Promise.resolve();const t=[];return e.root.traverse(i=>{x.foreachComponent(i,n=>{const s=n;if(typeof s.createBehaviours=="function"||typeof s.beforeCreateDocument=="function"||typeof s.afterCreateDocument=="function"||typeof s.afterSerialize=="function"){this.behaviourComponents.push(s);const r=s.beforeCreateDocument?.call(s,this,e);r instanceof Promise&&t.push(r)}},!1)}),up&&console.log("onBeforeBuildDocument: all components",this.behaviourComponents),Promise.all(t)}onExportObject(e,t,i){for(const n of this.behaviourComponents)n.createBehaviours?.call(n,this,t,i)}onAfterBuildDocument(e){for(const d of this.behaviourComponents)typeof d.afterCreateDocument=="function"&&d.afterCreateDocument(this,e);this.behaviourComponentsCopy=this.behaviourComponents.slice(),this.behaviourComponents.length=0,this.audioClipsCopy=this.audioClips.slice(),this.audioClips.length=0;const t=new Set,i=new Set,n=new Set,s=new Set,r=up;let a=`graph LR
1284
- `,l="";function c(d){if(d instanceof Gr){r&&(a+=`subgraph Group_${d.id}
1285
- `);for(const p of d.actions)r&&(a+=`${d.id}[${d.id}] -- ${d.type},loops:${d.loops} --> ${p.id}[${p.id}]
1286
- `),c(p);r&&(a+=`end
1287
- `)}else if(d instanceof vi){d.tokenId==="StartAnimation"&&s.add(d);let p=d.tokenId;d.type!==void 0&&(p+=":"+d.type);const m=d.affectedObjects;if(m)if(Array.isArray(m))for(const g of m)i.add(g),r&&(l+=`${d.id}[${d.id}
1288
- ${p}] -- ${p} --> ${g.uuid}(("${g.displayName||g.name||g.uuid}"))
1289
- `);else typeof m=="object"?(i.add(m),r&&(l+=`${d.id}[${d.id}
1290
- ${p}] -- ${p} --> ${m.uuid}(("${m.displayName||m.name||m.uuid}"))
1291
- `)):typeof m=="string"&&i.add({uuid:m});const f=d.xFormTarget;f&&(typeof f=="object"?(i.add(f),r&&(l+=`${d.id}[${d.id}
1292
- ${p}] -- ${p} --> ${f.uuid}(("${f.displayName||f.name||f.uuid}"))
1293
- `)):typeof f=="string"&&i.add({uuid:f}))}}function h(d,p){if(Array.isArray(d))for(const m of d)h(m,p);else if(d instanceof nr){let m=d.tokenId;d.type!==void 0&&(m+=":"+d.type),typeof d.targetId=="object"&&(t.add(d.targetId),r&&(l+=`${d.targetId.uuid}(("${d.targetId.displayName}")) --> ${d.id}[${d.id}
1294
- ${m}]
1295
- `)),r&&(a+=`${d.id}((${d.id})) -- ${m} --> ${p.id}[${p.tokenId||p.id}]
1296
- `)}}for(const d of this.behaviours)r&&(a+=`subgraph ${d.id}
1297
- `),c(d.action),h(d.trigger,d.action),r&&(a+=`end
1298
- `);r&&(a+=`
1299
- `+l),r&&(console.log("All USDZ behaviours",this.behaviours),this.behaviours.length&&(console.warn("The Mermaid graph can be pasted into https://massive-mermaid.glitch.me/ or https://mermaid.live/edit. It should be in your clipboard already!"),console.log(a),navigator.clipboard.writeText(a)));{let d=`gantt
1300
- title Animations
1301
- dateFormat X
1302
- axisFormat %s
1303
- `;const p=Array.from(s),m=new Set;for(const _ of p)if(_.affectedObjects&&typeof _.affectedObjects!="string"){if(Array.isArray(_.affectedObjects))for(const w of _.affectedObjects)m.add(w);else m.add(_.affectedObjects);r&&(d+=`section ${_.animationName} (${_.id})
1304
- `,d+=`${_.id} : ${_.start}, ${_.duration}s
1305
- `)}r&&s.size&&console.log(d);const f=new Set;for(const _ of m){_.getPath||console.error("USDZExporter: Animation target object has no getPath method. This is likely a bug",_);let w=_.getPath();w.startsWith("<")&&(w=w.substring(1)),w.endsWith(">")&&(w=w.substring(0,w.length-1)),f.add({path:w,obj:_})}const g=Array.from(f).sort((_,w)=>_.path.length-w.path.length),y=new Array;for(let _=0;_<g.length;_++)for(let w=_+1;w<g.length;w++)if(g[w].path.startsWith(g[_].path)){const P=g[w],M=g[_];y.push({child:P.obj.displayName+" ("+P.path+")",parent:M.obj.displayName+" ("+M.path+")"})}y.length&&console.warn("USDZExporter: There are overlapping PlayAnimation actions. This can lead to undefined runtime behaviour when playing multiple animations. Please restructure the hierarchy so that animations don't overlap.",{overlappingTargets:y,playAnimationActions:s})}for(const d of new Set([...t,...i]))if(Array.isArray(d))for(const p of d)n.add(p.uuid);else n.add(d.uuid);up&&console.log("All Behavior trigger sources and action targets",t,i,n),this.targetUuids=new Set(n)}onAfterHierarchy(e,t){if(this.behaviours?.length){t.beginBlock('def Scope "Behaviors"');for(const i of this.behaviours)i.writeTo(this,e.document,t);t.closeBlock()}}async onAfterSerialize(e){up&&console.log("onAfterSerialize behaviours",this.behaviourComponentsCopy);for(const t of this.behaviourComponentsCopy)typeof t.afterSerialize=="function"&&(t.afterSerialize.constructor.name==="AsyncFunction"?await t.afterSerialize(this,e):t.afterSerialize(this,e));for(const{clipUrl:t,filesKey:i}of this.audioClipsCopy){if(e.files[i])return;const n=await(await(await fetch(t)).blob()).arrayBuffer(),s=new Uint8Array(n);e.files[i]=s}this.behaviourComponentsCopy.length=0,this.audioClipsCopy.length=0}}class Ry{get extensionName(){return"Physics"}onExportObject(e,t,i){const n=x.getComponents(e,Ze).filter(l=>l.enabled),s=x.getComponents(e,ui).filter(l=>l.enabled&&!l.isTrigger);let r=n.length>0?n[0]:null;const a=s.length>0?s[0]:null;a&&!r&&(r=new Ze,r.isKinematic=!0),r&&t.addEventListener("serialize",(l,c)=>{if(r){if(l.appendLine(),l.beginBlock('def RealityKitComponent "RigidBody"',"{",!0),r.useGravity||l.appendLine("bool gravityEnabled = 0"),l.appendLine('uniform token info:id = "RealityKit.RigidBody"'),r.isKinematic&&l.appendLine('token motionType = "Kinematic"'),l.beginBlock('def RealityKitStruct "massFrame"',"{",!0),l.appendLine(`float m_mass = ${r.mass}`),l.beginBlock('def RealityKitStruct "m_pose"',"{",!0),l.appendLine(`float3 position = (${r.centerOfMass.x}, ${r.centerOfMass.y}, ${r.centerOfMass.z})`),l.closeBlock("}"),l.closeBlock("}"),s.length>0){const h=s[0];l.beginBlock('def RealityKitStruct "material"',"{",!0);const d=h.sharedMaterial;d&&d.dynamicFriction!==void 0&&l.appendLine(`double dynamicFriction = ${h.sharedMaterial?.dynamicFriction}`),d&&d.bounciness!==void 0&&l.appendLine(`double restitution = ${h.sharedMaterial?.bounciness}`),d&&d.staticFriction!==void 0&&l.appendLine(`double staticFriction = ${h.sharedMaterial?.staticFriction}`),l.closeBlock("}")}l.closeBlock("}")}}),a&&(t.addEventListener("serialize",(l,c)=>{l.beginBlock('def RealityKitComponent "Collider"',"{",!0),l.appendLine("uint group = 1"),l.appendLine('uniform token info:id = "RealityKit.Collider"'),l.appendLine("uint mask = 4294967295");const h=a.isTrigger?"Trigger":"Default";if(l.appendLine(`token type = "${h}"`),l.beginBlock('def RealityKitStruct "Shape"',"{",!0),a instanceof il){const d=a;l.appendLine('token shapeType = "Sphere"'),l.appendLine(`float radius = ${d.radius}`)}else if(a instanceof zu){const d=a;l.appendLine('token shapeType = "Box"'),l.appendLine(`float3 extent = (${d.size.x}, ${d.size.y}, ${d.size.z})`)}else if(a instanceof Bo){const d=a;l.appendLine('token shapeType = "Capsule"'),l.appendLine(`float radius = ${d.radius}`),l.appendLine(`float height = ${d.height}`)}else if(a instanceof Rs&&a.sharedMesh?.geometry){const d=a.sharedMesh.geometry;d.boundingBox||d.computeBoundingBox();const p=a.sharedMesh.geometry.boundingBox;p&&(l.appendLine('token shapeType = "Box"'),l.appendLine(`float3 extent = (${p.max.x-p.min.x}, ${p.max.y-p.min.y}, ${p.max.z-p.min.z})`),console.log("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. MeshCollider will be exported as Box",a))}else console.warn("[USDZ] Only Box, Sphere, and Capsule colliders are supported in visionOS/iOS. Ignoring collider:",a);l.beginBlock('def RealityKitStruct "pose"',"{",!0),l.closeBlock("}"),l.closeBlock("}"),l.closeBlock("}")}),s.length>1&&console.log("WARNING: Multiple colliders detected. visionOS / iOS can only support objects with a single collider, only exporting the first collider: ",a))}}const AE=v("debugshadowcomponents");Mb.prototype.interactable={get(){return this.interactive},set(o){this.interactable=o}};class cn extends R{isRoot(){return this.Root?.gameObject===this.gameObject}get canvas(){const e=this.Root;return e?.isCanvas?e:null}get Canvas(){return this.canvas}markDirty(){si.markUIDirty(this.context)}get shadowComponent(){return this._shadowComponent}set shadowComponent(e){this._shadowComponent=e}_shadowComponent=null;_controlsChildLayout=!0;get controlsChildLayout(){return this._controlsChildLayout}set controlsChildLayout(e){this._controlsChildLayout=e,this.shadowComponent&&(this.shadowComponent.autoLayout=e)}_root=void 0;get Root(){return this._root===void 0&&(this._root=x.getComponentInParent(this.gameObject,rh)),this._root}_parentComponent=void 0;__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this.shadowComponent=null,this._root=void 0,this._parentComponent=void 0,this}onEnable(){super.onEnable()}addShadowComponent(e,t){if(!e)return;this.removeShadowComponent();const i=this.isRoot()?this.gameObject:this.gameObject.parent;if(this._parentComponent=x.getComponentInParent(i,cn),!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[Mi]=this,this.setShadowComponentOwner(e);let n=!1;if(this.Root?.gameObject===this.gameObject)this.gameObject.add(e);else{const s=this._parentComponent.shadowComponent;s&&(s?.add(e),n=!0)}this.shadowComponent=e,t&&t.shadowComponent&&this.shadowComponent&&t.shadowComponent.add(this.shadowComponent),Sc&&e.add(new Si(.5)),this.onAfterAddedToScene(),n&&yP(),AE&&console.warn("Added shadow component",this.shadowComponent)}setShadowComponentOwner(e){if(e&&(e[Mi]===void 0||e[Mi]===this)&&(e[Mi]=this,e.children))for(const t of e.children)this.setShadowComponentOwner(t)}traverseOwnedShadowComponents(e,t,i){if(e&&e[Mi]===t){i(e);for(const n of e.children)this.traverseOwnedShadowComponents(n,t,i)}}removeShadowComponent(){this.shadowComponent&&this.shadowComponent.removeFromParent()}onAfterAddedToScene(){}setInteractable(e){this.shadowComponent&&(this.shadowComponent.interactable=e)}}class rh extends cn{awake(){super.awake()}}var IE=Object.defineProperty,LE=Object.getOwnPropertyDescriptor,ah=(o,e,t,i)=>{for(var n=i>1?void 0:i?LE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&IE(e,t,n),n};const Ty=v("debugui"),Ey=v("debuguilayout");class Yx{width;height}class Zx{x;y;width;height}const Mn=new b,lh=new K,pp=new U,vl=class yS extends cn{get parent(){return this._parentRectTransform}get translation(){return this.gameObject.position}get rotation(){return this.gameObject.quaternion}get scale(){return this.gameObject.scale}_anchoredPosition;get anchoredPosition(){return this._anchoredPosition||(this._anchoredPosition=new ee),this._anchoredPosition}set anchoredPosition(e){this._anchoredPosition=e}sizeDelta=new ee(100,100);pivot=new ee(.5,.5);anchorMin=new ee(0,0);anchorMax=new ee(1,1);minWidth;minHeight;get width(){let e=this.sizeDelta.x;if(this.anchorMin.x!==this.anchorMax.x&&this._parentRectTransform){const t=this._parentRectTransform.width,i=this.anchorMax.x-this.anchorMin.x;e=t*i,e+=this.sizeDelta.x}return this.minWidth!==void 0&&e<this.minWidth?this.minWidth:e}get height(){let e=this.sizeDelta.y;if(this.anchorMin.y!==this.anchorMax.y&&this._parentRectTransform){const t=this._parentRectTransform.height,i=this.anchorMax.y-this.anchorMin.y;e=t*i,e+=this.sizeDelta.y}return this.minHeight!==void 0&&e<this.minHeight?this.minHeight:e}lastMatrix;rectBlock;_transformNeedsUpdate=!1;_initialPosition;_parentRectTransform;_lastUpdateFrame=-1;awake(){super.awake(),this._lastUpdateFrame=-1,this._parentRectTransform=void 0,this.rectBlock=new k,this.rectBlock.name=this.name,this.lastMatrix=new K,this._lastAnchoring=null,this._initialPosition=this.gameObject.position.clone(),this._initialPosition.z=0,this._anchoredPosition||(this._anchoredPosition=new ee),Ja(this,"_anchoredPosition",()=>{this.markDirty()}),Ja(this,"sizeDelta",()=>{this.markDirty()}),Ja(this,"pivot",()=>{this.markDirty()}),Ja(this,"anchorMin",()=>{this.markDirty()}),Ja(this,"anchorMax",()=>{this.markDirty()})}onEnable(){super.onEnable(),this.rectBlock||(this.rectBlock=new k),this.lastMatrix||(this.lastMatrix=new K),this._lastAnchoring||(this._lastAnchoring=new ee),this._initialPosition||(this._initialPosition=new b),this._anchoredPosition||(this._anchoredPosition=new ee),this.addShadowComponent(this.rectBlock),this._transformNeedsUpdate=!0,this.canvas?.registerTransform(this)}onDisable(){super.onDisable(),this.removeShadowComponent(),this.canvas?.unregisterTransform(this)}onParentRectTransformChanged(e){this._transformNeedsUpdate||this.onApplyTransform(Ey?`${e.name} changed`:void 0)}get isDirty(){return this._transformNeedsUpdate||(this._transformNeedsUpdate=!this.lastMatrix.equals(this.gameObject.matrix)),this._transformNeedsUpdate}markDirty(){this._transformNeedsUpdate||(Ey&&console.warn("RectTransform markDirty()",this.name),this._transformNeedsUpdate=!0,this._lastUpdateFrame=-1)}updateTransform(){(this._transformNeedsUpdate||!this.lastMatrix.equals(this.gameObject.matrix))&&this.canUpdate()&&this.onApplyTransform(this._transformNeedsUpdate?"Marked dirty":"Matrix changed")}canUpdate(){return this._transformNeedsUpdate&&this.activeAndEnabled&&this._lastUpdateFrame!==this.context.time.frame}onApplyTransform(e){if(this.context.time.frameCount===this._lastUpdateFrame)return;this._lastUpdateFrame=this.context.time.frameCount;const t=this.shadowComponent;if(!t)return;this.gameObject.parent?this._parentRectTransform=x.getComponentInParent(this.gameObject.parent,yS):this._parentRectTransform=void 0,this._transformNeedsUpdate=!1,Ey&&console.warn("RectTransform \u2192 ApplyTransform",this.name+" because "+e),this.isRoot()?this.Root.screenspace||(t.rotation.y=Math.PI):(t.matrix.identity(),t.matrixAutoUpdate=!1,Mn.set(0,0,0),this.applyPivot(Mn),t.matrix.setPosition(Mn.x,Mn.y,0),(this.gameObject.quaternion.x||this.gameObject.quaternion.y||this.gameObject.quaternion.z)&&(pp.copy(this.gameObject.quaternion),pp.x*=-1,pp.z*=-1,lh.makeRotationFromQuaternion(pp),t.matrix.premultiply(lh)),Mn.set(0,0,0),this.applyAnchoring(Mn),this.canvas?.screenspace?Mn.z+=.1:Mn.z+=.01,lh.identity(),lh.setPosition(Mn.x,Mn.y,Mn.z),t.matrix.premultiply(lh),t.matrix.scale(this.gameObject.scale)),this.lastMatrix.copy(this.gameObject.matrix);const i=!0;for(const n of uu(this.gameObject,cn,i,1)){if(n===this||!n.activeAndEnabled)continue;const s=n;s.onParentRectTransformChanged&&s.onParentRectTransformChanged(this)}}_lastAnchoring;applyAnchoring(e){this._lastAnchoring||(this._lastAnchoring=new ee);const t=this._lastAnchoring.sub(this._anchoredPosition);this.gameObject.position.x+=t.x,this.gameObject.position.y+=t.y,this._lastAnchoring.copy(this._anchoredPosition),e.x+=this._initialPosition.x-this.gameObject.position.x,e.y+=this._initialPosition.y-this.gameObject.position.y,e.z+=this._initialPosition.z-this.gameObject.position.z;const i=this._parentRectTransform;if(i){let n=0;const s=1-this.anchorMax.y-this.anchorMin.y;n-=i.height*.5*s,e.y+=n;let r=0;const a=1-this.anchorMax.x-this.anchorMin.x;r-=i.width*.5*a,e.x+=r}}applyPivot(e){if(this.pivot&&!this.isRoot()){const t=this.pivot.x-.5;e.x-=t*this.sizeDelta.x*this.gameObject.scale.x;const i=this.pivot.y-.5;e.y-=i*this.sizeDelta.y*this.gameObject.scale.y}}getBasicOptions(){const e={width:this.sizeDelta.x,height:this.sizeDelta.y,offset:0,backgroundOpacity:0,borderWidth:0,borderRadius:0,borderOpacity:0,letterSpacing:-.03};return this.ensureValidSize(e),e}ensureValidSize(e,t=1e-4){return e.width<=0&&(e.width=t),e.height<=0&&(e.height=1e-4),e}_createdBlocks=[];_createdTextBlocks=[];createNewBlock(e){e={...this.getBasicOptions(),...e},Ty&&console.log(this.name,e);const t=new Mb(e);return this._createdBlocks.push(t),t}createNewText(e){Ty&&console.log(e),e={...this.getBasicOptions(),...e},Ty&&console.log(this.name,e);const t=new kb(e);return this._createdTextBlocks.push(t),t}};ah([u(ee)],vl.prototype,"anchoredPosition",1),ah([u(ee)],vl.prototype,"sizeDelta",2),ah([u(ee)],vl.prototype,"pivot",2),ah([u(ee)],vl.prototype,"anchorMin",2),ah([u(ee)],vl.prototype,"anchorMax",2);let Rn=vl;var jE=Object.defineProperty,Kx=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jE(e,t,n),n};class wl extends R{effectColor;effectDistance}Kx([u(oe)],wl.prototype,"effectColor"),Kx([u(ee)],wl.prototype,"effectDistance");var DE=Object.defineProperty,BE=Object.getOwnPropertyDescriptor,Jx=(o,e,t,i)=>{for(var n=i>1?void 0:i?BE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&DE(e,t,n),n};const Xr={backgroundColor:new ne(1,1,1),backgroundOpacity:1,borderColor:new ne(1,1,1),borderOpacity:1},Ay=class ld extends cn{get isGraphic(){return!0}get color(){return this._color||(this._color=new oe(1,1,1,1)),this._color}set color(e){(!this._color||this._color.r!==e.r||this._color.g!==e.g||this._color.b!==e.b||this._color.alpha!==e.alpha)&&(this._color||(this._color=new oe(1,1,1,1)),this._color.copy(e),this.onColorChanged())}_alphaFactor=1;setAlphaFactor(e){this._alphaFactor=e,this.onColorChanged()}get alphaFactor(){return this._alphaFactor}sRGBColor=new ne(1,0,1);onColorChanged(){if(this.uiObject){this.sRGBColor.copy(this._color),this.sRGBColor.convertLinearToSRGB(),Xr.backgroundColor=this.sRGBColor,Xr.backgroundOpacity=this._color.alpha;const e=this.uiObject._simpleState__activeStates?.[0];if(e){const t=this.uiObject._simpleState__states?.[e];t&&("backgroundColor"in t&&(Xr.backgroundColor=t.backgroundColor),"backgroundOpacity"in t&&(Xr.backgroundOpacity=t.backgroundOpacity))}Xr.backgroundOpacity*=this._alphaFactor,this.applyEffects(Xr,this._alphaFactor),this.uiObject.set(Xr),this.markDirty()}}get m_Color(){return this._color}raycastTarget=!0;uiObject=null;_color=null;_rect=null;_stateManager=null;get rectTransform(){if(this._rect||(this._rect=x.getComponent(this.gameObject,Rn)),!this._rect)throw new Error("Not Supported: Make sure to add a RectTransform component before adding a UI Graphic component.");return this._rect}onParentRectTransformChanged(){this.uiObject?.set({width:this.rectTransform.width,height:this.rectTransform.height}),this.markDirty()}__internalNewInstanceCreated(e){return super.__internalNewInstanceCreated(e),this._rect=null,this.uiObject=null,this._stateManager=null,this._color&&(this._color=this._color.clone()),this}setState(e){this.makePanel(),this.uiObject&&(this.uiObject.setState(e),this?.markDirty())}setupState(e){this.makePanel(),this.uiObject&&(this._stateManager||(this._stateManager=new bP(this.uiObject)),this.uiObject.setupState(e.state,e.attributes))}setOptions(e){this.makePanel(),this.uiObject&&this.uiObject.set(e)}awake(){super.awake(),this.makePanel(),Ja(this,"_color",()=>TR(this,this.onColorChanged))}onEnable(){super.onEnable(),this.uiObject&&(this.rectTransform.shadowComponent?.add(this.uiObject),this.addShadowComponent(this.uiObject,this.rectTransform))}onDisable(){super.onDisable(),this.uiObject&&this.removeShadowComponent()}_currentlyCreatingPanel=!1;makePanel(){if(this.uiObject||this._currentlyCreatingPanel)return;this._currentlyCreatingPanel=!0;const e={backgroundColor:this.color,backgroundOpacity:this.color.alpha,offset:.015};this.onBeforeCreate(e),this.applyEffects(e),this.onCreate(e),this.controlsChildLayout=!1,this._currentlyCreatingPanel=!1,this.onAfterCreated(),this.onColorChanged()}onBeforeCreate(e){}onCreate(e){this.uiObject=this.rectTransform.createNewBlock(e),this.uiObject.name=this.name}onAfterCreated(){}applyEffects(e,t=1){const i=this.gameObject?.getComponent(wl);i&&(i.effectDistance&&(e.borderWidth=Math.max(Math.abs(i.effectDistance.x),Math.abs(i.effectDistance.y))),i.effectColor&&(e.borderColor=i.effectColor,e.borderOpacity=i.effectColor.alpha*t))}static textureCache=new Map;async setTexture(e){if(this.setOptions({backgroundOpacity:0}),e){if(ld.textureCache.has(e))e=ld.textureCache.get(e);else if(!e.isRenderTargetTexture){const t=e.clone();t.colorSpace=So,ld.textureCache.set(e,t),e=t}this.setOptions({backgroundImage:e,borderRadius:0,backgroundOpacity:this.color.alpha,backgroundSize:"stretch"}),Ve.assignTextureLOD(e,0).then(t=>{t instanceof Le&&(e&&ld.textureCache.set(e,t),this.setOptions({backgroundImage:t}),this.markDirty())})}else this.setOptions({backgroundImage:void 0,borderRadius:0,backgroundOpacity:this.color.alpha});this.markDirty()}onAfterAddedToScene(){super.onAfterAddedToScene(),this.shadowComponent&&(this.shadowComponent.offset=this.shadowComponent.position.z)}};Jx([u(oe)],Ay.prototype,"color",1),Jx([u()],Ay.prototype,"raycastTarget",2);let ch=Ay;class hh extends ch{_flippedObject=!1;onAfterCreated(){this.uiObject&&!this._flippedObject&&(this._flippedObject=!0,this.uiObject.scale.y*=-1)}}var FE=Object.defineProperty,UE=Object.getOwnPropertyDescriptor,Ho=(o,e,t,i)=>{for(var n=i>1?void 0:i?UE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&FE(e,t,n),n};const Qr=v("debugtext");var lt=(o=>(o[o.UpperLeft=0]="UpperLeft",o[o.UpperCenter=1]="UpperCenter",o[o.UpperRight=2]="UpperRight",o[o.MiddleLeft=3]="MiddleLeft",o[o.MiddleCenter=4]="MiddleCenter",o[o.MiddleRight=5]="MiddleRight",o[o.LowerLeft=6]="LowerLeft",o[o.LowerCenter=7]="LowerCenter",o[o.LowerRight=8]="LowerRight",o))(lt||{}),e1=(o=>(o[o.Normal=0]="Normal",o[o.Bold=1]="Bold",o[o.Italic=2]="Italic",o[o.BoldAndItalic=3]="BoldAndItalic",o))(e1||{});class Nt extends ch{alignment=0;verticalOverflow=0;horizontalOverflow=0;lineSpacing=1;supportRichText=!1;font;fontStyle=0;setAlphaFactor(e){super.setAlphaFactor(e),this.uiObject?.set({fontOpacity:this.color.alpha*this.alphaFactor}),this.markDirty()}get text(){return this._text}set text(e){e!==this._text&&(this._text=e,this.feedText(this.text,this.supportRichText),this.markDirty())}set_text(e){this.text=e}get fontSize(){return this._fontSize}set fontSize(e){this._fontSize=e,this.uiObject?.set({fontSize:e})}sRGBTextColor=new ne(1,0,1);onColorChanged(){this.sRGBTextColor.copy(this.color),this.sRGBTextColor.convertLinearToSRGB(),this.uiObject?.set({color:this.sRGBTextColor,fontOpacity:this.color.alpha})}onParentRectTransformChanged(){super.onParentRectTransformChanged(),this.uiObject&&this.updateOverflow()}onBeforeCanvasRender(e){this.updateOverflow()}updateOverflow(){const e=this.uiObject?._overflow;e&&(e._needsUpdate=!0)}onCreate(e){Qr&&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,Qr&&(e.backgroundColor=16750848,e.backgroundOpacity=.5);const t=this.rectTransform;e={...e,...this.getTextOpts()},this.getAlignment(e),Qr&&(e.backgroundColor=Math.random()*16777215,e.backgroundOpacity=.1),this.uiObject=t.createNewText(e),this.feedText(this.text,this.supportRichText)}onAfterAddedToScene(){super.onAfterAddedToScene(),this.handleTextRenderOnTop()}_text="";_fontSize=12;_textMeshUi=null;getTextOpts(){const e=this.fontSize,t={color:this.color,fontOpacity:this.color.alpha,fontSize:e,fontKerning:"normal"};return this.setFont(t,this.fontStyle),t}onEnable(){super.onEnable(),this._didHandleTextRenderOnTop=!1,this.uiObject&&this.uiObject.addAfterUpdate(()=>{this.setShadowComponentOwner(this.uiObject),this.markDirty()}),setTimeout(()=>this.markDirty(),10),this.canvas?.registerEventReceiver(this)}onDisable(){super.onDisable(),this.canvas?.unregisterEventReceiver(this)}getAlignment(e){switch(e.flexDirection="column",this.alignment){case 0:case 3:case 6:e.textAlign="left";break;case 1:case 4:case 7:e.textAlign="center";break;case 2:case 5:case 8:e.textAlign="right";break}switch(this.alignment){default:case 0:case 1:case 2:e.alignItems="start";break;case 3:case 4:case 5:e.alignItems="center";break;case 6:case 7:case 8:e.alignItems="end";break}return e}feedText(e,t){if(Qr&&console.log("feedText",this.uiObject,e,t),!!this.uiObject)if(this._textMeshUi||(this._textMeshUi=[]),this.uiObject.children.length=0,!t||e.length===0)this.uiObject.textContent=e;else{let i=this.getNextTag(e);if(i){if(i.startIndex>0){for(let r=this.uiObject.children.length-1;r>=0;r--){const a=this.uiObject.children[r];a.isUI&&(this.uiObject.remove(a),a.clear())}const s=new Em({textContent:e.substring(0,i.startIndex),color:"inherit"});this.uiObject.add(s)}}else{this.uiObject.textContent="",this.setOptions({textContent:e});return}const n=[];for(;i;){const s=this.getNextTag(e,i.endIndex),r={fontFamily:this.uiObject?.get("fontFamily"),color:"inherit",textContent:""};if(s){r.textContent=this.getText(e,i,s),this.handleTag(i,r,n);const a=new Em(r);this.uiObject?.add(a)}else{r.textContent=e.substring(i.endIndex),this.handleTag(i,r,n);const a=new Em(r);this.uiObject?.add(a)}i=s}}}_didHandleTextRenderOnTop=!1;handleTextRenderOnTop(){this._didHandleTextRenderOnTop||(this._didHandleTextRenderOnTop=!0,this.startCoroutine(this.renderOnTopCoroutine()))}*renderOnTopCoroutine(){if(!this.canvas)return;const e=[],t=this.canvas,i={renderOnTop:t.renderOnTop,depthWrite:t.depthWrite,doubleSided:t.doubleSided};for(;;){let n=!1;if(this._textMeshUi)for(let s=0;s<this._textMeshUi.length;s++){if(e[s]===!0)continue;n=!0;const r=this._textMeshUi[s];r.textContent&&(ju(r,i),e[s]=!0)}if(!n)break;yield}}handleTag(e,t,i){if(!e.isEndTag){if(e.type.includes("color")){const n=new Iy(e,{color:t.color});if(i.push(n),e.type.length>6){const s=parseInt("0x"+e.type.substring(7));t.color=s}else t.color=new ne(1,1,1)}else if(e.type=="b"){this.setFont(t,1);const n=new Iy(e,{fontWeight:700});i.push(n)}else if(e.type=="i"){this.setFont(t,2);const n=new Iy(e,{fontStyle:"italic"});i.push(n)}}}getText(e,t,i){return e.substring(t.endIndex,i.startIndex)}getNextTag(e,t=0){const i=e.indexOf("<",t),n=e.indexOf(">",i);if(i>=0&&n>=0){const s=e.substring(i+1,n);return{type:s,startIndex:i,endIndex:n+1,isEndTag:s.startsWith("/")}}return null}setFont(e,t){if(!this.font)return;const i=this.font,n=this.getFamilyNameWithCorrectSuffix(i,t);Qr&&console.log("Selected font family:"+n);let s=Rb.getFontFamily(n);switch(s||(s=Rb.addFontFamily(n)),e.fontFamily=s,t){default:case 0:e.fontWeight=400,e.fontStyle="normal";break;case 1:e.fontWeight=700,e.fontStyle="normal";break;case 2:e.fontWeight=400,e.fontStyle="italic";break;case 3:e.fontStyle="italic",e.fontWeight=400}let r=s.getVariant(e.fontWeight,e.fontStyle);if(!r){let a=n;a?.endsWith("-msdf.json")||(a+="-msdf.json");let l=n;l?.endsWith(".png")||(l+=".png"),r=s.addVariant(e.fontWeight,e.fontStyle,a,l),r?.addEventListener("ready",()=>{this.markDirty()})}}getFamilyNameWithCorrectSuffix(e,t){(e.startsWith("https:")||e.startsWith("http:"))&&(e=new URL(e).pathname);const i=e.lastIndexOf("-");if(i<0)return e;const n=e.substring(i+1)?.toLowerCase();if(zE.includes(n))return Qr&&console.warn("Unsupported font style: "+n),e;const s=e.lastIndexOf("/");let r=e;s>=0&&(r=r.substring(s+1));const a=r[0]===r[0].toUpperCase(),l=e.substring(0,i>s?i:e.length);switch(Qr&&console.log("Select font: ",e,e1[t],r,a,l),t){case 0:return a?l+"-Regular":l+"-regular";case 1:return a?l+"-Bold":l+"-bold";case 2:return a?l+"-Italic":l+"-italic";case 3:return a?l+"-BoldItalic":l+"-bolditalic";default:return e}}}Ho([u()],Nt.prototype,"alignment",2),Ho([u()],Nt.prototype,"verticalOverflow",2),Ho([u()],Nt.prototype,"horizontalOverflow",2),Ho([u()],Nt.prototype,"lineSpacing",2),Ho([u()],Nt.prototype,"supportRichText",2),Ho([u(URL)],Nt.prototype,"font",2),Ho([u()],Nt.prototype,"fontStyle",2),Ho([u()],Nt.prototype,"text",1),Ho([u()],Nt.prototype,"fontSize",1);class Iy{tag;previousValues;constructor(e,t){this.tag=e,this.previousValues=t}}const zE=["medium","mediumitalic","black","blackitalic","thin","thinitalic","extrabold","light","lightitalic","semibold"];class xl{static global_id=0;static getId(){return this.global_id++}id;content="";font=[];pointSize=144;width;height;depth;wrapMode;horizontalAlignment;verticalAlignment;material;setDepth(e){return this.depth=e,this}setPointSize(e){return this.pointSize=e,this}setHorizontalAlignment(e){return this.horizontalAlignment=e,this}setVerticalAlignment(e){return this.verticalAlignment=e,this}constructor(e){this.id=e}writeTo(e,t){t.beginBlock(`def Preliminary_Text "${this.id}"`,"(",!1),t.appendLine('prepend apiSchemas = ["MaterialBindingAPI"]'),t.closeBlock(")"),t.beginBlock(),this.content&&t.appendLine(`string content = "${this.content}"`),(!this.font||this.font.length<=0)&&(this.font||=[],this.font?.push("sans-serif"));const i=this.font.map(n=>`"${n}"`).join(", ");t.appendLine(`string[] font = [ ${i} ]`),t.appendLine(`double pointSize = ${this.pointSize}`),typeof this.width=="number"&&t.appendLine(`double width = ${this.width}`),typeof this.height=="number"&&t.appendLine(`double height = ${this.height}`),typeof this.depth=="number"&&t.appendLine(`double depth = ${this.depth}`),this.wrapMode&&t.appendLine(`token wrapMode = "${this.wrapMode}"`),this.horizontalAlignment&&t.appendLine(`token horizontalAlignment = "${this.horizontalAlignment}"`),this.verticalAlignment&&t.appendLine(`token verticalAlignment = "${this.verticalAlignment}"`),this.material!==void 0&&t.appendLine(`rel material:binding = </StageRoot/Materials/${ip(this.material)}>`),t.closeBlock()}}class Ly{static singleLine(e,t,i){const n=new xl("text_"+xl.getId());return n.content=e,t&&(n.pointSize=t),i&&(n.depth=i),n}static multiLine(e,t,i,n,s,r){const a=new xl("text_"+xl.getId());return a.content=e,a.width=t,a.height=i,a.horizontalAlignment=n,a.verticalAlignment=s,r!==void 0&&(a.wrapMode=r),a}}const NE=new K().makeRotationY(Math.PI),VE=new K().makeScale(-1,1,-1);class mp{get extensionName(){return"text"}exportText(e,t,i){const n=x.getComponent(e,Nt);if(!n)return;const s=x.getComponent(e,Rn);let r=100,a=100;s&&(r=s.width,a=s.height);const l=NE.clone();s&&l.premultiply(VE),t.setMatrix(l);const c=n.color.clone();t.material=new pt({color:c,emissive:c}),t.addEventListener("serialize",(h,d)=>{let p=n.text;p=p.replace(/\r/g,""),p=p.replace(/\n/g,"\\n");const m=Ly.multiLine(p,r,a,"center","bottom","flowing");this.setTextAlignment(m,n.alignment),this.setOverflow(m,n),t.material&&(m.material=t.material),m.pointSize=this.convertToTextSize(n.fontSize),m.depth=.001,m.writeTo(void 0,h)})}convertToTextSize(e){return 1/.0502*144*e}setOverflow(e,t){t.horizontalOverflow?e.wrapMode="singleLine":e.wrapMode="flowing"}setTextAlignment(e,t){switch(t){case lt.LowerLeft:case lt.MiddleLeft:case lt.UpperLeft:e.horizontalAlignment="left";break;case lt.LowerCenter:case lt.MiddleCenter:case lt.UpperCenter:e.horizontalAlignment="center";break;case lt.LowerRight:case lt.MiddleRight:case lt.UpperRight:e.horizontalAlignment="right";break}switch(t){case lt.LowerLeft:case lt.LowerCenter:case lt.LowerRight:e.verticalAlignment="bottom";break;case lt.MiddleLeft:case lt.MiddleCenter:case lt.MiddleRight:e.verticalAlignment="middle";break;case lt.UpperLeft:case lt.UpperCenter:case lt.UpperRight:e.verticalAlignment="top";break}}}var WE=Object.defineProperty,Ke=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&WE(e,t,n),n};const t1=v("debuguilayout");class Yr{left=0;right=0;top=0;bottom=0;get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}}Ke([u()],Yr.prototype,"left"),Ke([u()],Yr.prototype,"right"),Ke([u()],Yr.prototype,"top"),Ke([u()],Yr.prototype,"bottom");class ji extends R{_rectTransform=null;get rectTransform(){return this._rectTransform}onParentRectTransformChanged(e){this._needsUpdate=!0}_needsUpdate=!1;get isDirty(){return this._needsUpdate}get isLayoutGroup(){return!0}updateLayout(){this._rectTransform&&(t1&&console.warn("Layout Update",this.context.time.frame,this.name),this._needsUpdate=!1,this.onCalculateLayout(this._rectTransform))}childAlignment=0;reverseArrangement=!1;spacing=0;padding;minWidth=0;minHeight=0;flexibleHeight=0;flexibleWidth=0;preferredHeight=0;preferredWidth=0;start(){this._needsUpdate=!0}onEnable(){t1&&console.log(this.name,this),this._rectTransform=this.gameObject.getComponent(Rn);const e=this.gameObject.getComponentInParent(Sl);e&&e.registerLayoutGroup(this),this._needsUpdate=!0}onDisable(){const e=this.gameObject.getComponentInParent(Sl);e&&e.unregisterLayoutGroup(this)}set m_Spacing(e){e!==this.spacing&&(this._needsUpdate=!0,this.spacing=e)}get m_Spacing(){return this.spacing}}Ke([u()],ji.prototype,"childAlignment"),Ke([u()],ji.prototype,"reverseArrangement"),Ke([u()],ji.prototype,"spacing"),Ke([u(Yr)],ji.prototype,"padding"),Ke([u()],ji.prototype,"minWidth"),Ke([u()],ji.prototype,"minHeight"),Ke([u()],ji.prototype,"flexibleHeight"),Ke([u()],ji.prototype,"flexibleWidth"),Ke([u()],ji.prototype,"preferredHeight"),Ke([u()],ji.prototype,"preferredWidth");class Us extends ji{childControlHeight=!0;childControlWidth=!0;childForceExpandHeight=!1;childForceExpandWidth=!1;childScaleHeight=!1;childScaleWidth=!1;onCalculateLayout(e){const t=this.primaryAxis,i=e.width;let n=i;const s=e.height;let r=s;n-=this.padding.horizontal,r-=this.padding.vertical,t==="x"?this.padding.horizontal:this.padding.vertical;const a=t==="x",l=a?"y":"x",c=a?this.childControlWidth:this.childControlHeight,h=a?this.childControlHeight:this.childControlWidth,d=a?this.childForceExpandWidth:this.childForceExpandHeight,p=a?this.childForceExpandHeight:this.childForceExpandWidth,m=a?r:n,f=a?i:s,g=.5*(a?this.childAlignment%3:Math.floor(this.childAlignment/3));let y=0;a?y+=this.padding.left:y+=this.padding.top;let _=0,w=0;for(let I=0;I<this.gameObject.children.length;I++){const N=this.gameObject.children[I],V=x.getComponent(N,Rn);V?.activeAndEnabled&&(w+=1,a?_+=V.width:_+=V.height)}let P=0;const M=this.spacing*(w-1);if(d||c){let I=0;a?I=n-=M:I=r-=M,w>0&&(P=I/w)}let O=0;O+=this.padding.left,O-=this.padding.right,g!==0&&(y=f-_,y*=g,y-=M*g,a?(y-=this.padding.right*g,y+=this.padding.left*(1-g),y<this.padding.left&&(y=this.padding.left)):(y-=this.padding.bottom*g,y+=this.padding.top*(1-g),y<this.padding.top&&(y=this.padding.top)));let j=1;for(let I=0;I<this.gameObject.children.length;I++){const N=this.gameObject.children[I],V=x.getComponent(N,Rn);if(V?.activeAndEnabled){V.pivot?.set(.5,.5),V.anchorMin.set(0,1),V.anchorMax.set(0,1);const H=i*.5+O*.5;V.anchoredPosition.x!==H&&(V.anchoredPosition.x=H);const X=s*-.5;V.anchoredPosition.y!==X&&(V.anchoredPosition.y=X),p&&h&&V.sizeDelta[l]!==m&&(V.sizeDelta[l]=m),d&&c&&V.sizeDelta[t]!==P&&(V.sizeDelta[t]=P);const T=a?V.width:V.height,$=T*.5;if(y+=$,d){const se=P*j-P*.5;se>y&&(y=se-P*.5+T+this.padding.left,y-=$)}let W=y;t==="y"&&(W=-W),V.anchoredPosition[t]!==W&&(V.anchoredPosition[t]=W),y+=$,y+=this.spacing,j+=1}}}}Ke([u()],Us.prototype,"childControlHeight"),Ke([u()],Us.prototype,"childControlWidth"),Ke([u()],Us.prototype,"childForceExpandHeight"),Ke([u()],Us.prototype,"childForceExpandWidth"),Ke([u()],Us.prototype,"childScaleHeight"),Ke([u()],Us.prototype,"childScaleWidth");class jy extends Us{get primaryAxis(){return"y"}}class Dy extends Us{get primaryAxis(){return"x"}}class By extends ji{onCalculateLayout(){}}var $E=Object.defineProperty,HE=Object.getOwnPropertyDescriptor,ao=(o,e,t,i)=>{for(var n=i>1?void 0:i?HE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&$E(e,t,n),n},i1=(o=>(o[o.ScreenSpaceOverlay=0]="ScreenSpaceOverlay",o[o.ScreenSpaceCamera=1]="ScreenSpaceCamera",o[o.WorldSpace=2]="WorldSpace",o[o.Undefined=-1]="Undefined",o))(i1||{});const Fy=v("debuguilayout"),nn=class bS extends rh{get isCanvas(){return!0}get screenspace(){return this.renderMode!==2}set renderOnTop(e){e!==this._renderOnTop&&(this._renderOnTop=e,this.onRenderSettingsChanged())}get renderOnTop(){return this._renderOnTop!==void 0?this._renderOnTop:!!(this.screenspace&&this._renderMode===0)}_renderOnTop;set depthWrite(e){this._depthWrite!==e&&(this._depthWrite=e,this.onRenderSettingsChanged())}get depthWrite(){return this._depthWrite}_depthWrite=!1;set doubleSided(e){this._doubleSided!==e&&(this._doubleSided=e,this.onRenderSettingsChanged())}get doubleSided(){return this._doubleSided}_doubleSided=!0;set castShadows(e){this._castShadows!==e&&(this._castShadows=e,this.onRenderSettingsChanged())}get castShadows(){return this._castShadows}_castShadows=!1;set receiveShadows(e){this._receiveShadows!==e&&(this._receiveShadows=e,this.onRenderSettingsChanged())}get receiveShadows(){return this._receiveShadows}_receiveShadows=!1;get renderMode(){return this._renderMode}set renderMode(e){this._renderMode!==e&&(this._renderMode=e,this.onRenderSettingsChanged())}_renderMode=-1;_rootCanvas;set rootCanvas(e){this._rootCanvas instanceof bS||(this._rootCanvas=e)}get rootCanvas(){return this._rootCanvas}_scaleFactor=1;get scaleFactor(){return this._scaleFactor}set scaleFactor(e){this._scaleFactor=e}worldCamera;planeDistance=-1;awake(){this.shadowComponent=this.gameObject,this.previousParent=this.gameObject.parent,Fy&&console.log("Canvas.Awake()",this.previousParent?.name+"/"+this.gameObject.name),super.awake()}start(){this.applyRenderSettings()}onEnable(){super.onEnable(),this._updateRenderSettingsRoutine=void 0,this._lastMatrixWorld=new K,this.applyRenderSettings(),document.addEventListener("resize",this._boundRenderSettingsChanged),this.context.pre_render_callbacks.push(this.onBeforeRenderRoutine),this.context.post_render_callbacks.push(this.onAfterRenderRoutine)}onDisable(){super.onDisable(),document.removeEventListener("resize",this._boundRenderSettingsChanged);const e=this.context.pre_render_callbacks.indexOf(this.onBeforeRenderRoutine);e!==-1&&this.context.pre_render_callbacks.splice(e,1);const t=this.context.post_render_callbacks.indexOf(this.onAfterRenderRoutine);t!==-1&&this.context.post_render_callbacks.splice(t,1)}_boundRenderSettingsChanged=this.onRenderSettingsChanged.bind(this);previousParent=null;_lastMatrixWorld=null;_rectTransforms=[];registerTransform(e){this._rectTransforms.push(e)}unregisterTransform(e){const t=this._rectTransforms.indexOf(e);t!==-1&&this._rectTransforms.splice(t,1)}_layoutGroups=new Map;registerLayoutGroup(e){const t=e.gameObject;this._layoutGroups.set(t,e)}unregisterLayoutGroup(e){const t=e.gameObject;this._layoutGroups.delete(t)}_receivers=[];registerEventReceiver(e){this._receivers.push(e)}unregisterEventReceiver(e){const t=this._receivers.indexOf(e);t!==-1&&this._receivers.splice(t,1)}async onEnterXR(e){this.screenspace?(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!1):(this.gameObject.visible=!1,await ic(1).then(()=>{this.gameObject.visible=!0}))}onLeaveXR(e){this.screenspace&&(e.xr.isVR||e.xr.isPassThrough)&&(this.gameObject.visible=!0)}onBeforeRenderRoutine=()=>{if(this.previousParent=this.gameObject.parent,(this.context.xr?.isVR||this.context.xr?.isPassThrough)&&this.screenspace){this.gameObject.visible=!1,this.gameObject.removeFromParent();return}this.renderOnTop||this.screenspace?this.gameObject.removeFromParent():(this.onUpdateRenderMode(),this.handleLayoutUpdates(),this.shadowComponent?.updateMatrixWorld(!0),this.shadowComponent?.updateWorldMatrix(!0,!0),this.invokeBeforeRenderEvents(),si.ensureUpdateMeshUI(Tb,this.context))};onAfterRenderRoutine=()=>{if((this.context.xr?.isVR||this.context.xr?.isPassThrough)&&this.screenspace){this.previousParent?.add(this.gameObject);return}if((this.screenspace||this.renderOnTop)&&this.previousParent&&this.context.mainCamera){this.screenspace?this.context.mainCamera?.add(this.gameObject):this.previousParent.add(this.gameObject);const e=this.context.renderer.autoClear,t=this.context.renderer.autoClearColor;this.context.renderer.autoClear=!1,this.context.renderer.autoClearColor=!1,this.context.renderer.clearDepth(),this.onUpdateRenderMode(!0),this.handleLayoutUpdates(),this.shadowComponent?.updateMatrixWorld(!0),this.invokeBeforeRenderEvents(),si.ensureUpdateMeshUI(Tb,this.context,!0),this.context.renderer.render(this.gameObject,this.context.mainCamera),this.context.renderer.autoClear=e,this.context.renderer.autoClearColor=t,this.previousParent.add(this.gameObject)}this._lastMatrixWorld?.copy(this.gameObject.matrixWorld)};invokeBeforeRenderEvents(){for(const e of this._receivers)e.onBeforeCanvasRender?.(this)}handleLayoutUpdates(){this._lastMatrixWorld===null&&(this._lastMatrixWorld=new K);const e=!this._lastMatrixWorld.equals(this.gameObject.matrixWorld);Fy&&e&&console.log("Canvas Layout changed",this.context.time.frameCount,this.name);for(const t of this._rectTransforms){e&&t.markDirty();let i=this._layoutGroups.get(t.gameObject);t.isDirty&&!i&&(i=t.gameObject.getComponentInParent(ji)),(t.isDirty||i?.isDirty)&&(Fy&&console.log("CANVAS UPDATE ### "+t.name+" ##################################### "+this.context.time.frame),i?.updateLayout(),t.updateTransform())}}applyRenderSettings(){this.onRenderSettingsChanged()}_updateRenderSettingsRoutine;onRenderSettingsChanged(){this._updateRenderSettingsRoutine||(this._updateRenderSettingsRoutine=this.startCoroutine(this._updateRenderSettingsDelayed(),we.OnBeforeRender))}*_updateRenderSettingsDelayed(){if(yield,this._updateRenderSettingsRoutine=void 0,this.shadowComponent){this.onUpdateRenderMode(),ju(this.shadowComponent,this);for(const e of x.getComponentsInChildren(this.gameObject,cn))ju(e.shadowComponent,this)}}_activeRenderMode=-1;_lastWidth=-1;_lastHeight=-1;onUpdateRenderMode(e=!1){if(!e&&this._renderMode===this._activeRenderMode&&this._lastWidth===this.context.domWidth&&this._lastHeight===this.context.domHeight)return;this._activeRenderMode=this._renderMode;let t=this.context.mainCameraComponent,i=10;switch(t&&t.nearClipPlane>0&&t.farClipPlane>0&&(i=L.lerp(t.nearClipPlane,t.farClipPlane,.01)),this._renderMode===1&&(this.worldCamera&&(t=this.worldCamera),this.planeDistance>0&&(i=this.planeDistance)),this._renderMode){case 0:case 1:if(this._lastWidth=this.context.domWidth,this._lastHeight=this.context.domHeight,!t)return;const n=i+.01;this.gameObject.position.x=0,this.gameObject.position.y=0,this.gameObject.position.z=-n,this.gameObject.quaternion.identity();const s=this.gameObject.getComponent(Rn);let r=!1;s.sizeDelta.x!==this.context.domWidth&&(r=!0),s.sizeDelta.y!==this.context.domHeight&&(r=!0);const a=t.fieldOfView*Math.PI/180,l=2*Math.tan(a/2)*Math.abs(n);this.gameObject.scale.x=l/this.context.domHeight,this.gameObject.scale.y=l/this.context.domHeight,this.gameObject.scale.z=.01,r&&(s.sizeDelta.x=this.context.domWidth,s.sizeDelta.y=this.context.domHeight,s?.markDirty());break;case 2:this._lastWidth=-1,this._lastHeight=-1;break}}};ao([u()],nn.prototype,"renderOnTop",1),ao([u()],nn.prototype,"depthWrite",1),ao([u()],nn.prototype,"doubleSided",1),ao([u()],nn.prototype,"castShadows",1),ao([u()],nn.prototype,"receiveShadows",1),ao([u()],nn.prototype,"renderMode",1),ao([u(nn)],nn.prototype,"rootCanvas",1),ao([u()],nn.prototype,"scaleFactor",1),ao([u(hi)],nn.prototype,"worldCamera",2),ao([u()],nn.prototype,"planeDistance",2);let Sl=nn;var GE=Object.defineProperty,qE=Object.getOwnPropertyDescriptor,Uy=(o,e,t,i)=>{for(var n=i>1?void 0:i?qE(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&GE(e,t,n),n};class zs extends R{get alpha(){return this._alpha}set alpha(e){e!==this._alpha&&(this._alpha=e,this.markDirty())}get isCanvasGroup(){return!0}_alpha=1;interactable=!0;blocksRaycasts=!0;_isDirty=!1;markDirty(){this._isDirty||(this._isDirty=!0,this.startCoroutine(this.applyChangesDelayed(),we.OnBeforeRender))}*applyChangesDelayed(){this._isDirty=!1,this.applyChangesNow()}_buffer=[];applyChangesNow(){this._buffer.length=0;for(const e of x.getComponentsInChildren(this.gameObject,cn,this._buffer)){const t=e;t.setAlphaFactor&&t.setAlphaFactor(this._alpha)}}}Uy([u()],zs.prototype,"alpha",1),Uy([u()],zs.prototype,"interactable",2),Uy([u()],zs.prototype,"blocksRaycasts",2);class zy{get extensionName(){return"tmui"}onExportObject(e,t,i){const n=x.getComponent(e,Sl);if(n&&n.enabled&&n.renderMode===i1.WorldSpace){const s=new mp,r=x.getComponent(e,Rn),a=x.getComponent(e,zs),l=new Array;if(r){if(!x.isActiveSelf(e)){const d=x.isActiveSelf(e);x.setActive(e,!0),r.onEnable(),r.updateTransform(),l.push(()=>{r.onDisable(),x.setActive(e,d)})}e.traverse(d=>{if(!x.isActiveInHierarchy(d)){const p=x.isActiveSelf(d);x.setActive(d,!0);const m=x.getComponent(d,cn);m&&(m.onEnable(),l.push(()=>{m.onDisable()}));const f=x.getComponent(d,Rn);f&&(f.onEnable(),f.updateTransform(),f.onApplyTransform(),l.push(()=>{f.onDisable()}));const g=x.getComponent(d,Nt);g&&(g.onEnable(),l.push(()=>{g.onDisable()})),l.push(()=>{x.setActive(d,p)})}}),r.width,r.height;const c=nt.createEmpty(),h=r.shadowComponent;if(t.add(c),h){const d=h.matrix;c.setMatrix(d);const p=new Map,m=new Map;p.set(h,c),m.set(h,a?a.alpha:1),h.traverse(f=>{if(f===h)return;const g=nt.createEmpty();g.setMatrix(f.matrix);const y=f.parent,_=!!y&&typeof y.textContent=="string"&&y.textContent.length>0;let w=m.get(y)||1;const P=x.getComponent(f,zs);if(P&&(w*=P.alpha),f instanceof G&&_){const O=f[Mi];O?s.exportText(O.gameObject,g,i):console.error("Error when exporting UI: shadow component owner not found. This is likely a bug.",f)}if(f instanceof G&&!_){const O=f.geometry.clone();O.scale(1,1,-1),this.flipWindingOrder(O),g.geometry=O;const j=new ne,I=f.material.opacity;j.copy(f.material.color),g.material=new xe({color:j,opacity:I*w,map:f.material.map,transparent:!0})}p.set(f,g),m.set(f,w);const M=p.get(y);if(!M){console.error("Error when exporting UI: shadow component parent not found!",f,f.parent);return}M.add(g)})}}for(const c of l)c()}}flipWindingOrder(e){const t=e.index.array;for(let i=0,n=t.length/3;i<n;i++){const s=t[i*3];t[i*3]=t[i*3+2],t[i*3+2]=s}e.index.needsUpdate=!0}}const dh=v("debugusdz");function XE(o,e){const t=[],i=x.getComponentsInChildren(o,yt),n=x.getComponentsInChildren(o,Dt),s=new Array,r=new Array;if(e.injectImplicitBehaviours)for(const a of i){if(!a||!a.runtimeAnimatorController||!a.enabled)continue;const l=a.runtimeAnimatorController.activeState;if(!l||!l.motion||!l.motion.clip||l.motion.clip.tracks?.length<1||s.includes(a))continue;const c=new Jc;c.animator=a,c.stateName=l.name,c.trigger="start",c.name="PlayAnimationOnClick_implicitAtStart_"+c.stateName;const h=new k;x.addComponent(h,c),r.push(h),s.push(a),o.add(h)}else for(const a of i){if(!a||!a.runtimeAnimatorController||!a.enabled)continue;dh&&console.log(a);const l=[];for(const c of a.runtimeAnimatorController.enumerateActions()){dh&&console.log(c);const h=c.getClip();l.includes(h)||l.push(h)}t.push({root:a.gameObject,clips:l})}if(e.injectImplicitBehaviours)for(const a of n){if(!a||!a.clip||!a.enabled||!a.playAutomatically||s.includes(a))continue;const l=new Jc;l.animation=a,l.stateName=a.clip.name,l.trigger="start",l.name="PlayAnimationOnClick_implicitAtStart_"+l.stateName;const c=new k;x.addComponent(c,l),r.push(c),s.push(a),o.add(c)}else for(const a of n){dh&&console.log(a);const l=[];for(const c of a.animations)l.includes(c)||l.push(c);t.push({root:a.gameObject,clips:l})}dh&&t?.length>0&&console.log("USDZ Animation Clips without behaviours",t);for(const a of t)for(const l of a.clips)e.registerAnimation(a.root,l);return r}function QE(o,e){const t=x.getComponentsInChildren(o,Ai),i=x.getComponentsInChildren(o,Is),n=new Array,s=new Array;dh&&console.log({audioSources:t,playAudioOnClicks:i});for(const r of i){if(!r.target)continue;const a=t.indexOf(r.target);a>-1&&t.splice(a,1)}for(const r of t){if(!r||!r.clip||r.volume<=0||n.includes(r))continue;const a=new Is;a.target=r,a.name="PlayAudioOnClick_implicitAtStart_",a.trigger="start";const l=new k;x.addComponent(l,a),console.log("implicit PlayAudioOnStart",l,a),s.push(l),n.push(r),o.add(l)}return s}function YE(o){return new It("DisableAtStart",zt.sceneStartTrigger(),ge.fadeAction(o,0,!1))}function n1(o,e){const t=o.domElement.shadowRoot.querySelector("link[rel='ar']");if(t)return t;const i=document.createElement("div");i.classList.add("menu"),i.classList.add("quicklook-menu"),i.style.display="none",i.style.visibility="hidden";const n=document.createElement("button");n.id="open-in-ar",e?(n.innerText="View in AR",n.title="View this scene in AR. The scene will be exported to USDZ and opened with Apple's QuickLook."):(n.innerText="View in AR",n.title="Download this scene for AR. Open the downloaded USDZ file to view it in AR using Apple's QuickLook."),i.appendChild(n);const s=document.createElement("a");s.id="needle-usdz-link",s.style.display="none",s.rel="ar",s.href="",s.target="_blank",i.appendChild(s);const r=document.createElement("img");return r.id="button",s.appendChild(r),o.domElement.shadowRoot.appendChild(i),s}var ZE=Object.defineProperty,Mt=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ZE(e,t,n),n};const Rt=v("debugusdz"),KE=v("debugusdzpruning");class Zr{callToAction;checkoutTitle;checkoutSubtitle;callToActionURL}Mt([u()],Zr.prototype,"callToAction"),Mt([u()],Zr.prototype,"checkoutTitle"),Mt([u()],Zr.prototype,"checkoutSubtitle"),Mt([u()],Zr.prototype,"callToActionURL");const gi=class fa extends R{static beforeExport=new he;static afterExport=new he;static beforeLODExport=new he;objectToExport=void 0;autoExportAnimations=!0;autoExportAudioSources=!0;exportFileName=void 0;customUsdzFile=void 0;customBranding;anchoringType="plane";maxTextureSize=2048;planeAnchoringAlignment="horizontal";interactive=!0;physics=!0;allowCreateQuicklookButton=!0;quickLookCompatible=!0;extensions=[];link;button;start(){Rt&&(console.log("USDZExporter",this),console.log("Debug USDZ Mode. Press 'T' to export"),window.addEventListener("keydown",e=>{switch(e.key){case"t":this.exportAndOpen();break}})),this.objectToExport||(this.objectToExport=this.gameObject),!this.objectToExport?.children?.length&&!this.objectToExport?.isMesh&&(this.objectToExport=this.context.scene)}onEnable(){const e=q.supportsQuickLookAR(),t=q.isiOS()||q.isiPad();!this.button&&(Rt||e||t)&&(this.allowCreateQuicklookButton&&(this.button=this.createQuicklookButton()),this.lastCallback=this.quicklookCallback.bind(this),this.link=n1(this.context,e),this.link.addEventListener("message",this.lastCallback)),Rt&&Te("USDZ Exporter enabled: "+this.name),document.getElementById("open-in-ar")?.addEventListener("click",this.onClickedOpenInARElement),gc.registerExporter(this)}onDisable(){this.button?.remove(),this.link?.removeEventListener("message",this.lastCallback),Rt&&Te("USDZ Exporter disabled: "+this.name),document.getElementById("open-in-ar")?.removeEventListener("click",this.onClickedOpenInARElement),gc.unregisterExporter(this)}onClickedOpenInARElement=e=>{e.preventDefault(),this.exportAndOpen()};async exportAsync(){return this.exportAndOpen()}async exportAndOpen(){let e=this.exportFileName??this.objectToExport?.name??this.name;if(e+="-"+Sx(),Qn()||(e!==""&&(e+="-"),e+="MadeWithNeedle"),this.link||(this.link=n1(this.context,q.supportsQuickLookAR())),this.customUsdzFile)return Rt&&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;fa.beforeExport.invoke({exporter:this});const t=await this.export(this.objectToExport).finally(()=>{fa.afterExport.invoke({exporter:this})});return t?(Rt&&console.log("USDZ generation done. Downloading as "+e),this.openInQuickLook(t,e),t):(console.error("USDZ generation failed. Please report a bug",this),null)}async export(e){if(!e)return console.warn("No object to export"),null;const t=this._currentExportTasks.get(e);if(t)return t;const i=this.internalExport(e);return i instanceof Promise?(this._currentExportTasks.set(e,i),i.then(n=>(this._currentExportTasks.delete(e),n)).catch(n=>(this._currentExportTasks.delete(e),console.error("Error during USDZ export \u2013 please report a bug!",n),null))):i}_currentExportTasks=new Map;_previousTimeScale=1;async internalExport(e){ae.start("export-usdz",{onProgress:M=>{this.dispatchEvent(new CustomEvent("export-progress",{detail:{progress:M}}))}}),ae.report("export-usdz",{message:"Starting export",totalSteps:40,currentStep:0}),ae.report("export-usdz",{message:"Load progressive textures",autoStep:5}),ae.start("export-usdz-textures","export-usdz");const t=x.getComponentsInChildren(e,mi);for(const M of t)M&&M.enabled&&M.updateSprite(!0);const i=x.getComponentsInChildren(e,Kt),n=new Array;let s=0;for(const M of i){for(const O of M.sharedMeshes)if(O){let j=0;const I={exporter:this,type:"mesh",object:M.gameObject,mesh:O};if(fa.beforeLODExport.invoke(I),I.overrideLevel!==void 0)if(I.overrideLevel===-1){Rt&&console.warn("Skipping LOD export for mesh due to overrideLevel -1",M.gameObject,O);continue}else I.overrideLevel>=0&&(j=I.overrideLevel,Rt&&console.log("Overriding LOD level for mesh export to level "+j+" "+O.name));const N=Ve.assignMeshLOD(O,j);N instanceof Promise&&n.push(new Promise((V,H)=>{N.then(()=>{s++,ae.report("export-usdz-textures",{message:"Loaded progressive mesh",currentStep:s,totalSteps:n.length}),V()}).catch(X=>H(X))}))}for(const O of M.sharedMaterials)if(O){let j=0;const I={exporter:this,type:"texture",object:M.gameObject,material:O};if(fa.beforeLODExport.invoke(I),I.overrideLevel!==void 0)if(I.overrideLevel===-1){Rt&&console.warn("Skipping LOD assignment due to overrideLevel -1",M.gameObject,O);continue}else I.overrideLevel>=0&&(j=I.overrideLevel,Rt&&console.log("Overriding LOD level for texture export to level "+j+" "+O.name));const N=Ve.assignTextureLOD(O,j);N instanceof Promise&&n.push(new Promise((V,H)=>{N.then(()=>{s++,ae.report("export-usdz-textures",{message:"Loaded progressive texture",currentStep:s,totalSteps:n.length}),V()}).catch(X=>H(X))}))}}Rt&&Te("Progressive Loading: "+n.length),await Promise.all(n),Rt&&Te("Progressive Loading: done"),ae.end("export-usdz-textures");const r=oi.Global.Mask;oi.Global.Set(eo.AR);const a=new Rx,l=new sp(this.quickLookCompatible);let c;const h=[];this.interactive&&(h.push(new My),h.push(new ba),globalThis.NEEDLE_USE_RAPIER&&x.getComponentsInChildren(e,Ze).length>0&&(this.physics?(c=new Ry,h.push(c)):A()&&console.warn("USDZExporter: Physics export is disabled, but there are active Rigidbody components in the scene. They will not be exported.")),h.push(new mp),h.push(new zy));const d=[l,...h,...this.extensions],p={self:this,exporter:a,extensions:d,object:e};ae.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,ae.report("export-usdz","auto export animations and audio sources");const m=new Array;this.autoExportAnimations&&m.push(...XE(e,l)),d.find(M=>M.extensionName==="Audio")&&this.autoExportAudioSources&&m.push(...QE(e)),a.debug=Rt,a.pruneUnusedNodes=!KE;const f=_a.instance.objs.map(M=>M.batchedMesh);a.keepObject=M=>{let O=!0;const j=x.getComponent(M,Kt);return j&&!j.enabled&&(O=!1),O&&f.includes(M)&&(O=!1),O&&x.getComponentInParent(M,Hc)&&(O=!1),O&&x.getComponentInParent(M,Yn)&&(O=!1),Rt&&!O&&console.log("USDZExporter: Discarding object",M),O},a.beforeWritingDocument=()=>{if(A()&&l&&c){const M=l.animatedRoots;for(const O of M){const j=x.getComponentsInChildren(O,Ze).filter(N=>N.enabled),I=x.getComponents(O,ui).filter(N=>N.enabled&&!N.isTrigger);(j.length>0||I.length>0)&&console.error("An animated object has physics components in its child hierarchy. This can lead to undefined behaviour due to a bug in Apple's QuickLook (FB15925487). Remove the physics components from child objects or verify that you get the expected results.",O)}}};const g=new Array;this.objectToExport&&this.quickLookCompatible&&this.interactive&&this.objectToExport.traverse(M=>{M.visible||g.push(M)});const y=d.find(M=>M.extensionName==="Behaviour");this.interactive&&y&&g.length>0&&y.addBehavior(YE(g));let _=!0;this.quickLookCompatible&&!this.interactive&&(_=!1),this.anchoringType!=="plane"&&this.anchoringType!=="none"&&this.anchoringType!=="image"&&this.anchoringType!=="face"&&(this.anchoringType="plane"),this.planeAnchoringAlignment!=="horizontal"&&this.planeAnchoringAlignment!=="vertical"&&this.planeAnchoringAlignment!=="any"&&(this.planeAnchoringAlignment="horizontal"),ae.report("export-usdz","Invoking exporter.parse");const w=await a.parse(this.objectToExport,{ar:{anchoring:{type:this.anchoringType},planeAnchoring:{alignment:this.planeAnchoringAlignment}},extensions:d,quickLookCompatible:this.quickLookCompatible,maxTextureSize:this.maxTextureSize,exportInvisible:_}),P=new Blob([w],{type:"model/vnd.usdz+zip"});this.revertWebARSessionRoot(),this.context.time.timeScale=this._previousTimeScale,ae.report("export-usdz","Invoking after-export"),this.dispatchEvent(new CustomEvent("after-export",{detail:p}));for(const M of m)x.destroy(M);return oi.Global.Set(r),ae.end("export-usdz"),P}openInQuickLook(e,t){const i=e instanceof Blob?URL.createObjectURL(e):e,n=this.buildQuicklookOverlay();Rt&&console.log("QuickLook Overlay",n);const s=n.callToAction?encodeURIComponent(n.callToAction):"",r=n.checkoutTitle?encodeURIComponent(n.checkoutTitle):"",a=n.checkoutSubtitle?encodeURIComponent(n.checkoutSubtitle):"";this.link.href=i+`#callToAction=${s}&checkoutTitle=${r}&checkoutSubtitle=${a}&callToActionURL=${n.callToActionURL}`,this.lastCallback||(this.lastCallback=this.quicklookCallback.bind(this),this.link.addEventListener("message",this.lastCallback)),this.link.download=t+".usdz",this.link.click()}download(e,t){fa.save(e,t)}static save(e,t){const i=document.createElement("a");i.style.display="none",document.body.appendChild(i),typeof e=="string"?i.href=e:i.href=URL.createObjectURL(e),i.download=t,i.click(),i.remove()}lastCallback;quicklookCallback(e){if(e?.data=="_apple_ar_quicklook_button_tapped"){Rt&&ye("Quicklook closed via call to action button");var t=new CustomEvent("quicklook-button-tapped",{detail:this});if(this.dispatchEvent(t),!t.defaultPrevented){const i=new URLSearchParams(this.link.href);if(i){const n=i.get("callToActionURL");Rt&&Te("Quicklook url: "+n),n&&(Qn()?globalThis.open(n,"_blank"):console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing",n))}}}}buildQuicklookOverlay(){const e={};return this.customBranding&&Object.assign(e,this.customBranding),Qn()||(console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing"),e.callToAction="Close",e.checkoutTitle="\u{1F335} Made with Needle",e.checkoutSubtitle="_"),(e.callToAction?.length||e.checkoutTitle?.length||e.checkoutSubtitle?.length)&&(e.callToAction?.length||(e.callToAction="\0"),e.checkoutTitle?.length||(e.checkoutTitle="\0"),e.checkoutSubtitle?.length||(e.checkoutSubtitle="\0")),this.dispatchEvent(new CustomEvent("quicklook-overlay",{detail:e})),e}static invertForwardMatrix=new K().makeRotationY(Math.PI);static invertForwardQuaternion=new U().setFromEuler(new ot(0,Math.PI,0));_rootSessionRootWasAppliedTo=null;_rootPositionBeforeExport=new b;_rootRotationBeforeExport=new U;_rootScaleBeforeExport=new b;getARScaleAndTarget(){if(!this.objectToExport)return{scale:1,_invertForward:!1,target:this.gameObject,sessionRoot:null};const e=x.findObjectOfType(dp);let t=x.getComponentInParent(this.objectToExport,Ni);t||(t=x.getComponentInChildren(this.objectToExport,Ni));let i=1,n=!1;const s=this.objectToExport;return e?i=e.arScale:t&&(i=t.arScale,n=t.invertForward),{scale:1/i,_invertForward:n,target:s,sessionRoot:t?.gameObject??null}}applyWebARSessionRoot(){if(!this.objectToExport)return;const{scale:e,_invertForward:t,target:i,sessionRoot:n}=this.getARScaleAndTarget(),s=n?.matrixWorld.clone().invert();this._rootSessionRootWasAppliedTo=i,this._rootPositionBeforeExport.copy(i.position),this._rootRotationBeforeExport.copy(i.quaternion),this._rootScaleBeforeExport.copy(i.scale),i.scale.multiplyScalar(e),t&&i.quaternion.multiply(fa.invertForwardQuaternion),i.updateMatrix(),i.updateMatrixWorld(!0),n&&s&&i.matrix.premultiply(s)}revertWebARSessionRoot(){if(!this.objectToExport||!this._rootSessionRootWasAppliedTo)return;const e=this._rootSessionRootWasAppliedTo;e.position.copy(this._rootPositionBeforeExport),e.quaternion.copy(this._rootRotationBeforeExport),e.scale.copy(this._rootScaleBeforeExport),e.updateMatrix(),e.updateMatrixWorld(!0),this._rootSessionRootWasAppliedTo=null}createQuicklookButton(){const e=or.getOrCreate().createQuicklookButton();return e.parentNode||this.context.menu.appendChild(e),e}};Mt([u(k)],gi.prototype,"objectToExport"),Mt([u()],gi.prototype,"autoExportAnimations"),Mt([u()],gi.prototype,"autoExportAudioSources"),Mt([u()],gi.prototype,"exportFileName"),Mt([u(URL)],gi.prototype,"customUsdzFile"),Mt([u(Zr)],gi.prototype,"customBranding"),Mt([u()],gi.prototype,"anchoringType"),Mt([u()],gi.prototype,"maxTextureSize"),Mt([u()],gi.prototype,"planeAnchoringAlignment"),Mt([u()],gi.prototype,"interactive"),Mt([u()],gi.prototype,"physics"),Mt([u()],gi.prototype,"allowCreateQuicklookButton"),Mt([u()],gi.prototype,"quickLookCompatible");let Tn=gi;var JE=Object.defineProperty,eA=Object.getOwnPropertyDescriptor,Ny=(o,e,t,i)=>{for(var n=eA(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&JE(e,t,n),n};class Cl extends R{get fog(){return this._fog||(this._fog=new tb(0,0,50)),this._fog}get mode(){return 1}set near(e){this.fog.near=e}get near(){return this.fog.near}set far(e){this.fog.far=e}get far(){return this.fog.far}set color(e){this.fog.color.copy(e)}get color(){return this.fog.color}_fog;onEnable(){this.scene.fog=this.fog}onDisable(){this.scene.fog===this._fog&&(this.scene.fog=null)}}Ny([u()],Cl.prototype,"near"),Ny([u()],Cl.prototype,"far"),Ny([u(ne)],Cl.prototype,"color");var tA=Object.defineProperty,Vy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&tA(e,t,n),n};class Kr extends R{objectBounds=!1;color;isGizmo=!0;_gizmoObject=null;_boxHelper=null;onEnable(){this.isGizmo&&!Sc||(this._gizmoObject||(this.objectBounds?this._gizmoObject=new wC(this.gameObject,this.color??16776960):(this.objectBounds=!1,this._gizmoObject=Cg(this.color??16776960))),this.objectBounds?(this.scene.add(this._gizmoObject),this._boxHelper=this._gizmoObject,this.startCoroutine(this.syncObjectBounds(),we.OnBeforeRender)):this.gameObject.add(this._gizmoObject))}onDisable(){this._gizmoObject&&this.gameObject.remove(this._gizmoObject)}*syncObjectBounds(){for(;this._boxHelper;)this._boxHelper?.update(),yield}}Vy([u()],Kr.prototype,"objectBounds"),Vy([u(ne)],Kr.prototype,"color"),Vy([u()],Kr.prototype,"isGizmo");var iA=Object.defineProperty,Wy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&iA(e,t,n),n};class Pl extends R{isGizmo=!1;color0;color1;gridHelper;size;divisions;offset;onEnable(){if(this.isGizmo&&!Sc)return;const e=this.size,t=this.divisions;this.gridHelper||(this.gridHelper=new um(e,t,this.color0??new ne(.4,.4,.4),this.color1??new ne(.6,.6,.6)),this.offset!==void 0&&(this.gridHelper.position.y+=this.offset)),this.gridHelper&&this.gameObject.add(this.gridHelper)}onDisable(){this.gridHelper&&(this.gameObject.remove(this.gridHelper),this.gridHelper=null)}}Wy([u()],Pl.prototype,"isGizmo"),Wy([u(ne)],Pl.prototype,"color0"),Wy([u(ne)],Pl.prototype,"color1");var nA=Object.defineProperty,$y=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&nA(e,t,n),n};class Hy extends R{connectedBody;get rigidBody(){return this._rigidBody}_rigidBody=null;onEnable(){this._rigidBody||(this._rigidBody=this.gameObject.getComponent(Ze)),this.rigidBody&&this.connectedBody&&this.startCoroutine(this.create())}*create(){yield,this.rigidBody&&this.connectedBody&&this.activeAndEnabled&&this.createJoint(this.rigidBody,this.connectedBody)}}$y([u(Ze)],Hy.prototype,"connectedBody");class Gy extends Hy{createJoint(e,t){this.context.physics.engine?.addFixedJoint(e,t)}}class uh extends Hy{anchor;axis;createJoint(e,t){this.axis&&this.anchor&&this.context.physics.engine?.addHingeJoint(e,t,this.anchor,this.axis)}}$y([u(b)],uh.prototype,"anchor"),$y([u(b)],uh.prototype,"axis");var oA=Object.defineProperty,sA=Object.getOwnPropertyDescriptor,lo=(o,e,t,i)=>{for(var n=i>1?void 0:i?sA(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&oA(e,t,n),n};function qy(o){return o*Math.PI/180}const o1=300,Ns=v("debuglights");class fi extends R{type=0;range=1;spotAngle=1;innerSpotAngle=1;set color(e){this._color=e,this.light!==void 0&&(this.light.color=e)}get color(){return this.light?this.light.color:this._color}_color=new ne(16777215);set shadowNearPlane(e){if(e!==this._shadowNearPlane&&(this._shadowNearPlane=e,this.light?.shadow?.camera!==void 0)){const t=this.light.shadow.camera;t.near=e}}get shadowNearPlane(){return this._shadowNearPlane}_shadowNearPlane=.1;set shadowBias(e){e!==this._shadowBias&&(this._shadowBias=e,this.light?.shadow?.bias!==void 0&&(this.light.shadow.bias=e,this.light.shadow.needsUpdate=!0))}get shadowBias(){return this._shadowBias}_shadowBias=0;set shadowNormalBias(e){e!==this._shadowNormalBias&&(this._shadowNormalBias=e,this.light?.shadow?.normalBias!==void 0&&(this.light.shadow.normalBias=e,this.light.shadow.needsUpdate=!0))}get shadowNormalBias(){return this._shadowNormalBias}_shadowNormalBias=0;_overrideShadowBiasSettings=!1;set shadows(e){this._shadows=e,this.light&&(this.light.castShadow=e!==0,this.updateShadowSoftHard())}get shadows(){return this._shadows}_shadows=1;lightmapBakeType=4;set intensity(e){if(this._intensity=e,this.light){let t=1;if(this.context.isInXR&&this._webARRoot){const i=this._webARRoot?.arScale;typeof i=="number"&&i>0&&(t/=i)}this.light.intensity=e*t}Ns&&console.log("Set light intensity to "+this._intensity,e,this)}get intensity(){return this._intensity}_intensity=-1;get shadowDistance(){const e=this.light;return e?.shadow?e.shadow.camera.far:-1}set shadowDistance(e){this._shadowDistance=e;const t=this.light;if(t?.shadow){const i=t.shadow.camera;i.far=e,i.updateProjectionMatrix()}}_shadowDistance;shadowWidth;shadowHeight;get shadowResolution(){const e=this.light;return e?.shadow?e.shadow.mapSize.x:-1}set shadowResolution(e){if(e===this._shadowResolution)return;this._shadowResolution=e;const t=this.light;t?.shadow&&(t.shadow.mapSize.set(e,e),t.shadow.needsUpdate=!0)}_shadowResolution=void 0;get isBaked(){return this.lightmapBakeType===2}get selfIsLight(){if(this.gameObject.isLight===!0)return!0;switch(this.gameObject.type){case"SpotLight":case"PointLight":case"DirectionalLight":return!0}return!1}light=void 0;getWorldPosition(e){return this.light?this.type===1?this.light.getWorldPosition(e).multiplyScalar(1):this.light.getWorldPosition(e):e}awake(){this.color=new ne(this.color??16777215),Ns&&console.log(this.name,this)}onEnable(){Ns&&console.log("ENABLE LIGHT",this.name),this.createLight(),!this.isBaked&&(this.light&&(this.light.visible=!0,this.light.intensity=this._intensity,Ns&&console.log("Set light intensity to "+this.light.intensity,this.name),this.selfIsLight||this.light.parent!==this.gameObject&&this.gameObject.add(this.light)),this.type===1&&this.startCoroutine(this.updateMainLightRoutine(),we.LateUpdate))}onDisable(){Ns&&console.log("DISABLE LIGHT",this.name),this.light&&(this.selfIsLight?this.light.intensity=0:this.light.visible=!1)}_webXRStartedListener;_webXREndedListener;_webARRoot;onEnterXR(e){this._webARRoot=x.getComponentInParent(this.gameObject,Ni)??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 pm(this.color,this.intensity*Math.PI);if(t.position.set(0,0,-o1*.5).applyQuaternion(this.gameObject.quaternion),this.gameObject.add(t.target),mr(t.target,0,0,0),this.light=t,this.gameObject.position.set(0,0,0),this.gameObject.rotation.set(0,0,0),Ns){const r=new SC(this.light,.2,this.color);this.context.scene.add(r)}break;case 0:const i=new xC(this.color,this.intensity*Math.PI,this.range,qy(this.spotAngle/2),1-qy(this.innerSpotAngle/2)/qy(this.spotAngle/2),2);i.position.set(0,0,0),i.rotation.set(0,0,0),this.light=i;const n=i.target;i.add(n),n.position.set(0,0,this.range),n.rotation.set(0,0,0);break;case 2:const s=new mm(this.color,this.intensity*Math.PI,this.range);this.light=s;break}if(this.light){if(this._intensity>=0?this.light.intensity=this._intensity:this._intensity=this.light.intensity,this.shadows!==0?this.light.castShadow=!0:this.light.castShadow=!1,this.light.shadow){this._shadowResolution!==void 0&&this._shadowResolution>4?(this.light.shadow.mapSize.width=this._shadowResolution,this.light.shadow.mapSize.height=this._shadowResolution):(this.light.shadow.mapSize.width=2048,this.light.shadow.mapSize.height=2048),Ns&&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=o1*Math.abs(this.gameObject.scale.z),this.gameObject.scale.set(1,1,1),this.shadowWidth!==void 0)t.left=-this.shadowWidth/2,t.right=this.shadowWidth/2;else{const i=this.gameObject.scale.x;t.left*=i,t.right*=i}if(this.shadowHeight!==void 0)t.top=this.shadowHeight/2,t.bottom=-this.shadowHeight/2;else{const i=this.gameObject.scale.y;t.top*=i,t.bottom*=i}this.light.shadow.needsUpdate=!0,Ns&&this.context.scene.add(new CC(t))}this.isBaked?this.light.removeFromParent():e||this.gameObject.add(this.light)}}*updateMainLightRoutine(){for(;;){this.type===1&&((!this.context.mainLight||this.intensity>this.context.mainLight.intensity)&&(this.context.mainLight=this),yield);break}}static allowChangingRendererShadowMapType=!0;updateShadowSoftHard(){this.light&&this.light.shadow&&(this.shadows===2||(this.light.shadow.radius=1,this.light.shadow.blurSamples=1))}setDirectionalLight(e){e.add(e.target),e.target.position.set(0,0,-1)}}lo([u()],fi.prototype,"type",2),lo([u(ne)],fi.prototype,"color",1),lo([u()],fi.prototype,"shadowNearPlane",1),lo([u()],fi.prototype,"shadowBias",1),lo([u()],fi.prototype,"shadowNormalBias",1),lo([u()],fi.prototype,"shadows",1),lo([u()],fi.prototype,"lightmapBakeType",2),lo([u()],fi.prototype,"intensity",1),lo([u()],fi.prototype,"shadowDistance",1),lo([u()],fi.prototype,"shadowResolution",1),new b(0,0,0);var rA=Object.defineProperty,ph=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&rA(e,t,n),n};const Xy=v("debuglods"),aA=v("nolods");class Ol{screenRelativeTransitionHeight;distance;renderers}ph([u()],Ol.prototype,"screenRelativeTransitionHeight"),ph([u()],Ol.prototype,"distance"),ph([u(Kt)],Ol.prototype,"renderers");class lA{model;get renderers(){return this.model.renderers}constructor(e){this.model=e}}class mh extends R{fadeMode=0;localReferencePoint=void 0;lodCount=0;size=0;animateCrossFading=!1;lodModels;_lods=[];_settings=[];_lodsHandler;start(){if(Xy&&console.log("LODGROUP",this.name,this.lodModels,this),!aA&&!this._lodsHandler&&this.gameObject&&this.lodModels&&Array.isArray(this.lodModels)){const e=[];for(const i of this.lodModels){const n=new lA(i);this._lods.push(n);for(const s of n.renderers)e.includes(s)||e.push(s)}this._lodsHandler=new Array;for(let i=0;i<e.length;i++){const n=new PC;this._lodsHandler.push(n),this.gameObject.add(n)}const t=new k;t.name="Cull "+this.name;for(let i=0;i<e.length;i++){const n=e[i],s=this._lodsHandler[i],r=n.gameObject;Xy&&console.log(i,r.name);for(const a of this._lods){const l=a.model.distance;let c=null;if(a.renderers.includes(n)?c=r:c=t,c.type==="Group"){console.warn(`LODGroup ${this.name}: Group or MultiMaterial object's are not supported as LOD object: ${c.name}`);continue}Xy&&console.log("LEVEL",c.name,l),s.autoUpdate=!1,this.onAddLodLevel(s,c,a.model.distance)}}}}onAfterRender(){if(!this.gameObject||!this._lodsHandler)return;const e=this.context.mainCamera;if(e)for(const t of this._lodsHandler){t.update(e);const i=t.getCurrentLevel(),n=t.levels[i];t.layers.mask=n.object.layers.mask}}onAddLodLevel(e,t,i){if(t===this.gameObject){console.warn("LODGroup component must be on parent object and not mesh directly at the moment",t.name,t);return}e.addLevel(t,i*this._distanceFactor,.01);const n={lod:e,levelIndex:e.levels.length-1,distance:i};this._settings.push(n)}_distanceFactor=1;distanceFactor(e){if(e!==this._distanceFactor){this._distanceFactor=e;for(const t of this._settings){const i=t.lod.levels[t.levelIndex];i.distance=t.distance*e}}}}ph([u(b)],mh.prototype,"localReferencePoint"),ph([u(Ol)],mh.prototype,"lodModels");var cA=Object.defineProperty,s1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&cA(e,t,n),n};const gp=v("debugnestedgltf");class gh extends R{filePath;loaded=new he;loadAssetInParent=!0;_isLoadingOrDoneLoading=!1;listenToProgress(e){this.filePath?.beginListenDownload(e)}preload(){return this.filePath?.preload()||null}async start(){if(this._isLoadingOrDoneLoading)return;gp&&console.log(this,this.guid);const e=this.gameObject.parent;if(e&&this.filePath){this._isLoadingOrDoneLoading=!0;const t=new Bn;t.idProvider=new Lt(this.hash(this.guid)),t.parent=this.loadAssetInParent!==!1?e:this.gameObject,this.gameObject.updateMatrix();const i=this.gameObject.matrix;gp&&console.log("Load nested:",this.filePath?.url??this.filePath,this.gameObject.position);const n=await this.filePath?.instantiate?.call(this.filePath,t);gp&&console.log("Nested loaded:",this.filePath?.url??this.filePath,n),n&&this.loadAssetInParent!==!1&&(n.matrixAutoUpdate=!1,n.matrix.identity(),n.applyMatrix4(i),n.matrixAutoUpdate=!0,n.layers.disableAll(),n.layers.set(this.layer),this.loaded.invoke({component:this,instance:n,asset:this.filePath})),gp&&console.log("Nested loading done:",this.filePath?.url??this.filePath,n)}}onDestroy(){this.filePath?.unload()}hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}s1([u(ie)],gh.prototype,"filePath"),s1([u(he)],gh.prototype,"loaded");var hA=Object.defineProperty,Qy=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&hA(e,t,n),n};const dA=v("debugnet"),fp=class Q0 extends R{url=null;urlParameterName=null;localhost=null;awake(){dA&&console.log(this),this.context.connection.registerProvider(this)}getWebsocketUrl(){let e=this.url?Q0.GetUrl(this.url,this.localhost):null;if(this.urlParameterName){const i=v(this.urlParameterName);i&&typeof i=="string"&&(e=i)}if(!e)return null;const t=new RegExp("(((https?)|(?<socket_prefix>wss?))://)?(www.)?(?<url>.+)","gm").exec(e);return t?.groups?t?.groups.socket_prefix?e:"wss://"+t?.groups.url:null}static GetUrl(e,t){let i=e;const n=Q0.IsLocalNetwork()&&t;if(n&&(i=t),e?.startsWith("/")){const s=n?i:window.location.origin;s?.endsWith("/")&&e.startsWith("/")&&(e=e.substring(1)),i=s+e}return i}static IsLocalNetwork(e=window.location.hostname){return $i(e)}};Qy([u()],fp.prototype,"url"),Qy([u()],fp.prototype,"urlParameterName"),Qy([u()],fp.prototype,"localhost");let Yy=fp;var uA=Object.defineProperty,yp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&uA(e,t,n),n};class Jr extends R{referenceSpace;from;affectPosition=!1;affectRotation=!1;alignLookDirection=!1;levelLookDirection=!1;levelPosition=!1;positionOffset=new b(0,0,0);rotationOffset=new b(0,0,0);offset=new b(0,0,0);update(){if(!this.from)return;var e=J(this.from),t=be(this.from);this.offset.copy(this.positionOffset);const i=this.offset.length();if(this.referenceSpace&&this.offset.transformDirection(this.referenceSpace.matrixWorld).multiplyScalar(i),e.add(this.offset),this.levelPosition&&this.referenceSpace){const a=new hr(this.gameObject.up,0),l=J(this.referenceSpace);a.setFromNormalAndCoplanarPoint(this.gameObject.up,l);const c=new b(0,0,0);a.projectPoint(e,c),e.copy(c)}this.affectPosition&&gt(this.gameObject,e);const n=new ot(this.rotationOffset.x,this.rotationOffset.y,this.rotationOffset.z),s=new U().setFromEuler(n);this.affectRotation&&yn(this.gameObject,t.multiply(s));const r=new b;this.from.getWorldDirection(r).multiplyScalar(50),this.levelLookDirection&&(r.y=0),this.alignLookDirection&&this.gameObject.lookAt(r)}}yp([u(x)],Jr.prototype,"referenceSpace"),yp([u(x)],Jr.prototype,"from"),yp([u(b)],Jr.prototype,"positionOffset"),yp([u(b)],Jr.prototype,"rotationOffset");var pA=Object.defineProperty,Vs=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&pA(e,t,n),n};class yi{time=0;value=0;inTangent=1/0;inWeight;outTangent=1/0;outWeight;weightedMode;constructor(e=0,t=0){this.time=e,this.value=t}}Vs([u()],yi.prototype,"time"),Vs([u()],yi.prototype,"value"),Vs([u()],yi.prototype,"inTangent"),Vs([u()],yi.prototype,"inWeight"),Vs([u()],yi.prototype,"outTangent"),Vs([u()],yi.prototype,"outWeight"),Vs([u()],yi.prototype,"weightedMode");const r1=class cd{static linearFromTo(e,t,i){const n=new cd,s=new yi;s.time=0,s.value=e;const r=new yi;return r.time=i,r.value=t,n.keys.push(s,r),n}static constant(e){const t=new cd,i=new yi;return i.time=0,i.value=e,t.keys.push(i),t}keys=[];clone(){const e=new cd;return e.keys=this.keys?.map(t=>{const i=new yi;return i.time=t.time,i.value=t.value,i.inTangent=t.inTangent,i.inWeight=t.inWeight,i.outTangent=t.outTangent,i.outWeight=t.outWeight,i.weightedMode=t.weightedMode,i})||[],e}get duration(){return!this.keys||this.keys.length==0?0:this.keys[this.keys.length-1].time}evaluate(e){if(!this.keys||this.keys.length==0)return 0;if(this.keys.length===1)return this.keys[0].value;if(this.keys[0].time>=e)return this.keys[0].value;for(let t=0;t<this.keys.length;t++){const i=this.keys[t];if(i.time<=e)if(t+1<this.keys.length){const n=this.keys[t+1];if(n.time<e)continue;return!isFinite(i.outTangent)||!isFinite(n.inTangent)?i.value:cd.interpolateValue(e,i,n)}else return i.value}return this.keys[this.keys.length-1].value}static interpolateValue(e,t,i){const n=t.time,s=t.value,r=t.outTangent,a=i.time,l=i.value,c=i.inTangent,h=a-n,d=h*h,p=d*h,m=((r+c)*h-2*(l-s))/p,f=(3*(l-s)-(c+2*r)*h)/d,g=r,y=s,_=e-n,w=_*_,P=w*_;return m*P+f*w+g*_+y}};Vs([u(yi)],r1.prototype,"keys");let fh=r1;var mA=Object.defineProperty,S=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&mA(e,t,n),n};const bp=v("debugparticles");var Go=(o=>(o[o.Billboard=0]="Billboard",o[o.Stretch=1]="Stretch",o[o.HorizontalBillboard=2]="HorizontalBillboard",o[o.VerticalBillboard=3]="VerticalBillboard",o[o.Mesh=4]="Mesh",o))(Go||{});class ea{alphaKeys=[];colorKeys=[];get duration(){return 1}evaluate(e,t){let i,n=0,s=null,r=0;for(let a=0;a<this.alphaKeys.length;a++){const l=this.alphaKeys[a];(l.time<e||!i)&&(i=l,n=a)}for(let a=0;a<this.colorKeys.length;a++){const l=this.colorKeys[a];(l.time<e||!s)&&(s=l,r=a)}if(s)if(r+1<this.colorKeys.length){const a=this.colorKeys[r+1],l=L.remap(e,s.time,a.time,0,1);t.r=L.lerp(s.color.r,a.color.r,l),t.g=L.lerp(s.color.g,a.color.g,l),t.b=L.lerp(s.color.b,a.color.b,l)}else t.r=s.color.r,t.g=s.color.g,t.b=s.color.b;if(i)if(n+1<this.alphaKeys.length){const a=this.alphaKeys[n+1],l=L.remap(e,i.time,a.time,0,1);t.alpha=L.lerp(i.alpha,a.alpha,l)}else t.alpha=i.alpha;return t}}S([u()],ea.prototype,"alphaKeys"),S([u()],ea.prototype,"colorKeys");var yh=(o=>(o[o.Local=0]="Local",o[o.World=1]="World",o[o.Custom=2]="Custom",o))(yh||{}),_p=(o=>(o[o.Sphere=0]="Sphere",o[o.SphereShell=1]="SphereShell",o[o.Hemisphere=2]="Hemisphere",o[o.HemisphereShell=3]="HemisphereShell",o[o.Cone=4]="Cone",o[o.Box=5]="Box",o[o.Mesh=6]="Mesh",o[o.ConeShell=7]="ConeShell",o[o.ConeVolume=8]="ConeVolume",o[o.ConeVolumeShell=9]="ConeVolumeShell",o[o.Circle=10]="Circle",o[o.CircleEdge=11]="CircleEdge",o[o.SingleSidedEdge=12]="SingleSidedEdge",o[o.MeshRenderer=13]="MeshRenderer",o[o.SkinnedMeshRenderer=14]="SkinnedMeshRenderer",o[o.BoxShell=15]="BoxShell",o[o.BoxEdge=16]="BoxEdge",o[o.Donut=17]="Donut",o[o.Rectangle=18]="Rectangle",o[o.Sprite=19]="Sprite",o[o.SpriteRenderer=20]="SpriteRenderer",o))(_p||{});const qo=class hd{static constant(e){const t=new hd;return t.setConstant(e),t}static betweenTwoConstants(e,t){const i=new hd;return i.setMinMaxConstant(e,t),i}static curve(e,t=1){const i=new hd;return i.setCurve(e,t),i}setConstant(e){this.mode=0,this.constant=e}setMinMaxConstant(e,t){this.mode=3,this.constantMin=e,this.constantMax=t}setCurve(e,t=1){this.mode=1,this.curve=e,this.curveMultiplier=t}mode="Constant";constant;constantMin;constantMax;curve;curveMin;curveMax;curveMultiplier;clone(){const e=new hd;return e.mode=this.mode,e.constant=this.constant,e.constantMin=this.constantMin,e.constantMax=this.constantMax,e.curve=this.curve?.clone(),e.curveMin=this.curveMin?.clone(),e.curveMax=this.curveMax?.clone(),e.curveMultiplier=this.curveMultiplier,e}evaluate(e,t){const i=t===void 0?Math.random():t;switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return e=L.clamp01(e),this.curve.evaluate(e)*this.curveMultiplier;case 2:case"TwoCurves":const n=e*this.curveMin.duration,s=e*this.curveMax.duration;return L.lerp(this.curveMin.evaluate(n),this.curveMax.evaluate(s),i%1)*this.curveMultiplier;case 3:case"TwoConstants":return L.lerp(this.constantMin,this.constantMax,i%1);default:this.curveMax.evaluate(e)*this.curveMultiplier;break}return 0}getMax(){switch(this.mode){case 0:case"Constant":return this.constant;case 1:case"Curve":return this.getMaxFromCurve(this.curve)*this.curveMultiplier;case 2:case"TwoCurves":return Math.max(this.getMaxFromCurve(this.curveMin),this.getMaxFromCurve(this.curveMax))*this.curveMultiplier;case 3:case"TwoConstants":return Math.max(this.constantMin,this.constantMax);default:return 0}}getMaxFromCurve(e){if(!e)return 0;let t=Number.MIN_VALUE;for(let i=0;i<e.keys.length;i++){const n=e.keys[i];n.value>t&&(t=n.value)}return t}};S([u()],qo.prototype,"mode"),S([u()],qo.prototype,"constant"),S([u()],qo.prototype,"constantMin"),S([u()],qo.prototype,"constantMax"),S([u(fh)],qo.prototype,"curve"),S([u(fh)],qo.prototype,"curveMin"),S([u(fh)],qo.prototype,"curveMax"),S([u()],qo.prototype,"curveMultiplier");let Y=qo;const Ws=class At{static constant(e){const t=new At;return t.constant(e),t}static betweenTwoColors(e,t){const i=new At;return i.betweenTwoColors(e,t),i}constant(e){return this.mode=0,this.color=e,this}betweenTwoColors(e,t){return this.mode=2,this.colorMin=e,this.colorMax=t,this}mode=0;color;colorMin;colorMax;gradient;gradientMin;gradientMax;static _temp=new oe(0,0,0,1);static _temp2=new oe(0,0,0,1);evaluate(e,t){const i=t===void 0?Math.random():t;switch(this.mode){case 0:case"Color":return this.color;case 1:case"Gradient":return this.gradient.evaluate(e,At._temp),At._temp;case 2:case"TwoColors":return At._temp.lerpColors(this.colorMin,this.colorMax,i);case 3:case"TwoGradients":return this.gradientMin.evaluate(e,At._temp),this.gradientMax.evaluate(e,At._temp2),At._temp.lerp(At._temp2,i);case 4:case"RandomColor":const n=Math.random();return this.gradientMin.evaluate(e,At._temp),this.gradientMax.evaluate(e,At._temp2),At._temp.lerp(At._temp2,n)}return At._temp.set(16777215),At._temp.alpha=1,At._temp}};S([u()],Ws.prototype,"mode"),S([u(oe)],Ws.prototype,"color"),S([u(oe)],Ws.prototype,"colorMin"),S([u(oe)],Ws.prototype,"colorMax"),S([u(ea)],Ws.prototype,"gradient"),S([u(ea)],Ws.prototype,"gradientMin"),S([u(ea)],Ws.prototype,"gradientMax");let ta=Ws;var Zy=(o=>(o[o.Hierarchy=0]="Hierarchy",o[o.Local=1]="Local",o[o.Shape=2]="Shape",o))(Zy||{});class Vt{cullingMode;duration;emitterVelocityMode;flipRotation;gravityModifier;gravityModifierMultiplier;loop;maxParticles;playOnAwake;prewarm;ringBufferLoopRange;ringBufferMode;scalingMode;simulationSpace;simulationSpeed;startColor;startDelay;startDelayMultiplier;startLifetime;startLifetimeMultiplier;startRotation;startRotationMultiplier;startRotation3D;startRotationX;startRotationXMultiplier;startRotationY;startRotationYMultiplier;startRotationZ;startRotationZMultiplier;startSize;startSize3D;startSizeMultiplier;startSizeX;startSizeXMultiplier;startSizeY;startSizeYMultiplier;startSizeZ;startSizeZMultiplier;startSpeed;startSpeedMultiplier;stopAction;useUnscaledTime}S([u(Y)],Vt.prototype,"gravityModifier"),S([u(ta)],Vt.prototype,"startColor"),S([u(Y)],Vt.prototype,"startDelay"),S([u(Y)],Vt.prototype,"startLifetime"),S([u(Y)],Vt.prototype,"startRotation"),S([u(Y)],Vt.prototype,"startRotationX"),S([u(Y)],Vt.prototype,"startRotationY"),S([u(Y)],Vt.prototype,"startRotationZ"),S([u(Y)],Vt.prototype,"startSize"),S([u(Y)],Vt.prototype,"startSizeX"),S([u(Y)],Vt.prototype,"startSizeY"),S([u(Y)],Vt.prototype,"startSizeZ"),S([u(Y)],Vt.prototype,"startSpeed");class vp{cycleCount;maxCount;minCount;probability;repeatInterval;time;count;_performed=0;reset(){this._performed=0}run(e){if(e<=this.time)return 0;let t=0;if(this.cycleCount===0||this._performed<this.cycleCount){const i=this.time+this.repeatInterval*this._performed;if(e>=i&&(this._performed+=1,Math.random()<this.probability))switch(this.count.mode){case 0:t=this.count.constant;break;case 3:t=L.lerp(this.count.constantMin,this.count.constantMax,Math.random());break;case 1:t=this.count.curve.evaluate(Math.random());break;case 2:const n=Math.random();t=L.lerp(this.count.curveMin.evaluate(n),this.count.curveMax.evaluate(n),Math.random());break}}return t}}class Xo{enabled;get burstCount(){return this.bursts?.length??0}bursts;rateOverTime;rateOverTimeMultiplier;rateOverDistance;rateOverDistanceMultiplier;system;reset(){this.bursts?.forEach(e=>e.reset())}getBurst(){let e=0;if(this.burstCount>0)for(let t=0;t<this.burstCount;t++){const i=this.bursts[t];this.system.main.loop&&i.time>=this.system.time&&i.reset(),e+=Math.round(i.run(this.system.time))}return e}}S([u()],Xo.prototype,"enabled"),S([u()],Xo.prototype,"bursts"),S([u(Y)],Xo.prototype,"rateOverTime"),S([u()],Xo.prototype,"rateOverTimeMultiplier"),S([u(Y)],Xo.prototype,"rateOverDistance"),S([u()],Xo.prototype,"rateOverDistanceMultiplier");class wp{enabled;color}S([u(ta)],wp.prototype,"color");class ia{enabled;separateAxes;size;sizeMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;_time=0;_temp=new b;evaluate(e,t,i){if(t||(t=this._temp),!this.enabled)return t.x=t.y=t.z=1,t;if(this.separateAxes)t.x=this.x.evaluate(e,i)*this.xMultiplier,t.y=this.y.evaluate(e,i)*this.yMultiplier,t.z=this.z.evaluate(e,i)*this.zMultiplier;else{const n=this.size.evaluate(e,i)*this.sizeMultiplier;t.x=n}return t}}S([u(Y)],ia.prototype,"size"),S([u(Y)],ia.prototype,"x"),S([u(Y)],ia.prototype,"y"),S([u(Y)],ia.prototype,"z");const Je=class dd{get type(){return _p[this.shapeType]}initialize(e){this.onInitialize(e),e.position.x=this._vector.x,e.position.y=this._vector.y,e.position.z=this._vector.z}toJSON(){return this}clone(){return new dd}shapeType=5;enabled=!0;alignToDirection=!1;angle=0;arc=360;arcSpread;arcSpeedMultiplier;arcMode;boxThickness;position;rotation;_rotation=new ot;scale;radius;radiusThickness;sphericalDirectionAmount;randomDirectionAmount;randomPositionAmount;meshShapeType;meshRenderer;_meshObj;_meshGeometry;setMesh(e){this.meshRenderer=e,e?(this._meshObj=e.sharedMeshes[Math.floor(Math.random()*e.sharedMeshes.length)],this._meshGeometry=this._meshObj.geometry):(this._meshObj=void 0,this._meshGeometry=void 0)}system;_space;_worldSpaceMatrix=new K;_worldSpaceMatrixInverse=new K;constructor(){bp&&console.log(this)}update(e,t){}onUpdate(e,t,i,n){this.system=e,this._space=i,i===1&&(this._worldSpaceMatrix.copy(n.matrixWorld),this._worldSpaceMatrix.elements[0]=1,this._worldSpaceMatrix.elements[5]=1,this._worldSpaceMatrix.elements[10]=1,this._worldSpaceMatrixInverse.copy(this._worldSpaceMatrix).invert())}applyRotation(e){const t=this.rotation.x!==0||this.rotation.y!==0||this.rotation.z!==0;return t&&(this._rotation.x=L.toRadians(this.rotation.x),this._rotation.y=L.toRadians(this.rotation.y),this._rotation.z=L.toRadians(this.rotation.z),this._rotation.order="ZYX",e.applyEuler(this._rotation)),t}_vector=new b(0,0,0);_temp=new b(0,0,0);_triangle=new OC;onInitialize(e){this._vector.set(0,0,0),e.mesh=void 0,e.mesh_geometry=void 0;const t=this._temp.copy(this.position),i=this._space===1;i&&t.applyQuaternion(this.system.worldQuaternion);let n=this.radius;if(i&&(n*=this.system.worldScale.x),this.enabled){switch(this.shapeType){case 5:bp&&B.DrawWireBox(this.position,this.scale,14540253,1),this._vector.x=Math.random()*this.scale.x-this.scale.x/2,this._vector.y=Math.random()*this.scale.y-this.scale.y/2,this._vector.z=Math.random()*this.scale.z-this.scale.z/2,this._vector.add(t);break;case 4:this.randomConePoint(this.position,this.angle,n,this.radiusThickness,this.arc,this.arcMode,this._vector);break;case 0:this.randomSpherePoint(this.position,n,this.radiusThickness,this.arc,this._vector);break;case 10:this.randomCirclePoint(this.position,n,this.radiusThickness,this.arc,this._vector);break;case 13:const s=this.meshRenderer;s?.destroyed==!1&&this.setMesh(s);const r=e.mesh=this._meshObj,a=e.mesh_geometry=this._meshGeometry;if(r&&a)switch(this.meshShapeType){case 0:{const l=a.getAttribute("position"),c=Math.floor(Math.random()*l.count);this._vector.fromBufferAttribute(l,c),this._vector.applyMatrix4(r.matrixWorld),e.mesh_normal=c}break;case 1:break;case 2:{const l=a.index;if(l){let c=Math.random(),h=Math.random();c+h>1&&(c=1-c,h=1-h);const d=Math.floor(Math.random()*(l.count/3));let p=d*3,m=d*3+1,f=d*3+2;p=l.getX(p),m=l.getX(m),f=l.getX(f);const g=a.getAttribute("position");this._triangle.a.fromBufferAttribute(g,p),this._triangle.b.fromBufferAttribute(g,m),this._triangle.c.fromBufferAttribute(g,f),this._vector.set(0,0,0).addScaledVector(this._triangle.a,c).addScaledVector(this._triangle.b,h).addScaledVector(this._triangle.c,1-(c+h)),this._vector.applyMatrix4(r.matrixWorld),e.mesh_normal=d}}break}break;default:this._vector.set(0,0,0),A()&&!globalThis.__particlesystem_shapetype_unsupported&&(console.warn("ParticleSystem ShapeType is not supported:",_p[this.shapeType]),globalThis.__particlesystem_shapetype_unsupported=!0);break}this.randomizePosition(this._vector,this.randomPositionAmount)}this.applyRotation(this._vector),i&&(this._vector.applyQuaternion(this.system.worldQuaternion),this._vector.add(this.system.worldPos)),bp&&B.DrawSphere(this._vector,.03,16711680,.5,!0)}_dir=new b;getDirection(e,t){if(!this.enabled)return this._dir.set(0,0,1),this._dir;switch(this.shapeType){case 5:this._dir.set(0,0,1);break;case 4:this._dir.set(0,0,1);break;case 10:case 0:const i=t.x,n=t.y,s=t.z;this._dir.set(i,n,s),this.system?.worldspace?this._dir.sub(this.system.worldPos):this._dir.sub(this.position);break;case 13:const r=e.mesh,a=e.mesh_geometry;if(r&&a)switch(this.meshShapeType){case 0:{const l=a.getAttribute("normal"),c=e.mesh_normal;this._dir.fromBufferAttribute(l,c)}break;case 1:break;case 2:{const l=a.index;if(l){const c=e.mesh_normal,h=l.getX(c*3),d=l.getX(c*3+1),p=l.getX(c*3+2),m=a.getAttribute("position"),f=D(),g=D(),y=D();f.fromBufferAttribute(m,h),g.fromBufferAttribute(m,d),y.fromBufferAttribute(m,p),f.sub(g),y.sub(g),f.cross(y),this._dir.copy(f).multiplyScalar(-1);const _=be(r);this._dir.applyQuaternion(_)}}break}break;default:this._dir.set(0,0,1);break}return this._space===1&&this._dir.applyQuaternion(this.system.worldQuaternion),this.applyRotation(this._dir),this._dir.normalize(),this.spherizeDirection(this._dir,this.sphericalDirectionAmount),this.randomizeDirection(this._dir,this.randomDirectionAmount),bp&&(B.DrawSphere(t,.01,8925952,.5,!0),B.DrawDirection(t,this._dir,8925952,.5,!0)),this._dir}static _randomQuat=new U;static _tempVec=new b;randomizePosition(e,t){if(t<=0)return;const i=dd._tempVec;i.set(Math.random()*2-1,Math.random()*2-1,Math.random()*2-1),i.x*=t*this.scale.x,i.y*=t*this.scale.y,i.z*=t*this.scale.z,e.add(i)}randomizeDirection(e,t){if(t===0)return;const i=dd._randomQuat,n=dd._tempVec;n.set(Math.random()-.5,Math.random()-.5,Math.random()-.5).normalize(),i.setFromAxisAngle(n,t*Math.random()*Math.PI),e.applyQuaternion(i)}spherizeDirection(e,t){if(t===0)return;const i=Math.random()*Math.PI*2,n=Math.acos(1-Math.random()*2),s=Math.sin(n)*Math.cos(i),r=Math.sin(n)*Math.sin(i),a=Math.cos(n),l=new b(s,r,a);e.lerp(l,t)}randomSpherePoint(e,t,i,n,s){const r=Math.random(),a=Math.random(),l=2*Math.PI*r*(n/360),c=Math.acos(2*a-1),h=L.lerp(1,1-Math.pow(1-Math.random(),Math.PI),i)*t,d=e.x+this.scale.x*(-h*Math.sin(c)*Math.cos(l)),p=e.y+this.scale.y*(h*Math.sin(c)*Math.sin(l)),m=e.z+this.scale.z*(h*Math.cos(c));s.x=d,s.y=p,s.z=m}randomCirclePoint(e,t,i,n,s){const r=Math.random(),a=2*Math.PI*r*(n/360),l=L.lerp(1,1-Math.pow(1-Math.random(),Math.PI),i)*t,c=e.x+this.scale.x*l*Math.cos(a),h=e.y+this.scale.y*l*Math.sin(a),d=e.z;s.x=c,s.y=h,s.z=d}_loopTime=0;_loopDirection=1;randomConePoint(e,t,i,n,s,r,a){let l=0,c=0;switch(r){case 0:l=Math.random(),c=Math.random();break;case 2:this._loopTime>1&&(this._loopDirection=-1),this._loopTime<0&&(this._loopDirection=1);case 1:l=.5,c=Math.random(),this._loopTime+=this.system.deltaTime*this._loopDirection;break}let h=2*Math.PI*l*(s/360);switch(r){case 2:case 1:h+=Math.PI+.5,h+=this._loopTime*Math.PI*2,h%=L.toRadians(s);break}const d=Math.acos(2*c-1),p=L.lerp(1,1-Math.pow(1-Math.random(),Math.PI),n)*i,m=e.x+-p*Math.sin(d)*Math.cos(h),f=e.y+p*Math.sin(d)*Math.sin(h),g=e.z;a.x=m*this.scale.x,a.y=f*this.scale.y,a.z=g*this.scale.z}};S([u()],Je.prototype,"shapeType"),S([u()],Je.prototype,"enabled"),S([u()],Je.prototype,"alignToDirection"),S([u()],Je.prototype,"angle"),S([u()],Je.prototype,"arc"),S([u()],Je.prototype,"arcSpread"),S([u()],Je.prototype,"arcSpeedMultiplier"),S([u()],Je.prototype,"arcMode"),S([u(b)],Je.prototype,"boxThickness"),S([u(b)],Je.prototype,"position"),S([u(b)],Je.prototype,"rotation"),S([u(b)],Je.prototype,"scale"),S([u()],Je.prototype,"radius"),S([u()],Je.prototype,"radiusThickness"),S([u()],Je.prototype,"sphericalDirectionAmount"),S([u()],Je.prototype,"randomDirectionAmount"),S([u()],Je.prototype,"randomPositionAmount"),S([u()],Je.prototype,"meshShapeType"),S([u(Qc)],Je.prototype,"meshRenderer");let Ky=Je;class _e{damping;enabled;frequency;octaveCount;octaveMultiplier;octaveScale;positionAmount;quality;remap;remapEnabled;remapMultiplier;remapX;remapXMultiplier;remapY;remapYMultiplier;remapZ;remapZMultiplier;scrollSpeedMultiplier;separateAxes;strengthMultiplier;strengthX;strengthXMultiplier;strengthY;strengthYMultiplier;strengthZ;strengthZMultiplier;_noise;_time=0;update(e){this._time+=e.time.deltaTime*this.scrollSpeedMultiplier}_temp=new b;apply(e,t,i,n,s,r){if(!this.enabled)return;this._noise||(this._noise=cP(()=>0));const a=this._temp.set(t.x,t.y,t.z).multiplyScalar(this.frequency),l=this._noise(a.x,a.y,a.z,this._time),c=this._noise(a.x,a.y,a.z,this._time+1e3*this.frequency),h=this._noise(a.x,a.y,a.z,this._time+2e3*this.frequency);this._temp.set(l,c,h).normalize();const d=s/r;let p=this.positionAmount.evaluate(d);this.separateAxes?(this._temp.x*=p*this.strengthXMultiplier,this._temp.y*=p*this.strengthYMultiplier,this._temp.z*=p*this.strengthZMultiplier):(this.strengthX&&(p*=this.strengthX.evaluate(d)*1.5),this._temp.multiplyScalar(p)),i.x+=this._temp.x,i.y+=this._temp.y,i.z+=this._temp.z}}S([u()],_e.prototype,"damping"),S([u()],_e.prototype,"enabled"),S([u()],_e.prototype,"frequency"),S([u()],_e.prototype,"octaveCount"),S([u()],_e.prototype,"octaveMultiplier"),S([u()],_e.prototype,"octaveScale"),S([u(Y)],_e.prototype,"positionAmount"),S([u()],_e.prototype,"quality"),S([u(Y)],_e.prototype,"remap"),S([u()],_e.prototype,"remapEnabled"),S([u()],_e.prototype,"remapMultiplier"),S([u(Y)],_e.prototype,"remapX"),S([u()],_e.prototype,"remapXMultiplier"),S([u(Y)],_e.prototype,"remapY"),S([u()],_e.prototype,"remapYMultiplier"),S([u(Y)],_e.prototype,"remapZ"),S([u()],_e.prototype,"remapZMultiplier"),S([u()],_e.prototype,"scrollSpeedMultiplier"),S([u()],_e.prototype,"separateAxes"),S([u()],_e.prototype,"strengthMultiplier"),S([u(Y)],_e.prototype,"strengthX"),S([u()],_e.prototype,"strengthXMultiplier"),S([u(Y)],_e.prototype,"strengthY"),S([u()],_e.prototype,"strengthYMultiplier"),S([u(Y)],_e.prototype,"strengthZ"),S([u()],_e.prototype,"strengthZMultiplier");class Fe{enabled;attachRibbonToTransform=!1;colorOverLifetime;colorOverTrail;dieWithParticles=!0;inheritParticleColor=!0;lifetime;lifetimeMultiplier;minVertexDistance=.2;mode=0;ratio=1;ribbonCount=1;shadowBias=0;sizeAffectsLifetime=!1;sizeAffectsWidth=!1;splitSubEmitterRibbons=!1;textureMode=0;widthOverTrail;widthOverTrailMultiplier;worldSpace=!1;getWidth(e,t,i,n){const s=this.widthOverTrail.evaluate(i,n);return e*=s,e}getColor(e,t,i){const n=this.colorOverTrail.evaluate(i),s=this.colorOverLifetime.evaluate(t);e.x*=n.r*s.r,e.y*=n.g*s.g,e.z*=n.b*s.b,"alpha"in n&&"alpha"in s&&(e.w*=n.alpha*s.alpha)}}S([u()],Fe.prototype,"enabled"),S([u()],Fe.prototype,"attachRibbonToTransform"),S([u(ta)],Fe.prototype,"colorOverLifetime"),S([u(ta)],Fe.prototype,"colorOverTrail"),S([u()],Fe.prototype,"dieWithParticles"),S([u()],Fe.prototype,"inheritParticleColor"),S([u(Y)],Fe.prototype,"lifetime"),S([u()],Fe.prototype,"lifetimeMultiplier"),S([u()],Fe.prototype,"minVertexDistance"),S([u()],Fe.prototype,"mode"),S([u()],Fe.prototype,"ratio"),S([u()],Fe.prototype,"ribbonCount"),S([u()],Fe.prototype,"shadowBias"),S([u()],Fe.prototype,"sizeAffectsLifetime"),S([u()],Fe.prototype,"sizeAffectsWidth"),S([u()],Fe.prototype,"splitSubEmitterRibbons"),S([u()],Fe.prototype,"textureMode"),S([u(Y)],Fe.prototype,"widthOverTrail"),S([u()],Fe.prototype,"widthOverTrailMultiplier"),S([u()],Fe.prototype,"worldSpace");class We{enabled;space=0;orbitalX;orbitalY;orbitalZ;orbitalXMultiplier;orbitalYMultiplier;orbitalZMultiplier;orbitalOffsetX;orbitalOffsetY;orbitalOffsetZ;speedModifier;speedModifierMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;_system;update(e){this._system=e}_temp=new b;_temp2=new b;_temp3=new b;_hasOrbital=!1;_index=0;_orbitalMatrix=new K;init(e){this._index==0&&(e.debug=!0),this._index+=1,e.orbitx=this.orbitalX.evaluate(Math.random()),e.orbity=this.orbitalY.evaluate(Math.random()),e.orbitz=this.orbitalZ.evaluate(Math.random()),this._hasOrbital=e.orbitx!=0||e.orbity!=0||e.orbitz!=0}apply(e,t,i,n,s,r,a){if(!this.enabled)return;const l=r/a,c=this.speedModifier.evaluate(l)*this.speedModifierMultiplier,h=this.x.evaluate(l),d=this.y.evaluate(l),p=this.z.evaluate(l);if(this._temp.set(-h,d,p),this._system&&this._system.main.simulationSpace===1&&this._temp.applyQuaternion(this._system.worldQuaternion),this._hasOrbital&&this._system?.worldPos){const m=this._temp2.set(i.x,i.y,i.z),f=this.orbitalXMultiplier,g=this.orbitalYMultiplier,y=this.orbitalZMultiplier,_=c*Math.PI*2*10,w=Math.cos(_*f),P=Math.sin(_*f),M=Math.cos(_*g),O=Math.sin(_*g),j=Math.cos(_*y),I=Math.sin(_*y),N=m.x*(M*j)+m.y*(M*I)+m.z*-O,V=m.x*(P*O*j-w*I)+m.y*(P*O*I+w*j)+m.z*(P*M),H=m.x*(w*O*j+P*I)+m.y*(w*O*I-P*j)+m.z*(w*M),X=this._temp3.set(m.x-N,m.y-V,m.z-H);X.normalize(),X.multiplyScalar(.2/s*Math.max(this.orbitalXMultiplier,this.orbitalYMultiplier,this.orbitalZMultiplier)),n.x+=X.x,n.y+=X.y,n.z+=X.z}n.x+=this._temp.x,n.y+=this._temp.y,n.z+=this._temp.z,n.x*=c,n.y*=c,n.z*=c}}S([u()],We.prototype,"enabled"),S([u()],We.prototype,"space"),S([u(Y)],We.prototype,"orbitalX"),S([u(Y)],We.prototype,"orbitalY"),S([u(Y)],We.prototype,"orbitalZ"),S([u()],We.prototype,"orbitalXMultiplier"),S([u()],We.prototype,"orbitalYMultiplier"),S([u()],We.prototype,"orbitalZMultiplier"),S([u()],We.prototype,"orbitalOffsetX"),S([u()],We.prototype,"orbitalOffsetY"),S([u()],We.prototype,"orbitalOffsetZ"),S([u(Y)],We.prototype,"speedModifier"),S([u()],We.prototype,"speedModifierMultiplier"),S([u(Y)],We.prototype,"x"),S([u()],We.prototype,"xMultiplier"),S([u(Y)],We.prototype,"y"),S([u()],We.prototype,"yMultiplier"),S([u(Y)],We.prototype,"z"),S([u()],We.prototype,"zMultiplier");class Wt{animation;enabled;cycleCount;frameOverTime;frameOverTimeMultiplier;numTilesX;numTilesY;startFrame;startFrameMultiplier;rowMode;rowIndex;spriteCount;timeMode;sampleOnceAtStart(){if(this.timeMode===0)switch(this.frameOverTime.mode){case 0:case 3:case 2:case 1:return!0}return!1}getStartIndex(){return this.sampleOnceAtStart()?Math.random()*(this.numTilesX*this.numTilesY):0}evaluate(e){if(!this.sampleOnceAtStart())return this.getIndex(e)}getIndex(e){const t=this.numTilesX*this.numTilesY;e=e*this.cycleCount;let i=this.frameOverTime.evaluate(e%1);return i*=this.frameOverTimeMultiplier,i*=t,i=i%t,i=Math.floor(i),i}}S([u()],Wt.prototype,"animation"),S([u()],Wt.prototype,"enabled"),S([u()],Wt.prototype,"cycleCount"),S([u(Y)],Wt.prototype,"frameOverTime"),S([u()],Wt.prototype,"frameOverTimeMultiplier"),S([u()],Wt.prototype,"numTilesX"),S([u()],Wt.prototype,"numTilesY"),S([u(Y)],Wt.prototype,"startFrame"),S([u()],Wt.prototype,"startFrameMultiplier"),S([u()],Wt.prototype,"rowMode"),S([u()],Wt.prototype,"rowIndex"),S([u()],Wt.prototype,"spriteCount"),S([u()],Wt.prototype,"timeMode");class En{enabled;separateAxes;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t){return this.enabled?this.separateAxes?0:this.z.evaluate(e,t)*-1:0}}S([u()],En.prototype,"enabled"),S([u()],En.prototype,"separateAxes"),S([u(Y)],En.prototype,"x"),S([u()],En.prototype,"xMultiplier"),S([u(Y)],En.prototype,"y"),S([u()],En.prototype,"yMultiplier"),S([u(Y)],En.prototype,"z"),S([u()],En.prototype,"zMultiplier");class on{enabled;range;separateAxes;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t){if(!this.enabled)return 0;if(!this.separateAxes){const i=L.lerp(this.range.x,this.range.y,t);return this.z.evaluate(i)*-1}return 0}}S([u()],on.prototype,"enabled"),S([u()],on.prototype,"range"),S([u()],on.prototype,"separateAxes"),S([u(Y)],on.prototype,"x"),S([u()],on.prototype,"xMultiplier"),S([u(Y)],on.prototype,"y"),S([u()],on.prototype,"yMultiplier"),S([u(Y)],on.prototype,"z"),S([u()],on.prototype,"zMultiplier");class ct{enabled;dampen;drag;dragMultiplier;limit;limitMultiplier;separateAxes;limitX;limitXMultiplier;limitY;limitYMultiplier;limitZ;limitZMultiplier;multiplyDragByParticleSize=!1;multiplyDragByParticleVelocity=!1;space;_temp=new b;_temp2=new b;apply(e,t,i,n,s,r,a){if(this.enabled){const l=this.limit.evaluate(s)*this.limitMultiplier;if(t.length()>l){this._temp.copy(t).normalize().multiplyScalar(l);const c=this.dampen*.5;t.x=L.lerp(t.x,this._temp.x,c),t.y=L.lerp(t.y,this._temp.y,c),t.z=L.lerp(t.z,this._temp.z,c),i.x=L.lerp(i.x,this._temp.x,c),i.y=L.lerp(i.y,this._temp.y,c),i.z=L.lerp(i.z,this._temp.z,c)}}}}S([u()],ct.prototype,"enabled"),S([u()],ct.prototype,"dampen"),S([u(Y)],ct.prototype,"drag"),S([u()],ct.prototype,"dragMultiplier"),S([u(Y)],ct.prototype,"limit"),S([u()],ct.prototype,"limitMultiplier"),S([u()],ct.prototype,"separateAxes"),S([u(Y)],ct.prototype,"limitX"),S([u()],ct.prototype,"limitXMultiplier"),S([u(Y)],ct.prototype,"limitY"),S([u()],ct.prototype,"limitYMultiplier"),S([u(Y)],ct.prototype,"limitZ"),S([u()],ct.prototype,"limitZMultiplier"),S([u()],ct.prototype,"multiplyDragByParticleSize"),S([u()],ct.prototype,"multiplyDragByParticleVelocity"),S([u()],ct.prototype,"space");const bh=class _S{enabled;curve;curveMultiplier;mode;clone(){const e=new _S;return e.enabled=this.enabled,e.curve=this.curve?.clone(),e.curveMultiplier=this.curveMultiplier,e.mode=this.mode,e}system;get _lastWorldPosition(){return this.system._iv_lastWorldPosition||(this.system._iv_lastWorldPosition=new b),this.system._iv_lastWorldPosition}get _velocity(){return this.system._iv_velocity||(this.system._iv_velocity=new b),this.system._iv_velocity}_temp=new b;_firstUpdate=!0;awake(e){this.system=e,this.reset()}reset(){this._firstUpdate=!0}update(e){this.enabled&&this.system.worldspace!==!1&&(this._firstUpdate?(this._firstUpdate=!1,this._velocity.set(0,0,0),this._lastWorldPosition.copy(this.system.worldPos)):this._lastWorldPosition&&(this._velocity.copy(this.system.worldPos).sub(this._lastWorldPosition).multiplyScalar(1/this.system.deltaTime),this._lastWorldPosition.copy(this.system.worldPos)))}applyInitial(e){if(this.enabled&&this.system.worldspace!==!1&&this.mode===0){const t=this.curve.evaluate(Math.random(),Math.random());this._temp.copy(this._velocity).multiplyScalar(t),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}_frames=0;applyCurrent(e,t,i){if(this.enabled&&this.system&&this.system.worldspace!==!1&&this.mode===1){const n=this.curve.evaluate(t,i);this._temp.copy(this._velocity).multiplyScalar(n),e.x+=this._temp.x,e.y+=this._temp.y,e.z+=this._temp.z}}};S([u()],bh.prototype,"enabled"),S([u(Y)],bh.prototype,"curve"),S([u()],bh.prototype,"curveMultiplier"),S([u()],bh.prototype,"mode");let Jy=bh;class bi{enabled;range;separateAxes;size;sizeMultiplier;x;xMultiplier;y;yMultiplier;z;zMultiplier;evaluate(e,t,i,n){const s=e.length(),r=L.remap(s,this.range.x,this.range.y,0,1),a=this.size.evaluate(r,i);return n.x*=a,n.y*=a,n.z*=a,n}}S([u()],bi.prototype,"enabled"),S([u(ee)],bi.prototype,"range"),S([u()],bi.prototype,"separateAxes"),S([u(Y)],bi.prototype,"size"),S([u()],bi.prototype,"sizeMultiplier"),S([u(Y)],bi.prototype,"x"),S([u()],bi.prototype,"xMultiplier"),S([u(Y)],bi.prototype,"y"),S([u()],bi.prototype,"yMultiplier"),S([u(Y)],bi.prototype,"z"),S([u()],bi.prototype,"zMultiplier");class kl{enabled;range;color;evaluate(e,t,i){const n=e.length(),s=L.remap(n,this.range.x,this.range.y,0,1),r=this.color.evaluate(s,t);i.x*=r.r,i.y*=r.g,i.z*=r.b,"alpha"in r&&(i.w*=r.alpha)}}S([u()],kl.prototype,"enabled"),S([u(ee)],kl.prototype,"range"),S([u(ta)],kl.prototype,"color"),new b(1,1,1),new b(0,0,1);class e0{constructor(e,t,i,n){this.system=e,this.particleSystem=t,this.subSystem=i,this.subParticleSystem=n,this.subParticleSystem&&this.subParticleSystem&&(this.subParticleSystem.onlyUsedByOther=!0);const s=1e3;this._circularBuffer=new Oi(()=>new Tm,s)}type="NeedleParticleSubEmitter";emitterType;emitterProbability;q_=new U;v_=new b;v2_=new b;_emitterMatrix=new Tm;_circularBuffer;clone(){throw new Error("Method not implemented.")}initialize(e){e.emissionState={burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0},this._emitterMatrix.copy(this.subSystem.matrixWorld).invert().premultiply(this.system.matrixWorld),this._emitterMatrix.setPosition(0,0,0),this.emitterType===t0.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===t0.Death){let n=e.life;if(e[Ml]!==void 0&&(n=e[Ml]),!(e.age+t*1.2>=n))return;const s=this.subSystem.main.maxParticles-this.subSystem.currentParticles;e.emissionState.waitEmiting=s}const i=new Tm;i.set(1,0,0,e.position.x,0,1,0,e.position.y,0,0,1,e.position.z,0,0,0,1),this.particleSystem.worldSpace||i.multiplyMatrices(this._emitterMatrix,i),this.subParticleSystem.emit(t,e.emissionState,i)}}var gA=Object.defineProperty,Ue=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&gA(e,t,n),n};const $s=v("debugparticles"),fA=v("noprogressive"),yA=v("debugprogressive");var t0=(o=>(o[o.Birth=0]="Birth",o[o.Collision=1]="Collision",o[o.Death=2]="Death",o[o.Trigger=3]="Trigger",o[o.Manual=4]="Manual",o))(t0||{});class sn extends R{renderMode;particleMaterial;trailMaterial;particleMesh;maxParticleSize;minParticleSize;velocityScale;cameraVelocityScale;lengthScale;start(){if(this.maxParticleSize!==.5&&this.minParticleSize!==0&&A()){const e=`ParticleSystem "${this.name}" has non-default min/max particle size. This may not render correctly. Please set min size to 0 and the max size to 0.5 and use the "StartSize" setting instead`;console.warn(e)}}get transparent(){return this.particleMaterial?.transparent??!1}getMaterial(e=!1){let t=e===!0&&this.trailMaterial?this.trailMaterial:this.particleMaterial;if(t){if(t.type==="MeshStandardMaterial"){$s&&console.debug("ParticleSystemRenderer.getMaterial: MeshStandardMaterial detected, converting to MeshBasicMaterial. See https://github.com/Alchemist0823/three.quarks/issues/101"),"map"in t&&t.map&&(t.map.colorSpace=So,t.map.premultiplyAlpha=!1);const i=new xe;i.copy(t),e?this.trailMaterial=i:this.particleMaterial=i}t.map&&(t.map.colorSpace=So,t.map.premultiplyAlpha=!1),e&&t.side===ps&&(t=t.clone(),t.side=Pd,e?this.trailMaterial=t:this.particleMaterial=t)}return t&&!fA&&t._didRequestTextureLOD===void 0&&(t._didRequestTextureLOD=0,yA&&console.log("Load material LOD",t.name),Ve.assignTextureLOD(t,0)),t}getMesh(e){let t=null;if(!t&&(this.particleMesh instanceof G&&(t=this.particleMesh.geometry),t===null)){t=new Un(1,1);const i=t.attributes.uv;for(let n=0;n<i.count;n++)i.setX(n,1-i.getX(n))}return new G(t,this.getMaterial())}}Ue([u()],sn.prototype,"renderMode"),Ue([u(ve)],sn.prototype,"particleMaterial"),Ue([u(ve)],sn.prototype,"trailMaterial"),Ue([u()],sn.prototype,"maxParticleSize"),Ue([u()],sn.prototype,"minParticleSize"),Ue([u()],sn.prototype,"velocityScale"),Ue([u()],sn.prototype,"cameraVelocityScale"),Ue([u()],sn.prototype,"lengthScale");class xp{_curve;_factor;constructor(e,t=1){this._curve=e,this._factor=t}type="function";startGen(e){}genValue(e,t){return this._curve.evaluate(t,Math.random())*this._factor}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}}class i0{type="value";toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}startGen(e){}system;constructor(e){this.system=e}}class bA extends i0{genValue(){return this.system.textureSheetAnimation.getStartIndex()}}class _A extends i0{_lastPosition=new b;_lastDistance=0;update(){const e=J(this.system.gameObject);this._lastDistance=this._lastPosition.distanceTo(e),this._lastPosition.copy(e)}genValue(){if(!this.system.isPlaying||!this.system.emission.enabled||this.system.currentParticles>=this.system.maxParticles)return 0;let e=this.system.emission.rateOverTime.evaluate(this.system.time/this.system.duration,Math.random());if(this.system.deltaTime>0){const n=this.system.emission.rateOverDistance.evaluate(this.system.time/this.system.duration,Math.random());let s=this._lastDistance/this.system.deltaTime*n;Number.isFinite(s)||(s=0),e+=s}const t=this.system.emission.getBurst();t>0&&(e+=t/this.system.deltaTime);const i=this.system.maxParticles-this.system.currentParticles;return L.clamp(e,0,i/this.system.deltaTime)}}class vA extends i0{genValue(){return this.system.isPlaying,0}}class Hs{system;get context(){return this.system.context}constructor(e){this.type=Object.getPrototypeOf(this).constructor.name||"ParticleSystemBaseBehaviour",e&&(this.system=e)}type;initialize(e){}update(e,t){}frameUpdate(e){}toJSON(){throw new Error("Method not implemented.")}clone(){throw new Error("Method not implemented.")}reset(){}}class wA extends Hs{type="NeedleTextureSheet";update(e,t){const i=this.system.textureSheetAnimation;if(i.enabled){const n=e.age/e.life,s=i.evaluate(n);s!==void 0&&(e.uvTile=s)}}}const a1=Symbol("particleRotation");class xA extends Hs{type="NeedleRotation";initialize(e){e[a1]=Math.random()}update(e,t){if(e.rotation===void 0)return;const i=e.age/e.life;if(typeof e.rotation=="number"&&(this.system.rotationOverLifetime.enabled?e.rotation+=this.system.rotationOverLifetime.evaluate(i,e[a1])*t:this.system.renderer.renderMode===Go.Billboard&&(e.rotation=Math.PI),this.system.rotationBySpeed.enabled)){const n=e.velocity.length();e.rotation+=this.system.rotationBySpeed.evaluate(i,n)*t}}}const l1=Symbol("sizeLerpFactor"),SA=new b;class CA extends Hs{type="NeedleSize";_minSize=0;_maxSize=1;initialize(e){e[l1]=Math.random(),this._minSize=this.system.renderer.minParticleSize,this._maxSize=this.system.renderer.maxParticleSize}update(e,t){const i=e.age/e.life;let n=1;this.system.sizeOverLifetime.enabled&&(n*=this.system.sizeOverLifetime.evaluate(i,void 0,e[l1]).x);let s=1;this.system.renderer.renderMode!==Go.Mesh&&(s=this.system.worldScale.x/this.system.cameraScale);const r=D(e.startSize).multiplyScalar(n*s);if(e.size.set(r.x,r.y,r.z),this.system.localspace){const a=p1(this.system,SA);e.size.x*=a.x,e.size.y*=a.y,e.size.z*=a.z}}}const Ml=Symbol("particleLife"),n0=Symbol("trailLifetime"),c1=Symbol("trailStartLength"),o0=Symbol("trailWidthRandom");class PA extends Hs{type="NeedleTrail";initialize(e){e instanceof Ob&&(e[Ml]=e.life,this.system.trails.enabled&&this.system.trails.dieWithParticles===!1&&(e[n0]=this.system.trails.lifetime.evaluate(Math.random(),Math.random()),e.life+=e[n0]),e[c1]=e.length,e[o0]=Math.random())}update(e){if(this.system.trails?.enabled&&e instanceof Ob){const t=e,i=e.age/e[Ml],n=e.previous.values(),s=e.previous.length;for(let r=0;r<s;r++){const a=n.next().value,l=1-r/(s-1),c=e.size;if(c.x<=0&&!this.system.trails.sizeAffectsWidth){const h=20*this.system.trails.widthOverTrail.evaluate(.5,t[o0]);c.x=h,c.y=h,c.z=h}a.size=this.system.trails.getWidth(c.x,i,l,t[o0]),a.color.copy(e.color),this.system.trails.getColor(a.color,i,l)}if(e.age>e[Ml]){e.velocity.set(0,0,0);const r=(e.age-e[Ml])/e[n0];t.length=L.lerp(e[c1],0,r)}}}}const Sp=Symbol("startVelocity"),h1=Symbol("gravityModifier"),s0=Symbol("gravitySpeed"),Cp=Symbol("velocity lerp factor"),r0=new b;class OA extends Hs{type="NeedleVelocity";_gravityDirection=new b;initialize(e){const t=this.system.main.simulationSpeed;e.startSpeed=this.system.main.startSpeed.evaluate(Math.random(),Math.random());const i=this.system.shape.getDirection(e,e.position);e.velocity.x=i.x*e.startSpeed,e.velocity.y=i.y*e.startSpeed,e.velocity.z=i.z*e.startSpeed,this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyInitial(e.velocity),e[Sp]?e[Sp].copy(e.velocity):e[Sp]=e.velocity.clone();const n=this.system.main.gravityModifier.evaluate(Math.random(),Math.random());e[h1]=n*t,e[s0]=n*t*.5,e[Cp]=Math.random(),this.system.velocityOverLifetime?.init(e),this._gravityDirection.set(0,-1,0),this.system.main.simulationSpace===yh.Local&&this._gravityDirection.applyQuaternion(this.system.worldQuaternionInverted).normalize()}update(e,t){const i=e[Sp],n=e[h1];if(n!==0){const d=n*e[s0];r0.copy(this._gravityDirection).multiplyScalar(d),e[s0]+=t*.05,i.add(r0)}e.velocity.copy(i);const s=e.age/e.life;this.system.inheritVelocity?.enabled&&this.system.inheritVelocity.applyCurrent(e.velocity,s,e[Cp]);const r=this.system.noise;r.enabled&&r.apply(0,e.position,e.velocity,t,e.age,e.life);const a=this.system.sizeBySpeed;a?.enabled&&(e.size=a.evaluate(e.velocity,s,e[Cp],e.size));const l=this.system.colorBySpeed;l?.enabled&&l.evaluate(e.velocity,e[Cp],e.color);const c=this.system.velocityOverLifetime;c.enabled&&c.apply(e,0,e.position,e.velocity,t,e.age,e.life);const h=this.system.limitVelocityOverLifetime;if(h.enabled&&h.apply(e.position,i,e.velocity,e.size,s,t,1),this.system.worldspace){const d=this.system.worldScale;e.velocity.x*=d.x,e.velocity.y*=d.y,e.velocity.z*=d.z}}}const d1=Symbol("colorLerpFactor"),u1=new oe(1,1,1,1),na=new oe(1,1,1,1);class kA extends Hs{type="NeedleColor";initialize(e){}_init(e){const t=this.system.renderer.particleMaterial;na.copy(this.system.main.startColor.evaluate(Math.random())),t?.color&&(u1.copy(t.color),na.multiply(u1)),na.convertLinearToSRGB(),e.startColor.set(na.r,na.g,na.b,na.alpha),e.color.copy(e.startColor),e[d1]=Math.random()}update(e,t){if(e.age===0&&this._init(e),this.system.colorOverLifetime.enabled){const i=e.age/e.life,n=this.system.colorOverLifetime.color.evaluate(i,e[d1]);e.color.set(n.r,n.g,n.b,"alpha"in n?n.alpha:1).multiply(e.startColor)}else e.color.copy(e.startColor)}}class MA{system;emission;get anim(){return this.system.textureSheetAnimation}constructor(e){this.system=e,this.emission=new _A(this.system)}get prewarm(){return!1}get material(){return this.system.renderer.getMaterial(this.system.trails.enabled)}get layers(){return this.system.gameObject.layers}update(){this.emission.update()}autoDestroy;get looping(){return this.system.main.loop}get duration(){return this.system.duration}get shape(){return this.system.shape}get startLife(){return new xp(this.system.main.startLifetime)}get startSpeed(){return new xp(this.system.main.startSpeed)}get startRotation(){return new xp(this.system.main.startRotation)}get startSize(){return new xp(this.system.main.startSize)}startLength;get startColor(){return new uP(new pP(1,1,1,1))}get emissionOverTime(){return this.emission}get emissionOverDistance(){return new vA(this.system)}emissionBursts;onlyUsedByOther;behaviors=[];get instancingGeometry(){return this.system.renderer.getMesh(this.system.renderer.renderMode).geometry}get renderMode(){if(this.system.trails.enabled===!0)return Oo.Trail;switch(this.system.renderer.renderMode){case Go.Billboard:return Oo.BillBoard;case Go.Stretch:return Oo.StretchedBillBoard;case Go.HorizontalBillboard:return Oo.HorizontalBillBoard;case Go.VerticalBillboard:return Oo.VerticalBillBoard;case Go.Mesh:return Oo.Mesh}return Oo.BillBoard}rendererEmitterSettings={startLength:new mP(220),followLocalOrigin:!1};get speedFactor(){let e=this.system.main.simulationSpeed;return this.system.renderer?.renderMode===Go.Stretch&&(e*=this.system.renderer.velocityScale??1),e}flatWhiteTexture;clonedTexture={original:void 0,clone:void 0};get texture(){const e=this.material;if(e&&e.map){const t=e.map;if(this.clonedTexture.original!==t||!this.clonedTexture.clone){const i=t.clone();i.premultiplyAlpha=!1,i.colorSpace=So,this.clonedTexture.original=t,this.clonedTexture.clone=i}return this.clonedTexture.clone}return this.flatWhiteTexture||(this.flatWhiteTexture=ef(new oe(1,1,1,1),1)),this.flatWhiteTexture}get startTileIndex(){return new bA(this.system)}get uTileCount(){return this.anim.enabled?this.anim?.numTilesX:void 0}get vTileCount(){return this.anim.enabled?this.anim?.numTilesY:void 0}get renderOrder(){return 1}get blending(){return this.system.renderer.particleMaterial?.blending??kC}get transparent(){return this.system.renderer.transparent}get worldSpace(){return this.system.main.simulationSpace===yh.World}}class RA{burstParticleIndex=0;burstParticleCount=0;isBursting=!1;travelDistance=0;previousWorldPos;burstIndex=0;burstWaveIndex=0;time=0;waitEmiting=0}const $t=class rm extends R{play(e=!1){e&&x.foreachComponent(this.gameObject,t=>{t instanceof rm&&t!==this&&t.play(!1)},!0),this._isPlaying=!0,this._particleSystem&&(this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1),this.emission?.reset()}pause(e=!0){e&&x.foreachComponent(this.gameObject,t=>{t instanceof rm&&t!==this&&t.pause(!1)},!0),this._isPlaying=!1}stop(e=!0,t=!1){e&&x.foreachComponent(this.gameObject,i=>{i instanceof rm&&i!==this&&i.stop(!1,t)},!0),this._isPlaying=!1,this._time=0,t&&this.reset()}reset(){this._time=0,this._particleSystem&&(this._particleSystem.particleNum=0,this._particleSystem.emissionState.time=0,this._particleSystem.emitEnded=!1,this.emission?.reset())}_state;emit(e){if(this._particleSystem){this.onUpdate(),e=Math.min(e,this.maxParticles-this.currentParticles),this._state||(this._state=new RA),this._state.waitEmiting=e,this._state.time=0;const t=this._particleSystem.emitEnded;this._particleSystem.emitEnded=!1,this._particleSystem.emit(this.deltaTime,this._state,this._particleSystem.emitter.matrixWorld),this._particleSystem.emitEnded=t}}get playOnAwake(){return this.main.playOnAwake}set playOnAwake(e){this.main.playOnAwake=e}colorOverLifetime;main;emission;sizeOverLifetime;shape;noise;trails;velocityOverLifetime;limitVelocityOverLifetime;inheritVelocity;colorBySpeed;textureSheetAnimation;rotationOverLifetime;rotationBySpeed;sizeBySpeed;get renderer(){return this._renderer}get isPlaying(){return this._isPlaying}get currentParticles(){return this._particleSystem?.particleNum??0}get maxParticles(){return this.main.maxParticles}get time(){return this._time}get duration(){return this.main.duration}get deltaTime(){return this.context.time.deltaTime*this.main.simulationSpeed}get scale(){return this.gameObject.scale.x}get cameraScale(){return this._cameraScale}_cameraScale=1;get container(){return this._container}get worldspace(){return this.main.simulationSpace===yh.World}get localspace(){return this.main.simulationSpace===yh.Local}__worldQuaternion=new U;get worldQuaternion(){return this.__worldQuaternion}_worldQuaternionInverted=new U;get worldQuaternionInverted(){return this._worldQuaternionInverted}_worldScale=new b;get worldScale(){return this._worldScale}_worldPositionFrame=-1;_worldPos=new b;get worldPos(){return this._worldPositionFrame!==this.context.time.frame&&(this._worldPositionFrame=this.context.time.frame,J(this.gameObject,this._worldPos)),this._worldPos}get matrixWorld(){return this._container.matrixWorld}get isSubsystem(){return this._isUsedAsSubsystem}addBehaviour(e){return this._particleSystem?(e instanceof Hs&&(e.system=this),$s&&console.debug("Add custom ParticleSystem Behaviour",e),this._particleSystem.addBehavior(e),!0):!1}removeBehaviour(e){if(!this._particleSystem)return!1;const t=this._particleSystem.behaviors,i=t.indexOf(e);return i!==-1&&((A()||$s)&&console.debug("Remove custom ParticleSystem Behaviour",i,e),t.splice(i,1)),!0}removeAllBehaviours(){return this._particleSystem?(this._particleSystem.behaviors.length=0,!0):!1}get behaviours(){return this._particleSystem?this._particleSystem.behaviors:null}get particleSystem(){return this._particleSystem??null}_renderer;_batchSystem;_particleSystem;_interface;_container;_time=0;_isPlaying=!0;_isUsedAsSubsystem=!1;_didPreWarm=!1;set bursts(e){for(let t=0;t<e.length;t++){const i=e[t];if(!(i instanceof vp)){const n=new vp;Va(n,i),e[t]=n}}this._bursts=e}_bursts;set subEmitterSystems(e){for(let t=0;t<e.length;t++){const i=e[t];if(!(i instanceof Pp)){const n=new Pp;Va(n,i),e[t]=n}}$s&&e.length>0&&console.log("SubEmitters: ",e,this),this._subEmitterSystems=e}_subEmitterSystems;onAfterDeserialize(e){if(this._subEmitterSystems&&Array.isArray(this._subEmitterSystems))for(const t of this._subEmitterSystems)t._deserialize(this.context,this.gameObject)}awake(){if(this._worldPositionFrame=-1,this._renderer=this.gameObject.getComponent(sn),!this.main)throw new Error("Not Supported: ParticleSystem needs a serialized MainModule. Creating new particle systems at runtime is currently not supported.");this._container=new k,this._container.matrixAutoUpdate=!1,this.context.scene.add(this._container),this._batchSystem=new hP,this._batchSystem.name=this.gameObject.name,this._container.add(this._batchSystem),this._interface=new MA(this),this._particleSystem=new dP(this._interface),this._particleSystem.addBehavior(new CA(this)),this._particleSystem.addBehavior(new kA(this)),this._particleSystem.addBehavior(new wA(this)),this._particleSystem.addBehavior(new xA(this)),this._particleSystem.addBehavior(new OA(this)),this._particleSystem.addBehavior(new PA(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),$s&&(console.log(this),this.gameObject.add(new Si(1)))}start(){this.addSubParticleSystems(),this.updateLayers(),this.renderer.particleMesh instanceof G&&this._interface.renderMode==Oo.Mesh&&Ve.assignMeshLOD(this.renderer.particleMesh,0).then(e=>{e&&this.particleSystem&&this._interface.renderMode==Oo.Mesh&&(this.particleSystem.instancingGeometry=e)})}onDestroy(){this._container?.removeFromParent(),this._batchSystem?.removeFromParent(),this._particleSystem?.emitter.removeFromParent(),this._particleSystem?.dispose()}onEnable(){this.main&&(this.inheritVelocity&&(this.inheritVelocity.system=this),this._batchSystem&&(this._batchSystem.visible=!0),this.playOnAwake&&this.play(),this._isPlaying=this.playOnAwake)}onDisable(){this._batchSystem&&(this._batchSystem.visible=!1)}onBeforeRender(){this.main&&(this._didPreWarm===!1&&this.main?.prewarm===!0&&(this._didPreWarm=!0,this.preWarm()),this.onUpdate(),this.onSimulate(this.deltaTime))}preWarm(){if(!this.emission?.enabled||this.emission.rateOverTime.getMax()<=0)return;const e=1/60,t=this.main.duration,i=this.main.startLifetime.getMax(),n=Math.min(Math.max(t,i)/Math.max(.01,this.main.simulationSpeed),1e3),s=Math.ceil(n/e),r=Date.now();$s&&console.log(`Particles ${this.name} - Prewarm for ${s} frames (${n} sec). Duration: ${t}, Lifetime: ${i}`);for(let a=0;a<s&&!(this.currentParticles>=this.maxParticles);a++){const l=Date.now()-r;if(l>2e3){console.warn(`Particles ${this.name} - Prewarm took too long. Aborting: ${l}`);break}this.onUpdate(),this.onSimulate(e)}}_lastBatchesCount=-1;onSimulate(e){if(this._batchSystem){let t=this.context.time.frameCount%60===0;this._lastBatchesCount!==this._batchSystem.batches.length&&(this._lastBatchesCount=this._batchSystem.batches.length,t=!0),t&&this.updateLayers(),this._batchSystem.update(e)}this._time+=e,this._time>this.duration&&(this._time=0)}updateLayers(){if(this._batchSystem)for(let e=0;e<this._batchSystem.batches.length;e++){const t=this._batchSystem.batches[e];t.layers.disableAll();const i=this.layer;t.layers.mask=1<<i}}onUpdate(){if(this._bursts&&(this.emission.bursts=this._bursts,delete this._bursts),!this._isPlaying)return;const e=this.context.mainCamera;if(e){const n=He(e);this._cameraScale=n.x}const t=!this.worldspace,i=this.gameObject;if(be(i,this.__worldQuaternion),this._worldQuaternionInverted.copy(this.__worldQuaternion).invert(),He(this.gameObject,this._worldScale),t&&this._container&&this.gameObject?.parent){const n=p1(this,r0);this._container.matrix.makeScale(n.x,n.y,n.z),this._container.matrix.makeRotationFromQuaternion(this.__worldQuaternion),this._container.matrix.setPosition(this.worldPos),this._container.matrix.scale(this.gameObject.scale)}this.emission.system=this,this._interface.update(),this.shape.onUpdate(this,this.context,this.main.simulationSpace,this.gameObject),this.noise.update(this.context),this.inheritVelocity?.update(this.context),this.velocityOverLifetime.update(this)}addSubParticleSystems(){if(this._subEmitterSystems&&this._particleSystem)for(const e of this._subEmitterSystems){e.particleSystem&&(e.particleSystem.__internalAwake?e.particleSystem.__internalAwake():A()&&console.warn("SubParticleSystem serialization issue(?)",e.particleSystem,e));const t=e.particleSystem?._particleSystem;if(t){e.particleSystem._isUsedAsSubsystem=!0;const i=new e0(this,this._particleSystem,e.particleSystem,t);i.emitterType=e.type,i.emitterProbability=e.emitProbability,this._particleSystem.addBehavior(i)}else $s&&console.warn("Could not add SubParticleSystem",e,this)}}};Ue([u(wp)],$t.prototype,"colorOverLifetime"),Ue([u(Vt)],$t.prototype,"main"),Ue([u(Xo)],$t.prototype,"emission"),Ue([u(ia)],$t.prototype,"sizeOverLifetime"),Ue([u(Ky)],$t.prototype,"shape"),Ue([u(_e)],$t.prototype,"noise"),Ue([u(Fe)],$t.prototype,"trails"),Ue([u(We)],$t.prototype,"velocityOverLifetime"),Ue([u(ct)],$t.prototype,"limitVelocityOverLifetime"),Ue([u(Jy)],$t.prototype,"inheritVelocity"),Ue([u(kl)],$t.prototype,"colorBySpeed"),Ue([u(Wt)],$t.prototype,"textureSheetAnimation"),Ue([u(En)],$t.prototype,"rotationOverLifetime"),Ue([u(on)],$t.prototype,"rotationBySpeed"),Ue([u(bi)],$t.prototype,"sizeBySpeed");let _h=$t;class Pp{particleSystem;emitProbability=1;properties;type;_deserialize(e,t){const i=this.particleSystem;if(i instanceof _h)return;let n="";i&&typeof i.guid=="string"&&(n=i.guid,this.particleSystem=x.findByGuid(n,t)),$s&&!(this.particleSystem instanceof _h)&&console.warn("Could not find particle system for sub emitter",n,t,this)}}function p1(o,e){if(e.set(1,1,1),o.gameObject.parent&&o.localspace)switch(o.main.scalingMode){case Zy.Local:e=He(o.gameObject.parent,e),e.x=1/e.x,e.y=1/e.y,e.z=1/e.z;break;default:if(!o.unsupported_scaling_mode){o.unsupported_scaling_mode=!0;const t="ParticleSystem scale mode "+Zy[o.main.scalingMode]+" is not supported";A()&&ye(t),console.warn(t,o.name,o)}e=He(o.gameObject,e);break}return e}var TA=Object.defineProperty,a0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&TA(e,t,n),n};class Rl extends R{strength=1;radius=2;targets=[];update(){const e=this.gameObject.worldPosition,t=-this.strength*this.context.time.deltaTime;this.targets?.forEach(i=>{if(!i)return;const n=i.gameObject.worldPosition.sub(e),s=n.length();if(s>this.radius)return;let r=t;s>1?r/=s*s:r/=Math.max(.05,s),i.applyImpulse(n.multiplyScalar(r))})}}a0([u()],Rl.prototype,"strength"),a0([u()],Rl.prototype,"radius"),a0([u(Ze)],Rl.prototype,"targets");class ql extends R{_didAssignPlayerColor=!1;onEnable(){this.context.connection.beginListen(te.JoinedRoom,this.tryAssignColor),this._didAssignPlayerColor||this.startCoroutine(this.waitForConnection())}onDisable(){this.context.connection.stopListen(te.JoinedRoom,this.tryAssignColor)}*waitForConnection(){for(;!this.destroyed&&this.activeAndEnabled&&(yield Kg(.2),!this.tryAssignColor()););}tryAssignColor=()=>{const e=x.getComponentInParent(this.gameObject,kn);if(e&&e.owner)return this._didAssignPlayerColor=!0,this.assignUserColor(e.owner),!0;const t=x.getComponentInParent(this.gameObject,Ie);return t?.connectionId?(this._didAssignPlayerColor=!0,this.assignUserColor(t.connectionId),!0):!1};assignUserColor(e){const t=ql.hashCode(e),i=ql.colorFromHashCode(t);if(this.gameObject.type==="Mesh"){const n=this.gameObject;this.assignColor(i,e,n)}else if(this.gameObject.children)for(const n of this.gameObject.children){const s=n;s.material&&s.material.color&&this.assignColor(i,e,s)}}assignColor(e,t,i){let n=i.material;n&&(n._playerMaterial!==t&&(n=n.clone(),n._playerMaterial=t,i.material=n),n.color=e)}static hashCode(e){var t=0,i,n;if(e.length===0)return t;for(i=0;i<e.length;i++)n=e.charCodeAt(i),t=(t<<5)-t+n,t|=0;return t}static colorFromHashCode(e){const t=(e&16711680)>>16,i=(e&65280)>>8,n=e&255;return new ne(t/255,i/255,n/255)}}const vh=v("debugpost");let l0=null;function EA(o){l0=o}function m1(o){let e=o.gameObject;for(;e;){for(const t of uu(e))if(t.isPostProcessingManager===!0)return t;e=e.parent}return null}function AA(o){let e=m1(o);if(!e)if(l0){vh&&console.warn("Adding postprocessing manager to the scene.");const t=o.scene;e=Sn(t,l0)}else A()&&console.warn("No post processing manager found");return e}const ht={AT_START:-1e4,NormalPass:0,DepthDownsamplingPass:10,SSAO:20,SMAA:30,TiltShift:40,DepthOfField:50,ChromaticAberration:60,Bloom:70,Vignette:80,Pixelation:90,ToneMapping:100,HueSaturation:110,BrightnessContrast:120,Sharpening:130,AT_END:1e4};let et=null;function IA(o){vh==="verbose"&&console.debug("Before ordering effects",[...o]),et||(et=new Map,et.set(E.POSTPROCESSING.MODULE.NormalPass,ht.NormalPass),et.set(E.POSTPROCESSING.MODULE.DepthDownsamplingPass,ht.DepthDownsamplingPass),et.set(E.POSTPROCESSING.MODULE.SMAAEffect,ht.SMAA),et.set(E.POSTPROCESSING.MODULE.SSAOEffect,ht.SSAO),et.set(E.POSTPROCESSING_AO.MODULE.N8AOPostPass,ht.SSAO),et.set(E.POSTPROCESSING_AO.MODULE.N8AOPass,ht.SSAO),et.set(E.POSTPROCESSING.MODULE.TiltShiftEffect,ht.TiltShift),et.set(E.POSTPROCESSING.MODULE.DepthOfFieldEffect,ht.DepthOfField),et.set(E.POSTPROCESSING.MODULE.ChromaticAberrationEffect,ht.ChromaticAberration),et.set(E.POSTPROCESSING.MODULE.BloomEffect,ht.Bloom),et.set(E.POSTPROCESSING.MODULE.SelectiveBloomEffect,ht.Bloom),et.set(E.POSTPROCESSING.MODULE.VignetteEffect,ht.Vignette),et.set(E.POSTPROCESSING.MODULE.PixelationEffect,ht.Pixelation),et.set(E.POSTPROCESSING.MODULE.ToneMappingEffect,ht.ToneMapping),et.set(E.POSTPROCESSING.MODULE.HueSaturationEffect,ht.HueSaturation),et.set(E.POSTPROCESSING.MODULE.BrightnessContrastEffect,ht.BrightnessContrast)),o.sort((e,t)=>{const i=typeof e.priority=="number"?e.priority:et.get(e.effect.constructor)??Number.NEGATIVE_INFINITY,n=typeof t.priority=="number"?t.priority:et.get(t.effect.constructor)??Number.NEGATIVE_INFINITY;return i===Number.NEGATIVE_INFINITY?(vh&&console.warn("Unknown effect found: ",e.constructor.name,e),1):n===Number.NEGATIVE_INFINITY?(vh&&console.warn("Unknown effect found: ",t.constructor.name,t),-1):i-n}),vh==="verbose"&&console.debug("After ordering effects",[...o])}var LA=Object.defineProperty,jA=Object.getOwnPropertyDescriptor,g1=(o,e,t,i)=>{for(var n=jA(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&LA(e,t,n),n};const DA=v("debugpost");class F{isVolumeParameter=!0;constructor(e){e!==void 0&&this.initialize(e)}_isInitialized=!1;get isInitialized(){return this._isInitialized}initialize(e){e!==void 0&&(this._value=e,this._defaultValue=e,this._valueRaw=e,this._isInitialized=!0)}get overrideState(){return this._active}set overrideState(e){if(this._active===e)return;this._active=e;const t=e?this._valueRaw:this._defaultValue;this.processValue(t,!0)}_active=!0;get value(){return this._valueRaw}set value(e){this.isInitialized||this.initialize(e),this.processValue(e,!1)}_value;_valueRaw;set defaultValue(e){this._defaultValue=e}_defaultValue=void 0;__init(){this.processValue(this._valueRaw,!0)}valueProcessor;onValueChanged;processValue(e,t){if(e==null||!t&&this.testIfValueChanged(e)===!1)return;const i=this._value;DA&&typeof i=="number"&&typeof e=="number"&&(i?.toFixed(4),e?.toFixed(4)),!this._active&&this._defaultValue!==void 0?(this._value=this._defaultValue,e=this._defaultValue,this._valueRaw=e):(this._valueRaw=e,this._active&&this.valueProcessor&&(e=this.valueProcessor(e)),this._value=e),this.onValueChanged&&this.onValueChanged(e,i,this)}testIfValueChanged(e){return this._valueRaw!==e}}g1([u()],F.prototype,"overrideState"),g1([u()],F.prototype,"value");class BA extends Yi{constructor(){super([F])}onSerialize(e,t){}onDeserialize(e,t){const i=t.target,n=t.path;let s;if(i&&n&&(s=i[n]),(typeof s!="object"||typeof s=="object"&&s.isVolumeParameter!==!0)&&(s=new F),typeof e=="object"&&"value"in e){const r=e.value;s.initialize(r),s.overrideState=e.overrideState}else s.value=e;return s}}new BA;var FA=Object.defineProperty,UA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&FA(e,t,n),n};const c0=v("debugpost");class tt extends R{get isPostProcessingEffect(){return!0}order=void 0;constructor(e=void 0){if(super(),e)for(const t of Object.keys(e)){const i=e[t],n=this[t];n instanceof F?n.initialize(i):n!==void 0&&(this[t]=i)}}active=!0;_manager=null;onEnable(){super.onEnable(),c0&&console.warn("Enable",this.constructor.name+(this.__internalDidAwakeAndStart?"":" (awake)")),this.__internalDidAwakeAndStart&&(this.active=!0),this.onEffectEnabled()}onDisable(){super.onDisable(),c0&&console.warn("Disable",this.constructor.name),this._manager?.removeEffect(this),this.active=!1}onEffectEnabled(e){e&&e.isPostProcessingManager===!0?this._manager=e:this._manager||(this._manager=AA(this)),this._manager.addEffect(this),this._manager.dirty=!0}init(){}_result;_postprocessingContext=null;get postprocessingContext(){return this._postprocessingContext}apply(e){return this._postprocessingContext=e,this._result||(this.initParameters(),this._result=this.onCreateEffect?.call(this)),this._result&&this.initParameters(),this._result}unapply(){}dispose(){c0&&console.warn("DISPOSE",this),this._result&&(Array.isArray(this._result)?this._result.forEach(e=>e.dispose()):this._result.dispose()),this._result=void 0}initParameters(){const e=Object.keys(this);for(const t of e){const i=this[t];i instanceof F&&i.__init()}}onEditorModification(e){const t=e.propertyName;if(this[t]instanceof F){const i=e.value;return this[t].value=i,!0}}}UA([u()],tt.prototype,"active");var zA=Object.defineProperty,NA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&zA(e,t,n),n};const VA=v("debugpost"),h0={};function rn(o,e){h0[o]=e}function WA(o){return o.__type in h0?h0[o.__type]:(VA&&o.__type&&console.warn("Unknown postprocessing type",o.__type,o),tt)}class Op{components=[];__init(e){this.components?.forEach(t=>{t.gameObject===void 0&&e.gameObject.addComponent(t),t.init()})}addEffect(e){this.components.push(e)}removeEffect(e){const t=this.components.indexOf(e);t>=0&&this.components.splice(t,1)}}NA([qe([o=>WA(o),tt])],Op.prototype,"components");var $A=Object.defineProperty,HA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&$A(e,t,n),n};const GA=v("debugpost");class wh extends tt{get typeName(){return"Antialiasing"}preset=new F(2);onCreateEffect(){const e=new E.POSTPROCESSING.MODULE.SMAAEffect({preset:this.preset?.value??E.POSTPROCESSING.MODULE.SMAAPreset.HIGH,edgeDetectionMode:E.POSTPROCESSING.MODULE.EdgeDetectionMode.LUMA});return this.preset.onValueChanged=t=>{GA&&console.log("Antialiasing preset changed to",t),e.applyPreset(t)},e}}HA([u(F)],wh.prototype,"preset"),rn("Antialiasing",wh);var qA=Object.defineProperty,d0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&qA(e,t,n),n};const kp=class vS extends tt{static useSelectiveBloom=!1;get typeName(){return"Bloom"}threshold=new F(.9);intensity=new F(1);scatter=new F(.7);selectiveBloom;init(){this.threshold.valueProcessor=e=>e,this.intensity.valueProcessor=e=>e,this.scatter.valueProcessor=e=>e}onCreateEffect(){let e;if(this.selectiveBloom==null&&(this.selectiveBloom=vS.useSelectiveBloom),this.selectiveBloom){const t=e=new E.POSTPROCESSING.MODULE.SelectiveBloomEffect(this.context.scene,this.context.mainCamera,{blendFunction:E.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});t.inverted=!0}else e=new E.POSTPROCESSING.MODULE.BloomEffect({blendFunction:E.POSTPROCESSING.MODULE.BlendFunction.ADD,mipmapBlur:!0,luminanceThreshold:this.threshold.value,luminanceSmoothing:this.scatter.value,radius:.85,intensity:this.intensity.value});return this.intensity.onValueChanged=t=>{e.intensity=t},this.threshold.onValueChanged=t=>{e.luminanceMaterial.threshold=Math.pow(t,2.2)},this.scatter.onValueChanged=t=>{e.luminancePass.enabled=!0,e.luminanceMaterial.smoothing=t,e.mipmapBlurPass&&(e.mipmapBlurPass.radius=wo.lerp(.1,.9,t))},e}};d0([u(F)],kp.prototype,"threshold"),d0([u(F)],kp.prototype,"intensity"),d0([u(F)],kp.prototype,"scatter");let Mp=kp;rn("Bloom",Mp);var XA=Object.defineProperty,QA=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&XA(e,t,n),n};class xh extends tt{get typeName(){return"ChromaticAberration"}intensity=new F(0);onCreateEffect(){const e=new E.POSTPROCESSING.MODULE.ChromaticAberrationEffect;return e.offset=new ee(0,0),e.radialModulation=!0,e.modulationOffset=.15,this.intensity.valueProcessor=t=>t*.02,this.intensity.onValueChanged=t=>{e.offset.x=-t,e.offset.y=t},e}}QA([u(F)],xh.prototype,"intensity"),rn("ChromaticAberration",xh);var Sh=(o=>(o[o.None=0]="None",o[o.Neutral=1]="Neutral",o[o.ACES=2]="ACES",o[o.AgX=3]="AgX",o[o.KhronosNeutral=4]="KhronosNeutral",o))(Sh||{});const f1=new Map;function u0(o){switch(o){case 0:return Cm;case 1:return Sm;case 2:return xd;case 3:return wd;case 4:return Ma;default:return f1.has(o)||(f1.set(o,!0),console.warn("[Postprocessing] Unknown tone mapping mode",o)),Ma}}function YA(o){switch(o){case Cm:return 0;case xd:return 2;case wd:return 3;case Ma:return 1;case Sm:return 1;default:return 0}}function Rp(o){switch(o){case Cm:return E.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;case xd:return E.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;case wd:return E.POSTPROCESSING.MODULE.ToneMappingMode.AGX;case Ma:return E.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;case Sm:return E.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;default:return E.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR}}var ZA=Object.defineProperty,y1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&ZA(e,t,n),n};const p0=v("debugpost");class Gs extends tt{get typeName(){return"ToneMapping"}mode=new F(void 0);exposure=new F(1);setMode(e){const t=Sh[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=m1(this);e&&super.onEffectEnabled(e)}_tonemappingEffect=null;onCreateEffect(){if(this.mode.isInitialized==!1){const i=YA(this.context.renderer.toneMapping);p0&&console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping",this.context.renderer.toneMapping+" \u2192 "+i),this.mode.initialize(i)}this._tonemappingEffect?.dispose();const e=u0(this.mode.value),t=this._tonemappingEffect=new E.POSTPROCESSING.MODULE.ToneMappingEffect({mode:Rp(e)});return this.mode.onValueChanged=i=>{if(typeof i=="string")i=aw(i),t.mode=Rp(i);else{const n=u0(i);t.mode=Rp(n)}t.name="ToneMapping ("+Sh[i]+")",p0&&console.log("[PostProcessing] ToneMapping mode changed to",Sh[i],e,t.mode)},p0&&console.log("[PostProcessing] Use ToneMapping",Sh[this.mode.value],e,t.mode,"renderer.tonemapping: "+this.context.renderer.toneMapping),t}onBeforeRender(){if(this._tonemappingEffect&&this.postprocessingContext?.handler.getEffectIsActive(this._tonemappingEffect)&&(this.mode.overrideState&&(this.context.renderer.toneMapping=u0(this.mode.value)),this.exposure.overrideState&&this.exposure.value!==void 0)){const e=Math.max(0,this.exposure.value);this.context.renderer.toneMappingExposure=e}}}y1([u(F)],Gs.prototype,"mode"),y1([u(F)],Gs.prototype,"exposure"),rn("Tonemapping",Gs);var KA=Object.defineProperty,Tp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&KA(e,t,n),n};class qs extends tt{get typeName(){return"ColorAdjustments"}remap=!0;postExposure=new F(1);contrast=new F(0);hueShift=new F(0);saturation=new F(0);init(){this.postExposure.valueProcessor=e=>(this.remap&&(e=Math.pow(2,e)),e),this.contrast.valueProcessor=e=>{if(!this.remap)return e;let t=1;return e>0?t=200:e<0&&(t=100),e/t},this.contrast.defaultValue=0,this.hueShift.valueProcessor=e=>this.remap?Math.PI*e/180:e,this.hueShift.defaultValue=0,this.saturation.valueProcessor=e=>this.remap?e<0?e/100:e/(100*Math.PI):e,this.saturation.defaultValue=0}onCreateEffect(){const e=[];let t=this.postprocessingContext?.components.find(s=>s instanceof Gs);t||(t=new Gs,this.postprocessingContext?.components.push(t)),this.postExposure.onValueChanged=s=>{this.postExposure.overrideState&&t?t.exposure.value=s:console.warn("[PostProcessing] PostExposure is set to override but no ToneMappingEffect found in the postprocessing stack. Please add a ToneMappingEffect to your postprocessing stack to use PostExposure.")};const i=new E.POSTPROCESSING.MODULE.BrightnessContrastEffect;this.contrast.onValueChanged=s=>i.contrast=s;const n=new E.POSTPROCESSING.MODULE.HueSaturationEffect;return this.hueShift.onValueChanged=s=>n.hue=s,this.saturation.onValueChanged=s=>n.saturation=s,e.push(i),e.push(n),e}}Tp([u(F)],qs.prototype,"postExposure"),Tp([u(F)],qs.prototype,"contrast"),Tp([u(F)],qs.prototype,"hueShift"),Tp([u(F)],qs.prototype,"saturation"),rn("ColorAdjustments",qs);var JA=Object.defineProperty,oa=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&JA(e,t,n),n};const e2=v("debugpost");class An extends tt{get typeName(){return"DepthOfField"}mode;focusDistance=new F(1);focalLength=new F(.2);aperture=new F(20);gaussianMaxRadius=new F;resolutionScale=new F(1/window.devicePixelRatio);bokehScale=new F;init(){this.focalLength.valueProcessor=t=>{const i=t/300;return L.lerp(2,.01,i)};const e=20;this.aperture.valueProcessor=t=>{const i=1-t/32;return L.lerp(1,e,i)}}onCreateEffect(){if(this.mode===0){e2&&console.warn("DepthOfField: Mode is set to Off");return}const e=new E.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(){}}oa([u()],An.prototype,"mode"),oa([u(F)],An.prototype,"focusDistance"),oa([u(F)],An.prototype,"focalLength"),oa([u(F)],An.prototype,"aperture"),oa([u(F)],An.prototype,"gaussianMaxRadius"),oa([u(F)],An.prototype,"resolutionScale"),oa([u(F)],An.prototype,"bokehScale"),rn("DepthOfField",An);class Ch extends tt{effect;constructor(e){super(),this.effect=e}get typeName(){return this.effect.constructor.name}onCreateEffect(){return this.effect}}var t2=Object.defineProperty,i2=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&t2(e,t,n),n};class Ph extends tt{get typeName(){return"PixelationEffect"}granularity=new F(10);onCreateEffect(){const e=new E.POSTPROCESSING.MODULE.PixelationEffect;return this.granularity.onValueChanged=t=>{e.granularity=t},e}}i2([u(F)],Ph.prototype,"granularity"),rn("PixelationEffect",Ph);var n2=Object.defineProperty,Oh=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&n2(e,t,n),n};class Qo extends tt{get typeName(){return"ScreenSpaceAmbientOcclusion"}intensity=new F(2);falloff=new F(1);samples=new F(9);color=new F(new ne(0,0,0));luminanceInfluence=new F(.7);onBeforeRender(){if(this._ssao&&this.context.mainCamera instanceof re){const e=this.context.mainCamera.far-this.context.mainCamera.near;this._ssao.ssaoMaterial.worldDistanceFalloff=e*.01,this._ssao.ssaoMaterial.worldDistanceThreshold=this.context.mainCamera.far}}_ssao;onCreateEffect(){const e=this.context.mainCamera,t=new E.POSTPROCESSING.MODULE.NormalPass(this.context.scene,e),i=new E.POSTPROCESSING.MODULE.DepthDownsamplingPass({normalBuffer:t.texture,resolutionScale:.5}),n=this._ssao=new E.POSTPROCESSING.MODULE.SSAOEffect(e,t.texture,{normalDepthBuffer:i.texture,worldDistanceThreshold:1,worldDistanceFalloff:1,worldProximityThreshold:.1,worldProximityFalloff:2,intensity:1,blendFunction:E.POSTPROCESSING.MODULE.BlendFunction.MULTIPLY,luminanceInfluence:.5});this.intensity.onValueChanged=r=>{n.intensity=r},this.falloff.onValueChanged=r=>{n.ssaoMaterial.radius=r*.1},this.samples.onValueChanged=r=>{n.ssaoMaterial.samples=r},this.color.onValueChanged=r=>{n.color||(n.color=new ne),n.color.copy(r)},this.luminanceInfluence.onValueChanged=r=>{n.luminanceInfluence=r};const s=new Array;return s.push(t),s.push(i),s.push(n),s}}Oh([u(F)],Qo.prototype,"intensity"),Oh([u(F)],Qo.prototype,"falloff"),Oh([u(F)],Qo.prototype,"samples"),Oh([u(F)],Qo.prototype,"color"),Oh([u(F)],Qo.prototype,"luminanceInfluence"),rn("ScreenSpaceAmbientOcclusion",Qo);var o2=Object.defineProperty,sa=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&o2(e,t,n),n};const s2=v("debugN8AO");var m0=(o=>(o[o.Performance=0]="Performance",o[o.Low=1]="Low",o[o.Medium=2]="Medium",o[o.High=3]="High",o[o.Ultra=4]="Ultra",o))(m0||{});class In extends tt{get typeName(){return"ScreenSpaceAmbientOcclusionN8"}get pass(){return this._ssao}gammaCorrection=!0;aoRadius=new F(1);falloff=new F(1);intensity=new F(1);color=new F(new ne(0,0,0));screenspaceRadius=!1;quality=2;_ssao;onValidate(){this._ssao&&(this._ssao.setQualityMode(m0[this.quality]),this._ssao.configuration.gammaCorrection=this.gammaCorrection,this._ssao.configuration.screenSpaceRadius=this.screenspaceRadius)}onCreateEffect(){const e=this.context.mainCamera,t=this.context.domWidth,i=this.context.domHeight,n=this._ssao=new E.POSTPROCESSING_AO.MODULE.N8AOPostPass(this.context.scene,e,t,i);n.name="SSAO_N8";const s=m0[this.quality];n.setQualityMode(s),n.configuration.transparencyAware=!1;const r=new Vn(t,i);return n.configuration.beautyRenderTarget=r,n.configuration.autoRenderBeauty=!1,n.configuration.gammaCorrection=this.gammaCorrection,n.configuration.screenSpaceRadius=this.screenspaceRadius,s2&&(n.enableDebugMode(),console.log(n),setInterval(()=>{console.log("SSAO",n.lastTime)},1e3),setInterval(()=>{console.log("SSAO",n.enabled,{ssao:n,autoRenderBeauty:n.configuration.autoRenderBeauty})},4e3)),this.intensity.onValueChanged=a=>{n.configuration.intensity=a},this.falloff.onValueChanged=a=>{n.configuration.distanceFalloff=a},this.aoRadius.onValueChanged=a=>{n.configuration.aoRadius=a},this.color.onValueChanged=a=>{n.color||(n.color=new ne),n.configuration.color.copy(a)},n}}sa([Ot(),u()],In.prototype,"gammaCorrection"),sa([u(F)],In.prototype,"aoRadius"),sa([u(F)],In.prototype,"falloff"),sa([u(F)],In.prototype,"intensity"),sa([u(F)],In.prototype,"color"),sa([Ot(),u()],In.prototype,"screenspaceRadius"),sa([Ot(),u()],In.prototype,"quality"),rn("ScreenSpaceAmbientOcclusionN8",In);var r2=Object.defineProperty,a2=Object.getOwnPropertyDescriptor,b1=(o,e,t,i)=>{for(var n=a2(e,t),s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&r2(e,t,n),n};class kh extends tt{get typeName(){return"Sharpening"}order=ht.Sharpening;_effect;onCreateEffect(){return this._effect??=new(l2()),this.effect}get effect(){return this._effect}set amount(e){this._amount=e,this._effect&&(this._effect.uniforms.get("amount").value=e)}get amount(){return this._effect?this._effect.uniforms.get("amount").value:this._amount}_amount=1;set radius(e){this._radius=e,this._effect&&(this._effect.uniforms.get("radius").value=e)}get radius(){return this._effect?this._effect.uniforms.get("radius").value:this._radius}_radius=1}b1([u()],kh.prototype,"amount"),b1([u()],kh.prototype,"radius");function l2(){const o=`
1306
- void mainSupport() {
1307
- vUv = uv;
1308
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
1309
- }
1310
- `,e=`
1311
- uniform sampler2D tDiffuse;
1312
- uniform float amount;
1313
- uniform float radius;
1314
-
1315
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
1316
- float tx = 1.0 / resolution.x;
1317
- float ty = 1.0 / resolution.y;
1318
- vec2 texelSize = vec2(tx, ty);
1319
-
1320
- vec4 blurred = vec4(0.0);
1321
- float total = 0.0;
1322
-
1323
- for (float x = -radius; x <= radius; x++) {
1324
- for (float y = -radius; y <= radius; y++) {
1325
- vec2 offset = vec2(x, y) * texelSize;
1326
- vec4 diffuse = texture2D(tDiffuse, uv + offset);
1327
- float weight = exp(-length(offset) * amount);
1328
- blurred += diffuse * weight;
1329
- total += weight;
1330
- }
1331
- }
1332
-
1333
- if (total > 0.0) {
1334
- blurred /= total;
1335
- }
1336
-
1337
- // Calculate the sharpened color using inputColor
1338
- vec4 sharp = inputColor + clamp(inputColor - blurred, 0.0, 1.0) * amount;
1339
- // Keep original alpha
1340
- sharp.a = inputColor.a;
1341
-
1342
- // Ensure the sharp color does not go below 0 or above 1
1343
- // This means: sharpening must happen AFTER tonemapping.
1344
- sharp = clamp(sharp, 0.0, 1.0);
1345
-
1346
- outputColor = sharp;
1347
- }
1348
-
1349
- `;class t extends E.POSTPROCESSING.MODULE.Effect{constructor(){super("Sharpening",e,{vertexShader:o,blendFunction:E.POSTPROCESSING.MODULE.BlendFunction.NORMAL,uniforms:new Map([["amount",new Wi(1)],["radius",new Wi(1)]]),attributes:_P.CONVOLUTION})}}return t}var c2=Object.defineProperty,Tl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&c2(e,t,n),n};class co extends tt{get typeName(){return"TiltShiftEffect"}offset=new F(0);rotation=new F(0);focusArea=new F(.4);feather=new F(.3);kernelSize=new F(2);resolutionScale=new F(1/window.devicePixelRatio);init(){this.offset.defaultValue=0,this.rotation.defaultValue=0,this.focusArea.defaultValue=.4,this.feather.defaultValue=.3,this.kernelSize.defaultValue=E.POSTPROCESSING.MODULE.KernelSize.MEDIUM,this.resolutionScale.defaultValue=1/window.devicePixelRatio}onCreateEffect(){const e=new E.POSTPROCESSING.MODULE.TiltShiftEffect({kernelSize:E.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}}Tl([u(F)],co.prototype,"offset"),Tl([u(F)],co.prototype,"rotation"),Tl([u(F)],co.prototype,"focusArea"),Tl([u(F)],co.prototype,"feather"),Tl([u(F)],co.prototype,"kernelSize"),Tl([u(F)],co.prototype,"resolutionScale"),rn("TiltShiftEffect",co);var h2=Object.defineProperty,g0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&h2(e,t,n),n};class ra extends tt{get typeName(){return"Vignette"}color=new F({r:0,g:0,b:0,a:1});intensity=new F(0);center=new F({x:.5,y:.5});init(){this.color.defaultValue={r:0,g:0,b:0,a:1},this.intensity.defaultValue=0,this.center.defaultValue={x:.5,y:.5}}onCreateEffect(){const e=new E.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}}g0([u(F)],ra.prototype,"color"),g0([u(F)],ra.prototype,"intensity"),g0([u(F)],ra.prototype,"center"),rn("Vignette",ra),globalThis.NEEDLE_USE_POSTPROCESSING=globalThis.NEEDLE_USE_POSTPROCESSING!==void 0?globalThis.NEEDLE_USE_POSTPROCESSING:!0;const Yo=v("debugpost"),f0=Symbol("needle:postprocessing-handler"),Mh=Symbol("needle:previous-autoclear-state"),Rh=Symbol("needle:previous-tone-mapping");class y0{_composer=null;_lastVolumeComponents;_effects=[];getEffectIsActive(e){return e?this._isActive&&this._effects.some(t=>t.effect===e):!1}get isActive(){return this._isActive}get composer(){return this._composer}_isActive=!1;context;constructor(e){this.context=e}apply(e){return this._isActive=!0,this.onApply(this.context,e)}unapply(e=!0){if(Yo&&console.log("Unapplying postprocessing effects"),this._isActive=!1,this._lastVolumeComponents){for(const i of this._lastVolumeComponents)i.unapply();this._lastVolumeComponents.length=0}const t=this.context;t[f0]===this&&(delete t[f0],typeof t.renderer[Mh]=="boolean"&&(t.renderer.autoClear=t.renderer[Mh]),typeof t.renderer[Rh]=="number"&&(t.renderer.toneMapping=t.renderer[Rh])),this._composer?.removeAllPasses(),e&&this._composer?.dispose(),t.composer===this._composer&&(t.composer=null),this.handleDevicePixelRatio()}dispose(){this.unapply(!0);for(const e of this._effects)e.effect.dispose();this._effects.length=0,this._composer=null}async onApply(e,t){if(!t)return;await Promise.all([E.POSTPROCESSING.load(),E.POSTPROCESSING_AO.load()]),e[f0]=this,Yo&&console.log("Apply Postprocessing Effects",t),this._lastVolumeComponents=[...t],this._effects.length=0;const i={handler:this,components:this._lastVolumeComponents};for(let n=0;n<this._lastVolumeComponents.length;n++){const s=this._lastVolumeComponents[n];if(s.context=e,s.apply){if(s.active){let r=function(c,h){return h?(h instanceof E.POSTPROCESSING.MODULE.Effect||h instanceof E.POSTPROCESSING.MODULE.Pass||console.warn(`PostprocessingEffect ${c} created neither Effect nor Pass - this might be caused by a bundler error or false import. Below you find some possible solutions:
1350
- - If you create custom effect try creating it like this: 'new NEEDLE_ENGINE_MODULES.POSTPROCESSING.MODULE.Effect(...)' instead of 'new Effect(...)'`),!0):!1};if(!e.mainCameraComponent){console.error("No camera in scene found or available yet - can not create postprocessing effects");return}const a=s.apply(i);if(!a)continue;const l=s.typeName||s.constructor.name;if(Array.isArray(a))for(const c of a)r(l,c)&&this._effects.push({effect:c,typeName:s.typeName,priority:s.order});else{if(!r(l,a))continue;this._effects.push({effect:a,typeName:s.typeName,priority:s.order})}}}else s.active&&ye("Volume component is not a VolumeComponent: "+s.__type)}this.applyEffects(e)}_anyPassHasDepth=!1;_anyPassHasNormal=!1;_hasSmaaEffect=!1;get anyPassHasDepth(){return this._anyPassHasDepth}get anyPassHasNormal(){return this._anyPassHasNormal}get hasSmaaEffect(){return this._hasSmaaEffect}_customInputBuffer=null;_customInputBufferId=0;_multisampling=0;set multisampling(e){this._multisampling=e}get multisampling(){return this._multisampling}applyEffects(e){if(this._anyPassHasDepth=!1,this._anyPassHasNormal=!1,this._hasSmaaEffect=!1,this._effects.length<=0)return;const t=e.mainCameraComponent,i=e.renderer,n=e.scene,s=t.threeCamera;if(typeof i[Mh]=="boolean"&&(i.autoClear=i[Mh]),i[Mh]=i.autoClear,typeof i[Rh]=="number"&&(i.toneMapping=i[Rh]),i[Rh]=i.toneMapping,i.toneMapping!=Sd&&!this._effects.find(h=>h instanceof E.POSTPROCESSING.MODULE.ToneMappingEffect)){const h=new E.POSTPROCESSING.MODULE.ToneMappingEffect;h.name=`ToneMapping (${i.toneMapping})`,h.mode=Rp(i.toneMapping),this._effects.push({typeName:"ToneMapping",effect:h,priority:ht.ToneMapping})}this._composer||(this._composer=new E.POSTPROCESSING.MODULE.EffectComposer(i,{frameBufferType:Pm,stencilBuffer:!0})),e.composer&&e.composer!==this._composer&&console.warn("There's already an active EffectComposer in your scene: replacing it with a new one. This might cause unexpected behaviour. Make sure to only use one PostprocessingManager/Volume in your scene."),e.composer=this._composer;const r=e.composer;r.setMainCamera(s),r.setRenderer(i),r.setMainScene(n),r.autoRenderToScreen=!0,r.multisampling=0;for(const h of r.passes)h.dispose();r.removeAllPasses();const a=new E.POSTPROCESSING.MODULE.RenderPass(n,s);a.name="RenderPass",a.mainScene=n,r.addPass(a);const l=a.render;this._customInputBuffer?.dispose(),this._customInputBuffer=null,a.render=(h,d,p,m,f)=>{d&&(d.samples=0,p&&(p.samples=0),(!this._customInputBuffer||this._customInputBuffer.width!==d.width||this._customInputBuffer.height!==d.height||this._customInputBuffer.samples!==this._multisampling||this._customInputBuffer.texture.format!==d.texture.format||this._customInputBuffer.texture.type!==Pm)&&(this._customInputBuffer?.dispose(),this._customInputBuffer=new Vn(d.width,d.height,{format:d.texture.format,type:Pm,depthBuffer:d.depthBuffer,depthTexture:d.depthTexture?new ob(d.width,d.height):void 0,stencilBuffer:d.stencilBuffer,samples:Math.max(0,this._multisampling),minFilter:d.texture.minFilter??Od,magFilter:d.texture.magFilter??Od,generateMipmaps:d.texture.generateMipmaps}),this._customInputBufferId++,this._customInputBuffer.texture.name=`CustomInputBuffer-${this._customInputBufferId}`,this._customInputBuffer.depthTexture&&d.depthTexture&&(this._customInputBuffer.depthTexture.format=d.depthTexture.format,this._customInputBuffer.depthTexture.type=d.depthTexture.type),this._customInputBuffer.samples>0&&(this._customInputBuffer.ignoreDepthForMultisampleCopy=!1),Yo&&console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`)),l.call(a,h,this._customInputBuffer,p,m,f),sr.blit(this._customInputBuffer.texture,d,{renderer:h,depthTexture:this._customInputBuffer.depthTexture,depthWrite:!0,depthTest:!0}))};try{IA(this._effects);let h=!1,d=null;for(let f=this._effects.length-1;f>=0;f--){const g=this._effects[f].effect;if(g instanceof E.POSTPROCESSING.MODULE.ToneMappingEffect){if(h){Yo&&console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${g.name} and ${d?.name}. Only the last one added will be used.`),this._effects.splice(f,1);continue}d=g,h=!0}}const p=[];let m=!1;for(let f=0;f<this._effects.length;f++){const g=this._effects[f].effect;if(g instanceof E.POSTPROCESSING.MODULE.SMAAEffect?this._hasSmaaEffect=!0:g instanceof E.POSTPROCESSING.MODULE.NormalPass&&(this._anyPassHasNormal=!0),!(g instanceof E.POSTPROCESSING.MODULE.ToneMappingEffect&&d!==g))if(g instanceof E.POSTPROCESSING.MODULE.Effect){const y=g.getAttributes(),_=E.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;y&_&&(Yo&&console.log("[PostProcessing] Convolution effect: "+g.name),m&&(Yo&&console.log("[PostProcessing] \u2192 Merging effects ["+p.map(w=>w.name).join(", ")+"]"),this.createPassForMergeableEffects(p,r,s,n)),m=!0),p.push(g)}else g instanceof E.POSTPROCESSING.MODULE.Pass?(m=!1,this.createPassForMergeableEffects(p,r,s,n),g.renderToScreen=!1,r.addPass(g)):(m=!1,this.createPassForMergeableEffects(p,r,s,n),r.addPass(g))}this.createPassForMergeableEffects(p,r,s,n)}catch(h){console.error("Error while applying postprocessing effects",h),r.passes.forEach(d=>d.dispose()),r.removeAllPasses()}let c=!1;for(let h=r.passes.length-1;h>=0;h--){const d=r.passes[h];let p=!1,m=!1;d.enabled&&(c||(p=!0,m=!0),c=!0),d.renderToScreen=m,d?.configuration!==void 0?d.configuration.gammaCorrection=p:"autosetGamma"in d&&(d.autosetGamma=p),this._anyPassHasDepth||=d.needsDepthTexture}this.handleDevicePixelRatio(),Yo&&console.log("[PostProcessing] Passes \u2192",[...r.passes],`
1351
- ---------------------------------
1352
- \u2022 `+r.passes.map(h=>h.name||h.constructor.name+"*").join(`
1353
- \u2022 `)+`
1354
- `),Yo&&this._onCreateEffectsDebug(this._composer,s)}createPassForMergeableEffects(e,t,i,n){if(e.length>0){const s=new E.POSTPROCESSING.MODULE.EffectPass(i,...e);s.name=e.map(r=>r.name).join(", "),s.mainScene=n,s.enabled=!0,s.renderToScreen=!1,t.addPass(s),e.length=0}}handleDevicePixelRatio(){typeof this.context.devicePixelRatio=="number"&&this.context.requestSizeUpdate()}_menuEntry=null;_passIndices=null;_onCreateEffectsDebug(e,t){if(Yo==="passes"){const i=new E.POSTPROCESSING.MODULE.DepthEffect({blendFunction:E.POSTPROCESSING.MODULE.BlendFunction.NORMAL,inverted:!0});i.name="Depth Effect";const n=new E.POSTPROCESSING.MODULE.EffectPass(t,i);if(n.name="Depth Effect Pass",n.enabled=!1,e.passes.push(n),this._passIndices!==null){const r=[e.passes[0]];this._passIndices.length>0&&r.push(...this._passIndices.filter(a=>a!==0).map(a=>e.passes[a]).filter(a=>a)),r.length>0&&console.log("[PostProcessing] Passes (selected) \u2192",r),e.passes.length=0;for(const a of r)a.enabled=!0,a.renderToScreen=!1,e.addPass(a)}const s=this.context.menu;if(s&&this._passIndices===null){this._menuEntry&&this._menuEntry.remove();const r=document.createElement("select");r.multiple=!0;const a=document.createElement("option");a.innerText="Final Output",a.value="-1",r.appendChild(a);for(const l of e.passes){const c=document.createElement("option");c.innerText=l.name,c.value=`${e.passes.indexOf(l)}`,c.title=l.name,r.appendChild(c)}s.appendChild(r),this._menuEntry=r,r.addEventListener("change",()=>{const l=Array.from(r.selectedOptions).map(c=>parseInt(c.value));l.length===1&&l[0]===-1?this._passIndices=null:this._passIndices=l,this.applyEffects(this.context)})}}}}var d2=Object.defineProperty,_1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&d2(e,t,n),n};const aa=v("debugpost");class El extends R{get isPostProcessingManager(){return!0}get effects(){return this._activeEffects}get dirty(){return this._isDirty}set dirty(e){this._isDirty=e}sharedProfile;multisampling="auto";addEffect(e){let t=e;return t instanceof tt||(t=new Ch(t),typeof e.order=="number"&&(t.order=e.order)),t.gameObject===void 0&&this.gameObject.addComponent(t),this._effects.includes(t)||(this._effects.push(t),this._isDirty=!0),e}removeEffect(e){let t=-1;if(e instanceof tt?t=this._effects.indexOf(e):t=this._effects.findIndex(i=>i instanceof Ch&&i.effect===e),t!==-1)return this._effects.splice(t,1),this._isDirty=!0,e;if(e instanceof tt){const i=this.sharedProfile?.components?.indexOf(e);i!==void 0&&i!==-1&&(this._isDirty=!0,this.sharedProfile?.components?.splice(i,1))}return e}_postprocessing;_activeEffects=[];_effects=[];markDirty(){this._isDirty=!0}awake(){aa&&(console.log("PostprocessingManager Awake",this),console.log("Press P to toggle post processing"),window.addEventListener("keydown",e=>{e.key==="p"&&(this.enabled=!this.enabled,Te("Toggle PostProcessing "+this.name+": Enabled="+this.enabled),this.markDirty())})),this.sharedProfile?.__init(this)}_componentEnabledTime=-1;_multisampleAutoChangeTime=0;_multisampleAutoDecreaseTime=0;onEnable(){this._componentEnabledTime=this.context.time.realtimeSinceStartup,this._isDirty=!0}onDisable(){this._postprocessing?.unapply(),this._isDirty=!1}onBeforeRender(){if(!this.context.isInXR&&(this.context.mainCamera&&this._isDirty&&this.apply(),this.context.composer&&this._postprocessing&&this._postprocessing.composer===this.context.composer)){if(this.context.renderer.getContext().isContextLost()&&this.context.renderer.forceContextRestore(),this.context.composer.getRenderer()!==this.context.renderer&&this.context.composer.setRenderer(this.context.renderer),this.context.composer.setMainScene(this.context.scene),this.multisampling==="auto")if(this._postprocessing&&this._postprocessing.hasSmaaEffect)this._postprocessing.multisampling!==0&&(this._postprocessing.multisampling=0,(aa||A())&&console.log(`[PostProcessing] multisampling is disabled because it's set to 'auto' on your PostprocessingManager/Volume component that also has an SMAA effect.
1355
-
1356
- If you need multisampling consider changing 'auto' to a fixed value (e.g. 4).`));else{const e=this.context.time.realtimeSinceStartup-this._multisampleAutoChangeTime;if(this.context.time.realtimeSinceStartup-this._componentEnabledTime>2&&e>.5){const t=this._postprocessing.multisampling;if(this._postprocessing.multisampling>0&&this.context.time.smoothedFps<=50){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup,this._multisampleAutoDecreaseTime=this.context.time.realtimeSinceStartup;let i=this._postprocessing.multisampling*.5;i=Math.floor(i),i!=this._postprocessing.multisampling&&(this._postprocessing.multisampling=i),aa&&console.debug(`[PostProcessing] Reduced multisampling from ${t} to ${this._postprocessing.multisampling}`)}else if(e>1&&this.context.time.smoothedFps>=59&&this._postprocessing.multisampling<this.context.renderer.capabilities.maxSamples&&this.context.time.realtimeSinceStartup-this._multisampleAutoDecreaseTime>10){this._multisampleAutoChangeTime=this.context.time.realtimeSinceStartup;let i=this._postprocessing.multisampling<=0?1:this._postprocessing.multisampling*2;i=Math.floor(i),i!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=i),aa&&console.debug(`[PostProcessing] Increased multisampling from ${t} to ${this._postprocessing.multisampling}`)}}}else{const e=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples));e!==this._postprocessing.multisampling&&(this._postprocessing.multisampling=e)}if(this.context.mainCamera){const e=this.context.composer.passes;for(const t of e)if(t.mainCamera&&t.mainCamera!==this.context.mainCamera){this.context.composer.setMainCamera(this.context.mainCamera);break}}}}onDestroy(){this._postprocessing?.dispose()}_lastApplyTime;_rapidApplyCount=0;_isDirty=!1;apply(){if(aa&&console.log(`Apply PostProcessing "${this.name||"unnamed"}"`),A()&&(this._lastApplyTime!==void 0&&Date.now()-this._lastApplyTime<100&&(this._rapidApplyCount++,this._rapidApplyCount===5&&console.warn("Detected rapid post processing modifications - this might be a bug",this)),this._lastApplyTime=Date.now()),this._isDirty=!1,this._activeEffects.length=0,this.sharedProfile?.components){const e=this.sharedProfile.components;for(const t of e)t.active&&t.enabled&&!this._activeEffects.includes(t)&&this._activeEffects.push(t)}for(const e of this._effects)e.active&&e.enabled&&!this._activeEffects.includes(e)&&this._activeEffects.push(e);this._activeEffects.length>0?(this._postprocessing||(this._postprocessing=new y0(this.context)),this._postprocessing.apply(this._activeEffects)?.then(()=>{this.activeAndEnabled&&(this._applyPostQueue(),this._postprocessing?(this.multisampling==="auto"?this._postprocessing.multisampling=q.isMobileDevice()?2:4:this._postprocessing.multisampling=Math.max(0,Math.min(this.multisampling,this.context.renderer.capabilities.maxSamples)),aa&&console.debug(`[PostProcessing] Set multisampling to ${this._postprocessing.multisampling} (Is Mobile: ${q.isMobileDevice()})`)):aa&&console.warn("[PostProcessing] No composer found"))})):this._postprocessing?.unapply(!1)}_applyPostQueue(){if(this._modificationQueue){for(const e of this._modificationQueue.values())this.onEditorModification(e);this._modificationQueue.clear()}}onEditorModification(e){if(e.propertyName.startsWith("postprocessing.")){if(!this._postprocessing)return this._modificationQueue||(this._modificationQueue=new Map),this._modificationQueue.set(e.propertyName,e),!0;if(!this._activeEffects?.length)return;const t=e.propertyName.split(".");if(t.length===3||t.length===4){const i=t[1],n=t[2];for(const s of this._activeEffects)if(s.typeName?.toLowerCase()===i.toLowerCase()){if(n==="active"){s.active=e.value,this.scheduleRecreate();return}if(!Ep.has(i)){const r=new Array;Ep.set(i,r);const a=Object.keys(s);for(const l of a)s[l]instanceof F&&r.push(l)}if(Ep.has(i)){const r=n.toLowerCase(),a=Ep.get(i);for(const l of a)if(l.toLowerCase()===r){const c=s[l];c instanceof F&&(t.length===4&&t[3]==="active"?(c.overrideState=e.value,this.scheduleRecreate()):c&&c.value!==void 0&&(c.value=e.value));return}}console.warn("Unknown modification",n);return}}return!0}return!1}_modificationQueue;_recreateId=-1;scheduleRecreate(){const e=++this._recreateId;setTimeout(()=>{e===this._recreateId&&(this.onDisable(),this.onEnable())},200)}}_1([qe(Op)],El.prototype,"sharedProfile"),_1([qe()],El.prototype,"multisampling");const Ep=new Map;EA(El);async function b0(o){const{NeedleEngineWebComponent:e}=await Promise.resolve().then(()=>oL);e.observedAttributes.includes(o)||e.observedAttributes.push(o)}var u2=Object.defineProperty,wt=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&u2(e,t,n),n};const Ht=v("debugsceneswitcher"),p2=v("sceneswitcher:clearscene"),Ap="scene";b0(Ap);const Xs=Promise.resolve(!1);class Qe extends R{autoLoadFirstScene=!0;scenes=[];loadingScene;queryParameterName="scene";useSceneName=!0;clamp=!0;useHistory=!0;useKeyboard=!0;useSwipe=!0;useSceneLighting=!0;useSceneBackground=!0;preloadNext=1;preloadPrevious=1;preloadConcurrent=2;createMenuButtons=!1;get currentIndex(){return this._currentIndex}get currentLoadingProgress(){return this._currentLoadingProgress}get currentlyLoadingScene(){return this._currentlyLoadingScene}get currentlyLoadedScene(){return this._currentScene}sceneLoadingStart=new he;sceneLoadingProgress=new he;sceneLoaded=new he;_currentIndex=-1;_currentScene=void 0;_engineElementOverserver=void 0;_preloadScheduler;_menuButtons;awake(){this.scenes===void 0&&(this.scenes=[]);for(const e of this.scenes)e&&!e.hasUrl&&e.asset instanceof k?x.remove(e.asset):e instanceof k&&x.remove(e);Ht&&console.log("SceneSwitcher",this)}async onEnable(){if(globalThis.addEventListener("popstate",this.onPopState),this.context.input.addEventListener(Ee.KeyDown,this.onInputKeyDown),this.context.input.addEventListener(Ee.PointerMove,this.onInputPointerMove),this.context.input.addEventListener(Ee.PointerUp,this.onInputPointerUp),this._engineElementOverserver||(this._engineElementOverserver=new MutationObserver(e=>{for(const t of e)if(t.type==="attributes"&&t.attributeName===Ap){const i=this.context.domElement.getAttribute(Ap);i!==null&&this.trySelectSceneFromValue(i)}})),this._engineElementOverserver.observe(this.context.domElement,{attributes:!0}),this._preloadScheduler||(this._preloadScheduler=new m2(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(Ap);try{(e===null||!await this.trySelectSceneFromValue(e))&&this._currentIndex===-1&&this.select(0)}finally{}}this.createMenuButtons&&(this._menuButtons??=[],this._menuButtons.push(this.context.menu.appendChild({label:"Previous",icon:"arrow_back_ios",onClick:()=>this.selectPrev(),priority:-1005,class:"row2"})),this._menuButtons.push(this.context.menu.appendChild({label:"Next",icon:"arrow_forward_ios",iconSide:"right",onClick:()=>this.selectNext(),priority:-1e3,class:"row2"})))}onDisable(){if(globalThis.removeEventListener("popstate",this.onPopState),this.context.input.removeEventListener(Ee.KeyDown,this.onInputKeyDown),this.context.input.removeEventListener(Ee.PointerMove,this.onInputPointerMove),this.context.input.removeEventListener(Ee.PointerUp,this.onInputPointerUp),this._preloadScheduler?.stop(),this._menuButtons){for(const e of this._menuButtons)e.remove();this._menuButtons=void 0}}onPopState=async e=>{if(!this.useHistory)return;const t=this.useHistory;try{this.useHistory=!1;let i=!1;if(this.queryParameterName&&(i=await this.tryLoadFromQueryParam()),!i){const n=e?.state;if(n&&n.startsWith(this.guid)){const s=n.substr(this.guid.length+2);Ht&&console.log("PopState",s),await this.trySelectSceneFromValue(s)}}}finally{this.useHistory=t}};normalizedSwipeThresholdX=.1;_didSwipe=!1;onInputPointerMove=e=>{if(this.useSwipe&&!this._didSwipe&&e.button===0&&e.pointerType==="touch"&&this.context.input.getPointerPressedCount()===1){const t=this.context.input.getPointerPositionDelta(e.button);if(t){const i=t.x/this.context.domWidth;i>=this.normalizedSwipeThresholdX?(this._didSwipe=!0,this.selectPrev()):i<=-this.normalizedSwipeThresholdX&&(this._didSwipe=!0,this.selectNext())}}};onInputPointerUp=e=>{e.button===0&&(this._didSwipe=!1)};onInputKeyDown=e=>{if(!this.useKeyboard||!this.scenes)return;const t=e.key.toLowerCase();if(!t)return;const i=parseInt(t)-1;if(i>=0){this.trySelectSceneFromValue(i);return}switch(t){case"arrowright":case"d":this.selectNext();break;case"arrowleft":case"a":this.selectPrev();break}};addScene(e){if(typeof e=="string"){let t=this.context.addressables.findAssetReference(e);return t||(t=new ie(e),this.context.addressables.registerAssetReference(t)),this.scenes.push(t),t}return this.scenes.push(e),e}selectNext(){return this.select(this._currentIndex+1)}selectPrev(){return this.select(this._currentIndex-1)}select(e){if(Ht&&console.log("select",e),typeof e=="object"&&console.warn('Switching to "'+e+'" might not work. Please either use an index or a AssetReference (not a scene reference)'),typeof e=="string"){const i=this.scenes?.find(n=>n.url===e);if(!i){const n=ie.getOrCreate(this.sourceId??"",e,this.context);return this.switchScene(n)}if(i)e=this.scenes?.indexOf(i);else return Xs}if(!this.scenes?.length)return Xs;if(e<0){if(this.clamp)return Xs;e=this.scenes.length-1}else if(e>=this.scenes.length){if(this.clamp)return Xs;e=0}const t=this.scenes[e];return this.switchScene(t)}unload(){return this.__lastSwitchScene=void 0,this.__lastSwitchScenePromise=void 0,this.__unloadCurrentScene()}async reload(){if(this.__lastSwitchScene){const e=this.__lastSwitchScene;return this.__lastSwitchScene=void 0,this.switchScene(e)}return!1}__lastSwitchScene;__lastSwitchScenePromise;async switchScene(e){if(!(e instanceof ie)){const t=typeof e;if(t==="string")return this.select(e);if(t==="number")return this.select(e);if(e&&e instanceof k){const i=this.scenes?.indexOf(e);e=new ie(e.name,void 0,e),i>=0&&(this.scenes[i]=e)}else return console.warn(`[SceneSwitcher] Can't switch to scene of type ${t}`),!1}return e.url===this.sourceId?(console.warn("[SceneSwitcher] Can't load own scene - prevent recursive loading",this.sourceId),!1):this.__lastSwitchScene===e&&this.__lastSwitchScenePromise?this.__lastSwitchScenePromise:(this.__lastSwitchScene=e,this.__lastSwitchScenePromise=this.__internalSwitchScene(e),await this.__lastSwitchScenePromise)}async __unloadCurrentScene(){const e=this._currentScene;if(this._currentScene=void 0,e){Ht&&console.log("UNLOAD",e.url,"HasURL?: "+e.hasUrl);const t=this.tryGetSceneEventListener(e.asset);if(t?.sceneClosing){const i=t.sceneClosing();i instanceof Promise&&await i}e.hasUrl?e.unload():e.asset instanceof k&&x.remove(e.asset)}}_currentlyLoadingScene;async __internalSwitchScene(e){await this.__unloadCurrentScene();const t=this._currentIndex=this.scenes?.indexOf(e)??-1;try{this._currentlyLoadingScene=e,this._currentLoadingProgress=new ProgressEvent("progress",{loaded:0,total:1});const i=new CustomEvent("loadscene-start",{detail:{scene:e,switcher:this,index:t}});this.dispatchEvent(i),this.sceneLoadingStart?.invoke(i.detail),await this.onStartLoading(),await e.loadAssetAsync((s,r)=>{if(Ht){const a=r.loaded/r.total,l="["+"=".repeat(Math.floor(a*20))+"-".repeat(20-Math.floor(a*20))+"]";console.debug(`[SceneSwitcher] Download ${(a*100).toFixed(1)} % ${l}`,e.url)}this._currentLoadingProgress=r,this.dispatchEvent(r),this.sceneLoadingProgress?.invoke(r)}).catch(console.error),await this.onEndLoading();const n=new CustomEvent("loadscene-finished",{detail:{scene:e,switcher:this,index:t}});if(this.dispatchEvent(n),this._currentLoadingProgress=void 0,this._currentlyLoadingScene=void 0,n.defaultPrevented)return Ht&&console.warn("Adding loaded scene prevented:",e,n),!1;if(!e.asset)return Ht&&console.warn("Failed loading scene:",e),!1;if(this._currentIndex===t){if(Ht&&console.log("ADD",e.url),this._currentScene=e,p2){const a=this.context.mainCameraComponent?.gameObject||this.context.mainCamera;a?.removeFromParent();const l=this.gameObject.removeFromParent();Zi(this.context.scene,!0,!0),this.context.scene=new wi,this.context.scene.add(l),a&&this.context.scene.add(a)}if(x.add(e.asset,this.gameObject),this.useSceneLighting&&this.context.sceneLighting.enable(e),this.useSceneBackground){const a=this.context.lightmaps.tryGetSkybox(e.url);a?(a.mapping=Nn,this.context.scene.background=a):Ht&&console.warn("SceneSwitcher: Can't find skybox for scene "+e.url)}if(this.useHistory&&t>=0){let a=t.toString();if(this.useSceneName&&(e instanceof k?a=e.name:e.url&&(a=v1(e.url))),this.queryParameterName?.length)ec(this.queryParameterName,a,this.useHistory);else{const l=history.state,c=this.guid+"::"+t;l!==c&&history.pushState(c,"unused",location.href)}}const s=this.tryGetSceneEventListener(e.asset);if(s?.sceneOpened){const a=s.sceneOpened(this);a instanceof Promise&&await a}const r=new CustomEvent("scene-opened",{detail:{scene:e,switcher:this,index:t}});return this.dispatchEvent(r),this.sceneLoaded?.invoke(this),!0}}catch(i){console.error(i)}return!1}preload(e){if(e>=0&&e<this.scenes.length){const t=this.scenes[e];if(t instanceof ie)return t.preload()}return Xs}tryLoadFromQueryParam(){if(!this.queryParameterName?.length)return Xs;const e=v(this.queryParameterName);return typeof e=="boolean"?Xs:this.trySelectSceneFromValue(e)}trySelectSceneFromValue(e){if(typeof e=="string"){const t=parseInt(e);if(t>=0&&t<this.scenes.length)return this.select(t);{const i=e.toLowerCase();for(let n=0;n<this.scenes.length;n++){const s=this.scenes[n];if(!!s&&(s instanceof k?s.name:v1(s.url)).toLowerCase().includes(i))return this.select(n)}}}else if(typeof e=="number"&&e>=0&&e<this.scenes.length)return this.select(e);return $i()&&console.warn('Can not find scene: "'+e+'"',this),Xs}_lastLoadingScene=void 0;_loadingScenePromise=void 0;_isCurrentlyLoading=!1;_currentLoadingProgress=void 0;async onStartLoading(){if(this._isCurrentlyLoading=!0,this.loadingScene&&(this._lastLoadingScene!==this.loadingScene&&(this._loadingScenePromise=void 0),this._lastLoadingScene=this.loadingScene,this._loadingScenePromise||(this._loadingScenePromise=this.loadingScene?.loadAssetAsync().then(e=>e!=null)),await this._loadingScenePromise,this._isCurrentlyLoading&&this.loadingScene?.asset)){Ht&&console.log("Add loading scene",this.loadingScene.url,this.loadingScene.asset);const e=this.loadingScene.asset;x.add(e,this.gameObject);const t=this.tryGetSceneEventListener(e);if(t?.sceneOpened){const i=t.sceneOpened(this);i instanceof Promise&&await i}}if(this._isCurrentlyLoading){const e=this.tryGetSceneEventListener(this.gameObject);if(e&&e.sceneOpened){const t=e.sceneOpened(this);t instanceof Promise&&await t}}}async onEndLoading(){if(this._isCurrentlyLoading=!1,this.loadingScene?.asset){Ht&&console.log("Remove loading scene",this.loadingScene.url);const e=this.loadingScene.asset,t=this.tryGetSceneEventListener(e);if(typeof t?.sceneClosing=="function"){const i=t.sceneClosing();i instanceof Promise&&await i}x.remove(e)}if(!this._isCurrentlyLoading){const e=this.tryGetSceneEventListener(this.gameObject);if(e&&e.sceneClosing){const t=e.sceneClosing();t instanceof Promise&&await t}}}tryGetSceneEventListener(e,t=0){if(!e)return null;const i=x.foreachComponent(e,n=>{const s=n;if(s.sceneClosing||s.sceneOpened)return s});if(t===0&&!i&&e.children.length)for(const n of e.children){const s=this.tryGetSceneEventListener(n,t+1);if(s)return s}return i||null}}wt([u()],Qe.prototype,"autoLoadFirstScene"),wt([u(ie)],Qe.prototype,"scenes"),wt([u(ie)],Qe.prototype,"loadingScene"),wt([u()],Qe.prototype,"queryParameterName"),wt([u()],Qe.prototype,"useSceneName"),wt([u()],Qe.prototype,"clamp"),wt([u()],Qe.prototype,"useHistory"),wt([u()],Qe.prototype,"useKeyboard"),wt([u()],Qe.prototype,"useSwipe"),wt([u()],Qe.prototype,"useSceneLighting"),wt([u()],Qe.prototype,"useSceneBackground"),wt([u()],Qe.prototype,"preloadNext"),wt([u()],Qe.prototype,"preloadPrevious"),wt([u()],Qe.prototype,"preloadConcurrent"),wt([u()],Qe.prototype,"createMenuButtons"),wt([u(he)],Qe.prototype,"sceneLoadingStart"),wt([u(he)],Qe.prototype,"sceneLoadingProgress"),wt([u(he)],Qe.prototype,"sceneLoaded");function v1(o){const e=o.split("/").pop()?.split(".").shift();return e?.length?e:o}class m2{maxLoadAhead;maxLoadBehind;maxConcurrent;_isRunning=!1;_switcher;_loadTasks=[];_maxConcurrentLoads=1;constructor(e,t=1,i=1,n=2){this._switcher=e,this.maxLoadAhead=t,this.maxLoadBehind=i,this.maxConcurrent=n}begin(e){if(this._isRunning)return;Ht&&console.log("Preload begin",{delay:e}),this._isRunning=!0;let t=-10,i,n;const s=this._switcher.scenes,r=Date.now()+e,a=setInterval(()=>{if(this.allLoaded()&&(Ht&&console.log("All scenes (pre-)loaded"),this.stop()),!this._isRunning){clearInterval(a);return}if(Date.now()<r||this.canLoadNewScene()===!1)return;(t===-10||t!==this._switcher.currentIndex)&&(t=this._switcher.currentIndex,n=0,i=0);const l=n%2===0;l&&(i+=1),n+=1;const c=l?this.maxLoadAhead:this.maxLoadBehind;if(i>c)return;const h=l?t+i:t-i;if(!(h<0)&&!(h<0||h>=s.length)&&!this._loadTasks.some(d=>d.index===h)){const d=s[h];Ht&&console.log("Preload scene",{roomIndex:h,searchForward:l,lastRoom:t,currentIndex:this._switcher.currentIndex,tasks:this._loadTasks.length},d?.url),new g2(h,d,this._loadTasks)}},200)}stop(){this._isRunning=!1}canLoadNewScene(){return this._loadTasks.length<this._maxConcurrentLoads}allLoaded(){if(this._switcher.scenes){for(const e of this._switcher.scenes)if(e?.isLoaded&&e.isLoaded()===!1)return!1}return!0}}class g2{index;asset;tasks;constructor(e,t,i){this.index=e,this.asset=t,this.tasks=i,i.push(this),this.awaitLoading()}async awaitLoading(){this.asset&&!this.asset.isLoaded()&&(Ht&&console.log("Preload start: "+this.asset.url,this.index),await this.asset.preload(),Ht&&console.log("Preload finished: "+this.asset.url,this.index));const e=this.tasks.indexOf(this);e>=0&&this.tasks.splice(e,1)}}function f2(){return new Promise((o,e)=>{const t=()=>{t!=null&&(document.removeEventListener("pointerdown",t),document.removeEventListener("click",t),document.removeEventListener("dragstart",t),document.removeEventListener("touchstart",t),o())};document.addEventListener("pointerdown",t),document.addEventListener("click",t),document.addEventListener("dragstart",t),document.addEventListener("touchstart",t)})}async function y2(o){await f2(),o()}var b2=Object.defineProperty,_2=Object.getOwnPropertyDescriptor,Di=(o,e,t,i)=>{for(var n=i>1?void 0:i?_2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&b2(e,t,n),n};const xt=v("debugvideo");var w1=(o=>(o[o.None=0]="None",o[o.AdjustHeight=1]="AdjustHeight",o[o.AdjustWidth=2]="AdjustWidth",o))(w1||{}),x1=(o=>(o[o.VideoClip=0]="VideoClip",o[o.Url=1]="Url",o))(x1||{}),S1=(o=>(o[o.CameraFarPlane=0]="CameraFarPlane",o[o.CameraNearPlane=1]="CameraNearPlane",o[o.RenderTexture=2]="RenderTexture",o[o.MaterialOverride=3]="MaterialOverride",o))(S1||{});class dt extends R{playOnAwake=!0;aspectMode=0;clip=null;source=1;get url(){return this._url}set url(e){const t=this._url!==e;this.__didAwake?t&&this.setClipURL(e??""):this._url=e}_url=null;renderMode;targetMaterialProperty;targetMaterialRenderer;targetTexture;time=0;_playbackSpeed=1;get playbackSpeed(){return this._videoElement?.playbackRate??this._playbackSpeed}set playbackSpeed(e){this._playbackSpeed=e,this._videoElement&&(this._videoElement.playbackRate=e)}_isLooping=!1;get isLooping(){return this._videoElement?.loop??this._isLooping}set isLooping(e){this._isLooping=e,this._videoElement&&(this._videoElement.loop=e)}get currentTime(){return this._videoElement?.currentTime??this.time}set currentTime(e){this._videoElement?this._videoElement.currentTime=e:this.time=e}get isPlaying(){const e=this._videoElement;return!!(e&&(e.currentTime>0&&!e.paused&&!e.ended&&e.readyState>e.HAVE_CURRENT_DATA||e.srcObject&&e.srcObject.active))}get crossOrigin(){return this._videoElement?.crossOrigin??this._crossOrigin}set crossOrigin(e){this._crossOrigin=e,this._videoElement&&(e!==null?this._videoElement.setAttribute("crossorigin",e):this._videoElement.removeAttribute("crossorigin"))}get videoMaterial(){return!this._videoMaterial&&!this.create(!1)?null:this._videoMaterial}get videoTexture(){return!this._videoTexture&&!this.create(!1)?null:this._videoTexture}get videoElement(){return!this._videoElement&&!this.create(!1)?null:this._videoElement}requestPictureInPicture(){return this._videoElement?this._videoElement.requestPictureInPicture():null}get muted(){return this._videoElement?.muted??this._muted}set muted(e){this._muted=e,this._videoElement&&(this._videoElement.muted=e)}_muted=!1;get currentVideo(){return this.clip}set audioOutputMode(e){e!==this._audioOutputMode&&(e===1&&A()&&console.warn("VideoAudioOutputMode.AudioSource is not yet implemented"),this._audioOutputMode=e,this.updateVideoElementSettings())}get audioOutputMode(){return this._audioOutputMode}_audioOutputMode=2;playInBackground=!0;_crossOrigin="anonymous";_videoElement=null;_videoTexture=null;_videoMaterial=null;_isPlaying=!1;wasPlaying=!1;preloadVideo(){xt&&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,xt&&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(){xt&&console.log("VideoPlayer.onEnable",x1[this.source],this.clip,this.url,this),window.addEventListener("visibilitychange",this.visibilityChanged),this.playOnAwake===!0?this.create(!0):this.preloadVideo(),this.screenspace?this._overlay?.start():this._overlay?.stop()}onDisable(){window.removeEventListener("visibilitychange",this.visibilityChanged),this._overlay?.stop(),this.pause()}visibilityChanged=e=>{switch(document.visibilityState){case"hidden":this.playInBackground||(this.wasPlaying=this._isPlaying,this.pause());break;case"visible":this.wasPlaying&&!this._isPlaying&&this.play();break}};onDestroy(){this._videoElement&&(this.videoElement?.remove(),this._videoElement=null),this._videoTexture&&(this._videoTexture.dispose(),this._videoTexture=null)}_receivedInput=!1;constructor(){super(),y2(()=>{this._receivedInput=!0,this.updateVideoElementSettings()}),this._targetObjects=[],v("videoscreenspace")&&window.addEventListener("keydown",e=>{e.key==="f"&&(this.screenspace=!this.screenspace)})}play(){if(this._videoElement||this.create(!1),!this._videoElement){xt&&console.warn("Can not play: no video element found",this);return}if(!(this._isPlaying&&!this._videoElement?.ended&&!this._videoElement?.paused)){if(this._isPlaying=!0,this._receivedInput||(this._videoElement.muted=!0),this.handleBeginPlaying(!1),this.shouldUseM3U){this.ensureM3UCanBePlayed();return}xt&&console.log("Video Play()",this.clip,this._videoElement,this.time),this._videoElement.currentTime=this.time,this._videoElement.play().catch(e=>{console.log(e),xt&&console.error("Error playing video",e,"CODE="+e.code,this.videoElement?.src,this),setTimeout(()=>{this._isPlaying&&!this.destroyed&&this.activeAndEnabled&&this.play()},1e3)}),xt&&console.log("play",this._videoElement,this.time)}}stop(){this._isPlaying=!1,this.time=0,this._videoElement&&(this._videoElement.currentTime=0,this._videoElement.pause(),xt&&console.log("STOP",this))}pause(){this.time=this._videoElement?.currentTime??0,this._isPlaying=!1,this._videoElement?.pause(),xt&&console.log("PAUSE",this,this.currentTime)}create(e){let t;switch(this.source){case 0:t=this.clip;break;case 1:t=this.url,!t?.length&&typeof this.clip=="string"&&(t=this.clip);break}return t?(this._videoElement||(xt&&console.warn("Create VideoElement",this),this._videoElement=this.createVideoElement(),this.context.domElement.shadowRoot.prepend(this._videoElement),this.updateVideoElementStyles()),typeof t=="string"?(xt&&console.log("Set Video src",t),this._videoElement.src=t):(xt&&console.log("Set Video srcObject",t),this._videoElement.srcObject=t),this._videoTexture||(this._videoTexture=new MC(this._videoElement)),this._videoTexture.flipY=!1,this._videoTexture.colorSpace=Co,e&&this.handleBeginPlaying(e),xt&&console.log("Video: handle playing done...",t,e),!0):(xt&&console.warn("No video source set",this),!1)}updateAspect(){this.aspectMode!==0&&this.startCoroutine(this.updateAspectImpl())}_overlay=null;get screenspace(){return this._overlay?.enabled??!1}set screenspace(e){if(e){if(!this._videoTexture)return;this._overlay||(this._overlay=new v2(this.context)),this._overlay.add(this._videoTexture)}else this._overlay?.remove(this._videoTexture);this._overlay&&(this._overlay.enabled=e)}_targetObjects;createVideoElement(){const e=document.createElement("video");return this._crossOrigin&&e.setAttribute("crossorigin",this._crossOrigin),xt&&console.log("created video element",e),e}handleBeginPlaying(e){if(!this.activeAndEnabled||!this._videoElement)return;this._targetObjects.length=0;let t=this.gameObject;switch(this.renderMode){case 3:t=this.targetMaterialRenderer?.gameObject,t||(t=x.getComponent(this.gameObject,Kt)?.gameObject);break;case 2:console.error("VideoPlayer renderTexture not implemented yet. Please use material override instead");return}if(!t){console.error("Missing target for video material renderer",this.name,S1[this.renderMode],this);return}const i=t.material;if(i){this._targetObjects.push(t),i!==this._videoMaterial&&(this._videoMaterial=i.clone(),t.material=this._videoMaterial);const n="map",s=this._videoMaterial;if(!this.targetMaterialProperty)s[n]=this._videoTexture;else switch(this.targetMaterialProperty){default:s[n]=this._videoTexture;break}}else{console.warn("Can not play video, no material found, this might be a multimaterial case which is not supported yet");return}this.updateVideoElementSettings(),this.updateVideoElementStyles(),e&&(this.shouldUseM3U&&this.ensureM3UCanBePlayed(),this.play())}updateVideoElementSettings(){if(!this._videoElement)return;this._videoElement.loop=this._isLooping,this._videoElement.currentTime=this.currentTime,this._videoElement.playbackRate=this._playbackSpeed,this._videoElement.playsInline=!0;let e=!this._receivedInput||this.audioOutputMode===0;!e&&this._muted&&(e=!0),this._videoElement.muted=e,this.playOnAwake&&(this._videoElement.autoplay=!0)}updateVideoElementStyles(){this._videoElement&&(this._videoElement.style.userSelect="none",this._videoElement.style.visibility="hidden",this._videoElement.style.display="none",this.updateAspect())}_updateAspectRoutineId=-1;*updateAspectImpl(){const e=++this._updateAspectRoutineId,t=void 0,i=this.clip;for(;e===this._updateAspectRoutineId&&this.aspectMode!==0&&this.clip&&i===this.clip&&this._isPlaying;){if(!i||typeof i=="string")return;let n;for(const s of i.getVideoTracks()){const r=s.getSettings();if(r&&r.width&&r.height){n=r.width/r.height;break}else n=this.context.renderer.domElement.clientWidth/this.context.renderer.domElement.clientHeight}if(n===void 0){for(let s=0;s<10;s++)yield;if(!this.isPlaying)break;continue}if(t===n){yield;continue}for(const s of this._targetObjects){let r=1;if(s.parent){const a=He(s.parent);r=a.x/a.y}switch(this.aspectMode){case 1:s.scale.y=1/n*s.scale.x*r;break;case 2:s.scale.x=n*s.scale.y*r;break}}for(let s=0;s<3;s++)yield}}get shouldUseM3U(){return this.url!=null&&(this.url.endsWith(".m3u8")||this.url.endsWith(".m3u"))&&this.source===1}ensureM3UCanBePlayed(){if(!this.shouldUseM3U)return;let e=document.head.querySelector("script[data-hls_library]");e?globalThis.Hls?this.onHlsAvailable():e.addEventListener("load",this.onHlsAvailable):(xt&&console.log("HLS: load script"),e=document.createElement("script"),e.dataset.hls_library="hls.js",e.src="https://cdn.jsdelivr.net/npm/hls.js@1",e.addEventListener("load",this.onHlsAvailable),document.head.append(e))}_hls;onHlsAvailable=()=>{xt&&console.log("HLS: available",this.clip),!(!this.shouldUseM3U||!this.url)&&(this._hls||(this._hls=new Hls),this.videoElement.autoplay=!0,this._hls.loadSource(this.url),this._hls.attachMedia(this.videoElement),this._videoElement?.play(),xt&&console.log("HLS: loaded",this.clip))}}Di([u()],dt.prototype,"playOnAwake",2),Di([u()],dt.prototype,"aspectMode",2),Di([u(URL)],dt.prototype,"clip",2),Di([u()],dt.prototype,"source",2),Di([u(URL)],dt.prototype,"url",1),Di([u()],dt.prototype,"renderMode",2),Di([u()],dt.prototype,"targetMaterialProperty",2),Di([u(Kt)],dt.prototype,"targetMaterialRenderer",2),Di([u(Le)],dt.prototype,"targetTexture",2),Di([u()],dt.prototype,"time",2),Di([u()],dt.prototype,"playbackSpeed",1),Di([u()],dt.prototype,"isLooping",1),Di([u()],dt.prototype,"audioOutputMode",1);class v2{context;constructor(e){this.context=e,this._input=new w2(this)}get enabled(){return this._isInScreenspaceMode}set enabled(e){e?this.start():this.stop()}add(e){this._videos.indexOf(e)===-1&&this._videos.push(e)}remove(e){if(!e)return;const t=this._videos.indexOf(e);t>=0&&this._videos.splice(t,1)}start(){if(this._isInScreenspaceMode||this._videos.length<0)return;const e=this._videos[this._videos.length-1];if(!e)return;if(this._isInScreenspaceMode=!0,!this._screenspaceModeQuad){if(this._screenspaceModeQuad=Sr.createPrimitive(xr.Quad,{material:new x2(e)}),!this._screenspaceModeQuad)return;this._screenspaceModeQuad.geometry.scale(2,2,2)}const t=this._screenspaceModeQuad;this.context.scene.add(t),this.updateScreenspaceMaterialUniforms();const i=t.material;i?.reset(),this._input?.enable(i)}stop(){this._isInScreenspaceMode=!1,this._screenspaceModeQuad&&(this._input?.disable(),this._screenspaceModeQuad.removeFromParent())}updateScreenspaceMaterialUniforms(){const e=this._screenspaceModeQuad?.material;e&&(e.screenAspect=this.context.domElement.clientWidth/this.context.domElement.clientHeight)}_videos=[];_screenspaceModeQuad;_isInScreenspaceMode=!1;_input}class w2{_onResizeScreenFn;_onKeyUpFn;_onMouseWheelFn;context;overlay;constructor(e){this.overlay=e,this.context=e.context}_material;enable(e){this._material=e,window.addEventListener("resize",this._onResizeScreenFn=()=>{this.overlay.updateScreenspaceMaterialUniforms()}),window.addEventListener("keyup",this._onKeyUpFn=n=>{n.key==="Escape"&&this.overlay.stop()}),window.addEventListener("wheel",this._onMouseWheelFn=n=>{this.overlay.enabled&&(e.zoom+=n.deltaY*5e-4,n.preventDefault())},{passive:!1});const t=new ee;window.addEventListener("mousemove",n=>{if(this.overlay.enabled&&this.context.input.getPointerPressed(0)){const s=new ee(n.movementX,n.movementY);s.x/=this.context.domElement.clientWidth,s.y/=this.context.domElement.clientHeight,t.set(s.x,s.y),t.multiplyScalar(e.zoom/-this.context.time.deltaTime*.01),e.offset=e.offset.add(t)}}),window.addEventListener("pointermove",n=>{this.overlay.enabled&&this.context.input.getPointerPressed(0)&&this.context.input.getTouchesPressedCount()===1&&(t.set(n.movementX,n.movementY),t.multiplyScalar(e.zoom*-this.context.time.deltaTime*.05),e.offset=e.offset.add(t))});let i=0;window.addEventListener("touchstart",n=>{if(n.touches.length<2){this.context.time.time-i<.3&&this.overlay.stop(),i=this.context.time.time;return}this._isPinching=!0,this._lastPinch=0}),window.addEventListener("touchmove",n=>{if(!this._isPinching||!this._material)return;const s=n.touches[0],r=n.touches[1],a=s.clientX-r.clientX,l=s.clientY-r.clientY,c=Math.sqrt(a*a+l*l);if(this._lastPinch!==0){const h=c-this._lastPinch;this._material.zoom-=h*.004}this._lastPinch=c}),window.addEventListener("touchend",()=>{this._isPinching=!1})}_isPinching=!1;_lastPinch=0;disable(){this._onResizeScreenFn&&(window.removeEventListener("resize",this._onResizeScreenFn),this._onResizeScreenFn=void 0),this._onKeyUpFn&&(window.removeEventListener("keyup",this._onKeyUpFn),this._onKeyUpFn=void 0),this._onMouseWheelFn&&(window.removeEventListener("wheel",this._onMouseWheelFn),this._onMouseWheelFn=void 0)}}class x2 extends zn{set screenAspect(e){this.uniforms.screenAspect.value=e,this.needsUpdate=!0}set offset(e){const t=this.uniforms.offsetScale.value;t.x=e.x,t.y=e.y,this.uniforms.offsetScale.value=t,this.needsUpdate=!0}_offset=new ee;get offset(){const e=this.uniforms.offsetScale.value;return this._offset.set(e.x,e.y),this._offset}set zoom(e){const t=this.uniforms.offsetScale.value;e<.001&&(e=.001),t.z=e,this.needsUpdate=!0}get zoom(){return this.uniforms.offsetScale.value.z}reset(){this.offset=this.offset.set(0,0),this.zoom=1,this.needsUpdate=!0}constructor(e){super(),this.uniforms={map:{value:e},screenAspect:{value:1},offsetScale:{value:new pe(0,0,1,1)}},this.vertexShader=`
1357
- uniform sampler2D map;
1358
- uniform float screenAspect;
1359
- uniform vec4 offsetScale;
1360
- varying vec2 vUv;
1361
-
1362
- void main() {
1363
-
1364
- gl_Position = vec4( position , 1.0 );
1365
- vUv = uv;
1366
- vUv.y = 1. - vUv.y;
1367
-
1368
- // fit into screen
1369
- ivec2 res = textureSize(map, 0);
1370
- float videoAspect = float(res.x) / float(res.y);
1371
- float aspect = videoAspect / screenAspect;
1372
- if(aspect >= 1.0)
1373
- {
1374
- vUv.y = vUv.y * aspect;
1375
- float offset = (1. - aspect) * .5;
1376
- vUv.y = vUv.y + offset;
1377
- }
1378
- else
1379
- {
1380
- vUv.x = vUv.x / aspect;
1381
- float offset = (1. - 1. / aspect) * .5;
1382
- vUv.x = vUv.x + offset;
1383
- }
1384
-
1385
- vUv.x -= .5;
1386
- vUv.y -= .5;
1387
-
1388
- vUv.x *= offsetScale.z;
1389
- vUv.y *= offsetScale.z;
1390
- vUv.x += offsetScale.x;
1391
- vUv.y += offsetScale.y;
1392
-
1393
- vUv.x += .5;
1394
- vUv.y += .5;
1395
- }
1396
-
1397
- `,this.fragmentShader=`
1398
- uniform sampler2D map;
1399
- varying vec2 vUv;
1400
- void main() {
1401
- if(vUv.x < 0. || vUv.x > 1. || vUv.y < 0. || vUv.y > 1.)
1402
- gl_FragColor = vec4(0., 0., 0., 1.);
1403
- else
1404
- {
1405
- vec4 texcolor = texture2D(map, vUv);
1406
- gl_FragColor = texcolor;
1407
- }
1408
- }
1409
- `}}var S2=Object.defineProperty,C2=Object.getOwnPropertyDescriptor,Th=(o,e,t,i)=>{for(var n=i>1?void 0:i?C2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&S2(e,t,n),n};const Tt=v("debugscreensharing");var C1=(o=>(o[o.Screen=0]="Screen",o[o.Camera=1]="Camera",o[o.Canvas=2]="Canvas",o[o.Microphone=3]="Microphone",o))(C1||{});class Qs extends R{allowStartOnClick=!0;onPointerEnter(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.setCursor("pointer")}onPointerExit(){this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&this.context.input.unsetCursor("pointer")}onPointerClick(e){if(this.context.connection.allowEditing!=!1&&this.allowStartOnClick&&!(e&&e.pointerId!==0)){if(this.isReceiving&&this.videoPlayer?.isPlaying){this.videoPlayer&&(this.videoPlayer.screenspace=!this.videoPlayer.screenspace);return}if(this.isSending){this.close();return}this.share()}}autoConnect=!1;set videoPlayer(e){this._videoPlayer&&(this.isSending||this.isReceiving)&&this._videoPlayer.stop(),this._videoPlayer=e,this._videoPlayer&&this._currentStream&&(this.isSending||this.isReceiving)&&this._videoPlayer.setVideo(this._currentStream)}get videoPlayer(){return this._videoPlayer}_videoPlayer;_audioSource;get screenspace(){return this.videoPlayer?.screenspace??!1}set screenspace(e){this.videoPlayer&&(this.videoPlayer.screenspace=e)}device="Screen";deviceName;deviceFilter;get currentScream(){return this._currentStream}get currentMode(){return this._currentMode}get isSending(){return this._currentStream?.active&&this._currentMode===1}get isReceiving(){if(this._currentMode===2){if(!this._currentStream||this._currentStream.active===!1)return!1;const e=this._currentStream.getTracks();for(const t of e)if(t.readyState==="live")return!0}return!1}get requiresVideoPlayer(){return this.device!=="Microphone"}_net;_requestOpen=!1;_currentStream=null;_currentMode=0;awake(){typeof this.device=="number"&&(this.device=C1[this.device]),Tt&&console.log("Screensharing",this.name,this),Ai.registerWaitForAllowAudio(()=>{this._videoPlayer&&this._currentStream&&this._currentMode===2&&(this._videoPlayer.playInBackground=!0,this._videoPlayer.setVideo(this._currentStream))}),this._net=new pd(this)}onEnable(){this._net?.enable(),this._net?.addEventListener(Kn.StreamReceived,this.onReceiveStream),this._net?.addEventListener(Kn.StreamEnded,this.onCallEnded),this.context.connection.beginListen(te.JoinedRoom,this.onJoinedRoom),this.autoConnect&&Wn(1e3).then(()=>(this.enabled&&this.autoConnect&&!this.isReceiving&&!this.isSending&&this.context.connection.isInRoom&&this.share(),0))}onDisable(){this._net?.removeEventListener(Kn.StreamReceived,this.onReceiveStream),this._net?.removeEventListener(Kn.StreamEnded,this.onCallEnded),this.context.connection.stopListen(te.JoinedRoom,this.onJoinedRoom),this._net?.disable(),this.close()}onJoinedRoom=async()=>{await Wn(1e3),this.autoConnect&&!this.isSending&&!this.isReceiving&&this.context.connection.isInRoom&&this.share()};_ensureVideoPlayer(){const e=new dt;e.aspectMode=w1.AdjustWidth,x.addComponent(this.gameObject,e),this._videoPlayer=e}_activeShareRequest=null;async share(e){return this._activeShareRequest?this._activeShareRequest:(this._activeShareRequest=this.internalShare(e),this._activeShareRequest.then(()=>this._activeShareRequest=null))}async internalShare(e){if(this.context.connection.isInRoom===!1){console.warn("Can not start screensharing: requires network connection"),A()&&ye("Can not start screensharing: requires network connection. Add a SyncedRoom component or join a room first.");return}if(e?.device&&(this.device=e.device),!this.videoPlayer&&this.requiresVideoPlayer&&(this._videoPlayer||(this._videoPlayer=x.getComponent(this.gameObject,dt)??void 0),this.videoPlayer||this._ensureVideoPlayer(),!this.videoPlayer)){console.warn("Can not share video without a videoPlayer assigned");return}this._requestOpen=!0;try{const t=e?.constraints??{echoCancellation:!0,autoGainControl:!1},i={video:t,audio:t},n=i.video;switch(n!==void 0&&typeof n!="boolean"&&(n.width||(n.width={max:1920}),n.height||(n.height={max:1920}),n.aspectRatio||(n.aspectRatio={ideal:1.7777777778}),n.frameRate||(n.frameRate={ideal:24}),n.facingMode||(n.facingMode={ideal:"user"})),this.device){case"Camera":this.tryShareUserCamera(i,e);break;case"Screen":{if(!navigator.mediaDevices.getDisplayMedia){console.error("No getDisplayMedia support");return}const r=await navigator.mediaDevices.getDisplayMedia(i);this._requestOpen?this.setStream(r,1):Jn(r)}break;case"Canvas":const s=this.context.renderer.domElement.captureStream(0);this.setStream(s,1);break;case"Microphone":{if(!navigator.mediaDevices.getUserMedia){console.error("No getDisplayMedia support");return}i.video=!1;const r=await navigator.mediaDevices.getUserMedia(i);this._requestOpen?this.setStream(r,1):Jn(r)}break;default:console.error("Can not start screen sharing: Unknown device type",this.device)}}catch(t){if(t.name==="NotAllowedError"){console.log("Selection cancelled"),this._requestOpen=!1;return}console.error("Error opening video",t)}}close(){this._requestOpen=!1,this._currentStream&&(Tt&&console.warn("Close current stream / disposing resources, stream was active?",this._currentStream.active),this._net?.stopSendingStream(this._currentStream),Jn(this._currentStream),this._currentMode=0,this._currentStream=null)}setStream(e,t){if(e===this._currentStream||(this.close(),!e))return;this._currentStream=e,this._requestOpen=!0,this._currentMode=t;const i=this.device!=="Microphone",n=t===1;i?(this._videoPlayer||this._ensureVideoPlayer(),this._videoPlayer?this._videoPlayer.setVideo(e):console.error("No video player assigned for video stream")):(this._audioSource||(this._audioSource=new Ai,this._audioSource.spatialBlend=0,this._audioSource.volume=1,this.gameObject.addComponent(this._audioSource)),n||(Tt&&console.log("PLAY",e.getAudioTracks()),this._audioSource.volume=1,this._audioSource?.play(e))),n&&this._net?.startSendingStream(e),n&&(this._videoPlayer&&(this._videoPlayer.muted=!0),this._audioSource?.stop());for(const s of e.getTracks())s.addEventListener("ended",()=>{Tt&&console.log("Track ended",s),this.close()}),Tt&&s.kind==="video"&&console.log(n?"Video \u2192":"Video \u2190",s.getSettings())}onReceiveStream=e=>{e.stream?.active===!0&&this.setStream(e.stream,2)};onCallEnded=e=>{Tt&&console.log("CALL ENDED",this.isReceiving,this?.screenspace),this.isReceiving&&(this.screenspace=!1)};async tryShareUserCamera(e,t){const i=(await navigator.mediaDevices.enumerateDevices()).filter(s=>s.kind==="videoinput");Tt&&console.log(`Request camera. These are your kind:videoinput devices:
1410
- `,i);let n=!1;for(const s of i)try{if(!this._requestOpen){Tt&&console.log("Camera selection cancelled");break}if(s.kind!=="videoinput"){Tt&&console.log("Skipping non-video device",s);continue}const r=s.deviceId;if(t?.deviceId!=null||t?.deviceFilter!=null){if(t?.deviceId!==void 0&&r!==t.deviceId){Tt&&console.log("Skipping device due to options.deviceId: "+s.label+"; "+s.deviceId);continue}if(t?.deviceFilter&&t.deviceFilter(s)===!1){Tt&&console.log("Skipping device due to options.deviceFilter: "+s.label+"; "+s.deviceId);continue}}else if(this.deviceFilter)if(this.deviceFilter(s)===!1){Tt&&console.log("Skipping device due to ScreenShare.deviceFilter: "+s.label+"; "+s.deviceId);continue}else Tt&&console.log("Selected device by filter",s);else if(this.deviceName){const l=s.label.toLowerCase(),c=this.deviceName.toLowerCase(),h=l.includes(c),d=s.deviceId===this.deviceName;if(!h&&!d){Tt&&console.log("Skipping device due to ScreenShare.deviceName: "+s.label+"; "+s.deviceId);continue}else Tt&&console.log("Selected device by name",s)}e.video!==!1&&((typeof e.video>"u"||typeof e.video=="boolean")&&(e.video={}),e.video.deviceId=r),n=!0;const a=await navigator.mediaDevices.getUserMedia(e).catch(l=>(console.error("Failed to get user media",l),null));if(a===null)continue;this._requestOpen?(this.setStream(a,1),Tt&&console.log("Selected camera",s)):(Jn(a),Tt&&console.log("Camera selection cancelled"));break}catch(r){if(r.message==="Failed to allocate videosource"||r.message==="Could not start video source"){ye("Failed to start video: Try another camera (Code "+r.code+")"),console.warn(r);continue}else console.error("Failed to get user media",r.message,r.code,r)}!n&&A()&&(ye("No camera found for sharing. Please connect a camera (see console for more information)"),console.warn("No camera found for sharing. Please connect a camera",i,this.deviceName,"Using deviceFilter? "+this.deviceFilter!=null,"Using options? "+t!=null,"Using deviceName? "+this.deviceName!=null,"Using options.deviceId? "+t?.deviceId!=null,"Using options.deviceFilter? "+t?.deviceFilter!=null))}}Th([u()],Qs.prototype,"allowStartOnClick",2),Th([u()],Qs.prototype,"autoConnect",2),Th([u(dt)],Qs.prototype,"videoPlayer",1),Th([u()],Qs.prototype,"device",2),Th([u()],Qs.prototype,"deviceName",2);var P2=Object.defineProperty,Al=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&P2(e,t,n),n};const O2=v("debugseethrough");let k2=0;class Zo extends R{referencePoint=null;fadeDuration=.05;minAlpha=0;useAlphaHash=!0;set needsUpdate(e){this._needsUpdate=e}get needsUpdate(){return this._needsUpdate}overrideAlpha=-1;autoUpdate=!0;_referencePointVector=new b;_referencePointDir=new b;_distance=0;_renderer=null;_needsUpdate=!0;_id=k2++;onEnable(){this._needsUpdate=!0,this._renderer=null,Eh.components.push(this)}onDisable(){this._renderer?.forEach(t=>{const i=this.rendererMaterialsOriginal.get(t);for(let n=0;n<t.sharedMaterials.length;n++)t.sharedMaterials[n]&&i&&i[n]&&(t.sharedMaterials[n]=i[n]);this.rendererMaterials.delete(t),this.rendererMaterialsOriginal.delete(t)});const e=Eh.components.indexOf(this);e!==-1&&Eh.components.splice(e,1)}update(){if(this._needsUpdate?(this._needsUpdate=!1,this._renderer=this.gameObject.getComponentsInChildren(Kt),this.updateDirection()):this.autoUpdate&&(this.context.time.frame+this._id)%20===0&&this.updateDirection(),!this.autoUpdate||!this.referencePoint)return;const e=this._referencePointDir.dot(this.context.mainCamera.worldForward)>.2;if(O2&&this.referencePoint){const t=this.gameObject.worldPosition;B.DrawArrow(D(t),t.sub(this._referencePointDir),e?16711680:65280),B.DrawWireSphere(this.referencePoint.worldPosition,.05,255)}e?this.updateAlpha(this.minAlpha,this.fadeDuration):this.updateAlpha(1,this.fadeDuration)}rendererMaterials=new WeakMap;rendererMaterialsOriginal=new WeakMap;updateDirection(){this.referencePoint??=this.context.scene,this._referencePointVector.copy(this.gameObject.worldPosition.sub(this.referencePoint.worldPosition)),this._distance=this._referencePointVector.length(),this._referencePointDir.copy(this._referencePointVector).multiply(D(1,.5,1)).normalize()}updateAlpha(e,t=this.fadeDuration){this.overrideAlpha!==void 0&&this.overrideAlpha!==-1&&(e=this.overrideAlpha),this._renderer?.forEach(i=>{if(e<.9?i.gameObject.raycastAllowed=!1:i.gameObject.raycastAllowed=!0,!this.rendererMaterials.has(i)){const s=new Array,r=new Array;for(let a=0;a<i.sharedMaterials.length;a++){const l=i.sharedMaterials[a];if(!l)continue;s.push(l);const c=l.clone();c.userData=l.userData||{},c.userData.seeThrough={initial:{opacity:c.opacity,transparent:c.transparent,alphaHash:c.alphaHash}},r.push(c),i.sharedMaterials[a]=c}this.rendererMaterials.set(i,r),this.rendererMaterialsOriginal.set(i,s)}const n=i.hasLightmap?i.sharedMaterials:this.rendererMaterials.get(i);if(n)for(const s of n){if(!s)continue;let r=L.lerp(s.opacity,e,t<=0?1:this.context.time.deltaTime/t);r>=.99?r=1:r<=.01&&(r=0);const a=s.transparent,l=s.alphaHash,c=s.opacity;if(s.alphaHash=this.useAlphaHash,s.userData&&"seeThrough"in s.userData){const h=s.userData.seeThrough.initial;s.opacity=h.opacity*r,s.transparent=s.opacity>=1?h.transparent:!this.useAlphaHash}else s.transparent=s.opacity>=1?!1:!this.useAlphaHash;(a!==s.transparent||l!==s.alphaHash||s.opacity!==c)&&(s.needsUpdate=!0)}})}}Al([u(k)],Zo.prototype,"referencePoint"),Al([u()],Zo.prototype,"fadeDuration"),Al([u()],Zo.prototype,"minAlpha"),Al([u()],Zo.prototype,"useAlphaHash"),Al([u()],Zo.prototype,"overrideAlpha"),Al([u()],Zo.prototype,"autoUpdate");class Eh{static components=[];get extensionName(){return"SeeThrough"}}const P1=new Eh;Tn.beforeExport.addEventListener(o=>{Eh.components.length!==0&&o.exporter.extensions.includes(P1)===!1&&o.exporter.extensions.push(P1)});var M2=Object.defineProperty,O1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&M2(e,t,n),n};class Ah extends R{mode=0;shadowColor=new oe(0,0,0,1);targetMesh;start(){if(this.gameObject instanceof G)this.gameObject instanceof G&&this.gameObject.material&&(this.gameObject.material=this.gameObject.material.clone(),this.targetMesh=this.gameObject,this.targetMesh.receiveShadow=!0);else{const e=Sr.createPrimitive(xr.Quad,{name:"ShadowCatcher",material:new pt({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=hb,this.applyMaterialOptions(e),e.onBeforeCompile=t=>{t.fragmentShader=t.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",`vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
1411
- // diffuse-only lighting with overdrive to somewhat compensate
1412
- // for the loss of indirect lighting and to make it more visible.
1413
- vec3 direct = (reflectedLight.directDiffuse + reflectedLight.directSpecular) * 6.6;
1414
- float max = max(direct.r, max(direct.g, direct.b));
1415
-
1416
- // early out - we're simply returning direct lighting and some alpha based on it so it can
1417
- // be blended onto the scene.
1418
- gl_FragColor = vec4(direct, max);
1419
- return;
1420
- `)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new K0;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),this.targetMesh.material=e,e.userData.isShadowCatcherMaterial=!0}else{const e=this.targetMesh.material;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),e.userData.isShadowCatcherMaterial=!0}}applyOccluderMaterial(){if(this.targetMesh){let e=this.targetMesh.material;if(!e){const t=new xe;this.targetMesh.material=t,e=t}e.depthWrite=!0,e.stencilWrite=!0,e.colorWrite=!1,this.gameObject.renderOrder=-100}}applyMaterialOptions(e){e&&(e.depthWrite=!1,e.stencilWrite=!1)}}O1([u()],Ah.prototype,"mode"),O1([u(oe)],Ah.prototype,"shadowColor");const Ip=new Map;function k1(o,e){if(Ip.has(o))return Ip.get(o);const t=new URL(o,window.location.href),i=R2(t,e);return Ip.set(o,i),i.finally(()=>{Ip.delete(o)}),i}async function R2(o,e){if(!o)return Promise.resolve(null);const t=o.pathname,i=o.toString().toLowerCase().includes("pmrem")||o.searchParams.get("pmrem")!=null,n=t.endsWith(".exr"),s=t.endsWith(".hdr"),r=t.endsWith(".ktx2");let a;if(n)a=new km;else if(s)a=new fb;else if(r){const{ktx2Loader:c}=Om(e);a=c}else a=new Kl;const l=o.toString();return await a.loadAsync(l).then(c=>{if(c){const h=t.lastIndexOf("/");c.name=t.substring(h>=0?h+1:0),i&&(c.mapping=db),a instanceof Kl&&(c.colorSpace=Co)}return c}).catch(c=>(console.warn("Failed to load texture from url:",o),null))}var T2=Object.defineProperty,Ih=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&T2(e,t,n),n};const ii=v("debugskybox");b0("background-image"),b0("environment-image");const M1={studio:{url:"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.pmrem4x4.ktx2?pmrem"},"blurred-skybox":{url:"https://cdn.needle.tools/static/skybox/blurred-skybox.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/blurred-skybox-small.pmrem4x4.ktx2?pmrem"},"quicklook-ar":{url:"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.pmrem4x4.ktx2?pmrem"},quicklook:{url:"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.pmrem4x4.ktx2?pmrem",url_low:"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.pmrem4x4.ktx2?pmrem"}};function R1(o,e,t,i,n){if(e==="transparent"||e?.startsWith("rgb")||e?.startsWith("#"))return console.warn(`Needle Engine: Invalid ${n} value (${e}). Did you mean to set background-color instead?`),null;const s=new jp;s.sourceId=zb(e),s.allowDrop=!1,s.allowNetworking=!1,s.background=t,s.environment=i,x.addComponent(o.scene,s);const r=a=>{if(ii&&console.log(n,"CHANGED TO",a),a){if(typeof a!="string"){console.warn("Invalid attribute value for "+n);return}s.setSkybox(a)}else if(s.sourceId&&(i&&(o.sceneLighting.internalEnableReflection(s.sourceId)||(o.scene.environment=null)),t)){const l=o.lightmaps.tryGetSkybox(s.sourceId);o.scene.background=l}};return Bm(o.domElement,n,r),s.addEventListener("destroy",()=>{ii&&console.log("Destroyed attribute remote skybox",n),Fm(o.domElement,n,r)}),s.setSkybox(e)}const Lp=new Array;ue.registerCallback(de.ContextCreationStart,o=>{const e=o.context,t=e.domElement.getAttribute("background-image"),i=e.domElement.getAttribute("environment-image");if(t){ii&&console.log("Creating RemoteSkybox to load background "+t);const n=R1(e,t,!0,!1,"background-image");n&&Lp.push(n)}if(i){ii&&console.log("Creating RemoteSkybox to load environment "+i);const n=R1(e,i,!1,!0,"environment-image");n&&Lp.push(n)}}),ue.registerCallback(de.ContextCreationStart,()=>Promise.all(Lp).finally(()=>{Lp.length=0}));const la=class extends R{url="studio";allowDrop=!0;background=!0;environment=!0;allowNetworking=!0;_prevUrl;_prevLoadedEnvironment;_prevEnvironment=null;_prevBackground=null;onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,hi.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),this.context.mainCameraComponent?.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):ii&&console.warn(`RemoteSkybox: Not setting skybox: ${this.url} is not a remote texture. If you want to set a local texture, set allowNetworking to false.`))}async setSkybox(o,e){if(!this.activeAndEnabled||(o=E2(o,this.environment,this.background),!o))return!1;if(e??=o,this.isValidTextureType(e)||console.warn('Potentially invalid skybox URL: "'+e+'" on '+(this.name||this.gameObject?.name||"context")),ii&&console.log("Set RemoteSkybox url: "+o),this._prevUrl===o&&this._prevLoadedEnvironment)return this.apply(),!0;this._prevLoadedEnvironment?.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=o;const t=await k1(o,this.context.renderer);return t?!this.enabled||this.destroyed?(ii&&console.warn("RemoteSkybox: Component is disabled or destroyed"),!1):this._prevUrl!==o?(ii&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1):(this.url=o,this._prevLoadedEnvironment=t,this.apply(),!0):(ii&&console.warn("RemoteSkybox: Failed to load texture from url",o),!1)}apply(){const o=this._prevLoadedEnvironment;if(o&&(o instanceof ab||o instanceof RC||o.mapping==db||(o.mapping=TC,o.needsUpdate=!0),!this.destroyed)){if(!this.context){console.warn("RemoteSkybox: Context is not available - can not apply skybox.");return}this.context.scene.background!==o&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==o&&(this._prevEnvironment=this.context.scene.environment),ii&&console.log("Set RemoteSkybox ("+(this.environment&&this.background?"environment and background":this.environment?"environment":this.background?"background":"none")+")",this.url,!hi.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=o),this.background&&!hi.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=o),this.context.mainCameraComponent?.backgroundBlurriness!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness)}}validProtocols=["file:","blob:","data:"];validTextureTypes=[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"];isRemoteTexture(o){return o.startsWith("http://")||o.startsWith("https://")}isValidTextureType(o){for(const e of this.validTextureTypes)if(o.includes(e))return!0;for(const e of this.validProtocols)if(o.startsWith(e))return!0;return!1}registerDropEvents(){this.unregisterDropEvents(),this.context.domElement.addEventListener("dragover",this.onDragOverEvent),this.context.domElement.addEventListener("drop",this.onDrop)}unregisterDropEvents(){this.context.domElement.removeEventListener("dragover",this.onDragOverEvent),this.context.domElement.removeEventListener("drop",this.onDrop)}onDragOverEvent=o=>{if(this.allowDrop&&o.dataTransfer)for(const e of o.dataTransfer.types)(e==="text/uri-list"||e==="Files")&&o.preventDefault()};onDrop=o=>{if(this.allowDrop&&o.dataTransfer){for(const e of o.dataTransfer.types)if(ii&&console.log(e),e==="text/uri-list"){const t=o.dataTransfer.getData(e);ii&&console.log(e,t);let i=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(t)?.groups?.name;if(i||(i=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(t)?.groups?.name),ii&&console.log(i),i){const n="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+i+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${n}`),o.preventDefault(),this.setSkybox(n);break}else if(this.isValidTextureType(t)){console.log("[Remote Skybox] Setting skybox from url: "+t),o.preventDefault(),this.setSkybox(t);break}else{console.warn(`[RemoteSkybox] Unknown url ${t}. If you want to load a skybox from a url, make sure it is a valid image url. Url must end with${this.validTextureTypes.join(", ")}.`);const n=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:o,url:t,apply:s=>{o.preventDefault(),this.setSkybox(s)}}});this.dispatchEvent(n)}}else if(e=="Files"){const t=o.dataTransfer.files.item(0);if(ii&&console.log(e,t),!t)continue;if(!this.isValidTextureType(t.name)){console.warn(`[RemoteSkybox]: File "${t.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}o.preventDefault(),this.setSkybox(t.name);break}}}};Ih([Sy(la.prototype.urlChangedSyncField),u(URL)],la.prototype,"url"),Ih([u()],la.prototype,"allowDrop"),Ih([u()],la.prototype,"background"),Ih([u()],la.prototype,"environment"),Ih([u()],la.prototype,"allowNetworking");let jp=la;function E2(o,e,t){if(o==null)return null;const i=e&&!t,n=M1[o.toLowerCase()];return n?i?n.url_low:n.url:(typeof o=="string"&&o?.length&&(A()||ii)&&!o.startsWith("http")&&!o.startsWith("file:")&&!o.startsWith("blob:")&&!o.startsWith("data:")&&console.warn(`RemoteSkybox: Unknown magic skybox name "${o}". Valid names are: ${Object.keys(M1).map(s=>`"${s}"`).join(", ")}`),o)}var A2=Object.defineProperty,Dp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&A2(e,t,n),n};const Lh=class wS extends R{target=null;followFactor=.1;rotateFactor=.1;positionAxes=Za.All;flipForward=!1;static _invertForward=new U().setFromAxisAngle(new b(0,1,0),Math.PI);_firstUpdate=!0;onBeforeRender(){this.updateNow(!1)}updateNow(e){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const t=J(this.target),i=this._firstUpdate||e?1:L.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&Za.X&&(n.x=L.lerp(n.x,t.x,i)),this.positionAxes&Za.Y&&(n.y=L.lerp(n.y,t.y,i)),this.positionAxes&Za.Z&&(n.z=L.lerp(n.z,t.z,i)),this.worldPosition=n}if(this.rotateFactor>0){const t=be(this.target);this.flipForward&&t.premultiply(wS._invertForward);const i=this._firstUpdate||e?1:L.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(t,i)}this._firstUpdate=!1}}};Dp([u(k)],Lh.prototype,"target"),Dp([u()],Lh.prototype,"followFactor"),Dp([u()],Lh.prototype,"rotateFactor"),Dp([u()],Lh.prototype,"positionAxes");let Bp=Lh;var I2=Object.defineProperty,jh=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&I2(e,t,n),n};const Dh=v("debugspatialtrigger"),T1=new ds,E1=new ds;function L2(o,e){return T1.mask=o,E1.mask=e,T1.test(E1)}class ho extends R{triggerMask=0;onEnter;onStay;onExit;start(){Dh&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of Fp.triggers)L2(e.triggerMask,this.triggerMask)&&e.test(this.gameObject)&&this.currentIntersected.push(e);for(let e=this.lastIntersected.length-1;e>=0;e--){const t=this.lastIntersected[e];this.currentIntersected.indexOf(t)<0&&(this.onExitTrigger(t),this.lastIntersected.splice(e,1))}for(const e of this.currentIntersected)this.lastIntersected.indexOf(e)<0&&this.onEnterTrigger(e),this.onStayTrigger(e);this.lastIntersected.length=0,this.lastIntersected.push(...this.currentIntersected)}currentIntersected=[];lastIntersected=[];onEnterTrigger(e){Dh&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){Dh&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}jh([u()],ho.prototype,"triggerMask"),jh([u(he)],ho.prototype,"onEnter"),jh([u(he)],ho.prototype,"onStay"),jh([u(he)],ho.prototype,"onExit");const A1=class am extends R{static triggers=[];triggerMask;boxHelper;start(){Dh&&console.log(this.name,this.triggerMask,this)}onEnable(){am.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,St),this.boxHelper?.showHelper(null,Dh))}onDisable(){am.triggers.splice(am.triggers.indexOf(this),1)}test(e){return this.boxHelper?this.boxHelper.isInBox(e)??!1:!1}raiseOnEnterEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof ho&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof ho&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof ho&&t.onExitTrigger(this)},!1)}};jh([u()],A1.prototype,"triggerMask");let Fp=A1;var j2=Object.defineProperty,D2=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&j2(e,t,n),n};const Bi=v("debugspectator");class Up extends R{cam=null;useKeys=!0;_mode=0;get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){return this._handler?.currentTarget!==void 0}isSpectatingUser(e){return this.target?.userId===e}isFollowedBy(e){return this.followers?.includes(e)}get followers(){return this._networking.followers}stopSpectating(){if(this.context.isInXR){this.followSelf();return}this.target=void 0}get localId(){return this.context.connection.connectionId??"local"}set target(e){if(this._handler){const t=this._handler.currentTarget?.userId,i=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&i?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,t)):this._handler.currentTarget!==e&&(this._handler.set(e),x.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,t))}}get target(){return this._handler?.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){return this.isSpectating&&this.target?.currentObject===this.context.players.getPlayerView(this.localId)?.currentObject}orbit=null;_handler;eventSub_WebXRRequestStartEvent=null;eventSub_WebXRStartEvent=null;eventSub_WebXREndEvent=null;_debug;_networking;awake(){if(this._debug=new U2(this.context,this),this._networking=new V2(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,hi),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new B2(this.context,this.cam,this)),this.orbit=x.getComponent(this.context.mainCamera,me)}onDestroy(){this.stopSpectating(),this._handler?.destroy(),this._networking?.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows|MacOS/.test(e),i=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!i}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(Bi&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){this.context.removeCamera(this.cam),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._handler?.set(void 0),this._handler?.disable(),this.isSpectatingSelf&&this.stopSpectating()}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,ws.Headset),this.target=this.context.players.getPlayerView(this.localId)),Bi&&console.log("Follow self",this.target)}onAfterRender(){if(!this.cam)return;const e=this.context.renderer,t=e.xr.enabled;if(!e.xr.isPresenting&&!this._handler?.currentTarget)return;this._handler?.update(this._mode);const i=e.getRenderTarget();let n=null;const s=e.state;if(!i){if(!e.state.bindFramebuffer||!s.bindXRFramebuffer)return;n=e._framebuffer,s.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const r=this.context.mainCameraComponent;if(r){const c=r.backgroundColor;c&&e.setClearColor(c,c.alpha),this.cam.backgroundColor=c,this.cam.clearFlags=r.clearFlags,this.cam.nearClipPlane=r.nearClipPlane,this.cam.farClipPlane=r.farClipPlane}else e.setClearColor(new ne(1,1,1));e.setRenderTarget(null),e.xr.enabled=!1;const a=this.cam?.threeCamera;this.context.updateAspect(a);const l=e.xr.isPresenting;e.xr.isPresenting=!1,e.setSize(this.context.domWidth,this.context.domHeight),e.render(this.context.scene,a),e.xr.isPresenting=l,e.xr.enabled=t,i?e.setRenderTarget(i):s.bindXRFramebuffer&&s.bindXRFramebuffer(n),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of Ie.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=eo.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?eo.FirstPerson:eo.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const s of n)s.UpdateVisible(i)}}resetAvatarFlags(){for(const e of Ie.instances)if(e.avatar&&"flags"in e.avatar){const t=e.avatar.flags;if(!t)continue;for(const i of t)"isLocalAvatar"in e.avatar&&e.avatar?.isLocalAvatar?i.UpdateVisible(eo.FirstPerson):i.UpdateVisible(eo.ThirdPerson)}}}D2([u()],Up.prototype,"useKeys");class B2{context;cam;spectator;follow;target;view;currentObject;get currentTarget(){return this.view}constructor(e,t,i){this.context=e,this.cam=t,this.spectator=i}set(e){const t=e?.currentObject;if(!t){this.spectator.stopSpectating();return}t!==this.currentObject&&(this.currentObject=t,this.view=e,this.follow||(this.follow=x.addComponent(this.cam.gameObject,Bp)),this.target||(this.target=new k),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,Bi&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){Bi&&console.log("STOP FOLLOW",this.currentObject),this.view=void 0,this.currentObject=void 0,this.context.removeCamera(this.cam),this.follow&&(this.follow.enabled=!1)}destroy(){this.target?.removeFromParent(),this.follow&&x.destroy(this.follow)}update(e){if(this.currentTarget?.isConnected===!1||this.currentTarget?.removed===!0){Bi&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(Bi&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const t=this.context.mainCamera;if(t){const n=this.cam.threeCamera;(n.near!==t.near||n.far!==t.far)&&(n.near=t.near,n.far=t.far,n.updateProjectionMatrix())}const i=this.follow?.target;if(!(!i||!this.follow)){switch(e){case 0:this.view?.viewDevice!==ws.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),i.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,i.position.set(0,.5,1.5);break}this.follow.flipForward=!1,this.view?.viewDevice!==ws.Browser?i.quaternion.copy(F2):i.quaternion.identity()}}}const F2=new U().setFromAxisAngle(new b(0,1,0),Math.PI);class U2{context;spectator;constructor(e,t){this.context=e,this.spectator=t,console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode."),this.context.domElement.addEventListener("keydown",n=>{!this.spectator.useKeys||n.key==="Escape"&&this.spectator.stopSpectating()});let i=0;this.context.input.addEventListener(Ee.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(Ee.PointerUp,n=>{const s=this.context.time.time-i;s>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&s<.3&&this.trySelectObject()})}trySelectObject(){const e=new bs;e.setMask(16777215);const t=this.context.physics.raycast(e);if(Bi&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,s=x.getComponentInParent(n,Ie),r=s?.connectionId;if(r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,Bi&&console.log("spectate",r,s);break}}}}class z2{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class N2{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class V2{followers=[];context;spectator;_followerEventMethod;_requestFollowMethod;_joinedRoomMethod;constructor(e,t){this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(te.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(te.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(Bi&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const i=e?.userId===void 0,n=i?t:e?.userId,s=new z2(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",s)}}onRequestFollowMe(e=!1){if(Bi&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,i=new N2(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){v("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(Bi&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const n=this.followers.indexOf(i);n!==-1&&(this.followers.splice(n,1),this.removeDisconnectedFollowers(),console.log(i,"unfollows you",this.followers.length))}else this.followers.includes(i)||(this.followers.push(i),this.removeDisconnectedFollowers(),console.log(i,"follows you",this.followers.length))}removeDisconnectedFollowers(){for(let e=this.followers.length-1;e>=0;e--){const t=this.followers[e];this.context.connection.userIsInRoom(t)===!1&&this.followers.splice(e,1)}}_lastRequestFollowUser;onRequestFollowEvent(e){if(this._lastRequestFollowUser=e,e.userId===this.context.connection.connectionId)this.spectator.stopSpectating();else if(e.userId===void 0)this.spectator.stopSpectating();else{const t=this.context.players.getPlayerView(e.userId);if(t)this.spectator.target=t;else return Bi&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}_enforceFollowInterval;enforceFollow(){this._enforceFollowInterval||(this._enforceFollowInterval=setInterval(()=>{this._lastRequestFollowUser===void 0||this._lastRequestFollowUser.userId&&this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)?(clearInterval(this._enforceFollowInterval),this._enforceFollowInterval=void 0):(Bi&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}var W2=Object.defineProperty,$2=Object.getOwnPropertyDescriptor,Il=(o,e,t,i)=>{for(var n=i>1?void 0:i?$2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&W2(e,t,n),n};const I1=v("debugsplines");class uo{position=new b;rotation=new U;tangentIn=new b;tangentOut=new b}Il([qe(b)],uo.prototype,"position",2),Il([qe(U)],uo.prototype,"rotation",2),Il([qe(b)],uo.prototype,"tangentIn",2),Il([qe(b)],uo.prototype,"tangentOut",2);class ca extends R{addKnot(e){if(e instanceof uo)this.spline.push(e),this._isDirty=!0;else{const t=new uo;t.position.copy(e.position),this.spline.push(t),this._isDirty=!0}return this}removeKnot(e){if(typeof e=="number")this.spline.splice(e,1),this._isDirty=!0;else{const t=this.spline.indexOf(e);t!==-1&&(this.spline.splice(t,1),this._isDirty=!0)}return this}getPointAt(e,t){if(!this.curve)return new b;const i=this.curve.getPointAt(L.clamp01(e),t),n=this.gameObject.matrixWorld??void 0;return n&&i.applyMatrix4(n),i}markDirty(){this._isDirty=!0}getTangentAt(e,t){if(!this.curve)return t??new b;const i=this.gameObject.worldQuaternion;return this.curve.getTangentAt(L.clamp01(e),t).applyQuaternion(i)}set closed(e){this._closed=e,this._isDirty=!0}get closed(){return this._closed}_closed=!1;spline=[];set debug(e){e&&!this._builtCurve&&this.buildCurve(),this._debugLine&&(this._debugLine.visible=e)}get curve(){return this._curve}get isDirty(){return this._isDirty}_isDirty=!1;_curve=null;_builtCurve=!1;_debugLine=null;awake(){I1&&(console.log(`[Spline] ${this.name}`,this),this.buildCurve())}update(){this._isDirty&&this.buildCurve(!0),this._debugLine&&this._debugLine.parent!==this.gameObject&&this.gameObject.add(this._debugLine)}buildCurve(e=!1){if(!(this._builtCurve&&!e)){if(this._builtCurve=!0,!this.spline){console.error("[Spline] Can not build curve, no spline data",this.name);return}this._isDirty=!1,this._curve=H2(this.spline,this.closed),this.buildDebugCurve()}}buildDebugCurve(){if(I1&&this.spline&&this._curve){this._debugLine?.removeFromParent(),this._debugLine=null;const e=new gm({color:6684927}),t=this.spline.length*10,i=this._curve.getPoints(t),n=new gn().setFromPoints(i);this._debugLine=new Oa(n,e),this.gameObject?.add(this._debugLine)}}}Il([qe()],ca.prototype,"closed",1),Il([qe(uo)],ca.prototype,"spline",2);function H2(o,e){const t=o.map(s=>new b(-s.position.x,s.position.y,s.position.z));t.length===1&&t.push(t[0]);const i=o.reduce((s,r)=>s+Math.abs(r.tangentOut.x)+Math.abs(r.tangentOut.y)+Math.abs(r.tangentOut.z),0)/o.length,n=L.remap(i,0,.3,0,.5);return new EC(t,e,"catmullrom",n)}var G2=Object.defineProperty,q2=Object.getOwnPropertyDescriptor,Ys=(o,e,t,i)=>{for(var n=i>1?void 0:i?q2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&G2(e,t,n),n};class an extends R{spline=null;object=void 0;useLookAt=!0;lookAt=null;clamp=!1;get position01(){return this._position01}set position01(e){this._position01=e,this._needsUpdate=!0}reset(){this._position01=0}autoRun=!0;duration=10;pullStrength=1;_position01=0;_needsUpdate=!1;start(){this.object===void 0&&(this.object=this.gameObject),this.updateFromPosition()}onEnable(){window.addEventListener("pointerdown",this.onUserInput,{passive:!0}),this.context.domElement.addEventListener("wheel",this.onUserInput,{passive:!0})}onDisable(){window.removeEventListener("pointerdown",this.onUserInput),this.context.domElement.removeEventListener("wheel",this.onUserInput)}onUserInput=()=>{this.object?.contains(this.context.mainCamera)&&(this._needsUpdate=!1,this._performedUpdates+=999)};update(){this.autoRun&&(this._needsUpdate=!0,this._position01+=this.context.time.deltaTime/this.duration),this._needsUpdate&&(this._needsUpdate=!1,this.updateFromPosition())}updateFromPosition(){if(!this.spline||!this.spline.curve||!this.object)return;this.clamp?this._position01=L.clamp01(this._position01):this._position01=this._position01%1;const e=this._position01>=1?1:this._position01%1,t=this.spline.getPointAt(e);if(this.pullStrength>=1)this.object.worldPosition=t;else if(this._position01!==this._lastPosition01&&(this._performedUpdates=0),this._requiredUpdates=Math.round(100/this.pullStrength),this._performedUpdates<this._requiredUpdates){const i=this.object.worldPosition;this._performedUpdates++;const n=L.clamp01(this.pullStrength),s=this.object.worldPosition=i.lerp(t,n*(this.context.time.deltaTime/.3));this._lastPositionVector.copy(s),this._needsUpdate=!0}if(this.useLookAt)if(this.lookAt)this.object.lookAt(this.lookAt.worldPosition);else{const i=this.spline.getTangentAt(e);this.object.lookAt(t.add(i))}this._lastPosition01=this._position01}_lastPosition01=0;_requiredUpdates=0;_performedUpdates=0;_lastPositionVector=new b}Ys([qe(ca)],an.prototype,"spline",2),Ys([qe(k)],an.prototype,"object",2),Ys([qe()],an.prototype,"useLookAt",2),Ys([qe(k)],an.prototype,"lookAt",2),Ys([qe()],an.prototype,"clamp",2),Ys([qe()],an.prototype,"position01",1),Ys([qe()],an.prototype,"autoRun",2),Ys([qe()],an.prototype,"duration",2);class bo{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new bo).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+Pb),(t||new bo).__init(e.readInt32(e.position())+e.position(),e)}userId(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}guid(e){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__string(this.bb_pos+t,e):null}dontSave(){const e=this.bb.__offset(this.bb_pos,8);return e?!!this.bb.readInt8(this.bb_pos+e):!1}pos(e){const t=this.bb.__offset(this.bb_pos,10);return t?(e||new Dr).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new Dr).__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 X2=Object.defineProperty,Q2=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&X2(e,t,n),n};const zp="SCAM";mg(zp,bo.getRootAsSyncedCameraModel);const Fi=new Rm;class Y2{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Fi.clear();const i=Fi.createString(this.guid),n=Fi.createString(this.userId);bo.startSyncedCameraModel(Fi),bo.addGuid(Fi,i),bo.addUserId(Fi,n);const s=J(e),r=jd(e);bo.addPos(Fi,Dr.createVec3(Fi,s.x,s.y,s.z)),bo.addRot(Fi,Dr.createVec3(Fi,r.x,r.y,r.z));const a=bo.endSyncedCameraModel(Fi);Fi.finish(a,zp),t.sendBinary(Fi.asUint8Array())}}}const L1=class Y0 extends R{static instances=[];getCameraObject(e){const t=this.userToCamMap[e];return t?this.remoteCams[t].obj:null}cameraPrefab=null;_lastWorldPosition;_lastWorldQuaternion;_model=null;_needsUpdate=!0;_lastUpdateTime=0;remoteCams={};userToCamMap={};_camTimeoutInSeconds=10;_receiveCallback=null;async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(zp,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(zp,this._receiveCallback)}update(){for(const n in this.remoteCams){const s=this.remoteCams[n],r=this.context.time.realtimeSinceStartup-s.lastUpdate;if(!s||r>this._camTimeoutInSeconds){A()&&console.log("Remote cam timeout",n),s?.obj&&x.destroy(s.obj),delete this.remoteCams[n],s&&delete this.userToCamMap[s.userId],Y0.instances.push(s),this.context.players.removePlayerView(s.userId,ws.Browser);continue}}if(this.context.isInXR)return;const e=this.context.mainCamera;if(e===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new Y2(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=J(e),i=be(e);(t.distanceTo(this._lastWorldPosition)>.001||i.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(t),this._lastWorldQuaternion.copy(i),!((!this._needsUpdate||this.context.time.frameCount%2!==0)&&!(this.context.time.realtimeSinceStartup-this._lastUpdateTime>this._camTimeoutInSeconds*.5))&&(this._lastUpdateTime=this.context.time.realtimeSinceStartup,this._needsUpdate=!1,this._model.send(e,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,e,ws.Browser))}onReceivedRemoteCameraInfoBin(e){const t=e.guid();if(!t)return;const i=e.userId();if(!i||!this.context.connection.userIsInRoom(i)||!this.cameraPrefab)return;let n=this.remoteCams[t];if(!n)if("isObject3D"in this.cameraPrefab){const l=new Bn;l.context=this.context;const c=x.instantiate(this.cameraPrefab,l);n=this.remoteCams[t]={obj:c,lastUpdate:this.context.time.realtimeSinceStartup,userId:i},n.obj.visible=!0,this.gameObject.add(c),this.userToCamMap[i]=t,Y0.instances.push(n);const h=x.getOrAddComponent(c,Ie);h.connectionId=i,h.avatar=c}else return;const s=n.obj;this.context.players.setPlayerView(i,s,ws.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,hn.markDirty(s);const r=e.pos();r&&mr(s,r.x(),r.y(),r.z());const a=e.rot();a&&sc(s,a.x(),a.y(),a.z())}};Q2([u([k,ie])],L1.prototype,"cameraPrefab");let _0=L1;var Z2=Object.defineProperty,K2=Object.getOwnPropertyDescriptor,Zs=(o,e,t,i)=>{for(var n=i>1?void 0:i?K2(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&Z2(e,t,n),n};const v0="view",w0=v("debugsyncedroom");class Ln extends R{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){return v(v0)||v(this.urlParameterName)}_lastJoinedRoom;set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}_roomPrefix="";awake(){this.joinRandomRoom===void 0&&this.roomName?.length<=0&&(this.joinRandomRoom=!0),w0&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=v(v0);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}if(this.tryJoinRoom(),this.createJoinButton){const t=this.createRoomButton();this.context.menu.appendChild(t)}this.createViewOnlyButton&&this.onEnableViewOnlyButton()}onDisable(){this._roomButton?.remove(),this.onDisableViewOnlyButton(),this.roomName&&this.roomName.length>0&&this.context.connection.leaveRoom(this.roomName)}onDestroy(){this.destroyRoomButton()}tryJoinRandomRoom(){this.setRandomRoomUrlParameter(),this.tryJoinRoom()}tryJoinRoom(e=0){e===void 0&&(e=0);let t=!1;if(this.urlParameterName?.length>0){const i=v(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=Fb(i.toString());this.roomName=n}else if(this.joinRandomRoom&&(console.log("No room name found in url, generating random one"),this.setRandomRoomUrlParameter(),e<1))return this.tryJoinRoom(e+1)}else this.joinRandomRoom&&(this.roomName===null||this.roomName===void 0||this.roomName.length<=0)&&(this.roomName=this.generateRoomName());return this.requireRoomParameter&&!t?((w0||A())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
1421
- To allow joining a room without a query parameter you can set "requireRoomParameter" to false.`),!1):(this.context.connection.isConnected||this.context.connection.connect(),this._lastJoinedRoom=this.roomName,this._roomPrefix&&(this.roomName=this._roomPrefix+this.roomName),this.roomName.length<=0?(console.warn(`[SyncedRoom] Room name is not set so we can not join a networked room.
1422
- Please choose one of the following options to fix this:
1423
- A) Set a room name in the SyncedRoom component
1424
- B) Set a room name in the URL parameter "?`+this.urlParameterName+`=my_room"
1425
- C) Set "joinRandomRoom" to true`),!1):(w0&&console.log("Join "+this.roomName),this._userWantsToBeInARoom=!0,this.context.connection.joinRoom(this.roomName),!0))}_lastPingTime=0;_lastRoomTime=-1;_userWantsToBeInARoom=!1;update(){this.context.connection.isConnected&&(this.context.time.time-this._lastPingTime>3&&(this._lastPingTime=this.context.time.time,this.context.connection.sendPing()),this.context.connection.isInRoom&&(this._lastRoomTime=this.context.time.time)),this._lastRoomTime>0&&this.context.time.time-this._lastRoomTime>.3&&(this._lastRoomTime=-1,this.autoRejoin?this._userWantsToBeInARoom&&(console.log("Disconnected from networking backend - attempt reconnecting now"),this.tryJoinRoom()):A()&&console.warn("You are not connected to a room anymore (possibly because the tab was inactive for too long and the server kicked you?)"))}getViewOnlyUrl(){if(this.context.connection.isConnected&&this.context.connection.currentRoomViewId){const e=window.location.search,t=new URLSearchParams(e);return t.has(this.urlParameterName)&&t.delete(this.urlParameterName),t.set(v0,this.context.connection.currentRoomViewId),window.location.origin+window.location.pathname+"?"+t.toString()}return null}setRandomRoomUrlParameter(){const e=Jl(),t=this.generateRoomName();v(this.urlParameterName)?e.set(this.urlParameterName,t):e.append(this.urlParameterName,t),jm(t,e)}generateRoomName(){let e="";for(let t=0;t<6;t++)e+=Math.floor(Math.random()*10).toFixed(0);return e}_roomButton;_roomButtonIconJoin;_roomButtonIconLeave;createRoomButton(){if(this._roomButton)return this._roomButton;const e=document.createElement("button");return this._roomButton=e,e.classList.add("create-room-button"),e.setAttribute("priority","90"),e.onclick=()=>{if(this.context.connection.isInRoom)this.urlParameterName&&ec(this.urlParameterName,null),this.context.connection.leaveRoom(),this._userWantsToBeInARoom=!1;else{if(this.urlParameterName){const t=v(this.urlParameterName);(!t||t===!0)&&(this._lastJoinedRoom?ec(this.urlParameterName,this._lastJoinedRoom):this.setRandomRoomUrlParameter())}this.tryJoinRoom()}},this._roomButtonIconJoin=Pt("group"),this._roomButtonIconLeave=Pt("group_off"),this.updateRoomButtonState(),this.context.connection.beginListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.beginListen(te.LeftRoom,this.updateRoomButtonState),e}updateRoomButtonState=()=>{this._roomButton&&(this.context.connection.isInRoom?(this._roomButton.title="Leave the networked room",this._roomButton.textContent="Leave Room",this._roomButtonIconJoin?.remove(),this._roomButton.prepend(this._roomButtonIconLeave)):(this._roomButton.title="Create or join a networked room",this._roomButton.textContent="Join Room",this._roomButtonIconLeave?.remove(),this._roomButton.prepend(this._roomButtonIconJoin)))};destroyRoomButton(){this.context.connection.stopListen(te.JoinedRoom,this.updateRoomButtonState),this.context.connection.stopListen(te.LeftRoom,this.updateRoomButtonState)}_viewOnlyButton;onEnableViewOnlyButton(){this.context.connection.isConnected?this.onCreateViewOnlyButton():(this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this.context.connection.beginListen(te.JoinedRoom,this.onCreateViewOnlyButton))}onDisableViewOnlyButton(){this.context.connection.stopListen(te.JoinedRoom,this.onCreateViewOnlyButton),this._viewOnlyButton?.remove()}onCreateViewOnlyButton=()=>{if(!this._viewOnlyButton){const e=document.createElement("button");this._viewOnlyButton=e,e.classList.add("view-only-button"),e.setAttribute("priority","90"),e.onclick=()=>{const t=this.getViewOnlyUrl();t?.length?navigator.canShare({url:t})?navigator.share({url:t})?.catch(i=>{console.warn(i)}):(navigator.clipboard.writeText(t),Te("View only URL copied to clipboard")):ye("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)}}Zs([u()],Ln.prototype,"roomName",2),Zs([u()],Ln.prototype,"urlParameterName",2),Zs([u()],Ln.prototype,"joinRandomRoom",2),Zs([u()],Ln.prototype,"requireRoomParameter",2),Zs([u()],Ln.prototype,"autoRejoin",2),Zs([u()],Ln.prototype,"createJoinButton",2),Zs([u()],Ln.prototype,"createViewOnlyButton",2),Zs([u()],Ln.prototype,"roomPrefix",1);function J2(){const o=v("testwindowcount")||0;o&&o>0&&eI(o)}function eI(o){if(v("testwindow"))return null;const e=new URL(window.location.href);Lm(e.searchParams,qR,1),Lm(e.searchParams,"testwindow",1);const t=e.toString(),i=[];window.onbeforeunload=()=>{for(const l of i)l.close()};const n=.05,s=128;let r=0,a=0;for(let l=0;l<o;l++){r*s+s*.01>=window.innerWidth&&(a+=1,r=0);const c=r*(s*(1+n))+window.screenLeft,h=a*(s*(1+n))+window.screenTop+90+60*a;r+=1;const d=window.open(t,"test window "+l,`popup=yes width=${s} height=${s} top=${h} left=${c}`);if(!d){console.warn("Failed to open window");continue}i.push(d),d.onload=()=>{d.onbeforeunload=()=>{for(let p=0;p<i.length;p++){const m=i[p];m!==d&&m.close()}i.length=0}}}return i}class x0 extends R{awake(){J2()}}class S0 extends R{transformsPerFrame=10;interval=0;useFlatbuffers=!0;awake(){if(this.useFlatbuffers)this.context.connection.beginListenBinary(Fc,e=>{});else{this.models=[];for(let e=0;e<this.transformsPerFrame;e++)this.models.push(new tI(this.context.connection.connectionId+"_simulatedTransform_"+e,this))}}builder=null;models=null;update(){if(this.context.connection.isConnected){if(this.useFlatbuffers){if(!this.context.connection.connectionId||this.context.time.frameCount%this.interval!==0)return;this.builder===null&&(this.builder=new Rm(1024));const e=this.builder;for(let t=0;t<this.transformsPerFrame;t++){e.clear();const i=Dw(this.context.connection.connectionId,this);this.context.connection.sendBinary(i)}}else if(this.models)for(let e=0;e<this.models.length;e++){const t=this.models[e];t.dontSave=!0,t.update(this,null),this.context.connection.send("TestSimulateUserData-"+e,t)}}}}class tI{guid;fast=!1;position;rotation;velocity=void 0;dontSave;isValid(){return this.fast!==void 0||this.position!==void 0||this.rotation!==void 0||this.velocity!==void 0}constructor(e,t){this.guid=e,this.position={x:0,y:0,z:0},this.rotation={x:0,y:0,z:0,w:0},this.update(t,null)}static temp=new b;update(e,t){const i=e.worldPosition;this.position.x=i.x,this.position.y=i.y,this.position.z=i.z;const n=e.worldQuaternion;if(this.rotation.x=n.x,this.rotation.y=n.y,this.rotation.z=n.z,this.rotation.w=n.w,this.fast=!1,t){const s=t.getVelocity();this.velocity===void 0&&(this.velocity={x:0,y:0,z:0}),this.velocity.x=s.x,this.velocity.y=s.y,this.velocity.z=s.z}}}var iI=Object.defineProperty,Np=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&iI(e,t,n),n};const nI=v("debugsignals");class Vp{guid}Np([u()],Vp.prototype,"guid");class Bh{signal;reaction}Np([u(Vp)],Bh.prototype,"signal"),Np([u(he)],Bh.prototype,"reaction");const j1=class ss extends R{static receivers={};static invoke(e){if(ss.receivers[e]){const t=ss.receivers[e];if(!t)return;for(const i of t)i.invoke(e)}}events;awake(){nI&&console.log("SignalReceiver awake",this)}onEnable(){if(this.events)for(const e of this.events)ss.receivers[e.signal.guid]||(ss.receivers[e.signal.guid]=[]),ss.receivers[e.signal.guid].push(this)}onDisable(){if(this.events){for(const e of this.events)if(ss.receivers[e.signal.guid]){const t=ss.receivers[e.signal.guid].indexOf(this);t>=0&&ss.receivers[e.signal.guid].splice(t,1)}}}invoke(e){if(!this.events||!Array.isArray(this.events))return;const t=typeof e=="object"?e.guid:e;for(const i of this.events)if(i.signal.guid===t)try{if(i.reaction){if(!i.reaction.invoke){console.warn("Missing invoke - possibly a serialization error",i,this);continue}}else{console.warn("Missing reaction for signal",i,this);continue}i.reaction.invoke()}catch(n){console.error(n)}}};Np([u(Bh)],j1.prototype,"events");let Fh=j1;var Ui=(o=>(o.Activation="ActivationTrack",o.Animation="AnimationTrack",o.Audio="AudioTrack",o.Control="ControlTrack",o.Marker="MarkerTrack",o.Signal="SignalTrack",o))(Ui||{}),po=(o=>(o[o.None=0]="None",o[o.Hold=1]="Hold",o[o.Loop=2]="Loop",o[o.PingPong=3]="PingPong",o[o.Continue=4]="Continue",o))(po||{}),C0=(o=>(o.Signal="SignalEmitter",o))(C0||{});const mo=v("debugtimeline");class Ll{director;track;get muted(){return this.track.muted}set muted(e){e!==this.track.muted&&(this.track.muted=e,this.onMuteChanged?.call(this))}*forEachClip(e=!1){if(this.track?.clips)if(e)for(let t=this.track.clips.length-1;t>=0;t--)yield this.track.clips[t];else for(const t of this.track.clips)yield t}getClipTime(e,t){return t.clipIn+(e-t.start)*t.timeScale}getClipTimeNormalized(e,t){return(e-t.start)/t.duration}evaluateWeight(e,t,i,n=!0){if(t<0||t>=i.length)return 0;const s=i[t];if(n||e>=s.start&&e<=s.end){let r=1;if(s.easeInDuration>0){const a=Math.min((e-s.start)/s.easeInDuration,1);r*=a}if(s.easeOutDuration>0){const a=Math.min((s.end-e)/s.easeOutDuration,1);r*=a}return r}return 0}}class oI{clip;rootPositionOffset;rootQuaternionOffset;get hasOffsets(){return this.rootPositionOffset!==void 0||this.rootQuaternionOffset!==void 0}rootStartPosition;rootEndPosition;rootStartQuaternion;rootEndQuaternion;constructor(e){const t=e.getClip();this.clip=t;const i=e.getRoot(),n=i.name+".position",s=i.name+".quaternion";mo&&console.log(t.name,t.tracks,n);for(const r of t.tracks)if(!(r.times.length<=0)){if(r.name.endsWith(n))this.rootStartPosition=new b().fromArray(r.values,0),this.rootEndPosition=new b().fromArray(r.values,r.values.length-3),this.rootPositionOffset=this.rootEndPosition.clone().sub(this.rootStartPosition),mo&&console.log(this.rootPositionOffset);else if(r.name.endsWith(s)&&(this.rootStartQuaternion=new U().fromArray(r.values,0),this.rootEndQuaternion=new U().fromArray(r.values,r.values.length-4),this.rootQuaternionOffset=this.rootEndQuaternion.clone().multiply(this.rootStartQuaternion),mo)){const a=new ot().setFromQuaternion(this.rootQuaternionOffset);console.log("ROT",a)}}}}class Uh extends Ll{models=[];trackOffset;target;mixer;clips=[];actions=[];weight=1;_actionOffsets=[];_didBind=!1;_animator=null;onDisable(){this.mixer?.stopAllAction()}onDestroy(){this.director.context.animations.unregisterAnimationMixer(this.mixer)}onStateChanged(){this._animator&&Tw(this._animator.gameObject,this,this.director.enabled&&this.director.weight>0)}createHooks(e,t){if(t.tracks?.length<=0){console.warn("No tracks in AnimationClip",t);return}let i=!1,n=!1;const s=t.tracks.find(r=>r.name.includes(".position")||r.name.includes(".quaternion"))?.name.split(".");if(s){const r=s[s.length-2],a=r+".position",l=r+".quaternion";for(const c of t.tracks)!i&&c.name.endsWith(a)?(i=!0,this.createPositionInterpolant(t,e,c)):!n&&c.name.endsWith(l)&&(n=!0,this.createRotationInterpolant(t,e,c))}if(!i||!n){const r=this.mixer?.getRoot(),a=t.tracks[0],l=a.name.lastIndexOf("."),c=a.name.substring(0,l),h=c.substring(c.lastIndexOf(".")+1),d=r.getObjectByName(h);if(d)if(i){if(!n){const p=t.tracks[0].name.substring(0,l)+".quaternion";mo&&console.warn("Create quaternion track",h,d);const m=new IC(p,[0,t.duration],[0,0,0,1,0,0,0,1]);t.tracks.push(m),this.createRotationInterpolant(t,e,m)}}else{const p=c+".position";mo&&console.warn("Create position track",h,d);const m=new AC(p,[0,t.duration],[0,0,0,0,0,0]);t.tracks.push(m),this.createPositionInterpolant(t,e,m)}}}bind(){if(!this._didBind){this._didBind=!0,mo&&console.log(this.models),this.mixer?this.target=this.mixer.getRoot():console.warn("No mixer was assigned to animation track");for(const e of this.actions){const t=new oI(e);this._actionOffsets.push(t)}this.target&&(this._animator=x.getComponent(this.target,yt)??null,this._animator&&Tw(this._animator.gameObject,this,!0));for(const e of this.models){const t=e.asset,i=t.position,n=t.rotation;i&&i.x!==void 0&&(i.isVector3||(t.position=new b(i.x,i.y,i.z)),n.isQuaternion||(t.rotation=new U(n.x,n.y,n.z,n.w)))}this.ensureTrackOffsets()}}ensureTrackOffsets(){if(this.trackOffset){const e=this.trackOffset.position;e&&(e.isVector3||(this.trackOffset.position=new b(e.x,e.y,e.z)));const t=this.trackOffset.rotation;t&&(t.isQuaternion||(this.trackOffset.rotation=new U(t.x,t.y,t.z,t.w)))}}_useclipOffsets=!0;_totalOffsetPosition=new b;_totalOffsetRotation=new U;_totalOffsetPosition2=new b;_totalOffsetRotation2=new U;_summedPos=new b;_tempPos=new b;_summedRot=new U;_tempRot=new U;_clipRotQuat=new U;evaluate(e){if(this.track.muted||!this.mixer)return;this.bind(),this._totalOffsetPosition.set(0,0,0),this._totalOffsetRotation.set(0,0,0,1),this._totalOffsetPosition2.set(0,0,0),this._totalOffsetRotation2.set(0,0,0,1);let t=0,i=0,n=!1,s=!1,r=0;for(let a=0;a<this.clips.length;a++){const l=this.models[a],c=this.actions[a],h=l.asset;c.weight=0;const d=e>=l.start&&e<=l.end,p=l.preExtrapolationMode,m=l.postExtrapolationMode,f=a<this.clips.length-1?this.models[a+1]:null;let g=d,y=!1;if(!g&&!n&&l.end<e&&m!==po.None?(!f||f.start>e)&&(g=!0,n=!0):a==0&&!g&&!s&&l.start>e&&p!==po.None&&(!f||f.start<e)&&(g=!0,y=!0,s=!0),g){let _=this.weight;_*=this.evaluateWeight(e,a,this.models,g),_*=this.director.weight;let w=d;if(y)switch(p){case po.Hold:break;case po.Loop:e+=l.start,w=!0;break;default:e+=l.start,w=!0;break}let P=this.getClipTime(e,l),M=0;const O=h.duration;if(y&&p===po.Hold&&(P=0),w){if(h.loop)for(M+=Math.floor(P/(O+1e-6));P>O;)P-=O}else if(!d&&n)switch(m){case po.Hold:P=this.getClipTime(l.end,l);break;case po.Loop:P%=O;break;case po.PingPong:const I=Math.floor(P/O)%2!==0;P%=O,I&&(P=O-P);break}l.reversed===!0?c.time=c.getClip().duration-P:c.time=P,c.timeScale=0;const j=Math.max(0,_);if(c.weight=j,r+=j,c.clampWhenFinished=!1,c.isRunning()||c.play(),this._useclipOffsets){const I=t==0?this._totalOffsetPosition:this._totalOffsetPosition2,N=t==0?this._totalOffsetRotation:this._totalOffsetRotation2;t<1&&(i=1-_),t+=1;const V=this._summedPos.set(0,0,0),H=this._tempPos.set(0,0,0),X=this._summedRot.identity(),T=this._tempRot.identity(),$=h.rotation;$&&(this._clipRotQuat.identity(),this._clipRotQuat.slerp($,_));const W=this._actionOffsets[a];if(W.hasOffsets)for(let se=0;se<M;se++)W.rootPositionOffset?H.copy(W.rootPositionOffset):H.set(0,0,0),H.applyQuaternion(X),this._clipRotQuat&&H.applyQuaternion(this._clipRotQuat),W.rootQuaternionOffset&&(T.copy(W.rootQuaternionOffset),X.multiply(T)),V.add(H);this._clipRotQuat&&N.multiply(this._clipRotQuat),N.multiply(X),h.position&&V.add(h.position),I.add(V)}}}if(this._useclipOffsets&&(this._totalOffsetPosition.lerp(this._totalOffsetPosition2,i),this._totalOffsetRotation.slerp(this._totalOffsetRotation2,i)),this.__mixerError===void 0&&(mo||A())&&this._animator?.runtimeAnimatorController?.mixer&&this.mixer!==this._animator?.runtimeAnimatorController?.mixer&&(this.__mixerError=!0,console.error("AnimationTrack mixer is not shared with the animator controller - this might result in the timeline to not animate properly. Please report a bug to the Needle Engine team!",this)),this._animator?.runtimeAnimatorController){const a=Math.max(0,1-r);this._animator?.runtimeAnimatorController?.update(a)}else this.mixer.update(e)}createRotationInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new U;this.ensureTrackOffsets();const r=this.trackOffset?.rotation;i.createInterpolant=()=>{const a=n(),l=a.evaluate.bind(a);return a.evaluate=c=>{const h=l(c);if(s.set(h[0],h[1],h[2],h[3]),s.premultiply(this._totalOffsetRotation),r&&s.premultiply(r),this.director.animationCallbackReceivers)for(const d of this.director.animationCallbackReceivers)d?.onTimelineRotation?.call(d,this.director,this.target,c,s);return h[0]=s.x,h[1]=s.y,h[2]=s.z,h[3]=s.w,h},a}}createPositionInterpolant(e,t,i){const n=i.createInterpolant.bind(i),s=new b;this.ensureTrackOffsets();const r=this.trackOffset?.rotation,a=this.trackOffset?.position;let l;i.createInterpolant=()=>{const c=n(),h=c.evaluate.bind(c);return c.evaluate=d=>{const p=h(d);if(s.set(p[0],p[1],p[2]),t.removeStartOffset&&(l===void 0?(l=null,l=this._actionOffsets.find(m=>m.clip===e)?.rootStartPosition?.clone()):l?.isVector3&&s.sub(l)),s.applyQuaternion(this._totalOffsetRotation),s.add(this._totalOffsetPosition),r&&s.applyQuaternion(r),a&&(s.x-=a.x,s.y+=a.y,s.z+=a.z),this.director.animationCallbackReceivers)for(const m of this.director.animationCallbackReceivers)m?.onTimelinePosition?.call(m,this.director,this.target,d,s);return p[0]=s.x,p[1]=s.y,p[2]=s.z,p},c}}}const sI=v("mutetimeline");class cs extends Ll{models=[];listener;audio=[];audioContextTimeOffset=[];lastTime=0;audioSource;_audioLoader=null;getAudioFilePath(e){const t=this.director.sourceId;return ms(t,e)}onAllowAudioChanged(e){for(let t=0;t<this.models.length;t++){const i=this.models[t];this.audio[t].setVolume(e?i.asset.volume:0)}}addModel(e){const t=new LC(this.listener);this.audio.push(t);const i=e;i._didTriggerPlay=!1,this.models.push(i)}onDisable(){for(const e of this.audio)e.isPlaying&&e.stop();for(const e of this.models)e._didTriggerPlay=!1}onDestroy(){for(const e of this.audio)e.source&&e?.disconnect();this.audio.length=0}onMuteChanged(){if(this.muted)for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}}stop(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}for(const e of this.models)e._didTriggerPlay=!1}_playableDirectorResumed=!1;onPauseChanged(){for(let e=0;e<this.audio.length;e++){const t=this.audio[e];t?.isPlaying&&t.stop()}this._playableDirectorResumed=this.director.isPlaying}evaluate(e){if(sI||this.track.muted||this.director.speed<0)return;const t=this.director.context.application.muted,i=this._playableDirectorResumed;this._playableDirectorResumed=!1;const n=t?.1:0;for(let s=0;s<this.models.length;s++){const r=this.models[s],a=this.audio[s],l=r.asset;if((!a||!a.buffer)&&this.isInTimeRange(r,e-1,e+1)&&this.handleAudioLoading(r,a),Ai.userInteractionRegistered!==!1&&!(a===null||!a.buffer))if(a.playbackRate=this.director.context.time.timeScale*this.director.speed,a.loop=l.loop,e>=r.start&&e<=r.end&&e<this.director.duration){if(!a.isPlaying||!this.director.isPlaying)(i||!r._didTriggerPlay&&this.lastTime<e)&&(r.duration*r.timeScale>.3?a.offset=r.clipIn+(e-r.start)*r.timeScale:a.offset=0,mo&&console.log("Timeline Audio ("+this.track.name+") play with offset "+a.offset+" - "+r.asset.clip),a.play(n),r._didTriggerPlay=!0);else{const h=r.clipIn+(e-r.start)*r.timeScale,d=a.context.currentTime-a._startedAt+a.offset;Math.abs(h-d)>.3&&(a.offset=h,a.stop(),a.play(n))}let c=l.volume;if(this.track.volume!==void 0&&(c*=this.track.volume),t&&(c=0),r.easeInDuration>0){const h=Math.min((e-r.start)/r.easeInDuration,1);c*=h}if(r.easeOutDuration>0){const h=Math.min((r.end-e)/r.easeOutDuration,1);c*=h}a.setVolume(c*this.director.weight)}else r._didTriggerPlay=!1,this.director.isPlaying&&a.isPlaying&&a.stop()}this.lastTime=e}loadAudio(e,t=0,i=0){let n=null;const s=e-i,r=e+t;for(const a of this.models)if(this.isInTimeRange(a,s,r)){const l=this.audio[this.models.indexOf(a)],c=this.handleAudioLoading(a,l);c!==null&&(n===null&&(n=[]),n.push(c))}return n!==null?Promise.all(n):null}isInTimeRange(e,t,i){return t<=e.start&&i>=e.end||t>=e.start&&t<=e.end||i>=e.start&&i<=e.end}static _audioBuffers=new Map;static dispose(){cs._audioBuffers.clear()}handleAudioLoading(e,t){this._audioLoader||(this._audioLoader=new vm);const i=this.getAudioFilePath(e.asset.clip);if(cs._audioBuffers.get(i)){const s=cs._audioBuffers.get(i);return s.then(r=>{r&&t.setBuffer(r)}),s}mo&&console.warn("LOAD audio track",i,this.director.sourceId);const n=new Promise((s,r)=>{this._audioLoader.load(i,a=>{t.setBuffer(a),s(a)},void 0,a=>{console.error("Error loading audio",a),s(null)})});return cs._audioBuffers.set(i,n),n}}class Wp extends Ll{models=[];needsSorting=!0;*foreachMarker(e=null){this.needsSorting&&this.sort();for(const t of this.models)t&&t.type===e&&(yield t)}onEnable(){this.needsSorting=!0}evaluate(e){this.needsSorting&&this.sort()}sort(){this.needsSorting=!1,this.models.sort((e,t)=>e.time-t.time)}}class zh extends Ll{models=[];didTrigger=[];receivers=[];evaluate(e){if(this.track.muted)return;const t=this.director.context.time.deltaTime*1.5;for(let i=0;i<this.models.length;i++){const n=this.models[i],s=this.didTrigger[i],r=n.time-e;let a=!1;if(n.retroActive)a=r<=1e-6;else{const l=Math.abs(r);(l===0||l>=1e-5&&l<t)&&(a=!0)}if(a){if(!s)if(mo&&console.log("Trigger signal",e,n.time,n),this.didTrigger[i]=!0,this.receivers?.length<=0)Fh.invoke(n.asset);else for(const l of this.receivers)l&&l.invoke(n.asset)}else n.emitOnce||(this.didTrigger[i]=!1)}}}class $p extends Ll{models=[];timelines=[];resolveSourceObjects(e){for(let t=this.models.length-1;t>=0;t--){const i=this.models[t].asset;if(!i.sourceObject||typeof i.sourceObject!="object"){console.log("no source object, removing model",t,i),this.models.splice(t,1);continue}else{const n=x.getComponent(i.sourceObject,ha);this.timelines.push(n),n&&i.updateDirector&&(n.playOnAwake=!1)}}}_previousActiveModel=null;evaluate(e){this._previousActiveModel=null;for(let t=0;t<this.models.length;t++){const i=this.models[t],n=i.asset;if(e>=i.start&&e<=i.end){this._previousActiveModel=i;const s=this.getClipTime(e,i);if(n.controlActivation){const r=n.sourceObject;r.visible=!0}if(n.updateDirector){const r=this.timelines[t];r&&(r.isPlaying&&r.pause(),r.time=s,r.evaluate())}}else{const s=this._previousActiveModel?.asset;if(n.controlActivation){const r=n.sourceObject;s?.sourceObject!==r&&(r.visible=!1)}}}}}var rI=Object.defineProperty,D1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&rI(e,t,n),n};const jn=v("debugtimeline"),P0=class Z0 extends R{static createTrackFunctions={};static registerCreateTrack(e,t){this.createTrackFunctions[e]=t}playableAsset;playOnAwake;extrapolationMode=1;get isPlaying(){return this._isPlaying}get isPaused(){return this._isPaused}get time(){return this._time}set time(e){typeof e=="number"&&!Number.isNaN(e)?this._time=e:(jn||$i())&&console.error("INVALID TIMELINE.TIME VALUE",e,this.name)}get duration(){return this._duration}set duration(e){this._duration=e}get weight(){return this._weight}set weight(e){this._weight=e}get speed(){return this._speed}set speed(e){this._speed=e}waitForAudio=!0;_visibilityChangeEvt;_clonedPlayableAsset=!1;_speed=1;awake(){jn&&console.log(`[Timeline] Awake '${this.name}'`,this),this.rebuildGraph(),!this.isValid()&&(jn||A())&&(jn?console.warn("PlayableDirector is not valid","Asset?",this.playableAsset,"Tracks:",this.playableAsset?.tracks,"IsArray?",Array.isArray(this.playableAsset?.tracks),this):this.playableAsset?.tracks?.length?console.warn("PlayableDirector is not valid"):console.warn("PlayableDirector has no tracks"))}onEnable(){jn&&console.log("[Timeline] OnEnable",this.name,this.playOnAwake);for(const e of this._audioTracks)e.onEnable?.();for(const e of this._customTracks)e.onEnable?.();for(const e of this._animationTracks)e.onEnable?.();this.playOnAwake&&this.play(),this._visibilityChangeEvt||(this._visibilityChangeEvt=()=>{switch(document.visibilityState){case"hidden":this.setAudioTracksAllowPlaying(!1);break;case"visible":this.setAudioTracksAllowPlaying(!0);break}}),window.addEventListener("visibilitychange",this._visibilityChangeEvt)}onDisable(){jn&&console.log("[Timeline] OnDisable",this.name),this.stop();for(const e of this._audioTracks)e.onDisable?.();for(const e of this._customTracks)e.onDisable?.();for(const e of this._animationTracks)e.onDisable?.();this._visibilityChangeEvt&&window.removeEventListener("visibilitychange",this._visibilityChangeEvt)}onDestroy(){for(const e of this._allTracks)for(const t of e)t.onDestroy?.()}rebuildGraph(){this.isValid()&&(this.resolveBindings(),this.updateTimelineDuration(),this.setupAndCreateTrackHandlers())}async play(){if(!this.isValid())return;const e=this._isPaused==!0;if(this._isPaused=!1,!this._isPlaying){if(this._isPlaying=!0,e&&this.invokePauseChangedMethodsOnTracks(),this.waitForAudio){const t=[];for(const i of this._audioTracks){const n=i.loadAudio(this._time,1,0);n&&t.push(n)}if(t.length>0&&(await Promise.all(t),!this._isPlaying))return;for(;this._audioTracks.length>0&&this._isPlaying&&!Ai.userInteractionRegistered&&this.waitForAudio;)await Wn(200)}this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine=this.startCoroutine(this.internalUpdate(),we.LateUpdate)}}pause(){this.isValid()&&(this._isPlaying=!1,!this._isPaused&&(this._isPaused=!0,this.internalEvaluate(),this.invokePauseChangedMethodsOnTracks(),this.invokeStateChangedMethodsOnTracks()))}stop(){this._isStopping=!0;for(const i of this._audioTracks)i.stop();const e=this._isPaused==!0,t=this._isPlaying;this._isPlaying&&(this._time=0,this._isPlaying=!1,this._isPaused=!1,this.internalEvaluate(),e&&this.invokePauseChangedMethodsOnTracks()),this._isPlaying=!1,this._isPaused=!1,e&&!t&&this.invokePauseChangedMethodsOnTracks(),t&&this.invokeStateChangedMethodsOnTracks(),this._internalUpdateRoutine&&this.stopCoroutine(this._internalUpdateRoutine),this._internalUpdateRoutine=null,this._isStopping=!1}evaluate(){this.internalEvaluate(!0)}isValid(){return this.playableAsset&&this.playableAsset.tracks&&Array.isArray(this.playableAsset.tracks)}*forEachTrack(){for(const e of this._allTracks)for(const t of e)yield t}get animationTracks(){return this._animationTracks}get audioTracks(){return this._audioTracks}get signalTracks(){return this._signalTracks}get markerTracks(){return this._markerTracks}*foreachMarker(e=null){for(const t of this._markerTracks)for(const i of t.foreachMarker(e))yield i}_guidsMap;resolveGuids(e){this._guidsMap=e}_isPlaying=!1;_internalUpdateRoutine;_isPaused=!1;_isStopping=!1;_time=0;_duration=0;_weight=1;_animationTracks=[];_audioTracks=[];_signalTracks=[];_markerTracks=[];_controlTracks=[];_customTracks=[];_tracksArray=[];get _allTracks(){return this._tracksArray.length=0,this._tracksArray.push(this._animationTracks),this._tracksArray.push(this._audioTracks),this._tracksArray.push(this._signalTracks),this._tracksArray.push(this._markerTracks),this._tracksArray.push(this._controlTracks),this._tracksArray.push(this._customTracks),this._tracksArray}invokePauseChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onPauseChanged?.call(e)}invokeStateChangedMethodsOnTracks(){for(const e of this.forEachTrack())e.onStateChanged?.call(e,this._isPlaying)}*internalUpdate(){for(;this._isPlaying&&this.activeAndEnabled;)!this._isPaused&&this._isPlaying&&(this._time+=this.context.time.deltaTime*this.speed,this.internalEvaluate()),yield}internalEvaluate(e=!1){if(!this.isValid())return;let t=this._time;switch(this.extrapolationMode){case 0:this._speed>0?t=Math.min(t,this._duration):this._speed<0&&(t=Math.max(t,0)),this._time=t;break;case 1:t%=this._duration,this._time=t;break;case 2:if(t>this._duration){this.stop();return}break}const i=this._time;for(const n of this.playableAsset.tracks)if(!n.muted)switch(n.type){case Ui.Activation:if(!e&&!this._isPlaying)continue;for(let s=0;s<n.outputs.length;s++){const r=n.outputs[s];if(typeof r=="object"){let a=!1;if(n.clips)for(const c of n.clips)c.start<=i&&i<=c.end&&(a=!0);const l=r;l.visible!==void 0&&l.visible!==a&&(l.visible=a,jn&&console.warn(this.name,"set ActivationTrack-"+s,l.name,a,i))}}break}for(const n of this._allTracks)for(const s of n)this._isStopping&&s instanceof Uh||s.evaluate(i)}resolveBindings(){if(this._clonedPlayableAsset||(this._clonedPlayableAsset=!0,this.playableAsset=tc(this.playableAsset)),!this.playableAsset||!this.playableAsset.tracks)return;const e=this.findRoot(this.gameObject);for(const t of this.playableAsset.tracks){for(let i=t.outputs.length-1;i>=0;i--){let n=t.outputs[i];if(typeof n=="string"){this._guidsMap&&this._guidsMap[n]&&(n=this._guidsMap[n]);const s=x.findByGuid(n,e);s===null||typeof s!="object"?(t.outputs.splice(i,1),console.warn("Failed to resolve binding",n,t.name,t.type)):(jn&&console.log("Resolved binding",n,"to",s),t.outputs[i]=s)}else if(n===null){if(t.outputs.splice(i,1),Z0.createTrackFunctions[t.type])continue;t.type!==Ui.Audio&&t.type!==Ui.Control&&t.type!==Ui.Marker&&t.type!==Ui.Signal&&console.warn("Missing binding",n,t.name,t.type,this.name,this.playableAsset.name)}}if(t.type===Ui.Control&&t.clips)for(let i=0;i<t.clips.length;i++){const n=t.clips[i];let s=n.asset.sourceObject;if(typeof s=="string"){this._guidsMap&&this._guidsMap[s]&&(s=this._guidsMap[s]);const r=x.findByGuid(s,e);r===null||typeof r!="object"?console.warn("Failed to resolve sourceObject binding",s,t.name,n):(jn&&console.log("Resolved binding",s,"to",r),n.asset.sourceObject=r)}}}}findRoot(e){return e.parent?this.findRoot(e.parent):e}updateTimelineDuration(){if(this._duration=0,!(!this.playableAsset||!this.playableAsset.tracks)){for(const e of this.playableAsset.tracks)if(e.muted!==!0){if(e.clips)for(const t of e.clips)t.end>this._duration&&(this._duration=t.end);if(e.markers)for(const t of e.markers)t.time>this._duration&&(this._duration=t.time+.001)}}}setupAndCreateTrackHandlers(){if(this._animationTracks.length=0,this._audioTracks.length=0,this._signalTracks.length=0,!this.playableAsset)return;let e=x.findObjectOfType(Do,this.context);for(const t of this.playableAsset.tracks){const i=t.type,n=Z0.createTrackFunctions[i];if(n!=null){const s=n(this,t);if(typeof s.evaluate=="function"){s.director=this,s.track=t,this._customTracks.push(s);continue}}if(t.type===Ui.Animation){if(!t.clips||t.clips.length<=0){jn&&console.warn("Animation track has no clips",t);continue}for(let s=t.outputs.length-1;s>=0;s--){let r=t.outputs[s];if(r instanceof k){const l=x.getOrAddComponent(r,yt);l&&(r=l)}const a=r?.gameObject?.animations;if(a){const l=new Uh;l.trackOffset=t.trackOffset,l.director=this,l.track=t;for(let c=0;c<t.clips.length;c++){const h=t.clips[c],d=h.asset;if(!d){console.error(`Timeline ${this.name}: clip #${c} on track "${t.name}" has no animation data`);continue}const p=d.clip;let m=p;if((typeof m=="string"||typeof m=="number")&&(m=a.find(g=>g.name===p)),jn&&console.log(d,p,"\u2192",m),!m){console.warn("Could not find animationClip for model",h,t.name,this.name,this.playableAsset?.name,a,r);continue}r instanceof yt&&r.runtimeAnimatorController&&(r.__internalDidAwakeAndStart||r.initializeRuntimeAnimatorController(),r.runtimeAnimatorController.mixer||r.runtimeAnimatorController.bind(r),l.mixer=r.runtimeAnimatorController.mixer),l.mixer||(l.mixer=new _m(r.gameObject),this.context.animations.registerAnimationMixer(l.mixer)),l.clips.push(m),l.mixer.uncacheAction(m),l.createHooks(h.asset,m);const f=l.mixer.clipAction(m);l.actions.push(f),l.models.push(h)}this._animationTracks.push(l)}}}else if(t.type===Ui.Audio){if(!t.clips||t.clips.length<=0)continue;const s=new cs;s.director=this,s.track=t,s.audioSource=t.outputs.find(r=>r instanceof Ai),this._audioTracks.push(s),e||(e=this.context.mainCameraComponent?.gameObject.addComponent(Do)),s.listener=e.listener;for(let r=0;r<t.clips.length;r++){const a=t.clips[r];s.addModel(a)}}else if(t.type===Ui.Marker){if(t.markers){const s=new zh;s.director=this,s.track=t;const r=new Wp;r.director=this,r.track=t;for(const a of t.markers)switch(a.type){case C0.Signal:s.models.push(a),s.didTrigger.push(!1);break;default:r.models.push(a);break}if(s!==null&&s.models.length>0){const a=x.getComponent(this.gameObject,Fh);a&&(s.receivers.push(a),this._signalTracks.push(s))}r!==null&&r.models.length>0&&this._markerTracks.push(r)}}else if(t.type===Ui.Signal){const s=new zh;if(s.director=this,s.track=t,t.markers)for(const r of t.markers)s.models.push(r),s.didTrigger.push(!1);for(const r of t.outputs)s.receivers.push(r);this._signalTracks.push(s)}else if(t.type===Ui.Control){const s=new $p;if(s.director=this,s.track=t,t.clips)for(const r of t.clips)s.models.push(r);s.resolveSourceObjects(this.context),this._controlTracks.push(s)}}}setAudioTracksAllowPlaying(e){for(const t of this._audioTracks)t.onAllowAudioChanged(e)}animationCallbackReceivers=[];registerAnimationCallback(e){this.animationCallbackReceivers.push(e)}unregisterAnimationCallback(e){const t=this.animationCallbackReceivers.indexOf(e);t!==-1&&this.animationCallbackReceivers.splice(t,1)}};D1([u()],P0.prototype,"playOnAwake"),D1([u()],P0.prototype,"extrapolationMode");let ha=P0;var aI=Object.defineProperty,Hp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&aI(e,t,n),n};class da extends R{isGizmo=!1;translationSnap=1;rotationSnapAngle=15;scaleSnap=.25;get control(){return this._control}_control;orbit;onEnable(){if(!(this.isGizmo&&!Sc)&&this.context.mainCamera&&(this._control||(this._control=new tP(this.context.mainCamera,this.context.renderer.domElement),this._control.enabled=!0,this._control.getRaycaster().layers.set(2),this._control.size=1,("_root"in this._control?this._control._root:this._control).traverse(e=>{const t=e;if(t.layers.set(2),t){const i=t.material;i&&(i.opacity=.3)}}),this.orbit=x.getComponentInParent(this.context.mainCamera,me)??void 0),this._control)){const e=this._control.getHelper();this.context.scene.add(e),this._control.attach(this.gameObject),this._control?.addEventListener("dragging-changed",this.onControlChangedEvent),window.addEventListener("keydown",this.windowKeyDownListener),window.addEventListener("keyup",this.windowKeyUpListener)}}onDisable(){this._control?.getHelper()?.removeFromParent(),this._control?.removeEventListener("dragging-changed",this.onControlChangedEvent),window.removeEventListener("keydown",this.windowKeyDownListener),window.removeEventListener("keyup",this.windowKeyUpListener)}enableSnapping(){this._control&&(this._control.setTranslationSnap(this.translationSnap),this._control.setRotationSnap(wo.degToRad(this.rotationSnapAngle)),this._control.setScaleSnap(this.scaleSnap))}disableSnapping(){this._control&&(this._control.setTranslationSnap(null),this._control.setRotationSnap(null),this._control.setScaleSnap(null))}onControlChangedEvent=e=>{const t=this.orbit;if(t&&(t.enabled=!e.value),e.value){const i=this.gameObject.getComponentInParent(Pn);i&&(i.fastMode=!0,i.requestOwnership())}else{const i=this.gameObject.getComponentInParent(Pn);i&&(i.fastMode=!1)}};windowKeyDownListener=e=>{if(this.enabled&&this._control)switch(e.keyCode){case 81:this._control.setSpace(this._control.space==="local"?"world":"local");break;case 16:this.enableSnapping();break;case 87:this._control.setMode("translate");break;case 69:this._control.setMode("rotate");break;case 82:this._control.setMode("scale");break;case 187:case 107:this._control.setSize(this._control.size+.1);break;case 189:case 109:this._control.setSize(Math.max(this._control.size-.1,.1));break;case 88:this._control.showX=!this._control.showX;break;case 89:this._control.showY=!this._control.showY;break;case 90:this._control.showZ=!this._control.showZ;break;case 32:this._control.enabled=!this._control.enabled;break}};windowKeyUpListener=e=>{if(this.enabled)switch(e.keyCode){case 16:this.disableSnapping();break}}}Hp([u()],da.prototype,"isGizmo"),Hp([u()],da.prototype,"translationSnap"),Hp([u()],da.prototype,"rotationSnapAngle"),Hp([u()],da.prototype,"scaleSnap");var lI=Object.defineProperty,cI=Object.getOwnPropertyDescriptor,Gp=(o,e,t,i)=>{for(var n=i>1?void 0:i?cI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&lI(e,t,n),n};class O0{texture=null;rect}Gp([u(Le)],O0.prototype,"texture",2);let jl=class extends hh{set image(o){this.sprite||(this.sprite=new O0),this.sprite.texture=o,this.onAfterCreated()}get image(){return this.sprite?this.sprite.texture:null}get sprite(){return this._sprite}set sprite(o){this._sprite!==o&&(this._sprite=o,this.onAfterCreated())}_sprite;pixelsPerUnitMultiplier=1;isBuiltinSprite(){const o=this.sprite;switch(o?.texture?.name){case"InputFieldBackground":case"UISprite":case"Background":case"Knob":return!0}return!o?.texture?.name?.length&&o?.texture?.image?.width===32&&o?.texture?.image?.height===32}onBeforeCreate(o){super.onBeforeCreate(o),this.isBuiltinSprite()&&(o.borderRadius=5/this.pixelsPerUnitMultiplier,this.sprite?.texture?.name==="Knob"&&(o.borderRadius=999))}onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),!this.isBuiltinSprite()&&this.setTexture(this.sprite?.texture))}};Gp([u(O0)],jl.prototype,"sprite",1),Gp([u()],jl.prototype,"pixelsPerUnitMultiplier",2);class qp extends hh{get mainTexture(){return this._mainTexture}set mainTexture(e){this._mainTexture!==e&&(this._mainTexture=e,this.onAfterCreated())}_mainTexture;onAfterCreated(){this.__didAwake&&(super.onAfterCreated(),this.setTexture(this.mainTexture))}}Gp([u(Le)],qp.prototype,"mainTexture",1);var hI=Object.defineProperty,dI=Object.getOwnPropertyDescriptor,zi=(o,e,t,i)=>{for(var n=i>1?void 0:i?dI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&hI(e,t,n),n};const ua=v("debugbutton");class Ks{colorMultiplier;disabledColor;fadeDuration;highlightedColor;normalColor;pressedColor;selectedColor}zi([u()],Ks.prototype,"colorMultiplier",2),zi([u(oe)],Ks.prototype,"disabledColor",2),zi([u()],Ks.prototype,"fadeDuration",2),zi([u(oe)],Ks.prototype,"highlightedColor",2),zi([u(oe)],Ks.prototype,"normalColor",2),zi([u(oe)],Ks.prototype,"pressedColor",2),zi([u(oe)],Ks.prototype,"selectedColor",2);class uI{disabledTrigger;highlightedTrigger;normalTrigger;pressedTrigger;selectedTrigger}class Ko extends R{click(){this.onClick?.invoke()}onClick=new he;_isHovered=0;onPointerEnter(e){const t=e.event.pointerType==="mouse"&&e.button===0;t&&(this._isHovered+=1),ua&&console.warn("Button Enter",t,this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.highlightedTrigger):this.transition===1&&this.colors&&this._image?.setState("hovered"),t&&this.context.input.setCursor("pointer"))}onPointerExit(){this._isHovered-=1,this._isHovered<0&&(this._isHovered=0),ua&&console.log("Button Exit",this._isHovered,this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this._isHovered>0||(this._isHovered=0,this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState("normal"),this.context.input.unsetCursor("pointer")))}onPointerDown(e){ua&&console.log("Button Down",this.animationTriggers?.highlightedTrigger,this.animator),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this.animationTriggers.pressedTrigger):this.transition===1&&this.colors&&this._image?.setState("pressed"))}onPointerUp(e){ua&&console.warn("Button Up",this.animationTriggers?.highlightedTrigger,this.animator,this._isHovered),this.interactable&&(this.transition==3&&this.animationTriggers&&this.animator?this.animator.setTrigger(this._isHovered?this.animationTriggers.highlightedTrigger:this.animationTriggers.normalTrigger):this.transition===1&&this.colors&&this._image?.setState(this._isHovered?"hovered":"normal"))}onPointerClick(e){if(this.interactable&&!(e.button!==0&&e.event.pointerType===Vd.Mouse)&&(ua&&(console.warn("Button Click",this.onClick),Te("CLICKED button "+this.name+" at "+this.context.time.frameCount)),this.onClick&&this.onClick.listenerCount>0&&(this.onClick.invoke(),e.use(),ua))){const t=this.gameObject.worldPosition;t.add(this.gameObject.worldUp.multiplyScalar(1+Math.random()*.5)),B.DrawLabel(t,"CLICK:"+Date.now(),.1,1+Math.random()*.5)}}colors;transition;animationTriggers;animator;set interactable(e){this._interactable=e,this._image&&(this._image.setInteractable(e),e?this._image.setState("normal"):this._image.setState("disabled"))}get interactable(){return this._interactable}_interactable=!0;set_interactable(e){this.interactable=e}awake(){super.awake(),ua&&console.log(this),this._isInit=!1,this.init()}start(){this._image?.setInteractable(this.interactable),this.gameObject.getComponentInParent(Ka)||this.gameObject.addComponent(Lu)}onEnable(){super.onEnable()}onDestroy(){this._isHovered&&this.context.input.unsetCursor("pointer")}_requestedAnimatorTrigger;*setAnimatorTriggerAtEndOfFrame(e){this._requestedAnimatorTrigger=e,yield,yield,this._requestedAnimatorTrigger==e&&this.animator?.setTrigger(e)}_isInit=!1;_image;init(){this._isInit||(this._isInit=!0,this._image=x.getComponent(this.gameObject,jl),this._image&&(this.stateSetup(this._image),this.interactable?this._image.setState("normal"):this._image.setState("disabled")))}stateSetup(e){e.setInteractable(this.interactable);const t=this.getFinalColor(e.color,this.colors?.normalColor),i={state:"normal",attributes:{backgroundColor:t,backgroundOpacity:t.alpha}};e.setupState(i);const n=this.getFinalColor(e.color,this.colors?.highlightedColor),s={state:"hovered",attributes:{backgroundColor:n,backgroundOpacity:n.alpha}};e.setupState(s);const r=this.getFinalColor(e.color,this.colors?.pressedColor),a={state:"pressed",attributes:{backgroundColor:r,backgroundOpacity:r.alpha}};e.setupState(a);const l=this.getFinalColor(e.color,this.colors?.selectedColor),c={state:"selected",attributes:{backgroundColor:l,backgroundOpacity:l.alpha}};e.setupState(c);const h=this.getFinalColor(e.color,this.colors?.disabledColor),d={state:"disabled",attributes:{backgroundColor:h,backgroundOpacity:h.alpha}};e.setupState(d)}getFinalColor(e,t){return t?e.clone().multiply(t).convertLinearToSRGB():e.clone().convertLinearToSRGB()}}zi([u(he)],Ko.prototype,"onClick",2),zi([u(Ks)],Ko.prototype,"colors",2),zi([u()],Ko.prototype,"transition",2),zi([u(uI)],Ko.prototype,"animationTriggers",2),zi([u(yt)],Ko.prototype,"animator",2),zi([u()],Ko.prototype,"interactable",1);var pI=Object.defineProperty,Xp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&pI(e,t,n),n};const Js=v("debuginputfield"),Nh=class Q extends R{get text(){return this.textComponent?.text??""}set text(e){this.textComponent&&(this.textComponent.text=e,this.placeholder&&(e.length>0?this.placeholder.gameObject.visible=!1:this.placeholder.gameObject.visible=!0))}get isFocused(){return Q.active===this}textComponent;placeholder;onValueChanged;onEndEdit;static active=null;static activeTime=-1;static htmlField=null;static htmlFieldFocused=!1;inputEventFn;_iosEventFn;start(){Js&&console.log(this.name,this)}onEnable(){Q.htmlField||(Q.htmlField=document.createElement("input"),Q.htmlField.style.width="0px",Q.htmlField.style.height="0px",Q.htmlField.style.padding="0px",Q.htmlField.style.border="none",Q.htmlField.style.overflow="hidden",Q.htmlField.style.caretColor="transparent",Q.htmlField.style.outline="none",Q.htmlField.classList.add("ar"),Q.htmlField.onfocus=()=>Q.htmlFieldFocused=!0,Q.htmlField.onblur=()=>Q.htmlFieldFocused=!1,document.body.append(Q.htmlField)),this.inputEventFn||(this.inputEventFn=this.onInput.bind(this)),Q.htmlField.addEventListener("keyup",this.inputEventFn),this.placeholder&&this.textComponent?.text.length&&x.setActive(this.placeholder.gameObject,!1),q.isiOS()&&(this._iosEventFn=this.processInputOniOS.bind(this),window.addEventListener("click",this._iosEventFn))}onDisable(){Q.htmlField?.removeEventListener("keyup",this.inputEventFn),this.onDeselected(),this._iosEventFn&&window.removeEventListener("click",this._iosEventFn)}clear(){Q.active===this&&Q.htmlField?(Q.htmlField.value="",this.setTextFromInputField()):(this.textComponent&&(this.textComponent.text=""),this.placeholder&&x.setActive(this.placeholder.gameObject,!0))}select(){this.onSelected()}deselect(){this.onDeselected()}onPointerEnter(e){e.event.pointerType==="mouse"&&e.button===0&&this.context.input.setCursor("text")}onPointerExit(e){this.context.input.unsetCursor("text")}onPointerClick(e){Js&&console.log("CLICK",e,Q.active),Q.activeTime=this.context.time.time,Q.active!==this&&this.startCoroutine(this.activeLoop(),we.LateUpdate),this.selectInputField()}*activeLoop(){for(this.onSelected();Q.active===this&&!(this.context.input.getPointerClicked(0)&&this.context.time.time-Q.activeTime>.2);)this.setTextFromInputField(),yield;this.onDeselected()}onSelected(){if(Q.active!==this&&(Js&&console.log("Select",this.name,this,Q.htmlField,this.context.isInXR,this.context.arOverlayElement,this.textComponent?.text,Q.htmlField?.value),Q.active?.onDeselected(),Q.active=this,this.placeholder&&x.setActive(this.placeholder.gameObject,!1),Q.htmlField)){if(Q.htmlField.value=this.textComponent?.text||"",Js&&console.log("set input field value",Q.htmlField.value),this.context.isInXR){const e=this.context.arOverlayElement;e&&e.append(Q.htmlField)}this.selectInputField()}}onDeselected(){Q.active===this&&(Q.active=null,Js&&console.log("Deselect",this.name,this),Q.htmlField&&(Q.htmlField.blur(),document.body.append(Q.htmlField)),this.placeholder&&(!this.textComponent||this.textComponent.text.length<=0)&&x.setActive(this.placeholder.gameObject,!0),Q.htmlField&&this.onEndEdit?.invoke(Q.htmlField.value))}update(){Q.active===this&&this.textComponent?.markDirty()}onInput(e){if(Q.active===this){if(Js&&console.log(e.code,e,Q.htmlField?.value,this.textComponent?.text),e.code==="Escape"||e.code==="Enter"){this.onDeselected();return}Q.htmlField&&(this.textComponent&&(this.setTextFromInputField(),this.placeholder&&x.setActive(this.placeholder.gameObject,this.textComponent.text.length<=0)),this.selectInputField())}}setTextFromInputField(){if(this.textComponent&&Q.htmlField){const e=this.textComponent.text,t=Q.htmlField.value,i=this.textComponent.text!==Q.htmlField.value;this.textComponent.text=Q.htmlField.value,i&&(Js&&console.log("[InputField] value changed:",t,e),this.onValueChanged?.invoke(t,e))}}selectInputField(){Q.htmlField&&(Js&&console.log("Focus Inputfield",Q.htmlFieldFocused),Q.htmlField.setSelectionRange(Q.htmlField.value.length,Q.htmlField.value.length),q.isiOS()?Q.htmlField.focus({preventScroll:!0}):setTimeout(()=>Q.htmlField?.focus(),1))}processInputOniOS(){const e=this.context.physics.raycast();if(!e.length)return;const t=e[0].object,i=_f(t);(i?.gameObject===this.gameObject||i?.gameObject.parent===this.gameObject)&&this.selectInputField()}};Xp([u(Nt)],Nh.prototype,"textComponent"),Xp([u(Nt)],Nh.prototype,"placeholder"),Xp([u(he)],Nh.prototype,"onValueChanged"),Xp([u(he)],Nh.prototype,"onEndEdit");let k0=Nh;var mI=Object.defineProperty,B1=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&mI(e,t,n),n};class Vh extends R{id=null;keepAspect=!1;_object=null;onEnable(){if(this._object){this.gameObject.add(this._object);return}if(!this.id||!this.context.mainCamera)return;const e=document.getElementById(this.id);if(!e){console.warn('Could not find element with id "'+this.id+'"');return}e.style.display="block",e.style.visibility="hidden";const t=new iP;t.listenToPointerEvents(this.context.renderer,this.context.mainCamera),this.gameObject.add(t);const i=new nP(e);t.add(i),i.visible=!1;const n=i.material;n.transparent=!0,setTimeout(()=>{i.visible=!0;const s=jd(this.gameObject).clone();sc(this.gameObject,0,0,0),this.gameObject.updateMatrixWorld();const r=new xi;r.setFromObject(t),this.setWorldRotation(s.x,s.y,s.z);const a=r.max.x-r.min.x,l=r.max.y-r.min.y;if(this.keepAspect){const h=a/l;a>l?i.scale.set(1/a,1/l/h,1):i.scale.set(1/a*h,1/l,1)}else i.scale.set(1/a,1/l,1);const c=this.gameObject.scale;i.scale.multiply(c)},1)}onDisable(){this._object?.removeFromParent()}}B1([u()],Vh.prototype,"id"),B1([u()],Vh.prototype,"keepAspect");const gI={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},fI={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class Qp extends wi{constructor(e){super(),this.position.y=-3.5;const t=new Pa;t.deleteAttribute("uv");const i=new pt({metalness:0,side:Pd}),n=new pt({metalness:0}),s=e=="legacy"?gI:fI,r=new mm(16777215,s.topLight.intensity,28,2);r.position.set(...s.topLight.position),this.add(r);const a=new G(t,i);a.position.set(...s.room.position),a.scale.set(...s.room.scale),this.add(a);for(const l of s.boxes){const c=new G(t,n);c.position.set(...l.position),c.rotation.set(0,l.rotation,0),c.scale.set(...l.scale),this.add(c)}for(const l of s.lights){const c=new G(t,this.createAreaLightMaterial(l.intensity));c.position.set(...l.position),c.scale.set(...l.scale),this.add(c)}}createAreaLightMaterial(e){const t=new xe;return t.color.setScalar(e),t}}var yI=Object.defineProperty,Yp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&yI(e,t,n),n};const Wh=class xS extends R{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new U().setFromAxisAngle(new b(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera,A()&&!this.__did_warn&&(this.__did_warn=!0,console.debug(`[LookAt] No target set on ${this.name}, using main camera as target.`))),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),oc(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(xS.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=nt.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new K().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new K().makeRotationZ(-Math.PI/2*a)))}const s=new It("lookat "+this.name,zt.sceneStartTrigger(),ge.lookAtCameraAction(n,void 0,this.invertForward?pn.back:pn.forward,this.keepUpDirection?pn.up:pn.zero));e.addBehavior(s)}}};Yp([u(k)],Wh.prototype,"target"),Yp([u()],Wh.prototype,"invertForward"),Yp([u()],Wh.prototype,"keepUpDirection"),Yp([u()],Wh.prototype,"copyTargetRotation");let M0=Wh;var bI=Object.defineProperty,R0=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&bI(e,t,n),n};class Dl extends R{url;mode=0;clickable=!0;async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),A()&&Te("Open URL: "+e),this.mode){case 0:q.isSafari(),globalThis.open(e,"_blank");break;case 1:q.isSafari()&&q.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:q.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(Ei)||this.gameObject.addComponent(Ei)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){this.clickable&&!e.used&&this.url?.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(A()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}R0([u()],Dl.prototype,"url"),R0([u()],Dl.prototype,"mode"),R0([u()],Dl.prototype,"clickable"),Cu(o=>{const e=o.domElement.getAttribute("clickthrough");if(t(e)){const i=o.scene.addComponent(Zp);Bm(o.domElement,"clickthrough",()=>{const n=o.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class Zp extends R{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._previousPointerEvents=this.context.domElement.style.pointerEvents}onDisable(){this.context.input.removeEventListener("pointerdown",this.onPointerEvent),this.context.input.removeEventListener("pointermove",this.onPointerEvent),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchend",this.onTouchEnd),this.context.domElement.style.pointerEvents=this._previousPointerEvents}onPointerEnter(){}onPointerEvent=e=>{e.pointerId>0||(e.intersections?.length<=0?this.context.domElement.style.pointerEvents="none":this.context.domElement.style.pointerEvents="all")};_touchDidHitAnything=!1;onTouchStart=e=>{const t=e.touches[0];if(!t)return;const i=t.clientX/window.innerWidth*2-1,n=-(t.clientY/window.innerHeight)*2+1;this.context.physics.raycast({screenPoint:new ee(i,n)}).length>0&&(this._touchDidHitAnything=!0)};onTouchEnd=e=>{const t=this._touchDidHitAnything;this._touchDidHitAnything=!1,setTimeout(()=>{t&&(this.context.domElement.style.pointerEvents="all")},100)}}var _I=Object.defineProperty,Kp=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&_I(e,t,n),n};const vI=v("debugcursor");class pa extends R{static NAME="CursorFollow";damping=0;useFullPage=!0;keepDistance=!0;snapToSurface=!1;_distance=-1;updateDistance(e=!1){!e&&this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}awake(){this._distance=-1}onEnable(){this._distance=-1,window.addEventListener("pointermove",this._onPointerMove)}onDisable(){window.removeEventListener("pointermove",this._onPointerMove)}_ndc_x=0;_ndc_y=0;_onPointerMove=e=>{if(!this.useFullPage)return;const t=e.clientX,i=e.clientY,n=this.context.domX,s=this.context.domY,r=this.context.domWidth,a=this.context.domHeight;this._ndc_x=(t-n)/r*2-1,this._ndc_y=-(i-s)/a*2+1};lateUpdate(){this.updateDistance();const e=this.useFullPage?this._ndc_x:this.context.input.mousePositionRC.x,t=this.useFullPage?this._ndc_y:this.context.input.mousePositionRC.y,i=this.context.mainCamera,n=i.worldPosition,s=D(e,t,1).unproject(i);s.sub(n).normalize();const r=D(s).multiplyScalar(this._distance).add(n);let a=r;if(this.damping>0){const l=this.gameObject.worldPosition;l.lerp(r,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=l,a=l}else this.gameObject.worldPosition=r;if(this.snapToSurface){T0.origin=a,T0.direction=s.multiplyScalar(-1);const l=this.context.physics.raycastFromRay(T0);if(l?.length){const c=l[0];this.damping>0?this.gameObject.worldPosition=a.lerp(c.point,this.context.time.deltaTime/this.damping):this.gameObject.worldPosition=c.point,vI&&B.DrawLine(c.point,c.normal.add(c.point),65280)}}}}Kp([u()],pa.prototype,"damping"),Kp([u()],pa.prototype,"useFullPage"),Kp([u()],pa.prototype,"keepDistance"),Kp([u()],pa.prototype,"snapToSurface");const T0=new vo;var wI=Object.defineProperty,xI=Object.getOwnPropertyDescriptor,Bl=(o,e,t,i)=>{for(var n=i>1?void 0:i?xI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&wI(e,t,n),n};let go=class extends R{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=vs.emptyClip()),(!this.hovered||!(this.hovered instanceof Pi))&&(this.hovered=vs.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Dt),this.animation.playAutomatically=!1,this.playIdle()}onEnable(){this.animation&&(this.animation.enabled=!0),this.playIdle()}onDisable(){this.animation&&(this.animation.enabled=!1),this.playIdle()}onPointerEnter(){this.playHover()}onPointerExit(){this.playIdle()}playIdle(){this.idle&&this.animation?.play(this.idle,{exclusive:!0,fadeDuration:.1,loop:!0})}playHover(){this.hovered&&this.animation?.play(this.hovered,{exclusive:!0,fadeDuration:.1,loop:!1,clampWhenFinished:!0})}};Bl([u()],go.prototype,"type",2),Bl([u()],go.prototype,"duration",2),Bl([u()],go.prototype,"scaleFactor",2),Bl([u(Pi)],go.prototype,"hovered",2),Bl([u(Pi)],go.prototype,"idle",2),go=Bl([Ug],go);var SI=Object.defineProperty,Fl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&SI(e,t,n),n};const $h=v("debugscroll");class Jo extends R{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new he;get currentValue(){return this._current_value}_current_value=0;_target_value=0;_appliedValue=-1;_needsUpdate=!1;_firstUpdate=!1;awake(){this._firstUpdate=!0}onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this._appliedValue=-1,this._needsUpdate=!0}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){if(this.updateCurrentScrollValue(),this._target_value>=0&&(this.damping>0&&!this._firstUpdate?(this._current_value=L.lerp(this._current_value,this._target_value,this.context.time.deltaTime/this.damping),Math.abs(this._current_value-this._target_value)<.001&&(this._current_value=this._target_value)):this._current_value=this._target_value),this._needsUpdate||this._current_value!==this._appliedValue){this._appliedValue=this._current_value,this._needsUpdate=!1;let e=!1;if(this.changed.listenerCount>0){const t={type:"change",value:this._current_value,component:this,preventDefault:()=>{t.defaultPrevented=!0},defaultPrevented:!1};this.changed.invoke(t),e=t.defaultPrevented}if(!e){const t=this.invert?1-this._current_value:this._current_value;Array.isArray(this.target)?this.target.forEach(i=>i&&this.applyScroll(i,t)):this.target&&this.applyScroll(this.target,t),$h&&this.context.time.frame%30===0&&console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} \u2014 ${(this._target_value*100).toFixed(0)}%, targets [${Array.isArray(this.target)?this.target.length:1}]`)}this._firstUpdate=!1}}_lastSelectorValue=null;_lastSelectorElement=null;updateCurrentScrollValue=()=>{switch(this.mode){case"window":if(this.htmlSelector?.length){if(this.htmlSelector!==this._lastSelectorValue&&(this._lastSelectorElement=document.querySelector(this.htmlSelector),this._lastSelectorValue=this.htmlSelector),this._lastSelectorElement){const e=this._lastSelectorElement.getBoundingClientRect();this._target_value=-e.top/(e.height-window.innerHeight);break}}else if(!(window.document.body.scrollHeight<=window.innerHeight)){const e=window.document.body.scrollHeight-window.innerHeight;this._target_value=window.scrollY/(e||1)}break}(isNaN(this._target_value)||!isFinite(this._target_value))&&(this._target_value=-1)};applyScroll(e,t){if(e)if(e instanceof ha)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof yt)e.setFloat("scroll",t);else if(e instanceof Dt)e.time=t*e.duration;else if(e instanceof Ai){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof an)e.position01=t;else if(e instanceof fi)e.intensity=t;else if(e instanceof k){const i=e;i["needle:scrollbounds"]===void 0&&(i["needle:scrollbounds"]=Xt(e)||null);const n=i["needle:scrollbounds"];n&&(e.position.y=-n.min.y-t*(n.max.y-n.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}handleTimelineTarget(e,t){const i=e.duration;let n=F1.get(e);if(!n){n=[],F1.set(e,n);let l=0;for(const c of e.foreachMarker("ScrollMarker")){const h=l++;if(c.element===void 0||c.needsUpdate===!0||c.element&&!c.element?.parentNode){c.needsUpdate=!1;try{if(c.element=U1(h),$h&&console.debug(`ScrollMarker #${h} (${c.time.toFixed(2)}) found`,c.element),!c.element){($h||A())&&console.warn(`No HTML element found for ScrollMarker: ${c.name} (index ${h})`);continue}}catch(d){c.element=null,console.error("ScrollMarker selector is not valid: "+c.name+`
1426
- `,d)}}c.element&&n.push(c)}n.length<=0&&document.querySelectorAll("[data-timeline-marker]").forEach(c=>{const h=c.getAttribute("data-timeline-marker"),d=parseFloat(h||"NaN");isNaN(d)?(A()||$h)&&console.warn('[ScrollFollow] data-timeline-marker attribute is not a valid number. Supported are numbers only (e.g. <div data-timeline-marker="0.5">)'):n.push({time:d,element:c})});for(const c of n)c.element&&(c.timeline=new ViewTimeline({subject:c.element,axis:"block"}))}fo.length=0;let s=0;const r=1/60;let a=0;for(let l=0;l<n.length;l++){const c=n[l];if(!c.element)continue;const h=n[l+1],d=h?h.time-r:i;a+=1;const p=c.timeline;if(p){const m=CI(p),f=1-Math.abs(m-.5)*2,g=`marker${l}`;if(m>0&&m<=1){const y=c.time+(d-c.time)*m;fo.push({name:g,time:y,weight:f}),s+=f}else l===0&&m<=0?(fo.push({name:g,time:0,weight:1}),s+=1):l===n.length-1&&m>=1&&(fo.push({name:g,time:i,weight:1}),s+=1)}}if(fo.length<=0&&a<=0)e.time=t*i;else if(fo.length>0){let l=fo[0].time;if(fo.length>1)for(const c of fo){const h=c.weight/Math.max(1e-5,s),d=Math.abs(c.time-l);l+=d*h}this.damping<=0||this._firstUpdate?e.time=l:e.time=L.lerp(e.time,l,this.context.time.deltaTime/this.damping),Math.abs(e.time-l)>.001&&(this._needsUpdate=!0),$h&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,fo.map(c=>`[${c.name} ${(c.weight*100).toFixed(0)}%]`).join(", "))}}}Fl([u([R,k])],Jo.prototype,"target"),Fl([u()],Jo.prototype,"damping"),Fl([u()],Jo.prototype,"invert"),Fl([u()],Jo.prototype,"htmlSelector"),Fl([u()],Jo.prototype,"mode"),Fl([u(he)],Jo.prototype,"changed");const F1=new WeakMap,fo=[],E0=new Array;let A0=!0;function U1(o){return A0?(A0=!1,E0.length=0,document.querySelectorAll("[data-timeline-marker]").forEach((e,t)=>{E0[t]=e}),A0=!1,U1(o)):E0[o]||null}function CI(o){if(!o.source)return 0;const e=o.currentTime,t=o.duration;let i=1;return(t.unit==="seconds"||t.unit==="percent")&&(i=t.value),e.unit==="seconds"?e.value/i:e.value/100}var z1=Object.defineProperty,PI=Object.getOwnPropertyDescriptor,OI=(o,e,t)=>e in o?z1(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,Jp=(o,e,t,i)=>{for(var n=i>1?void 0:i?PI(e,t):e,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&z1(e,t,n),n},I0=(o,e,t)=>OI(o,typeof e!="symbol"?e+"":e,t);const er=v("debugviewbox"),kI=new oe(.5,.5,.5,.5);let it=class extends R{referenceFieldOfView=-1;get mode(){return this._mode}set mode(o){o!==this._mode&&(this._mode=o,o==="once"&&(this._applyCount=0),(er||this.debug)&&console.debug("[ViewBox] Set mode:",o))}_mode="continuous";debug=!1;onEnable(){(er||this.debug||A())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),it.instances.push(this),this._applyCount=0,this.removeUpdateCallback(),this.context.pre_render_callbacks.push(this.internalUpdate)}onDisable(){(er||this.debug)&&console.debug("[ViewBox] Disabled");const o=it.instances.indexOf(this);o!==-1&&it.instances.splice(o,1),this._projectedBoxElement?.remove(),this.removeUpdateCallback()}removeUpdateCallback(){const o=this.context.pre_render_callbacks.indexOf(this.internalUpdate);o!==-1&&this.context.pre_render_callbacks.splice(o,1)}_applyCount=0;internalUpdate=()=>{if(this.context.isInXR||this.destroyed||!this.activeAndEnabled)return;if(it.instances[it.instances.length-1]!==this){(er||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,kI);return}(er||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const o=this.context.mainCamera;if(!o||!(o instanceof re))return;if((this.referenceFieldOfView===void 0||this.referenceFieldOfView===-1)&&(this.referenceFieldOfView=o.fov,console.debug("[ViewBox] No referenceFieldOfView set, using camera fov:",this.referenceFieldOfView)),this.referenceFieldOfView===void 0||this.referenceFieldOfView<=0){(er||this.debug)&&console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:",this.referenceFieldOfView);return}if(this._applyCount>=1&&this.mode==="once")return;this._applyCount++;const e=this.context.domWidth,t=this.context.domHeight;let i=e,n=t,s=1,r=1;const a=this.context.focusRectSize;a&&(i=a.width,n=a.height,s=e/i,r=t/n),it._tempProjectionMatrix.copy(o.projectionMatrix),it._tempProjectionMatrixInverse.copy(o.projectionMatrixInverse);const l=o.view,c=o.zoom,h=o.aspect,d=o.fov;o.view=null,o.zoom=1,o.fov=this.referenceFieldOfView,o.updateProjectionMatrix();const p=this.gameObject.worldPosition,m=this.gameObject.worldScale,f=o.worldPosition,g=f.distanceTo(p),y=Math.max(m.x,m.y,m.z),_=D(f).sub(p);if(g<y){(this.debug||er)&&console.warn("[ViewBox] Moving camera out of bounds",g,"<",y);const X=D(_);X.y*=1e-8,X.normalize();const T=y-g,$=f.add(X.multiplyScalar(T));o.worldPosition=$.lerp(f,1-this.context.time.deltaTime)}const w=D(p);o.worldToLocal(w),o.lookAt(p),o.updateMatrixWorld();const P=this.referenceFieldOfView*Math.PI/180,M=2*Math.tan(P/2)*g,O=M*o.aspect,j=this.projectBoxIntoCamera(o,1),I=j.maxX-j.minX,N=j.maxY-j.minY,V=this.fit(I*o.aspect,N,O/s,M/r)/(M*.5),H=D(p);H.project(o),this.context.focusRectSettings.offsetX=H.x,this.context.focusRectSettings.offsetY=H.y,this.context.focusRectSettings.zoom=V,this.context.focusRect||this.context.setCameraFocusRect(this.context.domElement),o.view=l,o.zoom=c,o.aspect=h,o.fov=d,o.projectionMatrix.copy(it._tempProjectionMatrix),o.projectionMatrixInverse.copy(it._tempProjectionMatrixInverse)};fit(o,e,t,i){const n=t/o,s=i/e;return Math.min(n,s)}projectBoxIntoCamera(o,e){const t=.5*e,i=[D(-t,-t,-t),D(t,-t,-t),D(-t,t,-t),D(t,t,-t),D(-t,-t,t),D(t,-t,t),D(-t,t,t),D(t,t,t)];let n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l=0;l<i.length;l++){const c=i[l];c.applyMatrix4(this.gameObject.matrixWorld),c.project(o),c.x<n&&(n=c.x),c.x>s&&(s=c.x),c.y<r&&(r=c.y),c.y>a&&(a=c.y)}return er&&(this._projectedBoxElement||(this._projectedBoxElement=document.createElement("div")),this._projectedBoxElement.parentElement!==this.context.domElement&&this.context.domElement.appendChild(this._projectedBoxElement),this._projectedBoxElement.style.position="fixed",this._projectedBoxElement.style.outline="2px dashed rgba(255,0,0,.5)",this._projectedBoxElement.style.left=(n*.5+.5)*this.context.domWidth+"px",this._projectedBoxElement.style.top=(-a*.5+.5)*this.context.domHeight+"px",this._projectedBoxElement.style.width=(s-n)*.5*this.context.domWidth+"px",this._projectedBoxElement.style.height=(a-r)*.5*this.context.domHeight+"px",this._projectedBoxElement.style.pointerEvents="none",this._projectedBoxElement.style.zIndex="1000"),{minX:n,maxX:s,minY:r,maxY:a}}_projectedBoxElement=null};I0(it,"instances",[]),I0(it,"_tempProjectionMatrix",new K),I0(it,"_tempProjectionMatrixInverse",new K),Jp([u()],it.prototype,"referenceFieldOfView",2),Jp([u()],it.prototype,"mode",1),Jp([u()],it.prototype,"debug",2),it=Jp([Ug],it);var MI=Object.defineProperty,Ul=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&MI(e,t,n),n};class es extends R{get activeAndEnabled(){return!0}side="none";controller=!0;hands=!1;controlVisibility=!0;useGripSpace=!1;resetTransformAfterXRSession=!0;_startPosition=new b;_startRotation=new U;_startScale=new b;onEnterXR(e){this._startPosition.copy(this.gameObject.position),this._startRotation.copy(this.gameObject.quaternion),this._startScale.copy(this.gameObject.scale)}onUpdateXR(e){if(!this.enabled)return;const t=e.xr.getController(this.side);if(t){if(t.hand&&!this.hands){this.controlVisibility&&(this.gameObject.visible=!1);return}else if(!this.controller){this.controlVisibility&&(this.gameObject.visible=!1);return}this.controlVisibility&&(this.gameObject.visible=!0),this.useGripSpace||t.targetRayMode==="transient-pointer"?(this.gameObject.worldPosition=t.gripWorldPosition,this.gameObject.worldQuaternion=t.gripWorldQuaternion,this.gameObject.worldScale=D(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=D(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))}}Ul([u()],es.prototype,"side"),Ul([u()],es.prototype,"controller"),Ul([u()],es.prototype,"hands"),Ul([u()],es.prototype,"controlVisibility"),Ul([u()],es.prototype,"useGripSpace"),Ul([u()],es.prototype,"resetTransformAfterXRSession");function N1(o,e){const t=o.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const i=t.session.enabledFeatures;if(i&&!i.some(s=>s==="camera-access"))return console.error(`No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene.
1427
-
1428
- Example to request camera-access in global scope:
1429
- NeedleXRSession.onSessionRequestStart(evt => {
1430
- evt.init.optionalFeatures = evt.init.optionalFeatures || [];
1431
- evt.init.optionalFeatures.push('camera-access');
1432
- });
1433
- `),A()&&lc("No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene"),!1;const n=t.getViewerPose(o.xr.getReferenceSpace());if(n)for(const s of n.views)if("camera"in s&&s.camera){let r=o.xr.getBinding();if(r||(r=new XRWebGLBinding(t.session,o.getContext())),r){let a=null;if("getCameraImage"in r){RI(o,e);const l=o.properties.get(e);if(l)return a=r.getCameraImage(s.camera),l.__webglTexture=a,!0;console.warn("No texture properties found for target texture")}}else console.error(s.camera,o.xr)}else console.error("NO CAMERA IN VIEW");else console.error(o.xr.getReferenceSpace(),t);return!1}const V1=new WeakMap;function RI(o,e){const t=V1.get(e)||new WeakSet;if(t.has(o))return;t.add(o),V1.set(e,t),console.debug("Initialize texture for camera feed");const i=new xe,n=new Un,s=new wi;s.add(new G(n,i));const r=new re;i.map=e,o.render(s,r)}function TI(o,e,t,i="image/webp",n){return L0({context:o,width:e,height:t,mimeType:i,camera:n})}function L0(o){o||(o={});const{transparent:e=!1}=o;let{mimeType:t,context:i,width:n,height:s,camera:r}=o;if(!i&&(i=ue.Current,!i))return console.error("Can not save screenshot: No needle-engine context found or provided."),null;if(!r&&(r=i.mainCamera,!r))return console.error("No camera found"),null;const a=i.renderer,l=a.xr.enabled&&a.xr.isPresenting;if(l&&i.currentFrameEvent!=we.EarlyUpdate)return console.warn("Screenshot: defer to access XR frame"),new Promise(j=>{To(I=>{const N=L0(o);j(N)},we.EarlyUpdate,{once:!0})});const c=a.domElement,h=c.width,d=c.height;n||(n=h),s||(s=d);const p=n,m=s;let f=window.devicePixelRatio||1,g=1;i.devicePixelRatio==="auto"||i.devicePixelRatio==="manual"?g=1:g=i.devicePixelRatio/window.devicePixelRatio,f*=g,n/=f,s/=f,n=Math.floor(n),s=Math.floor(s),a.xr.isPresenting&&a.xr.getFrame();const y=a.xr.enabled;a.xr.enabled=!1,a.xr.isPresenting=!1,c.style.width=`${n}px`,c.style.height=`${s}px`;const _=a.getRenderTarget(),w=a.getClearColor(new ne),P=a.getClearAlpha(),M=i.scene.background,O="aspect"in r?r.aspect:null;try{const j=o.render_events!==!1,I=new Array;j&&(Wa(i.scene,Kt,I),I.forEach(T=>{if(T?.onBeforeRender(),T.isInstancingActive&&T.instances)for(let $=0;$<T.instances?.length;$++){const W=T.instances[$];Ao(W.object,!0)}})),e&&(i.scene.background=null,a.setClearColor(0,0)),o.background&&(i.scene.background=null,a.setClearColor(o.background),o.background instanceof oe&&a.setClearAlpha(o.background.a)),e&&a.setClearAlpha(0),a.setSize(n,s,!1),"cam"in r&&(r=r.threeCamera),r instanceof re&&(r.aspect=n/s,r.updateProjectionMatrix());const N="type"in o&&o.type==="texture";let V=null;N&&(V=new Vn(n,s,{wrapS:pb,wrapT:pb,format:1023}),a.setRenderTarget(V));let H=c;if(l?(V&&console.error('Taking XR screenshots with { type: "texture" } is currently not supported.'),H=Gh.compositeWithCameraImage({width:p,height:m,scene:i.scene,camera:r,renderer:a})):i.renderNow(r||null),r instanceof re&&O!=null&&(r.aspect=O,r.updateProjectionMatrix()),j&&I.forEach(T=>T.onAfterRender()),!t&&"download_filename"in o&&o.download_filename)switch(o.download_filename.split(".").pop()?.toLowerCase()){case"png":t="image/png";break;case"jpg":case"jpeg":t="image/jpeg";break;case"webp":t="image/webp";break}if(e&&o.trim===!0){const T=EI(H);T&&(H=T)}if("type"in o){if(o.type==="texture")return V?(o.target&&(o.target.image=V?.texture.image,o.target.needsUpdate=!0),V.texture.offset.set(0,-1),V.texture.needsUpdate=!0,V.texture):(console.error("No target texture found"),null);if(o.type==="blob")return new Promise((T,$)=>{H.toBlob(W=>{T(W)},t)});if(o.type==="share")return new Promise((T,$)=>{H.toBlob(W=>{if(W&&"share"in navigator){let se="file_type"in o&&o.file_type||t;t||(se="image/png");const ce=se?.split("/")[1]||"png",fe=new File([W],"filename"in o?o.filename||`screenshot.${ce}`:`screenshot.${ce}`,{type:se});return navigator.share({title:"title"in o?o.title:void 0,text:"text"in o?o.text:void 0,url:"url"in o?o.url:void 0,files:[fe]}).catch(Se=>{console.warn("User cancelled share",Se.message)}).finally(()=>{T({blob:W,shared:!0})})}return{blob:W,shared:!1}},t)})}const X=H.toDataURL(t);if("download_filename"in o&&o.download_filename){let T=o.download_filename;if(q.isMobileDevice()&&typeof window<"u"){const $=T+"_screenshots",W=T.split("."),se=W.pop()?.toLowerCase();let ce=0;localStorage.getItem($)&&(ce=parseInt(sessionStorage.getItem($)||"0")),ce>0&&(T=`${W.join()}-${ce}.${se}`),ce+=1,sessionStorage.setItem($,ce.toString())}W1(X,T)}return X}finally{a.setRenderTarget(_),i.scene.background=M,a.setSize(h,d,!1),a.setClearColor(w,P),O!=null&&r instanceof re&&(r.aspect=O,r.updateProjectionMatrix()),a.xr.enabled=y,a.xr.isPresenting=l,l||i.updateSize(!0)}return null}function EI(o){if(!("document"in globalThis))return null;const e=document.createElement("canvas");e.width=o.width,e.height=o.height;const t=e.getContext("2d");if(!t)return null;t.drawImage(o,0,0);const i=e.width,n=e.height,s=t.getImageData(0,0,i,n).data;let r=n,a=i,l=0,c=0;for(let f=0;f<n;f++)for(let g=0;g<i;g++){const y=(f*i+g)*4;s[y+3]!==0&&(g<a&&(a=g),g>c&&(c=g),f<r&&(r=f),f>l&&(l=f))}const h=c-a+1,d=l-r+1,p=document.createElement("canvas"),m=p.getContext("2d");return m?(p.width=h,p.height=d,m.drawImage(e,a,r,h,d,0,0,h,d),p):null}let Hh=null;function W1(o,e){if(o){if(!o.startsWith("data:image")){console.error("Can not save image: Data url is not an image",o);return}Hh||(Hh=document.createElement("a")),Hh.href=o,Hh.download=e,Hh.click()}}var Gh;(o=>{let e=null,t=null,i=null,n=null,s=null;function r(c){const{renderer:h,width:d,height:p}=c,m=h.xr.enabled,f=h.getRenderTarget(),g=h.autoClear,y=d,_=p,w=d/p;(!i||i.width!==y||i.height!==_)&&(i??=new Vn(y,_,{colorSpace:Co}),i.width=y,i.height=_,i.samples=4,i.texture.repeat.y=-1,i.texture.offset.y=1),(!s||s.width!==y||s.height!==_)&&(s=document.createElement("canvas"),s.width=y,s.height=_,s.style.position="fixed",s.style.top="0px",s.style.right="0px",s.style.width="300px",s.style.height=`${300/w}px`,s.style.zIndex="1000",s.style.pointerEvents="none",s.style.opacity="1.0",s.style.willChange="contents"),e||(e=l({defines:{DECODE_VIDEO_TEXTURE:!0}})),t||(t=l()),n||(n=new Le),h.xr.updateCamera(c.camera),h.xr.enabled=!1,h.autoClear=!1,h.clear(),h.setSize(y,_),h.setRenderTarget(i),N1(c.renderer,n)||console.error("Could not update texture from XR frame");const P=x.findObjectOfType(qh);return P?P.setTexture(n):(e.setTexture(n),h.render(e,c.camera)),h.clearDepth(),h.setSize(y,_),h.render(c.scene,c.camera),h.setRenderTarget(null),t.setTexture(i.texture),h.render(t,c.camera),s.getContext("2d",{alpha:!1}).drawImage(h.domElement,0,0,s.width,s.height),h.setRenderTarget(f),h.xr.enabled=m,h.autoClear=g,s}o.compositeWithCameraImage=r;const a=`
1434
- uniform sampler2D t2D;
1435
- varying vec2 vUv;
1436
-
1437
- void main() {
1438
-
1439
- vec4 texColor = texture2D( t2D, vUv );
1440
-
1441
- #ifdef DECODE_VIDEO_TEXTURE
1442
-
1443
- // inline sRGB decode (TODO: Remove this code when https://crbug.com/1256340 is solved)
1444
- texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
1445
-
1446
- #endif
1447
-
1448
- gl_FragColor = texColor;
1449
- #include <tonemapping_fragment>
1450
- #include <colorspace_fragment>
1451
- }
1452
- `;function l(c){const h=c?.material||new zn({name:"BackgroundMaterial",uniforms:ub.clone(kd.background.uniforms),vertexShader:kd.background.vertexShader,fragmentShader:a,defines:c?.defines,side:ps,depthTest:!1,depthWrite:!1,fog:!1});Object.defineProperty(h,"map",{get:function(){return this.threeTexture}});const d=new G(new Un(2,2),h);return Id(d,!1),d.geometry.deleteAttribute("normal"),d.renderOrder=-1e6,d.setTexture=function(p){h.uniforms.t2D.value=p},d}o.makeFullscreenPlane=l})(Gh||(Gh={}));var AI=Object.defineProperty,II=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&AI(e,t,n),n};const $1=v("debugarcamera");class qh extends R{onBeforeXR(e,t){e==="immersive-ar"&&(t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.push("camera-access"),$1&&console.warn("Requesting camera-access"))}onEnterXR(e){e.xr.mode==="immersive-ar"&&(this.backgroundPlane&&(this.context.scene.add(this.backgroundPlane),this.backgroundPlane.visible=!1),this.backgroundPlane&&this.context.scene.add(this.backgroundPlane),this.context.pre_render_callbacks.push(this.preRender))}onLeaveXR(e){this.backgroundPlane&&this.backgroundPlane.removeFromParent();const t=this.context.pre_render_callbacks.indexOf(this.preRender);t>=0&&this.context.pre_render_callbacks.splice(t,1)}backgroundTint=new oe(1,1,1,1);get background(){return this.backgroundPlane}backgroundPlane;threeTexture;forceTextureInitialization=function(){const e=new xe,t=new Un,i=new wi;i.add(new G(t,e));const n=new re;return function(s,r){e.map=r,s.render(i,n),$1&&console.warn("Force texture initialization")}}();preRender=()=>{if(!(!this||!this.gameObject)&&this.context.renderer.xr.getFrame()){if(!this.threeTexture&&this.context.renderer&&(this.threeTexture=new Le,this.forceTextureInitialization(this.context.renderer,this.threeTexture)),this.backgroundPlane===void 0){const e=this.backgroundTint;this.backgroundPlane=Gh.makeFullscreenPlane({material:new zn({name:"BackgroundMaterial",uniforms:{...ub.clone(kd.background.uniforms),tint:{value:new pe(e.r,e.g,e.b,e.a)}},vertexShader:kd.background.vertexShader,fragmentShader:LI,side:Ci,depthTest:!1,depthWrite:!1,fog:!1})})}this.backgroundPlane.parent!==this.scene&&this.scene.add(this.backgroundPlane),this.backgroundPlane.material instanceof zn&&this.backgroundPlane.material.uniforms.tint.value.set(this.backgroundTint.r,this.backgroundTint.g,this.backgroundTint.b,this.backgroundTint.a),this.updateFromFrame()}};onBeforeRender(e){this.updateFromFrame()}updateFromFrame(){this.threeTexture&&this.context.xr?.mode==="immersive-ar"&&(N1(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)}}II([u(oe)],qh.prototype,"backgroundTint");const LI=`
1453
- uniform sampler2D t2D;
1454
- uniform vec4 tint;
1455
-
1456
- varying vec2 vUv;
1457
-
1458
- void main() {
1459
-
1460
- vec4 texColor = texture2D( t2D, vUv );
1461
- texColor.w = 1.0;
1462
-
1463
- // inline sRGB decode
1464
- texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
1465
-
1466
- gl_FragColor = texColor * tint;
1467
-
1468
- #include <tonemapping_fragment>
1469
- #include <colorspace_fragment>
1470
- }
1471
- `;var jI=Object.defineProperty,tr=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&jI(e,t,n),n};const em=v("debugimagetracking");class Xl{get url(){return this._trackedImage.image??""}get widthInMeters(){return this._trackedImage.widthInMeters??void 0}get bitmap(){return this._bitmap}get model(){return this._trackedImage}measuredSize;state;getPosition(e){return this.ensureTransformData(),e.copy(this._position),e}getQuaternion(e){return this.ensureTransformData(),e.copy(this._rotation),e}applyToObject(e,t=void 0){this.ensureTransformData();const i=e.position.distanceToSquared(this._position)/.05+e.quaternion.angleTo(this._rotation)/.05;t&&(t*=Math.max(1,i)),t===void 0||t>=1?(e.position.copy(this._position),e.quaternion.copy(this._rotation)):(t=Math.max(0,Math.min(1,t)),e.position.lerp(this._position,t),e.quaternion.slerp(this._rotation,t))}static _positionBuffer=new Oi(()=>new b,20);static _rotationBuffer=new Oi(()=>new U,20);_position;_rotation;ensureTransformData(){if(!this._position){this._position=Xl._positionBuffer.get(),this._rotation=Xl._rotationBuffer.get();const e=this._pose.transform,t=Z.active.convertSpace(e);this._position.copy(t?.position),this._rotation.copy(t?.quaternion)}}_trackingComponent;_trackedImage;_bitmap;_pose;constructor(e,t,i,n,s,r){this._trackingComponent=e,this._trackedImage=t,this._bitmap=i,this.measuredSize=n,this.state=s,this._pose=r}}class ts{constructor(e){this.image=e.url,this.widthInMeters=e.widthInMeters,e.object instanceof k?this.object=new ie({asset:e.object}):this.object=e.object,e.createObjectInstance!==void 0&&(this.createObjectInstance=e.createObjectInstance),e.imageDoesNotMove!==void 0&&(this.imageDoesNotMove=e.imageDoesNotMove),e.hideWhenTrackingIsLost!==void 0&&(this.hideWhenTrackingIsLost=e.hideWhenTrackingIsLost)}image;widthInMeters=.25;object;createObjectInstance=!1;imageDoesNotMove=!1;hideWhenTrackingIsLost=!0;getNameFromUrl(){if(this.image){const e=this.image.split("/");return e[e.length-1]}return null}}tr([u(URL)],ts.prototype,"image"),tr([u()],ts.prototype,"widthInMeters"),tr([u(ie)],ts.prototype,"object"),tr([u()],ts.prototype,"createObjectInstance"),tr([u()],ts.prototype,"imageDoesNotMove"),tr([u()],ts.prototype,"hideWhenTrackingIsLost");class DI{constructor(e,t){this.exporter=e,this.component=t,em&&console.log(this),this.exporter.anchoringType="image"}isImageTrackingExtension=!0;get extensionName(){return"image-tracking"}shouldExport=!0;filename=null;imageModel=null;onBeforeBuildDocument(e){const t=this.exporter.extensions.filter(i=>{const n=i;return n.isImageTrackingExtension&&n.component.activeAndEnabled&&n.component.trackedImages?.length>0}).indexOf(this);this.shouldExport=t===0,this.shouldExport&&this.component.trackedImages?.length>1&&(em||A())&&(ye("USDZ: Only one tracked image is supported."),console.warn("USDZ: Only one tracked image is supported. Will choose the first one in the trackedImages list"))}onAfterHierarchy(e,t){if(!this.shouldExport)return;const i=q.getiOSVersion(),n=(i?parseInt(i.split(".")[0]):18)>=18?1:100;t.beginBlock('def Preliminary_ReferenceImage "AnchoringReferenceImage"'),t.appendLine("uniform asset image = @image_tracking/"+this.filename+"@"),t.appendLine("uniform double physicalWidth = "+(this.imageModel.widthInMeters*n).toFixed(8)),t.closeBlock()}async onAfterSerialize(e){if(!this.shouldExport)return;const t=this.imageModel,i=Qh.get(t.image),n=await(await(await jx(i)).convertToBlob({type:"image/png"})).arrayBuffer();e.files["image_tracking/"+this.filename]=new Uint8Array(n)}onExportObject(e,t,i){if(!this.shouldExport)return;const n=this.component;if(!n||!n.trackedImages?.length||!n.activeAndEnabled)return;const s=n.trackedImages[0];if(s.object?.asset===e){this.imageModel=s,this.filename=s.getNameFromUrl()||"marker.png";const{scale:r,target:a}=this.exporter.getARScaleAndTarget();let l=e;const c=new K;if(e!==a)for(;l&&l.parent&&l.parent!==a;)l=l.parent,c.premultiply(l.matrix);const h=c.clone().invert();t.setMatrix(h.scale(new b(r,r,r)))}}}class Xh extends R{setPrimaryImage(e){const t=this.trackedImages.indexOf(e);if(t>=0){const i=this.trackedImages[0];i!==e&&(this.trackedImages[0]=e,this.trackedImages[t]=i)}else console.warn(`[WebXRImageTracking] Can not set primary: image not found in 'trackedImages' array ${e.image}`)}addImage(e,t=!1){this.trackedImages.includes(e)||(this.trackedImages.push(e),H1(e.image)),t&&this.setPrimaryImage(e)}trackedImages=[];smooth=!0;trackedImageIndexMap=new Map;get supported(){return this._supported}_supported=!0;awake(){if(em&&console.log(this),!!this.trackedImages)for(const e of this.trackedImages)e.image&&H1(e.image)}onEnable(){Tn.beforeExport.addEventListener(this.onBeforeUSDZExport)}onDisable(){Tn.beforeExport.removeEventListener(this.onBeforeUSDZExport)}onBeforeUSDZExport=e=>{this.activeAndEnabled&&this.trackedImages?.length&&e.exporter.extensions.push(new DI(e.exporter,this))};onBeforeXR(e,t){if(this.trackedImages){t.optionalFeatures=t.optionalFeatures||[],t.optionalFeatures.includes("image-tracking")||t.optionalFeatures.push("image-tracking"),t.trackedImages=[];for(const i of this.trackedImages)if(i.image?.length&&i.widthInMeters>0){const n=Qh.get(i.image);n&&(this.trackedImageIndexMap.set(t.trackedImages.length,i),t.trackedImages.push({image:n,widthInMeters:i.widthInMeters}))}}}onEnterXR(e){if(this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;i.userData||(i.userData={});const n={visible:i.visible,parent:i.parent,matrix:i.matrix.clone()};i.userData["image-tracking"]=n}}for(const t of this.imageToObjectMap.values())t.frames=0}onLeaveXR(e){if(!this.supported&&q.isAndroidDevice()&&ye(this.webXRIncubationsWarning),this.trackedImages){for(const t of this.trackedImages)if(t.object?.asset){const i=t.object.asset;if(i.userData){const n=i.userData["image-tracking"];n&&(i.visible=n.visible,n.parent?.add(i),i.matrix.copy(n.matrix),i.matrix.decompose(i.position,i.quaternion,i.scale)),delete i.userData["image-tracking"]}}}}imageToObjectMap=new Map;currentImages=[];webXRIncubationsWarning=`Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a target="_blank" href="#" onclick="() => console.log('I')">chrome://flags/#webxr-incubations</a> flag.`;onUpdateXR(e){this.currentImages.length=0;const t=e.xr.frame;if(!t)return;if("getImageTrackingResults"in t){if(e.xr.session.enabledFeatures?.includes("image-tracking")===!1)return;if(t.session&&typeof t.getImageTrackingResults=="function"){const n=t.getImageTrackingResults();if(n.length>0){const s=this.context.renderer.xr.getReferenceSpace();if(s){for(const r of n){const a=r.trackingState,l=r.index,c=this.trackedImageIndexMap.get(l);if(c){const h=t.getPose(r.imageSpace,s),d=new Xl(this,c,r.image,r.measuredSize,a,h);this.currentImages.push(d)}else em&&console.warn("No tracked image for index",l)}if(this.currentImages.length>0)try{this.dispatchEvent(new CustomEvent("image-tracking",{detail:this.currentImages})),this.onImageTrackingUpdate(this.currentImages)}catch(r){console.error(r)}}}}}else{this.didPrintWarning||(this.didPrintWarning=!0,console.log(this.webXRIncubationsWarning)),this._supported=!1,ye(this.webXRIncubationsWarning);return}const i=1e3;for(const[n,s]of this.imageToObjectMap){if(!s.object||!n||n.hideWhenTrackingIsLost===!1)continue;let r=!1;for(const a of this.currentImages)if(a.model===n){const l=Date.now()-s.lastTrackingTime;if(n.imageDoesNotMove||a.state==="tracked"||l<=i){r=!0;break}}r||x.setActive(s.object,!1)}}onImageTrackingUpdate=e=>{const t=Z.active;if(t)for(const i of e){const n=i.model,s=i.state==="tracked";if(!n.object)continue;let r=this.imageToObjectMap.get(n);if(r===void 0)r={object:null,frames:0,lastTrackingTime:Date.now()},this.imageToObjectMap.set(n,r),n.object.loadAssetAsync().then(a=>{if(n.createObjectInstance&&a&&(a=x.instantiate(a)),a){r.object=a;for(const l of a.getComponentsInChildren(Kt))l.setInstancingEnabled(!1);t.rig?(t.rig.gameObject.add(a),i.applyToObject(a),a.activeSelf||x.setActive(a,!0)):console.warn("XRImageTracking: missing XRRig")}});else{if(r.frames++,s&&(r.lastTrackingTime=Date.now()),n.imageDoesNotMove&&r.frames>10||!r.object)continue;t.rig&&(t.rig.gameObject.add(r.object),i.applyToObject(r.object,this.smooth?this.context.time.deltaTimeUnscaled*3:void 0),r.object.activeSelf||x.setActive(r.object,!0))}}}}tr([u(ts)],Xh.prototype,"trackedImages"),tr([u()],Xh.prototype,"smooth");const Qh=new Map,tm=new Map;async function H1(o){if(Qh.has(o))return tm.has(o)?tm.get(o):Promise.resolve(!0);const e=new Promise(t=>{Qh.set(o,null);const i=document.createElement("img");i.src=o,i.addEventListener("load",async()=>{const n=await createImageBitmap(i);Qh.set(o,n),t(!0)})});return tm.set(o,e),e.finally(()=>{tm.delete(o)}),e}var BI=Object.defineProperty,zl=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&BI(e,t,n),n};const ma=v("debugplanetracking");class is extends R{dataTemplate;occluder=!0;initiateRoomCaptureIfNoData=!0;usePlaneData=!0;useMeshData=!0;runInVR=!0;get trackedPlanes(){return this._allPlanes.values()}get trackedMeshes(){return this._allMeshes.values()}onBeforeXR(e,t){e==="immersive-vr"&&!this.runInVR||(t.optionalFeatures=t.optionalFeatures||[],this.usePlaneData&&!t.optionalFeatures.includes("plane-detection")&&t.optionalFeatures.push("plane-detection"),this.useMeshData&&!t.optionalFeatures.includes("mesh-detection")&&t.optionalFeatures.push("mesh-detection"))}onEnterXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onLeaveXR(e){for(const t of this._allPlanes.keys())this.removeData(t,this._allPlanes);for(const t of this._allMeshes.keys())this.removeData(t,this._allMeshes)}onUpdateXR(e){if(!this.runInVR&&e.xr.isVR)return;const t=e.xr.rig;if(!t){console.warn("No XR rig found, cannot parent tracked planes to it");return}const i=e.xr.frame;if(!this.context.renderer.xr.getReferenceSpace())return;const n=i.detectedPlanes,s=i.detectedMeshes,r=n!==void 0&&n.size>0,a=s!==void 0&&s.size>0;if(this.initiateRoomCaptureIfNoData&&(!r&&!a&&this.firstTimeNoPlanesDetected<-10&&(this.firstTimeNoPlanesDetected=Date.now()),(r||a)&&(this.firstTimeNoPlanesDetected=-1),this.firstTimeNoPlanesDetected>0&&Date.now()-this.firstTimeNoPlanesDetected>2500&&"initiateRoomCapture"in i.session&&(i.session.initiateRoomCapture(),this.firstTimeNoPlanesDetected=-1)),n!==void 0&&this.processFrameData(e.xr,t.gameObject,i,n,this._allPlanes),s!==void 0&&this.processFrameData(e.xr,t.gameObject,i,s,this._allMeshes),ma){const l=this.context.mainCameraComponent.gameObject.worldPosition;for(const c of this._allPlanes.values())!c.mesh||!c.mesh.visible||(this.bounds.makeEmpty(),c.mesh.traverse(h=>{h instanceof G&&this.bounds.expandByObject(h)}),this.bounds.getCenter(this.center),this.labelOffset.copy(l).sub(this.center).normalize().multiplyScalar(.1),B.DrawLabel(this.center.add(this.labelOffset),(c.xrData.semanticLabel||"plane").toUpperCase()+`
1472
- `+c.xrData.lastChangedTime.toFixed(2),.02))}}bounds=new xi;center=new b;labelOffset=new b;removeData(e,t){const i=t.get(e);if(!i)return;t.delete(e),ma&&console.log("Plane no longer tracked, id="+i.id),i.mesh&&(i.mesh.removeFromParent(),i.mesh.traverse(s=>{const r=s.userData.normalsHelper;r?(r.dispose(),r.removeFromParent()):ma&&console.warn("No normals helper found for mesh",i.mesh)}),Zi(i.mesh,!0,!0));const n=new CustomEvent("plane-tracking",{detail:{type:"plane-removed",context:i}});this.dispatchEvent(n)}_dataId=1;_allPlanes=new Map;_allMeshes=new Map;firstTimeNoPlanesDetected=-100;makeOccluder=(e,t,i=!1)=>{if(t){if(t instanceof Array){for(const n of t)this.makeOccluder(e,n,i);return}!i&&!t.name.toLowerCase().includes("occlu")||(t.colorWrite=!1,t.depthTest=!0,t.depthWrite=!0,t.transparent=!1,t.polygonOffset=!0,t.polygonOffsetFactor=1,t.polygonOffsetUnits=.1,e.renderOrder=-1e3)}};processFrameData(e,t,i,n,s){const r=this.context.renderer.xr.getReferenceSpace();if(r){for(const a of s.keys())n.has(a)||this.removeData(a,s);for(const a of n){const l="planeSpace"in a?a.planeSpace:"meshSpace"in a?a.meshSpace:void 0;if(!l)continue;const c=i.getPose(l,r);let h;if(s.has(a)){const d=s.get(a);if(h=d.mesh,d.timestamp<a.lastChangedTime){if(d.timestamp=a.lastChangedTime,d.mesh){const m=this.createGeometry(a);if(d.mesh instanceof G)d.mesh.geometry.dispose(),d.mesh.geometry=m,this.makeOccluder(d.mesh,d.mesh.material);else if(d.mesh instanceof xo)for(const f of d.mesh.children)f instanceof G&&(f.geometry.dispose(),f.geometry=m,this.makeOccluder(f,f.material));if(d.collider){const f=d.mesh;d.collider.sharedMesh=f,d.collider.convex=this.checkIfContextShouldBeConvex(f,d.xrData),d.collider.onDisable(),d.collider.onEnable()}ma&&(console.log("Plane updated, id="+d.id,d),d.mesh.traverse(f=>{if(!(f instanceof G))return;const g=f.userData.normalsHelper;g&&g.update()}))}const p=new CustomEvent("plane-tracking",{detail:{type:"plane-updated",context:d}});this.dispatchEvent(p)}}else{if(!this.dataTemplate){const d=new G;ma?d.material=new jC:this.occluder?(d.material=new xe,this.makeOccluder(d,d.material,!0)):d.material=new xe({wireframe:!0,opacity:.5,transparent:!0,color:3355443}),this.dataTemplate=new ie("","",d)}if(!this.dataTemplate.asset)this.dataTemplate.loadAssetAsync();else{const d=x.instantiate(this.dataTemplate.asset);if(d.name="xr-tracked-plane",h=d,eg(d,!1),d instanceof G)Pe(d.geometry),d.geometry=this.createGeometry(a),this.makeOccluder(d,d.material,this.occluder&&!this.dataTemplate);else if(d instanceof xo)for(const f of d.children)f instanceof G&&(Pe(f.geometry),f.geometry=this.createGeometry(a),this.makeOccluder(f,f.material,this.occluder&&!this.dataTemplate));const p=d.getComponent(Rs);if(p){const f=d;p.sharedMesh=f,p.convex=this.checkIfContextShouldBeConvex(f,a),p.onDisable(),p.onEnable()}d.matrixAutoUpdate=!1,d.matrixWorldNeedsUpdate=!0,t.add(d);const m={id:this._dataId++,xrData:a,timestamp:a.lastChangedTime,mesh:d,collider:p};s.set(a,m),ma&&console.log("New plane detected, id="+m.id,m,{hasCollider:!!p,isGroup:d instanceof xo});try{const f=new CustomEvent("plane-tracking",{detail:{type:"plane-added",context:m}});this.dispatchEvent(f)}catch(f){console.error(f)}}}h&&(c?(h.visible=!0,h.matrix.fromArray(c.transform.matrix),h.matrix.premultiply(this._flipForwardMatrix)):h.visible=!1,ma&&h.traverse(d=>{if(d instanceof G)if(d.userData.normalsHelper)d.userData.normalsHelper.update();else{const p=new oP(d,.05,255);p.layers.disableAll(),p.layers.set(2),this.context.scene.add(p),d.userData.normalsHelper=p}}))}}}_flipForwardMatrix=new K().makeRotationY(Math.PI);checkIfContextShouldBeConvex(e,t){if(!e)return!0;if(e){const i=new xi;i.expandByObject(e);const n=new b;i.getSize(n);let s=!0;return n.x>2&&n.y>2&&n.z>1.5&&(s=!1),s&&"semanticLabel"in t&&t.semanticLabel==="wall"&&(s=!0),s}return!0}createGeometry(e){return"polygon"in e?this.createPlaneGeometry(e.polygon):"vertices"in e&&"indices"in e?this.createMeshGeometry(e.vertices,e.indices):new gn}_verticesCache=new Map;createMeshGeometry(e,t){const i=e.toString()+"_"+t.toString();if(this._verticesCache.has(i))return this._verticesCache.get(i);const n=new gn;n.setIndex(new mt(t,1)),n.setAttribute("position",new mt(e,3));const s=Array();for(let r=0;r<e.length;r+=3)s.push(e[r],e[r+2]);return n.setAttribute("uv",new mt(e,3)),n.computeVertexNormals(),this._verticesCache.set(i,n),n}createPlaneGeometry(e){const t=new gn,i=[],n=[];e.forEach(p=>{i.push(p.x,p.y,p.z),n.push(p.x,p.z)});const s=new b(i[0],i[1],i[2]),r=new b(i[3],i[4],i[5]),a=new b(i[6],i[7],i[8]),l=new b,c=new b;l.subVectors(r,s),c.subVectors(a,s),l.cross(c),l.normalize();const h=[];for(let p=0;p<i.length/3;p++)h.push(l.x,l.y,l.z);const d=[];for(let p=2;p<e.length;++p)d.push(0,p-1,p);return t.setAttribute("position",new mt(new Float32Array(i),3)),t.setAttribute("uv",new mt(new Float32Array(n),2)),t.setAttribute("normal",new mt(new Float32Array(h),3)),t.setIndex(d),t.computeBoundingBox(),t.computeBoundingSphere(),t}}zl([u(ie)],is.prototype,"dataTemplate"),zl([u()],is.prototype,"occluder"),zl([u()],is.prototype,"initiateRoomCaptureIfNoData"),zl([u()],is.prototype,"usePlaneData"),zl([u()],is.prototype,"useMeshData"),zl([u()],is.prototype,"runInVR");var FI=Object.defineProperty,UI=(o,e,t,i)=>{for(var n=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(n=r(e,t,n)||n);return n&&FI(e,t,n),n};const G1=v("debugwebxr");class im extends R{priority=0;get isActive(){return this.activeAndEnabled&&this.gameObject.visible}setAsActiveXRRig(){Z.active?.setRigActive(this)}setPriority(e){this.priority=e}awake(){if(G1){const e=new k;e.position.y+=.5,this.gameObject.add(e);const t=e.addNewComponent(Kr);t&&(t.isGizmo=!1);const i=new Si(.5);this.gameObject.add(i)}}isXRRig(){return!0}supportsXR(e){return!0}_startScale;onEnterXR(e){this._startScale=this.gameObject.scale.clone(),e.xr.addRig(this),G1&&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)}}UI([u()],im.prototype,"priority");class zI extends R{toggleKey="KeyP";update(){this.context.input.isKeyDown(this.toggleKey)&&this.context.domElement.classList.toggle("presentation-mode")}}C.add("AlignmentConstraint",jc),C.add("Animation",Dt),C.add("Animator",yt),C.add("AudioListener",Do),C.add("AudioSource",Ai),C.add("Avatar_Brain_LookAt",Vc),C.add("Avatar_MouthShapes",Wc),C.add("Avatar_MustacheShake",Of),C.add("AvatarBlink_Simple",Ur),C.add("AvatarEyeLook_Rotation",Mf),C.add("AxesHelper",tl),C.add("BasicIKConstraint",Tf),C.add("BoxHelperComponent",St),C.add("Camera",hi),C.add("CharacterController",zr),C.add("CharacterControllerInput",Uo),C.add("Collider",ui),C.add("SphereCollider",il),C.add("BoxCollider",zu),C.add("MeshCollider",Rs),C.add("CapsuleCollider",Bo),C.add("ContactShadows",Hc),C.add("LogStats",If),C.add("DeleteBox",ar),C.add("Deletable",jf),C.add("DeviceFlag",Nu),C.add("DragControls",Wr),C.add("DropListener",No),C.add("Duplicatable",Kf),C.add("EventListEvent",Eu),C.add("EventTrigger",Qu),C.add("GltfExportBox",iy),C.add("GltfExport",oy),C.add("VariantAction",py),C.add("ChangeTransformOnClick",qr),C.add("ChangeMaterialOnClick",gy),C.add("SetActiveOnClick",fy),C.add("HideOnStart",un),C.add("EmphasizeOnClick",gl),C.add("PlayAudioOnClick",Is),C.add("PlayAnimationOnClick",Jc),C.add("PreliminaryAction",fl),C.add("PreliminaryTrigger",eh),C.add("VisibilityAction",th),C.add("TapGestureTrigger",by),C.add("USDZExporter",Tn),C.add("Fog",Cl),C.add("BoxGizmo",Kr),C.add("GridHelper",Pl),C.add("GroundProjectedEnv",Yn),C.add("UsageMarker",Gc),C.add("Interactable",Lf),C.add("FixedJoint",Gy),C.add("HingeJoint",uh),C.add("Light",fi),C.add("LODGroup",mh),C.add("LookAtConstraint",jr),C.add("NeedleMenu",ro),C.add("NestedGltf",gh),C.add("Networking",Yy),C.add("OffsetConstraint",Jr),C.add("CameraTargetReachedEvent",Nc),C.add("OrbitControls",me),C.add("ParticleSystemRenderer",sn),C.add("ParticleSystem",_h),C.add("Attractor",Rl),C.add("PlayerColor",ql),C.add("Antialiasing",wh),C.add("BloomEffect",Mp),C.add("ChromaticAberration",xh),C.add("ColorAdjustments",qs),C.add("DepthOfField",An),C.add("EffectWrapper",Ch),C.add("PixelationEffect",Ph),C.add("ScreenSpaceAmbientOcclusion",Qo),C.add("ScreenSpaceAmbientOcclusionN8",In),C.add("SharpeningEffect",kh),C.add("TiltShiftEffect",co),C.add("ToneMappingEffect",Gs),C.add("Vignette",ra),C.add("Volume",El),C.add("ReflectionProbe",Xc),C.add("Renderer",Kt),C.add("MeshRenderer",Qc),C.add("SkinnedMeshRenderer",Yf),C.add("Rigidbody",Ze),C.add("SceneSwitcher",Qe),C.add("ScreenCapture",Qs),C.add("SeeThrough",Zo),C.add("ShadowCatcher",Ah),C.add("RemoteSkybox",jp),C.add("SmoothFollow",Bp),C.add("SpatialTriggerReceiver",ho),C.add("SpatialTrigger",Fp),C.add("SpectatorCamera",Up),C.add("SplineContainer",ca),C.add("SplineWalker",an),C.add("SpriteRenderer",mi),C.add("SyncedCamera",_0),C.add("SyncedRoom",Ln),C.add("SyncedTransform",Pn),C.add("TestRunner",x0),C.add("TestSimulateUserData",S0),C.add("PlayableDirector",ha),C.add("SignalReceiver",Fh),C.add("AnimationTrackHandler",Uh),C.add("AudioTrackHandler",cs),C.add("MarkerTrackHandler",Wp),C.add("SignalTrackHandler",zh),C.add("ControlTrackHandler",$p),C.add("TransformGizmo",da),C.add("BaseUIComponent",cn),C.add("UIRootComponent",rh),C.add("Button",Ko),C.add("Canvas",Sl),C.add("CanvasGroup",zs),C.add("EventSystem",si),C.add("Graphic",ch),C.add("MaskableGraphic",hh),C.add("Image",jl),C.add("RawImage",qp),C.add("InputField",k0),C.add("VerticalLayoutGroup",jy),C.add("HorizontalLayoutGroup",Dy),C.add("GridLayoutGroup",By),C.add("Outline",wl),C.add("ObjectRaycaster",Ei),C.add("GraphicRaycaster",Lu),C.add("SpatialGrabRaycaster",ya),C.add("RectTransform",Rn),C.add("SpatialHtml",Vh),C.add("Text",Nt),C.add("EnvironmentScene",Qp),C.add("LookAt",M0),C.add("OpenURL",Dl),C.add("VideoPlayer",dt),C.add("Voip",Ms),C.add("ClickThrough",Zp),C.add("CursorFollow",pa),C.add("HoverAnimation",go),C.add("ScrollFollow",Jo),C.add("ViewBox",it),C.add("Avatar",js),C.add("XRControllerFollow",es),C.add("XRControllerModel",$o),C.add("XRControllerMovement",Li),C.add("TeleportTarget",hp),C.add("WebARCameraBackground",qh),C.add("WebARSessionRoot",Ni),C.add("WebXR",dp),C.add("AvatarMarker",Ie),C.add("WebXRImageTracking",Xh),C.add("WebXRPlaneTracking",is),C.add("XRRig",im),C.add("XRFlag",en),C.add("PlayerSync",Cy),C.add("PlayerState",kn),C.add("PresentationMode",zI);const Yh=ft,NI=v("debugtypestore");NI&&console.log(C);function VI(o,e){const t=Pv(o,e);return t!==void 0?t:null}const WI=new Fk,j0=Symbol("deserialize-queue");async function $I(o,e,t,i=null,n){if(!t){console.debug("Can not create component instances: gltf is null");return}const s=[];let r=i;typeof r=="number"&&(r=new Lt(i));const a=e.indexOf("?");e=a===-1?e:e.substring(0,a);const l=new $g(t.scene);l.gltfId=e,l.context=o,l.gltf=t,l.nodeToObject=n?.nodeToObjectMap,l.implementationInformation=WI;let c=o[j0];if(c||(c=o[j0]=[]),t.scenes)for(const h of t.scenes)await F0(l,h,c,s,0);if(t.children)for(const h of t.children)await F0(l,h,c,s,0);o.new_scripts_pre_setup_callbacks.push(()=>{const h=o[j0];if(h){for(const d of h)HI(d,l);h.length=0}if(r){const d={},p=[];B0(t,r,d,p);for(const m of t.scenes)B0(m,r,d,p);for(const m of p)m.resolveGuids(d)}})}const D0=Symbol("original-component-name"),Nl=new Map;function B0(o,e,t,i){if(e===null||!o)return;const n=o.guid,s=o.guid;s?.length&&(Nl.has(s)||(Yh&&console.log('Creating InstanceIdProvider with key "'+s+'" for object '+o.name),Nl.set(s,new Lt(s))));const r=s&&Nl.get(s)||e;if(o.guid=r.generateUUID(),n&&n!=="invalid"&&(t[n]=o.guid),o&&o.userData&&o.userData.components)for(const a of o.userData.components){if(a===null)continue;const l=a.guid;l?Nl.has(l)||(Yh&&console.log('Creating InstanceIdProvider with key "'+l+'" for component '+a[D0]),Nl.set(l,new Lt(l))):Yh&&console.warn("Can not create IdProvider: component "+a[D0]+" has no guid",a.guid);const c=Nl.get(l)||e,h=a.guid;a.guid=c.generateUUID(),h&&h!=="invalid"&&(t[h]=a.guid),a.resolveGuids&&i.push(a)}if(o.children)for(const a of o.children)B0(a,e,t,i)}const Zh=[];async function F0(o,e,t,i,n){if(!e)return;const s=e.userData;if(s){const r=s.builtin_components;if(r&&r.length>0)for(const a of r)try{if(a===null)continue;const l=C.get(a.name);if(l!=null){const c=new l;c.sourceId=o.gltfId,Va(c,a,o.implementationInformation),c.context=o.context,"guid"in a&&(c[hc]=a.guid),c[D0]=a.name,kr(e,c,!1),t.push({instance:c,compData:a,obj:e}),c.isCamera&&o.context&&o.context.mainCamera===null&&c.tag==="MainCamera"&&o.context.setCurrentCamera(c),o.context?.physics?.engine?.isInitialized===!1&&(c.isCollider||c.isRigidbody)&&o.context?.physics.engine?.initialize()}else Yh&&console.debug("unknown component: "+a.name),Zh.includes(a.name)||Zh.push(a.name)}catch(l){console.error(a.name+" - "+l.message,l)}}if(e.children)for(const r of e.children)await F0(o,r,t,i,n+1);if(Zh.length>0&&n===0){const r=Zh.join(", ");console.warn(`Unknown components in scene: ${r}`),Zh.length=0,$i()&&Te(`<strong>Unknown components in scene</strong>:
1473
-
1474
- ${r}
1475
-
1476
- This could mean you forgot to add a npmdef to your ExportInfo
1477
- <a href="https://engine.needle.tools/docs/project_structure.html#creating-and-installing-a-npmdef" target="_blank">documentation</a>`,ki.Warn)}}function HI(o,e){const{instance:t,compData:i,obj:n}=o;e.object=n,e.target=t,su(t,i,e),Yh&&console.debug("add "+i.name,i,t)}class q1{createBuiltinComponents(e,t,i,n,s){return $I(e,t,i,n,s)}writeBuiltinComponentData(e,t){return VI(e,t)}parseSync(e,t,i,n){return Y1(e,t,i,n)}loadSync(e,t,i,n,s){return U0(e,t,i,n,s)}}rg(q1);const X1=v("printGltf")||v("printgltf"),GI=v("debugfileformat");async function Q1(o,e,t){const i=await ox(o,{useExtension:!0})||"unknown";GI&&console.debug(`Determined file type: '${i}' for url '${o}'`,{registeredModelLoaderCallbacks:ol});for(const n of ol){const{callback:s}=n,r=s({context:e,url:o,mimetype:i});if(r instanceof Promise&&await r,r)return console.debug(`Using custom loader (${n.name||"unnamed"}) for ${i} at '${o}'`),r}switch(i){case"unsupported":return null;default:case"unknown":{console.warn(`Unknown file type (${i}). Needle Engine will fallback to the GLTFLoader - To support more model formats please create a Needle loader plugin.
1478
- Use import { NeedleEngineModelLoader } from "@needle-tools/engine" namespace to register your loader.`,o);const n=new Po;return await Gu(n,e,o,t),n}case"model/fbx":case"model/vnd.autodesk.fbx":return new wb;case"model/obj":return new Mm;case"model/vnd.usdz+zip":case"model/vnd.usd+zip":case"model/vnd.usda+zip":return console.warn(i.toUpperCase()+" files are not supported."),null;case"model/gltf+json":case"model/gltf-binary":case"model/vrm":{const n=new Po;return await Gu(n,e,o,t),n}}}function qI(o,e){return U0(e?.context||z.Current,o,o,e?.seed||null,e?.onprogress)}async function Y1(o,e,t,i){typeof t!="string"&&(console.warn("Parse gltf binary without path, this might lead to errors in resolving extensions. Please provide the source path of the gltf/glb file",t,typeof t),t=""),X1&&console.log("Parse glTF",t);const n=await Q1(t,o,t);if(!n)return;const{componentsExtension:s}=Z1(n,o);if(n instanceof Mm){typeof e!="string"&&(e=new TextDecoder().decode(e));const r=n.parse(e);return await Kh(n,o,t,r,i,s)}if(!(n instanceof Po)){if(n.parse===void 0){console.error("Loader does not support parse");return}const r=n.parse(e,t);return await Kh(n,o,t,r,i,s)}return new Promise((r,a)=>{try{let l=t.split("?")[0].trimEnd();const c=l.split("/");c.length>0&&c[c.length-1]!==""&&c.pop(),l=c.join("/"),l.endsWith("/")||(l+="/"),n.resourcePath=l,n.parse(e,"",async h=>{const d=await Kh(n,o,t,h,i,s);r(d)},h=>{console.error('Loading asset at "'+t+`" failed
1479
- `,h),r(void 0)})}catch(l){console.error(l),a(l)}})}async function U0(o,e,t,i,n){QI(e);const s=await Q1(e,o,t);if(!s)return;const{componentsExtension:r}=Z1(s,o);if(!(s instanceof Po)){const a=await s.loadAsync(e,n);return await Kh(s,o,e,a,i,r)}return new Promise((a,l)=>{try{s.load(e,async c=>{const h=await Kh(s,o,t,c,i,r);a(h)},c=>{n?.call(s,c)},c=>{console.error('Loading asset at "'+e+`" failed
1480
- `,c),a(void 0)})}catch(c){console.error(c),l(c)}})}function Z1(o,e){const t=Hf(o);return o instanceof Po&&pf(o,e),{componentsExtension:t}}async function Kh(o,e,t,i,n,s){if(X1&&console.warn("Loaded",t,i),i==null)return console.error(`Loaded model is null '${t}' - please make sure the loader is registered correctly`),{scene:new k,animations:[],scenes:[]};if(typeof i!="object")return console.error(`Loaded model is not an object '${t}' - please make sure the loader is registered correctly`),{scene:new k,animations:[],scenes:[]};if(i instanceof k)i={scene:i,animations:i.animations,scenes:[i]};else if(i instanceof gn){const r=new pt({color:new ne(14540253)}),a=new G(i,r);i={scene:a,animations:[],scenes:[a]}}else Array.isArray(i.scenes)===!1&&console.error(`[Needle Engine] The loaded model object does not have a scenes property '${t}' - please make sure the loader is registered correctly and three.js is not imported multiple times.`);return t.includes("?")&&(t=t.split("?")[0]),YI(o,i),Vw(i)&&(mx(t,i,e),await _n().createBuiltinComponents(e,t,i,n,s||void 0)),await XI(i.scene,e,e.mainCamera),i}async function XI(o,e,t){t||(t=e.mainCamera);try{t?await e.renderer.compileAsync(o,t,e.scene).catch(i=>{console.warn(i.message)}):Ck(o,e)}catch(i){console.warn(i?.message||i)}}function QI(o){if(new URL(o,window.location.href).href.startsWith("file://")){const e=`Hi - it looks like you are trying to load a local file which will not work. You need to use a webserver to serve your files.
1481
- Please refer to the documentation on <a href="https://fwd.needle.tools/needle-engine/docs/local-server">https://docs.needle.tools</a> or ask for help in our <a href="https://discord.needle.tools">discord community</a>`;Te(e),console.warn(e)}}function YI(o,e){if("scenes"in e){for(const t of e.scenes)if(t&&!t.animations?.length)for(const i of e.animations)t.animations.includes(i)||t.animations.push(i)}if(o instanceof wb||o instanceof Mm){let t=e;t instanceof k||(t=e.scene||e.scenes.find(i=>i)),t.traverse(i=>{const n=i;n?.isMesh&&tg(n,n.material)})}}const Jh=v("debugoverlay"),K1="ar",ZI="quit-ar";class KI{get ARContainer(){return this.arContainer}arContainer=null;currentSession=null;_createdAROnlyElements=[];_reparentedObjects=[];contentElement=null;originalDomOverlayParent=null;requestEndAR=()=>{this.onRequestedEndAR()};onBegin(e,t,i){if(this.currentSession=i,this.arContainer=t,q.isMozillaXR()){const n=e.domElement.children;for(let s=0;s<n?.length;s++){const r=n[s];if(!r||r===this.arContainer)return;this._reparentedObjects.push({el:r,previousParent:r.parentElement}),this.arContainer?.appendChild(r)}t?(this.originalDomOverlayParent=t.parentNode,this.originalDomOverlayParent&&(console.log("Reparent DOM Overlay to body",t,t.style.display),t.style.display="",t.style.visibility="",document.body.appendChild(t))):console.warn("WebXRViewer: No DOM Overlay found")}this.ensureQuitARButton(this.arContainer)}onEnd(e){for(const t of this._createdAROnlyElements)t.remove&&t.remove();for(const t of this._reparentedObjects){const i=t.el;t.previousParent?.appendChild(i)}this._reparentedObjects.length=0,q.isMozillaXR()&&setTimeout(()=>{const t=e.renderer.domElement;t&&e.domElement.shadowRoot?.prepend(t);const i=document.querySelectorAll("*");for(var n=0;n<i.length;n++){const s=i[n];s&&s._displayChanged!==void 0&&s._displayWas!==void 0&&(s.style.display=s._displayWas)}},10)}createOverlayContainer(e){if(this.contentElement)return this.contentElement;Jh&&console.log("Setup overlay container");const t=e.shadowRoot.querySelector(".content");this.contentElement=t;const i=e.shadowRoot.querySelector(".overlay-content");return i&&t.appendChild(i),Jh&&!q.isMobileDevice()&&this.ensureQuitARButton(t),t}onRequestedEndAR(){this.currentSession&&(this.currentSession.end(),this.currentSession=null)}ensureQuitARButton(e){const t=document.createElement("slot");t.setAttribute("name","quit-ar"),this.appendElement(t,e),this._createdAROnlyElements.push(t),t.style.pointerEvents="auto";const i=document.querySelector(`.${ZI}`);if(i){i.addEventListener("click",this.requestEndAR),Jh&&i.addEventListener("click",()=>console.log("Clicked quit-ar button"));return}t.addEventListener("click",this.requestEndAR),Jh&&t.addEventListener("click",()=>console.log("Clicked fallback close button"));const n=document.createElement("div");n.style.cssText=`
1482
- position: fixed;
1483
- top: 0;
1484
- right: 0;
1485
- z-index: 600;
1486
- pointer-events: all;
1487
- `,this.appendElement(n,t);var s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("quit-ar-button"),s.setAttribute("width","40px"),s.setAttribute("height","40px"),s.style.cssText=`
1488
- background: rgba(255, 255, 255, .4);
1489
- -webkit-backdrop-filter: blur(8px);
1490
- backdrop-filter: blur(8px);
1491
- border-radius: 50%;
1492
- box-shadow: 0 0 5px rgba(0,0,0,.3);
1493
- outline: 1px solid rgba(255, 255, 255, .6);
1494
- display: flex;
1495
- justify-content: center;
1496
- align-items: center;
1497
- `,n.appendChild(s);var r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("d","M 12,12 L 28,28 M 28,12 12,28"),r.setAttribute("stroke","#000000"),r.setAttribute("stroke-width","2px"),r.style.cssText=`
1498
- /**filter: drop-shadow(0 0px 1.2px rgba(0,0,0,.7));**/
1499
- `,s.appendChild(r),Jh&&console.log("Created fallback close button",s,e)}appendElement(e,t){return t.shadowRoot?t.shadowRoot.appendChild(e):t.appendChild(e)}}const ga=v("debugloading"),ed=v("debugloadingrendering");v("debuglicense");class JI{className;additionalClasses}let td=0,J1;function z0(o){ga&&console.log(o.progress.loaded.toFixed(0)+"/"+o.progress.total.toFixed(0),o);const e=o.count,t=o.progress.total;t===0||t===void 0?(J1!==o.name&&(td=0),J1=o.name,td+=(1-td)*.001,ga&&ye("Loading "+o.name+" did not report total size")):td=o.progress.loaded/t;const i=o.index/e+td/e;return L.clamp01(i)}class md{static LoadingContainerClassName="loading";loadingProgress=0;_element;_progress=0;_allowCustomLoadingElement=!0;_loadingElement;_loadingTextContainer=null;_loadingBar=null;_loadingBarFinishedColor=null;_messageContainer=null;_loadingElementOptions;constructor(e,t){this._element=e,this._loadingElementOptions=t}async onLoadingBegin(e){const t=this._element.shadowRoot||this._element;if(ga&&console.warn("Begin Loading"),!this._loadingElement){for(let i=0;i<t.children.length;i++){const n=t.children[i];if(n.classList.contains(md.LoadingContainerClassName)){if(!this._allowCustomLoadingElement){ga&&console.warn("Remove custom loading container"),t.removeChild(n);continue}this._loadingElement=this.createLoadingElement(n)}}this._loadingElement||(this._loadingElement=this.createLoadingElement())}this._progress=0,this.loadingProgress=0,this._loadingElement.style.display="flex",t.appendChild(this._loadingElement),this.smoothProgressLoop(),this.setMessage(e??"")}onLoadingUpdate(e,t){if(!this._loadingElement?.parentNode)return;let i=0;typeof e=="number"?i=e:("index"in e&&(i=z0(e)),!t&&"name"in e&&this.setMessage("loading "+e.name)),this.loadingProgress=i,t&&this.setMessage(t),this.updateDisplay()}onLoadingFinished(){ga&&console.warn("Finished Loading"),ed||(this.loadingProgress=1,this.onDoneLoading())}setMessage(e){this._messageContainer&&(this._messageContainer.innerText=e)}_progressLoop;smoothProgressLoop(){if(this._progressLoop)return;let e=1/12;ed&&(e=1/500,typeof ed=="number"&&(e*=ed)),this._progressLoop=setInterval(()=>{this.loadingProgress>=.95&&!ed&&(e=.9),this._progress=L.lerp(this._progress,this.loadingProgress,e*this.loadingProgress),this.updateDisplay()},e)}onDoneLoading(){if(this._loadingElement){ga&&console.log("Hiding loading element");const e=this._loadingElement;e.animate([{opacity:1},{opacity:0}],{duration:200,easing:"ease-in-out"}).addEventListener("finish",()=>{e.style.display="none",e.remove()})}this._progressLoop&&clearInterval(this._progressLoop),this._progressLoop=null}updateDisplay(){const e=this._progress,t=(e*100).toFixed(0)+"%";this._loadingBar&&(this._loadingBar.style.width=e*100+"%",e>=1&&this._loadingBarFinishedColor&&(this._loadingBar.style.background=this._loadingBarFinishedColor)),this._loadingTextContainer&&(this._loadingTextContainer.textContent=t)}createLoadingElement(e){ga&&!e&&console.log("Creating loading element"),this._loadingElement=e||document.createElement("div");let t=this._element.getAttribute("loading-style");(!t||t==="auto")&&(window.matchMedia("(prefers-color-scheme: dark)").matches?t="dark":t="light");const i=Qn();if(!e){this._loadingElement.style.position="absolute",this._loadingElement.style.width="100%",this._loadingElement.style.height="100%",this._loadingElement.style.left="0",this._loadingElement.style.top="0",this._loadingElement.style.overflow="hidden";const f=this._element.getAttribute("loading-background");f?this._loadingElement.style.background=f:this._loadingElement.style.backgroundColor="transparent",this._loadingElement.style.display="flex",this._loadingElement.style.alignItems="center",this._loadingElement.style.justifyContent="center",this._loadingElement.style.zIndex="0",this._loadingElement.style.flexDirection="column",this._loadingElement.style.pointerEvents="none",this._loadingElement.style.color="white",this._loadingElement.style.fontFamily='system-ui, Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',this._loadingElement.style.fontSize="1rem",t==="light"?this._loadingElement.style.color="rgba(0,0,0,.6)":this._loadingElement.style.color="rgba(255,255,255,.3)"}const n=this._loadingElementOptions?.className??md.LoadingContainerClassName;if(this._loadingElement.classList.add(n),this._loadingElementOptions?.additionalClasses)for(const f of this._loadingElementOptions.additionalClasses)this._loadingElement.classList.add(f);const s=document.createElement("div");s.style.cssText=`
1500
- position: relative;
1501
- display: flex;
1502
- flex-direction: column;
1503
- align-items: center;
1504
- justify-content: center;
1505
- width: 100%;
1506
- height: 100%;
1507
- pointer-events: none;
1508
- `,this._loadingElement.appendChild(s);const r=this._element.getAttribute("poster");if(r!==null&&r!=="0"){const f=document.createElement("div"),g=r?.length?"0px":"50px";f.style.cssText=`
1509
- position: absolute;
1510
- left: 0;
1511
- top: 0;
1512
- bottom: 0;
1513
- right: 0;
1514
- z-index: -1;
1515
- overflow: hidden;
1516
-
1517
- margin: -${g};
1518
- background: url('${r?.length?r:"/include/poster.webp"}') center center no-repeat;
1519
- background-size: cover;
1520
- filter: blur(${g});
1521
- `,this._loadingElement.appendChild(f)}const a=document.createElement("img"),l="80%",c="15%",h=".2s";if(a.style.userSelect="none",a.style.objectFit="contain",a.style.transform="translateY(30px)",a.style.opacity="0.0000001",a.style.transition=`transform 1s ease-out ${h}, opacity .3s ease-in-out ${h}`,a.src=yu,i&&this._element){const f=this._element.getAttribute("loading-logo-src");f&&(a.src=f,setTimeout(()=>{a.style.opacity="1",a.style.transform="translateY(0px)"},1))}a.style.width=`${l}`,a.style.height=`min(1000px, max(${c}, 50px))`,s.appendChild(a);const d=document.createElement("div");d.style.cssText=`
1522
- display: flex;
1523
- flex-direction: column;
1524
- align-items: center;
1525
- justify-content: center;
1526
- width: 100%;
1527
- opacity: 0;
1528
- transition: opacity 1s ease-in-out 4s;
1529
- `,setTimeout(()=>{d.style.opacity="1"},1),this._loadingElement.appendChild(d);const p=document.createElement("div"),m=100;return p.style.display="flex",p.style.width=m+"%",p.style.height="5px",p.style.position="absolute",p.style.left="0",p.style.top="0px",p.style.opacity="0",p.style.transition="opacity 1s ease-in-out",p.style.backgroundColor="rgba(240,240,240,.5)",setTimeout(()=>{p.style.opacity="1"},1),this._loadingElement.appendChild(p),this._loadingBar=document.createElement("div"),p.appendChild(this._loadingBar),this._loadingBar.style.backgroundAttachment="fixed",this._loadingBar.style.background="#c4c4c4ab",this._loadingBarFinishedColor="#ddddddab",this._loadingBar.style.width="0%",this._loadingBar.style.height="100%",this._loadingElement}}rg(q1);const Me=v("debugwebcomponent"),eS="needle-engine",tS="vr",iS="desktop",eL=[K1,tS,iS],id="ar-session-active",nd="desktop-session-active",tL=["src","hash","camera-controls","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","public-key","version","tone-mapping","tone-mapping-exposure","background-blurriness","background-color","environment-intensity","focus-rect","loadstart","progress","loadfinished"];class N0 extends HTMLElement{static get observedAttributes(){return tL}get loadingProgress01(){return this._loadingProgress01}get loadingFinished(){return this.loadingProgress01>.999}get cameraControls(){const e=this.getAttribute("camera-controls");return e==null?null:!(e===null||e==="False"||e==="false"||e==="0"||e==="none")}set cameraControls(e){e===null?this.removeAttribute("camera-controls"):this.setAttribute("camera-controls",e?"true":"false")}getContext(){return new Promise((e,t)=>{if(this._context&&this.loadingFinished)e(this._context);else{const i=()=>{this.removeEventListener("loadfinished",i),this._context&&this.loadingFinished&&e(this._context)};this.addEventListener("loadfinished",i)}})}get context(){return this._context}_context;_overlay_ar;_loadingProgress01=0;_loadingView;_previousSrc=null;_didFullyLoad=!1;constructor(){super(),this._overlay_ar=new KI,this.addEventListener("ready",this.onReady),dw(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
1530
- @import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
1531
-
1532
- :host {
1533
- position: absolute;
1534
- display: block;
1535
- width: max(600px, 100%);
1536
- height: max(300px, 100%);
1537
- touch-action: none;
1538
-
1539
- -webkit-tap-highlight-color: transparent;
1540
- }
1541
-
1542
- @media (max-width: 600px) {
1543
- :host {
1544
- width: 100%;
1545
- }
1546
- }
1547
- @media (max-height: 300px) {
1548
- :host {
1549
- height: 100%;
1550
- }
1551
- }
1552
-
1553
- :host > div.canvas-wrapper {
1554
- width: 100%;
1555
- height: 100%;
1556
- }
1557
-
1558
- :host canvas {
1559
- position: absolute;
1560
- user-select: none;
1561
- -webkit-user-select: none;
1562
-
1563
- /** allow touch panning but no pinch zoom **/
1564
- /** but this doesnt work yet:
1565
- * touch-action: pan-x, pan-y;
1566
- **/
1567
-
1568
- -webkit-touch-callout: none;
1569
- -webkit-user-drag: none;
1570
- -webkit-user-modify: none;
1571
-
1572
- left: 0;
1573
- top: 0;
1574
- }
1575
- :host .content {
1576
- position: absolute;
1577
- top: 0;
1578
- width: 100%;
1579
- height: 100%;
1580
- visibility: visible;
1581
- z-index: 500; /* < must be less than the webxr buttons element */
1582
- pointer-events: none;
1583
- }
1584
- :host .overlay-content {
1585
- position: absolute;
1586
- user-select: auto;
1587
- pointer-events: all;
1588
- }
1589
- :host slot[name="quit-ar"]:hover {
1590
- cursor: pointer;
1591
- }
1592
- :host .quit-ar-button {
1593
- position: absolute;
1594
- // top: env(titlebar-area-y); /** this doesnt work **/
1595
- top: 60px; /** camera access needs a bit more space **/
1596
- right: 20px;
1597
- z-index: 9999;
1598
- }
1599
- </style>
1600
- <div class="canvas-wrapper"> <!-- this wrapper is necessary for WebXR https://github.com/meta-quest/immersive-web-emulator/issues/55 -->
1601
- <canvas></canvas>
1602
- </div>
1603
- <div class="content">
1604
- <slot class="overlay-content"></slot>
1605
- </div>
1606
- `,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new z({domElement:this}),this.addEventListener("error",this.onError)}async connectedCallback(){if(Me&&console.log("<needle-engine> connected"),this.setPublicKey(),this.setVersion(),(this.getAttribute("tabindex")===null||this.getAttribute("tabindex")===void 0)&&this.setAttribute("tabindex","0"),this.addEventListener("xr-session-started",this.onXRSessionStarted),this.onSetupDesktop(),!this.getAttribute("src")){const t=globalThis["needle:codegen_files"];Me&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(Me&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}Me&&console.log("src",this.getAttribute("src"));const e=this._loadId;setTimeout(()=>{this.isConnected!==!1&&e===this._loadId&&this.onLoad()},1)}disconnectedCallback(){this.removeEventListener("xr-session-started",this.onXRSessionStarted),this._didFullyLoad=!1;const e=this.getAttribute("keep-alive"),t=e==null||e?.length>0&&e!=="true"&&e!=="1";Me&&console.warn('<needle-engine> disconnected, keep-alive: "'+e+'"',typeof e,"Dispose=",t),t?(Me&&console.warn("<needle-engine> dispose"),this._context?.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):Me&&console.warn("<needle-engine> is not disposed because keep-alive is set")}connectedMoveCallback(){}attributeChangedCallback(e,t,i){switch(Me&&console.log("attributeChangedCallback",e,t,i),e){case"src":Me&&console.warn(`<needle-engine src>
1607
- changed from "`,t,'" to "',i,'"'),this.onLoad();break;case"hash":this._context&&(this._context.hash=i);break;case"loadstart":case"progress":case"loadfinished":typeof i=="string"&&i.length>0&&(Me&&console.log(e+" attribute changed",i),this.registerEventFromAttribute("loadfinished",i));break;case"dracoDecoderPath":Me&&console.log("dracoDecoderPath",i),ww(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(Me&&console.log("dracoDecoderType",i),xw(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":Me&&console.log("ktx2DecoderPath",i),Sw(i);break;case"tonemapping":case"tone-mapping":case"tone-mapping-exposure":case"background-blurriness":case"background-color":case"environment-intensity":{this.applyAttributes();break}case"public-key":{i!=Ia&&this.setPublicKey();break}case"version":{i!=bn&&this.setVersion();break}case"focus-rect":{const n=this.getAttribute("focus-rect");if(n&&this._context)if(n===null)this._context.setCameraFocusRect(null);else if(typeof n=="string"&&n.length>0){const s=document.querySelector(n);this._context.setCameraFocusRect(s instanceof HTMLElement?s:null)}else n instanceof HTMLElement&&this._context.setCameraFocusRect(n)}break}}get toneMapping(){return this.getAttribute("tonemapping")||this.getAttribute("tone-mapping")}_loadId=0;_abortController=null;_lastSourceFiles=null;_createContextPromise=null;async onLoad(){if(!this.isConnected)return;if(this._context||(Me&&console.warn("Create new context"),this._context=new z({domElement:this})),!this._context){console.error("Needle Engine: Context not initialized");return}const e=this.getSourceFiles();if(!this.checkIfSourceHasChanged(e,this._lastSourceFiles))return;this._abortController&&(Me&&console.warn("Abort previous loading process"),this._abortController.abort(),this._abortController=null),this._lastSourceFiles=e;const t=++this._loadId;if((e==null||e.length<=0)&&(Me&&console.warn("Clear scene",e),this._context.clear(),t!==this._loadId))return;const i=this.getAttribute("alias");this.classList.add("loading");const n=Io();this.ensureLoadStartIsRegistered();let s=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:i},cancelable:!0}));if(n){const f=this.getAttribute("hide-loading-overlay");f!=null&&f!=="0"&&(s=!1)}s===!1&&!n&&(A()||(s=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),A()&&ye('You need a <a target="_blank" href="https://needle.tools/pricing">commercial license</a> to override the default loading view. This will not work in production.')),!this._loadingView&&s&&(this._loadingView=new md(this)),s&&(this._didFullyLoad!==!0?this._loadingView?.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===t&&this._loadingView.onLoadingBegin("begin load")},300)),Me&&console.warn(`--------------
1608
- Needle Engine: Begin loading `+t+`
1609
- `,e),this.onBeforeBeginLoading();const r=[],a={context:this._context,name:"",progress:{},index:0,count:e.length,totalProgress01:this._loadingProgress01},l=new CustomEvent("progress",{detail:a}),c=new Array,h=new AbortController;this._abortController=h;const d={files:e,abortSignal:h.signal,onLoadingProgress:f=>{if(Me&&console.debug("Loading progress: ",f),h.signal.aborted)return;const g=f.index;!c[g]&&f.name&&(c[g]=iL(f.name)),f.name=c[g],s&&this._loadingView?.onLoadingUpdate(f),a.name=f.name,a.progress=f.progress,this._loadingProgress01=z0(f),a.totalProgress01=this._loadingProgress01,this.dispatchEvent(l)},onLoadingFinished:(f,g,y)=>{Me&&console.debug(`Finished loading "${g}" (aborted? ${h.signal.aborted})`),!h.signal.aborted&&y&&r.push({src:g,file:y})}};nL(this);const p=this.getAttribute("hash");p!=null&&(this._context.hash=p),this._context.alias=i,this._createContextPromise=this._context.create(d);const m=await this._createContextPromise;if(this.applyAttributes(),Me&&console.warn(`--------------
1610
- Needle Engine: finished loading `+t+`
1611
- `,e,`Aborted? ${h.signal.aborted}`),h.signal.aborted){console.log("Loading finished but aborted...");return}if(this._loadId!==t){console.log("Load id changed during loading process");return}this._loadingProgress01=1,s&&m&&this._loadingView?.onLoadingUpdate(1,"creating scene"),this._didFullyLoad=!0,this.classList.remove("loading"),this.classList.add("loading-finished"),this.dispatchEvent(new CustomEvent("loadfinished",{detail:{context:this._context,src:i,loadedFiles:r}}))}applyAttributes(){if(this._context?.renderer){const n=aw(this.toneMapping);n!==void 0&&(this._context.renderer.toneMapping=n);const s=this.getAttribute("tone-mapping-exposure");if(s!=null){const r=parseFloat(s);isNaN(r)||(this._context.renderer.toneMappingExposure=r)}}const e=this.getAttribute("background-blurriness");if(e!=null){const n=parseFloat(e);!isNaN(n)&&this._context&&(this._context.scene.backgroundBlurriness=n)}const t=this.getAttribute("environment-intensity");if(t!=null&&this._context){const n=parseFloat(t);!isNaN(n)&&this._context&&(this._context.scene.environmentIntensity=n)}const i=this.getAttribute("background-color");if(this._context?.renderer)if(typeof i=="string"&&i.length>0){const n=oe.fromColorRepresentation(i);Me&&console.debug("<needle-engine> background-color changed, str:",i,"\u2192",n),this._context.renderer.setClearColor(n,n.alpha),this.context.scene.background=null}else this.getAttribute("background-image")&&this.setAttribute("background-image",this.getAttribute("background-image"))}onXRSessionStarted=()=>{const e=this.context.xrSessionMode;e==="immersive-ar"?this.onEnterAR(this.context.xrSession):e==="immersive-vr"&&this.onEnterVR(this.context.xrSession),this.context.xrSession?.addEventListener("end",()=>{this.dispatchEvent(new CustomEvent("xr-session-ended",{detail:{session:this.context.xrSession,context:this._context,sessionMode:e}})),e==="immersive-ar"?this.onExitAR(this.context.xrSession):e==="immersive-vr"&&this.onExitVR(this.context.xrSession)})};onReady=()=>this._loadingView?.onLoadingFinished();onError=()=>this._loadingView?.setMessage("Loading failed!");getSourceFiles(){const e=this.getAttribute("src");if(!e)return[];let t;Array.isArray(e)?t=e:e.startsWith("[")&&e.endsWith("]")?t=JSON.parse(e):e.includes(",")?t=e.split(","):t=[e];for(let i=t.length-1;i>=0;i--){const n=t[i];(n==="null"||n==="undefined"||n?.length<=0)&&t.splice(i,1)}return t}checkIfSourceHasChanged(e,t){if(e?.length!==t?.length||e==null&&t!==null||e!==null&&t==null)return!0;if(e!==null&&t!==null){for(let i=0;i<e?.length;i++)if(e[i]!==t[i])return!0}return!1}_previouslyRegisteredMap=new Map;ensureLoadStartIsRegistered(){const e=this.getAttribute("loadstart");e&&this.registerEventFromAttribute("loadstart",e)}registerEventFromAttribute(e,t){const i=this._previouslyRegisteredMap.get(e);if(i&&(this._previouslyRegisteredMap.delete(e),this.removeEventListener(e,i)),typeof t=="string"&&t.length>0)try{const n=(0,eval)(t);typeof n=="function"&&(this._previouslyRegisteredMap.set(e,n),this.addEventListener(e,s=>n?.call(globalThis,this._context,s)))}catch(n){console.error("Error registering event "+e+'="'+t+`" failed with the following error:
1612
- `,n)}}setPublicKey(){Ia&&Ia.length>0&&this.setAttribute("public-key",Ia)}setVersion(){bn.length>0&&this.setAttribute("version",bn)}getAROverlayContainer(){return this._overlay_ar.createOverlayContainer(this)}getVROverlayContainer(){for(let e=0;e<this.children.length;e++){const t=this.children[e];if(t.classList.contains("vr"))return t}return null}onEnterAR(e){this.onSetupAR();const t=this.getAROverlayContainer();this._overlay_ar.onBegin(this._context,t,e),this.dispatchEvent(new CustomEvent("enter-ar",{detail:{session:e,context:this._context,htmlContainer:this._overlay_ar?.ARContainer}}))}onExitAR(e){this._overlay_ar.onEnd(this._context),this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-ar",{detail:{session:e,context:this._context,htmlContainer:this._overlay_ar?.ARContainer}}))}onEnterVR(e){this.onSetupVR(),this.dispatchEvent(new CustomEvent("enter-vr",{detail:{session:e,context:this._context}}))}onExitVR(e){this.onSetupDesktop(),this.dispatchEvent(new CustomEvent("exit-vr",{detail:{session:e,context:this._context}}))}onSetupAR(){this.classList.add(id),this.classList.remove(nd);const e=this.getAROverlayContainer();Me&&console.warn("onSetupAR:",e),e&&(e.classList.add(id),e.classList.remove(nd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,K1))}onSetupVR(){this.classList.remove(id),this.classList.remove(nd),this.foreachHtmlElement(e=>this.setupElementsForMode(e,tS))}onSetupDesktop(){this.classList.remove(id),this.classList.add(nd);const e=this.getAROverlayContainer();e&&(e.classList.remove(id),e.classList.add(nd)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,iS))}setupElementsForMode(e,t,i=null){if(!(e===this._context?.renderer?.domElement||e.id==="VRButton"||e.id==="ARButton"))if(e.classList.contains(t))e.style.visibility="visible",e.style.display==="none"&&(e.style.display="block");else for(const n of eL)e.classList.contains(n)&&(e.style.visibility="hidden",e.style.display="none")}foreachHtmlElement(e){for(let t=0;t<this.children.length;t++){const i=this.children[t];i.style&&e(i)}}onBeforeBeginLoading(){const e=this.getAttribute("dracoDecoderPath");e&&(Me&&console.log("using custom draco decoder path",e),ww(e));const t=this.getAttribute("dracoDecoderType");t&&(Me&&console.log("using custom draco decoder type",t),xw(t));const i=this.getAttribute("ktx2DecoderPath");i&&(Me&&console.log("using custom ktx2 decoder path",i),Sw(i))}setAttribute(e,t){super.setAttribute(e,t)}getAttribute(e){return super.getAttribute(e)}addEventListener(e,t,i){return super.addEventListener(e,t,i)}}typeof window<"u"&&!window.customElements.get(eS)&&window.customElements.define(eS,N0);function iL(o){if(o.startsWith("blob:"))return"blob";const e=o.split("/");let t=e[e.length-1];const i=t.indexOf("?");i>0&&(t=t.substring(0,i));const n=t.indexOf("=");n>0&&(t=t.substring(n));const s=t.split(".").pop(),r=s?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(s.toLowerCase()):-1;if(s&&r>=0&&(t=t.substring(0,t.length-s.length-1)),t=decodeURIComponent(t),t.length>3){let a="",l=!1;const c=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let h=0;h<t.length;h++){let d=t[h];(d==="_"||d==="-")&&(d=" "),!(d===" "&&a.length<=0||c.includes(d)||(a.length===0&&(d=d.toUpperCase()),l&&d===" "))&&(l&&(d=d.toUpperCase()),l=!1,a+=d,d===" "&&(l=!0))}return A()&&t!==a&&console.debug('Generated display name: "'+t+'" \u2192 "'+a+'"'),a.trim()}return A()&&console.debug("Loading: use default name",t),t}function nL(o){Cu(e=>{const t=o.getAttribute("loading-blur");if(t!==null&&t!=="0"&&e.domElement===o){const i=e.lodsManager.manager?.awaitLoading({frames:5,signal:AbortSignal.timeout(1e4),maxPromisesPerObject:1}).catch(r=>{});let n="20px";t.endsWith("px")&&(n=t);const s=170;if(e.scene.background===null){const r=o,a=e.renderer.domElement,l=a.style.filter,c=a.style.overflow;a.style.filter+=`blur(${n})`,r.style.overflow="hidden",i?.then(()=>{const h=a.animate([{filter:"blur(0px)"}],{duration:s,easing:"ease-in"});h.onfinish=()=>{a.style.filter=l,r.style.overflow=c}})}else{const r=document.createElement("div");e.domElement.prepend(r),r.style.cssText="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 10; pointer-events: none",r.style.backdropFilter=`blur(${n})`,i?.then(()=>{const a=r.animate([{backdropFilter:"blur(0px)",opacity:0}],{duration:s,easing:"ease-in"});a.onfinish=()=>{r.remove()}})}}},{once:!0})}const oL=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:N0},Symbol.toStringTag,{value:"Module"}));function sL(){Dn.registerWaitForInteraction(()=>{const o=DC.getContext();o.addEventListener("statechange",()=>{setTimeout(()=>{const e=o.state;(e==="suspended"||e==="interrupted")&&o.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}setTimeout(sL,1e3);const $e=v("debugphysics"),V0=v("debugcolliderplacement"),W0=v("debugcollisions"),rL=v("showcolliders"),nm=v("debugraycasts"),_i=Symbol("needle component"),Gt=Symbol("physics body"),nS=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0,$e&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER),ue.registerCallback(de.ContextCreationStart,o=>{$e&&console.log("Register rapier physics backend"),o.context.physics.engine=new Ql(o.context)});class Ql{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if($e&&console.log("REMOVE BODY",e?.name,e[Gt]),!e)return;this.validate();const t=e[Gt];if(e[Gt]=null,t&&this.world){const i=this.objects.findIndex(n=>n===e);if(i>=0){const n=this.bodies[i];if(this.bodies.splice(i,1),this.objects.splice(i,1),n instanceof E.RAPIER_PHYSICS.MODULE.Collider){const s=n;this.world?.removeCollider(s,!0);const r=s.parent();r&&r.numColliders()<=0&&(r[_i]||this.world?.removeRigidBody(r))}else n instanceof E.RAPIER_PHYSICS.MODULE.RigidBody&&(n.numColliders()<=0?this.world?.removeRigidBody(n):A()&&(n.did_log_removing||setTimeout(()=>{n.numColliders()>0&&(n.did_log_removing=!0,console.warn("RapierPhysics: removing rigidbody with colliders from the physics world is not possible right now, please remove the colliders first"))},1)))}}}updateBody(e,t,i){if(this.validate(),!!this.enabled&&!(e.destroyed||!e.gameObject)&&!(!t&&!i))if(e.isCollider===!0)console.warn("TODO: implement updating collider position");else{const n=e,s=n[Gt];s&&this.syncPhysicsBody(n.gameObject,s,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[Gt];i&&(this.internalUpdateColliderProperties(t,i),t.sharedMaterial&&this.updatePhysicsMaterial(t))}else{const t=e,i=this.internal_getRigidbody(t);i&&this.internalUpdateRigidbodyProperties(t,i)}}addForce(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.addForce(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply force (does your object with the Rigidbody have a collider?)")}addImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Physics Body doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}getLinearVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.linvel():null}getAngularVelocity(e){this.validate();const t=this.internal_getRigidbody(e);return t?t.angvel():null}resetForces(e,t){this.validate(),this.internal_getRigidbody(e)?.resetForces(t)}resetTorques(e,t){this.validate(),this.internal_getRigidbody(e)?.resetTorques(t)}applyImpulse(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.applyImpulse(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not apply impulse (does your object with the Rigidbody have a collider?)")}wakeup(e){this.validate();const t=this.internal_getRigidbody(e);t?t.wakeUp():this._isInitialized&&console.warn("Rigidbody doesn't exist: can not wake up (does your object with the Rigidbody have a collider?)")}isSleeping(e){return this.validate(),this.internal_getRigidbody(e)?.isSleeping()}setAngularVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setAngvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set angular velocity (does your object with the Rigidbody have a collider?)")}setLinearVelocity(e,t,i){this.validate();const n=this.internal_getRigidbody(e);n?n.setLinvel(t,i):this._isInitialized&&console.warn("Rigidbody doesn't exist: can not set linear velocity (does your object with the Rigidbody have a collider?)")}context;_initializePromise;_isInitialized=!1;constructor(e){this.context=e}get isInitialized(){return this._isInitialized}async initialize(){return this._initializePromise||(this._initializePromise=this.internalInitialization()),this._initializePromise}async internalInitialization(){return v("__nophysics")?(console.warn("Physics are disabled"),!1):($e&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,E.RAPIER_PHYSICS.MAYBEMODULE==null&&($e&&console.trace("Loading rapier physics engine"),await(await E.RAPIER_PHYSICS.load()).init()),$e&&console.log("Physics engine initialized, creating world..."),this._world=new E.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new E.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,$e&&console.log("Physics world created"),!0))}validate(){this._isInitialized||$e&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new Oi(()=>new b,10);raycast(e,t,i){if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let n=i?.maxDistance,s=i?.solid;n===void 0&&(n=1/0),s===void 0&&(s=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||nm)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRay(r,n,s,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const c=l[_i];return i?.filterPredicate?i.filterPredicate(c):i?.useIgnoreRaycastLayer!==!1?!c?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),c=this.raycastVectorsBuffer.get();return c.set(l.x,l.y,l.z),{point:c,collider:a.collider[_i]}}return null}raycastAndGetNormal(e,t,i){if(!this._isInitialized)return null;let n=i?.maxDistance,s=i?.solid;n===void 0&&(n=1/0),s===void 0&&(s=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||nm)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRayAndGetNormal(r,n,s,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const c=l[_i];return i?.filterPredicate?i.filterPredicate(c):i?.useIgnoreRaycastLayer!==!1?!c?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),c=a.normal,h=this.raycastVectorsBuffer.get(),d=this.raycastVectorsBuffer.get();return h.set(l.x,l.y,l.z),d.set(c.x,c.y,c.z),{point:h,normal:d,collider:a.collider[_i]}}return null}getPhysicsRay(e,t,i){const n=this.context?.mainCamera;if(t===void 0){const a=this.context?.input.getPointerPosition(0);if(a)t=a;else return null}if(t.z===void 0){if(!n)return console.error("Can not perform raycast from 2d point - no main camera found"),null;const a=this.raycastVectorsBuffer.get();a.x=t.x,a.y=t.y,a.z=0,(a.x>1||a.y>1||a.y<-1||a.x<-1)&&($e&&console.warn("Converting screenspace to raycast space",a),this.context?.input.convertScreenspaceToRaycastSpace(a)),a.unproject(n),t=a}const s=t;e.origin.x=s.x,e.origin.y=s.y,e.origin.z=s.z;const r=this.raycastVectorsBuffer.get();if(i)r.set(i.x,i.y,i.z);else{if(!n)return console.error("Can not perform raycast - no camera found"),null;r.set(e.origin.x,e.origin.y,e.origin.z);const a=J(n);r.sub(a)}return r.normalize(),e.dir.x=r.x,e.dir.y=r.y,e.dir.z=r.z,e}rapierSphere=null;rapierBox=null;rapierColliderArray=[];rapierIdentityRotation={x:0,y:0,z:0,w:1};rapierForwardVector={x:0,y:0,z:1};sphereOverlap(e,t){return this.rapierSphere??=new E.RAPIER_PHYSICS.MODULE.Ball(t),this.rapierSphere.radius=t,(this.debugRenderRaycasts||nm)&&B.DrawWireSphere(e,t,3359999,1),this.shapeOverlap(e,this.rapierIdentityRotation,this.rapierSphere)}boxOverlap(e,t,i=null){return i===null&&(i=this.rapierIdentityRotation),this.rapierBox??=new E.RAPIER_PHYSICS.MODULE.Cuboid(1,1,1),this.rapierBox.halfExtents.x=t.x*.5,this.rapierBox.halfExtents.y=t.y*.5,this.rapierBox.halfExtents.z=t.z*.5,(this.debugRenderRaycasts||nm)&&B.DrawWireBox(e,t,3359999,1,!0,i),this.shapeOverlap(e,i,this.rapierBox)}shapeOverlap(e,t,i){return this.rapierColliderArray.length=0,this._isInitialized?this.world?(this.world.intersectionsWithShape(e,t,i,n=>{const s=n[_i],r=new Gw(s.gameObject,s);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[_i].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}enabled=!1;get world(){return this._world}_tempPosition=new b;_tempQuaternion=new U;_tempScale=new b;_tempMatrix=new K;static _didLoadPhysicsEngine=!1;_isUpdatingPhysicsWorld=!1;get isUpdating(){return this._isUpdatingPhysicsWorld}_world;_hasCreatedWorld=!1;eventQueue;collisionHandler;objects=[];bodies=[];_meshCache=new Map;_gravity={x:0,y:-9.81,z:0};get gravity(){return this.world?.gravity??this._gravity}set gravity(e){this.world?this.world.gravity=e:this._gravity=e}clearCaches(){this._meshCache.clear(),this.eventQueue?.raw&&this.eventQueue?.free(),this.world?.bodies&&this.world?.free()}async addBoxCollider(e,t){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){$e&&console.warn("Physics are disabled");return}const i=e.gameObject,n=He(i,this._tempPosition).multiply(t);n.multiplyScalar(.5),n.x<0&&(n.x=Math.abs(n.x)),n.y<0&&(n.y=Math.abs(n.y)),n.z<0&&(n.z=Math.abs(n.z));const s=1e-7;n.x<s&&(n.x=s),n.y<s&&(n.y=s),n.z<s&&(n.z=s);const r=E.RAPIER_PHYSICS.MODULE.ColliderDesc.cuboid(n.x,n.y,n.z);this.createCollider(e,r)}async addSphereCollider(e){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){$e&&console.warn("Physics are disabled");return}const t=E.RAPIER_PHYSICS.MODULE.ColliderDesc.ball(.5);this.createCollider(e,t),this.updateProperties(e)}async addCapsuleCollider(e,t,i){if(this._isInitialized||await this.initialize(),!e.activeAndEnabled)return;if(!this.enabled){$e&&console.warn("Physics are disabled");return}const n=e.gameObject.worldScale;n.x=Math.abs(n.x),n.y=Math.abs(n.y);const s=i*n.x;t=Math.max(t,s);const r=L.clamp(t*.5*n.y-i*n.x,0,Number.MAX_SAFE_INTEGER),a=E.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(r,s);this.createCollider(e,a)}async addMeshCollider(e,t,i,n){let s=t.geometry;if(!s){$e&&console.warn("Missing mesh geometry",t.name);return}s.index?.array?.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),s=sP(s));let r=null;const a=s.getAttribute("position");if(a instanceof nb){const d=a.count;r=new Float32Array(d*3);for(let p=0;p<d;p++){const m=a.getX(p),f=a.getY(p),g=a.getZ(p);r[p*3]=m,r[p*3+1]=f,r[p*3+2]=g}}else r=a.array;if(await this.initialize(),!this.enabled){$e&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const l=s.index?.array,c=e.gameObject.worldScale.clone();if(n&&c.multiply(n),Math.abs(c.x-1)>1e-4||Math.abs(c.y-1)>1e-4||Math.abs(c.z-1)>1e-4){const d=`${s.uuid}_${c.x}_${c.y}_${c.z}_${i}`;if(this._meshCache.has(d))$e&&console.warn("Use cached mesh collider"),r=this._meshCache.get(d);else{($e||A())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${c.x}, ${c.y}, ${c.z})`);const p=new Float32Array(r.length);for(let m=0;m<r.length;m+=3)p[m]=r[m]*c.x,p[m+1]=r[m+1]*c.y,p[m+2]=r[m+2]*c.z;r=p,this._meshCache.set(d,p)}}const h=i?E.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(r):E.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(r,l);h&&this.createCollider(e,h)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,i=e[Gt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case bt.Average:i.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:i.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:i.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:i.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&i.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case bt.Average:i.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:i.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:i.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:i.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[Gt]:null}getComponent(e){return e?e[_i]:null}createCollider(e,t){if(!this.world)throw new Error("Physics world not initialized");const i=this._tempMatrix;let n;e.attachedRigidbody?n=this.getRigidbody(e,this._tempMatrix):($e&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(be(e.gameObject)),i.setPosition(J(e.gameObject))),i.decompose(this._tempPosition,this._tempQuaternion,this._tempScale),this.tryApplyCenter(e,this._tempPosition),t.setTranslation(this._tempPosition.x,this._tempPosition.y,this._tempPosition.z),t.setRotation(this._tempQuaternion),t.setSensor(e.isTrigger);const s=e.sharedMaterial;if(s){if(s.bounciness!==void 0&&t.setRestitution(s.bounciness),s.bounceCombine!==void 0)switch(s.bounceCombine){case bt.Average:t.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:t.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:t.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:t.setRestitutionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(s.dynamicFriction!==void 0&&t.setFriction(s.dynamicFriction),s.frictionCombine!==void 0)switch(s.frictionCombine){case bt.Average:t.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case bt.Maximum:t.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case bt.Minimum:t.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case bt.Multiply:t.setFrictionCombineRule(E.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}e.attachedRigidbody?.autoMass===!1&&(t.setDensity(1e-6),t.setMass(1e-6));try{const r=this.world.createCollider(t,n);return r[_i]=e,e[Gt]=r,r.setActiveEvents(E.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),r.setActiveCollisionTypes(E.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(r),this.updateColliderCollisionGroups(e),$e&&console.log("Created collider",e.name,r),r}catch(r){return console.error('Error creating collider "'+e.name+`"
1613
- Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[Gt],i=e.membership;let n=0;if(i==null)n=65535;else for(let a=0;a<i.length;a++){const l=i[a];l>31?console.error(`Rapier only supports 32 layers, layer ${l} is not supported`):n|=1<<Math.floor(l)}const s=e.filter;let r=0;if(s==null)r=65535;else for(let a=0;a<s.length;a++){const l=s[a];l>31?console.error(`Rapier only supports 32 layers, layer ${l} is not supported`):r|=1<<Math.floor(l)}t.setCollisionGroups(n<<16|r)}getRigidbody(e,t){if(!this.world)throw new Error("Physics world not initialized");let i=null;if(e.attachedRigidbody){const n=e.attachedRigidbody;if(i=n[Gt],!i){const s=n.isKinematic&&!V0;$e&&console.log("Create rigidbody",s);const r=s?E.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():E.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),a=J(e.attachedRigidbody.gameObject);r.setTranslation(a.x,a.y,a.z),r.setRotation(be(e.attachedRigidbody.gameObject)),r.centerOfMass=new E.RAPIER_PHYSICS.MODULE.Vector3(n.centerOfMass.x,n.centerOfMass.y,n.centerOfMass.z),i=this.world.createRigidBody(r),this.bodies.push(i),this.objects.push(n)}i[_i]=n,n[Gt]=i,this.internalUpdateRigidbodyProperties(n,i),this.getRigidbodyRelativeMatrix(e.gameObject,n.gameObject,t),e[nS]=i}else{const n=E.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),s=J(e.gameObject);n.setTranslation(s.x,s.y,s.z),n.setRotation(be(e.gameObject)),i=this.world.createRigidBody(n),t.identity(),i[_i]=null}return i}internal_getRigidbody(e){return e.isCollider===!0?e[nS]:e[Gt]}internalUpdateColliderProperties(e,t){const i=t.shape;let n=!1;switch(i.type){case E.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const p=i,m=e,f=e.gameObject,g=He(f,this._tempPosition),y=Math.abs(m.radius*g.x);n=p.radius!==y,p.radius=y,n&&t.setShape(p);break}case E.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const s=i,r=e,a=e.gameObject,l=He(a,this._tempPosition),c=Math.abs(r.size.x*.5*l.x),h=Math.abs(r.size.y*.5*l.y),d=Math.abs(r.size.z*.5*l.z);n=s.halfExtents.x!==c||s.halfExtents.y!==h||s.halfExtents.z!==d,s.halfExtents.x=c,s.halfExtents.y=h,s.halfExtents.z=d,n&&t.setShape(s);break}if(n){const s=e.attachedRigidbody;s?.autoMass&&this.getBody(s)?.recomputeMassPropertiesFromColliders()}this.updateColliderCollisionGroups(e),e.isTrigger!==t.isSensor()&&t.setSensor(e.isTrigger)}internalUpdateRigidbodyProperties(e,t){if(t.enableCcd(e.collisionDetectionMode!==Ru.Discrete),t.setLinearDamping(e.drag),t.setAngularDamping(e.angularDrag),t.setGravityScale(e.useGravity?e.gravityScale:0,!0),e.dominanceGroup<=127&&e.dominanceGroup>=-127?t.setDominanceGroup(Math.floor(e.dominanceGroup)):t.setDominanceGroup(0),e.autoMass){t.setAdditionalMass(0,!1);for(let i=0;i<t.numColliders();i++)t.collider(i).setDensity(1);t.recomputeMassPropertiesFromColliders()}else{t.setAdditionalMass(e.mass,!1);for(let i=0;i<t.numColliders();i++)t.collider(i).setDensity(1e-7);t.recomputeMassPropertiesFromColliders()}t.setEnabledRotations(!e.lockRotationX,!e.lockRotationY,!e.lockRotationZ,!1),t.setEnabledTranslations(!e.lockPositionX,!e.lockPositionY,!e.lockPositionZ,!1),e.isKinematic?t.setBodyType(E.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(E.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}lines;step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new E.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else if(e!==void 0){const t=L.lerp(this.world.timestep,e,.8);this.world.timestep=t}try{this.world.step(this.eventQueue)}catch(t){console.warn("Error running physics step",{timestep:this.world.timestep},t)}this._isUpdatingPhysicsWorld=!1}}postStep(){this.world&&this.enabled&&(this._isUpdatingPhysicsWorld=!0,this.syncObjects(),this._isUpdatingPhysicsWorld=!1,this.eventQueue&&!this.collisionHandler&&(this.collisionHandler=new aL(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){if($e||V0||rL||this.debugRenderColliders===!0){if(!this.lines){const i=new gm({color:7855479,fog:!1}),n=new gn;this.lines=new ib(n,i),this.lines.layers.disableAll(),this.lines.layers.enable(2)}this.lines.parent!==this.context?.scene&&this.context?.scene.add(this.lines);const t=e.debugRender();this.lines.geometry.setAttribute("position",new mt(t.vertices,3)),this.lines.geometry.setAttribute("color",new mt(t.colors,4)),(this.context.time.frame%30===0||this.lines.geometry.boundingSphere?.radius===0)&&this.lines.geometry.computeBoundingSphere()}else this.lines&&this.context?.scene.remove(this.lines)}syncObjects(){if(!V0)for(let e=0;e<this.bodies.length;e++){const t=this.objects[e],i=this.bodies[e],n=t;if(n?.isCollider===!0&&!n.attachedRigidbody){const l=i.parent();l?this.syncPhysicsBody(t.gameObject,l,!0,!0):this.syncPhysicsBody(t.gameObject,i,!0,!0);continue}const s=i.translation(),r=i.rotation();if(Number.isNaN(s.x)||Number.isNaN(r.x)){!n.__COLLIDER_NAN&&A()&&(console.warn("Collider has NaN values",n.name,n.gameObject,i),n.__COLLIDER_NAN=!0);continue}const a=t.center;if(a&&a.isVector3){this._tempQuaternion.set(r.x,r.y,r.z,r.w);const l=this._tempPosition.copy(a).applyQuaternion(this._tempQuaternion),c=He(t.gameObject);l.multiply(c),s.x-=l.x,s.y-=l.y,s.z-=l.z}mr(t.gameObject,s.x,s.y,s.z),Zm(t.gameObject,r.x,r.y,r.z,r.w)}}syncPhysicsBody(e,t,i,n){if(t instanceof E.RAPIER_PHYSICS.MODULE.RigidBody){const s=J(e,this._tempPosition),r=be(e,this._tempQuaternion);switch(t.bodyType()){case E.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case E.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case E.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicVelocityBased:i&&t.setNextKinematicTranslation(s),n&&t.setNextKinematicRotation(r);break;default:i&&t.setTranslation(s,!1),n&&t.setRotation(r,!1);break}}else if(t instanceof E.RAPIER_PHYSICS.MODULE.Collider){e.matrixWorldNeedsUpdate&&e.updateWorldMatrix(!0,!1),e.matrixWorld.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const s=this._tempPosition,r=this._tempQuaternion,a=t[_i];if(this.tryApplyCenter(a,s),i){const l=t.translation();(l.x!==s.x||l.y!==s.y||l.z!==s.z)&&t.setTranslation(s)}if(n){const l=t.rotation();(l.x!==r.x||l.y!==r.y||l.z!==r.z||l.w!==r.w)&&t.setRotation(r)}}}_tempCenterPos=new b;_tempCenterVec=new b;_tempCenterQuaternion=new U;tryApplyCenter(e,t){const i=e.center;i&&e.gameObject&&(i.x!==0||i.y!==0||i.z!==0)&&(this._tempCenterPos.x=i.x,this._tempCenterPos.y=i.y,this._tempCenterPos.z=i.z,He(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(be(e.gameObject,this._tempCenterQuaternion),this._tempCenterPos.applyQuaternion(this._tempCenterQuaternion)),t.x+=this._tempCenterPos.x,t.y+=this._tempCenterPos.y,t.z+=this._tempCenterPos.z)}static _matricesBuffer=[];getRigidbodyRelativeMatrix(e,t,i,n){if(n===void 0&&(n=Ql._matricesBuffer,n.length=0),e===t){const s=He(e,this._tempPosition);i.makeScale(s.x,s.y,s.z);for(let r=n.length-1;r>=0;r--)i.multiply(n[r]);return i}return n.push(e.matrix),e.parent&&this.getRigidbodyRelativeMatrix(e.parent,t,i,n),i}static centerConnectionPos={x:0,y:0,z:0};static centerConnectionRot={x:0,y:0,z:0,w:1};addFixedJoint(e,t){if(!this.world){console.error("Physics world not initialized");return}const i=e[Gt],n=t[Gt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const s=E.RAPIER_PHYSICS.MODULE.JointData.fixed(Ql.centerConnectionPos,Ql.centerConnectionRot,this._tempPosition,this._tempQuaternion),r=this.world.createImpulseJoint(s,i,n,!0);$e&&console.log("ADD FIXED JOINT",r)}addHingeJoint(e,t,i,n){if(!this.world){console.error("Physics world not initialized");return}const s=e[Gt],r=t[Gt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const a=E.RAPIER_PHYSICS.MODULE.JointData.revolute(i,this._tempPosition,n),l=this.world.createImpulseJoint(a,s,r,!0);$e&&console.log("ADD HINGE JOINT",l)}calculateJointRelativeMatrices(e,t,i){e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);const n=e.matrixWorld,s=t.matrixWorld;n.elements[0]=1,n.elements[5]=1,n.elements[10]=1,s.elements[0]=1,s.elements[5]=1,s.elements[10]=1,i.copy(s).premultiply(n.invert()).invert()}}class aL{world;eventQueue;constructor(e,t){this.world=e,this.eventQueue=t}activeCollisions=[];activeCollisionsStay=[];activeTriggers=[];handleCollisionEvents(){this.eventQueue&&this.world&&this.eventQueue.drainCollisionEvents((e,t,i)=>{const n=this.world.getCollider(e),s=this.world.getCollider(t);if(!n||!s)return;const r=n[_i],a=s[_i];W0&&console.log("EVT",r.name,a.name,i,n,s),r&&a&&(i?(this.onCollisionStarted(r,n,a,s),this.onCollisionStarted(a,s,r,n)):(this.onCollisionEnded(r,a),this.onCollisionEnded(a,r)))})}update(){this.onHandleCollisionStay()}onCollisionStarted(e,t,i,n){let s=null;if(e.isTrigger||i.isTrigger)Er(e.gameObject,r=>{r.onTriggerEnter&&!r.destroyed&&r.onTriggerEnter(i),this.activeTriggers.push({collider:e,component:r,otherCollider:i})});else{const r=e.gameObject;this.world.contactPair(t,n,(a,l)=>{Er(r,c=>{if(c.destroyed)return;const h=c.onCollisionEnter||c.onCollisionStay||c.onCollisionExit;if(h||W0){if(!s){const d=[],p=a.normal();i instanceof Rs&&i.convex&&(p.x=-p.x,p.y=-p.y,p.z=-p.z);for(let m=0;m<a.numSolverContacts();m++){const f=a.solverContactPoint(m),g=a.contactImpulse(m);if(f){const y=a.contactDist(m),_=a.solverContactFriction(m),w=a.solverContactTangentVelocity(m),P=new $w(f,y,p,g,_,w);d.push(P),W0&&B.DrawDirection(f,p,16711680,3,!0)}}s=new Hw(r,i,d)}if(h){const d={collider:e,component:c,collision:s};this.activeCollisions.push(d),c.onCollisionStay&&this.activeCollisionsStay.push(d),c.onCollisionEnter?.call(c,s)}}})})}}onHandleCollisionStay(){for(const e of this.activeCollisionsStay){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onCollisionStay){if(e.collision.collider.destroyed)continue;const i=e.collision;t.onCollisionStay(i)}}for(const e of this.activeTriggers){const t=e.component;if(!t.destroyed&&t.activeAndEnabled&&t.onTriggerStay){const i=e.otherCollider;if(i.destroyed)continue;t.onTriggerStay(i)}}}onCollisionEnded(e,t){if(!(e.destroyed||t.destroyed)){for(let i=0;i<this.activeCollisions.length;i++){const n=this.activeCollisions[i],s=n.collider;if(s.destroyed||n.collision.collider.destroyed){this.activeCollisions.splice(i,1),i--;continue}if(s===e&&n.collision.collider===t){const r=n.component;if(this.activeCollisions.splice(i,1),i--,r.activeAndEnabled&&r.onCollisionExit){const a=n.collision;r.onCollisionExit(a)}}}for(let i=0;i<this.activeCollisionsStay.length;i++){const n=this.activeCollisionsStay[i],s=n.collider;if(s.destroyed||n.collision.collider.destroyed){this.activeCollisionsStay.splice(i,1),i--;continue}if(s===e&&n.collision.collider===t){const r=n.component;if(this.activeCollisionsStay.splice(i,1),i--,r.activeAndEnabled&&r.onCollisionExit){const a=n.collision;r.onCollisionExit(a)}}}for(let i=0;i<this.activeTriggers.length;i++){const n=this.activeTriggers[i],s=n.collider;if(s.destroyed||n.otherCollider.destroyed){this.activeTriggers.splice(i,1),i--;continue}if(s===e&&n.otherCollider===t){const r=n.component;if(this.activeTriggers.splice(i,1),i--,r.activeAndEnabled&&r.onTriggerExit){const a=n.otherCollider;r.onTriggerExit(a)}}}}}}class lL{static async createComparisonScene(e){const{files:t}=e,i=await Promise.all(t.map(f=>new ie(f).loadAssetAsync())),n=new wi;let s=0;for(const f of i)if(f instanceof k){f.position.y=s,n.add(f);const g=Xt([f]);s+=g.getSize(new b).y,s+=.1}const r=new re(20);n.add(r);const a=e.environment||"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/studio_small_09_1k.exr";{let f=null;if(a.endsWith(".hdr")){const g=(await import("./three-examples-D1P7eEhn.min.js").then(y=>y.RGBELoader$1)).RGBELoader;f=new g}else if(a.endsWith(".exr")){const g=(await import("./three-examples-D1P7eEhn.min.js").then(y=>y.EXRLoader$1)).EXRLoader;f=new g}if(f){const g=await f.loadAsync(a).catch(y=>(console.error(y),null));g&&(g.mapping=Nn,g.needsUpdate=!0,n.background=g,n.environment=g,n.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",a)}const l=Xt(n.children),c=l.getCenter(new b),h=l.getSize(new b),d=Math.max(h.x,h.y,h.z)/(2*Math.tan(Math.PI*r.fov/360));r.position.set(c.x,c.y,d),r.lookAt(c);const p=new bb(r,e.domElement||document.body);p.target=c,p.update();const m=(e.domElement||document.body).getBoundingClientRect();return r.aspect=m.width/m.height,r.updateProjectionMatrix(),{scene:n,camera:r}}}let $0=0;function oS(o){o?$0++:$0--}function cL(){return $0>0}const hL={binary:!0,animations:!0};async function dL(o){if(!o.context)throw new Error("No context provided to exportAsGLTF");o.scene||(o.scene=o.context.scene);const e={...hL,...o},{context:t}=e,i=new _b;i.register(a=>new wx(a)),i.register(a=>new NT(a)),i.register(a=>new vx(a)),Gf(i,e.context);const n={binary:e.binary,animations:pL(t,e.scene,[])},s=new uL;console.debug("Exporting GLTF",n),s.onBeforeExport(e),oS(!0);const r=await i.parseAsync(e.scene,n).catch(a=>(console.error(a),null));if(oS(!1),s.onAfterExport(e),!r)throw new Error("Failed to export GLTF");if(e.downloadAs!=null){let a=null;if(r instanceof ArrayBuffer?a=new Blob([r],{type:"application/octet-stream"}):console.error("Can not download GLTF as a blob",r),a){const l=URL.createObjectURL(a),c=document.createElement("a");c.href=l;let h=e.downloadAs;!h.endsWith(".glb")&&!h.endsWith(".gltf")&&(h+=e.binary?".glb":".gltf"),c.download=h,c.click()}}return r}const sS=Symbol("needle:weight");class uL{_undo=[];onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const i=vs.tryGetActionsFromMixer(t);if(i)for(let n=0;n<i.length;n++){const s=i[n];s[sS]=s.weight,s.weight=0,this._undo.push(()=>{s.weight=s[sS]})}t.update(0)}),e.context.scene.traverse(t=>{if(!ty(t)){const i=t.parent;i&&(t.removeFromParent(),this._undo.push(()=>i.add(t)))}})}onAfterExport(e){this._undo.forEach(t=>t()),this._undo.length=0}}function pL(o,e,t){o.animations.mixers.forEach(n=>{const s=vs.tryGetActionsFromMixer(n);if(s)for(let r=0;r<s.length;r++){const a=s[r].getClip();t.push(a)}}),Array.isArray(e)||(e=[e]);for(const n of e)vs.tryGetAnimationClipsFromObjectHierarchy(n,t);const i=new Set(t);return Array.from(i)}const rS="needle-button",H0=A();class aS extends HTMLElement{static observedAttributes=["ar","vr","quicklook"];constructor(){super(),this.removeEventListener("click",this.#r),this.addEventListener("click",this.#r)}attributeChangedCallback(e,t,i){this.#a()}#t;#n;#o;#e;#i;#s;#a(){if(this.#e?.remove(),this.getAttribute("ar")!=null)this.#i??=new or,this.#e=this.#i.createARButton();else if(this.getAttribute("vr")!=null)this.#i??=new or,this.#e=this.#i.createVRButton();else if(this.getAttribute("quicklook")!=null)this.#i??=new or,this.#e=this.#i.createQuicklookButton();else{H0?console.warn("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute."):console.debug("No button type specified for <needle-button>. Use either ar, vr or quicklook attribute.");return}this.#t??=this.attachShadow({mode:"open"}),this.#n??=document.createElement("slot"),this.#o??=document.createElement("style"),this.#o.innerHTML=`
1614
- button {
1615
- all: initial;
1616
- cursor: inherit;
1617
- color: inherit;
1618
- font-family: inherit;
1619
- gap: inherit;
1620
- white-space: nowrap;
1621
- }
1622
- `,this.getAttribute("unstyled")!=null||(this.#o.innerHTML+=`
1623
- :host {
1624
- display: inline-block;
1625
- background: rgba(255, 255, 255, .8);
1626
- backdrop-filter: blur(10px);
1627
- width: fit-content;
1628
- transition: background .2s;
1629
-
1630
- cursor: pointer;
1631
- padding: 0.4rem .5rem;
1632
- border-radius: 0.8rem;
1633
- color: black;
1634
- background: rgba(245, 245, 245, .8);
1635
- outline: rgba(0,0,0,.05) 1px solid;
1636
- }
1637
- :host(:hover) {
1638
- background: rgba(255, 255, 255, 1);
1639
- transition: background .2s;
1640
- }
1641
- slot {
1642
- display: flex;
1643
- align-items: center;
1644
- justify-content: center;
1645
- gap: .5rem;
1646
- }
1647
- `),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#o),_u(sf,{element:this.#t}),this.#s?.disconnect(),this.#s??=new MutationObserver(()=>this.#l()),this.#s.observe(this.#e,{attributes:!0}),H0&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{H0&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(rS)&&window.customElements.define(rS,aS);const od=v("debugavatar");class G0{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(s=>s.layers.set(2))}}class lS{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const s=new Bn;i=x.instantiate(Ta(t,e.scene),s)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(od&&console.log("[Custom Avatar] valid config",t,od?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,od?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(od&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let s=null;if(n.ok){const r=await n.blob();r&&(s=await r.arrayBuffer())}return s?(await _n().parseSync(e,s,null,0))?.scene??null:null}const i=new Po;return pf(i,e),new Promise((n,s)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await _n().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{od&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const s=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const a=new b;new xi().setFromObject(n).getSize(a);const l=Math.max(a.x,a.y,a.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+l+" meters! Should be < 0.3m"),l>.3&&n.scale.multiplyScalar(1/l*.3)}return new G0(t,n,s,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const s of t){if(!n)break;i.indexOf(s)===-1&&(n=!1)}if(n)return e;if(e.children)for(const s of e.children){const r=this.findAvatarPart(s,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class cS{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class hS{}const mL=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ge,ActionCollection:$x,ActionModel:vi,AlignmentConstraint:jc,Animation:Dt,AnimationCurve:fh,AnimationExtension:sp,AnimationTrackHandler:Uh,Animator:yt,AnimatorController:dn,Antialiasing:wh,Attractor:Rl,AudioExtension:ba,AudioListener:Do,AudioSource:Ai,AudioTrackHandler:cs,Avatar:js,AvatarBlink_Simple:Ur,AvatarEyeLook_Rotation:Mf,AvatarLoader:lS,AvatarMarker:Ie,AvatarModel:G0,Avatar_Brain_LookAt:Vc,Avatar_MouthShapes:Wc,Avatar_MustacheShake:Of,Avatar_POI:Fr,AxesHelper:tl,BaseUIComponent:cn,BasicIKConstraint:Tf,BehaviorExtension:My,BehaviorModel:It,BloomEffect:Mp,BoxCollider:zu,BoxGizmo:Kr,BoxHelperComponent:St,Button:Ko,CallInfo:jo,Camera:hi,CameraTargetReachedEvent:Nc,Canvas:Sl,CanvasGroup:zs,CapsuleCollider:Bo,ChangeMaterialOnClick:gy,ChangeTransformOnClick:qr,CharacterController:zr,CharacterControllerInput:Uo,ChromaticAberration:xh,ClickThrough:Zp,Collider:ui,ColorAdjustments:qs,ColorBySpeedModule:kl,ColorOverLifetimeModule:wp,ContactShadows:Hc,ControlTrackHandler:$p,CursorFollow:pa,CustomBranding:Zr,Deletable:jf,DeleteBox:ar,DepthOfField:An,DeviceFlag:Nu,DocumentExtension:cS,DragControls:Wr,DropListener:No,Duplicatable:Kf,EffectWrapper:Ch,EmissionModule:Xo,EmphasizeOnClick:gl,EnvironmentScene:Qp,EventList:he,EventListEvent:Eu,EventSystem:si,EventTrigger:Qu,FieldWithDefault:bx,FixedJoint:Gy,Fog:Cl,GltfExport:oy,GltfExportBox:iy,Gradient:ea,Graphic:ch,GraphicRaycaster:Lu,GridHelper:Pl,GridLayoutGroup:By,GroundProjectedEnv:Yn,GroupActionModel:Gr,HideOnStart:un,HingeJoint:uh,HorizontalLayoutGroup:Dy,get HoverAnimation(){return go},Image:jl,InheritVelocityModule:Jy,InputField:k0,InstanceHandle:Sa,InstancingHandler:_a,Interactable:Lf,Keyframe:yi,LODGroup:mh,LODModel:Ol,Light:fi,LimitVelocityOverLifetimeModule:ct,LogStats:If,LookAt:M0,LookAtConstraint:jr,MainModule:Vt,MarkerTrackHandler:Wp,MaskableGraphic:hh,MeshCollider:Rs,MeshRenderer:Qc,MinMaxCurve:Y,MinMaxGradient:ta,NeedleMenu:ro,NestedGltf:gh,Networking:Yy,NoiseModule:_e,ObjectRaycaster:Ei,OffsetConstraint:Jr,OpenURL:Dl,OrbitControls:me,Outline:wl,Padding:Yr,ParticleBurst:vp,ParticleSubEmitter:e0,ParticleSystem:_h,ParticleSystemRenderer:sn,PhysicsExtension:Ry,PixelationEffect:Ph,PlayAnimationOnClick:Jc,PlayAudioOnClick:Is,PlayableDirector:ha,PlayerColor:ql,PointerEventData:ud,PostProcessingHandler:y0,PreliminaryAction:fl,PreliminaryTrigger:eh,RawImage:qp,Rect:Zx,RectTransform:Rn,ReflectionProbe:Xc,RegisteredAnimationInfo:lr,RemoteSkybox:jp,Renderer:Kt,RendererLightmap:Qf,Rigidbody:Ze,RotationBySpeedModule:on,RotationOverLifetimeModule:En,SceneSwitcher:Qe,ScreenCapture:Qs,ScreenSpaceAmbientOcclusion:Qo,ScreenSpaceAmbientOcclusionN8:In,ScrollFollow:Jo,SeeThrough:Zo,SetActiveOnClick:fy,ShadowCatcher:Ah,ShapeModule:Ky,SharpeningEffect:kh,SignalAsset:Vp,SignalReceiver:Fh,SignalReceiverEvent:Bh,SignalTrackHandler:zh,Size:Yx,SizeBySpeedModule:bi,SizeOverLifetimeModule:ia,SkinnedMeshRenderer:Yf,SmoothFollow:Bp,SpatialGrabRaycaster:ya,SpatialHtml:Vh,SpatialTrigger:Fp,SpatialTriggerReceiver:ho,SpectatorCamera:Up,SphereCollider:il,SplineContainer:ca,SplineData:uo,SplineWalker:an,Sprite:Wo,SpriteData:bl,SpriteRenderer:mi,SpriteSheet:yl,SubEmitterSystem:Pp,SyncedCamera:_0,SyncedRoom:Ln,SyncedTransform:Pn,TapGestureTrigger:by,TeleportTarget:hp,TestRunner:x0,TestSimulateUserData:S0,Text:Nt,TextBuilder:Ly,TextExtension:mp,TextureSheetAnimationModule:Wt,TiltShiftEffect:co,ToneMappingEffect:Gs,TrailModule:Fe,TransformData:Ne,TransformGizmo:da,TriggerBuilder:zt,TriggerModel:nr,UIRaycastUtils:bf,UIRootComponent:rh,USDZExporter:Tn,USDZText:xl,USDZUIExtension:zy,UsageMarker:Gc,VariantAction:py,VelocityOverLifetimeModule:We,VerticalLayoutGroup:jy,VideoPlayer:dt,get ViewBox(){return it},Vignette:ra,VisibilityAction:th,Voip:Ms,Volume:El,VolumeParameter:F,VolumeProfile:Op,WebARCameraBackground:qh,WebARSessionRoot:Ni,WebXR:dp,WebXRImageTracking:Xh,WebXRImageTrackingModel:ts,WebXRPlaneTracking:is,WebXRTrackedImage:Xl,XRControllerFollow:es,XRControllerModel:$o,XRControllerMovement:Li,XRFlag:en,XRRig:im,XRState:oi,__Ignore:hS},Symbol.toStringTag,{value:"Module"})),sd=v("debugmissingcamera");ue.registerCallback(de.MissingCamera,o=>{sd&&console.warn("Creating missing camera");const e=o.context.scene,t=new re;t.name="Default Fallback Camera",e.add(t);const i=new hi;if(i.sourceId=o.files?.[0]?.src??"unknown",i.fieldOfView=35,o.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Br.Uninitialized;else if(o.context.domElement.getAttribute("background-image")?.length||o.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Br.Skybox;else{if(i.clearFlags=Br.SolidColor,!o.context.domElement.getAttribute("background-color")){let s="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(s="#1f1f1f"),e.background=new ne(s)}if(!e.environment){const s=new BC(o.context.renderer),r=new Qp("neutral");e.environment=s.fromScene(r,.025).texture}}const n=kr(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,o.context.domElement?.cameraControls!=!1&&dS(o.context,n),n}),ue.registerCallback(de.ContextCreated,o=>{if(!o.context.mainCamera){sd&&console.log("Will not auto-fit because a default camera exists");return}if(o.context.domElement?.cameraControls==!0){if(Xb(o.context.mainCamera)?.isCameraController==!0){sd&&console.log("Will not auto-fit because a camera controller exists");return}dS(o.context)}});function dS(o,e){e=e??o.mainCameraComponent;const t=e?.gameObject;if(sd&&console.log("Creating default camera controls",e?.name),t){const i=Cc(t,me);i.sourceId=e?.sourceId??"unknown";const n=o.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const s=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(s)?.5:s,sd&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=o.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}ue.registerCallback(de.ContextCreated,o=>{const e=o.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&o.files)for(const t of o.files)x.foreachComponent(t.file.scene,i=>{if(i.enabled!==!1){if(i instanceof Dt&&i.playAutomatically||i instanceof yt||i instanceof ha&&i.playOnAwake===!0)return!0;if(i instanceof Dt)return i.playAutomatically=!0,!0;if(i instanceof ha)return i.playOnAwake=!0,!0}},!0)!==!0&&vs.autoplayAnimations(t.file)});var q0;(o=>{function e(t,i=!1,n=.75){const s=new ca,r=1-L.clamp(n,0,1);return t.forEach((a,l)=>{const c=new b;l<t.length-1?c.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&c.subVectors(t[0],a).normalize().multiplyScalar(r);const h=new uo;h.position.copy(a),h.tangentIn.copy(c),h.tangentOut.copy(c),s.addKnot(h)}),s.closed=i,s}o.createFromPoints=e})(q0||(q0={}));class gL extends gP{constructor(){super(new Worker(URL.createObjectURL(new Blob([`import '${new URL("./generateMeshBVH.worker-mO20N_b8.js",import.meta.url).toString()}';`],{type:"text/javascript"})),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,s)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=c=>{s(new Error(`[GenerateMeshBVHWorker] ${c.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=c=>{const{data:h}=c;if(h.error)s(new Error(h.error)),e.onmessage=null;else if(h.serialized){const{serialized:d,position:p}=h,m=fP.deserialize(d,t,{setIndex:!1}),f=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,d.index)if(t.index)t.index.array=d.index;else{const g=new mt(d.index,1,!1);t.setIndex(g)}f.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new xi)),i.onProgress&&i.onProgress(h.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(h.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(c=>c.buffer).filter(c=>typeof SharedArrayBuffer>"u"||!(c instanceof SharedArrayBuffer)))})}}const fL=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:gL},Symbol.toStringTag,{value:"Module"}));export{WR as $physicsKey,ge as ActionBuilder,$x as ActionCollection,vi as ActionModel,Gv as Addressables,jc as AlignmentConstraint,Ya as AmbientMode,Dt as Animation,fh as AnimationCurve,sp as AnimationExtension,Uh as AnimationTrackHandler,vs as AnimationUtils,yt as Animator,Cs as AnimatorConditionMode,dn as AnimatorController,gf as AnimatorControllerParameterType,Dc as AnimatorStateInfo,wh as Antialiasing,Dn as Application,K_ as AssetDatabase,ie as AssetReference,Rl as Attractor,ba as AudioExtension,Do as AudioListener,Ai as AudioSource,cs as AudioTrackHandler,js as Avatar,Ur as AvatarBlink_Simple,Mf as AvatarEyeLook_Rotation,lS as AvatarLoader,Ie as AvatarMarker,G0 as AvatarModel,Vc as Avatar_Brain_LookAt,Wc as Avatar_MouthShapes,Of as Avatar_MustacheShake,Fr as Avatar_POI,Za as Axes,tl as AxesHelper,sg as BUILD_TIME,cn as BaseUIComponent,Tf as BasicIKConstraint,My as BehaviorExtension,It as BehaviorModel,Ar as BlobStorage,Mp as BloomEffect,zu as BoxCollider,Kr as BoxGizmo,St as BoxHelperComponent,Ko as Button,Fn as ButtonsFactory,Xw as CallDirection,jo as CallInfo,hi as Camera,Nc as CameraTargetReachedEvent,Sl as Canvas,zs as CanvasGroup,Bo as CapsuleCollider,gy as ChangeMaterialOnClick,qr as ChangeTransformOnClick,zr as CharacterController,Uo as CharacterControllerInput,xh as ChromaticAberration,Oi as CircularBuffer,Br as ClearFlags,Zp as ClickThrough,po as ClipExtrapolation,ui as Collider,Hw as Collision,Ru as CollisionDetectionMode,qs as ColorAdjustments,kl as ColorBySpeedModule,wp as ColorOverLifetimeModule,YM as Component,R as Component$1,Kd as ComponentLifecycleEvents,mL as Components,B_ as ConnectionEvents,$w as ContactPoint,Hc as ContactShadows,z as Context,LM as ContextArgs,de as ContextEvent,ue as ContextRegistry,$p as ControlTrackHandler,pa as CursorFollow,Zr as CustomBranding,Re as CustomShader,fu as DefaultReflectionMode,jf as Deletable,ar as DeleteBox,An as DepthOfField,Nu as DeviceFlag,q as DeviceUtilities,cS as DocumentExtension,Wr as DragControls,Bf as DragMode,No as DropListener,Kf as Duplicatable,Ch as EffectWrapper,Xo as EmissionModule,gl as EmphasizeOnClick,md as EngineLoadingView,Qp as EnvironmentScene,he as EventList,Eu as EventListEvent,si as EventSystem,Qu as EventTrigger,bx as FieldWithDefault,xa as FileReference,Xv as FileReferenceSerializer,uT as FileSpawnModel,ix as File_Event,Gy as FixedJoint,Cl as Fog,we as FrameEvent,Fd as GENERATOR,x as GameObject,B as Gizmos,oy as GltfExport,iy as GltfExportBox,ea as Gradient,ch as Graphic,Lu as GraphicRaycaster,sr as Graphics,Pl as GridHelper,By as GridLayoutGroup,Yn as GroundProjectedEnv,Gr as GroupActionModel,Bu as HideFlags,un as HideOnStart,uh as HingeJoint,Dy as HorizontalLayoutGroup,kk as HostData,go as HoverAnimation,jl as Image,wa as ImageReference,qv as ImageReferenceSerializer,Jy as InheritVelocityModule,C_ as Input,ai as InputEventQueue,Ee as InputEvents,k0 as InputField,Sa as InstanceHandle,_a as InstancingHandler,hn as InstancingUtil,pv as InstantiateEvent,Lt as InstantiateIdProvider,Bn as InstantiateOptions,Lf as Interactable,Gh as InternalScreenshotUtils,YO as JoinedRoomResponse,UO as KeyEventArgs,yi as Keyframe,mh as LODGroup,Ol as LODModel,ZO as LeftRoomResponse,fi as Light,iw as LightData,ct as LimitVelocityOverLifetimeModule,JI as LoadingElementOptions,If as LogStats,ki as LogType,M0 as LookAt,jr as LookAtConstraint,E as MODULES,Vt as MainModule,Wp as MarkerTrackHandler,C0 as MarkerType,hh as MaskableGraphic,L as Mathf,Rs as MeshCollider,Qc as MeshRenderer,Y as MinMaxCurve,ta as MinMaxGradient,vc as NEEDLE_ENGINE_FEATURE_FLAGS,dc as NEKeyboardEvent,Mo as NEPointerEvent,aS as NeedleButtonElement,Uf as NeedleEngineModelLoader,N0 as NeedleEngineWebComponent,ro as NeedleMenu,zd as NeedlePatchesKey,hg as NeedleXRController,Z as NeedleXRSession,z_ as NeedleXRSync,G_ as NeedleXRUtils,gh as NestedGltf,U_ as NetworkConnection,Kn as NetworkedStreamEvents,pd as NetworkedStreams,Yy as Networking,gv as NewInstanceModel,_e as NoiseModule,Ei as ObjectRaycaster,Sr as ObjectUtils,Jr as OffsetConstraint,Ed as OneEuroFilter,Hm as OneEuroFilterXYZ,Dl as OpenURL,me as OrbitControls,wl as Outline,F_ as OwnershipEvent,fg as OwnershipModel,Ia as PUBLIC_KEY,Yr as Padding,vp as ParticleBurst,e0 as ParticleSubEmitter,_h as ParticleSystem,Hs as ParticleSystemBaseBehaviour,sn as ParticleSystemRenderer,_p as ParticleSystemShapeType,ls as PeerHandle,j_ as PeerNetworking,Hl as Physics,Ry as PhysicsExtension,bt as PhysicsMaterialCombine,Ph as PixelationEffect,Jc as PlayAnimationOnClick,Is as PlayAudioOnClick,ha as PlayableDirector,ql as PlayerColor,kn as PlayerState,Xx as PlayerStateEvent,Cy as PlayerSync,Zv as PlayerView,Kv as PlayerViewManager,ud as PointerEventData,Vd as PointerType,tt as PostProcessingEffect,ht as PostProcessingEffectOrder,y0 as PostProcessingHandler,fl as PreliminaryAction,eh as PreliminaryTrigger,Es as PreviewHelper,xr as PrimitiveType,ae as Progress,zm as PromiseAllWithErrors,Um as PromiseErrorResult,oe as RGBAColor,Ql as RapierPhysics,qp as RawImage,bs as RaycastOptions,Zx as Rect,Rn as RectTransform,Xc as ReflectionProbe,lr as RegisteredAnimationInfo,jp as RemoteSkybox,_o as RenderTexture,Fw as RenderTextureSerializer,Kt as Renderer,tw as RendererData,Qf as RendererLightmap,Ze as Rigidbody,Xe as RigidbodyConstraints,te as RoomEvents,on as RotationBySpeedModule,En as RotationOverLifetimeModule,$u as SceneLightSettings,Qe as SceneSwitcher,Qs as ScreenCapture,Qo as ScreenSpaceAmbientOcclusion,In as ScreenSpaceAmbientOcclusionN8,Jo as ScrollFollow,Zo as SeeThrough,vn as SendQueue,$g as SerializationContext,fy as SetActiveOnClick,Ah as ShadowCatcher,Ky as ShapeModule,Gw as ShapeOverlapResult,kh as SharpeningEffect,Vp as SignalAsset,Fh as SignalReceiver,Bh as SignalReceiverEvent,zh as SignalTrackHandler,Yx as Size,bi as SizeBySpeedModule,ia as SizeOverLifetimeModule,Yf as SkinnedMeshRenderer,Bp as SmoothFollow,ya as SpatialGrabRaycaster,Vh as SpatialHtml,Fp as SpatialTrigger,ho as SpatialTriggerReceiver,Up as SpectatorCamera,il as SphereCollider,Og as SphereIntersection,ca as SplineContainer,uo as SplineData,q0 as SplineUtils,an as SplineWalker,Wo as Sprite,bl as SpriteData,mi as SpriteRenderer,yl as SpriteSheet,iR as StateMachineBehaviour,Cf as StreamEndedEvent,qw as StreamReceivedEvent,Pp as SubEmitterSystem,_0 as SyncedCamera,Ln as SyncedRoom,Pn as SyncedTransform,by as TapGestureTrigger,hp as TeleportTarget,x0 as TestRunner,lL as TestSceneUtils,S0 as TestSimulateUserData,Nt as Text,Ly as TextBuilder,mp as TextExtension,Wt as TextureSheetAnimationModule,co as TiltShiftEffect,ow as Time,Gs as ToneMappingEffect,Ll as TrackHandler,Ui as TrackType,Fe as TrailModule,Ne as TransformData,da as TransformGizmo,zt as TriggerBuilder,nr as TriggerModel,C as TypeStore,bf as UIRaycastUtils,rh as UIRootComponent,sy as USDDocument,nt as USDObject,kx as USDWriter,Tn as USDZExporter,Rx as USDZExporter$1,xl as USDZText,zy as USDZUIExtension,Uw as UriSerializer,Gc as UsageMarker,KO as UserJoinedOrLeftRoomModel,bn as VERSION,py as VariantAction,We as VelocityOverLifetimeModule,jy as VerticalLayoutGroup,dt as VideoPlayer,it as ViewBox,ws as ViewDevice,ra as Vignette,th as VisibilityAction,Ms as Voip,El as Volume,F as VolumeParameter,Op as VolumeProfile,sM as WaitForFrames,Qv as WaitForPromise,Kg as WaitForSeconds,rs as Watch,qh as WebARCameraBackground,Ni as WebARSessionRoot,dp as WebXR,or as WebXRButtonFactory,Xh as WebXRImageTracking,ts as WebXRImageTrackingModel,is as WebXRPlaneTracking,Xl as WebXRTrackedImage,es as XRControllerFollow,$o as XRControllerModel,Li as XRControllerMovement,en as XRFlag,im as XRRig,oi as XRState,eo as XRStateFlag,hS as __Ignore,fk as __internalNotifyObjectDestroyed,ko as activeInHierarchyFieldName,Bm as addAttributeChangeCallback,Sn as addComponent,MT as addCustomExtensionPlugin,kr as addNewComponent,Ud as addPatch,au as apply,XM as applyHMRChanges,Ev as applyPrototypeExtensions,mv as beginListenDestroy,yv as beginListenInstantiate,pg as binaryIdentifierCasts,IM as build_scene_functions,_r as builtinComponentKeyName,z0 as calculateProgress01,qP as clearMessages,_R as colorSerializer,wv as compareAssociation,Au as componentSerializer,r_ as copyTexture,Ew as createMotion,li as debugNet,pc as debugOwner,Lx as decompressGpuTexture,tc as deepClone,Wn as delay,ic as delayForFrames,su as deserializeObject,Zi as destroy,jv as destroyComponentInstance,nx as determineMimeTypeFromExtension,Pe as disposeObjectResources,Jn as disposeStream,hc as editorGuidKeyName,fr as enableSpatialConsole,wR as euler,PR as eventListSerializer,dL as exportAsGLTF,Xg as findByGuid,$a as findObjectOfType,Fv as findObjectsOfType,kg as findResourceUsers,Lw as fitCamera,l_ as fitObjectIntoVolume,Er as foreachComponent,uu as foreachComponentEnumerator,dO as forward,cw as generateQRCode,fv as generateSeed,Xt as getBoundingBox,Xb as getCameraController,Mr as getComponent,Oc as getComponentInChildren,kc as getComponentInParent,Pc as getComponents,Wa as getComponentsInChildren,ru as getComponentsInParent,Sx as getFormattedDate,Pt as getIconElement,of as getIconTexture,_n as getLoader,Cc as getOrAddComponent,v as getParam,mO as getParentHierarchyPath,PP as getPath,GO as getPeerOptions,I_ as getPeerjsInstance,bk as getResourceUserCount,Zb as getTempColor,ri as getTempQuaternion,D as getTempVector,Jl as getUrlParams,a_ as getVisibleInCustomShadowRendering,t_ as getWorldDirection,Km as getWorldEuler,J as getWorldPosition,be as getWorldQuaternion,jd as getWorldRotation,He as getWorldScale,Io as hasCommercialLicense,Ac as hasIndieLicense,Tu as hasPointerEventComponent,Qn as hasProLicense,p_ as hideDebugConsole,jx as imageToCanvas,qa as instantiate,mx as invokeLoadedImportPluginHooks,S_ as invokeXRSessionEnd,x_ as invokeXRSessionStart,Uv as isActiveInHierarchy,Ha as isActiveSelf,EP as isAndroidDevice,s_ as isAnimationAction,Ww as isComponent,wP as isDebugMode,kP as isDesktop,Tr as isDestroyed,A as isDevEnvironment,gk as isDisposed,cL as isExporting,Vw as isGLTFModel,Eb as isHostedOnGlitch,mf as isHotReloadEnabled,GM as isHotReloading,RP as isIPad,hw as isIconElement,$i as isLocalNetwork,IP as isMacOS,MP as isMobileDevice,AP as isMozillaXR,DP as isQuest,ev as isResourceTrackingEnabled,jP as isSafari,cu as isUsingInstancing,LP as isiOS,TP as isiPad,qI as loadAsset,k1 as loadPMREM,U0 as loadSync,Dd as logHierarchy,nO as lookAtInverse,oc as lookAtObject,oO as lookAtScreenPoint,SP as makeId,Bb as makeIdFromRandomWords,Ii as makeNameSafe,zv as markAsInstancedRendered,BP as microphonePermissionsGranted,vP as nameof,Ib as nameofFactory,Bw as objectSerializer,FO as offXRSessionEnd,BO as offXRSessionStart,$M as onAfterRender,WM as onBeforeRender,NM as onClear,VM as onDestroy,bw as onInitialized,Cu as onStart,_w as onUpdate,cg as onXRSessionEnd,Nd as onXRSessionStart,Y1 as parseSync,c_ as placeOnSurface,tg as postprocessFBXMaterials,pR as prefix,Lb as pushState,CP as randomNumber,mg as registerBinaryType,wu as registerComponent,Hf as registerComponentExtension,rn as registerCustomEffectType,Gf as registerExportExtensions,Gu as registerExtensions,Pw as registerHotReloadType,rg as registerLoader,_v as registerPrefabProvider,Av as registerPrototypeExtensions,Ug as registerType,Ub as relativePathPrefix,Fm as removeAttributeChangeCallback,qg as removeComponent,RT as removeCustomImportExtensionType,jO as removePatch,ms as resolveUrl,Fb as sanitizeString,W1 as saveImage,TI as screenshot,L0 as screenshot2,Dg as sendDestroyed,u as serializable,Pv as serializeObject,qe as serializeable,Mc as setActive,Wb as setAllowBalloonMessages,WP as setAllowOverlayMessages,Id as setAutoFitEnabled,Gm as setCameraController,Vv as setDestroyed,xO as setDevEnvironment,iv as setDisposable,Ga as setDontDestroy,Lm as setOrAddParamsToUrl,xP as setParam,ec as setParamWithoutReload,qO as setPeerOptions,mk as setResourceTrackingEnabled,jm as setState,eg as setVisibleInCustomShadowRendering,Jm as setWorldEuler,gt as setWorldPosition,mr as setWorldPositionXYZ,yn as setWorldQuaternion,Zm as setWorldQuaternionXYZW,o_ as setWorldRotation,sc as setWorldRotationXYZ,Aa as setWorldScale,lc as showBalloonError,Te as showBalloonMessage,ye as showBalloonWarning,og as showDebugConsole,iO as slerp,xc as syncDestroy,Sy as syncField,Bg as syncInstantiate,gO as textureToCanvas,zb as toSourceId,E_ as tryCastBinary,sx as tryDetermineMimetypeFromBinary,ox as tryDetermineMimetypeFromURL,Ta as tryFindObject,A_ as tryGetGuid,Ow as unregisterHotReloadType,Dm as unwatchWrite,Qb as useForAutoFit,Ot as validate,Rd as watchWrite};