@needle-tools/engine 4.11.5-next.a900688 → 4.11.5-next.b35161f

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 (436) hide show
  1. package/components.needle.json +1 -1
  2. package/custom-elements.json +364 -0
  3. package/dist/generateMeshBVH.worker-mO20N_b8.js +21 -0
  4. package/dist/{gltf-progressive-GwdQV1Qx.umd.cjs → gltf-progressive-DWcmTMCh.umd.cjs} +1 -1
  5. package/dist/{gltf-progressive-CftVUJy3.min.js → gltf-progressive-DZrY8VT6.min.js} +2 -2
  6. package/dist/{gltf-progressive-BvlZQAkt.js → gltf-progressive-DgYz5BYa.js} +19 -19
  7. package/dist/loader.worker-Dip-PthR.js +23 -0
  8. package/dist/{needle-engine.bundle-vPWPv18K.min.js → needle-engine.bundle-BsJvSPgy.min.js} +129 -134
  9. package/dist/{needle-engine.bundle-Bwinyjsh.js → needle-engine.bundle-CjTSG0lx.js} +3537 -3462
  10. package/dist/{needle-engine.bundle-Dsfd8BPk.umd.cjs → needle-engine.bundle-Xc_PaDid.umd.cjs} +131 -136
  11. package/dist/needle-engine.d.ts +18189 -1
  12. package/dist/needle-engine.js +336 -335
  13. package/dist/needle-engine.min.js +1 -1
  14. package/dist/needle-engine.umd.cjs +1 -1
  15. package/dist/{postprocessing-CJC0Npcd.js → postprocessing-BTW9pD_s.js} +1822 -1723
  16. package/dist/{postprocessing-DrM4PWU3.umd.cjs → postprocessing-CMgoN5t5.umd.cjs} +229 -158
  17. package/dist/{postprocessing-l7zsdO_Q.min.js → postprocessing-DYDtB188.min.js} +227 -156
  18. package/dist/rapier-B3oL1ap-.js +5217 -0
  19. package/dist/rapier-DJ-luMxr.min.js +1 -0
  20. package/dist/rapier-DQltNJbN.umd.cjs +1 -0
  21. package/dist/{three-BDW9I486.min.js → three-B7CT31Bt.min.js} +1 -5
  22. package/dist/{three-MHVqtJYj.js → three-DfMvBzXi.js} +0 -5
  23. package/dist/{three-examples-CgwGHSgz.umd.cjs → three-examples-CsW4_6LI.umd.cjs} +2 -7
  24. package/dist/{three-examples-fvEPSC8L.min.js → three-examples-D1P7eEhn.min.js} +2 -7
  25. package/dist/{three-examples-C5Ht-QFN.js → three-examples-D1SK93ek.js} +1 -7
  26. package/dist/{three-mesh-ui-BjWTTk1R.js → three-mesh-ui-C_uSB5dD.js} +1 -1
  27. package/dist/{three-mesh-ui-Bm32sS2a.umd.cjs → three-mesh-ui-DpATDXwU.umd.cjs} +1 -1
  28. package/dist/{three-mesh-ui-CLdkp21K.min.js → three-mesh-ui-LQ44s0AL.min.js} +1 -1
  29. package/dist/{three-iFaDq9U3.umd.cjs → three-qj71I7J3.umd.cjs} +2 -6
  30. package/dist/{vendor-CsyK1CFs.min.js → vendor-BKGa4GE0.min.js} +34 -39
  31. package/dist/{vendor-petGQl0N.js → vendor-D0zoswDa.js} +1626 -1605
  32. package/dist/{vendor-6kAXU6fm.umd.cjs → vendor-UCpFAwt1.umd.cjs} +30 -35
  33. package/lib/engine/debug/debug_spector.d.ts +16 -0
  34. package/lib/engine/debug/debug_spector.js +28 -0
  35. package/lib/engine/debug/debug_spector.js.map +1 -0
  36. package/lib/engine/engine_application.d.ts +7 -0
  37. package/lib/engine/engine_application.js +8 -1
  38. package/lib/engine/engine_application.js.map +1 -1
  39. package/lib/engine/engine_assetdatabase.d.ts +0 -6
  40. package/lib/engine/engine_assetdatabase.js +0 -15
  41. package/lib/engine/engine_assetdatabase.js.map +1 -1
  42. package/lib/engine/engine_context.d.ts +1 -0
  43. package/lib/engine/engine_context.js +5 -2
  44. package/lib/engine/engine_context.js.map +1 -1
  45. package/lib/engine/engine_loaders.js +24 -25
  46. package/lib/engine/engine_loaders.js.map +1 -1
  47. package/lib/engine/engine_physics.js +6 -2
  48. package/lib/engine/engine_physics.js.map +1 -1
  49. package/lib/engine/engine_physics_rapier.d.ts +11 -2
  50. package/lib/engine/engine_physics_rapier.js +9 -0
  51. package/lib/engine/engine_physics_rapier.js.map +1 -1
  52. package/lib/engine/engine_texture.d.ts +1 -1
  53. package/lib/engine/engine_tonemapping.d.ts +1 -1
  54. package/lib/engine/engine_types.d.ts +16 -0
  55. package/lib/engine/engine_typestore.d.ts +1 -0
  56. package/lib/engine/engine_typestore.js +5 -6
  57. package/lib/engine/engine_typestore.js.map +1 -1
  58. package/lib/engine/webcomponents/logo-element.d.ts +11 -0
  59. package/lib/engine/webcomponents/logo-element.js +6 -0
  60. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  61. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +24 -3
  62. package/lib/engine/webcomponents/needle menu/needle-menu.js +18 -3
  63. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  64. package/lib/engine/webcomponents/needle-button.d.ts +5 -0
  65. package/lib/engine/webcomponents/needle-button.js.map +1 -1
  66. package/lib/engine/webcomponents/needle-engine.attributes.d.ts +11 -2
  67. package/lib/engine/webcomponents/needle-engine.d.ts +162 -8
  68. package/lib/engine/webcomponents/needle-engine.js +45 -7
  69. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  70. package/lib/engine-components/AlignmentConstraint.d.ts +9 -0
  71. package/lib/engine-components/AlignmentConstraint.js +9 -0
  72. package/lib/engine-components/AlignmentConstraint.js.map +1 -1
  73. package/lib/engine-components/Animator.d.ts +1 -0
  74. package/lib/engine-components/Animator.js.map +1 -1
  75. package/lib/engine-components/AudioListener.d.ts +2 -0
  76. package/lib/engine-components/AudioListener.js +2 -0
  77. package/lib/engine-components/AudioListener.js.map +1 -1
  78. package/lib/engine-components/AudioSource.d.ts +1 -0
  79. package/lib/engine-components/AudioSource.js +1 -0
  80. package/lib/engine-components/AudioSource.js.map +1 -1
  81. package/lib/engine-components/AxesHelper.d.ts +2 -0
  82. package/lib/engine-components/AxesHelper.js +2 -0
  83. package/lib/engine-components/AxesHelper.js.map +1 -1
  84. package/lib/engine-components/Camera.d.ts +1 -0
  85. package/lib/engine-components/Camera.js +1 -0
  86. package/lib/engine-components/Camera.js.map +1 -1
  87. package/lib/engine-components/CharacterController.d.ts +4 -1
  88. package/lib/engine-components/CharacterController.js +4 -1
  89. package/lib/engine-components/CharacterController.js.map +1 -1
  90. package/lib/engine-components/Component.d.ts +5 -0
  91. package/lib/engine-components/Component.js +7 -0
  92. package/lib/engine-components/Component.js.map +1 -1
  93. package/lib/engine-components/DeleteBox.d.ts +2 -0
  94. package/lib/engine-components/DeleteBox.js +2 -0
  95. package/lib/engine-components/DeleteBox.js.map +1 -1
  96. package/lib/engine-components/DeviceFlag.d.ts +4 -0
  97. package/lib/engine-components/DeviceFlag.js +4 -0
  98. package/lib/engine-components/DeviceFlag.js.map +1 -1
  99. package/lib/engine-components/DragControls.d.ts +1 -0
  100. package/lib/engine-components/DragControls.js +1 -0
  101. package/lib/engine-components/DragControls.js.map +1 -1
  102. package/lib/engine-components/DropListener.d.ts +1 -0
  103. package/lib/engine-components/DropListener.js +1 -0
  104. package/lib/engine-components/DropListener.js.map +1 -1
  105. package/lib/engine-components/Duplicatable.d.ts +1 -0
  106. package/lib/engine-components/Duplicatable.js +1 -0
  107. package/lib/engine-components/Duplicatable.js.map +1 -1
  108. package/lib/engine-components/EventTrigger.d.ts +2 -0
  109. package/lib/engine-components/EventTrigger.js +2 -0
  110. package/lib/engine-components/EventTrigger.js.map +1 -1
  111. package/lib/engine-components/GridHelper.d.ts +2 -0
  112. package/lib/engine-components/GridHelper.js +2 -0
  113. package/lib/engine-components/GridHelper.js.map +1 -1
  114. package/lib/engine-components/GroundProjection.d.ts +1 -0
  115. package/lib/engine-components/GroundProjection.js +1 -0
  116. package/lib/engine-components/GroundProjection.js.map +1 -1
  117. package/lib/engine-components/LODGroup.d.ts +2 -0
  118. package/lib/engine-components/LODGroup.js +2 -0
  119. package/lib/engine-components/LODGroup.js.map +1 -1
  120. package/lib/engine-components/Light.d.ts +1 -0
  121. package/lib/engine-components/Light.js +1 -0
  122. package/lib/engine-components/Light.js.map +1 -1
  123. package/lib/engine-components/LookAtConstraint.d.ts +1 -0
  124. package/lib/engine-components/LookAtConstraint.js +1 -0
  125. package/lib/engine-components/LookAtConstraint.js.map +1 -1
  126. package/lib/engine-components/NeedleMenu.d.ts +1 -0
  127. package/lib/engine-components/NeedleMenu.js +1 -0
  128. package/lib/engine-components/NeedleMenu.js.map +1 -1
  129. package/lib/engine-components/NestedGltf.d.ts +1 -0
  130. package/lib/engine-components/NestedGltf.js +1 -0
  131. package/lib/engine-components/NestedGltf.js.map +1 -1
  132. package/lib/engine-components/Networking.d.ts +1 -0
  133. package/lib/engine-components/Networking.js +1 -0
  134. package/lib/engine-components/Networking.js.map +1 -1
  135. package/lib/engine-components/OffsetConstraint.d.ts +7 -0
  136. package/lib/engine-components/OffsetConstraint.js +7 -0
  137. package/lib/engine-components/OffsetConstraint.js.map +1 -1
  138. package/lib/engine-components/OrbitControls.d.ts +1 -0
  139. package/lib/engine-components/OrbitControls.js +1 -0
  140. package/lib/engine-components/OrbitControls.js.map +1 -1
  141. package/lib/engine-components/PlayerColor.d.ts +2 -0
  142. package/lib/engine-components/PlayerColor.js +2 -0
  143. package/lib/engine-components/PlayerColor.js.map +1 -1
  144. package/lib/engine-components/ReflectionProbe.d.ts +1 -0
  145. package/lib/engine-components/ReflectionProbe.js +1 -0
  146. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  147. package/lib/engine-components/RendererInstancing.d.ts +5 -3
  148. package/lib/engine-components/RendererInstancing.js +64 -31
  149. package/lib/engine-components/RendererInstancing.js.map +1 -1
  150. package/lib/engine-components/RigidBody.d.ts +1 -0
  151. package/lib/engine-components/RigidBody.js +1 -0
  152. package/lib/engine-components/RigidBody.js.map +1 -1
  153. package/lib/engine-components/SceneSwitcher.d.ts +1 -0
  154. package/lib/engine-components/SceneSwitcher.js +1 -0
  155. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  156. package/lib/engine-components/ScreenCapture.d.ts +1 -0
  157. package/lib/engine-components/ScreenCapture.js +1 -0
  158. package/lib/engine-components/ScreenCapture.js.map +1 -1
  159. package/lib/engine-components/SeeThrough.d.ts +1 -0
  160. package/lib/engine-components/SeeThrough.js +1 -0
  161. package/lib/engine-components/SeeThrough.js.map +1 -1
  162. package/lib/engine-components/ShadowCatcher.d.ts +2 -0
  163. package/lib/engine-components/ShadowCatcher.js +2 -0
  164. package/lib/engine-components/ShadowCatcher.js.map +1 -1
  165. package/lib/engine-components/Skybox.d.ts +1 -0
  166. package/lib/engine-components/Skybox.js +1 -0
  167. package/lib/engine-components/Skybox.js.map +1 -1
  168. package/lib/engine-components/SmoothFollow.d.ts +1 -0
  169. package/lib/engine-components/SmoothFollow.js +1 -0
  170. package/lib/engine-components/SmoothFollow.js.map +1 -1
  171. package/lib/engine-components/SpatialTrigger.d.ts +1 -0
  172. package/lib/engine-components/SpatialTrigger.js +1 -0
  173. package/lib/engine-components/SpatialTrigger.js.map +1 -1
  174. package/lib/engine-components/SpectatorCamera.d.ts +1 -0
  175. package/lib/engine-components/SpectatorCamera.js +1 -0
  176. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  177. package/lib/engine-components/SpriteRenderer.d.ts +1 -0
  178. package/lib/engine-components/SpriteRenderer.js +1 -0
  179. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  180. package/lib/engine-components/SyncedCamera.d.ts +2 -0
  181. package/lib/engine-components/SyncedCamera.js +2 -0
  182. package/lib/engine-components/SyncedCamera.js.map +1 -1
  183. package/lib/engine-components/SyncedRoom.d.ts +1 -0
  184. package/lib/engine-components/SyncedRoom.js +1 -0
  185. package/lib/engine-components/SyncedRoom.js.map +1 -1
  186. package/lib/engine-components/SyncedTransform.d.ts +2 -0
  187. package/lib/engine-components/SyncedTransform.js +2 -0
  188. package/lib/engine-components/SyncedTransform.js.map +1 -1
  189. package/lib/engine-components/TransformGizmo.d.ts +2 -0
  190. package/lib/engine-components/TransformGizmo.js +2 -0
  191. package/lib/engine-components/TransformGizmo.js.map +1 -1
  192. package/lib/engine-components/VideoPlayer.d.ts +1 -0
  193. package/lib/engine-components/VideoPlayer.js +1 -0
  194. package/lib/engine-components/VideoPlayer.js.map +1 -1
  195. package/lib/engine-components/Voip.d.ts +1 -0
  196. package/lib/engine-components/Voip.js +1 -0
  197. package/lib/engine-components/Voip.js.map +1 -1
  198. package/lib/engine-components/export/usdz/USDZExporter.d.ts +24 -3
  199. package/lib/engine-components/export/usdz/USDZExporter.js +36 -2
  200. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  201. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +18 -0
  202. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +18 -0
  203. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -1
  204. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +1 -0
  205. package/lib/engine-components/particlesystem/ParticleSystem.js +1 -0
  206. package/lib/engine-components/particlesystem/ParticleSystem.js.map +1 -1
  207. package/lib/engine-components/physics/Attractor.d.ts +3 -0
  208. package/lib/engine-components/physics/Attractor.js +3 -0
  209. package/lib/engine-components/physics/Attractor.js.map +1 -1
  210. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +1 -0
  211. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +1 -0
  212. package/lib/engine-components/postprocessing/Effects/BloomEffect.js.map +1 -1
  213. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +4 -0
  214. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +4 -0
  215. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js.map +1 -1
  216. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +3 -0
  217. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +3 -0
  218. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
  219. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +4 -0
  220. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +4 -0
  221. package/lib/engine-components/postprocessing/Effects/DepthOfField.js.map +1 -1
  222. package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +1 -0
  223. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +1 -0
  224. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js.map +1 -1
  225. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +3 -0
  226. package/lib/engine-components/postprocessing/Effects/Pixelation.js +3 -0
  227. package/lib/engine-components/postprocessing/Effects/Pixelation.js.map +1 -1
  228. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +4 -0
  229. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +4 -0
  230. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js.map +1 -1
  231. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +4 -0
  232. package/lib/engine-components/postprocessing/Effects/Sharpening.js +4 -0
  233. package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
  234. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +4 -0
  235. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +4 -0
  236. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js.map +1 -1
  237. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +4 -0
  238. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +4 -0
  239. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  240. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +4 -0
  241. package/lib/engine-components/postprocessing/Effects/Vignette.js +4 -0
  242. package/lib/engine-components/postprocessing/Effects/Vignette.js.map +1 -1
  243. package/lib/engine-components/postprocessing/Volume.d.ts +1 -0
  244. package/lib/engine-components/postprocessing/Volume.js +1 -0
  245. package/lib/engine-components/postprocessing/Volume.js.map +1 -1
  246. package/lib/engine-components/splines/Spline.d.ts +1 -0
  247. package/lib/engine-components/splines/Spline.js +1 -0
  248. package/lib/engine-components/splines/Spline.js.map +1 -1
  249. package/lib/engine-components/splines/SplineWalker.d.ts +1 -0
  250. package/lib/engine-components/splines/SplineWalker.js +1 -0
  251. package/lib/engine-components/splines/SplineWalker.js.map +1 -1
  252. package/lib/engine-components/timeline/PlayableDirector.d.ts +1 -0
  253. package/lib/engine-components/timeline/PlayableDirector.js +1 -0
  254. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  255. package/lib/engine-components/timeline/SignalAsset.d.ts +1 -0
  256. package/lib/engine-components/timeline/SignalAsset.js +1 -0
  257. package/lib/engine-components/timeline/SignalAsset.js.map +1 -1
  258. package/lib/engine-components/ui/Button.d.ts +4 -0
  259. package/lib/engine-components/ui/Button.js +4 -0
  260. package/lib/engine-components/ui/Button.js.map +1 -1
  261. package/lib/engine-components/ui/Canvas.d.ts +5 -0
  262. package/lib/engine-components/ui/Canvas.js +5 -0
  263. package/lib/engine-components/ui/Canvas.js.map +1 -1
  264. package/lib/engine-components/ui/CanvasGroup.d.ts +4 -0
  265. package/lib/engine-components/ui/CanvasGroup.js +4 -0
  266. package/lib/engine-components/ui/CanvasGroup.js.map +1 -1
  267. package/lib/engine-components/ui/EventSystem.d.ts +2 -0
  268. package/lib/engine-components/ui/EventSystem.js +2 -0
  269. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  270. package/lib/engine-components/ui/Image.d.ts +4 -0
  271. package/lib/engine-components/ui/Image.js +4 -0
  272. package/lib/engine-components/ui/Image.js.map +1 -1
  273. package/lib/engine-components/ui/InputField.d.ts +4 -0
  274. package/lib/engine-components/ui/InputField.js +4 -0
  275. package/lib/engine-components/ui/InputField.js.map +1 -1
  276. package/lib/engine-components/ui/Outline.d.ts +7 -0
  277. package/lib/engine-components/ui/Outline.js +7 -0
  278. package/lib/engine-components/ui/Outline.js.map +1 -1
  279. package/lib/engine-components/ui/Text.d.ts +1 -0
  280. package/lib/engine-components/ui/Text.js +1 -0
  281. package/lib/engine-components/ui/Text.js.map +1 -1
  282. package/lib/engine-components/utils/LookAt.d.ts +1 -0
  283. package/lib/engine-components/utils/LookAt.js +1 -0
  284. package/lib/engine-components/utils/LookAt.js.map +1 -1
  285. package/lib/engine-components/web/Clickthrough.d.ts +1 -1
  286. package/lib/engine-components/web/Clickthrough.js +1 -1
  287. package/lib/engine-components/web/CursorFollow.d.ts +2 -0
  288. package/lib/engine-components/web/CursorFollow.js +3 -0
  289. package/lib/engine-components/web/CursorFollow.js.map +1 -1
  290. package/lib/engine-components/web/HoverAnimation.d.ts +1 -0
  291. package/lib/engine-components/web/HoverAnimation.js +1 -0
  292. package/lib/engine-components/web/HoverAnimation.js.map +1 -1
  293. package/lib/engine-components/web/ScrollFollow.d.ts +2 -0
  294. package/lib/engine-components/web/ScrollFollow.js +2 -0
  295. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  296. package/lib/engine-components/web/ViewBox.d.ts +1 -0
  297. package/lib/engine-components/web/ViewBox.js +1 -0
  298. package/lib/engine-components/web/ViewBox.js.map +1 -1
  299. package/lib/engine-components/webxr/Avatar.d.ts +5 -0
  300. package/lib/engine-components/webxr/Avatar.js +5 -0
  301. package/lib/engine-components/webxr/Avatar.js.map +1 -1
  302. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +1 -0
  303. package/lib/engine-components/webxr/WebARCameraBackground.js +1 -0
  304. package/lib/engine-components/webxr/WebARCameraBackground.js.map +1 -1
  305. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +1 -0
  306. package/lib/engine-components/webxr/WebARSessionRoot.js +1 -0
  307. package/lib/engine-components/webxr/WebARSessionRoot.js.map +1 -1
  308. package/lib/engine-components/webxr/WebXR.d.ts +1 -1
  309. package/lib/engine-components/webxr/WebXR.js +1 -1
  310. package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +1 -0
  311. package/lib/engine-components/webxr/controllers/XRControllerFollow.js +1 -0
  312. package/lib/engine-components/webxr/controllers/XRControllerFollow.js.map +1 -1
  313. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +4 -0
  314. package/lib/engine-components/webxr/controllers/XRControllerModel.js +4 -0
  315. package/lib/engine-components/webxr/controllers/XRControllerModel.js.map +1 -1
  316. package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +1 -0
  317. package/lib/engine-components/webxr/controllers/XRControllerMovement.js +1 -0
  318. package/lib/engine-components/webxr/controllers/XRControllerMovement.js.map +1 -1
  319. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +2 -0
  320. package/lib/engine-components-experimental/networking/PlayerSync.js +2 -0
  321. package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
  322. package/lib/needle-engine.js +2 -1
  323. package/lib/needle-engine.js.map +1 -1
  324. package/package.json +19 -12
  325. package/plugins/types/needleConfig.d.ts +1 -1
  326. package/plugins/types/next.d.ts +1 -1
  327. package/plugins/types/userconfig.d.ts +4 -1
  328. package/plugins/vite/custom-element-data.js +80 -0
  329. package/plugins/vite/index.js +4 -0
  330. package/src/engine/debug/debug_spector.ts +43 -0
  331. package/src/engine/engine_application.ts +16 -1
  332. package/src/engine/engine_assetdatabase.ts +0 -21
  333. package/src/engine/engine_context.ts +6 -2
  334. package/src/engine/engine_loaders.ts +24 -26
  335. package/src/engine/engine_physics.ts +6 -2
  336. package/src/engine/engine_physics_rapier.ts +11 -2
  337. package/src/engine/engine_texture.ts +1 -1
  338. package/src/engine/engine_tonemapping.ts +1 -1
  339. package/src/engine/engine_types.ts +17 -0
  340. package/src/engine/engine_typestore.ts +5 -6
  341. package/src/engine/webcomponents/logo-element.ts +12 -0
  342. package/src/engine/webcomponents/needle menu/needle-menu.ts +24 -3
  343. package/src/engine/webcomponents/needle-button.ts +6 -0
  344. package/src/engine/webcomponents/needle-engine.attributes.ts +12 -3
  345. package/src/engine/webcomponents/needle-engine.ts +172 -11
  346. package/src/engine-components/AlignmentConstraint.ts +9 -0
  347. package/src/engine-components/Animator.ts +1 -0
  348. package/src/engine-components/AudioListener.ts +2 -0
  349. package/src/engine-components/AudioSource.ts +1 -0
  350. package/src/engine-components/AxesHelper.ts +2 -0
  351. package/src/engine-components/Camera.ts +1 -0
  352. package/src/engine-components/CharacterController.ts +4 -1
  353. package/src/engine-components/Component.ts +9 -1
  354. package/src/engine-components/DeleteBox.ts +2 -0
  355. package/src/engine-components/DeviceFlag.ts +4 -0
  356. package/src/engine-components/DragControls.ts +1 -0
  357. package/src/engine-components/DropListener.ts +1 -0
  358. package/src/engine-components/Duplicatable.ts +1 -0
  359. package/src/engine-components/EventTrigger.ts +2 -0
  360. package/src/engine-components/GridHelper.ts +2 -0
  361. package/src/engine-components/GroundProjection.ts +1 -0
  362. package/src/engine-components/LODGroup.ts +2 -0
  363. package/src/engine-components/Light.ts +1 -0
  364. package/src/engine-components/LookAtConstraint.ts +1 -0
  365. package/src/engine-components/NeedleMenu.ts +1 -0
  366. package/src/engine-components/NestedGltf.ts +1 -0
  367. package/src/engine-components/Networking.ts +1 -0
  368. package/src/engine-components/OffsetConstraint.ts +7 -0
  369. package/src/engine-components/OrbitControls.ts +1 -0
  370. package/src/engine-components/PlayerColor.ts +2 -0
  371. package/src/engine-components/ReflectionProbe.ts +1 -0
  372. package/src/engine-components/RendererInstancing.ts +69 -33
  373. package/src/engine-components/RigidBody.ts +1 -0
  374. package/src/engine-components/SceneSwitcher.ts +1 -0
  375. package/src/engine-components/ScreenCapture.ts +1 -0
  376. package/src/engine-components/SeeThrough.ts +1 -0
  377. package/src/engine-components/ShadowCatcher.ts +2 -0
  378. package/src/engine-components/Skybox.ts +2 -1
  379. package/src/engine-components/SmoothFollow.ts +1 -0
  380. package/src/engine-components/SpatialTrigger.ts +1 -0
  381. package/src/engine-components/SpectatorCamera.ts +1 -0
  382. package/src/engine-components/SpriteRenderer.ts +1 -0
  383. package/src/engine-components/SyncedCamera.ts +2 -0
  384. package/src/engine-components/SyncedRoom.ts +1 -0
  385. package/src/engine-components/SyncedTransform.ts +2 -0
  386. package/src/engine-components/TransformGizmo.ts +2 -0
  387. package/src/engine-components/VideoPlayer.ts +1 -0
  388. package/src/engine-components/Voip.ts +1 -0
  389. package/src/engine-components/export/usdz/USDZExporter.ts +52 -5
  390. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +18 -0
  391. package/src/engine-components/particlesystem/ParticleSystem.ts +1 -0
  392. package/src/engine-components/physics/Attractor.ts +3 -0
  393. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +1 -0
  394. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +4 -0
  395. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +3 -0
  396. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +4 -0
  397. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +1 -0
  398. package/src/engine-components/postprocessing/Effects/Pixelation.ts +3 -0
  399. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +4 -0
  400. package/src/engine-components/postprocessing/Effects/Sharpening.ts +4 -0
  401. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +4 -0
  402. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +4 -0
  403. package/src/engine-components/postprocessing/Effects/Vignette.ts +4 -0
  404. package/src/engine-components/postprocessing/Volume.ts +1 -0
  405. package/src/engine-components/splines/Spline.ts +1 -0
  406. package/src/engine-components/splines/SplineWalker.ts +1 -0
  407. package/src/engine-components/timeline/PlayableDirector.ts +1 -0
  408. package/src/engine-components/timeline/SignalAsset.ts +1 -0
  409. package/src/engine-components/ui/Button.ts +4 -0
  410. package/src/engine-components/ui/Canvas.ts +5 -0
  411. package/src/engine-components/ui/CanvasGroup.ts +4 -0
  412. package/src/engine-components/ui/EventSystem.ts +2 -0
  413. package/src/engine-components/ui/Image.ts +4 -0
  414. package/src/engine-components/ui/InputField.ts +4 -0
  415. package/src/engine-components/ui/Outline.ts +7 -0
  416. package/src/engine-components/ui/Text.ts +1 -0
  417. package/src/engine-components/utils/LookAt.ts +1 -0
  418. package/src/engine-components/web/Clickthrough.ts +1 -1
  419. package/src/engine-components/web/CursorFollow.ts +4 -0
  420. package/src/engine-components/web/HoverAnimation.ts +1 -0
  421. package/src/engine-components/web/ScrollFollow.ts +2 -0
  422. package/src/engine-components/web/ViewBox.ts +1 -0
  423. package/src/engine-components/webxr/Avatar.ts +5 -0
  424. package/src/engine-components/webxr/WebARCameraBackground.ts +1 -0
  425. package/src/engine-components/webxr/WebARSessionRoot.ts +1 -0
  426. package/src/engine-components/webxr/WebXR.ts +1 -1
  427. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +1 -0
  428. package/src/engine-components/webxr/controllers/XRControllerModel.ts +4 -0
  429. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +1 -0
  430. package/src/engine-components-experimental/networking/PlayerSync.ts +2 -0
  431. package/src/needle-engine.ts +4 -2
  432. package/dist/generateMeshBVH.worker-B9bjdr6J.js +0 -25
  433. package/dist/loader.worker-CiTwpNPW.js +0 -27
  434. package/dist/rapier-BqdcSmKY.umd.cjs +0 -1
  435. package/dist/rapier-Cg3w3nFI.min.js +0 -1
  436. package/dist/rapier-sU12SWAs.js +0 -5217
