@needle-tools/engine 4.11.5-next.d9019e4 → 4.11.5-next.dedc70b

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 (367) hide show
  1. package/components.needle.json +1 -1
  2. package/custom-elements.json +436 -0
  3. package/dist/{needle-engine.bundle-GILPT50v.min.js → needle-engine.bundle-CJlEyOBM.min.js} +4 -4
  4. package/dist/{needle-engine.bundle-DbRanrPL.umd.cjs → needle-engine.bundle-DgiVW9bH.umd.cjs} +6 -6
  5. package/dist/{needle-engine.bundle-D4DKOVeW.js → needle-engine.bundle-F4gDjlNg.js} +60 -14
  6. package/dist/needle-engine.d.ts +18154 -1
  7. package/dist/needle-engine.js +2 -2
  8. package/dist/needle-engine.min.js +1 -1
  9. package/dist/needle-engine.umd.cjs +1 -1
  10. package/lib/engine/api.d.ts +0 -1
  11. package/lib/engine/api.js +0 -1
  12. package/lib/engine/api.js.map +1 -1
  13. package/lib/engine/engine_texture.d.ts +1 -1
  14. package/lib/engine/engine_tonemapping.d.ts +1 -1
  15. package/lib/engine/webcomponents/logo-element.d.ts +11 -0
  16. package/lib/engine/webcomponents/logo-element.js +6 -0
  17. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  18. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +24 -3
  19. package/lib/engine/webcomponents/needle menu/needle-menu.js +18 -3
  20. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  21. package/lib/engine/webcomponents/needle-button.d.ts +5 -0
  22. package/lib/engine/webcomponents/needle-button.js.map +1 -1
  23. package/lib/engine/webcomponents/needle-engine.d.ts +209 -8
  24. package/lib/engine/webcomponents/needle-engine.js +91 -13
  25. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  26. package/lib/engine-components/AlignmentConstraint.d.ts +9 -0
  27. package/lib/engine-components/AlignmentConstraint.js +9 -0
  28. package/lib/engine-components/AlignmentConstraint.js.map +1 -1
  29. package/lib/engine-components/Animator.d.ts +1 -0
  30. package/lib/engine-components/Animator.js.map +1 -1
  31. package/lib/engine-components/AudioListener.d.ts +2 -0
  32. package/lib/engine-components/AudioListener.js +2 -0
  33. package/lib/engine-components/AudioListener.js.map +1 -1
  34. package/lib/engine-components/AudioSource.d.ts +1 -0
  35. package/lib/engine-components/AudioSource.js +1 -0
  36. package/lib/engine-components/AudioSource.js.map +1 -1
  37. package/lib/engine-components/AxesHelper.d.ts +2 -0
  38. package/lib/engine-components/AxesHelper.js +2 -0
  39. package/lib/engine-components/AxesHelper.js.map +1 -1
  40. package/lib/engine-components/Camera.d.ts +1 -0
  41. package/lib/engine-components/Camera.js +1 -0
  42. package/lib/engine-components/Camera.js.map +1 -1
  43. package/lib/engine-components/CharacterController.d.ts +4 -1
  44. package/lib/engine-components/CharacterController.js +4 -1
  45. package/lib/engine-components/CharacterController.js.map +1 -1
  46. package/lib/engine-components/DeleteBox.d.ts +2 -0
  47. package/lib/engine-components/DeleteBox.js +2 -0
  48. package/lib/engine-components/DeleteBox.js.map +1 -1
  49. package/lib/engine-components/DeviceFlag.d.ts +4 -0
  50. package/lib/engine-components/DeviceFlag.js +4 -0
  51. package/lib/engine-components/DeviceFlag.js.map +1 -1
  52. package/lib/engine-components/DragControls.d.ts +1 -0
  53. package/lib/engine-components/DragControls.js +1 -0
  54. package/lib/engine-components/DragControls.js.map +1 -1
  55. package/lib/engine-components/DropListener.d.ts +1 -0
  56. package/lib/engine-components/DropListener.js +1 -0
  57. package/lib/engine-components/DropListener.js.map +1 -1
  58. package/lib/engine-components/Duplicatable.d.ts +1 -0
  59. package/lib/engine-components/Duplicatable.js +1 -0
  60. package/lib/engine-components/Duplicatable.js.map +1 -1
  61. package/lib/engine-components/EventTrigger.d.ts +2 -0
  62. package/lib/engine-components/EventTrigger.js +2 -0
  63. package/lib/engine-components/EventTrigger.js.map +1 -1
  64. package/lib/engine-components/GridHelper.d.ts +2 -0
  65. package/lib/engine-components/GridHelper.js +2 -0
  66. package/lib/engine-components/GridHelper.js.map +1 -1
  67. package/lib/engine-components/GroundProjection.d.ts +1 -0
  68. package/lib/engine-components/GroundProjection.js +1 -0
  69. package/lib/engine-components/GroundProjection.js.map +1 -1
  70. package/lib/engine-components/LODGroup.d.ts +2 -0
  71. package/lib/engine-components/LODGroup.js +2 -0
  72. package/lib/engine-components/LODGroup.js.map +1 -1
  73. package/lib/engine-components/Light.d.ts +1 -0
  74. package/lib/engine-components/Light.js +1 -0
  75. package/lib/engine-components/Light.js.map +1 -1
  76. package/lib/engine-components/LookAtConstraint.d.ts +1 -0
  77. package/lib/engine-components/LookAtConstraint.js +1 -0
  78. package/lib/engine-components/LookAtConstraint.js.map +1 -1
  79. package/lib/engine-components/NeedleMenu.d.ts +1 -0
  80. package/lib/engine-components/NeedleMenu.js +1 -0
  81. package/lib/engine-components/NeedleMenu.js.map +1 -1
  82. package/lib/engine-components/NestedGltf.d.ts +1 -0
  83. package/lib/engine-components/NestedGltf.js +1 -0
  84. package/lib/engine-components/NestedGltf.js.map +1 -1
  85. package/lib/engine-components/Networking.d.ts +1 -0
  86. package/lib/engine-components/Networking.js +1 -0
  87. package/lib/engine-components/Networking.js.map +1 -1
  88. package/lib/engine-components/OffsetConstraint.d.ts +7 -0
  89. package/lib/engine-components/OffsetConstraint.js +7 -0
  90. package/lib/engine-components/OffsetConstraint.js.map +1 -1
  91. package/lib/engine-components/OrbitControls.d.ts +1 -0
  92. package/lib/engine-components/OrbitControls.js +1 -0
  93. package/lib/engine-components/OrbitControls.js.map +1 -1
  94. package/lib/engine-components/PlayerColor.d.ts +2 -0
  95. package/lib/engine-components/PlayerColor.js +2 -0
  96. package/lib/engine-components/PlayerColor.js.map +1 -1
  97. package/lib/engine-components/ReflectionProbe.d.ts +1 -0
  98. package/lib/engine-components/ReflectionProbe.js +1 -0
  99. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  100. package/lib/engine-components/RigidBody.d.ts +1 -0
  101. package/lib/engine-components/RigidBody.js +1 -0
  102. package/lib/engine-components/RigidBody.js.map +1 -1
  103. package/lib/engine-components/SceneSwitcher.d.ts +1 -0
  104. package/lib/engine-components/SceneSwitcher.js +1 -0
  105. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  106. package/lib/engine-components/ScreenCapture.d.ts +1 -0
  107. package/lib/engine-components/ScreenCapture.js +1 -0
  108. package/lib/engine-components/ScreenCapture.js.map +1 -1
  109. package/lib/engine-components/SeeThrough.d.ts +1 -0
  110. package/lib/engine-components/SeeThrough.js +1 -0
  111. package/lib/engine-components/SeeThrough.js.map +1 -1
  112. package/lib/engine-components/ShadowCatcher.d.ts +2 -0
  113. package/lib/engine-components/ShadowCatcher.js +2 -0
  114. package/lib/engine-components/ShadowCatcher.js.map +1 -1
  115. package/lib/engine-components/Skybox.d.ts +1 -0
  116. package/lib/engine-components/Skybox.js +1 -0
  117. package/lib/engine-components/Skybox.js.map +1 -1
  118. package/lib/engine-components/SmoothFollow.d.ts +1 -0
  119. package/lib/engine-components/SmoothFollow.js +1 -0
  120. package/lib/engine-components/SmoothFollow.js.map +1 -1
  121. package/lib/engine-components/SpatialTrigger.d.ts +1 -0
  122. package/lib/engine-components/SpatialTrigger.js +1 -0
  123. package/lib/engine-components/SpatialTrigger.js.map +1 -1
  124. package/lib/engine-components/SpectatorCamera.d.ts +1 -0
  125. package/lib/engine-components/SpectatorCamera.js +1 -0
  126. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  127. package/lib/engine-components/SpriteRenderer.d.ts +1 -0
  128. package/lib/engine-components/SpriteRenderer.js +1 -0
  129. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  130. package/lib/engine-components/SyncedCamera.d.ts +2 -0
  131. package/lib/engine-components/SyncedCamera.js +2 -0
  132. package/lib/engine-components/SyncedCamera.js.map +1 -1
  133. package/lib/engine-components/SyncedRoom.d.ts +1 -0
  134. package/lib/engine-components/SyncedRoom.js +1 -0
  135. package/lib/engine-components/SyncedRoom.js.map +1 -1
  136. package/lib/engine-components/SyncedTransform.d.ts +2 -0
  137. package/lib/engine-components/SyncedTransform.js +2 -0
  138. package/lib/engine-components/SyncedTransform.js.map +1 -1
  139. package/lib/engine-components/TransformGizmo.d.ts +2 -0
  140. package/lib/engine-components/TransformGizmo.js +2 -0
  141. package/lib/engine-components/TransformGizmo.js.map +1 -1
  142. package/lib/engine-components/VideoPlayer.d.ts +1 -0
  143. package/lib/engine-components/VideoPlayer.js +1 -0
  144. package/lib/engine-components/VideoPlayer.js.map +1 -1
  145. package/lib/engine-components/Voip.d.ts +1 -0
  146. package/lib/engine-components/Voip.js +1 -0
  147. package/lib/engine-components/Voip.js.map +1 -1
  148. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +18 -0
  149. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +18 -0
  150. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -1
  151. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +1 -0
  152. package/lib/engine-components/particlesystem/ParticleSystem.js +1 -0
  153. package/lib/engine-components/particlesystem/ParticleSystem.js.map +1 -1
  154. package/lib/engine-components/physics/Attractor.d.ts +3 -0
  155. package/lib/engine-components/physics/Attractor.js +3 -0
  156. package/lib/engine-components/physics/Attractor.js.map +1 -1
  157. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +1 -0
  158. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +1 -0
  159. package/lib/engine-components/postprocessing/Effects/BloomEffect.js.map +1 -1
  160. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +4 -0
  161. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +4 -0
  162. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js.map +1 -1
  163. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +3 -0
  164. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +3 -0
  165. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
  166. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +4 -0
  167. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +4 -0
  168. package/lib/engine-components/postprocessing/Effects/DepthOfField.js.map +1 -1
  169. package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +1 -0
  170. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +1 -0
  171. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js.map +1 -1
  172. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +3 -0
  173. package/lib/engine-components/postprocessing/Effects/Pixelation.js +3 -0
  174. package/lib/engine-components/postprocessing/Effects/Pixelation.js.map +1 -1
  175. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +4 -0
  176. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +4 -0
  177. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js.map +1 -1
  178. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +4 -0
  179. package/lib/engine-components/postprocessing/Effects/Sharpening.js +4 -0
  180. package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
  181. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +4 -0
  182. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +4 -0
  183. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js.map +1 -1
  184. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +4 -0
  185. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +4 -0
  186. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  187. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +4 -0
  188. package/lib/engine-components/postprocessing/Effects/Vignette.js +4 -0
  189. package/lib/engine-components/postprocessing/Effects/Vignette.js.map +1 -1
  190. package/lib/engine-components/postprocessing/Volume.d.ts +1 -0
  191. package/lib/engine-components/postprocessing/Volume.js +1 -0
  192. package/lib/engine-components/postprocessing/Volume.js.map +1 -1
  193. package/lib/engine-components/splines/Spline.d.ts +1 -0
  194. package/lib/engine-components/splines/Spline.js +1 -0
  195. package/lib/engine-components/splines/Spline.js.map +1 -1
  196. package/lib/engine-components/splines/SplineWalker.d.ts +1 -0
  197. package/lib/engine-components/splines/SplineWalker.js +1 -0
  198. package/lib/engine-components/splines/SplineWalker.js.map +1 -1
  199. package/lib/engine-components/timeline/PlayableDirector.d.ts +1 -0
  200. package/lib/engine-components/timeline/PlayableDirector.js +1 -0
  201. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  202. package/lib/engine-components/timeline/SignalAsset.d.ts +1 -0
  203. package/lib/engine-components/timeline/SignalAsset.js +1 -0
  204. package/lib/engine-components/timeline/SignalAsset.js.map +1 -1
  205. package/lib/engine-components/ui/Button.d.ts +4 -0
  206. package/lib/engine-components/ui/Button.js +4 -0
  207. package/lib/engine-components/ui/Button.js.map +1 -1
  208. package/lib/engine-components/ui/Canvas.d.ts +5 -0
  209. package/lib/engine-components/ui/Canvas.js +5 -0
  210. package/lib/engine-components/ui/Canvas.js.map +1 -1
  211. package/lib/engine-components/ui/CanvasGroup.d.ts +4 -0
  212. package/lib/engine-components/ui/CanvasGroup.js +4 -0
  213. package/lib/engine-components/ui/CanvasGroup.js.map +1 -1
  214. package/lib/engine-components/ui/EventSystem.d.ts +2 -0
  215. package/lib/engine-components/ui/EventSystem.js +2 -0
  216. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  217. package/lib/engine-components/ui/Image.d.ts +4 -0
  218. package/lib/engine-components/ui/Image.js +4 -0
  219. package/lib/engine-components/ui/Image.js.map +1 -1
  220. package/lib/engine-components/ui/InputField.d.ts +4 -0
  221. package/lib/engine-components/ui/InputField.js +4 -0
  222. package/lib/engine-components/ui/InputField.js.map +1 -1
  223. package/lib/engine-components/ui/Outline.d.ts +7 -0
  224. package/lib/engine-components/ui/Outline.js +7 -0
  225. package/lib/engine-components/ui/Outline.js.map +1 -1
  226. package/lib/engine-components/ui/Text.d.ts +1 -0
  227. package/lib/engine-components/ui/Text.js +1 -0
  228. package/lib/engine-components/ui/Text.js.map +1 -1
  229. package/lib/engine-components/utils/LookAt.d.ts +1 -0
  230. package/lib/engine-components/utils/LookAt.js +1 -0
  231. package/lib/engine-components/utils/LookAt.js.map +1 -1
  232. package/lib/engine-components/web/Clickthrough.d.ts +1 -1
  233. package/lib/engine-components/web/Clickthrough.js +1 -1
  234. package/lib/engine-components/web/CursorFollow.d.ts +1 -0
  235. package/lib/engine-components/web/CursorFollow.js +1 -0
  236. package/lib/engine-components/web/CursorFollow.js.map +1 -1
  237. package/lib/engine-components/web/HoverAnimation.d.ts +1 -0
  238. package/lib/engine-components/web/HoverAnimation.js +1 -0
  239. package/lib/engine-components/web/HoverAnimation.js.map +1 -1
  240. package/lib/engine-components/web/ScrollFollow.d.ts +2 -0
  241. package/lib/engine-components/web/ScrollFollow.js +2 -0
  242. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  243. package/lib/engine-components/web/ViewBox.d.ts +1 -0
  244. package/lib/engine-components/web/ViewBox.js +1 -0
  245. package/lib/engine-components/web/ViewBox.js.map +1 -1
  246. package/lib/engine-components/webxr/Avatar.d.ts +5 -0
  247. package/lib/engine-components/webxr/Avatar.js +5 -0
  248. package/lib/engine-components/webxr/Avatar.js.map +1 -1
  249. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +1 -0
  250. package/lib/engine-components/webxr/WebARCameraBackground.js +1 -0
  251. package/lib/engine-components/webxr/WebARCameraBackground.js.map +1 -1
  252. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +1 -0
  253. package/lib/engine-components/webxr/WebARSessionRoot.js +1 -0
  254. package/lib/engine-components/webxr/WebARSessionRoot.js.map +1 -1
  255. package/lib/engine-components/webxr/WebXR.d.ts +1 -1
  256. package/lib/engine-components/webxr/WebXR.js +1 -1
  257. package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +1 -0
  258. package/lib/engine-components/webxr/controllers/XRControllerFollow.js +1 -0
  259. package/lib/engine-components/webxr/controllers/XRControllerFollow.js.map +1 -1
  260. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +4 -0
  261. package/lib/engine-components/webxr/controllers/XRControllerModel.js +4 -0
  262. package/lib/engine-components/webxr/controllers/XRControllerModel.js.map +1 -1
  263. package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +1 -0
  264. package/lib/engine-components/webxr/controllers/XRControllerMovement.js +1 -0
  265. package/lib/engine-components/webxr/controllers/XRControllerMovement.js.map +1 -1
  266. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +2 -0
  267. package/lib/engine-components-experimental/networking/PlayerSync.js +2 -0
  268. package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
  269. package/package.json +19 -12
  270. package/plugins/types/needleConfig.d.ts +1 -1
  271. package/plugins/types/next.d.ts +1 -1
  272. package/plugins/types/userconfig.d.ts +4 -1
  273. package/plugins/vite/custom-element-data.js +80 -0
  274. package/plugins/vite/index.js +4 -0
  275. package/src/engine/api.ts +0 -1
  276. package/src/engine/engine_texture.ts +1 -1
  277. package/src/engine/engine_tonemapping.ts +1 -1
  278. package/src/engine/webcomponents/logo-element.ts +12 -0
  279. package/src/engine/webcomponents/needle menu/needle-menu.ts +24 -3
  280. package/src/engine/webcomponents/needle-button.ts +6 -0
  281. package/src/engine/webcomponents/needle-engine.ts +317 -22
  282. package/src/engine-components/AlignmentConstraint.ts +9 -0
  283. package/src/engine-components/Animator.ts +1 -0
  284. package/src/engine-components/AudioListener.ts +2 -0
  285. package/src/engine-components/AudioSource.ts +1 -0
  286. package/src/engine-components/AxesHelper.ts +2 -0
  287. package/src/engine-components/Camera.ts +1 -0
  288. package/src/engine-components/CharacterController.ts +4 -1
  289. package/src/engine-components/DeleteBox.ts +2 -0
  290. package/src/engine-components/DeviceFlag.ts +4 -0
  291. package/src/engine-components/DragControls.ts +1 -0
  292. package/src/engine-components/DropListener.ts +1 -0
  293. package/src/engine-components/Duplicatable.ts +1 -0
  294. package/src/engine-components/EventTrigger.ts +2 -0
  295. package/src/engine-components/GridHelper.ts +2 -0
  296. package/src/engine-components/GroundProjection.ts +1 -0
  297. package/src/engine-components/LODGroup.ts +2 -0
  298. package/src/engine-components/Light.ts +1 -0
  299. package/src/engine-components/LookAtConstraint.ts +1 -0
  300. package/src/engine-components/NeedleMenu.ts +1 -0
  301. package/src/engine-components/NestedGltf.ts +1 -0
  302. package/src/engine-components/Networking.ts +1 -0
  303. package/src/engine-components/OffsetConstraint.ts +7 -0
  304. package/src/engine-components/OrbitControls.ts +1 -0
  305. package/src/engine-components/PlayerColor.ts +2 -0
  306. package/src/engine-components/ReflectionProbe.ts +1 -0
  307. package/src/engine-components/RigidBody.ts +1 -0
  308. package/src/engine-components/SceneSwitcher.ts +1 -0
  309. package/src/engine-components/ScreenCapture.ts +1 -0
  310. package/src/engine-components/SeeThrough.ts +1 -0
  311. package/src/engine-components/ShadowCatcher.ts +2 -0
  312. package/src/engine-components/Skybox.ts +1 -0
  313. package/src/engine-components/SmoothFollow.ts +1 -0
  314. package/src/engine-components/SpatialTrigger.ts +1 -0
  315. package/src/engine-components/SpectatorCamera.ts +1 -0
  316. package/src/engine-components/SpriteRenderer.ts +1 -0
  317. package/src/engine-components/SyncedCamera.ts +2 -0
  318. package/src/engine-components/SyncedRoom.ts +1 -0
  319. package/src/engine-components/SyncedTransform.ts +2 -0
  320. package/src/engine-components/TransformGizmo.ts +2 -0
  321. package/src/engine-components/VideoPlayer.ts +1 -0
  322. package/src/engine-components/Voip.ts +1 -0
  323. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +18 -0
  324. package/src/engine-components/particlesystem/ParticleSystem.ts +1 -0
  325. package/src/engine-components/physics/Attractor.ts +3 -0
  326. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +1 -0
  327. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +4 -0
  328. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +3 -0
  329. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +4 -0
  330. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +1 -0
  331. package/src/engine-components/postprocessing/Effects/Pixelation.ts +3 -0
  332. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +4 -0
  333. package/src/engine-components/postprocessing/Effects/Sharpening.ts +4 -0
  334. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +4 -0
  335. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +4 -0
  336. package/src/engine-components/postprocessing/Effects/Vignette.ts +4 -0
  337. package/src/engine-components/postprocessing/Volume.ts +1 -0
  338. package/src/engine-components/splines/Spline.ts +1 -0
  339. package/src/engine-components/splines/SplineWalker.ts +1 -0
  340. package/src/engine-components/timeline/PlayableDirector.ts +1 -0
  341. package/src/engine-components/timeline/SignalAsset.ts +1 -0
  342. package/src/engine-components/ui/Button.ts +4 -0
  343. package/src/engine-components/ui/Canvas.ts +5 -0
  344. package/src/engine-components/ui/CanvasGroup.ts +4 -0
  345. package/src/engine-components/ui/EventSystem.ts +2 -0
  346. package/src/engine-components/ui/Image.ts +4 -0
  347. package/src/engine-components/ui/InputField.ts +4 -0
  348. package/src/engine-components/ui/Outline.ts +7 -0
  349. package/src/engine-components/ui/Text.ts +1 -0
  350. package/src/engine-components/utils/LookAt.ts +1 -0
  351. package/src/engine-components/web/Clickthrough.ts +1 -1
  352. package/src/engine-components/web/CursorFollow.ts +1 -0
  353. package/src/engine-components/web/HoverAnimation.ts +1 -0
  354. package/src/engine-components/web/ScrollFollow.ts +2 -0
  355. package/src/engine-components/web/ViewBox.ts +1 -0
  356. package/src/engine-components/webxr/Avatar.ts +5 -0
  357. package/src/engine-components/webxr/WebARCameraBackground.ts +1 -0
  358. package/src/engine-components/webxr/WebARSessionRoot.ts +1 -0
  359. package/src/engine-components/webxr/WebXR.ts +1 -1
  360. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +1 -0
  361. package/src/engine-components/webxr/controllers/XRControllerModel.ts +4 -0
  362. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +1 -0
  363. package/src/engine-components-experimental/networking/PlayerSync.ts +2 -0
  364. package/lib/engine/webcomponents/needle-engine.attributes.d.ts +0 -70
  365. package/lib/engine/webcomponents/needle-engine.attributes.js +0 -2
  366. package/lib/engine/webcomponents/needle-engine.attributes.js.map +0 -1
  367. package/src/engine/webcomponents/needle-engine.attributes.ts +0 -85
@@ -141,7 +141,7 @@ void main(){
141
141
  #__vconsole .vc-mask {
142
142
  overflow: hidden;
143
143
  }
144
- `,Co?.prepend(i),s===!0&&Lb()<=0&&Kb(),console.log("🌵 Debug console has loaded")}},e.onerror=()=>{console.warn("🌵 Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),rl=!1,Ri=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function OS(){if(!globalThis.VConsole)return;const s=new VConsole.VConsolePlugin("needle-console","🌵 Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+s._id+" iframe");return s.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const o=n.indexOf("?");o>-1&&(n=n.substring(0,o));const a=location.protocol+"//"+location.host+location.pathname+"/"+n,l=encodeURIComponent(a);s.fullUrl="https://viewer.needle.tools?inspect&file="+l;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),s.on("show",function(){const t=e();t&&t.src!==s.fullUrl&&(t.src=s.fullUrl)}),s.on("hide",function(){const t=e();t&&(t.src="")}),s.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window ↗",onClick:function(n){window.open(s.fullUrl,"_blank"),Ri?.hide()}}),i.push({name:"Reload",onClick:function(n){const o=e();o&&(o.src=s.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const o=e();o.requestFullscreen?o.requestFullscreen():o.webkitRequestFullscreen instanceof Function&&o.webkitRequestFullscreen()}}),t(i)}),s}function MS(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function kS(){const s=document.querySelector("#__vconsole");return s||null}const Zb=x("debugdefines");ro('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');ro('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');ro('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');ro('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');ro('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.11.5";');ro('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');ro('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Wed Dec 03 2025 10:35:46 GMT+0000 (Coordinated Universal Time)";');ro('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const tn="4.11.5",Zd="undefined",Sm="Wed Dec 03 2025 10:35:46 GMT+0000 (Coordinated Universal Time)";Zb&&console.log(`Engine version: ${tn} (generator: ${Zd})
144
+ `,Co?.prepend(i),s===!0&&Lb()<=0&&Kb(),console.log("🌵 Debug console has loaded")}},e.onerror=()=>{console.warn("🌵 Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),rl=!1,Ri=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function OS(){if(!globalThis.VConsole)return;const s=new VConsole.VConsolePlugin("needle-console","🌵 Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+s._id+" iframe");return s.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const o=n.indexOf("?");o>-1&&(n=n.substring(0,o));const a=location.protocol+"//"+location.host+location.pathname+"/"+n,l=encodeURIComponent(a);s.fullUrl="https://viewer.needle.tools?inspect&file="+l;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),s.on("show",function(){const t=e();t&&t.src!==s.fullUrl&&(t.src=s.fullUrl)}),s.on("hide",function(){const t=e();t&&(t.src="")}),s.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window ↗",onClick:function(n){window.open(s.fullUrl,"_blank"),Ri?.hide()}}),i.push({name:"Reload",onClick:function(n){const o=e();o&&(o.src=s.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const o=e();o.requestFullscreen?o.requestFullscreen():o.webkitRequestFullscreen instanceof Function&&o.webkitRequestFullscreen()}}),t(i)}),s}function MS(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function kS(){const s=document.querySelector("#__vconsole");return s||null}const Zb=x("debugdefines");ro('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');ro('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');ro('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');ro('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');ro('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.11.5";');ro('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');ro('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Dec 04 2025 13:06:37 GMT+0000 (Coordinated Universal Time)";');ro('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const tn="4.11.5",Zd="undefined",Sm="Thu Dec 04 2025 13:06:37 GMT+0000 (Coordinated Universal Time)";Zb&&console.log(`Engine version: ${tn} (generator: ${Zd})
145
145
  Project built at ${Sm}`);const ia=NEEDLE_PUBLIC_KEY,ls="needle_isActiveInHierarchy",Do="builtin_components",zl="needle_editor_guid";function ro(s){try{(0,eval)(s)}catch(e){Zb&&console.error(e)}}let Jb,Iy=null;function rn(){return Jb}function Cm(s){if(s==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}Iy!==s&&(Iy=s,Jb=new s)}function ES(s,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>s.time.frame)return window.requestAnimationFrame(()=>i());const r=o.captureCanvas(e);r&&r instanceof Promise?r.then(()=>o.displayUI()):o.displayUI()};const n=Number.parseInt(t.get("spector")||"0")||0;console.log("Scheduled Spector capture at frame #"+n);const o=new window.SPECTOR.Spector;o.spyCanvases=!0,i();return}else R()&&console.debug("Spector available: Add '?spector=<frame>' to the URL to enable it and capture a frame.")}}const ai=Symbol("shadowDomOwner"),RS=x("debugpatch");function Jd(s,e,t,i){const n=RS===e;if(!t&&!i)return;const o=e+"___needle";AS(s,e,t,i);const r=Object.getOwnPropertyDescriptor(s,e),a=s[e];n&&console.log("Patch",s.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",s.constructor.name,e,r),typeof r.value=="function"&&(s[e]=By(r.value,s,e))):(n&&console.log("Create patch with new property",s.constructor.name,e,r),Object.defineProperty(s,e,{set:function(l){if(typeof l=="function")this[o]=By(l,s,e);else{const h=this[o];e0(s,e,this,h,l),this[o]=l,t0(s,e,this,h,l)}},get:function(){const l=this[o];return typeof l=="function"&&l[o]?l[o]:l}}))}function TS(s,e,t){const i=Pm(s,e);if(i)for(let n=i.length-1;n>=0;n--){const o=i[n];o.prefix===t&&(o.prefix=null),o.postfix===t&&(o.postfix=null),!o.prefix&&!o.postfix&&i.splice(n,1)}}const jy=Symbol("Needle:Patches:WrappedFunction");function By(s,e,t){if(s[jy])return s;const i=function(...n){e0(e,t,this,...n);const o=s.apply(this,n);return t0(e,t,this,o,...n),o};return i[jy]=!0,i}const td="Needle:Patches";function wp(){return globalThis[td]||(globalThis[td]=new WeakMap),globalThis[td]}function Pm(s,e){const t=wp().get(s);return t?t.get(e):null}function AS(s,e,t,i){let n=wp().get(s);n||(n=new Map,wp().set(s,n));let o=n.get(e);o||(o=[],n.set(e,o)),o.push({prefix:t,postfix:i})}function e0(s,e,t,...i){if(!t)return;const n=Pm(s,e);if(n)for(const o of n)o.prefix?.call(t,...i)}function t0(s,e,t,i,...n){if(!t)return;const o=Pm(s,e);if(o)for(const r of o)r.postfix?.call(t,i,...n)}const ba=[];function eu(s){ba.indexOf(s)===-1&&ba.push(s)}function LS(s){const e=ba.indexOf(s);e!==-1&&ba.splice(e,1)}const va=[];function Om(s){va.indexOf(s)===-1&&va.push(s)}function DS(s){const e=va.indexOf(s);e!==-1&&va.splice(e,1)}function i0(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:s}));for(let e=0;e<ba.length;e++)ba[e](s)}function n0(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:s}));for(let e=0;e<va.length;e++)va[e](s)}const Xe=x("debuginput");var tu=(s=>(s.Mouse="mouse",s.Touch="touch",s.Controller="controller",s.Hand="hand",s))(tu||{}),xe=(s=>(s.PointerDown="pointerdown",s.PointerUp="pointerup",s.PointerMove="pointermove",s.KeyDown="keydown",s.KeyUp="keyup",s.KeyPressed="keypress",s))(xe||{});class Zn extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new c.Ray(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(),Xe&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class Sl extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class IS{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var Qt=(s=>(s[s.Early=-100]="Early",s[s.Default=0]="Default",s[s.Late=100]="Late",s))(Qt||{});class s0{_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 o=this._eventListeners[e],r=o.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(o.push({priority:n,listeners:[{callback:t,options:i}]}),o.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 o=n.find(a=>a.priority===i.queue);if(!o)return;const r=o.listeners.findIndex(a=>a.callback===t);r>=0&&o.listeners.splice(r,1)}else for(const o of n){const r=o.listeners.findIndex(a=>a.callback===t);r>=0&&o.listeners.splice(r,1)}}dispatchEvent(e){let t=!1;if(e instanceof Sl){const i=this._eventListeners[e.type];if(i)for(const n of i)for(let o=0;o<n.listeners.length;o++){const r=n.listeners[o];if(r.options?.signal?.aborted){n.listeners.splice(o,1),o--;continue}r.options.once&&(n.listeners.splice(o,1),o--),r.callback(e)}}if(e instanceof Zn){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let o=0;o<n.listeners.length;o++){const r=n.listeners[o];if(r.options?.signal?.aborted){n.listeners.splice(o,1),o--;continue}if(e.immediatePropagationStopped){t=!0,Xe&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,Xe&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(o,1),o--),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 o of e)if(i===o){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 c.Vector2];_pointerPositionsLastFrame=[new c.Vector2];_pointerPositionsDelta=[new c.Vector2];_pointerPositionsRC=[new c.Vector2];_pointerPositionDown=[new c.Vector3];_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":Xe&&Ce("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":Xe&&Ce("Create Pointer move"),this.onMove(e);break;case"pointerup":Xe&&Ce("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&&exports.DeviceUtilities.isMozillaXR()?!0:(Xe&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(Xe&&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 Sl("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 Sl("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 Sl("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);Xe&&Ce(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Zn("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),o=new Zn("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(o)};onPointerCancel=e=>{this.context.isInAR||(Xe&&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 Zn("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,Xe&&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),o=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Zn("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:o,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),o=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Zn("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:o,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),o=new Zn("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(o),this._pointerIds[n]=-1}};tempNearPlaneVector=new c.Vector3;tempFarPlaneVector=new c.Vector3;tempLookMatrix=new c.Matrix4;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new c.Object3D,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const o=this.context.mainCamera;if(o){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(o),a.unproject(o);const l=o.worldUp||j(0,1,0).applyQuaternion(ue(o));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,o=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return Xe&&!o&&console.log("Not in rect",t,i,n),o}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,Xe?e:""),Xe&&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 c.Vector3);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);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)){Xe&&console.log(e.pointerType,"UP",t,"was not down");return}Xe&&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 l=this._pointerEventsPressed.length-1;l>=0;l--)if(this._pointerEventsPressed[l].pointerId===t){this._pointerEventsPressed.splice(l,1);break}if(!this._pointerPositionDown[t]){Xe&&de("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 n=this._pointerUpTime[t],o=this._pointerDownTime[t],r=this.context.time.realtimeSinceStartup,a=r-o;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=r,a<1){let l=e.clientX-this._pointerPositionDown[t].x,h=e.clientY-this._pointerPositionDown[t].y,d=0;if(e.isSpatial&&e.clientZ!=null&&(d=e.clientZ-this._pointerPositionDown[t].z,l*=200,h*=200,d*=200),Math.abs(l)<5&&Math.abs(h)<5&&Math.abs(d)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const u=r-n;Xe&&console.log("CLICK",t,l,h,d,u),u<this._doubleClickTimeThreshold&&u>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new c.Vector2);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new c.Vector2);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let o=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const d=e.source;o===0&&d.movementX!==0&&(o=d.movementX||0),r===0&&d.movementY!==0&&(r=d.movementY||0)}n.x+=o,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 c.Vector2);const h=this._pointerPositionsRC[t];h.set(a,l),this.convertScreenspaceToRaycastSpace(h)}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):(Xe&&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=N.Current;try{N.Current=this.context,this.dispatchEvent(e)}finally{N.Current=t}}}const ca=new c.Matrix4().makeRotationY(Math.PI),ki=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI),jS=x("debugwebxr");class BS{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new c.Object3D,this.gameObject.name="Implicit XR Rig",jS){const e=Lm(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Hn=x("debugwebxr"),xh=x("debugcustomgesture"),FS="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",US="generic-trigger",zS=new c.Quaternion().setFromEuler(new c.Euler(c.MathUtils.degToRad(0),c.MathUtils.degToRad(-90),c.MathUtils.degToRad(-90))),NS=new c.Vector3(.04,-.04,0);class Mm{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 c.Matrix4;_gripPosition=new c.Vector3;_gripQuaternion=new c.Quaternion;_linearVelocity=new c.Vector3;_rayPositionRaw=new c.Vector3;_rayRotationRaw=new c.Quaternion;_rayMatrix=new c.Matrix4;_rayPosition=new c.Vector3;_rayQuaternion=new c.Quaternion;get gripPosition(){return j(this._gripPosition)}get gripQuaternion(){return Xt(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return j(this._linearVelocity).applyQuaternion(ki)}get rayPosition(){return j(this._rayPosition)}get rayQuaternion(){return Xt(this._rayQuaternion)}get gripWorldPosition(){return j(this._gripWorldPosition)}_gripWorldPosition=new c.Vector3;get gripWorldQuaternion(){return Xt(this._gripWorldQuaternion)}_gripWorldQuaternion=new c.Quaternion;get rayWorldPosition(){return j(this._rayWorldPosition)}_rayWorldPosition=new c.Vector3;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return Xt(this._rayWorldQuaternion)}_rayWorldQuaternion=new c.Quaternion;get pinchPosition(){return j(this._pinchPosition)}_pinchPosition=new c.Vector3;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?ue(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(ki),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(j(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=j(0,1,0).applyQuaternion(e.quaternion),i=j(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 c.AxesHelper(.15);_debugGripAxesHelper=new c.AxesHelper(.07);_debugRayAxesHelper=new c.AxesHelper(.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 c.Object3D,this._object.name=`NeedleXRController_${i}`,Hn&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new c.Object3D,this._raySpaceObject=new c.Object3D,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 c.Ray,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,j(0,0,10).applyQuaternion(this.rayWorldQuaternion));const t=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),i=this.inputSource.profiles.join(`
146
146
  `);let n=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
147
147
  C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(n+=`
@@ -164,7 +164,7 @@ See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for
164
164
  `+xi);const o=await Promise.resolve().then(()=>require("./vendor-UCpFAwt1.umd.cjs")).then(h=>h.index),r=o.default?.WebsocketBuilder??o.WebsocketBuilder,a=o.default?.ExponentialBackoff??o.ExponentialBackoff,l=new r(xi).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,R()||Wt?console.log(`⊞ Connected to networking backend