@@ -40,6 +40,8 @@ declare class LODSetting {
40
40
 
41
41
  /**
42
42
  * LODGroup allows to create a group of LOD levels for an object.
43
+ *
44
+ * @summary Level of Detail (LOD) Group Component
43
45
  * @category Rendering
44
46
  * @group Components
45
47
  */
@@ -75,6 +75,7 @@ enum LightShadows {
75
75
  * Debug mode can be enabled with the URL parameter `?debuglights`, which shows
76
76
  * additional console output and visual helpers for lights.
77
77
  *
78
+ * @summary Light component for various light types and shadow settings
78
79
  * @category Rendering
79
80
  * @group Components
80
81
  */
@@ -8,6 +8,7 @@ import type { OrbitControls } from "./OrbitControls.js";
8
8
  * A LookAtConstraint is used by OrbitControls to make the camera look at a target.
9
9
  * This component is used by {@link OrbitControls} internally.
10
10
  *
11
+ * @summary Look At Constraint for OrbitControls
11
12
  * @category Camera Controls
12
13
  * @group Components
13
14
  */
@@ -10,6 +10,7 @@ import { Behaviour } from './Component.js';
10
10
  * Controls display options, button visibility, and menu positioning.
11
11
  * From code, you can access the menu via {@link Context.menu}.
12
12
  *
13
+ * @summary Configuration component for the Needle Menu
13
14
  * @category User Interface
14
15
  * @group Components
15
16
  **/
@@ -11,6 +11,7 @@ const debug = getParam("debugnestedgltf");
11
11
  /** The nested gltf is a component that is used to load a gltf file when the component becomes active (start)
12
12
  * It will load the gltf file and instantiate it as a child of the parent of the GameObject that has this component
13
13
  *
14
+ * @summary Loads and instantiates a nested glTF file
14
15
  * @category Asset Management
15
16
  * @group Components
16
17
  */
@@ -11,6 +11,7 @@ const debug = getParam("debugnet");
11
11
  * This component supplies websocket URLs for establishing connections.
12
12
  * It implements the {@link INetworkingWebsocketUrlProvider} interface.
13
13
  *
14
+ * @summary Networking configuration component
14
15
  * @category Networking
15
16
  * @group Components
16
17
  */
@@ -4,6 +4,13 @@ import { serializable } from "../engine/engine_serialization_decorator.js";
4
4
  import * as utils from "./../engine/engine_three_utils.js";
5
5
  import { Behaviour, GameObject } from "./Component.js";
6
6
 
7
+ /**
8
+ * OffsetConstraint component allows an object to maintain a specified positional and rotational offset
9
+ * relative to another object, with options for alignment and leveling.
10
+ * @summary Maintains positional and rotational offset relative to another object
11
+ * @category Constraints
12
+ * @group Components
13
+ */
7
14
  export class OffsetConstraint extends Behaviour {
8
15
 
9
16
  @serializable(GameObject)
@@ -63,6 +63,7 @@ declare module 'three/examples/jsm/controls/OrbitControls.js' {
63
63
  /** The OrbitControls component is used to control a camera using the [OrbitControls from three.js](https://threejs.org/docs/#examples/en/controls/OrbitControls) library.
64
64
  * The three OrbitControls object can be accessed via the `controls` property.
65
65
  * The object being controlled by the OrbitControls (usually the camera) can be accessed via the `controllerObject` property.
66
+ * @summary Camera controller using three.js OrbitControls
66
67
  * @category Camera
67
68
  * @group Components
68
69
  */
@@ -9,6 +9,8 @@ import { AvatarMarker } from "./webxr/WebXRAvatar.js";
9
9
  /**
10
10
  * PlayerColor assigns a unique color for each user in the room to the object it is attached to.
11
11
  * The color is generated based on the user's ID.
12
+ *
13
+ * @summary Assigns a unique color to the player object
12
14
  * @category Networking
13
15
  * @group Components
14
16
  */
@@ -19,6 +19,7 @@ const $originalMaterial = Symbol("original material");
19
19
  *
20
20
  * - Sample: http://samples.needle.tools/reflection-probes
21
21
  *
22
+ * @summary Provides reflection data to materials
22
23
  * @category Rendering
23
24
  * @group Components
24
25
  */
@@ -29,8 +29,9 @@ export class InstancingHandler {
29
29
  * (The instancing mesh renderer will grow x2 if the max instance count is reached)
30
30
  * @default 4
31
31
  * @returns The initial instance count
32
- * */
33
- static getStartInstanceCount = (_obj: Object3D) => {
32
+ */
33
+ // @ts-ignore (ignore the unused parameter warning)
34
+ static getStartInstanceCount = (obj: Object3D) => {
34
35
  return 4;
35
36
  };
36
37
 
@@ -45,20 +46,24 @@ export class InstancingHandler {
45
46
  if (res) {
46
47
  if (handlesArray === null) handlesArray = [];
47
48
  handlesArray.push(res);
48
- // load texture lods
49
- NEEDLE_progressive.assignTextureLOD(res.renderer.material, 0);
50
-
51
- // Load mesh lods
52
- // TODO: technically for multi meshes we do this work multiple times (we search for meshes in children and then use the renderer sharedMeshes... that doesnt make sense)
53
- for (let i = 0; i < renderer.sharedMeshes.length; i++) {
54
- const mesh = renderer.sharedMeshes[i];
55
- const geometry = mesh.geometry;
56
- NEEDLE_progressive.assignMeshLOD(mesh, 0).then(lod => {
57
- if (lod && renderer.activeAndEnabled && geometry != lod) {
58
- res.setGeometry(lod);
59
- }
60
- });
49
+
50
+ // Load LOD for textures
51
+ const mat = res.object.material;
52
+ if(Array.isArray(mat)) {
53
+ mat.forEach(m => NEEDLE_progressive.assignTextureLOD(m, 0));
54
+ }
55
+ else {
56
+ NEEDLE_progressive.assignTextureLOD(mat, 0);
61
57
  }
58
+
59
+ // Load LOD for geometry
60
+ const mesh = res.object;
61
+ const geometry = mesh.geometry;
62
+ NEEDLE_progressive.assignMeshLOD(mesh, 0).then(lod => {
63
+ if (lod && geometry != lod) {
64
+ res.setGeometry(lod);
65
+ }
66
+ });
62
67
  }
63
68
 
64
69
  else if (level <= 0 && obj.type !== "Mesh") {
@@ -349,7 +354,7 @@ class InstancedMeshRenderer {
349
354
  private _context: Context;
350
355
  private _batchedMesh: BatchedMesh;
351
356
  private _handles: (InstanceHandle | null)[] = [];
352
- private readonly _geometryIds: Map<BufferGeometry, number> = new Map();
357
+ private _geometryIds = new WeakMap<BufferGeometry, number>();
353
358
  private _maxInstanceCount: number;
354
359
 
355
360
  private _currentInstanceCount = 0;
@@ -439,6 +444,10 @@ class InstancedMeshRenderer {
439
444
  private _needUpdateBounds: boolean = false;
440
445
  private _debugMaterial: MeshStandardMaterial | null = null;
441
446
 
447
+ private getBatchedMeshName() {
448
+ return this.name ? `${this.name} (BatchedMesh)` : "BatchedMesh";
449
+ }
450
+
442
451
  constructor(name: string, geo: BufferGeometry, material: Material, initialMaxCount: number, context: Context) {
443
452
  this.name = name;
444
453
  this.geometry = geo;
@@ -452,6 +461,7 @@ class InstancedMeshRenderer {
452
461
  this._maxVertexCount = estimate.vertexCount;
453
462
  this._maxIndexCount = estimate.indexCount;
454
463
  this._batchedMesh = new BatchedMesh(this._maxInstanceCount, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
464
+ this._batchedMesh.name = this.getBatchedMeshName();
455
465
  // this.inst = new InstancedMesh(geo, material, count);
456
466
  this._batchedMesh[$instancingAutoUpdateBounds] = true;
457
467
  // this.inst.count = 0;
@@ -475,7 +485,7 @@ class InstancedMeshRenderer {
475
485
  context.post_render_callbacks.push(this.onAfterRender);
476
486
 
477
487
  if (debugInstancing) {
478
- console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for \"${name}\"`)
488
+ console.log(`Instanced renderer (${this.name}) created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for \"${name}\"`)
479
489
  }
480
490
  }
481
491
 
@@ -522,7 +532,8 @@ class InstancedMeshRenderer {
522
532
  return false;
523
533
  }
524
534
 
525
- if (this.mustGrow(geo)) {
535
+ const newInstanceCount = this._currentInstanceCount + 1;
536
+ if (newInstanceCount > this._maxInstanceCount || this.mustGrow(geo)) {
526
537
  if (this.allowResize) {
527
538
  this.grow(geo);
528
539
  }
@@ -644,34 +655,42 @@ class InstancedMeshRenderer {
644
655
  private mustGrow(geo?: BufferGeometry): boolean {
645
656
  if (this.count >= this._maxInstanceCount) return true;
646
657
  if (!geo || !geo.attributes) return false;
658
+
659
+ const isKnownGeometry = this._geometryIds.has(geo);
660
+ if (isKnownGeometry) return false;
661
+
647
662
  const meshInfo = getMeshInformation(geo);
648
663
  const newVertexCount = meshInfo.vertexCount;
649
664
  const newIndexCount = meshInfo.indexCount;
650
665
  return this._currentVertexCount + newVertexCount > this._maxVertexCount || this._currentIndexCount + newIndexCount > this._maxIndexCount;
651
666
  }
652
667
 
668
+ private _growId = 0;
653
669
  private grow(geometry: BufferGeometry) {
670
+ const id = ++this._growId;
654
671
  const growFactor = 2;
655
672
  const newSize = Math.ceil(this._maxInstanceCount * growFactor);
656
673
 
657
674
  // create a new BatchedMesh instance
675
+ // TODO: we should keep track of how many instances for each geometry we have and consider that when estimating new space
658
676
  const estimatedSpace = this.tryEstimateVertexCountSize(newSize, [geometry]);// geometry.attributes.position.count;
659
677
  // const indices = geometry.index ? geometry.index.count : 0;
660
678
  const newMaxVertexCount = Math.max(this._maxVertexCount, estimatedSpace.vertexCount);
661
- const newMaxIndexCount = Math.max(this._maxIndexCount, estimatedSpace.indexCount, Math.ceil(this._maxVertexCount * growFactor));
679
+ const newMaxIndexCount = Math.max(this._maxIndexCount, estimatedSpace.indexCount);//, Math.ceil(this._maxVertexCount * growFactor));
662
680
 
663
681
  if (debugInstancing) {
664
682
  const geometryInfo = getMeshInformation(geometry);
665
- console.warn(`[Instancing] Growing Buffer\nMesh: \"${this.name}${geometry.name?.length ? "/" + geometry.name : ""}\"\n${geometryInfo.vertexCount} vertices, ${geometryInfo.indexCount} indices\nMax count ${this._maxInstanceCount} → ${newSize}\nMax vertex count ${this._maxVertexCount} -> ${newMaxVertexCount}\nMax index count ${this._maxIndexCount} -> ${newMaxIndexCount}`);
683
+ console.warn(`[Instancing] Growing Buffer\nMesh: \"${this.name}${geometry.name?.length ? "/" + geometry.name : ""}\" (${geometryInfo.vertexCount.toLocaleString()} vertices, ${geometryInfo.indexCount.toLocaleString()} indices)\nMax count ${this._maxInstanceCount.toLocaleString()} → ${newSize.toLocaleString()}\nMax vertex count ${this._maxVertexCount.toLocaleString()} -> ${newMaxVertexCount.toLocaleString()}\nMax index count ${this._maxIndexCount.toLocaleString()} -> ${newMaxIndexCount.toLocaleString()}`);
666
684
  this._debugMaterial = createDebugMaterial();
667
685
  }
668
686
  else if (isDevEnvironment()) {
669
- console.debug(`[Instancing] Growing Buffer\nMesh: \"${this.name}${geometry.name?.length ? "/" + geometry.name : ""}\"\nMax count ${this._maxInstanceCount} → ${newSize}\nMax vertex count ${this._maxVertexCount} -> ${newMaxVertexCount}\nMax index count ${this._maxIndexCount} -> ${newMaxIndexCount}`);
687
+ console.debug(`[Instancing] Growing Buffer\nMesh: \"${this.name}${geometry.name?.length ? "/" + geometry.name : ""}\"\nMax count ${this._maxInstanceCount} → ${newSize}\nMax vertex count ${this._maxVertexCount.toLocaleString()} -> ${newMaxVertexCount.toLocaleString()}\nMax index count ${this._maxIndexCount.toLocaleString()} -> ${newMaxIndexCount.toLocaleString()}`);
670
688
  }
671
689
 
672
690
  this._maxVertexCount = newMaxVertexCount;
673
691
  this._maxIndexCount = newMaxIndexCount;
674
692
  const newInst = new BatchedMesh(newSize, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
693
+ newInst.name = this.getBatchedMeshName();
675
694
  newInst.layers = this._batchedMesh.layers;
676
695
  newInst.castShadow = this._batchedMesh.castShadow;
677
696
  newInst.receiveShadow = this._batchedMesh.receiveShadow;
@@ -686,7 +705,7 @@ class InstancedMeshRenderer {
686
705
  // dispose the old batched mesh
687
706
  this._batchedMesh.dispose();
688
707
  this._batchedMesh.removeFromParent();
689
- this._geometryIds.clear();
708
+ this._geometryIds = new WeakMap<BufferGeometry, number>();
690
709
 
691
710
  this._batchedMesh = newInst;
692
711
  this._maxInstanceCount = newSize;
@@ -698,6 +717,11 @@ class InstancedMeshRenderer {
698
717
  const original = [...this._handles];
699
718
  this._handles = [];
700
719
  for (const handle of original) {
720
+ if (id !== this._growId) {
721
+ // another grow happened in the meantime
722
+ if (debugInstancing) console.warn("[Instancing] Aborting grow since another grow happened in the meantime");
723
+ return;
724
+ }
701
725
  if (handle && handle.__instanceIndex >= 0) {
702
726
  this.addGeometry(handle);
703
727
  this._handles[handle.__instanceIndex] = handle;
@@ -722,23 +746,31 @@ class InstancedMeshRenderer {
722
746
  entry.count += 1;
723
747
  }
724
748
 
749
+ if (_newGeometries && _newGeometries?.length > 0) {
750
+ const index = _newGeometries.indexOf(handle.object.geometry as BufferGeometry);
751
+ if (index !== -1) {
752
+ _newGeometries.splice(index, 1);
753
+ }
754
+ }
725
755
  }
726
756
  }
727
757
 
728
758
  // then calculate the total vertex count
729
759
  let totalVertices = 0;
730
760
  let totalIndices = 0;
761
+ let totalGeometries = 0;
731
762
  // let maxVertices = 0;
732
763
  for (const [_geo, data] of usedGeometries) {
733
- totalVertices += data.vertexCount * data.count;
734
- totalIndices += data.indexCount * data.count;
764
+ totalGeometries += 1;
765
+ totalVertices += data.vertexCount;
766
+ totalIndices += data.indexCount;
735
767
  // maxVertices = Math.max(maxVertices, geo.attributes.position.count * count);
736
768
  }
737
769
  // we calculate the average to make an educated guess of how many vertices will be needed with the new buffer count
738
- const averageVerts = Math.ceil(totalVertices / Math.max(1, this._currentInstanceCount));
739
- let maxVertexCount = averageVerts * newMaxInstances;
740
- const averageIndices = Math.ceil(totalIndices / Math.max(1, this._currentInstanceCount));
741
- let maxIndexCount = averageIndices * newMaxInstances * 2;
770
+ const averageVerts = Math.ceil(totalVertices / Math.max(1, totalGeometries));
771
+ let maxVertexCount = averageVerts * totalGeometries;
772
+ const averageIndices = Math.ceil(totalIndices / Math.max(1, totalGeometries));
773
+ let maxIndexCount = averageIndices * totalGeometries;
742
774
 
743
775
  // if new geometries are provided we *know* that they will be added
744
776
  // so we make sure to include them in the calculation
@@ -753,6 +785,10 @@ class InstancedMeshRenderer {
753
785
  }
754
786
  }
755
787
 
788
+ if (debugInstancing) {
789
+ console.log(`[Instancing] Estimated size for new buffer ${this.name}\nGeometries: ${totalGeometries} (New: ${_newGeometries?.length || 0})\nInstances: ${newMaxInstances}\nEstimated Vertices: ${maxVertexCount.toLocaleString()}\nEstimated Indices: ${maxIndexCount.toLocaleString()}`);
790
+ }
791
+
756
792
  return { vertexCount: maxVertexCount, indexCount: maxIndexCount };
757
793
  }
758
794
 
@@ -770,16 +806,16 @@ class InstancedMeshRenderer {
770
806
  let geometryId = this._geometryIds.get(geo);
771
807
  if (geometryId === undefined || geometryId === null) {
772
808
  if (debugInstancing)
773
- console.debug(`[Instancing] > ADD NEW GEOMETRY \"${handle.name} (${geo.name}; ${geo.uuid})\"\n${this._currentInstanceCount} instances, ${handle.maxVertexCount} max vertices, ${handle.maxIndexCount} max indices`);
809
+ console.warn(`[Instancing] > ADD NEW GEOMETRY \"${handle.name} (${geo.name}; ${geo.uuid})\"\nCurrent Instances: ${this._currentInstanceCount}\nMax Vertices: ${handle.maxVertexCount.toLocaleString()}\nMax Indices: ${handle.maxIndexCount.toLocaleString()}\nMax Triangles: ${(handle.maxIndexCount / 3).toLocaleString()}`);
774
810
 
775
811
  geometryId = this._batchedMesh.addGeometry(geo, handle.maxVertexCount, handle.maxIndexCount);
776
812
  this._geometryIds.set(geo, geometryId);
813
+ this._currentVertexCount += handle.maxVertexCount;
814
+ this._currentIndexCount += handle.maxIndexCount;
777
815
  }
778
816
  else {
779
817
  if (debugInstancing === "verbose") console.log(`[Instancing] > ADD INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances`);
780
818
  }
781
- this._currentVertexCount += handle.maxVertexCount;
782
- this._currentIndexCount += handle.maxIndexCount;
783
819
  const i = this._batchedMesh.addInstance(geometryId);
784
820
  handle.__geometryIndex = geometryId;
785
821
  handle.__instanceIndex = i;
@@ -787,7 +823,7 @@ class InstancedMeshRenderer {
787
823
  handle.__reservedIndexRange = handle.maxIndexCount;
788
824
  this._batchedMesh.setMatrixAt(i, handle.object.matrixWorld);
789
825
  if (debugInstancing)
790
- console.debug(`[Instancing] > ADDED INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
826
+ console.debug(`[Instancing] > ADDED INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}\nVertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()},\nIndices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()}`);
791
827
 
792
828
  }
793
829
 
@@ -803,7 +839,7 @@ class InstancedMeshRenderer {
803
839
  // this.inst.deleteGeometry(handle.__instanceIndex);
804
840
  // else
805
841
  // this._batchedMesh.setVisibleAt(handle.__instanceIndex, false);
806
- if(debugInstancing) {
842
+ if (debugInstancing) {
807
843
  console.debug(`[Instancing] < REMOVE INSTANCE \"${handle.name}\" at [${handle.__instanceIndex}]\nGEOMETRY_ID=${handle.__geometryIndex}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
808
844
  }
809
845
  this._batchedMesh.deleteInstance(handle.__instanceIndex);
@@ -140,6 +140,7 @@ class TransformWatch {
140
140
  * - Example: https://samples.needle.tools/physics-playground
141
141
  * - Example: https://samples.needle.tools/physics-&-animation
142
142
  *
143
+ * @summary Rigidbody for physical interactions
143
144
  * @category Physics
144
145
  * @group Components
145
146
  */
@@ -108,6 +108,7 @@ export interface ISceneEventListener {
108
108
  * });
109
109
  * ```
110
110
  *
111
+ * @summary Dynamically loads and switches between multiple scenes
111
112
  * @category Asset Management
112
113
  * @group Components
113
114
  */
@@ -70,6 +70,7 @@ export declare type ScreenCaptureOptions = {
70
70
  * By default the component will start sharing the screen when the user clicks on the object this component is attached to. You can set {@link device} This behaviour can be disabled by setting `allowStartOnClick` to false.
71
71
  * It is also possible to start the stream manually from your code by calling the {@link share} method.
72
72
  *
73
+ * @summary Share screen, camera or microphone in a networked room
73
74
  * @category Networking
74
75
  * @group Components
75
76
  */
@@ -40,6 +40,7 @@ let i = 0;
40
40
  *
41
41
  * - Example https://see-through-walls-z23hmxbz1kjfjn.needle.run/
42
42
  *
43
+ * @summary Makes objects fade out when obscuring a reference point from the camera
43
44
  * @category Rendering
44
45
  * @group Components
45
46
  */
@@ -22,6 +22,8 @@ enum ShadowMode {
22
22
  * If the GameObject is a Mesh, it will apply a shadow-catching material to it - otherwise it will create a quad with the shadow-catching material.
23
23
  *
24
24
  * Note that ShadowCatcher meshes are not raycastable by default; if you want them to be raycastable, change the layers in `onEnable()`.
25
+ *
26
+ * @summary Renders shadows or light on the object
25
27
  * @category Rendering
26
28
  * @group Components
27
29
  */
@@ -1,6 +1,6 @@
1
1
  import { CompressedCubeTexture, CubeTexture, CubeUVReflectionMapping, EquirectangularRefractionMapping, Texture } from "three"
2
- import { isDevEnvironment } from "../engine/debug/debug.js";
3
2
 
3
+ import { isDevEnvironment } from "../engine/debug/debug.js";
4
4
  import { ContextEvent, ContextRegistry } from "../engine/engine_context_registry.js";
5
5
  import { syncField } from "../engine/engine_networking_auto.js";
6
6
  import { loadPMREM } from "../engine/engine_pmrem.js";
@@ -143,6 +143,7 @@ ContextRegistry.registerCallback(ContextEvent.ContextCreationStart, () => {
143
143
  * skybox.setSkybox("https://example.com/skybox.hdr");
144
144
  * ```
145
145
  *
146
+ * @summary Sets the skybox or environment texture of a scene
146
147
  * @category Rendering
147
148
  * @group Components
148
149
  */
@@ -9,6 +9,7 @@ import { Behaviour } from "./Component.js";
9
9
  /**
10
10
  * SmoothFollow makes the {@link Object3D} (`GameObject`) smoothly follow another target {@link Object3D}.
11
11
  * It can follow the target's position, rotation, or both.
12
+ * @summary Smoothly follows a target object
12
13
  * @category Interactivity
13
14
  * @group Components
14
15
  */
@@ -26,6 +26,7 @@ function testMask(mask1, mask2) {
26
26
  /**
27
27
  * Component that receives and responds to spatial events, like entering or exiting a trigger zone.
28
28
  * Used in conjunction with {@link SpatialTrigger} to create interactive spatial events.
29
+ * @summary Receives spatial trigger events
29
30
  * @category Interactivity
30
31
  * @group Components
31
32
  */
@@ -35,6 +35,7 @@ const debug = getParam("debugspectator");
35
35
  *
36
36
  * Debug mode can be enabled with the URL parameter `?debugspectator`, which provides additional console output.
37
37
  *
38
+ * @summary Follow other users in a networked room
38
39
  * @category Networking
39
40
  * @group Components
40
41
  */
@@ -86,6 +86,7 @@ function updateTextureIfNecessary(tex: Texture) {
86
86
 
87
87
  /**
88
88
  * A sprite is a mesh that represents a 2D image. Used by the {@link SpriteRenderer} to render 2D images in the scene.
89
+ * @summary 2D image renderer
89
90
  * @category Rendering
90
91
  * @group Components
91
92
  */
@@ -63,6 +63,8 @@ declare type UserCamInfo = {
63
63
  /**
64
64
  * SyncedCamera is a component that syncs the camera position and rotation of all users in the room.
65
65
  * A prefab can be set to represent the remote cameras visually in the scene.
66
+ *
67
+ * @summary Syncs camera position and rotation of users in a networked room
66
68
  * @category Networking
67
69
  * @group Components
68
70
  */
@@ -33,6 +33,7 @@ const debug = utils.getParam("debugsyncedroom");
33
33
  * myObject.addComponent(SyncedRoom, { joinRandomRoom: true, roomPrefix: "myApp_" });
34
34
  * ```
35
35
  *
36
+ * @summary Joins a networked room based on URL parameters or a random room
36
37
  * @category Networking
37
38
  * @group Components
38
39
  */
@@ -57,6 +57,8 @@ onUpdate((ctx) => {
57
57
  /**
58
58
  * SyncedTransform synchronizes the position and rotation of a game object over the network.
59
59
  * It handles ownership transfer, interpolation, and network state updates automatically.
60
+ *
61
+ * @summary Synchronizes object transform over the network with ownership management
60
62
  * @category Networking
61
63
  * @group Components
62
64
  */
@@ -10,6 +10,8 @@ import { SyncedTransform } from "./SyncedTransform.js";
10
10
  /**
11
11
  * TransformGizmo displays manipulation controls for translating, rotating, and scaling objects in the scene.
12
12
  * It wraps three.js {@link TransformControls} and provides keyboard shortcuts for changing modes and settings.
13
+ *
14
+ * @summary Object manipulation gizmo for translating, rotating, and scaling
13
15
  * @category Helpers
14
16
  * @group Components
15
17
  */
@@ -54,6 +54,7 @@ export enum VideoRenderMode {
54
54
  * playOnAwake: true,
55
55
  * });
56
56
  * ```
57
+ * @summary Plays video clips from URLs or streams
57
58
  * @category Multimedia
58
59
  * @group Components
59
60
  */
@@ -14,6 +14,7 @@ const debugParam = getParam("debugvoip");
14
14
  /**
15
15
  * The Voice over IP component (VoIP) allows you to send and receive audio streams to other users in the same networked room.
16
16
  * It requires a networking connection to be working (e.g. by having an active SyncedRoom component in the scene or by connecting to a room manually).
17
+ * @summary Voice over IP (VoIP) for networked audio communication
17
18
  * @category Networking
18
19
  * @group Components
19
20
  */
@@ -1,5 +1,5 @@
1
1
  import { NEEDLE_progressive } from "@needle-tools/gltf-progressive";
2
- import { Euler, EventDispatcher, Matrix4, Mesh, Object3D, Quaternion, Vector3 } from "three";
2
+ import { Euler, Material, Matrix4, Mesh, Object3D, Quaternion, Vector3 } from "three";
3
3
 
4
4
  import { isDevEnvironment, showBalloonMessage, showBalloonWarning } from "../../../engine/debug/index.js";
5
5
  import { hasProLicense } from "../../../engine/engine_license.js";
@@ -53,6 +53,23 @@ export class CustomBranding {
53
53
  callToActionURL?: string;
54
54
  }
55
55
 
56
+ type BeforeLODExportArguments = {
57
+ readonly exporter: USDZExporter;
58
+ /** The type of LOD being exported, either a texture or a mesh */
59
+ readonly type: "texture" | "mesh";
60
+ /** The Renderer gameobject */
61
+ readonly object: Object3D;
62
+ /** The mesh being exported, if applicable */
63
+ readonly mesh?: Mesh;
64
+ /** The material being exported, if applicable */
65
+ readonly material?: Material;
66
+ /** By default LOD 0 will be exported (highest quality).
67
+ * Set to a different LOD level if needed.
68
+ * Set to -1 to disable LOD export and simply export the current version.
69
+ */
70
+ overrideLevel?: number;
71
+ }
72
+
56
73
  /**
57
74
  * Exports the current scene or a specific object as USDZ file and opens it in QuickLook on iOS/iPadOS/visionOS.
58
75
  * The USDZ file is generated using the Needle Engine ThreeUSDZExporter.
@@ -72,8 +89,12 @@ export class CustomBranding {
72
89
  */
73
90
  export class USDZExporter extends Behaviour {
74
91
 
75
- static readonly beforeExport = new EventList<{ exporter: USDZExporter }>();
76
- static readonly afterExport = new EventList<{ exporter: USDZExporter }>();
92
+ /** Called before the USDZ file is exported */
93
+ static readonly beforeExport = new EventList<{ readonly exporter: USDZExporter }>();
94
+ /** Called after the USDZ file has been exported */
95
+ static readonly afterExport = new EventList<{ readonly exporter: USDZExporter }>();
96
+ /** Called before LOD level are exported. Can be used to override the LOD export settings */
97
+ static readonly beforeLODExport = new EventList<BeforeLODExportArguments>();
77
98
 
78
99
  /**
79
100
  * Assign the object to export as USDZ file. If undefined or null, the whole scene will be exported.
@@ -329,7 +350,20 @@ export class USDZExporter extends Behaviour {
329
350
  for (const rend of renderers) {
330
351
  for (const mesh of rend.sharedMeshes) {
331
352
  if (mesh) {
332
- const task = NEEDLE_progressive.assignMeshLOD(mesh, 0);
353
+ let lodLevel = 0;
354
+ const args: BeforeLODExportArguments = { exporter: this, type: "mesh" as const, object: rend.gameObject, mesh: mesh, };
355
+ USDZExporter.beforeLODExport.invoke(args);
356
+ if (args.overrideLevel !== undefined) {
357
+ if (args.overrideLevel === -1) {
358
+ if (debug) console.warn("Skipping LOD export for mesh due to overrideLevel -1", rend.gameObject, mesh);
359
+ continue; // skip LOD assignment
360
+ }
361
+ else if (args.overrideLevel >= 0) {
362
+ lodLevel = args.overrideLevel;
363
+ if (debug) console.log("Overriding LOD level for mesh export to level " + lodLevel + " " + mesh.name);
364
+ }
365
+ }
366
+ const task = NEEDLE_progressive.assignMeshLOD(mesh, lodLevel);
333
367
  if (task instanceof Promise)
334
368
  progressiveLoading.push(new Promise<void>((resolve, reject) => {
335
369
  task.then(() => {
@@ -342,7 +376,20 @@ export class USDZExporter extends Behaviour {
342
376
  }
343
377
  for (const mat of rend.sharedMaterials) {
344
378
  if (mat) {
345
- const task = NEEDLE_progressive.assignTextureLOD(mat, 0);
379
+ let lodLevel = 0;
380
+ const args: BeforeLODExportArguments = { exporter: this, type: "texture" as const, object: rend.gameObject, material: mat };
381
+ USDZExporter.beforeLODExport.invoke(args);
382
+ if (args.overrideLevel !== undefined) {
383
+ if (args.overrideLevel === -1) {
384
+ if (debug) console.warn("Skipping LOD assignment due to overrideLevel -1", rend.gameObject, mat);
385
+ continue; // skip LOD assignment
386
+ }
387
+ else if (args.overrideLevel >= 0) {
388
+ lodLevel = args.overrideLevel;
389
+ if (debug) console.log("Overriding LOD level for texture export to level " + lodLevel + " " + mat.name);
390
+ }
391
+ }
392
+ const task = NEEDLE_progressive.assignTextureLOD(mat, lodLevel);
346
393
  if (task instanceof Promise)
347
394
  progressiveLoading.push(new Promise<void>((resolve, reject) => {
348
395
  task.then(() => {