165
165
  `+xi):console.debug("⊞ Connected to networking backend",xi),n(!0),this.onSendQueued(Zi.OnConnection)}).onClose(h=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let d="Websocket connection closed...";xi?.includes("/socket")||(d+=' Do you perhaps mean to connect to "/socket"?'),console.error(d)}).onError(h=>{console.error("⊠ Websocket connection failed..."),n(!1)}).onRetry(()=>{console.log("→ Retry connecting to networking websocket")}).build();l.addEventListener(o.WebsocketEvent.message,(h,d)=>{this.onMessage(h,d)})})}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 o of n)this.handleIncomingStringMessage(o);else this.handleIncomingStringMessage(n);return}catch(n){Wt&&i==="pong"?console.log("<<",i):R()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){Ch&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new oe.ByteBuffer(i),o=n.getBufferIdentifier(),r=this._listenersBinary[o],a=r0(n),l=a0(a);if(l&&typeof l=="string"&&(this._state[l]=a),!r)return;const h=a??n;for(const d of r)d(h)}handleIncomingStringMessage(e){if(Wt&&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(Wt&&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),(Ch||R())&&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
166
  ${a.href}`)}this.onSendQueued(Zi.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,(Ch||R())&&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),Wt&&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&&(Wt&&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":Wt&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const o=e.data?.time;o&&(this._currentDelay=this.context.time.time-o),Wt&&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(o){console.error('Error invoking callback for "'+e.key+'"',o)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,i=Zi.OnRoomJoin){if(!this._ws){const o=this._waitingForSocket[i]||[];o.push(()=>this.sendWithWebsocket(e,t,i)),this._waitingForSocket[i]=o;return}const n=JSON.stringify(this.toMessage(e,t));Wt&&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 Nl=x("debugwebxr");class df{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=>{Nl&&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 o=0;o<e.controllers.length;o++)e.controllers[o].index===i.index&&(n=!0);n||(Nl&&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),Nl&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class f0{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(o=>o.handedness===t)?.isTracking||!1:void 0}getDeviceType(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(o=>o.handedness===t)?.type||"unknown":void 0}context;constructor(e){this.context=e,this.context.connection.beginListen(Q.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(Q.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(Q.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(Q.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(Q.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(Q.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(Q.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(Q.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(Nl&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new df(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new df(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)||(Nl&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new df(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 Hy{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new c.MeshBasicMaterial({color:0,transparent:!0,depthTest:!1,fog:!1,side:c.DoubleSide}),this._fadeToColorQuad=new c.Mesh(new c.PlaneGeometry(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 o=this._requestedFadeValue;n.opacity=D.lerp(n.opacity,o,t/.03),Math.abs(n.opacity-o)<=.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 tr=(s=>(s[s.Quad=0]="Quad",s[s.Cube=1]="Cube",s[s.Sphere=2]="Sphere",s[s.Cylinder=3]="Cylinder",s[s.RoundedCube=10]="RoundedCube",s))(tr||{});class ur{static createText(e,t){let i=null;const n=t?.font||YS(t?.familyFamily||null);n instanceof q.Font?i=this.#t(e,n,t):i==null&&(i=new c.BufferGeometry);const o=t?.color||16777215,r=new c.Mesh(i,t?.material??new c.MeshStandardMaterial({color:o}));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 q.TextGeometry(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 c.MeshBasicMaterial({colorWrite:!1,depthWrite:!0,side:c.DoubleSide});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let i;const n=t?.color||16777215;switch(e){case"Quad":case 0:{const o=new c.PlaneGeometry(1,1,1,1),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Quad"}break;case"Cube":case 1:{const o=new c.BoxGeometry(1,1,1),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Cube"}break;case 10:case"RoundedCube":{const o=QS(1,1,1,.1,2),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="RoundedCube"}break;case"Sphere":case 2:{const o=new c.SphereGeometry(.5,16,16),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Sphere"}break;case"Cylinder":case 3:{const o=new c.CylinderGeometry(.5,.5,1,32),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Cylinder"}break;case"ShaderBall":i=new c.Group,i.name="ShaderBall",KS(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const i=new c.SpriteMaterial({color:16777215});e?.texture&&"map"in i&&(i.map=e.texture);const n=new c.Sprite(i);return this.applyDefaultObjectOptions(n,e),n}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 QS(s,e,t,i,n){const o=new c.Shape,r=1e-5,a=i-r;o.absarc(r,r,r,-Math.PI/2,-Math.PI,!0),o.absarc(r,e-a*2,r,Math.PI,Math.PI/2,!0),o.absarc(s-a*2,e-a*2,r,Math.PI/2,0,!0),o.absarc(s-a*2,r,r,0,-Math.PI/2,!0);const l=new c.ExtrudeGeometry(o,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(h,d)=>{const u=[];for(let p=0;p<d.length;p+=3)u.push(new c.Vector2(d[p]/s,d[p+1]/e));return u},generateSideWallUV:(h,d,u,p,m,y)=>{const _=[];return _.push(new c.Vector2(d[u]/s,d[u+1]/e)),_.push(new c.Vector2(d[p]/s,d[p+1]/e)),_.push(new c.Vector2(d[m]/s,d[m+1]/e)),_.push(new c.Vector2(d[y]/s,d[y+1]/e)),_}}});return l.scale(1,1,1-i),l.center(),l.index||l.setIndex(Array.from({length:l.attributes.position.count},(h,d)=>d)),l.computeVertexNormals(),l}const Ph=new Map;function YS(s){let e="";switch(s){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(Ph.has(e)){const n=Ph.get(e);if(n)return n}const t=new q.FontLoader,i=new Promise((n,o)=>{t.load(e,r=>{Ph.set(e,r),n(r)},void 0,o)});return Ph.set(e,i),i}let uf=!1,ff=null;function KS(s,e){if(ff===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new q.GLTFLoader,n=ne.createLoaders(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),uf=!0,ff=i.loadAsync(t).then(o=>{const r=o.scene;return r.position.y-=.5,r}).catch(o=>(console.warn("Failed to load shaderball mesh: "+o.message),qy())).finally(()=>{uf=!1})}if(uf){const t=qy();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&Gy(i,e),s.add(t)}ff.then(t=>{s.children.forEach(o=>{o.name==="ShaderBall-Placeholder"&&s.remove(o)});const i=t.clone(),n=i.children[0];n?.type==="Mesh"&&(n.geometry.attributes.tangent||n.geometry.computeTangents(),Gy(n,e)),s.add(i)})}function Gy(s,e){if(e?.color||e?.material||e?.texture){const i=e?.material??s.material?.clone()??new c.MeshStandardMaterial;e.color&&"color"in i&&i.color instanceof c.Color&&i.color.set(e.color),e?.texture&&"map"in i&&(i.map=e.texture),s.material=i}}function qy(){return new c.Group().add(ur.createPrimitive("Sphere",{material:new c.MeshBasicMaterial({transparent:!0,opacity:.1})}))}class wa{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 wa(e,t,i),this._active):(i.end(),null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await Bn(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}_renderer;_camera;_scene;constructor(e,t,i){this._mode=e,this._init=t,this._session=i,this._session.addEventListener("end",this.onEnd),this._renderer=new c.WebGLRenderer({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new c.PerspectiveCamera,this._scene=new c.Scene,this._scene.fog=new c.Fog(4473924,10,250),this._scene.add(this._camera),this.setupScene()}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}onEnd=()=>{this._session?.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()};_lastTime=0;onFrame=(e,t)=>{const i=e-this._lastTime;this.update(e,i),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)};async onBeforeHandoff(){await Bn(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new c.Color(0),this._scene.add(new c.GridHelper(5,10,1118481,1118481));const e=new c.DirectionalLight(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new c.DirectionalLight(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new c.PointLight(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 o=0;o<100;o++){const r=new c.MeshStandardMaterial({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new c.Color(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=D.random(0,1)>.5?tr.Sphere:tr.Cube,l=ur.createPrimitive(a,{material:r});l.position.x=D.random(-n,n),l.position.y=D.random(-2,n),l.position.z=D.random(-n,n),l.rotation.x=D.random(0,Math.PI*2),l.rotation.y=D.random(0,Math.PI*2),l.rotation.z=D.random(0,Math.PI*2),l.scale.multiplyScalar(.5+Math.random()*10);const h=l.position.distanceTo(this._camera.position)-l.scale.x;h<1&&l.position.multiplyScalar(1+1/h),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 o=this._objects[n];o.position.y+=Math.sin(i+n*.5)*.005,o.rotateY(.002)}}}var sc;(s=>{const e=[];function t(){if(!e?.length)return!1;for(const o of e)o.exportAndOpen();return!0}s.exportAndOpen=t;function i(o){e.push(o)}s.registerExporter=i;function n(o){if(!e)return;const r=e.indexOf(o);r>=0&&e.splice(r,1)}s.unregisterExporter=n})(sc||(sc={}));const De=x("debugwebxr"),Xy=x("stats");let pf=0;function ZS(s){let e=null;const t=s;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=s,e}JS();async function JS(){if(x("debugasap")){let s=globalThis["needle:XRSession"];if(s instanceof Promise){delete globalThis["needle:XRSession"],ae.addContextCreatedCallback(async e=>{if(!s)return;$o(!0);const t=await s;if(t){const i=G.getDefaultSessionInit("immersive-vr");G.setSession("immersive-vr",t,i,e.context)}else console.error("NeedleXRSession: ASAP session was rejected");s=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()=>{$o(!0),console.log("Received Session Granted..."),await Bn(100);const s=sessionStorage.getItem("needle_xr_session_mode"),e=sessionStorage.getItem("needle_xr_session_init")??null,t=e?JSON.parse(e):null;let i=null;if(p0()&&(await wa.start(s||"immersive-vr",t||G.getDefaultSessionInit("immersive-vr")),await iC(),i=await wa.handoff()),i)G.setSession(i.mode,i.session,i.init,N.Current);else if(s&&e){console.log("Session Granted: Restore last session");const n=JSON.parse(e);G.start(s,n).catch(o=>console.warn(o))}else G.start("immersive-vr").catch(n=>console.warn("Session Granted failed:",n))},{once:!0})}}function eC(s,e){sessionStorage.setItem("needle_xr_session_mode",s),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function tC(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const Am=new Set;ae.registerCallback(re.ContextCreationStart,async s=>{Am.add(s.context)});ae.registerCallback(re.ContextCreated,async s=>{Am.delete(s.context);const e=s.context?.domElement.getAttribute("autostart")||null;nC(e)});function p0(){return Am.size>0}function iC(){return new Promise(s=>{const e=Date.now(),t=setInterval(()=>{(!p0()||Date.now()-e>6e4)&&(clearInterval(t),s())},100)})}exports.DeviceUtilities.isDesktop()&&R()&&window.addEventListener("keydown",s=>{(s.key==="x"||s.key==="Escape")&&G.active&&G.stop()});function nC(s){if(s)switch(s?.toLowerCase()){case"ar":an.registerWaitForInteraction(()=>{G.start("ar")});break}}const Oh=Symbol("initial-fov");class G{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new f0(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=>(De&&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=>G.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 exports.DeviceUtilities.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return exports.DeviceUtilities.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(exports.DeviceUtilities.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return sc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(R()&&x("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await wa.start(e,t||G.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(De||R())&&de("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=N.Current),i||(i=ae.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 l=this.getDefaultSessionInit(e),h=ZS(i.domElement);h&&!exports.DeviceUtilities.isQuest()&&(l.domOverlay={root:h},l.optionalFeatures.push("dom-overlay")),t={...l,...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 wa.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;De?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,n):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const a of n)a.onBeforeXR&&a.activeAndEnabled&&!a.destroyed&&a.onBeforeXR(e,t);for(const a of this._sessionRequestStartListeners)a({mode:e,init:t});De&&Ce("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=navigator?.xr?.requestSession(e,t),this._currentSessionRequestMode=e;const o=await this._currentSessionRequest?.catch(a=>{console.error(a,"Code: "+a.code),a.code===9&&de("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:"&&de("XR requires a secure connection (HTTPS)")});this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const a of this._sessionRequestEndListeners)a({mode:e,init:t,newSession:o||null});return o?this.setSession(e,o,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 o=e=="immersive-ar"?n.scripts_immersive_ar:n.scripts_immersive_vr;return this._activeSession=new G(e,t,n,{scripts:o,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),De?console.log(`%cStarted ${e} session`,"font-weight:bold;",o):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?(De&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):De&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{De&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return G._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")||R()&&exports.DeviceUtilities.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&&ir(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 j(0,0,0);const t=j(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(Xt(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(ir(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)}De&&(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 o of n.results)return this.convertHitTestResult(o);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),i=t&&e.getPose(t);if(i){const n=j(i.transform.position),o=Xt(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(ca),r?.parent){n.applyMatrix4(r.parent.matrixWorld),o.multiply(ki);const a=ue(r.parent);a.premultiply(ki),o.premultiply(a)}return{hit:e,position:n,quaternion:o}}return null}convertSpace(e){const t=j(e.position);t.applyMatrix4(ca);const i=Xt(e.orientation);return i.premultiply(ki),{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){eC(e,n.init),this.session=t,this.mode=e,this.context=i,(De||x("console"))&&$o(!0),this._xr_scripts=[...n.scripts],this._xr_update_scripts=this._xr_scripts.filter(o=>typeof o.onUpdateXR=="function"),this._controllerAdded=n.controller_added,this._controllerRemoved=n.controller_removed,us(this.onBefore,pe.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(o=>t.requestHitTestSource?.call(t,{space:o})?.then(r=>this._viewerHitTestSource=r).catch(r=>console.error(r))).catch(o=>console.error(o)),this.context.mainCamera&&(this._originalCameraWorldPosition=X(this.context.mainCamera,new c.Vector3),this._originalCameraWorldRotation=ue(this.context.mainCamera,new c.Quaternion),this._originalCameraWorldScale=je(this.context.mainCamera,new c.Vector3),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof c.PerspectiveCamera&&(this.context.mainCamera[Oh]=this.context.mainCamera.fov)),this._defaultRig=new BS,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let o=0;o<t.inputSources.length;o++){const r=t.inputSources[o];if(!r.handedness){console.warn("Input source in xr session has no handedness - ignoring",o);continue}this.onInputSourceAdded(r)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",o=>{for(const r of o.removed)this.disconnectInputSource(r);for(const r of o.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):De&&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 Mm(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(o,r)=>{if(o.inputSource===e){De&&console.log("Disconnecting controller",o.index);const a=r.indexOf(o);a>=0&&r.splice(a,1),this.invokeControllerEvent(o,this._controllerRemoved,"removed");const l={xr:this,controller:o,change:"removed"};for(const h of this._xr_scripts)h.onXRControllerRemoved&&h.onXRControllerRemoved(l);o.onDisconnected()}},i=[...this.controllers];for(let o=i.length-1;o>=0;o--){const r=i[o];t(r,this.controllers)}const n=[...this._newControllers];for(let o=n.length-1;o>=0;o--){const r=n[o];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"),tC(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,ao(this.onBefore,pe.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()}),n0({session:this});for(const o of G._xrEndListeners)o({xr:this});const n=[...this.controllers];for(let o=0;o<n.length;o++)this.disconnectInputSource(n[o].inputSource);this.controllers.length=0,this._newControllers.length=0;for(const o of this._xr_scripts)o?.onLeaveXR?.({xr:this});this.sync?.onExitXR(this),this.context.mainCamera&&(this._originalCameraParent?.add(this.context.mainCamera),this._originalCameraWorldPosition&&ot(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&on(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&_a(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof c.PerspectiveCamera&&this.context.mainCamera[Oh]&&(this.context.mainCamera.fov=this.context.mainCamera[Oh],this.context.mainCamera[Oh]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),$o(!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&&(De&&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 o=0;o<n.length;o++){const r=this.context.new_scripts_xr[o];if(!r||r.destroyed||r.supportsXR?.(this.mode)==!1){this.context.new_scripts_xr.splice(o,1);continue}if(!r.activeAndEnabled){this.context.new_scripts_xr.splice(o,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 o=Nt(this.context.scene.children);if(o){const r=o.getSize(j());if(r.length()>0){const a=this._defaultRig.gameObject;a.position.set(o.min.x+r.x*.5,o.min.y,o.max.z+r.z*.5+1.5);const l=o.getCenter(j());l.y=a.position.y,a.lookAt(l)}}}i0({session:this}),dr();for(const o of G._xrStartListeners)o(i);const n=[...this._xr_scripts];De&&console.log("NeedleXRSession start, handle scripts:",n);for(const o of n){if(o.destroyed){this._script_to_remove.push(o);continue}if(!o.activeAndEnabled){this.markInactive(o);continue}this.invokeCallback_EnterXR(o);for(const r of this.controllers)this.invokeCallback_ControllerAdded(o,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 o of n){if(!o.connected){console.warn("New controller is not connected",o);continue}this.controllers.push(o);for(const r of this._xr_scripts){if(r.destroyed){this._script_to_remove.push(r);continue}r.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(r,o)}}this.controllers.sort((o,r)=>o.index-r.index)}De&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&($o(!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 o of n)!o.destroyed&&this.running&&o.onLeaveXR?.(i),this.removeScript(o)}this.sync?.onUpdate(this),this.onRenderDebug()};onRenderDebug(){if(De)for(const e of this.controllers)e.onRenderDebug();if((De||Xy)&&this.rig&&(pf++,pf>=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()}`,De||Xy)for(const o of this.controllers)n+=`
167
- ${o.hand?"hand":"ctrl"} ${o.inputSource.handedness}[${o.index}] con:${o.connected} tr:${o.isTracking} hts:${o.hasHitTestSource?"yes":"no"}`;pf=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 c.PerspectiveCamera&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),exports.DeviceUtilities.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:(De&&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){De&&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 o=this._inactive_scripts.indexOf(e);o>=0&&this._inactive_scripts.splice(o,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 o=t[n];if(o)try{o({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new c.Object3D().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=je(this.rig.gameObject);e*=i.x}this._camera instanceof c.PerspectiveCamera&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,De&&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 c.PerspectiveCamera&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new c.Quaternion;_transformPosition=new c.Vector3;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 Hy),this._transition}fadeTransition(){return this._transition||(this._transition=new Hy),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof c.PerspectiveCamera&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const mf=x("debugwebxr");class m0{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(mf&&console.log("FOUND AVATAR HEAD",e.name),i.head=new Y("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(mf&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new Y("",t,e)),!i.rightHand&&n.includes("right")&&(mf&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new Y("",t,e)));for(let o=0;o<e.children.length;o++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[o];this.tryFindAvatarObjects(r,t,i)}}}class Z extends c.Color{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=D.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,o=t;return n.alpha!=null&&o.alpha!=null&&(this.alpha=D.lerp(n.alpha,o.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 Z(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,o=t>>8&255,r=t>>0&255;return new Z(i/255,n/255,o/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,o=t>>0&255;return new Z(i/255,n/255,o/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new Z(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 Z(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new Z(e[0],e[1],e[2],e[3]);if(e.length===3)return new Z(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new Z(e)}}const vt=new c.Vector3,Qy=new c.Vector3,Yy=new c.Quaternion,sC=x("debuggizmos"),qi=8947848,gf=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[Cp]!==void 0}static setVisible(e){for(const t of Si.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,o,r,a){if(!B.enabled)return null;o||(o=qi);const l=G.active?.rigScale??1,h=Si.getTextLabel(n,t,i*l,o,r);return a instanceof c.Object3D&&a.add(h),h.position.x=e.x,h.position.y=e.y,h.position.z=e.z,h}static DrawRay(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),vt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+vt.x,e.y+vt.y,e.z+vt.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawDirection(e,t,i=qi,n=0,o=!0,r=1){if(!B.enabled)return;const a=Si.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(vt.set(0,0,-r),Yy.set(t.x,t.y,t.z,t.w),vt.applyQuaternion(Yy)):(vt.set(t.x,t.y,t.z),vt.multiplyScalar(r)),l.setXYZ(1,e.x+vt.x,e.y+vt.y,e.z+vt.z),l.needsUpdate=!0,a.material.depthTest=o,a.material.depthWrite=!1,Ki(a.material,i)}static DrawLine(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.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=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawCircle(e,t,i,n=qi,o=0,r=!0){if(!B.enabled)return;const a=Si.getCircle(o);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,vt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,Ki(a.material,n)}static DrawWireSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!0);er(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!1);er(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,Ki(r.material,i)}static DrawWireBox(e,t,i=qi,n=0,o=!0,r=void 0){if(!B.enabled)return;const a=Si.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=o,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,Ki(a.material,i)}static DrawWireBox3(e,t=qi,i=0,n=!0){if(!B.enabled)return;const o=Si.getBox(i);o.position.copy(e.getCenter(vt)),o.scale.copy(e.getSize(vt)),o.material.depthTest=n,o.material.wireframe=!0,o.material.depthWrite=!1,o.material.fog=!1,Ki(o.material,t)}static _up=new c.Vector3(0,1,0);static DrawArrow(e,t,i=qi,n=0,o=!0,r=!1){if(!B.enabled)return;const a=Si.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),vt.set(t.x,t.y,t.z).sub(Qy.set(e.x,e.y,e.z)).normalize());const h=vt.set(t.x,t.y,t.z).sub(Qy.set(e.x,e.y,e.z)).length()*.1;a.scale.set(h,h,h),a.material.depthTest=o,a.material.wireframe=r,Ki(a.material,i),this.DrawLine(e,t,i,n,o)}static DrawWireMesh(e){const t=Si.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,Ki(t.material,e.color??qi)}}const oC=new c.BoxGeometry(1,1,1);function Lm(s=null){const e=new c.Color(s??14540253),t=new c.EdgesGeometry(oC);return new c.LineSegments(t,new c.LineBasicMaterial({color:e}))}function Ki(s,e){if(Array.isArray(s)){for(const i of s)Ki(i,e);return}const t=e instanceof Z?e.a:1;s.color.set(e),s.opacity=t,s.transparent=t<1}const Cp=Symbol("GizmoCache");class Si{static familyName="needle-gizmos";static ensureFont(){let e=ee.__webpack_exports__default.FontLibrary.getFontFamily(this.familyName);e||(e=ee.__webpack_exports__default.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",()=>{ee.__webpack_exports__default.update()}))}static getTextLabel(e,t,i,n,o){this.ensureFont();let r=this.textLabelCache.pop(),a=1;o&&typeof o=="string"&&o?.length>=8&&o.startsWith("#")?(a=parseInt(o.substring(7),16)/255,o=o.substring(0,7),sC&&console.log(o,a)):typeof o=="object"&&o.a!==void 0&&(a=o.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:o??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 ee.__webpack_exports__Text(l);const h=this,d=r;d.setText=function(u){this.set({textContent:u}),h.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(N.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new c.BoxGeometry(1,1,1);t=new c.Mesh(i)}return this.registerTimedObject(N.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");i||(i=new c.BufferAttribute(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");if(!i){i=new c.BufferAttribute(new Float32Array(gf*3),3),t.geometry.setAttribute("position",i);const n=j(0,1,0),o=j(0,0,1),r=j(o);r.cross(n).normalize();const a=j(r),l=Math.PI*2/(gf-1);for(let h=0;h<gf+1;h++){const d=l*h;n.copy(a).multiplyScalar(Math.cos(d)*1),r.copy(o).multiplyScalar(Math.sin(d)*1);const u=n.add(r);i.setXYZ(h,u.x,u.y,u.z)}}}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new c.Mesh(new c.SphereGeometry(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(N.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new c.Mesh(new c.CylinderGeometry(0,.5,1,8))),this.registerTimedObject(N.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new c.Mesh,t.material=new c.MeshBasicMaterial),this.registerTimedObject(N.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 o=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(o){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==o){const a=e.pre_render_callbacks.indexOf(o);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(o)}}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[Cp]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(N.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,ee.__webpack_exports__default.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof ee.__webpack_exports__default.MeshUIBaseElement){if(ir(n))continue;const o=e.isInVR,r=!1,a=!o;Cc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let o=t.length-1;o>=0;o--){const r=t[o];n>=i[o]-1e-6&&(t.splice(o,1),i.splice(o,1),r.removeFromParent(),ir(r)!=!0&&r[Cp].push(r))}}}const Bt=x("debugphysics"),rC=x("debugworker"),Ky=new c.Layers;class lo{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 c.Vector2),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Ky.set(e),this.layerMask=Ky}setMask(e){this.layerMask||(this.layerMask=new c.Layers);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Dm{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class xa{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 c.Raycaster;defaultRaycastOptions=new lo;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new c.Layers;sphere=new c.Sphere;sphereOverlap(e,t,i=!0,n=!1,o=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,o);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){Bt&&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 Bt&&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 c.ArrayCamera&&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 o=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),o||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),o=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof c.Layers?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Bt&&console.time("raycast"),o.length=0,xa._raycasting++,this.intersect(this.raycaster,n,o,e),o.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(o=o.filter(a=>!r.includes(a.object))),xa._raycasting--,Bt&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",o?.length?[...o]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),o}intersect(e,t,i,n){for(const o of t){if(!o||o.visible===!1||B.isGizmo(o)||n.lineThreshold!==void 0&&n.lineThreshold<0&&o instanceof c.Line)continue;let r=!0;const a=o,l=a.geometry;if(o.raycastAllowed===!1&&(r=!1),r&&n.testObject){const h=n.testObject?.(o);if(h===!1)continue;h==="continue in children"&&(r=!1)}else r&&(l&&Zy(l)||(r=!1));if(r){const h=i.length,d=o.raycastPreference||"lod";let u=d!=="bounds";if(n.precise===!1&&(u=!1),l&&(u||=l.getAttribute("position")?.array?.length<64),a instanceof q.GroundedSkybox&&(u=!1),d==="lod"){const p=ne.getRaycastMesh(o);p&&(a.geometry=p)}if(!u&&lC(a,e,i)||(n.useAcceleratedRaycast!==!1?Cd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,Bt&&i.length!=h){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:o,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,o.children,i,n)}return i}tempBoundingBox=new c.Box3;intersectSphere(e,t,i,n,o,r,a,l){let h=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);h&&=e.visible,h&&=!(e instanceof c.Line),h&&=!(e instanceof q.GroundedSkybox);const d=e,u=d.geometry;if(h&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(h=!1)}if(u&&Zy(u)||(h=!1),h){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=o.length;if(Cd.runMeshBVHRaycast(this.sphere,d,o,this.context,{}),m!=o.length&&!r)return}else if(u.boundingBox||u.computeBoundingBox(),u.boundingBox){d.matrixWorldNeedsUpdate&&d.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(u.boundingBox).applyMatrix4(d.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const y=X(e),_=y.distanceTo(m.center),g=new Dm(e,_,y);if(o.push(g),!r)return}}}if(e.children)for(const p of e.children){const m=o.length;if(this.intersectSphere(p,t,i,n,o,r,a,l),m!=o.length&&!r)return}}}function Zy(s){return!(s.index&&s.index.array.length<3)}const Po=new c.Sphere,Mh=new c.Plane,aC=new c.Matrix3;function lC(s,e,t){const i=s._computeIntersections;if(!i)return!1;let n=s["_computeIntersections:Needle"];return n||(n=s["_computeIntersections:Needle"]=function(o,r,a){const l=this,h=l.geometry.boundingSphere;if(h){if(l instanceof q.GroundedSkybox){Mh.setFromNormalAndCoplanarPoint(j(0,1,0),j(0,-l.position.y,0)),Mh.applyMatrix4(l.matrixWorld,aC);const u=o.ray.intersectPlane(Mh,j());if(u){Po.copy(h),Po.applyMatrix4(l.matrixWorld);const m=j(u).sub(o.ray.origin).length(),y=Po.radius*.5;m<y&&r.push({distance:m,point:u,object:l,normal:Mh.normal.clone()})}return}Po.copy(h),Po.applyMatrix4(l.matrixWorld);const d=o.ray.intersectSphere(Po,j());if(d){const u=j(d).sub(o.ray.origin),p=u.length();if(p>Po.radius){const m=u.clone().normalize();r.push({distance:p,point:d,object:l,normal:m})}}}}),s._computeIntersections=n,e.intersectObject(s,!1,t),s._computeIntersections=i,!0}var Cd;(s=>{let e=0;function t(b,v,A,O,M){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const T=v.geometry;if(v?.isSkinnedMesh){const L=v,I=L.bvhNeedsUpdate;if(!L.staticGenerator)l(),r&&(L.staticGenerator=new r(v),L.staticGenerator.applyWorldTransforms=!1,L.staticGeometry=L.staticGenerator.generate(),T.boundsTree=a?.call(L.staticGeometry),L.staticGeometryLastUpdate=performance.now()+Math.random()*200,L.bvhNeedsUpdate=!0);else if(T.boundsTree&&(L.autoUpdateMeshBvhInterval!==void 0&&L.autoUpdateMeshBvhInterval>=0||I===!0)){const V=performance.now(),$=V-L.staticGeometryLastUpdate,k=L.autoUpdateMeshBvhInterval??100;(I||$>k)&&(Bt&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${$.toFixed(2)}ms`),L.bvhNeedsUpdate=!1,L.staticGeometryLastUpdate=V,L.staticGenerator?.generate(L.staticGeometry),T.boundsTree.refit())}}else if(!T.boundsTree){d||w();let L=!0;if((O.xr||T[y]===!1||T.getAttribute("position")?.isInterleavedBufferAttribute||T.index&&T.index?.isInterleavedBufferAttribute||e>10)&&(L=!1),L&&p){if(T[m]===void 0){let I=null;if(g.length>0){const V=g.shift();V&&!V.running&&(I=V)}if(!I&&_.length<3)try{rC&&console.warn("[GenerateMeshBVHWorker] Creating worker with import.meta.url:",typeof document>"u"?require("url").pathToFileURL(__filename).href:la&&la.tagName.toUpperCase()==="SCRIPT"&&la.src||new URL("needle-engine.bundle-DbRanrPL.umd.cjs",document.baseURI).href),I=new p,_.push(I)}catch(V){V instanceof DOMException&&V.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(V),e+=10):(console.error("Failed to create MeshBVH worker. Please see below for more details:"),console.log(V)),e++}if(I!=null&&!I.running){const V=v.name;Bt&&console.log("<<<< worker start",V,I),T[m]="queued",performance.mark("bvh.create.start");const $=T.clone();try{I.generate($).then(k=>{T[m]="done",T.boundsTree=k}).catch(k=>{T[m]="failed - "+k?.message,T[y]=!1,Bt&&console.error("Failed to generate mesh bvh on worker",k)}).finally(()=>{Bt&&console.log(">>>>> worker done",V,{hasBoundsTre:T.boundsTree!=null}),g.push(I),$.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(k){console.error("Failed to generate mesh bvh on worker",k)}}else Bt&&console.warn("No worker available")}}else(!u||!L)&&(l(),o&&(performance.mark("bvh.create.start"),T.boundsTree=new o(T),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(b instanceof c.Raycaster){const L=b,I=v.raycast;if(T.boundsTree)l(),n&&(v.acceleratedRaycast||(v.acceleratedRaycast=n.bind(v),Bt&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(Bt&&console.warn("No bounds tree found for mesh",v.name,{workerTask:T[m],hasAcceleratedRaycast:n!=null}),M.allowSlowRaycastFallback===!1&&(T.getAttribute("position")?.array?.length??0)>2e3)return Bt&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const V=L.firstHitOnly;return L.firstHitOnly=!1,L.intersectObject(v,!1,A),L.firstHitOnly=V,v.raycast=I,!0}else if(b instanceof c.Sphere){const L=T.boundsTree;if(L){const I=b;if(h.copy(v.matrixWorld).invert(),I.applyMatrix4(h),L.intersectsSphere(I)){const $=X(v),k=$.distanceTo(I.center),U=new Dm(v,k,$);A.push(U)}}return!0}return!1}s.runMeshBVHRaycast=t;let i=!1,n=null,o=null,r=null,a=null;function l(){i||(i=!0,Promise.resolve().then(()=>require("./vendor-UCpFAwt1.umd.cjs")).then(b=>b.index$1).then(b=>{n=b.acceleratedRaycast,o=b.MeshBVH,r=b.StaticGeometryGenerator,a=b.computeBoundsTree}).catch(b=>{(Bt||R())&&console.error("Failed to load BVH library...",b.message)}))}const h=new c.Matrix4;let d=!1,u=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),y=Symbol("Needle:MeshBVH-CanUseWorker"),_=[],g=[];function w(){d=!0,u=!0,Promise.resolve().then(()=>uT).then(b=>{p=b.GenerateMeshBVHWorker}).catch(b=>{Bt||R()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",b)}).finally(()=>{u=!1})}})(Cd||(Cd={}));const Jy=Symbol("gltf-loader-internal-usage-tracker"),cC=x("debugusers");class da{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return da._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(){da._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const o=t.call(this,i,n);return o.then(r=>(r&&(e._loadedObjects.add(r),r[Jy]=e._loadingId),r)),o},null}afterRoot(e){da._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Jy],t instanceof c.Object3D&&(t.parent||t instanceof c.Mesh&&setTimeout(()=>{cC&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class g0{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:
167
+ ${o.hand?"hand":"ctrl"} ${o.inputSource.handedness}[${o.index}] con:${o.connected} tr:${o.isTracking} hts:${o.hasHitTestSource?"yes":"no"}`;pf=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 c.PerspectiveCamera&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),exports.DeviceUtilities.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:(De&&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){De&&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 o=this._inactive_scripts.indexOf(e);o>=0&&this._inactive_scripts.splice(o,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 o=t[n];if(o)try{o({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new c.Object3D().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=je(this.rig.gameObject);e*=i.x}this._camera instanceof c.PerspectiveCamera&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,De&&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 c.PerspectiveCamera&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new c.Quaternion;_transformPosition=new c.Vector3;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 Hy),this._transition}fadeTransition(){return this._transition||(this._transition=new Hy),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof c.PerspectiveCamera&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const mf=x("debugwebxr");class m0{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(mf&&console.log("FOUND AVATAR HEAD",e.name),i.head=new Y("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(mf&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new Y("",t,e)),!i.rightHand&&n.includes("right")&&(mf&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new Y("",t,e)));for(let o=0;o<e.children.length;o++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[o];this.tryFindAvatarObjects(r,t,i)}}}class Z extends c.Color{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=D.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,o=t;return n.alpha!=null&&o.alpha!=null&&(this.alpha=D.lerp(n.alpha,o.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 Z(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,o=t>>8&255,r=t>>0&255;return new Z(i/255,n/255,o/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,o=t>>0&255;return new Z(i/255,n/255,o/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new Z(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 Z(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new Z(e[0],e[1],e[2],e[3]);if(e.length===3)return new Z(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new Z(e)}}const vt=new c.Vector3,Qy=new c.Vector3,Yy=new c.Quaternion,sC=x("debuggizmos"),qi=8947848,gf=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[Cp]!==void 0}static setVisible(e){for(const t of Si.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,o,r,a){if(!B.enabled)return null;o||(o=qi);const l=G.active?.rigScale??1,h=Si.getTextLabel(n,t,i*l,o,r);return a instanceof c.Object3D&&a.add(h),h.position.x=e.x,h.position.y=e.y,h.position.z=e.z,h}static DrawRay(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),vt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+vt.x,e.y+vt.y,e.z+vt.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawDirection(e,t,i=qi,n=0,o=!0,r=1){if(!B.enabled)return;const a=Si.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(vt.set(0,0,-r),Yy.set(t.x,t.y,t.z,t.w),vt.applyQuaternion(Yy)):(vt.set(t.x,t.y,t.z),vt.multiplyScalar(r)),l.setXYZ(1,e.x+vt.x,e.y+vt.y,e.z+vt.z),l.needsUpdate=!0,a.material.depthTest=o,a.material.depthWrite=!1,Ki(a.material,i)}static DrawLine(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.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=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawCircle(e,t,i,n=qi,o=0,r=!0){if(!B.enabled)return;const a=Si.getCircle(o);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,vt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,Ki(a.material,n)}static DrawWireSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!0);er(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Ki(r.material,i)}static DrawSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!1);er(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,Ki(r.material,i)}static DrawWireBox(e,t,i=qi,n=0,o=!0,r=void 0){if(!B.enabled)return;const a=Si.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=o,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,Ki(a.material,i)}static DrawWireBox3(e,t=qi,i=0,n=!0){if(!B.enabled)return;const o=Si.getBox(i);o.position.copy(e.getCenter(vt)),o.scale.copy(e.getSize(vt)),o.material.depthTest=n,o.material.wireframe=!0,o.material.depthWrite=!1,o.material.fog=!1,Ki(o.material,t)}static _up=new c.Vector3(0,1,0);static DrawArrow(e,t,i=qi,n=0,o=!0,r=!1){if(!B.enabled)return;const a=Si.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),vt.set(t.x,t.y,t.z).sub(Qy.set(e.x,e.y,e.z)).normalize());const h=vt.set(t.x,t.y,t.z).sub(Qy.set(e.x,e.y,e.z)).length()*.1;a.scale.set(h,h,h),a.material.depthTest=o,a.material.wireframe=r,Ki(a.material,i),this.DrawLine(e,t,i,n,o)}static DrawWireMesh(e){const t=Si.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,Ki(t.material,e.color??qi)}}const oC=new c.BoxGeometry(1,1,1);function Lm(s=null){const e=new c.Color(s??14540253),t=new c.EdgesGeometry(oC);return new c.LineSegments(t,new c.LineBasicMaterial({color:e}))}function Ki(s,e){if(Array.isArray(s)){for(const i of s)Ki(i,e);return}const t=e instanceof Z?e.a:1;s.color.set(e),s.opacity=t,s.transparent=t<1}const Cp=Symbol("GizmoCache");class Si{static familyName="needle-gizmos";static ensureFont(){let e=ee.__webpack_exports__default.FontLibrary.getFontFamily(this.familyName);e||(e=ee.__webpack_exports__default.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",()=>{ee.__webpack_exports__default.update()}))}static getTextLabel(e,t,i,n,o){this.ensureFont();let r=this.textLabelCache.pop(),a=1;o&&typeof o=="string"&&o?.length>=8&&o.startsWith("#")?(a=parseInt(o.substring(7),16)/255,o=o.substring(0,7),sC&&console.log(o,a)):typeof o=="object"&&o.a!==void 0&&(a=o.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:o??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 ee.__webpack_exports__Text(l);const h=this,d=r;d.setText=function(u){this.set({textContent:u}),h.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(N.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new c.BoxGeometry(1,1,1);t=new c.Mesh(i)}return this.registerTimedObject(N.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");i||(i=new c.BufferAttribute(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");if(!i){i=new c.BufferAttribute(new Float32Array(gf*3),3),t.geometry.setAttribute("position",i);const n=j(0,1,0),o=j(0,0,1),r=j(o);r.cross(n).normalize();const a=j(r),l=Math.PI*2/(gf-1);for(let h=0;h<gf+1;h++){const d=l*h;n.copy(a).multiplyScalar(Math.cos(d)*1),r.copy(o).multiplyScalar(Math.sin(d)*1);const u=n.add(r);i.setXYZ(h,u.x,u.y,u.z)}}}return t.frustumCulled=!1,this.registerTimedObject(N.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new c.Mesh(new c.SphereGeometry(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(N.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new c.Mesh(new c.CylinderGeometry(0,.5,1,8))),this.registerTimedObject(N.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new c.Mesh,t.material=new c.MeshBasicMaterial),this.registerTimedObject(N.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 o=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(o){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==o){const a=e.pre_render_callbacks.indexOf(o);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(o)}}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[Cp]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(N.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,ee.__webpack_exports__default.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof ee.__webpack_exports__default.MeshUIBaseElement){if(ir(n))continue;const o=e.isInVR,r=!1,a=!o;Cc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let o=t.length-1;o>=0;o--){const r=t[o];n>=i[o]-1e-6&&(t.splice(o,1),i.splice(o,1),r.removeFromParent(),ir(r)!=!0&&r[Cp].push(r))}}}const Bt=x("debugphysics"),rC=x("debugworker"),Ky=new c.Layers;class lo{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 c.Vector2),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Ky.set(e),this.layerMask=Ky}setMask(e){this.layerMask||(this.layerMask=new c.Layers);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Dm{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class xa{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 c.Raycaster;defaultRaycastOptions=new lo;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new c.Layers;sphere=new c.Sphere;sphereOverlap(e,t,i=!0,n=!1,o=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,o);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){Bt&&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 Bt&&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 c.ArrayCamera&&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 o=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),o||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),o=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof c.Layers?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),Bt&&console.time("raycast"),o.length=0,xa._raycasting++,this.intersect(this.raycaster,n,o,e),o.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(o=o.filter(a=>!r.includes(a.object))),xa._raycasting--,Bt&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",o?.length?[...o]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),o}intersect(e,t,i,n){for(const o of t){if(!o||o.visible===!1||B.isGizmo(o)||n.lineThreshold!==void 0&&n.lineThreshold<0&&o instanceof c.Line)continue;let r=!0;const a=o,l=a.geometry;if(o.raycastAllowed===!1&&(r=!1),r&&n.testObject){const h=n.testObject?.(o);if(h===!1)continue;h==="continue in children"&&(r=!1)}else r&&(l&&Zy(l)||(r=!1));if(r){const h=i.length,d=o.raycastPreference||"lod";let u=d!=="bounds";if(n.precise===!1&&(u=!1),l&&(u||=l.getAttribute("position")?.array?.length<64),a instanceof q.GroundedSkybox&&(u=!1),d==="lod"){const p=ne.getRaycastMesh(o);p&&(a.geometry=p)}if(!u&&lC(a,e,i)||(n.useAcceleratedRaycast!==!1?Cd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,Bt&&i.length!=h){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:o,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,o.children,i,n)}return i}tempBoundingBox=new c.Box3;intersectSphere(e,t,i,n,o,r,a,l){let h=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);h&&=e.visible,h&&=!(e instanceof c.Line),h&&=!(e instanceof q.GroundedSkybox);const d=e,u=d.geometry;if(h&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(h=!1)}if(u&&Zy(u)||(h=!1),h){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=o.length;if(Cd.runMeshBVHRaycast(this.sphere,d,o,this.context,{}),m!=o.length&&!r)return}else if(u.boundingBox||u.computeBoundingBox(),u.boundingBox){d.matrixWorldNeedsUpdate&&d.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(u.boundingBox).applyMatrix4(d.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const y=X(e),_=y.distanceTo(m.center),g=new Dm(e,_,y);if(o.push(g),!r)return}}}if(e.children)for(const p of e.children){const m=o.length;if(this.intersectSphere(p,t,i,n,o,r,a,l),m!=o.length&&!r)return}}}function Zy(s){return!(s.index&&s.index.array.length<3)}const Po=new c.Sphere,Mh=new c.Plane,aC=new c.Matrix3;function lC(s,e,t){const i=s._computeIntersections;if(!i)return!1;let n=s["_computeIntersections:Needle"];return n||(n=s["_computeIntersections:Needle"]=function(o,r,a){const l=this,h=l.geometry.boundingSphere;if(h){if(l instanceof q.GroundedSkybox){Mh.setFromNormalAndCoplanarPoint(j(0,1,0),j(0,-l.position.y,0)),Mh.applyMatrix4(l.matrixWorld,aC);const u=o.ray.intersectPlane(Mh,j());if(u){Po.copy(h),Po.applyMatrix4(l.matrixWorld);const m=j(u).sub(o.ray.origin).length(),y=Po.radius*.5;m<y&&r.push({distance:m,point:u,object:l,normal:Mh.normal.clone()})}return}Po.copy(h),Po.applyMatrix4(l.matrixWorld);const d=o.ray.intersectSphere(Po,j());if(d){const u=j(d).sub(o.ray.origin),p=u.length();if(p>Po.radius){const m=u.clone().normalize();r.push({distance:p,point:d,object:l,normal:m})}}}}),s._computeIntersections=n,e.intersectObject(s,!1,t),s._computeIntersections=i,!0}var Cd;(s=>{let e=0;function t(b,v,A,O,M){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const T=v.geometry;if(v?.isSkinnedMesh){const L=v,I=L.bvhNeedsUpdate;if(!L.staticGenerator)l(),r&&(L.staticGenerator=new r(v),L.staticGenerator.applyWorldTransforms=!1,L.staticGeometry=L.staticGenerator.generate(),T.boundsTree=a?.call(L.staticGeometry),L.staticGeometryLastUpdate=performance.now()+Math.random()*200,L.bvhNeedsUpdate=!0);else if(T.boundsTree&&(L.autoUpdateMeshBvhInterval!==void 0&&L.autoUpdateMeshBvhInterval>=0||I===!0)){const V=performance.now(),$=V-L.staticGeometryLastUpdate,k=L.autoUpdateMeshBvhInterval??100;(I||$>k)&&(Bt&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${$.toFixed(2)}ms`),L.bvhNeedsUpdate=!1,L.staticGeometryLastUpdate=V,L.staticGenerator?.generate(L.staticGeometry),T.boundsTree.refit())}}else if(!T.boundsTree){d||w();let L=!0;if((O.xr||T[y]===!1||T.getAttribute("position")?.isInterleavedBufferAttribute||T.index&&T.index?.isInterleavedBufferAttribute||e>10)&&(L=!1),L&&p){if(T[m]===void 0){let I=null;if(g.length>0){const V=g.shift();V&&!V.running&&(I=V)}if(!I&&_.length<3)try{rC&&console.warn("[GenerateMeshBVHWorker] Creating worker with import.meta.url:",typeof document>"u"?require("url").pathToFileURL(__filename).href:la&&la.tagName.toUpperCase()==="SCRIPT"&&la.src||new URL("needle-engine.bundle-DgiVW9bH.umd.cjs",document.baseURI).href),I=new p,_.push(I)}catch(V){V instanceof DOMException&&V.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(V),e+=10):(console.error("Failed to create MeshBVH worker. Please see below for more details:"),console.log(V)),e++}if(I!=null&&!I.running){const V=v.name;Bt&&console.log("<<<< worker start",V,I),T[m]="queued",performance.mark("bvh.create.start");const $=T.clone();try{I.generate($).then(k=>{T[m]="done",T.boundsTree=k}).catch(k=>{T[m]="failed - "+k?.message,T[y]=!1,Bt&&console.error("Failed to generate mesh bvh on worker",k)}).finally(()=>{Bt&&console.log(">>>>> worker done",V,{hasBoundsTre:T.boundsTree!=null}),g.push(I),$.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(k){console.error("Failed to generate mesh bvh on worker",k)}}else Bt&&console.warn("No worker available")}}else(!u||!L)&&(l(),o&&(performance.mark("bvh.create.start"),T.boundsTree=new o(T),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(b instanceof c.Raycaster){const L=b,I=v.raycast;if(T.boundsTree)l(),n&&(v.acceleratedRaycast||(v.acceleratedRaycast=n.bind(v),Bt&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(Bt&&console.warn("No bounds tree found for mesh",v.name,{workerTask:T[m],hasAcceleratedRaycast:n!=null}),M.allowSlowRaycastFallback===!1&&(T.getAttribute("position")?.array?.length??0)>2e3)return Bt&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const V=L.firstHitOnly;return L.firstHitOnly=!1,L.intersectObject(v,!1,A),L.firstHitOnly=V,v.raycast=I,!0}else if(b instanceof c.Sphere){const L=T.boundsTree;if(L){const I=b;if(h.copy(v.matrixWorld).invert(),I.applyMatrix4(h),L.intersectsSphere(I)){const $=X(v),k=$.distanceTo(I.center),U=new Dm(v,k,$);A.push(U)}}return!0}return!1}s.runMeshBVHRaycast=t;let i=!1,n=null,o=null,r=null,a=null;function l(){i||(i=!0,Promise.resolve().then(()=>require("./vendor-UCpFAwt1.umd.cjs")).then(b=>b.index$1).then(b=>{n=b.acceleratedRaycast,o=b.MeshBVH,r=b.StaticGeometryGenerator,a=b.computeBoundsTree}).catch(b=>{(Bt||R())&&console.error("Failed to load BVH library...",b.message)}))}const h=new c.Matrix4;let d=!1,u=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),y=Symbol("Needle:MeshBVH-CanUseWorker"),_=[],g=[];function w(){d=!0,u=!0,Promise.resolve().then(()=>uT).then(b=>{p=b.GenerateMeshBVHWorker}).catch(b=>{Bt||R()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",b)}).finally(()=>{u=!1})}})(Cd||(Cd={}));const Jy=Symbol("gltf-loader-internal-usage-tracker"),cC=x("debugusers");class da{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return da._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(){da._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const o=t.call(this,i,n);return o.then(r=>(r&&(e._loadedObjects.add(r),r[Jy]=e._loadingId),r)),o},null}afterRoot(e){da._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Jy],t instanceof c.Object3D&&(t.parent||t instanceof c.Mesh&&setTimeout(()=>{cC&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class g0{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
168
  `+i.src),e.preventDefault())}})}}const iu=x("trackresources");function y0(){return iu==="dispose"}let fr=!0;iu===0&&(fr=!1);function hC(s){fr=s}function _0(){return fr}const b0=Symbol("disposable");function v0(s,e){s&&(s[b0]=e,Ho&&console.warn("Set disposable",e,s))}const w0=Symbol("disposed");function dC(s){return s[w0]===!0}function _e(s){if(s){if(s[b0]===!1){Ho&&console.warn("Object is marked as not disposable",s);return}if(typeof s=="object"&&(s[w0]=!0),s instanceof c.Scene)_e(s.environment),_e(s.background),_e(s.customDepthMaterial),_e(s.customDistanceMaterial);else if(s instanceof c.SkinnedMesh)_e(s.geometry),_e(s.material),_e(s.skeleton),_e(s.bindMatrix),_e(s.bindMatrixInverse),_e(s.customDepthMaterial),_e(s.customDistanceMaterial),s.visible=!1;else if(s instanceof c.Mesh)_e(s.geometry),_e(s.material),_e(s.customDepthMaterial),_e(s.customDistanceMaterial),s.visible=!1;else if(s instanceof c.Object3D)s.visible=!1;else if(s instanceof c.BufferGeometry){Br(s);for(const e of Object.keys(s.attributes)){const t=s.attributes[e];_e(t)}}else if(s instanceof c.BufferAttribute||s instanceof c.InterleavedBufferAttribute)Ho&&console.warn("BufferAttribute dispose not supported",s.count);else if(s instanceof Array)for(const e of s)e instanceof c.Material&&_e(e);else if(s instanceof c.Material){Br(s);for(const t of Object.keys(s)){const i=s[t];i instanceof c.Texture&&_e(i)}const e=s.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof c.Texture?_e(i):i instanceof c.Uniform$1&&_e(i.value)}}else s instanceof c.Texture?(Br(s),Br(s.source),s.source?.data instanceof ImageBitmap&&Br(s.source.data)):s instanceof c.Skeleton?(Br(s.boneTexture),s.boneTexture=null):s instanceof c.Bone||!(s instanceof c.Object3D)&&Ho&&console.warn("Unknown object type",s)}}function Br(s){s&&((Ho||y0()||iu)&&console.warn("🧨 FREE",s),s instanceof ImageBitmap||"dispose"in s&&typeof s.dispose=="function"&&s.dispose())}function uC(s){}const fC=new Set;function Im(s,e,t=null,i){if(i||(i=fC,i.clear()),!s)return i;const n=s[oc];if(n)for(const o of n)i.has(o)||t?.call(null,o)!==!1&&(i.add(o),e&&Im(o,!0,t,i));return i}function pC(s){return s[Pl]}const Ho=x("debugresourceusers")||x("debugmemory"),oc=Symbol("needle-resource-users"),Pl=Symbol("needle-resource-users-count");function At(s,e){Jd(s,e,function(t,i){fr&&!xa.raycasting&&(Pd(oc,this,t,!1),Pd(oc,this,i,!0))})}fr&&(At(c.Mesh.prototype,"material"),At(c.Mesh.prototype,"geometry"),At(c.Material.prototype,"map"),At(c.Material.prototype,"bumpMap"),At(c.Material.prototype,"alphaMap"),At(c.Material.prototype,"normalMap"),At(c.Material.prototype,"displacementMap"),At(c.Material.prototype,"roughnessMap"),At(c.Material.prototype,"metalnessMap"),At(c.Material.prototype,"emissiveMap"),At(c.Material.prototype,"specularMap"),At(c.Material.prototype,"envMap"),At(c.Material.prototype,"lightMap"),At(c.Material.prototype,"aoMap"),At(c.Material.prototype,"gradientMap"));function mC(s){if(fr===!1)return;const e=s[oc];if(e)for(const t of e)Pd(oc,t,s,!1)}fr&&Jd(c.Material.prototype,"dispose",function(){mC(this)});let Pp=0;function Pd(s,e,t,i){if(Pp>0)return;if(Array.isArray(t)){for(const o of t)Pd(s,e,o,i);return}if(!t)return;let n=t[s];if(n||(n=new Set),i){if(e&&!n.has(e)){n.add(e);let o=t[Pl]||0;o+=1,t[Pl]=o,Ho&&console.warn(`🟢 Added user of "${t.type}"`,e,t,o,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let o=t[Pl]||0;o>0&&(o-=1,t[Pl]=o),Ho&&console.warn(`🔴 Removed user of "${t.type}"`,e,t,o,"users:",n),o<=0&&(da.isLoading(t)||(iu&&console.warn(`🔴 Removed all user of "${t.type}"`,t),y0()&&_e(t)))}t[s]=n}try{Jd(c.WebGLRenderer.prototype,"render",function(){Pp++},function(){Pp--})}catch(s){console.warn("Could not wrap WebGLRenderer.render",s)}const e_=x("debugcomponentevents");class nu{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),e_&&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(e_&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const rc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),x0=Symbol("isUsingInstancing"),S0=Symbol("instancingRenderer"),Ol=Symbol("instancingAutoUpdateBounds");class Li{static isUsingInstancing(e){return e[x0]===!0}static getRenderer(e){return e[S0]||null}setAutoUpdateBounds(e,t){const i=Li.getRenderer(e);i&&(i[Ol]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[rc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)Li.markDirty(i,!0)}}exports.NEEDLE_ENGINE_FEATURE_FLAGS=void 0;(s=>{s.experimentalSmartHierarchyUpdate=!1})(exports.NEEDLE_ENGINE_FEATURE_FLAGS||(exports.NEEDLE_ENGINE_FEATURE_FLAGS={}));function ua(s,e){try{e||s()}catch(t){return console.error(t),!1}return!0}const Op=x("debugnewscripts"),gC=x("debughierarchy"),we=[];function yC(){return we.length>0}function Od(s){if(Op&&console.log("Register new components",s.new_scripts.length,[...s.new_scripts],s.alias?"element: "+s.alias:s.hash,s),s.new_scripts_pre_setup_callbacks.length>0){for(const e of s.new_scripts_pre_setup_callbacks)e&&e();s.new_scripts_pre_setup_callbacks.length=0}if(!(s.new_scripts.length<=0)){we.length=0,s.new_scripts.length>0&&we.push(...s.new_scripts),s.new_scripts.length=0;for(let e=0;e<we.length;e++)try{const t=we[e];if(t.isComponent!==!0){(R()||Op)&&console.error(`Registered script is not a Needle Engine component.
169
169
  The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
170
170
  `,t),we.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
@@ -1526,7 +1526,7 @@ Please refer to the documentation on <a href="https://fwd.needle.tools/needle-en
1526
1526
  width: 100%;
1527
1527
  opacity: 0;
1528
1528
  transition: opacity 1s ease-in-out 4s;
1529
- `,setTimeout(()=>{u.style.opacity="1"},1),this._loadingElement.appendChild(u);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}}Cm(ix);const ge=x("debugwebcomponent"),wb="needle-engine",lx="vr",cx="desktop",YR=[ax,lx,cx],vl="ar-session-active",wl="desktop-session-active",KR=["public-key","version","hash","src","camera-controls","loadstart","progress","loadfinished","dracoDecoderPath","dracoDecoderType","ktx2DecoderPath","tone-mapping","tone-mapping-exposure","background-blurriness","background-color","environment-intensity","focus-rect"];class vy extends HTMLElement{static get observedAttributes(){return KR}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 XR,this.addEventListener("ready",this.onReady),uv(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
1529
+ `,setTimeout(()=>{u.style.opacity="1"},1),this._loadingElement.appendChild(u);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}}Cm(ix);const ge=x("debugwebcomponent"),wb="needle-engine",lx="vr",cx="desktop",YR=[ax,lx,cx],vl="ar-session-active",wl="desktop-session-active",KR=["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 vy extends HTMLElement{static get observedAttributes(){return KR}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 XR,this.addEventListener("ready",this.onReady),uv(),this.attachShadow({mode:"open"});const e=document.createElement("template");e.innerHTML=`<style>
1530
1530
  @import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap');
1531
1531
 
1532
1532
  :host {
@@ -1604,12 +1604,12 @@ Please refer to the documentation on <a href="https://fwd.needle.tools/needle-en
1604
1604
  <slot class="overlay-content"></slot>
1605
1605
  </div>
1606
1606
  `,this.shadowRoot&&this.shadowRoot.appendChild(e.content.cloneNode(!0)),this._context=new N({domElement:this}),this.addEventListener("error",this.onError)}async connectedCallback(){if(ge&&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"];ge&&console.log('src is null, trying to load from globalThis["needle:codegen_files"]',t),t&&(ge&&console.log('globalThis["needle:codegen_files"]',t),this.setAttribute("src",t))}ge&&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";ge&&console.warn('<needle-engine> disconnected, keep-alive: "'+e+'"',typeof e,"Dispose=",t),t?(ge&&console.warn("<needle-engine> dispose"),this._context?.dispose(),this._context=null,this._lastSourceFiles=null,this._loadId+=1):ge&&console.warn("<needle-engine> is not disposed because keep-alive is set")}connectedMoveCallback(){}attributeChangedCallback(e,t,i){switch(ge&&console.log("attributeChangedCallback",e,t,i),e){case"src":ge&&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&&(ge&&console.log(e+" attribute changed",i),this.registerEventFromAttribute(e,i));break;case"dracoDecoderPath":ge&&console.log("dracoDecoderPath",i),v_(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(ge&&console.log("dracoDecoderType",i),w_(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":ge&&console.log("ktx2DecoderPath",i),x_(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!=tn&&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 o=document.querySelector(n);this._context.setCameraFocusRect(o instanceof HTMLElement?o: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||(ge&&console.warn("Create new context"),this._context=new N({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&&(ge&&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)&&(ge&&console.warn("Clear scene",e),this._context.clear(),t!==this._loadId))return;const i=this.getAttribute("alias");this.classList.add("loading");const n=cs();this.ensureLoadStartIsRegistered();let o=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:i},cancelable:!0}));if(n){const y=this.getAttribute("hide-loading-overlay");y!=null&&y!=="0"&&(o=!1)}o===!1&&!n&&(R()||(o=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),R()&&de('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&&o&&(this._loadingView=new bc(this)),o&&(this._didFullyLoad!==!0?this._loadingView?.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===t&&this._loadingView.onLoadingBegin("begin load")},300)),ge&&console.warn(`--------------
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&&(ge&&console.log(e+" attribute changed",i),this.registerEventFromAttribute("loadfinished",i));break;case"dracoDecoderPath":ge&&console.log("dracoDecoderPath",i),v_(i);break;case"dracoDecoderType":i==="wasm"||i==="js"?(ge&&console.log("dracoDecoderType",i),w_(i)):console.error("Invalid dracoDecoderType",i,"expected js or wasm");break;case"ktx2DecoderPath":ge&&console.log("ktx2DecoderPath",i),x_(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!=tn&&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 o=document.querySelector(n);this._context.setCameraFocusRect(o instanceof HTMLElement?o: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||(ge&&console.warn("Create new context"),this._context=new N({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&&(ge&&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)&&(ge&&console.warn("Clear scene",e),this._context.clear(),t!==this._loadId))return;const i=this.getAttribute("alias");this.classList.add("loading");const n=cs();this.ensureLoadStartIsRegistered();let o=this.dispatchEvent(new CustomEvent("loadstart",{detail:{context:this._context,alias:i},cancelable:!0}));if(n){const y=this.getAttribute("hide-loading-overlay");y!=null&&y!=="0"&&(o=!1)}o===!1&&!n&&(R()||(o=!0),console.warn("Needle Engine: You need a commercial license to override the default loading view. Visit https://needle.tools/pricing"),R()&&de('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&&o&&(this._loadingView=new bc(this)),o&&(this._didFullyLoad!==!0?this._loadingView?.onLoadingBegin("begin load"):setTimeout(()=>{this._loadingView&&this._loadingProgress01<.3&&this._loadId===t&&this._loadingView.onLoadingBegin("begin load")},300)),ge&&console.warn(`--------------
1608
1608
  Needle Engine: Begin loading `+t+`
1609
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}),h=new Array,d=new AbortController;this._abortController=d;const u={files:e,abortSignal:d.signal,onLoadingProgress:y=>{if(ge&&console.debug("Loading progress: ",y),d.signal.aborted)return;const _=y.index;!h[_]&&y.name&&(h[_]=ZR(y.name)),y.name=h[_],o&&this._loadingView?.onLoadingUpdate(y),a.name=y.name,a.progress=y.progress,this._loadingProgress01=by(y),a.totalProgress01=this._loadingProgress01,this.dispatchEvent(l)},onLoadingFinished:(y,_,g)=>{ge&&console.debug(`Finished loading "${_}" (aborted? ${d.signal.aborted})`),!d.signal.aborted&&g&&r.push({src:_,file:g})}};JR(this);const p=this.getAttribute("hash");p!=null&&(this._context.hash=p),this._context.alias=i,this._createContextPromise=this._context.create(u);const m=await this._createContextPromise;if(this.applyAttributes(),ge&&console.warn(`--------------
1610
1610
  Needle Engine: finished loading `+t+`
1611
1611
  `,e,`Aborted? ${d.signal.aborted}`),d.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,o&&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=cv(this.toneMapping);n!==void 0&&(this._context.renderer.toneMapping=n);const o=this.getAttribute("tone-mapping-exposure");if(o!=null){const r=parseFloat(o);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=Z.fromColorRepresentation(i);ge&&console.debug("<needle-engine> background-color changed, str:",i,"→",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,o=>n?.call(globalThis,this._context,o)))}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(){tn.length>0&&this.setAttribute("version",tn)}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(vl),this.classList.remove(wl);const e=this.getAROverlayContainer();ge&&console.warn("onSetupAR:",e),e&&(e.classList.add(vl),e.classList.remove(wl)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,ax))}onSetupVR(){this.classList.remove(vl),this.classList.remove(wl),this.foreachHtmlElement(e=>this.setupElementsForMode(e,lx))}onSetupDesktop(){this.classList.remove(vl),this.classList.add(wl);const e=this.getAROverlayContainer();e&&(e.classList.remove(vl),e.classList.add(wl)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,cx))}setupElementsForMode(e,t,i=null){if(e===this._context?.renderer?.domElement||e.id==="VRButton"||e.id==="ARButton")return;if(e.classList.contains(t))e.style.visibility="visible",e.style.display==="none"&&(e.style.display="block");else for(const o of YR)e.classList.contains(o)&&(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&&(ge&&console.log("using custom draco decoder path",e),v_(e));const t=this.getAttribute("dracoDecoderType");t&&(ge&&console.log("using custom draco decoder type",t),w_(t));const i=this.getAttribute("ktx2DecoderPath");i&&(ge&&console.log("using custom ktx2 decoder path",i),x_(i))}}typeof window<"u"&&!window.customElements.get(wb)&&window.customElements.define(wb,vy);function ZR(s){if(s.startsWith("blob:"))return"blob";const e=s.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 o=t.split(".").pop(),a=o?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(o.toLowerCase()):-1;if(o&&a>=0&&(t=t.substring(0,t.length-o.length-1)),t=decodeURIComponent(t),t.length>3){let l="",h=!1;const d=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let u=0;u<t.length;u++){let p=t[u];(p==="_"||p==="-")&&(p=" "),!(p===" "&&l.length<=0||d.includes(p)||(l.length===0&&(p=p.toUpperCase()),h&&p===" "))&&(h&&(p=p.toUpperCase()),h=!1,l+=p,p===" "&&(h=!0))}return R()&&t!==l&&console.debug('Generated display name: "'+t+'" → "'+l+'"'),l.trim()}return R()&&console.debug("Loading: use default name",t),t}function JR(s){hu(e=>{const t=s.getAttribute("loading-blur");if(t!==null&&t!=="0"&&e.domElement===s){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 o=170;if(e.scene.background===null){const r=s,a=e.renderer.domElement,l=a.style.filter,h=a.style.overflow;a.style.filter+=`blur(${n})`,r.style.overflow="hidden",i?.then(()=>{const d=a.animate([{filter:"blur(0px)"}],{duration:o,easing:"ease-in"});d.onfinish=()=>{a.style.filter=l,r.style.overflow=h}})}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:o,easing:"ease-in"});a.onfinish=()=>{r.remove()}})}}},{once:!0})}const eT=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:vy},Symbol.toStringTag,{value:"Module"}));function tT(){an.registerWaitForInteraction(()=>{const s=c.AudioContext.getContext();s.addEventListener("statechange",()=>{setTimeout(()=>{const e=s.state;(e==="suspended"||e==="interrupted")&&s.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}setTimeout(tT,1e3);const Ae=x("debugphysics"),dp=x("debugcolliderplacement"),up=x("debugcollisions"),iT=x("showcolliders"),Zh=x("debugraycasts"),Ht=Symbol("needle component"),xt=Symbol("physics body"),xb=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0;Ae&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER);ae.registerCallback(re.ContextCreationStart,s=>{Ae&&console.log("Register rapier physics backend"),s.context.physics.engine=new ga(s.context)});class ga{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if(Ae&&console.log("REMOVE BODY",e?.name,e[xt]),!e)return;this.validate();const t=e[xt];if(e[xt]=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 exports.MODULES.RAPIER_PHYSICS.MODULE.Collider){const o=n;this.world?.removeCollider(o,!0);const r=o.parent();r&&r.numColliders()<=0&&(r[Ht]||this.world?.removeRigidBody(r))}else n instanceof exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBody&&(n.numColliders()<=0?this.world?.removeRigidBody(n):R()&&(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,o=n[xt];o&&this.syncPhysicsBody(n.gameObject,o,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[xt];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 x("__nophysics")?(console.warn("Physics are disabled"),!1):(Ae&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,exports.MODULES.RAPIER_PHYSICS.MAYBEMODULE==null&&(Ae&&console.trace("Loading rapier physics engine"),await(await exports.MODULES.RAPIER_PHYSICS.load()).init()),Ae&&console.log("Physics engine initialized, creating world..."),this._world=new exports.MODULES.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new exports.MODULES.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,Ae&&console.log("Physics world created"),!0))}validate(){this._isInitialized||Ae&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new ui(()=>new c.Vector3,10);raycast(e,t,i){if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let n=i?.maxDistance,o=i?.solid;n===void 0&&(n=1/0),o===void 0&&(o=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||Zh)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRay(r,n,o,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const h=l[Ht];return i?.filterPredicate?i.filterPredicate(h):i?.useIgnoreRaycastLayer!==!1?!h?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),h=this.raycastVectorsBuffer.get();return h.set(l.x,l.y,l.z),{point:h,collider:a.collider[Ht]}}return null}raycastAndGetNormal(e,t,i){if(!this._isInitialized)return null;let n=i?.maxDistance,o=i?.solid;n===void 0&&(n=1/0),o===void 0&&(o=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||Zh)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRayAndGetNormal(r,n,o,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const h=l[Ht];return i?.filterPredicate?i.filterPredicate(h):i?.useIgnoreRaycastLayer!==!1?!h?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),h=a.normal,d=this.raycastVectorsBuffer.get(),u=this.raycastVectorsBuffer.get();return d.set(l.x,l.y,l.z),u.set(h.x,h.y,h.z),{point:d,normal:u,collider:a.collider[Ht]}}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)&&(Ae&&console.warn("Converting screenspace to raycast space",a),this.context?.input.convertScreenspaceToRaycastSpace(a)),a.unproject(n),t=a}const o=t;e.origin.x=o.x,e.origin.y=o.y,e.origin.z=o.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=X(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 exports.MODULES.RAPIER_PHYSICS.MODULE.Ball(t),this.rapierSphere.radius=t,(this.debugRenderRaycasts||Zh)&&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 exports.MODULES.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||Zh)&&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 o=n[Ht],r=new Dv(o.gameObject,o);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[Ht].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}enabled=!1;get world(){return this._world}_tempPosition=new c.Vector3;_tempQuaternion=new c.Quaternion;_tempScale=new c.Vector3;_tempMatrix=new c.Matrix4;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){Ae&&console.warn("Physics are disabled");return}const i=e.gameObject,n=je(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 o=1e-7;n.x<o&&(n.x=o),n.y<o&&(n.y=o),n.z<o&&(n.z=o);const r=exports.MODULES.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){Ae&&console.warn("Physics are disabled");return}const t=exports.MODULES.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){Ae&&console.warn("Physics are disabled");return}const o=e.gameObject.worldScale;o.x=Math.abs(o.x),o.y=Math.abs(o.y);const r=i*o.x;t=Math.max(t,r);const a=D.clamp(t*.5*o.y-i*o.x,0,Number.MAX_SAFE_INTEGER),l=exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(a,r);this.createCollider(e,l)}async addMeshCollider(e,t,i,n){let o=t.geometry;if(!o){Ae&&console.warn("Missing mesh geometry",t.name);return}o.index?.array?.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),o=q.mergeVertices(o));let r=null;const a=o.getAttribute("position");if(a instanceof c.InterleavedBufferAttribute){const u=a.count;r=new Float32Array(u*3);for(let p=0;p<u;p++){const m=a.getX(p),y=a.getY(p),_=a.getZ(p);r[p*3]=m,r[p*3+1]=y,r[p*3+2]=_}}else r=a.array;if(await this.initialize(),!this.enabled){Ae&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const l=o.index?.array,h=e.gameObject.worldScale.clone();if(n&&h.multiply(n),Math.abs(h.x-1)>1e-4||Math.abs(h.y-1)>1e-4||Math.abs(h.z-1)>1e-4){const u=`${o.uuid}_${h.x}_${h.y}_${h.z}_${i}`;if(this._meshCache.has(u))Ae&&console.warn("Use cached mesh collider"),r=this._meshCache.get(u);else{(Ae||R())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${h.x}, ${h.y}, ${h.z})`);const p=new Float32Array(r.length);for(let m=0;m<r.length;m+=3)p[m]=r[m]*h.x,p[m+1]=r[m+1]*h.y,p[m+2]=r[m+2]*h.z;r=p,this._meshCache.set(u,p)}}const d=i?exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(r):exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(r,l);d&&this.createCollider(e,d)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,i=e[xt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case it.Average:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&i.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case it.Average:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[xt]:null}getComponent(e){return e?e[Ht]: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):(Ae&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(ue(e.gameObject)),i.setPosition(X(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 o=e.sharedMaterial;if(o){if(o.bounciness!==void 0&&t.setRestitution(o.bounciness),o.bounceCombine!==void 0)switch(o.bounceCombine){case it.Average:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(o.dynamicFriction!==void 0&&t.setFriction(o.dynamicFriction),o.frictionCombine!==void 0)switch(o.frictionCombine){case it.Average:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:t.setFrictionCombineRule(exports.MODULES.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[Ht]=e,e[xt]=r,r.setActiveEvents(exports.MODULES.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),r.setActiveCollisionTypes(exports.MODULES.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(r),this.updateColliderCollisionGroups(e),Ae&&console.log("Created collider",e.name,r),r}catch(r){return console.error('Error creating collider "'+e.name+`"
1612
+ `,n)}}setPublicKey(){ia&&ia.length>0&&this.setAttribute("public-key",ia)}setVersion(){tn.length>0&&this.setAttribute("version",tn)}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(vl),this.classList.remove(wl);const e=this.getAROverlayContainer();ge&&console.warn("onSetupAR:",e),e&&(e.classList.add(vl),e.classList.remove(wl)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,ax))}onSetupVR(){this.classList.remove(vl),this.classList.remove(wl),this.foreachHtmlElement(e=>this.setupElementsForMode(e,lx))}onSetupDesktop(){this.classList.remove(vl),this.classList.add(wl);const e=this.getAROverlayContainer();e&&(e.classList.remove(vl),e.classList.add(wl)),this.foreachHtmlElement(t=>this.setupElementsForMode(t,cx))}setupElementsForMode(e,t,i=null){if(e===this._context?.renderer?.domElement||e.id==="VRButton"||e.id==="ARButton")return;if(e.classList.contains(t))e.style.visibility="visible",e.style.display==="none"&&(e.style.display="block");else for(const o of YR)e.classList.contains(o)&&(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&&(ge&&console.log("using custom draco decoder path",e),v_(e));const t=this.getAttribute("dracoDecoderType");t&&(ge&&console.log("using custom draco decoder type",t),w_(t));const i=this.getAttribute("ktx2DecoderPath");i&&(ge&&console.log("using custom ktx2 decoder path",i),x_(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(wb)&&window.customElements.define(wb,vy);function ZR(s){if(s.startsWith("blob:"))return"blob";const e=s.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 o=t.split(".").pop(),a=o?["glb","gltf","usdz","usd","fbx","obj","mtl"].indexOf(o.toLowerCase()):-1;if(o&&a>=0&&(t=t.substring(0,t.length-o.length-1)),t=decodeURIComponent(t),t.length>3){let l="",h=!1;const d=["(",")","[","]","{","}",":",";",",",".","!","?"];for(let u=0;u<t.length;u++){let p=t[u];(p==="_"||p==="-")&&(p=" "),!(p===" "&&l.length<=0||d.includes(p)||(l.length===0&&(p=p.toUpperCase()),h&&p===" "))&&(h&&(p=p.toUpperCase()),h=!1,l+=p,p===" "&&(h=!0))}return R()&&t!==l&&console.debug('Generated display name: "'+t+'" → "'+l+'"'),l.trim()}return R()&&console.debug("Loading: use default name",t),t}function JR(s){hu(e=>{const t=s.getAttribute("loading-blur");if(t!==null&&t!=="0"&&e.domElement===s){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 o=170;if(e.scene.background===null){const r=s,a=e.renderer.domElement,l=a.style.filter,h=a.style.overflow;a.style.filter+=`blur(${n})`,r.style.overflow="hidden",i?.then(()=>{const d=a.animate([{filter:"blur(0px)"}],{duration:o,easing:"ease-in"});d.onfinish=()=>{a.style.filter=l,r.style.overflow=h}})}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:o,easing:"ease-in"});a.onfinish=()=>{r.remove()}})}}},{once:!0})}const eT=Object.freeze(Object.defineProperty({__proto__:null,NeedleEngineWebComponent:vy},Symbol.toStringTag,{value:"Module"}));function tT(){an.registerWaitForInteraction(()=>{const s=c.AudioContext.getContext();s.addEventListener("statechange",()=>{setTimeout(()=>{const e=s.state;(e==="suspended"||e==="interrupted")&&s.resume().then(()=>{console.log("AudioContext resumed successfully")}).catch(t=>{console.log("Failed to resume AudioContext: "+t)})},500)})})}setTimeout(tT,1e3);const Ae=x("debugphysics"),dp=x("debugcolliderplacement"),up=x("debugcollisions"),iT=x("showcolliders"),Zh=x("debugraycasts"),Ht=Symbol("needle component"),xt=Symbol("physics body"),xb=Symbol("rigidbody");globalThis.NEEDLE_USE_RAPIER=globalThis.NEEDLE_USE_RAPIER!==void 0?globalThis.NEEDLE_USE_RAPIER:!0;Ae&&console.log("Use Rapier",!0,globalThis.NEEDLE_USE_RAPIER);ae.registerCallback(re.ContextCreationStart,s=>{Ae&&console.log("Register rapier physics backend"),s.context.physics.engine=new ga(s.context)});class ga{debugRenderColliders=!1;debugRenderRaycasts=!1;removeBody(e){if(Ae&&console.log("REMOVE BODY",e?.name,e[xt]),!e)return;this.validate();const t=e[xt];if(e[xt]=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 exports.MODULES.RAPIER_PHYSICS.MODULE.Collider){const o=n;this.world?.removeCollider(o,!0);const r=o.parent();r&&r.numColliders()<=0&&(r[Ht]||this.world?.removeRigidBody(r))}else n instanceof exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBody&&(n.numColliders()<=0?this.world?.removeRigidBody(n):R()&&(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,o=n[xt];o&&this.syncPhysicsBody(n.gameObject,o,t,i)}}updateProperties(e){if(this.validate(),e.isCollider){const t=e,i=t[xt];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 x("__nophysics")?(console.warn("Physics are disabled"),!1):(Ae&&console.log("Initialize rapier physics engine"),this._hasCreatedWorld?(console.error("Invalid call to create physics world: world is already created"),!0):(this._hasCreatedWorld=!0,exports.MODULES.RAPIER_PHYSICS.MAYBEMODULE==null&&(Ae&&console.trace("Loading rapier physics engine"),await(await exports.MODULES.RAPIER_PHYSICS.load()).init()),Ae&&console.log("Physics engine initialized, creating world..."),this._world=new exports.MODULES.RAPIER_PHYSICS.MODULE.World(this._gravity),this.rapierRay=new exports.MODULES.RAPIER_PHYSICS.MODULE.Ray({x:0,y:0,z:0},{x:0,y:0,z:1}),this.enabled=!0,this._isInitialized=!0,Ae&&console.log("Physics world created"),!0))}validate(){this._isInitialized||Ae&&(this._lastWarnTime=this._lastWarnTime??0,Date.now()-this._lastWarnTime>1e3&&(this._lastWarnTime=Date.now(),console.warn("Physics engine is not initialized")))}rapierRay;raycastVectorsBuffer=new ui(()=>new c.Vector3,10);raycast(e,t,i){if(!this._isInitialized)return console.log("Physics engine is not initialized"),null;let n=i?.maxDistance,o=i?.solid;n===void 0&&(n=1/0),o===void 0&&(o=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||Zh)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRay(r,n,o,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const h=l[Ht];return i?.filterPredicate?i.filterPredicate(h):i?.useIgnoreRaycastLayer!==!1?!h?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),h=this.raycastVectorsBuffer.get();return h.set(l.x,l.y,l.z),{point:h,collider:a.collider[Ht]}}return null}raycastAndGetNormal(e,t,i){if(!this._isInitialized)return null;let n=i?.maxDistance,o=i?.solid;n===void 0&&(n=1/0),o===void 0&&(o=!0);const r=this.getPhysicsRay(this.rapierRay,e,t);if(!r)return null;(this.debugRenderRaycasts||Zh)&&B.DrawRay(r.origin,r.dir,255,1);const a=this.world?.castRayAndGetNormal(r,n,o,i?.queryFilterFlags,i?.filterGroups,void 0,void 0,l=>{const h=l[Ht];return i?.filterPredicate?i.filterPredicate(h):i?.useIgnoreRaycastLayer!==!1?!h?.gameObject.layers.isEnabled(2):!0});if(a){const l=r.pointAt(a.timeOfImpact),h=a.normal,d=this.raycastVectorsBuffer.get(),u=this.raycastVectorsBuffer.get();return d.set(l.x,l.y,l.z),u.set(h.x,h.y,h.z),{point:d,normal:u,collider:a.collider[Ht]}}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)&&(Ae&&console.warn("Converting screenspace to raycast space",a),this.context?.input.convertScreenspaceToRaycastSpace(a)),a.unproject(n),t=a}const o=t;e.origin.x=o.x,e.origin.y=o.y,e.origin.z=o.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=X(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 exports.MODULES.RAPIER_PHYSICS.MODULE.Ball(t),this.rapierSphere.radius=t,(this.debugRenderRaycasts||Zh)&&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 exports.MODULES.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||Zh)&&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 o=n[Ht],r=new Dv(o.gameObject,o);return this.rapierColliderArray.push(r),!0},void 0,void 0,void 0,void 0,n=>n.isSensor()?!1:n[Ht].gameObject.layers.isEnabled(2)==!1),this.rapierColliderArray):this.rapierColliderArray:this.rapierColliderArray}enabled=!1;get world(){return this._world}_tempPosition=new c.Vector3;_tempQuaternion=new c.Quaternion;_tempScale=new c.Vector3;_tempMatrix=new c.Matrix4;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){Ae&&console.warn("Physics are disabled");return}const i=e.gameObject,n=je(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 o=1e-7;n.x<o&&(n.x=o),n.y<o&&(n.y=o),n.z<o&&(n.z=o);const r=exports.MODULES.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){Ae&&console.warn("Physics are disabled");return}const t=exports.MODULES.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){Ae&&console.warn("Physics are disabled");return}const o=e.gameObject.worldScale;o.x=Math.abs(o.x),o.y=Math.abs(o.y);const r=i*o.x;t=Math.max(t,r);const a=D.clamp(t*.5*o.y-i*o.x,0,Number.MAX_SAFE_INTEGER),l=exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.capsule(a,r);this.createCollider(e,l)}async addMeshCollider(e,t,i,n){let o=t.geometry;if(!o){Ae&&console.warn("Missing mesh geometry",t.name);return}o.index?.array?.length||(console.warn(`Your MeshCollider is missing vertices or indices in the assined mesh "${t.name}". Consider providing an indexed geometry.`),o=q.mergeVertices(o));let r=null;const a=o.getAttribute("position");if(a instanceof c.InterleavedBufferAttribute){const u=a.count;r=new Float32Array(u*3);for(let p=0;p<u;p++){const m=a.getX(p),y=a.getY(p),_=a.getZ(p);r[p*3]=m,r[p*3+1]=y,r[p*3+2]=_}}else r=a.array;if(await this.initialize(),!this.enabled){Ae&&console.warn("Physics are disabled");return}if(!e.activeAndEnabled)return;const l=o.index?.array,h=e.gameObject.worldScale.clone();if(n&&h.multiply(n),Math.abs(h.x-1)>1e-4||Math.abs(h.y-1)>1e-4||Math.abs(h.z-1)>1e-4){const u=`${o.uuid}_${h.x}_${h.y}_${h.z}_${i}`;if(this._meshCache.has(u))Ae&&console.warn("Use cached mesh collider"),r=this._meshCache.get(u);else{(Ae||R())&&console.debug(`[Performance] Your MeshCollider "${e.name}" is scaled: consider applying the scale to the collider mesh instead (${h.x}, ${h.y}, ${h.z})`);const p=new Float32Array(r.length);for(let m=0;m<r.length;m+=3)p[m]=r[m]*h.x,p[m+1]=r[m+1]*h.y,p[m+2]=r[m+2]*h.z;r=p,this._meshCache.set(u,p)}}const d=i?exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.convexHull(r):exports.MODULES.RAPIER_PHYSICS.MODULE.ColliderDesc.trimesh(r,l);d&&this.createCollider(e,d)}updatePhysicsMaterial(e){if(!e)return;const t=e.sharedMaterial,i=e[xt];if(i&&t){if(t.bounciness!==void 0&&i.setRestitution(t.bounciness),t.bounceCombine!==void 0)switch(t.bounceCombine){case it.Average:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:i.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(t.dynamicFriction!==void 0&&i.setFriction(t.dynamicFriction),t.frictionCombine!==void 0)switch(t.frictionCombine){case it.Average:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:i.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}}}getBody(e){return e?e[xt]:null}getComponent(e){return e?e[Ht]: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):(Ae&&console.log("Create collider without rigidbody",e.name),i.makeRotationFromQuaternion(ue(e.gameObject)),i.setPosition(X(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 o=e.sharedMaterial;if(o){if(o.bounciness!==void 0&&t.setRestitution(o.bounciness),o.bounceCombine!==void 0)switch(o.bounceCombine){case it.Average:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:t.setRestitutionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Multiply);break}if(o.dynamicFriction!==void 0&&t.setFriction(o.dynamicFriction),o.frictionCombine!==void 0)switch(o.frictionCombine){case it.Average:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Average);break;case it.Maximum:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Max);break;case it.Minimum:t.setFrictionCombineRule(exports.MODULES.RAPIER_PHYSICS.MODULE.CoefficientCombineRule.Min);break;case it.Multiply:t.setFrictionCombineRule(exports.MODULES.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[Ht]=e,e[xt]=r,r.setActiveEvents(exports.MODULES.RAPIER_PHYSICS.MODULE.ActiveEvents.COLLISION_EVENTS),r.setActiveCollisionTypes(exports.MODULES.RAPIER_PHYSICS.MODULE.ActiveCollisionTypes.ALL),this.objects.push(e),this.bodies.push(r),this.updateColliderCollisionGroups(e),Ae&&console.log("Created collider",e.name,r),r}catch(r){return console.error('Error creating collider "'+e.name+`"
1613
1613
  Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[xt],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 o=e.filter;let r=0;if(o==null)r=65535;else for(let a=0;a<o.length;a++){const l=o[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[xt],!i){const o=n.isKinematic&&!dp;Ae&&console.log("Create rigidbody",o);const r=o?exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased():exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyDesc.dynamic(),a=X(e.attachedRigidbody.gameObject);r.setTranslation(a.x,a.y,a.z),r.setRotation(ue(e.attachedRigidbody.gameObject)),r.centerOfMass=new exports.MODULES.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[Ht]=n,n[xt]=i,this.internalUpdateRigidbodyProperties(n,i),this.getRigidbodyRelativeMatrix(e.gameObject,n.gameObject,t),e[xb]=i}else{const n=exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyDesc.kinematicPositionBased(),o=X(e.gameObject);n.setTranslation(o.x,o.y,o.z),n.setRotation(ue(e.gameObject)),i=this.world.createRigidBody(n),t.identity(),i[Ht]=null}return i}internal_getRigidbody(e){return e.isCollider===!0?e[xb]:e[xt]}internalUpdateColliderProperties(e,t){const i=t.shape;let n=!1;switch(i.type){case exports.MODULES.RAPIER_PHYSICS.MODULE.ShapeType.Ball:{const p=i,m=e,y=e.gameObject,_=je(y,this._tempPosition),g=Math.abs(m.radius*_.x);n=p.radius!==g,p.radius=g,n&&t.setShape(p);break}case exports.MODULES.RAPIER_PHYSICS.MODULE.ShapeType.Cuboid:const o=i,r=e,a=e.gameObject,l=je(a,this._tempPosition),h=Math.abs(r.size.x*.5*l.x),d=Math.abs(r.size.y*.5*l.y),u=Math.abs(r.size.z*.5*l.z);n=o.halfExtents.x!==h||o.halfExtents.y!==d||o.halfExtents.z!==u,o.halfExtents.x=h,o.halfExtents.y=d,o.halfExtents.z=u,n&&t.setShape(o);break}if(n){const o=e.attachedRigidbody;o?.autoMass&&this.getBody(o)?.recomputeMassPropertiesFromColliders()}this.updateColliderCollisionGroups(e),e.isTrigger!==t.isSensor()&&t.setSensor(e.isTrigger)}internalUpdateRigidbodyProperties(e,t){if(t.enableCcd(e.collisionDetectionMode!==uu.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(exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased,!1):t.setBodyType(exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyType.Dynamic,!1)}lines;step(e){if(this.world&&this.enabled){if(this._isUpdatingPhysicsWorld=!0,this.eventQueue||(this.eventQueue=new exports.MODULES.RAPIER_PHYSICS.MODULE.EventQueue(!1)),e===void 0||e<=0){this._isUpdatingPhysicsWorld=!1;return}else if(e!==void 0){const t=D.lerp(this.world.timestep,e,.8);this.world.timestep=t}try{this.world.step(this.eventQueue)}catch(t){console.warn("Error running physics step",{timestep:this.world.timestep},t)}this._isUpdatingPhysicsWorld=!1}}postStep(){this.world&&this.enabled&&(this._isUpdatingPhysicsWorld=!0,this.syncObjects(),this._isUpdatingPhysicsWorld=!1,this.eventQueue&&!this.collisionHandler&&(this.collisionHandler=new nT(this.world,this.eventQueue)),this.collisionHandler&&(this.collisionHandler.handleCollisionEvents(),this.collisionHandler.update()),this.updateDebugRendering(this.world))}updateDebugRendering(e){if(Ae||dp||iT||this.debugRenderColliders===!0){if(!this.lines){const i=new c.LineBasicMaterial({color:7855479,fog:!1}),n=new c.BufferGeometry;this.lines=new c.LineSegments(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 c.BufferAttribute(t.vertices,3)),this.lines.geometry.setAttribute("color",new c.BufferAttribute(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(!dp)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 o=i.translation(),r=i.rotation();if(Number.isNaN(o.x)||Number.isNaN(r.x)){!n.__COLLIDER_NAN&&R()&&(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),h=je(t.gameObject);l.multiply(h),o.x-=l.x,o.y-=l.y,o.z-=l.z}er(t.gameObject,o.x,o.y,o.z),ym(t.gameObject,r.x,r.y,r.z,r.w)}}syncPhysicsBody(e,t,i,n){if(t instanceof exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBody){const o=X(e,this._tempPosition),r=ue(e,this._tempQuaternion);switch(t.bodyType()){case exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyType.Fixed:case exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicPositionBased:case exports.MODULES.RAPIER_PHYSICS.MODULE.RigidBodyType.KinematicVelocityBased:i&&t.setNextKinematicTranslation(o),n&&t.setNextKinematicRotation(r);break;default:i&&t.setTranslation(o,!1),n&&t.setRotation(r,!1);break}}else if(t instanceof exports.MODULES.RAPIER_PHYSICS.MODULE.Collider){e.matrixWorldNeedsUpdate&&e.updateWorldMatrix(!0,!1),e.matrixWorld.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const o=this._tempPosition,r=this._tempQuaternion,a=t[Ht];if(this.tryApplyCenter(a,o),i){const l=t.translation();(l.x!==o.x||l.y!==o.y||l.z!==o.z)&&t.setTranslation(o)}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 c.Vector3;_tempCenterVec=new c.Vector3;_tempCenterQuaternion=new c.Quaternion;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,je(e.gameObject,this._tempCenterVec),this._tempCenterPos.multiply(this._tempCenterVec),e.attachedRigidbody?this._tempCenterPos.applyQuaternion(e.gameObject.quaternion):(ue(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=ga._matricesBuffer,n.length=0),e===t){const o=je(e,this._tempPosition);i.makeScale(o.x,o.y,o.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[xt],n=t[xt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const o=exports.MODULES.RAPIER_PHYSICS.MODULE.JointData.fixed(ga.centerConnectionPos,ga.centerConnectionRot,this._tempPosition,this._tempQuaternion),r=this.world.createImpulseJoint(o,i,n,!0);Ae&&console.log("ADD FIXED JOINT",r)}addHingeJoint(e,t,i,n){if(!this.world){console.error("Physics world not initialized");return}const o=e[xt],r=t[xt];this.calculateJointRelativeMatrices(e.gameObject,t.gameObject,this._tempMatrix),this._tempMatrix.decompose(this._tempPosition,this._tempQuaternion,this._tempScale);const a=exports.MODULES.RAPIER_PHYSICS.MODULE.JointData.revolute(i,this._tempPosition,n),l=this.world.createImpulseJoint(a,o,r,!0);Ae&&console.log("ADD HINGE JOINT",l)}calculateJointRelativeMatrices(e,t,i){e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);const n=e.matrixWorld,o=t.matrixWorld;n.elements[0]=1,n.elements[5]=1,n.elements[10]=1,o.elements[0]=1,o.elements[5]=1,o.elements[10]=1,i.copy(o).premultiply(n.invert()).invert()}}class nT{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),o=this.world.getCollider(t);if(!n||!o)return;const r=n[Ht],a=o[Ht];up&&console.log("EVT",r.name,a.name,i,n,o),r&&a&&(i?(this.onCollisionStarted(r,n,a,o),this.onCollisionStarted(a,o,r,n)):(this.onCollisionEnded(r,a),this.onCollisionEnded(a,r)))})}update(){this.onHandleCollisionStay()}onCollisionStarted(e,t,i,n){let o=null;if(e.isTrigger||i.isTrigger)nr(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)=>{nr(r,h=>{if(h.destroyed)return;const d=h.onCollisionEnter||h.onCollisionStay||h.onCollisionExit;if(d||up){if(!o){const u=[],p=a.normal();i instanceof ho&&i.convex&&(p.x=-p.x,p.y=-p.y,p.z=-p.z);for(let m=0;m<a.numSolverContacts();m++){const y=a.solverContactPoint(m),_=a.contactImpulse(m);if(y){const g=a.contactDist(m),w=a.solverContactFriction(m),b=a.solverContactTangentVelocity(m),v=new Av(y,g,p,_,w,b);u.push(v),up&&B.DrawDirection(y,p,16711680,3,!0)}}o=new Lv(r,i,u)}if(d){const u={collider:e,component:h,collision:o};this.activeCollisions.push(u),h.onCollisionStay&&this.activeCollisionsStay.push(u),h.onCollisionEnter?.call(h,o)}}})})}}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],o=n.collider;if(o.destroyed||n.collision.collider.destroyed){this.activeCollisions.splice(i,1),i--;continue}if(o===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],o=n.collider;if(o.destroyed||n.collision.collider.destroyed){this.activeCollisionsStay.splice(i,1),i--;continue}if(o===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],o=n.collider;if(o.destroyed||n.otherCollider.destroyed){this.activeTriggers.splice(i,1),i--;continue}if(o===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 sT{static async createComparisonScene(e){const{files:t}=e,n=await Promise.all(t.map(g=>new Y(g).loadAssetAsync())),o=new c.Scene;let r=0;for(const g of n)if(g instanceof c.Object3D){g.position.y=r,o.add(g);const w=Nt([g]);r+=w.getSize(new c.Vector3).y,r+=.1}const a=new c.PerspectiveCamera(20);o.add(a);const l=e.environment||"https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/studio_small_09_1k.exr";{let g=null;if(l.endsWith(".hdr")){const w=(await Promise.resolve().then(()=>require("./three-examples-CsW4_6LI.umd.cjs")).then(b=>b.RGBELoader$1)).RGBELoader;g=new w}else if(l.endsWith(".exr")){const w=(await Promise.resolve().then(()=>require("./three-examples-CsW4_6LI.umd.cjs")).then(b=>b.EXRLoader$1)).EXRLoader;g=new w}if(g){const w=await g.loadAsync(l).catch(b=>(console.error(b),null));w&&(w.mapping=c.EquirectangularReflectionMapping,w.needsUpdate=!0,o.background=w,o.environment=w,o.backgroundBlurriness=.75)}else console.warn("Unsupported environment map format",l)}const h=Nt(o.children),d=h.getCenter(new c.Vector3),u=h.getSize(new c.Vector3),m=Math.max(u.x,u.y,u.z)/(2*Math.tan(Math.PI*a.fov/360));a.position.set(d.x,d.y,m),a.lookAt(d);const y=new q.OrbitControls(a,e.domElement||document.body);y.target=d,y.update();const _=(e.domElement||document.body).getBoundingClientRect();return a.aspect=_.width/_.height,a.updateProjectionMatrix(),{scene:o,camera:a}}}let lm=0;function Sb(s){s?lm++:lm--}function oT(){return lm>0}const rT={binary:!0,animations:!0};async function aT(s){if(!s.context)throw new Error("No context provided to exportAsGLTF");s.scene||(s.scene=s.context.scene);const e={...rT,...s},{context:t}=e,i=new q.GLTFExporter;i.register(a=>new iw(a)),i.register(a=>new BO(a)),i.register(a=>new tw(a)),fg(i,e.context);const n={binary:e.binary,animations:cT(t,e.scene,[])},o=new lT;console.debug("Exporting GLTF",n),o.onBeforeExport(e),Sb(!0);const r=await i.parseAsync(e.scene,n).catch(a=>(console.error(a),null));if(Sb(!1),o.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),h=document.createElement("a");h.href=l;let d=e.downloadAs;!d.endsWith(".glb")&&!d.endsWith(".gltf")&&(d+=e.binary?".glb":".gltf"),h.download=d,h.click()}}return r}const Cb=Symbol("needle:weight");class lT{_undo=[];onBeforeExport(e){e.context.animations.mixers.forEach(t=>{const i=eo.tryGetActionsFromMixer(t);if(i)for(let n=0;n<i.length;n++){const o=i[n];o[Cb]=o.weight,o.weight=0,this._undo.push(()=>{o.weight=o[Cb]})}t.update(0)}),e.context.scene.traverse(t=>{if(!Wp(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 cT(s,e,t){s.animations.mixers.forEach(n=>{const o=eo.tryGetActionsFromMixer(n);if(o)for(let r=0;r<o.length;r++){const l=o[r].getClip();t.push(l)}}),Array.isArray(e)||(e=[e]);for(const n of e)eo.tryGetAnimationClipsFromObjectHierarchy(n,t);const i=new Set(t);return Array.from(i)}const Pb="needle-button",fp=R();class hx 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;#s;#e;#i;#o;#a(){if(this.#e?.remove(),this.getAttribute("ar")!=null)this.#i??=new Zs,this.#e=this.#i.createARButton();else if(this.getAttribute("vr")!=null)this.#i??=new Zs,this.#e=this.#i.createVRButton();else if(this.getAttribute("quicklook")!=null)this.#i??=new Zs,this.#e=this.#i.createQuicklookButton();else{fp?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.#s??=document.createElement("style"),this.#s.innerHTML=`
1614
1614
  button {
1615
1615
  all: initial;
@@ -1644,4 +1644,4 @@ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[xt],i=e.membership;l
1644
1644
  justify-content: center;
1645
1645
  gap: .5rem;
1646
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.#s),Ld(Bp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),fp&&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=>{fp&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(Pb)&&window.customElements.define(Pb,hx);const xl=x("debugavatar");class wy{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(o=>o.layers.set(2))}}class dx{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 o=new hn;i=S.instantiate(ya(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(xl&&console.log("[Custom Avatar] valid config",t,xl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,xl?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(xl&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await rn().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return Xm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await rn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{xl&&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 o=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const l=new c.Vector3;new c.Box3().setFromObject(n).getSize(l);const h=Math.max(l.x,l.y,l.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&n.scale.multiplyScalar(1/h*.3)}return new wy(t,n,o,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const o of t){if(!n)break;i.indexOf(o)===-1&&(n=!1)}if(n)return e;if(e.children)for(const o of e.children){const r=this.findAvatarPart(o,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class ux{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class fx{}const hT=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:le,ActionCollection:yw,ActionModel:qt,AlignmentConstraint:Dc,Animation:Ot,AnimationCurve:eh,AnimationExtension:Su,AnimationTrackHandler:yc,Animator:rt,AnimatorController:Di,Antialiasing:ih,Attractor:Ha,AudioExtension:wr,AudioListener:ss,AudioSource:pi,AudioTrackHandler:rs,Avatar:io,AvatarBlink_Simple:yr,AvatarEyeLook_Rotation:ng,AvatarLoader:dx,AvatarMarker:Se,AvatarModel:wy,Avatar_Brain_LookAt:dc,Avatar_MouthShapes:Fc,Avatar_MustacheShake:tg,Avatar_POI:Zo,AxesHelper:Aa,BaseUIComponent:Bi,BasicIKConstraint:og,BehaviorExtension:Ig,BehaviorModel:yt,BloomEffect:ju,BoxCollider:_u,BoxGizmo:Pr,BoxHelperComponent:nt,Button:Ss,CallInfo:ns,Camera:Yt,CameraTargetReachedEvent:hc,Canvas:Oa,CanvasGroup:no,CapsuleCollider:hs,ChangeMaterialOnClick:Og,ChangeTransformOnClick:xr,CharacterController:_r,CharacterControllerInput:ps,ChromaticAberration:nh,ClickThrough:Ju,Collider:ei,ColorAdjustments:_o,ColorBySpeedModule:Wa,ColorOverLifetimeModule:Lu,ContactShadows:Uc,ControlTrackHandler:Gu,CursorFollow:Ir,CustomBranding:Cr,Deletable:cg,DeleteBox:Ys,DepthOfField:fn,DeviceFlag:bu,DocumentExtension:ux,DragControls:zo,DropListener:gs,Duplicatable:yg,EffectWrapper:gc,EmissionModule:vs,EmphasizeOnClick:ja,EnvironmentScene:Ku,EventList:se,EventListEvent:fu,EventSystem:zt,EventTrigger:wu,FieldWithDefault:Zv,FixedJoint:Qg,Fog:Na,GltfExport:xg,GltfExportBox:vg,Gradient:Mr,Graphic:Xc,GraphicRaycaster:pu,GridHelper:Va,GridLayoutGroup:Ng,GroundProjectedEnv:Un,GroupActionModel:No,HideOnStart:Ei,HingeJoint:Yc,HorizontalLayoutGroup:zg,get HoverAnimation(){return exports.HoverAnimation},Image:Ka,InheritVelocityModule:Jg,InputField:fy,InstanceHandle:Jo,InstancingHandler:ar,Interactable:lg,Keyframe:Kt,LODGroup:Zc,LODModel:$a,Light:ni,LimitVelocityOverLifetimeModule:et,LogStats:ag,LookAt:py,LookAtConstraint:gr,MainModule:Et,MarkerTrackHandler:Hu,MaskableGraphic:Qc,MeshCollider:ho,MeshRenderer:Nc,MinMaxCurve:H,MinMaxGradient:kr,NeedleMenu:Nn,NestedGltf:Jc,Networking:Kg,NoiseModule:fe,ObjectRaycaster:fi,OffsetConstraint:Or,OpenURL:Za,OrbitControls:ce,Outline:za,Padding:Sr,ParticleBurst:Hd,ParticleSubEmitter:ey,ParticleSystem:mc,ParticleSystemRenderer:Vi,PhysicsExtension:jg,PixelationEffect:sh,PlayAnimationOnClick:fc,PlayAudioOnClick:to,PlayableDirector:hr,PlayerColor:Ma,PointerEventData:jc,PostProcessingHandler:oy,PreliminaryAction:Ba,PreliminaryTrigger:Wc,RawImage:Qu,Rect:xw,RectTransform:cn,ReflectionProbe:uc,RegisteredAnimationInfo:qs,RemoteSkybox:Fu,Renderer:Vt,RendererLightmap:pg,Rigidbody:Ve,RotationBySpeedModule:Ni,RotationOverLifetimeModule:un,SceneSwitcher:Fe,ScreenCapture:bo,ScreenSpaceAmbientOcclusion:ws,ScreenSpaceAmbientOcclusionN8:pn,ScrollFollow:Cs,SeeThrough:xs,SetActiveOnClick:Mg,ShadowCatcher:lh,ShapeModule:Zg,SharpeningEffect:rh,SignalAsset:Wu,SignalReceiver:fh,SignalReceiverEvent:uh,SignalTrackHandler:_c,Size:ww,SizeBySpeedModule:si,SizeOverLifetimeModule:Er,SkinnedMeshRenderer:mg,SmoothFollow:zu,SpatialGrabRaycaster:or,SpatialHtml:mh,SpatialTrigger:Nu,SpatialTriggerReceiver:jn,SpectatorCamera:Vu,SphereCollider:La,SplineContainer:Lr,SplineData:Fn,SplineWalker:Wi,Sprite:ys,SpriteData:ma,SpriteRenderer:ti,SpriteSheet:Pa,SubEmitterSystem:Gd,SyncedCamera:ay,SyncedRoom:mn,SyncedTransform:ln,TapGestureTrigger:Eg,TeleportTarget:ku,TestRunner:ly,TestSimulateUserData:cy,Text:kt,TextBuilder:Fg,TextExtension:Ru,TextureSheetAnimationModule:Rt,TiltShiftEffect:Wn,ToneMappingEffect:so,TrailModule:Re,TransformData:ke,TransformGizmo:Dr,TriggerBuilder:Pt,TriggerModel:Ks,UIRaycastUtils:Km,UIRootComponent:Gc,USDZExporter:sn,USDZText:ra,USDZUIExtension:$g,UsageMarker:zc,VariantAction:Pg,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:Ug,VideoPlayer:Ze,get ViewBox(){return exports.ViewBox},Vignette:Ar,VisibilityAction:Hc,Voip:co,Volume:qa,VolumeParameter:F,VolumeProfile:Du,WebARCameraBackground:yh,WebARSessionRoot:di,WebXR:Eu,WebXRImageTracking:_h,WebXRImageTrackingModel:Os,WebXRPlaneTracking:Ms,WebXRTrackedImage:ka,XRControllerFollow:Ps,XRControllerModel:ds,XRControllerMovement:gi,XRFlag:Ti,XRRig:nf,XRState:Ut,__Ignore:fx},Symbol.toStringTag,{value:"Module"})),vc=x("debugmissingcamera");ae.registerCallback(re.MissingCamera,s=>{vc&&console.warn("Creating missing camera");const e=s.context.scene,t=new c.PerspectiveCamera;t.name="Default Fallback Camera",e.add(t);const i=new Yt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Ko.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Ko.Skybox;else{if(i.clearFlags=Ko.SolidColor,!s.context.domElement.getAttribute("background-color")){let a="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(a="#1f1f1f"),e.background=new c.Color(a)}if(!e.environment){const a=new c.PMREMGenerator$1(s.context.renderer),l=new Ku("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Go(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&px(s.context,o),o});ae.registerCallback(re.ContextCreated,s=>{if(!s.context.mainCamera){vc&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(Fb(s.context.mainCamera)?.isCameraController==!0){vc&&console.log("Will not auto-fit because a camera controller exists");return}px(s.context)}});function px(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(vc&&console.log("Creating default camera controls",e?.name),t){const i=Ec(t,ce);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const o=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(o)?.5:o,vc&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=s.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")}ae.registerCallback(re.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Ot&&n.playAutomatically||n instanceof rt||n instanceof hr&&n.playOnAwake===!0)return!0;if(n instanceof Ot)return n.playAutomatically=!0,!0;if(n instanceof hr)return n.playOnAwake=!0,!0}},!0)!==!0&&eo.autoplayAnimations(t.file)});exports.SplineUtils=void 0;(s=>{function e(t,i=!1,n=.75){const o=new Lr,r=1-D.clamp(n,0,1);return t.forEach((a,l)=>{const h=new c.Vector3;l<t.length-1?h.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&h.subVectors(t[0],a).normalize().multiplyScalar(r);const d=new Fn;d.position.copy(a),d.tangentIn.copy(h),d.tangentOut.copy(h),o.addKnot(d)}),o.closed=i,o}s.createFromPoints=e})(exports.SplineUtils||(exports.SplineUtils={}));class dT extends oe.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-mO20N_b8.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:la&&la.tagName.toUpperCase()==="SCRIPT"&&la.src||new URL("needle-engine.bundle-DbRanrPL.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.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=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=oe.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const _=new c.BufferAttribute(u.index,1,!1);t.setIndex(_)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.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(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const uT=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:dT},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=UP;exports.ActionBuilder=le;exports.ActionCollection=yw;exports.ActionModel=qt;exports.Addressables=J0;exports.AlignmentConstraint=Dc;exports.AmbientMode=fa;exports.Animation=Ot;exports.AnimationCurve=eh;exports.AnimationExtension=Su;exports.AnimationTrackHandler=yc;exports.AnimationUtils=eo;exports.Animator=rt;exports.AnimatorConditionMode=Vs;exports.AnimatorController=Di;exports.AnimatorControllerParameterType=Qm;exports.AnimatorStateInfo=Ml;exports.Antialiasing=ih;exports.Application=an;exports.AssetDatabase=g0;exports.AssetReference=Y;exports.Attractor=Ha;exports.AudioExtension=wr;exports.AudioListener=ss;exports.AudioSource=pi;exports.AudioTrackHandler=rs;exports.Avatar=io;exports.AvatarBlink_Simple=yr;exports.AvatarEyeLook_Rotation=ng;exports.AvatarLoader=dx;exports.AvatarMarker=Se;exports.AvatarModel=wy;exports.Avatar_Brain_LookAt=dc;exports.Avatar_MouthShapes=Fc;exports.Avatar_MustacheShake=tg;exports.Avatar_POI=Zo;exports.Axes=sa;exports.AxesHelper=Aa;exports.BUILD_TIME=Sm;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=og;exports.BehaviorExtension=Ig;exports.BehaviorModel=yt;exports.BloomEffect=ju;exports.BoxCollider=_u;exports.BoxGizmo=Pr;exports.BoxHelperComponent=nt;exports.Button=Ss;exports.ButtonsFactory=Ji;exports.CallDirection=jv;exports.CallInfo=ns;exports.Camera=Yt;exports.CameraTargetReachedEvent=hc;exports.Canvas=Oa;exports.CanvasGroup=no;exports.CapsuleCollider=hs;exports.ChangeMaterialOnClick=Og;exports.ChangeTransformOnClick=xr;exports.CharacterController=_r;exports.CharacterControllerInput=ps;exports.ChromaticAberration=nh;exports.CircularBuffer=ui;exports.ClearFlags=Ko;exports.ClickThrough=Ju;exports.ClipExtrapolation=xn;exports.Collider=ei;exports.Collision=Lv;exports.CollisionDetectionMode=uu;exports.ColorAdjustments=_o;exports.ColorBySpeedModule=Wa;exports.ColorOverLifetimeModule=Lu;exports.Component=G1;exports.Component$1=E;exports.ComponentLifecycleEvents=nu;exports.Components=hT;exports.ConnectionEvents=h0;exports.ContactPoint=Av;exports.ContactShadows=Uc;exports.Context=N;exports.ContextArgs=R1;exports.ContextEvent=re;exports.ContextRegistry=ae;exports.ControlTrackHandler=Gu;exports.CursorFollow=Ir;exports.CustomBranding=Cr;exports.CustomShader=ye;exports.DefaultReflectionMode=Td;exports.Deletable=cg;exports.DeleteBox=Ys;exports.DepthOfField=fn;exports.DeviceFlag=bu;exports.DocumentExtension=ux;exports.DragControls=zo;exports.DragMode=hg;exports.DropListener=gs;exports.Duplicatable=yg;exports.EffectWrapper=gc;exports.EmissionModule=vs;exports.EmphasizeOnClick=ja;exports.EngineLoadingView=bc;exports.EnvironmentScene=Ku;exports.EventList=se;exports.EventListEvent=fu;exports.EventSystem=zt;exports.EventTrigger=wu;exports.FieldWithDefault=Zv;exports.FileReference=Qo;exports.FileReferenceSerializer=tv;exports.FileSpawnModel=lO;exports.File_Event=$v;exports.FixedJoint=Qg;exports.Fog=Na;exports.FrameEvent=pe;exports.GENERATOR=Zd;exports.GameObject=S;exports.Gizmos=B;exports.GltfExport=xg;exports.GltfExportBox=vg;exports.Gradient=Mr;exports.Graphic=Xc;exports.GraphicRaycaster=pu;exports.Graphics=Js;exports.GridHelper=Va;exports.GridLayoutGroup=Ng;exports.GroundProjectedEnv=Un;exports.GroupActionModel=No;exports.HideFlags=mu;exports.HideOnStart=Ei;exports.HingeJoint=Yc;exports.HorizontalLayoutGroup=zg;exports.HostData=SC;exports.Image=Ka;exports.ImageReference=Xo;exports.ImageReferenceSerializer=ev;exports.InheritVelocityModule=Jg;exports.Input=s0;exports.InputEventQueue=Qt;exports.InputEvents=xe;exports.InputField=fy;exports.InstanceHandle=Jo;exports.InstancingHandler=ar;exports.InstancingUtil=Li;exports.InstantiateEvent=M0;exports.InstantiateIdProvider=gt;exports.InstantiateOptions=hn;exports.Interactable=lg;exports.JoinedRoomResponse=GS;exports.KeyEventArgs=IS;exports.Keyframe=Kt;exports.LODGroup=Zc;exports.LODModel=$a;exports.LeftRoomResponse=qS;exports.Light=ni;exports.LightData=rv;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=QR;exports.LogStats=ag;exports.LogType=hi;exports.LookAt=py;exports.LookAtConstraint=gr;exports.MainModule=Et;exports.MarkerTrackHandler=Hu;exports.MarkerType=hy;exports.MaskableGraphic=Qc;exports.Mathf=D;exports.MeshCollider=ho;exports.MeshRenderer=Nc;exports.MinMaxCurve=H;exports.MinMaxGradient=kr;exports.NEKeyboardEvent=Sl;exports.NEPointerEvent=Zn;exports.NeedleButtonElement=hx;exports.NeedleEngineWebComponent=vy;exports.NeedleMenu=Nn;exports.NeedlePatchesKey=td;exports.NeedleXRController=Mm;exports.NeedleXRSession=G;exports.NeedleXRSync=f0;exports.NeedleXRUtils=m0;exports.NestedGltf=Jc;exports.NetworkConnection=u0;exports.NetworkedStreamEvents=Rn;exports.NetworkedStreams=Bc;exports.Networking=Kg;exports.NewInstanceModel=E0;exports.NoiseModule=fe;exports.ObjectRaycaster=fi;exports.ObjectUtils=ur;exports.OffsetConstraint=Or;exports.OneEuroFilter=Jh;exports.OneEuroFilterXYZ=mm;exports.OpenURL=Za;exports.OrbitControls=ce;exports.Outline=za;exports.OwnershipEvent=d0;exports.OwnershipModel=Tm;exports.PUBLIC_KEY=ia;exports.Padding=Sr;exports.ParticleBurst=Hd;exports.ParticleSubEmitter=ey;exports.ParticleSystem=mc;exports.ParticleSystemBaseBehaviour=yo;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=Wd;exports.PeerHandle=os;exports.PeerNetworking=c0;exports.Physics=xa;exports.PhysicsExtension=jg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=sh;exports.PlayAnimationOnClick=fc;exports.PlayAudioOnClick=to;exports.PlayableDirector=hr;exports.PlayerColor=Ma;exports.PlayerState=en;exports.PlayerStateEvent=vw;exports.PlayerSync=Lg;exports.PlayerView=nv;exports.PlayerViewManager=sv;exports.PointerEventData=jc;exports.PointerType=tu;exports.PostProcessingEffect=$e;exports.PostProcessingEffectOrder=Ke;exports.PostProcessingHandler=oy;exports.PreliminaryAction=Ba;exports.PreliminaryTrigger=Wc;exports.PrimitiveType=tr;exports.Progress=ie;exports.PromiseAllWithErrors=fm;exports.PromiseErrorResult=gp;exports.RGBAColor=Z;exports.RapierPhysics=ga;exports.RawImage=Qu;exports.RaycastOptions=lo;exports.Rect=xw;exports.RectTransform=cn;exports.ReflectionProbe=uc;exports.RegisteredAnimationInfo=qs;exports.RemoteSkybox=Fu;exports.RenderTexture=En;exports.RenderTextureSerializer=kv;exports.Renderer=Vt;exports.RendererData=ov;exports.RendererLightmap=pg;exports.Rigidbody=Ve;exports.RigidbodyConstraints=Ie;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=un;exports.SceneLightSettings=Ud;exports.SceneSwitcher=Fe;exports.ScreenCapture=bo;exports.ScreenSpaceAmbientOcclusion=ws;exports.ScreenSpaceAmbientOcclusionN8=pn;exports.ScrollFollow=Cs;exports.SeeThrough=xs;exports.SendQueue=Zi;exports.SerializationContext=Vm;exports.SetActiveOnClick=Mg;exports.ShadowCatcher=lh;exports.ShapeModule=Zg;exports.ShapeOverlapResult=Dv;exports.SharpeningEffect=rh;exports.SignalAsset=Wu;exports.SignalReceiver=fh;exports.SignalReceiverEvent=uh;exports.SignalTrackHandler=_c;exports.Size=ww;exports.SizeBySpeedModule=si;exports.SizeOverLifetimeModule=Er;exports.SkinnedMeshRenderer=mg;exports.SmoothFollow=zu;exports.SpatialGrabRaycaster=or;exports.SpatialHtml=mh;exports.SpatialTrigger=Nu;exports.SpatialTriggerReceiver=jn;exports.SpectatorCamera=Vu;exports.SphereCollider=La;exports.SphereIntersection=Dm;exports.SplineContainer=Lr;exports.SplineData=Fn;exports.SplineWalker=Wi;exports.Sprite=ys;exports.SpriteData=ma;exports.SpriteRenderer=ti;exports.SpriteSheet=Pa;exports.StateMachineBehaviour=Z1;exports.StreamEndedEvent=Jm;exports.StreamReceivedEvent=Iv;exports.SubEmitterSystem=Gd;exports.SyncedCamera=ay;exports.SyncedRoom=mn;exports.SyncedTransform=ln;exports.TapGestureTrigger=Eg;exports.TeleportTarget=ku;exports.TestRunner=ly;exports.TestSceneUtils=sT;exports.TestSimulateUserData=cy;exports.Text=kt;exports.TextBuilder=Fg;exports.TextExtension=Ru;exports.TextureSheetAnimationModule=Rt;exports.TiltShiftEffect=Wn;exports.Time=av;exports.ToneMappingEffect=so;exports.TrackHandler=Ya;exports.TrackType=ri;exports.TrailModule=Re;exports.TransformData=ke;exports.TransformGizmo=Dr;exports.TriggerBuilder=Pt;exports.TriggerModel=Ks;exports.TypeStore=P;exports.UIRaycastUtils=Km;exports.UIRootComponent=Gc;exports.USDDocument=Sg;exports.USDObject=Ne;exports.USDWriter=lw;exports.USDZExporter=sn;exports.USDZExporter$1=cw;exports.USDZText=ra;exports.USDZUIExtension=$g;exports.UriSerializer=Ev;exports.UsageMarker=zc;exports.UserJoinedOrLeftRoomModel=XS;exports.VERSION=tn;exports.VariantAction=Pg;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=Ug;exports.VideoPlayer=Ze;exports.ViewDevice=Xs;exports.Vignette=Ar;exports.VisibilityAction=Hc;exports.Voip=co;exports.Volume=qa;exports.VolumeParameter=F;exports.VolumeProfile=Du;exports.WaitForFrames=t1;exports.WaitForPromise=iv;exports.WaitForSeconds=Hm;exports.Watch=as;exports.WebARCameraBackground=yh;exports.WebARSessionRoot=di;exports.WebXR=Eu;exports.WebXRButtonFactory=Zs;exports.WebXRImageTracking=_h;exports.WebXRImageTrackingModel=Os;exports.WebXRPlaneTracking=Ms;exports.WebXRTrackedImage=ka;exports.XRControllerFollow=Ps;exports.XRControllerModel=ds;exports.XRControllerMovement=gi;exports.XRFlag=Ti;exports.XRRig=nf;exports.XRState=Ut;exports.XRStateFlag=Mn;exports.__Ignore=fx;exports.__internalNotifyObjectDestroyed=uC;exports.activeInHierarchyFieldName=ls;exports.addAttributeChangeCallback=dm;exports.addComponent=nn;exports.addCustomExtensionPlugin=CO;exports.addNewComponent=Go;exports.addPatch=Jd;exports.apply=ou;exports.applyHMRChanges=W1;exports.applyPrototypeExtensions=N0;exports.beginListenDestroy=k0;exports.beginListenInstantiate=T0;exports.binaryIdentifierCasts=km;exports.build_scene_functions=E1;exports.builtinComponentKeyName=Do;exports.calculateProgress01=by;exports.clearMessages=$x;exports.colorSerializer=mP;exports.compareAssociation=I0;exports.componentSerializer=hd;exports.copyTexture=Hb;exports.createMotion=Sv;exports.debugNet=Wt;exports.debugOwner=Cl;exports.decompressGpuTexture=fw;exports.deepClone=xc;exports.delay=Bn;exports.delayForFrames=Sc;exports.deserializeObject=Ed;exports.destroy=ji;exports.destroyComponentInstance=W0;exports.determineMimeTypeFromExtension=Wv;exports.disposeObjectResources=_e;exports.disposeStream=Tn;exports.editorGuidKeyName=zl;exports.enableSpatialConsole=$o;exports.euler=yP;exports.eventListSerializer=wP;exports.exportAsGLTF=aT;exports.findByGuid=Wm;exports.findObjectOfType=Ra;exports.findObjectsOfType=G0;exports.findResourceUsers=Im;exports.fitCamera=Cv;exports.fitObjectIntoVolume=qb;exports.foreachComponent=nr;exports.foreachComponentEnumerator=au;exports.forward=aS;exports.generateQRCode=hv;exports.generateSeed=R0;exports.getBoundingBox=Nt;exports.getCameraController=Fb;exports.getComponent=pr;exports.getComponentInChildren=Tc;exports.getComponentInParent=ac;exports.getComponents=Rc;exports.getComponentsInChildren=Ea;exports.getComponentsInParent=su;exports.getFormattedDate=sw;exports.getIconElement=mt;exports.getIconTexture=jp;exports.getLoader=rn;exports.getOrAddComponent=Ec;exports.getParam=x;exports.getParentHierarchyPath=hS;exports.getPath=wx;exports.getPeerOptions=VS;exports.getPeerjsInstance=l0;exports.getResourceUserCount=pC;exports.getTempColor=Nb;exports.getTempQuaternion=Xt;exports.getTempVector=j;exports.getUrlParams=wc;exports.getVisibleInCustomShadowRendering=Gb;exports.getWorldDirection=Vb;exports.getWorldEuler=_m;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Kd;exports.getWorldScale=je;exports.hasCommercialLicense=cs;exports.hasIndieLicense=Lc;exports.hasPointerEventComponent=jd;exports.hasProLicense=In;exports.hideDebugConsole=Kb;exports.imageToCanvas=pw;exports.instantiate=sr;exports.invokeLoadedImportPluginHooks=Kv;exports.invokeXRSessionEnd=n0;exports.invokeXRSessionStart=i0;exports.isActiveInHierarchy=q0;exports.isActiveSelf=Ta;exports.isAndroidDevice=Mx;exports.isAnimationAction=Wb;exports.isComponent=Tv;exports.isDebugMode=yx;exports.isDesktop=Sx;exports.isDestroyed=ir;exports.isDevEnvironment=R;exports.isDisposed=dC;exports.isExporting=oT;exports.isGLTFModel=Rv;exports.isHostedOnGlitch=Ob;exports.isHotReloadEnabled=Np;exports.isHotReloading=V1;exports.isIPad=Px;exports.isIconElement=dv;exports.isLocalNetwork=Ii;exports.isMacOS=Ex;exports.isMobileDevice=Cx;exports.isMozillaXR=kx;exports.isQuest=Ax;exports.isResourceTrackingEnabled=_0;exports.isSafari=Tx;exports.isUsingInstancing=ru;exports.isiOS=Rx;exports.isiPad=Ox;exports.loadAsset=$R;exports.loadPMREM=Ww;exports.loadSync=_y;exports.logHierarchy=xd;exports.lookAtInverse=Jx;exports.lookAtObject=Cc;exports.lookAtScreenPoint=eS;exports.makeId=bx;exports.makeIdFromRandomWords=Eb;exports.makeNameSafe=mi;exports.markAsInstancedRendered=X0;exports.microphonePermissionsGranted=Lx;exports.nameof=gx;exports.nameofFactory=Mb;exports.objectSerializer=Mv;exports.offXRSessionEnd=DS;exports.offXRSessionStart=LS;exports.onAfterRender=z1;exports.onBeforeRender=U1;exports.onClear=B1;exports.onDestroy=F1;exports.onInitialized=gv;exports.onStart=hu;exports.onUpdate=yv;exports.onXRSessionEnd=Om;exports.onXRSessionStart=eu;exports.parseSync=ox;exports.placeOnSurface=Xb;exports.postprocessFBXMaterials=wm;exports.prefix=cP;exports.pushState=kb;exports.randomNumber=vx;exports.registerBinaryType=Em;exports.registerComponent=cu;exports.registerComponentExtension=ug;exports.registerCustomEffectType=$i;exports.registerExportExtensions=fg;exports.registerExtensions=Nd;exports.registerHotReloadType=bv;exports.registerLoader=Cm;exports.registerPrefabProvider=L0;exports.registerPrototypeExtensions=V0;exports.registerType=Um;exports.relativePathPrefix=Tb;exports.removeAttributeChangeCallback=um;exports.removeComponent=$m;exports.removeCustomImportExtensionType=PO;exports.removePatch=TS;exports.resolveUrl=oo;exports.sanitizeString=Rb;exports.saveImage=tx;exports.screenshot=OR;exports.screenshot2=yy;exports.sendDestroyed=Bm;exports.serializable=f;exports.serializeObject=B0;exports.serializeable=Be;exports.setActive=$l;exports.setAllowBalloonMessages=Ib;exports.setAllowOverlayMessages=Ux;exports.setAutoFitEnabled=vd;exports.setCameraController=_p;exports.setDestroyed=Y0;exports.setDevEnvironment=_S;exports.setDisposable=v0;exports.setDontDestroy=Qr;exports.setOrAddParamsToUrl=mp;exports.setParam=_x;exports.setParamWithoutReload=ic;exports.setPeerOptions=$S;exports.setResourceTrackingEnabled=hC;exports.setState=cm;exports.setVisibleInCustomShadowRendering=vm;exports.setWorldEuler=bm;exports.setWorldPosition=ot;exports.setWorldPositionXYZ=er;exports.setWorldQuaternion=on;exports.setWorldQuaternionXYZW=ym;exports.setWorldRotation=$b;exports.setWorldRotationXYZ=Pc;exports.setWorldScale=_a;exports.showBalloonError=Oc;exports.showBalloonMessage=Ce;exports.showBalloonWarning=de;exports.showDebugConsole=xm;exports.slerp=Zx;exports.syncDestroy=Mc;exports.syncField=Ag;exports.syncInstantiate=Fm;exports.textureToCanvas=dS;exports.toSourceId=Ab;exports.tryCastBinary=r0;exports.tryDetermineMimetypeFromBinary=Gv;exports.tryDetermineMimetypeFromURL=Hv;exports.tryFindObject=ya;exports.tryGetGuid=a0;exports.unregisterHotReloadType=vv;exports.unwatchWrite=hm;exports.useForAutoFit=Ub;exports.validate=_t;exports.watchWrite=Yd;
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.#s),Ld(Bp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),fp&&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=>{fp&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(Pb)&&window.customElements.define(Pb,hx);const xl=x("debugavatar");class wy{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(o=>o.layers.set(2))}}class dx{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 o=new hn;i=S.instantiate(ya(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(xl&&console.log("[Custom Avatar] valid config",t,xl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,xl?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(xl&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await rn().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return Xm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await rn().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{xl&&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 o=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const l=new c.Vector3;new c.Box3().setFromObject(n).getSize(l);const h=Math.max(l.x,l.y,l.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&n.scale.multiplyScalar(1/h*.3)}return new wy(t,n,o,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const o of t){if(!n)break;i.indexOf(o)===-1&&(n=!1)}if(n)return e;if(e.children)for(const o of e.children){const r=this.findAvatarPart(o,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class ux{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class fx{}const hT=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:le,ActionCollection:yw,ActionModel:qt,AlignmentConstraint:Dc,Animation:Ot,AnimationCurve:eh,AnimationExtension:Su,AnimationTrackHandler:yc,Animator:rt,AnimatorController:Di,Antialiasing:ih,Attractor:Ha,AudioExtension:wr,AudioListener:ss,AudioSource:pi,AudioTrackHandler:rs,Avatar:io,AvatarBlink_Simple:yr,AvatarEyeLook_Rotation:ng,AvatarLoader:dx,AvatarMarker:Se,AvatarModel:wy,Avatar_Brain_LookAt:dc,Avatar_MouthShapes:Fc,Avatar_MustacheShake:tg,Avatar_POI:Zo,AxesHelper:Aa,BaseUIComponent:Bi,BasicIKConstraint:og,BehaviorExtension:Ig,BehaviorModel:yt,BloomEffect:ju,BoxCollider:_u,BoxGizmo:Pr,BoxHelperComponent:nt,Button:Ss,CallInfo:ns,Camera:Yt,CameraTargetReachedEvent:hc,Canvas:Oa,CanvasGroup:no,CapsuleCollider:hs,ChangeMaterialOnClick:Og,ChangeTransformOnClick:xr,CharacterController:_r,CharacterControllerInput:ps,ChromaticAberration:nh,ClickThrough:Ju,Collider:ei,ColorAdjustments:_o,ColorBySpeedModule:Wa,ColorOverLifetimeModule:Lu,ContactShadows:Uc,ControlTrackHandler:Gu,CursorFollow:Ir,CustomBranding:Cr,Deletable:cg,DeleteBox:Ys,DepthOfField:fn,DeviceFlag:bu,DocumentExtension:ux,DragControls:zo,DropListener:gs,Duplicatable:yg,EffectWrapper:gc,EmissionModule:vs,EmphasizeOnClick:ja,EnvironmentScene:Ku,EventList:se,EventListEvent:fu,EventSystem:zt,EventTrigger:wu,FieldWithDefault:Zv,FixedJoint:Qg,Fog:Na,GltfExport:xg,GltfExportBox:vg,Gradient:Mr,Graphic:Xc,GraphicRaycaster:pu,GridHelper:Va,GridLayoutGroup:Ng,GroundProjectedEnv:Un,GroupActionModel:No,HideOnStart:Ei,HingeJoint:Yc,HorizontalLayoutGroup:zg,get HoverAnimation(){return exports.HoverAnimation},Image:Ka,InheritVelocityModule:Jg,InputField:fy,InstanceHandle:Jo,InstancingHandler:ar,Interactable:lg,Keyframe:Kt,LODGroup:Zc,LODModel:$a,Light:ni,LimitVelocityOverLifetimeModule:et,LogStats:ag,LookAt:py,LookAtConstraint:gr,MainModule:Et,MarkerTrackHandler:Hu,MaskableGraphic:Qc,MeshCollider:ho,MeshRenderer:Nc,MinMaxCurve:H,MinMaxGradient:kr,NeedleMenu:Nn,NestedGltf:Jc,Networking:Kg,NoiseModule:fe,ObjectRaycaster:fi,OffsetConstraint:Or,OpenURL:Za,OrbitControls:ce,Outline:za,Padding:Sr,ParticleBurst:Hd,ParticleSubEmitter:ey,ParticleSystem:mc,ParticleSystemRenderer:Vi,PhysicsExtension:jg,PixelationEffect:sh,PlayAnimationOnClick:fc,PlayAudioOnClick:to,PlayableDirector:hr,PlayerColor:Ma,PointerEventData:jc,PostProcessingHandler:oy,PreliminaryAction:Ba,PreliminaryTrigger:Wc,RawImage:Qu,Rect:xw,RectTransform:cn,ReflectionProbe:uc,RegisteredAnimationInfo:qs,RemoteSkybox:Fu,Renderer:Vt,RendererLightmap:pg,Rigidbody:Ve,RotationBySpeedModule:Ni,RotationOverLifetimeModule:un,SceneSwitcher:Fe,ScreenCapture:bo,ScreenSpaceAmbientOcclusion:ws,ScreenSpaceAmbientOcclusionN8:pn,ScrollFollow:Cs,SeeThrough:xs,SetActiveOnClick:Mg,ShadowCatcher:lh,ShapeModule:Zg,SharpeningEffect:rh,SignalAsset:Wu,SignalReceiver:fh,SignalReceiverEvent:uh,SignalTrackHandler:_c,Size:ww,SizeBySpeedModule:si,SizeOverLifetimeModule:Er,SkinnedMeshRenderer:mg,SmoothFollow:zu,SpatialGrabRaycaster:or,SpatialHtml:mh,SpatialTrigger:Nu,SpatialTriggerReceiver:jn,SpectatorCamera:Vu,SphereCollider:La,SplineContainer:Lr,SplineData:Fn,SplineWalker:Wi,Sprite:ys,SpriteData:ma,SpriteRenderer:ti,SpriteSheet:Pa,SubEmitterSystem:Gd,SyncedCamera:ay,SyncedRoom:mn,SyncedTransform:ln,TapGestureTrigger:Eg,TeleportTarget:ku,TestRunner:ly,TestSimulateUserData:cy,Text:kt,TextBuilder:Fg,TextExtension:Ru,TextureSheetAnimationModule:Rt,TiltShiftEffect:Wn,ToneMappingEffect:so,TrailModule:Re,TransformData:ke,TransformGizmo:Dr,TriggerBuilder:Pt,TriggerModel:Ks,UIRaycastUtils:Km,UIRootComponent:Gc,USDZExporter:sn,USDZText:ra,USDZUIExtension:$g,UsageMarker:zc,VariantAction:Pg,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:Ug,VideoPlayer:Ze,get ViewBox(){return exports.ViewBox},Vignette:Ar,VisibilityAction:Hc,Voip:co,Volume:qa,VolumeParameter:F,VolumeProfile:Du,WebARCameraBackground:yh,WebARSessionRoot:di,WebXR:Eu,WebXRImageTracking:_h,WebXRImageTrackingModel:Os,WebXRPlaneTracking:Ms,WebXRTrackedImage:ka,XRControllerFollow:Ps,XRControllerModel:ds,XRControllerMovement:gi,XRFlag:Ti,XRRig:nf,XRState:Ut,__Ignore:fx},Symbol.toStringTag,{value:"Module"})),vc=x("debugmissingcamera");ae.registerCallback(re.MissingCamera,s=>{vc&&console.warn("Creating missing camera");const e=s.context.scene,t=new c.PerspectiveCamera;t.name="Default Fallback Camera",e.add(t);const i=new Yt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Ko.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Ko.Skybox;else{if(i.clearFlags=Ko.SolidColor,!s.context.domElement.getAttribute("background-color")){let a="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(a="#1f1f1f"),e.background=new c.Color(a)}if(!e.environment){const a=new c.PMREMGenerator$1(s.context.renderer),l=new Ku("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Go(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&px(s.context,o),o});ae.registerCallback(re.ContextCreated,s=>{if(!s.context.mainCamera){vc&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(Fb(s.context.mainCamera)?.isCameraController==!0){vc&&console.log("Will not auto-fit because a camera controller exists");return}px(s.context)}});function px(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(vc&&console.log("Creating default camera controls",e?.name),t){const i=Ec(t,ce);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const o=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(o)?.5:o,vc&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=s.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")}ae.registerCallback(re.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Ot&&n.playAutomatically||n instanceof rt||n instanceof hr&&n.playOnAwake===!0)return!0;if(n instanceof Ot)return n.playAutomatically=!0,!0;if(n instanceof hr)return n.playOnAwake=!0,!0}},!0)!==!0&&eo.autoplayAnimations(t.file)});exports.SplineUtils=void 0;(s=>{function e(t,i=!1,n=.75){const o=new Lr,r=1-D.clamp(n,0,1);return t.forEach((a,l)=>{const h=new c.Vector3;l<t.length-1?h.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&h.subVectors(t[0],a).normalize().multiplyScalar(r);const d=new Fn;d.position.copy(a),d.tangentIn.copy(h),d.tangentOut.copy(h),o.addKnot(d)}),o.closed=i,o}s.createFromPoints=e})(exports.SplineUtils||(exports.SplineUtils={}));class dT extends oe.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-mO20N_b8.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:la&&la.tagName.toUpperCase()==="SCRIPT"&&la.src||new URL("needle-engine.bundle-DgiVW9bH.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.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=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=oe.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const _=new c.BufferAttribute(u.index,1,!1);t.setIndex(_)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.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(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const uT=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:dT},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=UP;exports.ActionBuilder=le;exports.ActionCollection=yw;exports.ActionModel=qt;exports.Addressables=J0;exports.AlignmentConstraint=Dc;exports.AmbientMode=fa;exports.Animation=Ot;exports.AnimationCurve=eh;exports.AnimationExtension=Su;exports.AnimationTrackHandler=yc;exports.AnimationUtils=eo;exports.Animator=rt;exports.AnimatorConditionMode=Vs;exports.AnimatorController=Di;exports.AnimatorControllerParameterType=Qm;exports.AnimatorStateInfo=Ml;exports.Antialiasing=ih;exports.Application=an;exports.AssetDatabase=g0;exports.AssetReference=Y;exports.Attractor=Ha;exports.AudioExtension=wr;exports.AudioListener=ss;exports.AudioSource=pi;exports.AudioTrackHandler=rs;exports.Avatar=io;exports.AvatarBlink_Simple=yr;exports.AvatarEyeLook_Rotation=ng;exports.AvatarLoader=dx;exports.AvatarMarker=Se;exports.AvatarModel=wy;exports.Avatar_Brain_LookAt=dc;exports.Avatar_MouthShapes=Fc;exports.Avatar_MustacheShake=tg;exports.Avatar_POI=Zo;exports.Axes=sa;exports.AxesHelper=Aa;exports.BUILD_TIME=Sm;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=og;exports.BehaviorExtension=Ig;exports.BehaviorModel=yt;exports.BloomEffect=ju;exports.BoxCollider=_u;exports.BoxGizmo=Pr;exports.BoxHelperComponent=nt;exports.Button=Ss;exports.ButtonsFactory=Ji;exports.CallDirection=jv;exports.CallInfo=ns;exports.Camera=Yt;exports.CameraTargetReachedEvent=hc;exports.Canvas=Oa;exports.CanvasGroup=no;exports.CapsuleCollider=hs;exports.ChangeMaterialOnClick=Og;exports.ChangeTransformOnClick=xr;exports.CharacterController=_r;exports.CharacterControllerInput=ps;exports.ChromaticAberration=nh;exports.CircularBuffer=ui;exports.ClearFlags=Ko;exports.ClickThrough=Ju;exports.ClipExtrapolation=xn;exports.Collider=ei;exports.Collision=Lv;exports.CollisionDetectionMode=uu;exports.ColorAdjustments=_o;exports.ColorBySpeedModule=Wa;exports.ColorOverLifetimeModule=Lu;exports.Component=G1;exports.Component$1=E;exports.ComponentLifecycleEvents=nu;exports.Components=hT;exports.ConnectionEvents=h0;exports.ContactPoint=Av;exports.ContactShadows=Uc;exports.Context=N;exports.ContextArgs=R1;exports.ContextEvent=re;exports.ContextRegistry=ae;exports.ControlTrackHandler=Gu;exports.CursorFollow=Ir;exports.CustomBranding=Cr;exports.CustomShader=ye;exports.DefaultReflectionMode=Td;exports.Deletable=cg;exports.DeleteBox=Ys;exports.DepthOfField=fn;exports.DeviceFlag=bu;exports.DocumentExtension=ux;exports.DragControls=zo;exports.DragMode=hg;exports.DropListener=gs;exports.Duplicatable=yg;exports.EffectWrapper=gc;exports.EmissionModule=vs;exports.EmphasizeOnClick=ja;exports.EngineLoadingView=bc;exports.EnvironmentScene=Ku;exports.EventList=se;exports.EventListEvent=fu;exports.EventSystem=zt;exports.EventTrigger=wu;exports.FieldWithDefault=Zv;exports.FileReference=Qo;exports.FileReferenceSerializer=tv;exports.FileSpawnModel=lO;exports.File_Event=$v;exports.FixedJoint=Qg;exports.Fog=Na;exports.FrameEvent=pe;exports.GENERATOR=Zd;exports.GameObject=S;exports.Gizmos=B;exports.GltfExport=xg;exports.GltfExportBox=vg;exports.Gradient=Mr;exports.Graphic=Xc;exports.GraphicRaycaster=pu;exports.Graphics=Js;exports.GridHelper=Va;exports.GridLayoutGroup=Ng;exports.GroundProjectedEnv=Un;exports.GroupActionModel=No;exports.HideFlags=mu;exports.HideOnStart=Ei;exports.HingeJoint=Yc;exports.HorizontalLayoutGroup=zg;exports.HostData=SC;exports.Image=Ka;exports.ImageReference=Xo;exports.ImageReferenceSerializer=ev;exports.InheritVelocityModule=Jg;exports.Input=s0;exports.InputEventQueue=Qt;exports.InputEvents=xe;exports.InputField=fy;exports.InstanceHandle=Jo;exports.InstancingHandler=ar;exports.InstancingUtil=Li;exports.InstantiateEvent=M0;exports.InstantiateIdProvider=gt;exports.InstantiateOptions=hn;exports.Interactable=lg;exports.JoinedRoomResponse=GS;exports.KeyEventArgs=IS;exports.Keyframe=Kt;exports.LODGroup=Zc;exports.LODModel=$a;exports.LeftRoomResponse=qS;exports.Light=ni;exports.LightData=rv;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=QR;exports.LogStats=ag;exports.LogType=hi;exports.LookAt=py;exports.LookAtConstraint=gr;exports.MainModule=Et;exports.MarkerTrackHandler=Hu;exports.MarkerType=hy;exports.MaskableGraphic=Qc;exports.Mathf=D;exports.MeshCollider=ho;exports.MeshRenderer=Nc;exports.MinMaxCurve=H;exports.MinMaxGradient=kr;exports.NEKeyboardEvent=Sl;exports.NEPointerEvent=Zn;exports.NeedleButtonElement=hx;exports.NeedleEngineWebComponent=vy;exports.NeedleMenu=Nn;exports.NeedlePatchesKey=td;exports.NeedleXRController=Mm;exports.NeedleXRSession=G;exports.NeedleXRSync=f0;exports.NeedleXRUtils=m0;exports.NestedGltf=Jc;exports.NetworkConnection=u0;exports.NetworkedStreamEvents=Rn;exports.NetworkedStreams=Bc;exports.Networking=Kg;exports.NewInstanceModel=E0;exports.NoiseModule=fe;exports.ObjectRaycaster=fi;exports.ObjectUtils=ur;exports.OffsetConstraint=Or;exports.OneEuroFilter=Jh;exports.OneEuroFilterXYZ=mm;exports.OpenURL=Za;exports.OrbitControls=ce;exports.Outline=za;exports.OwnershipEvent=d0;exports.OwnershipModel=Tm;exports.PUBLIC_KEY=ia;exports.Padding=Sr;exports.ParticleBurst=Hd;exports.ParticleSubEmitter=ey;exports.ParticleSystem=mc;exports.ParticleSystemBaseBehaviour=yo;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=Wd;exports.PeerHandle=os;exports.PeerNetworking=c0;exports.Physics=xa;exports.PhysicsExtension=jg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=sh;exports.PlayAnimationOnClick=fc;exports.PlayAudioOnClick=to;exports.PlayableDirector=hr;exports.PlayerColor=Ma;exports.PlayerState=en;exports.PlayerStateEvent=vw;exports.PlayerSync=Lg;exports.PlayerView=nv;exports.PlayerViewManager=sv;exports.PointerEventData=jc;exports.PointerType=tu;exports.PostProcessingEffect=$e;exports.PostProcessingEffectOrder=Ke;exports.PostProcessingHandler=oy;exports.PreliminaryAction=Ba;exports.PreliminaryTrigger=Wc;exports.PrimitiveType=tr;exports.Progress=ie;exports.PromiseAllWithErrors=fm;exports.PromiseErrorResult=gp;exports.RGBAColor=Z;exports.RapierPhysics=ga;exports.RawImage=Qu;exports.RaycastOptions=lo;exports.Rect=xw;exports.RectTransform=cn;exports.ReflectionProbe=uc;exports.RegisteredAnimationInfo=qs;exports.RemoteSkybox=Fu;exports.RenderTexture=En;exports.RenderTextureSerializer=kv;exports.Renderer=Vt;exports.RendererData=ov;exports.RendererLightmap=pg;exports.Rigidbody=Ve;exports.RigidbodyConstraints=Ie;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=un;exports.SceneLightSettings=Ud;exports.SceneSwitcher=Fe;exports.ScreenCapture=bo;exports.ScreenSpaceAmbientOcclusion=ws;exports.ScreenSpaceAmbientOcclusionN8=pn;exports.ScrollFollow=Cs;exports.SeeThrough=xs;exports.SendQueue=Zi;exports.SerializationContext=Vm;exports.SetActiveOnClick=Mg;exports.ShadowCatcher=lh;exports.ShapeModule=Zg;exports.ShapeOverlapResult=Dv;exports.SharpeningEffect=rh;exports.SignalAsset=Wu;exports.SignalReceiver=fh;exports.SignalReceiverEvent=uh;exports.SignalTrackHandler=_c;exports.Size=ww;exports.SizeBySpeedModule=si;exports.SizeOverLifetimeModule=Er;exports.SkinnedMeshRenderer=mg;exports.SmoothFollow=zu;exports.SpatialGrabRaycaster=or;exports.SpatialHtml=mh;exports.SpatialTrigger=Nu;exports.SpatialTriggerReceiver=jn;exports.SpectatorCamera=Vu;exports.SphereCollider=La;exports.SphereIntersection=Dm;exports.SplineContainer=Lr;exports.SplineData=Fn;exports.SplineWalker=Wi;exports.Sprite=ys;exports.SpriteData=ma;exports.SpriteRenderer=ti;exports.SpriteSheet=Pa;exports.StateMachineBehaviour=Z1;exports.StreamEndedEvent=Jm;exports.StreamReceivedEvent=Iv;exports.SubEmitterSystem=Gd;exports.SyncedCamera=ay;exports.SyncedRoom=mn;exports.SyncedTransform=ln;exports.TapGestureTrigger=Eg;exports.TeleportTarget=ku;exports.TestRunner=ly;exports.TestSceneUtils=sT;exports.TestSimulateUserData=cy;exports.Text=kt;exports.TextBuilder=Fg;exports.TextExtension=Ru;exports.TextureSheetAnimationModule=Rt;exports.TiltShiftEffect=Wn;exports.Time=av;exports.ToneMappingEffect=so;exports.TrackHandler=Ya;exports.TrackType=ri;exports.TrailModule=Re;exports.TransformData=ke;exports.TransformGizmo=Dr;exports.TriggerBuilder=Pt;exports.TriggerModel=Ks;exports.TypeStore=P;exports.UIRaycastUtils=Km;exports.UIRootComponent=Gc;exports.USDDocument=Sg;exports.USDObject=Ne;exports.USDWriter=lw;exports.USDZExporter=sn;exports.USDZExporter$1=cw;exports.USDZText=ra;exports.USDZUIExtension=$g;exports.UriSerializer=Ev;exports.UsageMarker=zc;exports.UserJoinedOrLeftRoomModel=XS;exports.VERSION=tn;exports.VariantAction=Pg;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=Ug;exports.VideoPlayer=Ze;exports.ViewDevice=Xs;exports.Vignette=Ar;exports.VisibilityAction=Hc;exports.Voip=co;exports.Volume=qa;exports.VolumeParameter=F;exports.VolumeProfile=Du;exports.WaitForFrames=t1;exports.WaitForPromise=iv;exports.WaitForSeconds=Hm;exports.Watch=as;exports.WebARCameraBackground=yh;exports.WebARSessionRoot=di;exports.WebXR=Eu;exports.WebXRButtonFactory=Zs;exports.WebXRImageTracking=_h;exports.WebXRImageTrackingModel=Os;exports.WebXRPlaneTracking=Ms;exports.WebXRTrackedImage=ka;exports.XRControllerFollow=Ps;exports.XRControllerModel=ds;exports.XRControllerMovement=gi;exports.XRFlag=Ti;exports.XRRig=nf;exports.XRState=Ut;exports.XRStateFlag=Mn;exports.__Ignore=fx;exports.__internalNotifyObjectDestroyed=uC;exports.activeInHierarchyFieldName=ls;exports.addAttributeChangeCallback=dm;exports.addComponent=nn;exports.addCustomExtensionPlugin=CO;exports.addNewComponent=Go;exports.addPatch=Jd;exports.apply=ou;exports.applyHMRChanges=W1;exports.applyPrototypeExtensions=N0;exports.beginListenDestroy=k0;exports.beginListenInstantiate=T0;exports.binaryIdentifierCasts=km;exports.build_scene_functions=E1;exports.builtinComponentKeyName=Do;exports.calculateProgress01=by;exports.clearMessages=$x;exports.colorSerializer=mP;exports.compareAssociation=I0;exports.componentSerializer=hd;exports.copyTexture=Hb;exports.createMotion=Sv;exports.debugNet=Wt;exports.debugOwner=Cl;exports.decompressGpuTexture=fw;exports.deepClone=xc;exports.delay=Bn;exports.delayForFrames=Sc;exports.deserializeObject=Ed;exports.destroy=ji;exports.destroyComponentInstance=W0;exports.determineMimeTypeFromExtension=Wv;exports.disposeObjectResources=_e;exports.disposeStream=Tn;exports.editorGuidKeyName=zl;exports.enableSpatialConsole=$o;exports.euler=yP;exports.eventListSerializer=wP;exports.exportAsGLTF=aT;exports.findByGuid=Wm;exports.findObjectOfType=Ra;exports.findObjectsOfType=G0;exports.findResourceUsers=Im;exports.fitCamera=Cv;exports.fitObjectIntoVolume=qb;exports.foreachComponent=nr;exports.foreachComponentEnumerator=au;exports.forward=aS;exports.generateQRCode=hv;exports.generateSeed=R0;exports.getBoundingBox=Nt;exports.getCameraController=Fb;exports.getComponent=pr;exports.getComponentInChildren=Tc;exports.getComponentInParent=ac;exports.getComponents=Rc;exports.getComponentsInChildren=Ea;exports.getComponentsInParent=su;exports.getFormattedDate=sw;exports.getIconElement=mt;exports.getIconTexture=jp;exports.getLoader=rn;exports.getOrAddComponent=Ec;exports.getParam=x;exports.getParentHierarchyPath=hS;exports.getPath=wx;exports.getPeerOptions=VS;exports.getPeerjsInstance=l0;exports.getResourceUserCount=pC;exports.getTempColor=Nb;exports.getTempQuaternion=Xt;exports.getTempVector=j;exports.getUrlParams=wc;exports.getVisibleInCustomShadowRendering=Gb;exports.getWorldDirection=Vb;exports.getWorldEuler=_m;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Kd;exports.getWorldScale=je;exports.hasCommercialLicense=cs;exports.hasIndieLicense=Lc;exports.hasPointerEventComponent=jd;exports.hasProLicense=In;exports.hideDebugConsole=Kb;exports.imageToCanvas=pw;exports.instantiate=sr;exports.invokeLoadedImportPluginHooks=Kv;exports.invokeXRSessionEnd=n0;exports.invokeXRSessionStart=i0;exports.isActiveInHierarchy=q0;exports.isActiveSelf=Ta;exports.isAndroidDevice=Mx;exports.isAnimationAction=Wb;exports.isComponent=Tv;exports.isDebugMode=yx;exports.isDesktop=Sx;exports.isDestroyed=ir;exports.isDevEnvironment=R;exports.isDisposed=dC;exports.isExporting=oT;exports.isGLTFModel=Rv;exports.isHostedOnGlitch=Ob;exports.isHotReloadEnabled=Np;exports.isHotReloading=V1;exports.isIPad=Px;exports.isIconElement=dv;exports.isLocalNetwork=Ii;exports.isMacOS=Ex;exports.isMobileDevice=Cx;exports.isMozillaXR=kx;exports.isQuest=Ax;exports.isResourceTrackingEnabled=_0;exports.isSafari=Tx;exports.isUsingInstancing=ru;exports.isiOS=Rx;exports.isiPad=Ox;exports.loadAsset=$R;exports.loadPMREM=Ww;exports.loadSync=_y;exports.logHierarchy=xd;exports.lookAtInverse=Jx;exports.lookAtObject=Cc;exports.lookAtScreenPoint=eS;exports.makeId=bx;exports.makeIdFromRandomWords=Eb;exports.makeNameSafe=mi;exports.markAsInstancedRendered=X0;exports.microphonePermissionsGranted=Lx;exports.nameof=gx;exports.nameofFactory=Mb;exports.objectSerializer=Mv;exports.offXRSessionEnd=DS;exports.offXRSessionStart=LS;exports.onAfterRender=z1;exports.onBeforeRender=U1;exports.onClear=B1;exports.onDestroy=F1;exports.onInitialized=gv;exports.onStart=hu;exports.onUpdate=yv;exports.onXRSessionEnd=Om;exports.onXRSessionStart=eu;exports.parseSync=ox;exports.placeOnSurface=Xb;exports.postprocessFBXMaterials=wm;exports.prefix=cP;exports.pushState=kb;exports.randomNumber=vx;exports.registerBinaryType=Em;exports.registerComponent=cu;exports.registerComponentExtension=ug;exports.registerCustomEffectType=$i;exports.registerExportExtensions=fg;exports.registerExtensions=Nd;exports.registerHotReloadType=bv;exports.registerLoader=Cm;exports.registerPrefabProvider=L0;exports.registerPrototypeExtensions=V0;exports.registerType=Um;exports.relativePathPrefix=Tb;exports.removeAttributeChangeCallback=um;exports.removeComponent=$m;exports.removeCustomImportExtensionType=PO;exports.removePatch=TS;exports.resolveUrl=oo;exports.sanitizeString=Rb;exports.saveImage=tx;exports.screenshot=OR;exports.screenshot2=yy;exports.sendDestroyed=Bm;exports.serializable=f;exports.serializeObject=B0;exports.serializeable=Be;exports.setActive=$l;exports.setAllowBalloonMessages=Ib;exports.setAllowOverlayMessages=Ux;exports.setAutoFitEnabled=vd;exports.setCameraController=_p;exports.setDestroyed=Y0;exports.setDevEnvironment=_S;exports.setDisposable=v0;exports.setDontDestroy=Qr;exports.setOrAddParamsToUrl=mp;exports.setParam=_x;exports.setParamWithoutReload=ic;exports.setPeerOptions=$S;exports.setResourceTrackingEnabled=hC;exports.setState=cm;exports.setVisibleInCustomShadowRendering=vm;exports.setWorldEuler=bm;exports.setWorldPosition=ot;exports.setWorldPositionXYZ=er;exports.setWorldQuaternion=on;exports.setWorldQuaternionXYZW=ym;exports.setWorldRotation=$b;exports.setWorldRotationXYZ=Pc;exports.setWorldScale=_a;exports.showBalloonError=Oc;exports.showBalloonMessage=Ce;exports.showBalloonWarning=de;exports.showDebugConsole=xm;exports.slerp=Zx;exports.syncDestroy=Mc;exports.syncField=Ag;exports.syncInstantiate=Fm;exports.textureToCanvas=dS;exports.toSourceId=Ab;exports.tryCastBinary=r0;exports.tryDetermineMimetypeFromBinary=Gv;exports.tryDetermineMimetypeFromURL=Hv;exports.tryFindObject=ya;exports.tryGetGuid=a0;exports.unregisterHotReloadType=vv;exports.unwatchWrite=hm;exports.useForAutoFit=Ub;exports.validate=_t;exports.watchWrite=Yd;