@needle-tools/engine 4.7.0-alpha → 4.7.0-next.22483b4

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 (1067) hide show
  1. package/CHANGELOG.md +3768 -3768
  2. package/LICENSE.md +10 -10
  3. package/README.md +64 -64
  4. package/components.needle.json +1 -1
  5. package/dist/generateMeshBVH.worker-BaNp_Xtp.js +25 -0
  6. package/dist/{gltf-progressive-Bm9eEfgu.min.js → gltf-progressive-Bl4okF1b.min.js} +1 -1
  7. package/dist/{gltf-progressive-GjIqwSG3.js → gltf-progressive-DSpdn0QT.js} +2 -2
  8. package/dist/{gltf-progressive-Dn6o99rH.umd.cjs → gltf-progressive-P8b8a0qY.umd.cjs} +1 -1
  9. package/dist/{needle-engine.bundle-BEUFTdl6.min.js → needle-engine.bundle-BnGp0ASs.min.js} +75 -74
  10. package/dist/{needle-engine.bundle-CK8cQ3FX.umd.cjs → needle-engine.bundle-CP5AJL1A.umd.cjs} +66 -65
  11. package/dist/{needle-engine.bundle-CXtflnL6.js → needle-engine.bundle-RgZNbAgp.js} +1185 -1176
  12. package/dist/needle-engine.d.ts +130 -129
  13. package/dist/needle-engine.js +4 -4
  14. package/dist/needle-engine.min.js +1 -1
  15. package/dist/needle-engine.umd.cjs +1 -1
  16. package/dist/{postprocessing-8AQTeZsr.umd.cjs → postprocessing-CjW23fio.umd.cjs} +2 -2
  17. package/dist/{postprocessing-BkxN_08g.js → postprocessing-DYLNOL3W.js} +3 -3
  18. package/dist/{postprocessing-BDScN9yu.min.js → postprocessing-xYQWCHFu.min.js} +2 -2
  19. package/dist/{three-DMrv-4ar.umd.cjs → three-B_hneGZr.umd.cjs} +4 -4
  20. package/dist/{three-Bz6X1mrw.js → three-DrqIzZTH.js} +4198 -4198
  21. package/dist/{three-Boa-jOq-.min.js → three-DuDKwKB8.min.js} +33 -33
  22. package/dist/{three-examples-GggCDHv0.js → three-examples-B50TT3Iu.js} +5 -5
  23. package/dist/{three-examples-DuVhxqft.min.js → three-examples-DaDLBuy6.min.js} +14 -14
  24. package/dist/{three-examples-C7ryg8vN.umd.cjs → three-examples-X3OadjXB.umd.cjs} +3 -3
  25. package/dist/{three-mesh-ui-CY6Izc7C.min.js → three-mesh-ui-B3p3gyUz.min.js} +1 -1
  26. package/dist/{three-mesh-ui-CwlN0FUC.umd.cjs → three-mesh-ui-CQiIQIlA.umd.cjs} +1 -1
  27. package/dist/{three-mesh-ui-CLNOfsWn.js → three-mesh-ui-CxuWt7m-.js} +1 -1
  28. package/dist/{vendor-zxXa3Dmr.min.js → vendor-BlSxe9JJ.min.js} +3 -3
  29. package/dist/{vendor-BSD1RQIh.js → vendor-BmYIgaS1.js} +3 -3
  30. package/dist/{vendor-DHr4aqIZ.umd.cjs → vendor-Cavtu3CP.umd.cjs} +3 -3
  31. package/lib/asap/needle-asap.d.ts +1 -1
  32. package/lib/asap/needle-asap.js +95 -95
  33. package/lib/asap/sessiongranted.d.ts +3 -3
  34. package/lib/asap/sessiongranted.js +65 -65
  35. package/lib/asap/utils.d.ts +1 -1
  36. package/lib/asap/utils.js +3 -3
  37. package/lib/engine/analytics/index.d.ts +6 -6
  38. package/lib/engine/analytics/index.js +12 -12
  39. package/lib/engine/analytics/lcp.d.ts +3 -3
  40. package/lib/engine/analytics/lcp.js +34 -34
  41. package/lib/engine/api.d.ts +82 -82
  42. package/lib/engine/api.js +81 -81
  43. package/lib/engine/assets/index.d.ts +11 -11
  44. package/lib/engine/assets/index.js +47 -47
  45. package/lib/engine/assets/static.d.ts +1 -1
  46. package/lib/engine/assets/static.js +4 -4
  47. package/lib/engine/codegen/register_types.d.ts +1 -1
  48. package/lib/engine/codegen/register_types.js +300 -300
  49. package/lib/engine/debug/debug.d.ts +15 -15
  50. package/lib/engine/debug/debug.js +44 -44
  51. package/lib/engine/debug/debug_console.d.ts +2 -2
  52. package/lib/engine/debug/debug_console.js +307 -307
  53. package/lib/engine/debug/debug_overlay.d.ts +22 -22
  54. package/lib/engine/debug/debug_overlay.js +316 -316
  55. package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
  56. package/lib/engine/debug/debug_spatial_console.js +390 -390
  57. package/lib/engine/debug/index.d.ts +2 -2
  58. package/lib/engine/debug/index.js +2 -2
  59. package/lib/engine/engine_addressables.d.ts +166 -166
  60. package/lib/engine/engine_addressables.js +608 -608
  61. package/lib/engine/engine_animation.d.ts +43 -43
  62. package/lib/engine/engine_animation.js +133 -133
  63. package/lib/engine/engine_application.d.ts +45 -45
  64. package/lib/engine/engine_application.js +104 -104
  65. package/lib/engine/engine_assetdatabase.d.ts +25 -25
  66. package/lib/engine/engine_assetdatabase.js +346 -346
  67. package/lib/engine/engine_audio.d.ts +4 -4
  68. package/lib/engine/engine_audio.js +23 -23
  69. package/lib/engine/engine_camera.d.ts +13 -13
  70. package/lib/engine/engine_camera.js +30 -30
  71. package/lib/engine/engine_components.d.ts +110 -110
  72. package/lib/engine/engine_components.js +374 -374
  73. package/lib/engine/engine_components_internal.d.ts +9 -9
  74. package/lib/engine/engine_components_internal.js +36 -36
  75. package/lib/engine/engine_constants.d.ts +10 -10
  76. package/lib/engine/engine_constants.js +41 -41
  77. package/lib/engine/engine_context.d.ts +475 -475
  78. package/lib/engine/engine_context.js +1673 -1672
  79. package/lib/engine/engine_context.js.map +1 -1
  80. package/lib/engine/engine_context_registry.d.ts +71 -71
  81. package/lib/engine/engine_context_registry.js +117 -117
  82. package/lib/engine/engine_coroutine.d.ts +35 -35
  83. package/lib/engine/engine_coroutine.js +52 -52
  84. package/lib/engine/engine_create_objects.d.ts +119 -119
  85. package/lib/engine/engine_create_objects.js +320 -320
  86. package/lib/engine/engine_default_parameters.d.ts +2 -2
  87. package/lib/engine/engine_default_parameters.js +3 -3
  88. package/lib/engine/engine_editor-sync.d.ts +21 -21
  89. package/lib/engine/engine_editor-sync.js +4 -4
  90. package/lib/engine/engine_fileloader.d.ts +2 -2
  91. package/lib/engine/engine_fileloader.js +8 -8
  92. package/lib/engine/engine_gameobject.d.ts +68 -68
  93. package/lib/engine/engine_gameobject.js +619 -619
  94. package/lib/engine/engine_generic_utils.d.ts +1 -1
  95. package/lib/engine/engine_generic_utils.js +13 -13
  96. package/lib/engine/engine_gizmos.d.ts +149 -149
  97. package/lib/engine/engine_gizmos.js +530 -530
  98. package/lib/engine/engine_gltf.d.ts +12 -12
  99. package/lib/engine/engine_gltf.js +15 -15
  100. package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
  101. package/lib/engine/engine_gltf_builtin_components.js +341 -341
  102. package/lib/engine/engine_hot_reload.d.ts +8 -8
  103. package/lib/engine/engine_hot_reload.js +197 -197
  104. package/lib/engine/engine_input.d.ts +362 -362
  105. package/lib/engine/engine_input.js +1294 -1294
  106. package/lib/engine/engine_input_utils.d.ts +2 -2
  107. package/lib/engine/engine_input_utils.js +22 -22
  108. package/lib/engine/engine_instancing.d.ts +19 -19
  109. package/lib/engine/engine_instancing.js +39 -39
  110. package/lib/engine/engine_license.d.ts +11 -11
  111. package/lib/engine/engine_license.js +369 -369
  112. package/lib/engine/engine_lifecycle_api.d.ts +83 -83
  113. package/lib/engine/engine_lifecycle_api.js +106 -106
  114. package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
  115. package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
  116. package/lib/engine/engine_lightdata.d.ts +23 -23
  117. package/lib/engine/engine_lightdata.js +91 -91
  118. package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
  119. package/lib/engine/engine_loaders.callbacks.js +86 -86
  120. package/lib/engine/engine_loaders.d.ts +48 -48
  121. package/lib/engine/engine_loaders.gltf.d.ts +13 -13
  122. package/lib/engine/engine_loaders.gltf.js +62 -62
  123. package/lib/engine/engine_loaders.js +337 -337
  124. package/lib/engine/engine_lods.d.ts +31 -31
  125. package/lib/engine/engine_lods.js +146 -146
  126. package/lib/engine/engine_mainloop_utils.d.ts +32 -32
  127. package/lib/engine/engine_mainloop_utils.js +466 -466
  128. package/lib/engine/engine_math.d.ts +114 -114
  129. package/lib/engine/engine_math.js +247 -247
  130. package/lib/engine/engine_modules.d.ts +36 -36
  131. package/lib/engine/engine_modules.js +85 -85
  132. package/lib/engine/engine_networking.d.ts +260 -260
  133. package/lib/engine/engine_networking.js +764 -764
  134. package/lib/engine/engine_networking_auto.d.ts +24 -24
  135. package/lib/engine/engine_networking_auto.js +310 -310
  136. package/lib/engine/engine_networking_blob.d.ts +48 -48
  137. package/lib/engine/engine_networking_blob.js +228 -228
  138. package/lib/engine/engine_networking_files.d.ts +35 -35
  139. package/lib/engine/engine_networking_files.js +172 -172
  140. package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
  141. package/lib/engine/engine_networking_files_default_components.js +42 -42
  142. package/lib/engine/engine_networking_instantiate.d.ts +100 -100
  143. package/lib/engine/engine_networking_instantiate.js +345 -345
  144. package/lib/engine/engine_networking_peer.d.ts +15 -15
  145. package/lib/engine/engine_networking_peer.js +132 -132
  146. package/lib/engine/engine_networking_streams.d.ts +123 -123
  147. package/lib/engine/engine_networking_streams.js +645 -645
  148. package/lib/engine/engine_networking_types.d.ts +22 -22
  149. package/lib/engine/engine_networking_types.js +7 -7
  150. package/lib/engine/engine_networking_utils.d.ts +2 -2
  151. package/lib/engine/engine_networking_utils.js +20 -20
  152. package/lib/engine/engine_networking_websocket.d.ts +1 -1
  153. package/lib/engine/engine_networking_websocket.js +2 -2
  154. package/lib/engine/engine_patcher.d.ts +10 -10
  155. package/lib/engine/engine_patcher.js +142 -142
  156. package/lib/engine/engine_physics.d.ts +152 -152
  157. package/lib/engine/engine_physics.js +645 -645
  158. package/lib/engine/engine_physics.types.d.ts +40 -40
  159. package/lib/engine/engine_physics.types.js +33 -33
  160. package/lib/engine/engine_physics_rapier.d.ts +147 -147
  161. package/lib/engine/engine_physics_rapier.js +1433 -1433
  162. package/lib/engine/engine_playerview.d.ts +26 -26
  163. package/lib/engine/engine_playerview.js +64 -64
  164. package/lib/engine/engine_scenelighting.d.ts +71 -71
  165. package/lib/engine/engine_scenelighting.js +226 -226
  166. package/lib/engine/engine_serialization.d.ts +3 -3
  167. package/lib/engine/engine_serialization.js +3 -3
  168. package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
  169. package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
  170. package/lib/engine/engine_serialization_core.d.ts +94 -94
  171. package/lib/engine/engine_serialization_core.js +607 -607
  172. package/lib/engine/engine_serialization_decorator.d.ts +23 -23
  173. package/lib/engine/engine_serialization_decorator.js +66 -66
  174. package/lib/engine/engine_setup.d.ts +1 -1
  175. package/lib/engine/engine_setup.js +2 -2
  176. package/lib/engine/engine_shaders.d.ts +53 -53
  177. package/lib/engine/engine_shaders.js +252 -252
  178. package/lib/engine/engine_shims.d.ts +4 -4
  179. package/lib/engine/engine_shims.js +24 -24
  180. package/lib/engine/engine_test_utils.d.ts +39 -39
  181. package/lib/engine/engine_test_utils.js +83 -83
  182. package/lib/engine/engine_texture.d.ts +28 -28
  183. package/lib/engine/engine_texture.js +64 -64
  184. package/lib/engine/engine_three_utils.d.ts +204 -204
  185. package/lib/engine/engine_three_utils.js +784 -784
  186. package/lib/engine/engine_time.d.ts +51 -51
  187. package/lib/engine/engine_time.js +82 -82
  188. package/lib/engine/engine_time_utils.d.ts +88 -88
  189. package/lib/engine/engine_time_utils.js +215 -215
  190. package/lib/engine/engine_tonemapping.d.ts +6 -6
  191. package/lib/engine/engine_tonemapping.js +197 -197
  192. package/lib/engine/engine_types.d.ts +578 -578
  193. package/lib/engine/engine_types.js +95 -95
  194. package/lib/engine/engine_typestore.d.ts +28 -28
  195. package/lib/engine/engine_typestore.js +55 -55
  196. package/lib/engine/engine_util_decorator.d.ts +13 -13
  197. package/lib/engine/engine_util_decorator.js +116 -116
  198. package/lib/engine/engine_utils.d.ts +248 -248
  199. package/lib/engine/engine_utils.js +1012 -1012
  200. package/lib/engine/engine_utils_format.d.ts +24 -24
  201. package/lib/engine/engine_utils_format.js +239 -239
  202. package/lib/engine/engine_utils_screenshot.d.ts +159 -159
  203. package/lib/engine/engine_utils_screenshot.js +522 -522
  204. package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
  205. package/lib/engine/engine_utils_screenshot.xr.js +90 -90
  206. package/lib/engine/engine_xr.d.ts +1 -1
  207. package/lib/engine/engine_xr.js +1 -1
  208. package/lib/engine/export/gltf/Writers.d.ts +19 -19
  209. package/lib/engine/export/gltf/Writers.js +24 -24
  210. package/lib/engine/export/gltf/index.d.ts +11 -11
  211. package/lib/engine/export/gltf/index.js +123 -123
  212. package/lib/engine/export/index.d.ts +2 -2
  213. package/lib/engine/export/index.js +2 -2
  214. package/lib/engine/export/state.d.ts +7 -7
  215. package/lib/engine/export/state.js +17 -17
  216. package/lib/engine/export/utils.d.ts +2 -2
  217. package/lib/engine/export/utils.js +7 -7
  218. package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
  219. package/lib/engine/extensions/EXT_texture_exr.js +32 -32
  220. package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
  221. package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
  222. package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
  223. package/lib/engine/extensions/NEEDLE_components.js +220 -220
  224. package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
  225. package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
  226. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
  227. package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
  228. package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
  229. package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
  230. package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
  231. package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
  232. package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
  233. package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
  234. package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
  235. package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
  236. package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
  237. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
  238. package/lib/engine/extensions/extension_resolver.d.ts +4 -4
  239. package/lib/engine/extensions/extension_resolver.js +1 -1
  240. package/lib/engine/extensions/extension_utils.d.ts +12 -12
  241. package/lib/engine/extensions/extension_utils.js +152 -152
  242. package/lib/engine/extensions/extensions.d.ts +32 -32
  243. package/lib/engine/extensions/extensions.js +107 -107
  244. package/lib/engine/extensions/index.d.ts +6 -6
  245. package/lib/engine/extensions/index.js +6 -6
  246. package/lib/engine/extensions/usage_tracker.d.ts +13 -13
  247. package/lib/engine/extensions/usage_tracker.js +65 -65
  248. package/lib/engine/js-extensions/Camera.d.ts +1 -1
  249. package/lib/engine/js-extensions/Camera.js +39 -39
  250. package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
  251. package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
  252. package/lib/engine/js-extensions/Layers.d.ts +6 -6
  253. package/lib/engine/js-extensions/Layers.js +22 -22
  254. package/lib/engine/js-extensions/Object3D.d.ts +120 -120
  255. package/lib/engine/js-extensions/Object3D.js +136 -136
  256. package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
  257. package/lib/engine/js-extensions/RGBAColor.js +111 -111
  258. package/lib/engine/js-extensions/Vector.d.ts +3 -3
  259. package/lib/engine/js-extensions/Vector.js +13 -13
  260. package/lib/engine/js-extensions/index.d.ts +5 -5
  261. package/lib/engine/js-extensions/index.js +5 -5
  262. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
  263. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
  264. package/lib/engine/shaders/shaderData.d.ts +55 -55
  265. package/lib/engine/shaders/shaderData.js +58 -58
  266. package/lib/engine/tests/test_utils.d.ts +2 -2
  267. package/lib/engine/tests/test_utils.js +53 -53
  268. package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
  269. package/lib/engine/webcomponents/WebXRButtons.js +230 -230
  270. package/lib/engine/webcomponents/api.d.ts +5 -5
  271. package/lib/engine/webcomponents/api.js +4 -4
  272. package/lib/engine/webcomponents/buttons.d.ts +51 -51
  273. package/lib/engine/webcomponents/buttons.js +264 -264
  274. package/lib/engine/webcomponents/fonts.d.ts +9 -9
  275. package/lib/engine/webcomponents/fonts.js +32 -32
  276. package/lib/engine/webcomponents/icons.d.ts +9 -9
  277. package/lib/engine/webcomponents/icons.js +52 -52
  278. package/lib/engine/webcomponents/index.d.ts +1 -1
  279. package/lib/engine/webcomponents/index.js +1 -1
  280. package/lib/engine/webcomponents/logo-element.d.ts +10 -10
  281. package/lib/engine/webcomponents/logo-element.js +67 -67
  282. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
  283. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
  284. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
  285. package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
  286. package/lib/engine/webcomponents/needle-button.d.ts +34 -34
  287. package/lib/engine/webcomponents/needle-button.js +161 -161
  288. package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
  289. package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
  290. package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
  291. package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
  292. package/lib/engine/webcomponents/needle-engine.d.ts +116 -116
  293. package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
  294. package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
  295. package/lib/engine/webcomponents/needle-engine.js +821 -821
  296. package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
  297. package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
  298. package/lib/engine/xr/NeedleXRController.d.ts +313 -313
  299. package/lib/engine/xr/NeedleXRController.js +1007 -1007
  300. package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
  301. package/lib/engine/xr/NeedleXRSession.js +1463 -1463
  302. package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
  303. package/lib/engine/xr/NeedleXRSync.js +188 -188
  304. package/lib/engine/xr/SceneTransition.d.ts +18 -18
  305. package/lib/engine/xr/SceneTransition.js +69 -69
  306. package/lib/engine/xr/TempXRContext.d.ts +34 -34
  307. package/lib/engine/xr/TempXRContext.js +187 -187
  308. package/lib/engine/xr/XRRig.d.ts +7 -7
  309. package/lib/engine/xr/XRRig.js +1 -1
  310. package/lib/engine/xr/api.d.ts +6 -6
  311. package/lib/engine/xr/api.js +6 -6
  312. package/lib/engine/xr/events.d.ts +66 -66
  313. package/lib/engine/xr/events.js +93 -93
  314. package/lib/engine/xr/internal.d.ts +12 -12
  315. package/lib/engine/xr/internal.js +25 -25
  316. package/lib/engine/xr/usdz.d.ts +12 -12
  317. package/lib/engine/xr/usdz.js +29 -29
  318. package/lib/engine/xr/utils.d.ts +11 -11
  319. package/lib/engine/xr/utils.js +34 -34
  320. package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
  321. package/lib/engine-components/AlignmentConstraint.js +39 -39
  322. package/lib/engine-components/Animation.d.ts +156 -156
  323. package/lib/engine-components/Animation.js +508 -508
  324. package/lib/engine-components/AnimationCurve.d.ts +40 -40
  325. package/lib/engine-components/AnimationCurve.js +159 -159
  326. package/lib/engine-components/AnimationUtils.d.ts +8 -8
  327. package/lib/engine-components/AnimationUtils.js +27 -27
  328. package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
  329. package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
  330. package/lib/engine-components/Animator.d.ts +217 -217
  331. package/lib/engine-components/Animator.js +354 -354
  332. package/lib/engine-components/AnimatorController.d.ts +227 -227
  333. package/lib/engine-components/AnimatorController.js +1152 -1152
  334. package/lib/engine-components/AudioListener.d.ts +33 -33
  335. package/lib/engine-components/AudioListener.js +86 -86
  336. package/lib/engine-components/AudioSource.d.ts +217 -217
  337. package/lib/engine-components/AudioSource.js +635 -635
  338. package/lib/engine-components/AvatarLoader.d.ts +80 -80
  339. package/lib/engine-components/AvatarLoader.js +231 -231
  340. package/lib/engine-components/AxesHelper.d.ts +32 -32
  341. package/lib/engine-components/AxesHelper.js +67 -67
  342. package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
  343. package/lib/engine-components/BasicIKConstraint.js +43 -43
  344. package/lib/engine-components/BoxCollider.d.ts +2 -2
  345. package/lib/engine-components/BoxCollider.js +2 -2
  346. package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
  347. package/lib/engine-components/BoxHelperComponent.js +102 -102
  348. package/lib/engine-components/Camera.d.ts +231 -231
  349. package/lib/engine-components/Camera.js +700 -700
  350. package/lib/engine-components/CameraUtils.d.ts +1 -1
  351. package/lib/engine-components/CameraUtils.js +121 -121
  352. package/lib/engine-components/CharacterController.d.ts +55 -55
  353. package/lib/engine-components/CharacterController.js +236 -236
  354. package/lib/engine-components/Collider.d.ts +188 -188
  355. package/lib/engine-components/Collider.js +369 -369
  356. package/lib/engine-components/Component.d.ts +792 -792
  357. package/lib/engine-components/Component.js +920 -920
  358. package/lib/engine-components/ContactShadows.d.ts +94 -94
  359. package/lib/engine-components/ContactShadows.js +453 -453
  360. package/lib/engine-components/DeleteBox.d.ts +19 -19
  361. package/lib/engine-components/DeleteBox.js +58 -58
  362. package/lib/engine-components/DeviceFlag.d.ts +16 -16
  363. package/lib/engine-components/DeviceFlag.js +47 -47
  364. package/lib/engine-components/DragControls.d.ts +170 -170
  365. package/lib/engine-components/DragControls.js +1421 -1421
  366. package/lib/engine-components/DropListener.d.ts +215 -215
  367. package/lib/engine-components/DropListener.js +642 -642
  368. package/lib/engine-components/Duplicatable.d.ts +35 -35
  369. package/lib/engine-components/Duplicatable.js +202 -202
  370. package/lib/engine-components/EventList.d.ts +54 -54
  371. package/lib/engine-components/EventList.js +232 -232
  372. package/lib/engine-components/EventTrigger.d.ts +33 -33
  373. package/lib/engine-components/EventTrigger.js +75 -75
  374. package/lib/engine-components/EventType.d.ts +22 -22
  375. package/lib/engine-components/EventType.js +23 -23
  376. package/lib/engine-components/Fog.d.ts +22 -22
  377. package/lib/engine-components/Fog.js +61 -61
  378. package/lib/engine-components/Gizmos.d.ts +17 -17
  379. package/lib/engine-components/Gizmos.js +64 -64
  380. package/lib/engine-components/GridHelper.d.ts +20 -20
  381. package/lib/engine-components/GridHelper.js +54 -54
  382. package/lib/engine-components/GroundProjection.d.ts +67 -67
  383. package/lib/engine-components/GroundProjection.js +343 -343
  384. package/lib/engine-components/Interactable.d.ts +12 -12
  385. package/lib/engine-components/Interactable.js +12 -12
  386. package/lib/engine-components/Joints.d.ts +19 -19
  387. package/lib/engine-components/Joints.js +51 -51
  388. package/lib/engine-components/LODGroup.d.ts +35 -35
  389. package/lib/engine-components/LODGroup.js +152 -152
  390. package/lib/engine-components/Light.d.ts +180 -180
  391. package/lib/engine-components/Light.js +535 -535
  392. package/lib/engine-components/LookAtConstraint.d.ts +19 -19
  393. package/lib/engine-components/LookAtConstraint.js +35 -35
  394. package/lib/engine-components/NeedleMenu.d.ts +50 -50
  395. package/lib/engine-components/NeedleMenu.js +92 -92
  396. package/lib/engine-components/NestedGltf.d.ts +25 -25
  397. package/lib/engine-components/NestedGltf.js +88 -88
  398. package/lib/engine-components/Networking.d.ts +54 -54
  399. package/lib/engine-components/Networking.js +112 -112
  400. package/lib/engine-components/OffsetConstraint.d.ts +14 -14
  401. package/lib/engine-components/OffsetConstraint.js +65 -65
  402. package/lib/engine-components/OrbitControls.d.ts +268 -268
  403. package/lib/engine-components/OrbitControls.js +1015 -1015
  404. package/lib/engine-components/PlayerColor.d.ts +19 -19
  405. package/lib/engine-components/PlayerColor.js +94 -94
  406. package/lib/engine-components/ReflectionProbe.d.ts +28 -28
  407. package/lib/engine-components/ReflectionProbe.js +204 -204
  408. package/lib/engine-components/Renderer.d.ts +153 -153
  409. package/lib/engine-components/Renderer.js +834 -834
  410. package/lib/engine-components/RendererInstancing.d.ts +140 -140
  411. package/lib/engine-components/RendererInstancing.js +744 -744
  412. package/lib/engine-components/RendererLightmap.d.ts +24 -24
  413. package/lib/engine-components/RendererLightmap.js +182 -182
  414. package/lib/engine-components/RigidBody.d.ts +155 -155
  415. package/lib/engine-components/RigidBody.js +517 -517
  416. package/lib/engine-components/SceneSwitcher.d.ts +263 -263
  417. package/lib/engine-components/SceneSwitcher.js +971 -971
  418. package/lib/engine-components/ScreenCapture.d.ts +144 -144
  419. package/lib/engine-components/ScreenCapture.js +547 -547
  420. package/lib/engine-components/ShadowCatcher.d.ts +33 -33
  421. package/lib/engine-components/ShadowCatcher.js +166 -166
  422. package/lib/engine-components/Skybox.d.ts +88 -88
  423. package/lib/engine-components/Skybox.js +469 -469
  424. package/lib/engine-components/SmoothFollow.d.ts +34 -34
  425. package/lib/engine-components/SmoothFollow.js +82 -82
  426. package/lib/engine-components/SpatialTrigger.d.ts +102 -102
  427. package/lib/engine-components/SpatialTrigger.js +225 -225
  428. package/lib/engine-components/SpectatorCamera.d.ts +111 -111
  429. package/lib/engine-components/SpectatorCamera.js +715 -715
  430. package/lib/engine-components/SphereCollider.d.ts +2 -2
  431. package/lib/engine-components/SphereCollider.js +2 -2
  432. package/lib/engine-components/SpriteRenderer.d.ts +132 -132
  433. package/lib/engine-components/SpriteRenderer.js +472 -472
  434. package/lib/engine-components/SyncedCamera.d.ts +41 -41
  435. package/lib/engine-components/SyncedCamera.js +199 -199
  436. package/lib/engine-components/SyncedRoom.d.ts +106 -106
  437. package/lib/engine-components/SyncedRoom.js +371 -371
  438. package/lib/engine-components/SyncedTransform.d.ts +94 -94
  439. package/lib/engine-components/SyncedTransform.js +331 -331
  440. package/lib/engine-components/TestRunner.d.ts +16 -16
  441. package/lib/engine-components/TestRunner.js +102 -102
  442. package/lib/engine-components/TransformGizmo.d.ts +75 -75
  443. package/lib/engine-components/TransformGizmo.js +209 -209
  444. package/lib/engine-components/VideoPlayer.d.ts +184 -184
  445. package/lib/engine-components/VideoPlayer.js +978 -978
  446. package/lib/engine-components/Voip.d.ts +67 -67
  447. package/lib/engine-components/Voip.js +360 -360
  448. package/lib/engine-components/api.d.ts +51 -51
  449. package/lib/engine-components/api.js +50 -50
  450. package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
  451. package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
  452. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
  453. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
  454. package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
  455. package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
  456. package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
  457. package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
  458. package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
  459. package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
  460. package/lib/engine-components/codegen/components.d.ts +216 -216
  461. package/lib/engine-components/codegen/components.js +218 -218
  462. package/lib/engine-components/debug/LogStats.d.ts +5 -5
  463. package/lib/engine-components/debug/LogStats.js +18 -18
  464. package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
  465. package/lib/engine-components/export/gltf/GltfExport.js +246 -246
  466. package/lib/engine-components/export/gltf/index.d.ts +1 -1
  467. package/lib/engine-components/export/gltf/index.js +1 -1
  468. package/lib/engine-components/export/index.d.ts +1 -1
  469. package/lib/engine-components/export/index.js +1 -1
  470. package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
  471. package/lib/engine-components/export/usdz/Extension.js +1 -1
  472. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +162 -162
  473. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1789 -1789
  474. package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
  475. package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
  476. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
  477. package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
  478. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
  479. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
  480. package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.d.ts +10 -10
  481. package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +451 -451
  482. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
  483. package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
  484. package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
  485. package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
  486. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
  487. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
  488. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
  489. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
  490. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
  491. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
  492. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
  493. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
  494. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
  495. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
  496. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
  497. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
  498. package/lib/engine-components/export/usdz/index.d.ts +3 -3
  499. package/lib/engine-components/export/usdz/index.js +2 -2
  500. package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
  501. package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
  502. package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
  503. package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
  504. package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
  505. package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
  506. package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
  507. package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
  508. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
  509. package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
  510. package/lib/engine-components/particlesystem/api.d.ts +2 -2
  511. package/lib/engine-components/particlesystem/api.js +2 -2
  512. package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
  513. package/lib/engine-components/postprocessing/Effects/Antialiasing.js +59 -52
  514. package/lib/engine-components/postprocessing/Effects/Antialiasing.js.map +1 -1
  515. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
  516. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
  517. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
  518. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
  519. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +23 -23
  520. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +111 -111
  521. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
  522. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
  523. package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
  524. package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
  525. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
  526. package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
  527. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
  528. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
  529. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
  530. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +176 -176
  531. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +18 -18
  532. package/lib/engine-components/postprocessing/Effects/Sharpening.js +127 -127
  533. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
  534. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
  535. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +19 -19
  536. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +94 -94
  537. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -13
  538. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +51 -51
  539. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
  540. package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
  541. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +90 -90
  542. package/lib/engine-components/postprocessing/PostProcessingEffect.js +168 -168
  543. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +42 -42
  544. package/lib/engine-components/postprocessing/PostProcessingHandler.js +494 -480
  545. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  546. package/lib/engine-components/postprocessing/Volume.d.ts +90 -90
  547. package/lib/engine-components/postprocessing/Volume.js +385 -385
  548. package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
  549. package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
  550. package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
  551. package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
  552. package/lib/engine-components/postprocessing/index.d.ts +6 -6
  553. package/lib/engine-components/postprocessing/index.js +6 -6
  554. package/lib/engine-components/postprocessing/utils.d.ts +55 -55
  555. package/lib/engine-components/postprocessing/utils.js +119 -119
  556. package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
  557. package/lib/engine-components/timeline/PlayableDirector.js +686 -686
  558. package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
  559. package/lib/engine-components/timeline/SignalAsset.js +130 -130
  560. package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
  561. package/lib/engine-components/timeline/TimelineModels.js +22 -22
  562. package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
  563. package/lib/engine-components/timeline/TimelineTracks.js +879 -879
  564. package/lib/engine-components/timeline/index.d.ts +4 -4
  565. package/lib/engine-components/timeline/index.js +3 -3
  566. package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
  567. package/lib/engine-components/ui/BaseUIComponent.js +170 -170
  568. package/lib/engine-components/ui/Button.d.ts +64 -64
  569. package/lib/engine-components/ui/Button.js +315 -315
  570. package/lib/engine-components/ui/Canvas.d.ts +74 -74
  571. package/lib/engine-components/ui/Canvas.js +407 -407
  572. package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
  573. package/lib/engine-components/ui/CanvasGroup.js +58 -58
  574. package/lib/engine-components/ui/EventSystem.d.ts +125 -125
  575. package/lib/engine-components/ui/EventSystem.js +765 -765
  576. package/lib/engine-components/ui/Graphic.d.ts +55 -55
  577. package/lib/engine-components/ui/Graphic.js +255 -255
  578. package/lib/engine-components/ui/Image.d.ts +35 -35
  579. package/lib/engine-components/ui/Image.js +116 -116
  580. package/lib/engine-components/ui/InputField.d.ts +42 -42
  581. package/lib/engine-components/ui/InputField.js +268 -268
  582. package/lib/engine-components/ui/Interfaces.d.ts +38 -38
  583. package/lib/engine-components/ui/Interfaces.js +12 -12
  584. package/lib/engine-components/ui/Layout.d.ts +84 -84
  585. package/lib/engine-components/ui/Layout.js +330 -330
  586. package/lib/engine-components/ui/Outline.d.ts +7 -7
  587. package/lib/engine-components/ui/Outline.js +20 -20
  588. package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
  589. package/lib/engine-components/ui/PointerEvents.js +145 -145
  590. package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
  591. package/lib/engine-components/ui/RaycastUtils.js +67 -67
  592. package/lib/engine-components/ui/Raycaster.d.ts +30 -30
  593. package/lib/engine-components/ui/Raycaster.js +95 -95
  594. package/lib/engine-components/ui/RectTransform.d.ts +61 -61
  595. package/lib/engine-components/ui/RectTransform.js +356 -356
  596. package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
  597. package/lib/engine-components/ui/SpatialHtml.js +79 -79
  598. package/lib/engine-components/ui/Symbols.d.ts +1 -1
  599. package/lib/engine-components/ui/Symbols.js +1 -1
  600. package/lib/engine-components/ui/Text.d.ts +78 -78
  601. package/lib/engine-components/ui/Text.js +539 -539
  602. package/lib/engine-components/ui/Utils.d.ts +24 -24
  603. package/lib/engine-components/ui/Utils.js +90 -90
  604. package/lib/engine-components/ui/index.d.ts +1 -1
  605. package/lib/engine-components/ui/index.js +1 -1
  606. package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
  607. package/lib/engine-components/utils/EnvironmentScene.js +205 -205
  608. package/lib/engine-components/utils/LookAt.d.ts +31 -31
  609. package/lib/engine-components/utils/LookAt.js +82 -82
  610. package/lib/engine-components/utils/OpenURL.d.ts +42 -42
  611. package/lib/engine-components/utils/OpenURL.js +119 -119
  612. package/lib/engine-components/webxr/Avatar.d.ts +25 -25
  613. package/lib/engine-components/webxr/Avatar.js +255 -255
  614. package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
  615. package/lib/engine-components/webxr/TeleportTarget.js +7 -7
  616. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
  617. package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
  618. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
  619. package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
  620. package/lib/engine-components/webxr/WebXR.d.ts +232 -232
  621. package/lib/engine-components/webxr/WebXR.js +561 -561
  622. package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
  623. package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
  624. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
  625. package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
  626. package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
  627. package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
  628. package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
  629. package/lib/engine-components/webxr/WebXRRig.js +72 -72
  630. package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
  631. package/lib/engine-components/webxr/XRFlag.js +139 -139
  632. package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
  633. package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
  634. package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
  635. package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
  636. package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
  637. package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
  638. package/lib/engine-components/webxr/index.d.ts +3 -3
  639. package/lib/engine-components/webxr/index.js +3 -3
  640. package/lib/engine-components/webxr/types.d.ts +3 -3
  641. package/lib/engine-components/webxr/types.js +1 -1
  642. package/lib/engine-components-experimental/Presentation.d.ts +6 -6
  643. package/lib/engine-components-experimental/Presentation.js +9 -9
  644. package/lib/engine-components-experimental/api.d.ts +4 -4
  645. package/lib/engine-components-experimental/api.js +4 -4
  646. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
  647. package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
  648. package/lib/engine-schemes/api.d.ts +12 -12
  649. package/lib/engine-schemes/api.js +12 -12
  650. package/lib/engine-schemes/schemes.d.ts +7 -7
  651. package/lib/engine-schemes/schemes.js +19 -19
  652. package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
  653. package/lib/engine-schemes/synced-camera-model.js +67 -67
  654. package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
  655. package/lib/engine-schemes/synced-transform-model.js +66 -66
  656. package/lib/engine-schemes/transform.d.ts +12 -12
  657. package/lib/engine-schemes/transform.js +39 -39
  658. package/lib/engine-schemes/vec2.d.ts +10 -10
  659. package/lib/engine-schemes/vec2.js +25 -25
  660. package/lib/engine-schemes/vec3.d.ts +11 -11
  661. package/lib/engine-schemes/vec3.js +29 -29
  662. package/lib/engine-schemes/vec4.d.ts +12 -12
  663. package/lib/engine-schemes/vec4.js +33 -33
  664. package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
  665. package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
  666. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
  667. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
  668. package/lib/needle-engine.d.ts +7 -7
  669. package/lib/needle-engine.js +64 -64
  670. package/package.json +2 -2
  671. package/plugins/common/buildinfo.js +64 -64
  672. package/plugins/common/cloud.js +1 -1
  673. package/plugins/common/config.cjs +31 -31
  674. package/plugins/common/config.js +35 -35
  675. package/plugins/common/files.js +31 -31
  676. package/plugins/common/generator.js +10 -10
  677. package/plugins/common/license.js +452 -452
  678. package/plugins/common/npm.js +15 -15
  679. package/plugins/common/timers.js +7 -7
  680. package/plugins/common/version.js +37 -37
  681. package/plugins/gltf-packer.mjs +1 -1
  682. package/plugins/next/alias.cjs +39 -39
  683. package/plugins/next/license.cjs +24 -24
  684. package/plugins/next/meshbvhworker.cjs +18 -18
  685. package/plugins/next/next.js +141 -141
  686. package/plugins/types/index.d.ts +2 -2
  687. package/plugins/types/license.d.ts +24 -24
  688. package/plugins/types/needleConfig.d.ts +27 -27
  689. package/plugins/types/next.d.ts +2 -2
  690. package/plugins/types/userconfig.d.ts +122 -120
  691. package/plugins/types/vite.d.ts +13 -13
  692. package/plugins/types/webmanifest.d.ts +32 -32
  693. package/plugins/vite/alias.js +184 -174
  694. package/plugins/vite/asap.js +251 -251
  695. package/plugins/vite/build-pipeline.js +371 -371
  696. package/plugins/vite/build.js +19 -19
  697. package/plugins/vite/buildinfo.js +41 -41
  698. package/plugins/vite/config.js +106 -106
  699. package/plugins/vite/copyfiles.js +138 -138
  700. package/plugins/vite/defines.js +70 -70
  701. package/plugins/vite/dependencies.js +232 -232
  702. package/plugins/vite/dependency-watcher.js +237 -237
  703. package/plugins/vite/drop-client.js +76 -76
  704. package/plugins/vite/drop.js +87 -87
  705. package/plugins/vite/editor-connection.js +124 -124
  706. package/plugins/vite/facebook-instant-games.js +102 -102
  707. package/plugins/vite/gzip.js +5 -5
  708. package/plugins/vite/imports-logger.js +143 -143
  709. package/plugins/vite/index.js +145 -143
  710. package/plugins/vite/license.js +56 -56
  711. package/plugins/vite/local-files.js +440 -440
  712. package/plugins/vite/materialx.js +30 -0
  713. package/plugins/vite/meta.js +163 -163
  714. package/plugins/vite/npm.js +7 -7
  715. package/plugins/vite/peer.js +29 -29
  716. package/plugins/vite/poster-client.js +73 -73
  717. package/plugins/vite/poster.js +79 -79
  718. package/plugins/vite/pwa.js +604 -604
  719. package/plugins/vite/reload-client.js +15 -15
  720. package/plugins/vite/reload.js +351 -351
  721. package/plugins/vite/server.js +66 -66
  722. package/plugins/vite/transform-codegen.js +55 -55
  723. package/plugins/vite/transform.js +32 -31
  724. package/plugins/vite/vite-4.4-hack.js +31 -31
  725. package/src/asap/needle-asap.ts +111 -111
  726. package/src/asap/sessiongranted.ts +75 -75
  727. package/src/asap/utils.ts +4 -4
  728. package/src/engine/analytics/index.ts +10 -10
  729. package/src/engine/analytics/lcp.ts +35 -35
  730. package/src/engine/api.ts +82 -82
  731. package/src/engine/assets/index.ts +59 -59
  732. package/src/engine/assets/static.js +5 -5
  733. package/src/engine/codegen/register_types.ts +300 -300
  734. package/src/engine/debug/debug.ts +51 -51
  735. package/src/engine/debug/debug_console.ts +333 -333
  736. package/src/engine/debug/debug_overlay.ts +332 -332
  737. package/src/engine/debug/debug_spatial_console.ts +429 -429
  738. package/src/engine/debug/index.ts +1 -1
  739. package/src/engine/engine_addressables.ts +680 -680
  740. package/src/engine/engine_animation.ts +145 -145
  741. package/src/engine/engine_application.ts +113 -113
  742. package/src/engine/engine_assetdatabase.ts +389 -389
  743. package/src/engine/engine_audio.ts +24 -24
  744. package/src/engine/engine_camera.ts +39 -39
  745. package/src/engine/engine_components.ts +366 -366
  746. package/src/engine/engine_components_internal.ts +40 -40
  747. package/src/engine/engine_constants.ts +52 -52
  748. package/src/engine/engine_context.ts +1824 -1823
  749. package/src/engine/engine_context_registry.ts +129 -129
  750. package/src/engine/engine_coroutine.ts +54 -54
  751. package/src/engine/engine_create_objects.ts +411 -411
  752. package/src/engine/engine_default_parameters.ts +3 -3
  753. package/src/engine/engine_editor-sync.ts +28 -28
  754. package/src/engine/engine_fileloader.js +9 -9
  755. package/src/engine/engine_gameobject.ts +712 -712
  756. package/src/engine/engine_generic_utils.js +13 -13
  757. package/src/engine/engine_gizmos.ts +577 -577
  758. package/src/engine/engine_gltf.ts +29 -29
  759. package/src/engine/engine_gltf_builtin_components.ts +403 -403
  760. package/src/engine/engine_hot_reload.ts +210 -210
  761. package/src/engine/engine_input.ts +1500 -1500
  762. package/src/engine/engine_input_utils.ts +23 -23
  763. package/src/engine/engine_instancing.ts +45 -45
  764. package/src/engine/engine_license.ts +386 -386
  765. package/src/engine/engine_lifecycle_api.ts +113 -113
  766. package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
  767. package/src/engine/engine_lightdata.ts +117 -117
  768. package/src/engine/engine_loaders.callbacks.ts +136 -136
  769. package/src/engine/engine_loaders.gltf.ts +82 -82
  770. package/src/engine/engine_loaders.ts +378 -378
  771. package/src/engine/engine_lods.ts +168 -168
  772. package/src/engine/engine_mainloop_utils.ts +472 -472
  773. package/src/engine/engine_math.ts +282 -282
  774. package/src/engine/engine_modules.ts +83 -83
  775. package/src/engine/engine_networking.ts +862 -862
  776. package/src/engine/engine_networking_auto.ts +352 -352
  777. package/src/engine/engine_networking_blob.ts +275 -275
  778. package/src/engine/engine_networking_files.ts +217 -217
  779. package/src/engine/engine_networking_files_default_components.ts +58 -58
  780. package/src/engine/engine_networking_instantiate.ts +419 -419
  781. package/src/engine/engine_networking_peer.ts +159 -159
  782. package/src/engine/engine_networking_streams.ts +713 -713
  783. package/src/engine/engine_networking_types.ts +24 -24
  784. package/src/engine/engine_networking_utils.ts +23 -23
  785. package/src/engine/engine_networking_websocket.ts +2 -2
  786. package/src/engine/engine_patcher.ts +199 -199
  787. package/src/engine/engine_physics.ts +783 -783
  788. package/src/engine/engine_physics.types.ts +46 -46
  789. package/src/engine/engine_physics_rapier.ts +1577 -1577
  790. package/src/engine/engine_playerview.ts +80 -80
  791. package/src/engine/engine_scenelighting.ts +294 -294
  792. package/src/engine/engine_serialization.ts +2 -2
  793. package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
  794. package/src/engine/engine_serialization_core.ts +720 -720
  795. package/src/engine/engine_serialization_decorator.ts +80 -80
  796. package/src/engine/engine_setup.ts +1 -1
  797. package/src/engine/engine_shaders.ts +267 -267
  798. package/src/engine/engine_shims.ts +32 -32
  799. package/src/engine/engine_test_utils.ts +109 -109
  800. package/src/engine/engine_texture.ts +82 -82
  801. package/src/engine/engine_three_utils.ts +925 -925
  802. package/src/engine/engine_time.ts +94 -94
  803. package/src/engine/engine_time_utils.ts +237 -237
  804. package/src/engine/engine_tonemapping.ts +208 -208
  805. package/src/engine/engine_types.ts +730 -730
  806. package/src/engine/engine_typestore.ts +63 -63
  807. package/src/engine/engine_util_decorator.ts +136 -136
  808. package/src/engine/engine_utils.ts +1115 -1115
  809. package/src/engine/engine_utils_format.ts +273 -273
  810. package/src/engine/engine_utils_screenshot.ts +708 -708
  811. package/src/engine/engine_utils_screenshot.xr.ts +103 -103
  812. package/src/engine/export/gltf/Writers.ts +34 -34
  813. package/src/engine/export/gltf/index.ts +158 -158
  814. package/src/engine/export/index.ts +2 -2
  815. package/src/engine/export/state.ts +19 -19
  816. package/src/engine/export/utils.ts +9 -9
  817. package/src/engine/extensions/EXT_texture_exr.ts +50 -50
  818. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
  819. package/src/engine/extensions/NEEDLE_components.ts +268 -268
  820. package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
  821. package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
  822. package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
  823. package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
  824. package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
  825. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
  826. package/src/engine/extensions/extension_resolver.ts +4 -4
  827. package/src/engine/extensions/extension_utils.ts +166 -166
  828. package/src/engine/extensions/extensions.ts +140 -140
  829. package/src/engine/extensions/index.ts +5 -5
  830. package/src/engine/extensions/usage_tracker.ts +100 -100
  831. package/src/engine/js-extensions/Camera.ts +37 -37
  832. package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
  833. package/src/engine/js-extensions/Layers.ts +23 -23
  834. package/src/engine/js-extensions/Object3D.ts +296 -296
  835. package/src/engine/js-extensions/RGBAColor.ts +126 -126
  836. package/src/engine/js-extensions/Vector.ts +18 -18
  837. package/src/engine/js-extensions/index.ts +4 -4
  838. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
  839. package/src/engine/shaders/shaderData.ts +67 -67
  840. package/src/engine/tests/test_utils.ts +63 -63
  841. package/src/engine/webcomponents/WebXRButtons.ts +260 -260
  842. package/src/engine/webcomponents/api.ts +6 -6
  843. package/src/engine/webcomponents/buttons.ts +292 -292
  844. package/src/engine/webcomponents/fonts.ts +41 -41
  845. package/src/engine/webcomponents/icons.ts +57 -57
  846. package/src/engine/webcomponents/index.ts +1 -1
  847. package/src/engine/webcomponents/logo-element.ts +78 -78
  848. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
  849. package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
  850. package/src/engine/webcomponents/needle-button.ts +181 -181
  851. package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
  852. package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
  853. package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
  854. package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
  855. package/src/engine/webcomponents/needle-engine.ts +860 -860
  856. package/src/engine/xr/NeedleXRController.ts +1125 -1125
  857. package/src/engine/xr/NeedleXRSession.ts +1624 -1624
  858. package/src/engine/xr/NeedleXRSync.ts +220 -220
  859. package/src/engine/xr/SceneTransition.ts +78 -78
  860. package/src/engine/xr/TempXRContext.ts +216 -216
  861. package/src/engine/xr/XRRig.ts +9 -9
  862. package/src/engine/xr/api.ts +5 -5
  863. package/src/engine/xr/events.ts +102 -102
  864. package/src/engine/xr/internal.ts +34 -34
  865. package/src/engine/xr/usdz.ts +30 -30
  866. package/src/engine/xr/utils.ts +39 -39
  867. package/src/engine-components/AlignmentConstraint.ts +36 -36
  868. package/src/engine-components/Animation.ts +557 -557
  869. package/src/engine-components/AnimationCurve.ts +150 -150
  870. package/src/engine-components/AnimationUtils.ts +28 -28
  871. package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
  872. package/src/engine-components/Animator.ts +397 -397
  873. package/src/engine-components/AnimatorController.ts +1293 -1293
  874. package/src/engine-components/AudioListener.ts +92 -92
  875. package/src/engine-components/AudioSource.ts +644 -644
  876. package/src/engine-components/AvatarLoader.ts +263 -263
  877. package/src/engine-components/AxesHelper.ts +59 -59
  878. package/src/engine-components/BasicIKConstraint.ts +54 -54
  879. package/src/engine-components/BoxCollider.ts +1 -1
  880. package/src/engine-components/BoxHelperComponent.ts +114 -114
  881. package/src/engine-components/Camera.ts +719 -719
  882. package/src/engine-components/CameraUtils.ts +136 -136
  883. package/src/engine-components/CharacterController.ts +253 -253
  884. package/src/engine-components/Collider.ts +374 -374
  885. package/src/engine-components/Component.ts +1297 -1297
  886. package/src/engine-components/ContactShadows.ts +506 -506
  887. package/src/engine-components/DeleteBox.ts +62 -62
  888. package/src/engine-components/DeviceFlag.ts +46 -46
  889. package/src/engine-components/DragControls.ts +1623 -1623
  890. package/src/engine-components/DropListener.ts +713 -713
  891. package/src/engine-components/Duplicatable.ts +198 -198
  892. package/src/engine-components/EventList.ts +266 -266
  893. package/src/engine-components/EventTrigger.ts +74 -74
  894. package/src/engine-components/EventType.ts +22 -22
  895. package/src/engine-components/Fog.ts +60 -60
  896. package/src/engine-components/Gizmos.ts +56 -56
  897. package/src/engine-components/GridHelper.ts +48 -48
  898. package/src/engine-components/GroundProjection.ts +356 -356
  899. package/src/engine-components/Interactable.ts +14 -14
  900. package/src/engine-components/Joints.ts +52 -52
  901. package/src/engine-components/LODGroup.ts +153 -153
  902. package/src/engine-components/Light.ts +558 -558
  903. package/src/engine-components/LookAtConstraint.ts +25 -25
  904. package/src/engine-components/NeedleMenu.ts +84 -84
  905. package/src/engine-components/NestedGltf.ts +86 -86
  906. package/src/engine-components/Networking.ts +114 -114
  907. package/src/engine-components/OffsetConstraint.ts +60 -60
  908. package/src/engine-components/OrbitControls.ts +1074 -1074
  909. package/src/engine-components/PlayerColor.ts +103 -103
  910. package/src/engine-components/ReflectionProbe.ts +220 -220
  911. package/src/engine-components/Renderer.ts +903 -903
  912. package/src/engine-components/RendererInstancing.ts +855 -855
  913. package/src/engine-components/RendererLightmap.ts +198 -198
  914. package/src/engine-components/RigidBody.ts +526 -526
  915. package/src/engine-components/SceneSwitcher.ts +1030 -1030
  916. package/src/engine-components/ScreenCapture.ts +592 -592
  917. package/src/engine-components/ShadowCatcher.ts +172 -172
  918. package/src/engine-components/Skybox.ts +475 -475
  919. package/src/engine-components/SmoothFollow.ts +76 -76
  920. package/src/engine-components/SpatialTrigger.ts +229 -229
  921. package/src/engine-components/SpectatorCamera.ts +787 -787
  922. package/src/engine-components/SphereCollider.ts +1 -1
  923. package/src/engine-components/SpriteRenderer.ts +468 -468
  924. package/src/engine-components/SyncedCamera.ts +220 -220
  925. package/src/engine-components/SyncedRoom.ts +380 -380
  926. package/src/engine-components/SyncedTransform.ts +383 -383
  927. package/src/engine-components/TestRunner.ts +118 -118
  928. package/src/engine-components/TransformGizmo.ts +219 -219
  929. package/src/engine-components/VideoPlayer.ts +1025 -1025
  930. package/src/engine-components/Voip.ts +363 -363
  931. package/src/engine-components/api.ts +60 -60
  932. package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
  933. package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
  934. package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
  935. package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
  936. package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
  937. package/src/engine-components/codegen/components.ts +217 -217
  938. package/src/engine-components/debug/LogStats.ts +21 -21
  939. package/src/engine-components/export/gltf/GltfExport.ts +265 -265
  940. package/src/engine-components/export/usdz/Extension.ts +24 -24
  941. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2426 -2426
  942. package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
  943. package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
  944. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
  945. package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
  946. package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
  947. package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
  948. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
  949. package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
  950. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
  951. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
  952. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
  953. package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
  954. package/src/engine-components/export/usdz/index.ts +2 -2
  955. package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
  956. package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
  957. package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
  958. package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
  959. package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
  960. package/src/engine-components/particlesystem/api.ts +1 -1
  961. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +64 -57
  962. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
  963. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
  964. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +106 -106
  965. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
  966. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
  967. package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
  968. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
  969. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +192 -192
  970. package/src/engine-components/postprocessing/Effects/Sharpening.ts +143 -143
  971. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
  972. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +103 -103
  973. package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
  974. package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
  975. package/src/engine-components/postprocessing/PostProcessingEffect.ts +192 -192
  976. package/src/engine-components/postprocessing/PostProcessingHandler.ts +573 -560
  977. package/src/engine-components/postprocessing/Volume.ts +426 -426
  978. package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
  979. package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
  980. package/src/engine-components/postprocessing/index.ts +5 -5
  981. package/src/engine-components/postprocessing/utils.ts +154 -154
  982. package/src/engine-components/timeline/PlayableDirector.ts +722 -722
  983. package/src/engine-components/timeline/SignalAsset.ts +144 -144
  984. package/src/engine-components/timeline/TimelineModels.ts +92 -92
  985. package/src/engine-components/timeline/TimelineTracks.ts +967 -967
  986. package/src/engine-components/timeline/index.ts +3 -3
  987. package/src/engine-components/ui/BaseUIComponent.ts +203 -203
  988. package/src/engine-components/ui/Button.ts +307 -307
  989. package/src/engine-components/ui/Canvas.ts +419 -419
  990. package/src/engine-components/ui/CanvasGroup.ts +54 -54
  991. package/src/engine-components/ui/EventSystem.ts +854 -854
  992. package/src/engine-components/ui/Graphic.ts +275 -275
  993. package/src/engine-components/ui/Image.ts +112 -112
  994. package/src/engine-components/ui/InputField.ts +321 -321
  995. package/src/engine-components/ui/Interfaces.ts +57 -57
  996. package/src/engine-components/ui/Layout.ts +334 -334
  997. package/src/engine-components/ui/Outline.ts +13 -13
  998. package/src/engine-components/ui/PointerEvents.ts +206 -206
  999. package/src/engine-components/ui/RaycastUtils.ts +69 -69
  1000. package/src/engine-components/ui/Raycaster.ts +102 -102
  1001. package/src/engine-components/ui/RectTransform.ts +375 -375
  1002. package/src/engine-components/ui/SpatialHtml.ts +79 -79
  1003. package/src/engine-components/ui/Symbols.ts +1 -1
  1004. package/src/engine-components/ui/Text.ts +578 -578
  1005. package/src/engine-components/ui/Utils.ts +113 -113
  1006. package/src/engine-components/utils/EnvironmentScene.ts +245 -245
  1007. package/src/engine-components/utils/LookAt.ts +88 -88
  1008. package/src/engine-components/utils/OpenURL.ts +114 -114
  1009. package/src/engine-components/webxr/Avatar.ts +265 -265
  1010. package/src/engine-components/webxr/TeleportTarget.ts +9 -9
  1011. package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
  1012. package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
  1013. package/src/engine-components/webxr/WebXR.ts +585 -585
  1014. package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
  1015. package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
  1016. package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
  1017. package/src/engine-components/webxr/WebXRRig.ts +77 -77
  1018. package/src/engine-components/webxr/XRFlag.ts +147 -147
  1019. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
  1020. package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
  1021. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
  1022. package/src/engine-components/webxr/index.ts +2 -2
  1023. package/src/engine-components/webxr/types.ts +3 -3
  1024. package/src/engine-components-experimental/Presentation.ts +12 -12
  1025. package/src/engine-components-experimental/api.ts +4 -4
  1026. package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
  1027. package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
  1028. package/src/engine-schemes/COMPILE_TS.bat +11 -11
  1029. package/src/engine-schemes/README.md +1 -1
  1030. package/src/engine-schemes/api.ts +12 -12
  1031. package/src/engine-schemes/schemes.ts +28 -28
  1032. package/src/engine-schemes/synced-camera-model.ts +92 -92
  1033. package/src/engine-schemes/synced-transform-model.ts +90 -90
  1034. package/src/engine-schemes/syncedCamera.fbs +10 -10
  1035. package/src/engine-schemes/transform.ts +50 -50
  1036. package/src/engine-schemes/transforms.fbs +25 -25
  1037. package/src/engine-schemes/vec.fbs +19 -19
  1038. package/src/engine-schemes/vec2.ts +33 -33
  1039. package/src/engine-schemes/vec3.ts +38 -38
  1040. package/src/engine-schemes/vec4.ts +43 -43
  1041. package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
  1042. package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
  1043. package/src/include/draco/draco_decoder.js +34 -34
  1044. package/src/include/ktx2/basis_transcoder.js +21 -21
  1045. package/src/include/needle/arial-msdf.json +1471 -1471
  1046. package/src/include/three/DragControls.js +231 -231
  1047. package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
  1048. package/src/needle-engine.ts +70 -70
  1049. package/dist/generateMeshBVH.worker-Cdfpaq5W.js +0 -25
  1050. package/src/engine-schemes/dist/api.js +0 -17
  1051. package/src/engine-schemes/dist/api.js.meta +0 -7
  1052. package/src/engine-schemes/dist/schemes.js +0 -25
  1053. package/src/engine-schemes/dist/schemes.js.meta +0 -7
  1054. package/src/engine-schemes/dist/synced-camera-model.js +0 -74
  1055. package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
  1056. package/src/engine-schemes/dist/synced-transform-model.js +0 -73
  1057. package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
  1058. package/src/engine-schemes/dist/transform.js +0 -46
  1059. package/src/engine-schemes/dist/transform.js.meta +0 -7
  1060. package/src/engine-schemes/dist/vec2.js +0 -32
  1061. package/src/engine-schemes/dist/vec2.js.meta +0 -7
  1062. package/src/engine-schemes/dist/vec3.js +0 -36
  1063. package/src/engine-schemes/dist/vec3.js.meta +0 -7
  1064. package/src/engine-schemes/dist/vec4.js +0 -40
  1065. package/src/engine-schemes/dist/vec4.js.meta +0 -7
  1066. package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
  1067. package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
@@ -1,855 +1,855 @@
1
- import { BatchedMesh, BufferGeometry, Color, Material, Matrix4, Mesh, MeshStandardMaterial, Object3D, RawShaderMaterial } from "three";
2
-
3
- import { isDevEnvironment, showBalloonError } from "../engine/debug/index.js";
4
- import { Gizmos } from "../engine/engine_gizmos.js";
5
- import { $instancingAutoUpdateBounds, $instancingRenderer, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
6
- import { Context } from "../engine/engine_setup.js";
7
- import { getParam, makeIdFromRandomWords } from "../engine/engine_utils.js";
8
- import { NEEDLE_progressive } from "../engine/extensions/index.js";
9
- import { GameObject } from "./Component.js";
10
- import type { Renderer } from "./Renderer.js";
11
-
12
- const debugInstancing = getParam("debuginstancing");
13
-
14
- declare class InstancingSetupArgs {
15
- rend: Renderer;
16
- foundMeshes: number;
17
- useMatrixWorldAutoUpdate: boolean;
18
- };
19
-
20
- /**
21
- * Handles instancing for Needle Engine.
22
- */
23
- export class InstancingHandler {
24
- static readonly instance: InstancingHandler = new InstancingHandler();
25
-
26
- /** This is the initial instance count when creating a new instancing structure.
27
- * Override this and the number of max instances that you expect for a given object.
28
- * The larger the value the more objects can be added without having to resize but it will also consume more memory.
29
- * (The instancing mesh renderer will grow x2 if the max instance count is reached)
30
- * @default 4
31
- * @returns The initial instance count
32
- * */
33
- static getStartInstanceCount = (_obj: Object3D) => {
34
- return 4;
35
- };
36
-
37
- public objs: InstancedMeshRenderer[] = [];
38
-
39
- public setup(renderer: Renderer, obj: Object3D, context: Context, handlesArray: InstanceHandle[] | null, args: InstancingSetupArgs, level: number = 0)
40
- : InstanceHandle[] | null {
41
-
42
- // make sure setting casting settings are applied so when we add the mesh to the InstancedMesh we can ask for the correct cast shadow setting
43
- renderer.applySettings(obj);
44
- const res = this.tryCreateOrAddInstance(obj, context, args);
45
- if (res) {
46
- if (handlesArray === null) handlesArray = [];
47
- 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
- });
61
- }
62
- }
63
-
64
- else if (level <= 0 && obj.type !== "Mesh") {
65
- const nextLevel = level + 1;
66
- for (const ch of obj.children) {
67
- handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
68
- }
69
- }
70
-
71
- if (level === 0) {
72
- // For multi material objects we only want to track the root object's matrix
73
- if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
74
- this.autoUpdateInstanceMatrix(obj);
75
- }
76
- }
77
-
78
- return handlesArray;
79
- }
80
-
81
- private tryCreateOrAddInstance(obj: Object3D, context: Context, args: InstancingSetupArgs): InstanceHandle | null {
82
- if (obj.type === "Mesh") {
83
- const index = args.foundMeshes;
84
- args.foundMeshes += 1;
85
- if (!args.rend.enableInstancing) return null;
86
- if (args.rend.enableInstancing === true) {
87
- // instancing is enabled globally
88
- // continue....
89
- }
90
- else {
91
- if (index >= args.rend.enableInstancing.length) {
92
- if (debugInstancing) console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
93
- return null;
94
- }
95
- if (!args.rend.enableInstancing[index]) {
96
- // instancing is disabled
97
- // console.log("Instancing is disabled", obj);
98
- return null;
99
- }
100
- }
101
- // instancing is enabled:
102
- const mesh = obj as Mesh;
103
- // const geo = mesh.geometry as BufferGeometry;
104
- const mat = mesh.material as Material;
105
-
106
- for (const i of this.objs) {
107
- if (!i.canAdd(mesh.geometry, mat)) continue;
108
- const handle = i.addInstance(mesh);
109
- return handle;
110
- }
111
- let maxInstances = InstancingHandler.getStartInstanceCount(obj);
112
- if (!maxInstances || maxInstances < 0) {
113
- maxInstances = 4;
114
- }
115
- let name = obj.name;
116
- if (!name?.length) name = makeIdFromRandomWords();
117
- const i = new InstancedMeshRenderer(name, mesh.geometry, mat, maxInstances, context);
118
- this.objs.push(i);
119
- const handle = i.addInstance(mesh);
120
- return handle;
121
- }
122
- return null;
123
- }
124
-
125
- private autoUpdateInstanceMatrix(obj: Object3D) {
126
- const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
127
- const previousMatrix: Matrix4 = obj.matrixWorld.clone();
128
- const matrixChangeWrapper = (a: Matrix4, b: Matrix4) => {
129
- const newMatrixWorld = original(a, b);
130
- if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
131
- previousMatrix.copy(newMatrixWorld)
132
- obj[NEED_UPDATE_INSTANCE_KEY] = true;
133
- }
134
- return newMatrixWorld;
135
- };
136
- obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
137
- // wrap matrixWorldNeedsUpdate
138
- // let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
139
- // Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
140
- // get: () => {
141
- // return originalMatrixWorldNeedsUpdate;
142
- // },
143
- // set: (value: boolean) => {
144
- // if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
145
- // originalMatrixWorldNeedsUpdate = value;
146
- // }
147
- // });
148
- }
149
- }
150
-
151
- /**
152
- * The instance handle is used to interface with the mesh that is rendered using instancing.
153
- */
154
- export class InstanceHandle {
155
-
156
- static readonly all: InstanceHandle[] = [];
157
-
158
- /** The name of the object */
159
- get name(): string {
160
- return this.object.name;
161
- }
162
- get isActive() {
163
- return this.__instanceIndex >= 0;
164
- }
165
- get vertexCount() {
166
- return this.object.geometry.attributes.position.count;
167
- }
168
- get maxVertexCount() {
169
- // we get the max of the estimated MAX lod vertex count and the actual vertex count
170
- return Math.max(this.meshInformation.vertexCount, this.vertexCount);
171
- }
172
- get reservedVertexCount() {
173
- return this.__reservedVertexRange;
174
- }
175
- get indexCount() {
176
- return this.object.geometry.index ? this.object.geometry.index.count : 0;
177
- }
178
- get maxIndexCount() {
179
- // we get the max of the estimated MAX lod index count and the actual index count
180
- return Math.max(this.meshInformation.indexCount, this.indexCount);
181
- }
182
- get reservedIndexCount() {
183
- return this.__reservedIndexRange;
184
- }
185
-
186
- /** The object that is being instanced */
187
- readonly object: Mesh;
188
-
189
- /** The instancer/BatchedMesh that is rendering this object*/
190
- readonly renderer: InstancedMeshRenderer;
191
-
192
- /** @internal */
193
- __instanceIndex: number = -1;
194
- /** @internal */
195
- __reservedVertexRange: number = 0;
196
- /** @internal */
197
- __reservedIndexRange: number = 0;
198
- __geometryIndex: number = -1;
199
-
200
- /** The mesh information of the object - this tries to also calculate the LOD info */
201
- readonly meshInformation: MeshInformation;
202
-
203
- constructor(originalObject: Mesh, instancer: InstancedMeshRenderer) {
204
- this.__instanceIndex = -1;
205
- this.object = originalObject;
206
- this.renderer = instancer;
207
- originalObject[$instancingRenderer] = instancer;
208
- // TODO: this doesn't have LOD information *yet* in some cases - hence we can not rely on it for the max vertex counts
209
- this.meshInformation = getMeshInformation(originalObject.geometry);
210
- InstanceHandle.all.push(this);
211
- }
212
-
213
- /** Calculates the mesh information again
214
- * @returns true if the vertex count or index count has changed
215
- */
216
- updateMeshInformation(): boolean {
217
- const newMeshInformation = getMeshInformation(this.object.geometry);
218
- const oldVertexCount = this.meshInformation.vertexCount;
219
- const oldIndexCount = this.meshInformation.indexCount;
220
- Object.assign(this.meshInformation, newMeshInformation);
221
- return oldVertexCount !== this.meshInformation.vertexCount || oldIndexCount !== this.meshInformation.indexCount;
222
- }
223
-
224
- /** Updates the matrix from the rendered object. Will also call updateWorldMatrix internally */
225
- updateInstanceMatrix(updateChildren: boolean = false, updateMatrix: boolean = true) {
226
- if (this.__instanceIndex < 0) return;
227
- if (updateMatrix) this.object.updateWorldMatrix(true, updateChildren);
228
- this.renderer.updateInstance(this.object.matrixWorld, this.__instanceIndex);
229
- }
230
- /** Updates the matrix of the instance */
231
- setMatrix(matrix: Matrix4) {
232
- if (this.__instanceIndex < 0) return;
233
- this.renderer.updateInstance(matrix, this.__instanceIndex);
234
- }
235
-
236
- /** Can be used to change the geometry of this instance */
237
- setGeometry(geo: BufferGeometry) {
238
- if (this.__geometryIndex < 0) return false;
239
-
240
- const self = this;
241
-
242
- if (this.vertexCount > this.__reservedVertexRange) {
243
- return handleInvalidRange(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);
244
-
245
- }
246
- if (this.indexCount > this.__reservedIndexRange) {
247
- return handleInvalidRange(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);
248
- }
249
-
250
-
251
- return this.renderer.updateGeometry(geo, this.__geometryIndex);
252
-
253
- function handleInvalidRange(error: string): boolean {
254
- if (self.updateMeshInformation()) {
255
- // Gizmos.DrawWireSphere(self.object.worldPosition, .5, 0xff0000, 5);
256
- self.renderer.remove(self, true);
257
- // Gizmos.DrawWireSphere(self.object.worldPosition, .5, 0x33ff00, 5);
258
- // self.object.scale.multiplyScalar(10);
259
- if (self.renderer.add(self)) {
260
- return true;
261
- }
262
- }
263
- if (isDevEnvironment() || debugInstancing) {
264
- console.error(error);
265
- }
266
- return false;
267
- }
268
- }
269
-
270
- /** Adds this object to the instancing renderer (effectively activating instancing) */
271
- add() {
272
- if (this.__instanceIndex >= 0) return;
273
- this.renderer.add(this);
274
- GameObject.markAsInstancedRendered(this.object, true);
275
- }
276
-
277
- /** Removes this object from the instancing renderer
278
- * @param delete_ If true, the instance handle will be removed from the global list
279
- */
280
- remove(delete_: boolean) {
281
- if (this.__instanceIndex < 0) return;
282
- this.renderer.remove(this, delete_);
283
- GameObject.markAsInstancedRendered(this.object, false);
284
- if (delete_) {
285
- const i = InstanceHandle.all.indexOf(this);
286
- if (i >= 0) {
287
- InstanceHandle.all.splice(i, 1);
288
- }
289
- }
290
- }
291
- }
292
-
293
- class InstancedMeshRenderer {
294
- /** The three instanced mesh
295
- * @link https://threejs.org/docs/#api/en/objects/InstancedMesh
296
- */
297
- get batchedMesh() {
298
- return this._batchedMesh;
299
- }
300
- get visible(): boolean {
301
- return this._batchedMesh.visible;
302
- }
303
- set visible(val: boolean) {
304
- this._batchedMesh.visible = val;
305
- }
306
- get castShadow(): boolean {
307
- return this._batchedMesh.castShadow;
308
- }
309
- set castShadow(val: boolean) {
310
- this._batchedMesh.castShadow = val;
311
- }
312
- set receiveShadow(val: boolean) {
313
- this._batchedMesh.receiveShadow = val;
314
- }
315
-
316
- /** If true, the instancer is allowed to grow when the max instance count is reached */
317
- allowResize: boolean = true;
318
-
319
- /** The name of the instancer */
320
- name: string = "";
321
-
322
- /** The added geometry */
323
- readonly geometry: BufferGeometry;
324
-
325
- /** The material used for the instanced mesh */
326
- readonly material: Material;
327
-
328
- /** The current number of instances */
329
- get count(): number { return this._currentInstanceCount; }
330
-
331
- /** Update the bounding box and sphere of the instanced mesh
332
- * @param box If true, update the bounding box
333
- * @param sphere If true, update the bounding sphere
334
- */
335
- updateBounds(box: boolean = true, sphere: boolean = true) {
336
- this._needUpdateBounds = false;
337
- if (box)
338
- this._batchedMesh.computeBoundingBox();
339
- if (sphere)
340
- this._batchedMesh.computeBoundingSphere();
341
- if (debugInstancing && this._batchedMesh.boundingSphere) {
342
- const sphere = this._batchedMesh.boundingSphere;
343
- // const worldPos = this._batchedMesh.worldPosition.add(sphere.center);
344
- // const worldRadius = sphere!.radius;
345
- Gizmos.DrawWireSphere(sphere.center, sphere.radius, 0x00ff00);
346
- }
347
- }
348
-
349
- private _context: Context;
350
- private _batchedMesh: BatchedMesh;
351
- private _handles: (InstanceHandle | null)[] = [];
352
- private readonly _geometryIds: Map<BufferGeometry, number> = new Map();
353
- private _maxInstanceCount: number;
354
-
355
- private _currentInstanceCount = 0;
356
- private _currentVertexCount = 0;
357
- private _currentIndexCount = 0;
358
-
359
- private _maxVertexCount: number;
360
- private _maxIndexCount: number;
361
-
362
- private static nullMatrix: Matrix4 = new Matrix4();
363
-
364
- /** Check if the geometry can be added to this instancer
365
- * @param geometry The geometry to check
366
- * @param material The material of the geometry
367
- * @returns true if the geometry can be added
368
- */
369
- canAdd(geometry: BufferGeometry, material: Material): boolean {
370
-
371
- if (this._maxVertexCount > 10_000_000) return false;
372
-
373
- // The material instance must match
374
- // perhaps at some point later we *could* check if it's the same shader and properties but this would be risky
375
- if (material !== this.material) {
376
- const canMergeMaterial = false;
377
- // if (material.type === this.material.type) {
378
- // switch (material.type) {
379
- // case "MeshStandardMaterial":
380
- // // check if the material properties are the same
381
- // const m0 = this.material as MeshStandardMaterial;
382
- // const m1 = material as MeshStandardMaterial;
383
- // if(m0.map !== m1.map) return false;
384
- // // if(m0.color.equals(m1.color) === false) return false;
385
- // if(m0.roughness !== m1.roughness) return false;
386
- // if(m0.metalness !== m1.metalness) return false;
387
- // if(m0.envMap !== m1.envMap) return false;
388
- // if(m0.envMapIntensity !== m1.envMapIntensity) return false;
389
- // if(m0.lightMap !== m1.lightMap) return false;
390
- // if(m0.lightMapIntensity !== m1.lightMapIntensity) return false;
391
- // if(m0.aoMap !== m1.aoMap) return false;
392
- // if(m0.aoMapIntensity !== m1.aoMapIntensity) return false;
393
- // if(m0.emissive.equals(m1.emissive) === false) return false;
394
- // if(m0.emissiveIntensity !== m1.emissiveIntensity) return false;
395
- // if(m0.emissiveMap !== m1.emissiveMap) return false;
396
- // if(m0.bumpMap !== m1.bumpMap) return false;
397
- // if(m0.bumpScale !== m1.bumpScale) return false;
398
- // if(m0.normalMap !== m1.normalMap) return false;
399
- // if(m0.normalScale.equals(m1.normalScale) === false) return false;
400
- // if(m0.displacementMap !== m1.displacementMap) return false;
401
- // if(m0.displacementScale !== m1.displacementScale) return false;
402
- // if(m0.displacementBias !== m1.displacementBias) return false;
403
- // if(m0.roughnessMap !== m1.roughnessMap) return false;
404
- // if(m0.metalnessMap !== m1.metalnessMap) return false;
405
- // if(m0.alphaMap !== m1.alphaMap) return false;
406
- // if(m0.envMapIntensity !== m1.envMapIntensity) return false;
407
- // canMergeMaterial = true;
408
- // break;
409
- // }
410
- // }
411
- if (!canMergeMaterial) {
412
- return false;
413
- }
414
- }
415
-
416
- // if(this.geometry !== _geometry) return false;
417
-
418
- // console.log(geometry.name, geometry.uuid);
419
-
420
- if (!this.validateGeometry(geometry)) return false;
421
-
422
- // const validationMethod = this.inst["_validateGeometry"];
423
- // if (!validationMethod) throw new Error("InstancedMesh does not have a _validateGeometry method");
424
- // try {
425
- // validationMethod.call(this.inst, _geometry);
426
- // }
427
- // catch (err) {
428
- // // console.error(err);
429
- // return false;
430
- // }
431
-
432
- const hasSpace = !this.mustGrow(geometry);
433
- if (hasSpace) return true;
434
- if (this.allowResize) return true;
435
-
436
- return false;
437
- }
438
-
439
- private _needUpdateBounds: boolean = false;
440
- private _debugMaterial: MeshStandardMaterial | null = null;
441
-
442
- constructor(name: string, geo: BufferGeometry, material: Material, initialMaxCount: number, context: Context) {
443
- this.name = name;
444
- this.geometry = geo;
445
- this.material = material;
446
- this._context = context;
447
- this._maxInstanceCount = Math.max(2, initialMaxCount);
448
- if (debugInstancing) {
449
- this._debugMaterial = createDebugMaterial();
450
- }
451
- const estimate = this.tryEstimateVertexCountSize(this._maxInstanceCount, [geo], initialMaxCount);
452
- this._maxVertexCount = estimate.vertexCount;
453
- this._maxIndexCount = estimate.indexCount;
454
- this._batchedMesh = new BatchedMesh(this._maxInstanceCount, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
455
- // this.inst = new InstancedMesh(geo, material, count);
456
- this._batchedMesh[$instancingAutoUpdateBounds] = true;
457
- // this.inst.count = 0;
458
- this._batchedMesh.visible = true;
459
- this._context.scene.add(this._batchedMesh);
460
-
461
- // Not handled by RawShaderMaterial, so we need to set the define explicitly.
462
- // Edge case: theoretically some users of the material could use it in an
463
- // instanced fashion, and some others not. In that case, the material would not
464
- // be able to be shared between the two use cases. We could probably add a
465
- // onBeforeRender call for the InstancedMesh and set the define there.
466
- // Same would apply if we support skinning -
467
- // there we would have to split instanced batches so that the ones using skinning
468
- // are all in the same batch.
469
- if (material instanceof RawShaderMaterial) {
470
- material.defines["USE_INSTANCING"] = true;
471
- material.needsUpdate = true;
472
- }
473
-
474
- context.pre_render_callbacks.push(this.onBeforeRender);
475
- context.post_render_callbacks.push(this.onAfterRender);
476
-
477
- if (debugInstancing) {
478
- console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for \"${name}\"`)
479
- }
480
- }
481
-
482
- dispose() {
483
- if (debugInstancing) console.warn("Dispose instanced renderer", this.name);
484
- this._context.scene.remove(this._batchedMesh);
485
- this._batchedMesh.dispose();
486
- this._batchedMesh = null as any;
487
- this._handles = [];
488
- }
489
-
490
- addInstance(obj: Mesh): InstanceHandle | null {
491
-
492
- const handle = new InstanceHandle(obj, this);
493
-
494
- if (obj.castShadow === true && this._batchedMesh.castShadow === false) {
495
- this._batchedMesh.castShadow = true;
496
- }
497
- if (obj.receiveShadow === true && this._batchedMesh.receiveShadow === false) {
498
- this._batchedMesh.receiveShadow = true;
499
- }
500
-
501
- try {
502
- this.add(handle);
503
- }
504
- catch (e) {
505
- console.error(`Failed adding mesh to instancing (object name: \"${obj.name}\", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})\n`, e);
506
- if (isDevEnvironment()) {
507
- showBalloonError("Failed instancing mesh. See the browser console for details.");
508
- debugger;
509
- }
510
- return null;
511
- }
512
-
513
- return handle;
514
- }
515
-
516
-
517
- add(handle: InstanceHandle) {
518
- const geo = handle.object.geometry as BufferGeometry;
519
-
520
- if (!geo || !geo.attributes) {
521
- console.error("Cannot add object to instancing without geometry", handle.name);
522
- return false;
523
- }
524
-
525
- if (this.mustGrow(geo)) {
526
- if (this.allowResize) {
527
- this.grow(geo);
528
- }
529
- else {
530
- console.error("Cannot add instance, max count reached", this.name, this.count, this._maxInstanceCount);
531
- return false;
532
- }
533
- }
534
-
535
- handle.object.updateWorldMatrix(true, true);
536
- this.addGeometry(handle);
537
- this._handles[handle.__instanceIndex] = handle;
538
- this._currentInstanceCount += 1;
539
-
540
- this.markNeedsUpdate();
541
-
542
- if (this._currentInstanceCount > 0)
543
- this._batchedMesh.visible = true;
544
-
545
- return true;
546
- }
547
-
548
- remove(handle: InstanceHandle, delete_: boolean) {
549
- if (!handle) {
550
- return;
551
- }
552
- if (handle.__instanceIndex < 0 || this._handles[handle.__instanceIndex] != handle || this._currentInstanceCount <= 0) {
553
- // console.warn("Cannot remove instance, handle is invalid", handle.name);
554
- return;
555
- }
556
-
557
- this.removeGeometry(handle, delete_);
558
- this._handles[handle.__instanceIndex] = null;
559
- handle.__instanceIndex = -1;
560
-
561
- if (this._currentInstanceCount > 0) {
562
- this._currentInstanceCount -= 1;
563
- }
564
-
565
- if (this._currentInstanceCount <= 0)
566
- this._batchedMesh.visible = false;
567
-
568
- this.markNeedsUpdate();
569
- }
570
-
571
- updateInstance(mat: Matrix4, index: number) {
572
- this._batchedMesh.setMatrixAt(index, mat);
573
- this.markNeedsUpdate();
574
- }
575
-
576
- updateGeometry(geo: BufferGeometry, geometryIndex: number): boolean {
577
- if (!this.validateGeometry(geo)) {
578
- return false;
579
- }
580
-
581
- if (this.mustGrow()) {
582
- this.grow(geo);
583
- }
584
- if (debugInstancing)
585
- console.debug("[Instancing] UPDATE GEOMETRY at " + geometryIndex, this._batchedMesh["_geometryCount"], geo.name, getMeshInformation(geo), geo.attributes.position.count, geo.index ? geo.index.count : 0);
586
-
587
- this._batchedMesh.setGeometryAt(geometryIndex, geo);
588
- // for LOD mesh updates we need to make sure to save the geometry index
589
- this._geometryIds.set(geo, geometryIndex);
590
- this.markNeedsUpdate();
591
- return true;
592
- }
593
-
594
- private onBeforeRender = () => {
595
- // ensure the instanced mesh is rendered / has correct layers
596
- this._batchedMesh.layers.enableAll();
597
-
598
- if (this._needUpdateBounds && this._batchedMesh[$instancingAutoUpdateBounds] === true) {
599
- if (debugInstancing === "verbose") console.log("Update instancing bounds", this.name, this._batchedMesh.matrixWorldNeedsUpdate);
600
- this.updateBounds();
601
- }
602
- }
603
-
604
- private onAfterRender = () => {
605
- // hide the instanced mesh again when its not being rendered (for raycasting we still use the original object)
606
- this._batchedMesh.layers.disableAll();
607
- }
608
-
609
- private validateGeometry(geometry: BufferGeometry): boolean {
610
- const batchGeometry = this.geometry;
611
-
612
- for (const attributeName in batchGeometry.attributes) {
613
- if (attributeName === "batchId") {
614
- continue;
615
- }
616
- if (!geometry.hasAttribute(attributeName)) {
617
- if (isDevEnvironment())
618
- console.warn(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`);
619
- // geometry.setAttribute(attributeName, batchGeometry.getAttribute(attributeName).clone());
620
- return false;
621
- // throw new Error(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`);
622
- }
623
- // const srcAttribute = geometry.getAttribute(attributeName);
624
- // const dstAttribute = batchGeometry.getAttribute(attributeName);
625
- // if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) {
626
- // if (debugInstancing) throw new Error('BatchedMesh: All attributes must have a consistent itemSize and normalized value.');
627
- // return false;
628
- // }
629
- }
630
- return true;
631
- }
632
-
633
- private markNeedsUpdate() {
634
- if (debugInstancing === "verbose") {
635
- console.warn("Marking instanced mesh dirty", this.name);
636
- }
637
- this._needUpdateBounds = true;
638
- // this.inst.instanceMatrix.needsUpdate = true;
639
- }
640
-
641
- /**
642
- * @param geo The geometry to add (if none is provided it means the geometry is already added and just updated)
643
- */
644
- private mustGrow(geo?: BufferGeometry): boolean {
645
- if (this.count >= this._maxInstanceCount) return true;
646
- if (!geo || !geo.attributes) return false;
647
- const meshInfo = getMeshInformation(geo);
648
- const newVertexCount = meshInfo.vertexCount;
649
- const newIndexCount = meshInfo.indexCount;
650
- return this._currentVertexCount + newVertexCount > this._maxVertexCount || this._currentIndexCount + newIndexCount > this._maxIndexCount;
651
- }
652
-
653
- private grow(geometry: BufferGeometry) {
654
- const growFactor = 2;
655
- const newSize = Math.ceil(this._maxInstanceCount * growFactor);
656
-
657
- // create a new BatchedMesh instance
658
- const estimatedSpace = this.tryEstimateVertexCountSize(newSize, [geometry]);// geometry.attributes.position.count;
659
- // const indices = geometry.index ? geometry.index.count : 0;
660
- const newMaxVertexCount = Math.max(this._maxVertexCount, estimatedSpace.vertexCount);
661
- const newMaxIndexCount = Math.max(this._maxIndexCount, estimatedSpace.indexCount, Math.ceil(this._maxVertexCount * growFactor));
662
-
663
- if (debugInstancing) {
664
- 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}`);
666
- this._debugMaterial = createDebugMaterial();
667
- }
668
- 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}`);
670
- }
671
-
672
- this._maxVertexCount = newMaxVertexCount;
673
- this._maxIndexCount = newMaxIndexCount;
674
- const newInst = new BatchedMesh(newSize, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
675
- newInst.layers = this._batchedMesh.layers;
676
- newInst.castShadow = this._batchedMesh.castShadow;
677
- newInst.receiveShadow = this._batchedMesh.receiveShadow;
678
- newInst.visible = this._batchedMesh.visible;
679
- newInst[$instancingAutoUpdateBounds] = this._batchedMesh[$instancingAutoUpdateBounds];
680
- newInst.matrixAutoUpdate = this._batchedMesh.matrixAutoUpdate;
681
- newInst.matrixWorldNeedsUpdate = this._batchedMesh.matrixWorldNeedsUpdate;
682
- newInst.matrixAutoUpdate = this._batchedMesh.matrixAutoUpdate;
683
- newInst.matrixWorld.copy(this._batchedMesh.matrixWorld);
684
- newInst.matrix.copy(this._batchedMesh.matrix);
685
-
686
- // dispose the old batched mesh
687
- this._batchedMesh.dispose();
688
- this._batchedMesh.removeFromParent();
689
- this._geometryIds.clear();
690
-
691
- this._batchedMesh = newInst;
692
- this._maxInstanceCount = newSize;
693
-
694
- // since we have a new batched mesh we need to re-add all the instances
695
- // fixes https://linear.app/needle/issue/NE-5711
696
-
697
- // add current instances to new instanced mesh
698
- const original = [...this._handles];
699
- this._handles = [];
700
- for (const handle of original) {
701
- if (handle && handle.__instanceIndex >= 0) {
702
- this.addGeometry(handle);
703
- this._handles[handle.__instanceIndex] = handle;
704
- }
705
- }
706
-
707
- this._context.scene.add(newInst);
708
- }
709
-
710
- private tryEstimateVertexCountSize(newMaxInstances: number, _newGeometries?: BufferGeometry[], newGeometriesFactor: number = 1): MeshInformation {
711
- /** Used geometries and how many instances use them */
712
- const usedGeometries = new Map<BufferGeometry, MeshInformation & { count: number }>();
713
- for (const handle of this._handles) {
714
- if (handle && handle.__instanceIndex >= 0 && handle.object.geometry) {
715
- if (!usedGeometries.has(handle.object.geometry as BufferGeometry)) {
716
- const data = getMeshInformation(handle.object.geometry as BufferGeometry);
717
- const meshinfo = { count: 1, ...data };
718
- usedGeometries.set(handle.object.geometry as BufferGeometry, meshinfo);
719
- }
720
- else {
721
- const entry = usedGeometries.get(handle.object.geometry as BufferGeometry)!;
722
- entry.count += 1;
723
- }
724
-
725
- }
726
- }
727
-
728
- // then calculate the total vertex count
729
- let totalVertices = 0;
730
- let totalIndices = 0;
731
- // let maxVertices = 0;
732
- for (const [_geo, data] of usedGeometries) {
733
- totalVertices += data.vertexCount * data.count;
734
- totalIndices += data.indexCount * data.count;
735
- // maxVertices = Math.max(maxVertices, geo.attributes.position.count * count);
736
- }
737
- // 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;
742
-
743
- // if new geometries are provided we *know* that they will be added
744
- // so we make sure to include them in the calculation
745
- if (_newGeometries) {
746
- for (const geo of _newGeometries) {
747
- const meshinfo = getMeshInformation(geo);
748
- if (meshinfo != null) {
749
- maxVertexCount += meshinfo.vertexCount * newGeometriesFactor;
750
- maxIndexCount += meshinfo.indexCount * newGeometriesFactor;
751
- }
752
-
753
- }
754
- }
755
-
756
- return { vertexCount: maxVertexCount, indexCount: maxIndexCount };
757
- }
758
-
759
-
760
- private addGeometry(handle: InstanceHandle) {
761
-
762
- const obj = handle.object;
763
- const geo = obj.geometry as BufferGeometry;
764
- if (!geo) {
765
- // if the geometry is null we cannot add it
766
- return;
767
- }
768
-
769
- // otherwise add more geometry / instances
770
- let geometryId = this._geometryIds.get(geo);
771
- if (geometryId === undefined || geometryId === null) {
772
- 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`);
774
-
775
- geometryId = this._batchedMesh.addGeometry(geo, handle.maxVertexCount, handle.maxIndexCount);
776
- this._geometryIds.set(geo, geometryId);
777
- }
778
- else {
779
- if (debugInstancing === "verbose") console.log(`[Instancing] > ADD INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances`);
780
- }
781
- this._currentVertexCount += handle.maxVertexCount;
782
- this._currentIndexCount += handle.maxIndexCount;
783
- const i = this._batchedMesh.addInstance(geometryId);
784
- handle.__geometryIndex = geometryId;
785
- handle.__instanceIndex = i;
786
- handle.__reservedVertexRange = handle.maxVertexCount;
787
- handle.__reservedIndexRange = handle.maxIndexCount;
788
- this._batchedMesh.setMatrixAt(i, handle.object.matrixWorld);
789
- if (debugInstancing)
790
- console.debug(`[Instancing] > ADDED INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
791
-
792
- }
793
-
794
-
795
- private removeGeometry(handle: InstanceHandle, _del: boolean) {
796
- if (handle.__instanceIndex < 0) {
797
- console.warn("Cannot remove geometry, instance index is invalid", handle.name);
798
- return;
799
- }
800
- // deleteGeometry is currently not useable since there's no optimize method
801
- // https://github.com/mrdoob/three.js/issues/27985
802
- // if (del)
803
- // this.inst.deleteGeometry(handle.__instanceIndex);
804
- // else
805
- // this._batchedMesh.setVisibleAt(handle.__instanceIndex, false);
806
- if(debugInstancing) {
807
- console.debug(`[Instancing] < REMOVE INSTANCE \"${handle.name}\" at [${handle.__instanceIndex}]\nGEOMETRY_ID=${handle.__geometryIndex}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
808
- }
809
- this._batchedMesh.deleteInstance(handle.__instanceIndex);
810
- }
811
- }
812
-
813
- declare type BucketInfo = {
814
- geometryIndex: number;
815
- vertexCount: number;
816
- indexCount: number;
817
- }
818
-
819
- declare type MeshInformation = {
820
- vertexCount: number;
821
- indexCount: number;
822
- }
823
-
824
- function getMeshInformation(geo: BufferGeometry): MeshInformation {
825
- if (!geo) {
826
- if (isDevEnvironment()) console.error("Cannot get mesh information from null geometry");
827
- return { vertexCount: 0, indexCount: 0 };
828
- }
829
- let vertexCount = geo.attributes?.position?.count || 0;
830
- let indexCount = geo.index ? geo.index.count : 0;
831
- const lodInfo = NEEDLE_progressive.getMeshLODInformation(geo);
832
- if (lodInfo) {
833
- const lod0 = lodInfo.lods[0];
834
- let lod0Count = lod0.vertexCount;
835
- let lod0IndexCount = lod0.indexCount;
836
- // add some wiggle room: https://linear.app/needle/issue/NE-4505
837
- const extra = Math.min(200, Math.ceil(lod0Count * .05));
838
- lod0Count += extra;
839
- lod0IndexCount += 20;
840
- vertexCount = Math.max(vertexCount, lod0Count);
841
- indexCount = Math.max(indexCount, lod0IndexCount);
842
- }
843
- vertexCount = Math.ceil(vertexCount);
844
- indexCount = Math.ceil(indexCount);
845
- return { vertexCount, indexCount };
846
- }
847
-
848
- function createDebugMaterial() {
849
- const mat = new MeshStandardMaterial({ color: new Color(Math.random(), Math.random(), Math.random()) });
850
- mat.emissive = mat.color;
851
- mat.emissiveIntensity = .3;
852
- if (getParam("wireframe"))
853
- mat.wireframe = true;
854
- return mat;
855
- }
1
+ import { BatchedMesh, BufferGeometry, Color, Material, Matrix4, Mesh, MeshStandardMaterial, Object3D, RawShaderMaterial } from "three";
2
+
3
+ import { isDevEnvironment, showBalloonError } from "../engine/debug/index.js";
4
+ import { Gizmos } from "../engine/engine_gizmos.js";
5
+ import { $instancingAutoUpdateBounds, $instancingRenderer, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
6
+ import { Context } from "../engine/engine_setup.js";
7
+ import { getParam, makeIdFromRandomWords } from "../engine/engine_utils.js";
8
+ import { NEEDLE_progressive } from "../engine/extensions/index.js";
9
+ import { GameObject } from "./Component.js";
10
+ import type { Renderer } from "./Renderer.js";
11
+
12
+ const debugInstancing = getParam("debuginstancing");
13
+
14
+ declare class InstancingSetupArgs {
15
+ rend: Renderer;
16
+ foundMeshes: number;
17
+ useMatrixWorldAutoUpdate: boolean;
18
+ };
19
+
20
+ /**
21
+ * Handles instancing for Needle Engine.
22
+ */
23
+ export class InstancingHandler {
24
+ static readonly instance: InstancingHandler = new InstancingHandler();
25
+
26
+ /** This is the initial instance count when creating a new instancing structure.
27
+ * Override this and the number of max instances that you expect for a given object.
28
+ * The larger the value the more objects can be added without having to resize but it will also consume more memory.
29
+ * (The instancing mesh renderer will grow x2 if the max instance count is reached)
30
+ * @default 4
31
+ * @returns The initial instance count
32
+ * */
33
+ static getStartInstanceCount = (_obj: Object3D) => {
34
+ return 4;
35
+ };
36
+
37
+ public objs: InstancedMeshRenderer[] = [];
38
+
39
+ public setup(renderer: Renderer, obj: Object3D, context: Context, handlesArray: InstanceHandle[] | null, args: InstancingSetupArgs, level: number = 0)
40
+ : InstanceHandle[] | null {
41
+
42
+ // make sure setting casting settings are applied so when we add the mesh to the InstancedMesh we can ask for the correct cast shadow setting
43
+ renderer.applySettings(obj);
44
+ const res = this.tryCreateOrAddInstance(obj, context, args);
45
+ if (res) {
46
+ if (handlesArray === null) handlesArray = [];
47
+ 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
+ });
61
+ }
62
+ }
63
+
64
+ else if (level <= 0 && obj.type !== "Mesh") {
65
+ const nextLevel = level + 1;
66
+ for (const ch of obj.children) {
67
+ handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
68
+ }
69
+ }
70
+
71
+ if (level === 0) {
72
+ // For multi material objects we only want to track the root object's matrix
73
+ if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
74
+ this.autoUpdateInstanceMatrix(obj);
75
+ }
76
+ }
77
+
78
+ return handlesArray;
79
+ }
80
+
81
+ private tryCreateOrAddInstance(obj: Object3D, context: Context, args: InstancingSetupArgs): InstanceHandle | null {
82
+ if (obj.type === "Mesh") {
83
+ const index = args.foundMeshes;
84
+ args.foundMeshes += 1;
85
+ if (!args.rend.enableInstancing) return null;
86
+ if (args.rend.enableInstancing === true) {
87
+ // instancing is enabled globally
88
+ // continue....
89
+ }
90
+ else {
91
+ if (index >= args.rend.enableInstancing.length) {
92
+ if (debugInstancing) console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
93
+ return null;
94
+ }
95
+ if (!args.rend.enableInstancing[index]) {
96
+ // instancing is disabled
97
+ // console.log("Instancing is disabled", obj);
98
+ return null;
99
+ }
100
+ }
101
+ // instancing is enabled:
102
+ const mesh = obj as Mesh;
103
+ // const geo = mesh.geometry as BufferGeometry;
104
+ const mat = mesh.material as Material;
105
+
106
+ for (const i of this.objs) {
107
+ if (!i.canAdd(mesh.geometry, mat)) continue;
108
+ const handle = i.addInstance(mesh);
109
+ return handle;
110
+ }
111
+ let maxInstances = InstancingHandler.getStartInstanceCount(obj);
112
+ if (!maxInstances || maxInstances < 0) {
113
+ maxInstances = 4;
114
+ }
115
+ let name = obj.name;
116
+ if (!name?.length) name = makeIdFromRandomWords();
117
+ const i = new InstancedMeshRenderer(name, mesh.geometry, mat, maxInstances, context);
118
+ this.objs.push(i);
119
+ const handle = i.addInstance(mesh);
120
+ return handle;
121
+ }
122
+ return null;
123
+ }
124
+
125
+ private autoUpdateInstanceMatrix(obj: Object3D) {
126
+ const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
127
+ const previousMatrix: Matrix4 = obj.matrixWorld.clone();
128
+ const matrixChangeWrapper = (a: Matrix4, b: Matrix4) => {
129
+ const newMatrixWorld = original(a, b);
130
+ if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
131
+ previousMatrix.copy(newMatrixWorld)
132
+ obj[NEED_UPDATE_INSTANCE_KEY] = true;
133
+ }
134
+ return newMatrixWorld;
135
+ };
136
+ obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
137
+ // wrap matrixWorldNeedsUpdate
138
+ // let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
139
+ // Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
140
+ // get: () => {
141
+ // return originalMatrixWorldNeedsUpdate;
142
+ // },
143
+ // set: (value: boolean) => {
144
+ // if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
145
+ // originalMatrixWorldNeedsUpdate = value;
146
+ // }
147
+ // });
148
+ }
149
+ }
150
+
151
+ /**
152
+ * The instance handle is used to interface with the mesh that is rendered using instancing.
153
+ */
154
+ export class InstanceHandle {
155
+
156
+ static readonly all: InstanceHandle[] = [];
157
+
158
+ /** The name of the object */
159
+ get name(): string {
160
+ return this.object.name;
161
+ }
162
+ get isActive() {
163
+ return this.__instanceIndex >= 0;
164
+ }
165
+ get vertexCount() {
166
+ return this.object.geometry.attributes.position.count;
167
+ }
168
+ get maxVertexCount() {
169
+ // we get the max of the estimated MAX lod vertex count and the actual vertex count
170
+ return Math.max(this.meshInformation.vertexCount, this.vertexCount);
171
+ }
172
+ get reservedVertexCount() {
173
+ return this.__reservedVertexRange;
174
+ }
175
+ get indexCount() {
176
+ return this.object.geometry.index ? this.object.geometry.index.count : 0;
177
+ }
178
+ get maxIndexCount() {
179
+ // we get the max of the estimated MAX lod index count and the actual index count
180
+ return Math.max(this.meshInformation.indexCount, this.indexCount);
181
+ }
182
+ get reservedIndexCount() {
183
+ return this.__reservedIndexRange;
184
+ }
185
+
186
+ /** The object that is being instanced */
187
+ readonly object: Mesh;
188
+
189
+ /** The instancer/BatchedMesh that is rendering this object*/
190
+ readonly renderer: InstancedMeshRenderer;
191
+
192
+ /** @internal */
193
+ __instanceIndex: number = -1;
194
+ /** @internal */
195
+ __reservedVertexRange: number = 0;
196
+ /** @internal */
197
+ __reservedIndexRange: number = 0;
198
+ __geometryIndex: number = -1;
199
+
200
+ /** The mesh information of the object - this tries to also calculate the LOD info */
201
+ readonly meshInformation: MeshInformation;
202
+
203
+ constructor(originalObject: Mesh, instancer: InstancedMeshRenderer) {
204
+ this.__instanceIndex = -1;
205
+ this.object = originalObject;
206
+ this.renderer = instancer;
207
+ originalObject[$instancingRenderer] = instancer;
208
+ // TODO: this doesn't have LOD information *yet* in some cases - hence we can not rely on it for the max vertex counts
209
+ this.meshInformation = getMeshInformation(originalObject.geometry);
210
+ InstanceHandle.all.push(this);
211
+ }
212
+
213
+ /** Calculates the mesh information again
214
+ * @returns true if the vertex count or index count has changed
215
+ */
216
+ updateMeshInformation(): boolean {
217
+ const newMeshInformation = getMeshInformation(this.object.geometry);
218
+ const oldVertexCount = this.meshInformation.vertexCount;
219
+ const oldIndexCount = this.meshInformation.indexCount;
220
+ Object.assign(this.meshInformation, newMeshInformation);
221
+ return oldVertexCount !== this.meshInformation.vertexCount || oldIndexCount !== this.meshInformation.indexCount;
222
+ }
223
+
224
+ /** Updates the matrix from the rendered object. Will also call updateWorldMatrix internally */
225
+ updateInstanceMatrix(updateChildren: boolean = false, updateMatrix: boolean = true) {
226
+ if (this.__instanceIndex < 0) return;
227
+ if (updateMatrix) this.object.updateWorldMatrix(true, updateChildren);
228
+ this.renderer.updateInstance(this.object.matrixWorld, this.__instanceIndex);
229
+ }
230
+ /** Updates the matrix of the instance */
231
+ setMatrix(matrix: Matrix4) {
232
+ if (this.__instanceIndex < 0) return;
233
+ this.renderer.updateInstance(matrix, this.__instanceIndex);
234
+ }
235
+
236
+ /** Can be used to change the geometry of this instance */
237
+ setGeometry(geo: BufferGeometry) {
238
+ if (this.__geometryIndex < 0) return false;
239
+
240
+ const self = this;
241
+
242
+ if (this.vertexCount > this.__reservedVertexRange) {
243
+ return handleInvalidRange(`Instancing: Can not update geometry (${this.name}), reserved vertex range is too small: ${this.__reservedVertexRange.toLocaleString()} < ${this.vertexCount.toLocaleString()} vertices for ${this.name}`);
244
+
245
+ }
246
+ if (this.indexCount > this.__reservedIndexRange) {
247
+ return handleInvalidRange(`Instancing: Can not update geometry (${this.name}), reserved index range is too small: ${this.__reservedIndexRange.toLocaleString()} < ${this.indexCount.toLocaleString()} indices for ${this.name}`);
248
+ }
249
+
250
+
251
+ return this.renderer.updateGeometry(geo, this.__geometryIndex);
252
+
253
+ function handleInvalidRange(error: string): boolean {
254
+ if (self.updateMeshInformation()) {
255
+ // Gizmos.DrawWireSphere(self.object.worldPosition, .5, 0xff0000, 5);
256
+ self.renderer.remove(self, true);
257
+ // Gizmos.DrawWireSphere(self.object.worldPosition, .5, 0x33ff00, 5);
258
+ // self.object.scale.multiplyScalar(10);
259
+ if (self.renderer.add(self)) {
260
+ return true;
261
+ }
262
+ }
263
+ if (isDevEnvironment() || debugInstancing) {
264
+ console.error(error);
265
+ }
266
+ return false;
267
+ }
268
+ }
269
+
270
+ /** Adds this object to the instancing renderer (effectively activating instancing) */
271
+ add() {
272
+ if (this.__instanceIndex >= 0) return;
273
+ this.renderer.add(this);
274
+ GameObject.markAsInstancedRendered(this.object, true);
275
+ }
276
+
277
+ /** Removes this object from the instancing renderer
278
+ * @param delete_ If true, the instance handle will be removed from the global list
279
+ */
280
+ remove(delete_: boolean) {
281
+ if (this.__instanceIndex < 0) return;
282
+ this.renderer.remove(this, delete_);
283
+ GameObject.markAsInstancedRendered(this.object, false);
284
+ if (delete_) {
285
+ const i = InstanceHandle.all.indexOf(this);
286
+ if (i >= 0) {
287
+ InstanceHandle.all.splice(i, 1);
288
+ }
289
+ }
290
+ }
291
+ }
292
+
293
+ class InstancedMeshRenderer {
294
+ /** The three instanced mesh
295
+ * @link https://threejs.org/docs/#api/en/objects/InstancedMesh
296
+ */
297
+ get batchedMesh() {
298
+ return this._batchedMesh;
299
+ }
300
+ get visible(): boolean {
301
+ return this._batchedMesh.visible;
302
+ }
303
+ set visible(val: boolean) {
304
+ this._batchedMesh.visible = val;
305
+ }
306
+ get castShadow(): boolean {
307
+ return this._batchedMesh.castShadow;
308
+ }
309
+ set castShadow(val: boolean) {
310
+ this._batchedMesh.castShadow = val;
311
+ }
312
+ set receiveShadow(val: boolean) {
313
+ this._batchedMesh.receiveShadow = val;
314
+ }
315
+
316
+ /** If true, the instancer is allowed to grow when the max instance count is reached */
317
+ allowResize: boolean = true;
318
+
319
+ /** The name of the instancer */
320
+ name: string = "";
321
+
322
+ /** The added geometry */
323
+ readonly geometry: BufferGeometry;
324
+
325
+ /** The material used for the instanced mesh */
326
+ readonly material: Material;
327
+
328
+ /** The current number of instances */
329
+ get count(): number { return this._currentInstanceCount; }
330
+
331
+ /** Update the bounding box and sphere of the instanced mesh
332
+ * @param box If true, update the bounding box
333
+ * @param sphere If true, update the bounding sphere
334
+ */
335
+ updateBounds(box: boolean = true, sphere: boolean = true) {
336
+ this._needUpdateBounds = false;
337
+ if (box)
338
+ this._batchedMesh.computeBoundingBox();
339
+ if (sphere)
340
+ this._batchedMesh.computeBoundingSphere();
341
+ if (debugInstancing && this._batchedMesh.boundingSphere) {
342
+ const sphere = this._batchedMesh.boundingSphere;
343
+ // const worldPos = this._batchedMesh.worldPosition.add(sphere.center);
344
+ // const worldRadius = sphere!.radius;
345
+ Gizmos.DrawWireSphere(sphere.center, sphere.radius, 0x00ff00);
346
+ }
347
+ }
348
+
349
+ private _context: Context;
350
+ private _batchedMesh: BatchedMesh;
351
+ private _handles: (InstanceHandle | null)[] = [];
352
+ private readonly _geometryIds: Map<BufferGeometry, number> = new Map();
353
+ private _maxInstanceCount: number;
354
+
355
+ private _currentInstanceCount = 0;
356
+ private _currentVertexCount = 0;
357
+ private _currentIndexCount = 0;
358
+
359
+ private _maxVertexCount: number;
360
+ private _maxIndexCount: number;
361
+
362
+ private static nullMatrix: Matrix4 = new Matrix4();
363
+
364
+ /** Check if the geometry can be added to this instancer
365
+ * @param geometry The geometry to check
366
+ * @param material The material of the geometry
367
+ * @returns true if the geometry can be added
368
+ */
369
+ canAdd(geometry: BufferGeometry, material: Material): boolean {
370
+
371
+ if (this._maxVertexCount > 10_000_000) return false;
372
+
373
+ // The material instance must match
374
+ // perhaps at some point later we *could* check if it's the same shader and properties but this would be risky
375
+ if (material !== this.material) {
376
+ const canMergeMaterial = false;
377
+ // if (material.type === this.material.type) {
378
+ // switch (material.type) {
379
+ // case "MeshStandardMaterial":
380
+ // // check if the material properties are the same
381
+ // const m0 = this.material as MeshStandardMaterial;
382
+ // const m1 = material as MeshStandardMaterial;
383
+ // if(m0.map !== m1.map) return false;
384
+ // // if(m0.color.equals(m1.color) === false) return false;
385
+ // if(m0.roughness !== m1.roughness) return false;
386
+ // if(m0.metalness !== m1.metalness) return false;
387
+ // if(m0.envMap !== m1.envMap) return false;
388
+ // if(m0.envMapIntensity !== m1.envMapIntensity) return false;
389
+ // if(m0.lightMap !== m1.lightMap) return false;
390
+ // if(m0.lightMapIntensity !== m1.lightMapIntensity) return false;
391
+ // if(m0.aoMap !== m1.aoMap) return false;
392
+ // if(m0.aoMapIntensity !== m1.aoMapIntensity) return false;
393
+ // if(m0.emissive.equals(m1.emissive) === false) return false;
394
+ // if(m0.emissiveIntensity !== m1.emissiveIntensity) return false;
395
+ // if(m0.emissiveMap !== m1.emissiveMap) return false;
396
+ // if(m0.bumpMap !== m1.bumpMap) return false;
397
+ // if(m0.bumpScale !== m1.bumpScale) return false;
398
+ // if(m0.normalMap !== m1.normalMap) return false;
399
+ // if(m0.normalScale.equals(m1.normalScale) === false) return false;
400
+ // if(m0.displacementMap !== m1.displacementMap) return false;
401
+ // if(m0.displacementScale !== m1.displacementScale) return false;
402
+ // if(m0.displacementBias !== m1.displacementBias) return false;
403
+ // if(m0.roughnessMap !== m1.roughnessMap) return false;
404
+ // if(m0.metalnessMap !== m1.metalnessMap) return false;
405
+ // if(m0.alphaMap !== m1.alphaMap) return false;
406
+ // if(m0.envMapIntensity !== m1.envMapIntensity) return false;
407
+ // canMergeMaterial = true;
408
+ // break;
409
+ // }
410
+ // }
411
+ if (!canMergeMaterial) {
412
+ return false;
413
+ }
414
+ }
415
+
416
+ // if(this.geometry !== _geometry) return false;
417
+
418
+ // console.log(geometry.name, geometry.uuid);
419
+
420
+ if (!this.validateGeometry(geometry)) return false;
421
+
422
+ // const validationMethod = this.inst["_validateGeometry"];
423
+ // if (!validationMethod) throw new Error("InstancedMesh does not have a _validateGeometry method");
424
+ // try {
425
+ // validationMethod.call(this.inst, _geometry);
426
+ // }
427
+ // catch (err) {
428
+ // // console.error(err);
429
+ // return false;
430
+ // }
431
+
432
+ const hasSpace = !this.mustGrow(geometry);
433
+ if (hasSpace) return true;
434
+ if (this.allowResize) return true;
435
+
436
+ return false;
437
+ }
438
+
439
+ private _needUpdateBounds: boolean = false;
440
+ private _debugMaterial: MeshStandardMaterial | null = null;
441
+
442
+ constructor(name: string, geo: BufferGeometry, material: Material, initialMaxCount: number, context: Context) {
443
+ this.name = name;
444
+ this.geometry = geo;
445
+ this.material = material;
446
+ this._context = context;
447
+ this._maxInstanceCount = Math.max(2, initialMaxCount);
448
+ if (debugInstancing) {
449
+ this._debugMaterial = createDebugMaterial();
450
+ }
451
+ const estimate = this.tryEstimateVertexCountSize(this._maxInstanceCount, [geo], initialMaxCount);
452
+ this._maxVertexCount = estimate.vertexCount;
453
+ this._maxIndexCount = estimate.indexCount;
454
+ this._batchedMesh = new BatchedMesh(this._maxInstanceCount, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
455
+ // this.inst = new InstancedMesh(geo, material, count);
456
+ this._batchedMesh[$instancingAutoUpdateBounds] = true;
457
+ // this.inst.count = 0;
458
+ this._batchedMesh.visible = true;
459
+ this._context.scene.add(this._batchedMesh);
460
+
461
+ // Not handled by RawShaderMaterial, so we need to set the define explicitly.
462
+ // Edge case: theoretically some users of the material could use it in an
463
+ // instanced fashion, and some others not. In that case, the material would not
464
+ // be able to be shared between the two use cases. We could probably add a
465
+ // onBeforeRender call for the InstancedMesh and set the define there.
466
+ // Same would apply if we support skinning -
467
+ // there we would have to split instanced batches so that the ones using skinning
468
+ // are all in the same batch.
469
+ if (material instanceof RawShaderMaterial) {
470
+ material.defines["USE_INSTANCING"] = true;
471
+ material.needsUpdate = true;
472
+ }
473
+
474
+ context.pre_render_callbacks.push(this.onBeforeRender);
475
+ context.post_render_callbacks.push(this.onAfterRender);
476
+
477
+ if (debugInstancing) {
478
+ console.log(`Instanced renderer created with ${this._maxInstanceCount} instances, ${this._maxVertexCount} max vertices and ${this._maxIndexCount} max indices for \"${name}\"`)
479
+ }
480
+ }
481
+
482
+ dispose() {
483
+ if (debugInstancing) console.warn("Dispose instanced renderer", this.name);
484
+ this._context.scene.remove(this._batchedMesh);
485
+ this._batchedMesh.dispose();
486
+ this._batchedMesh = null as any;
487
+ this._handles = [];
488
+ }
489
+
490
+ addInstance(obj: Mesh): InstanceHandle | null {
491
+
492
+ const handle = new InstanceHandle(obj, this);
493
+
494
+ if (obj.castShadow === true && this._batchedMesh.castShadow === false) {
495
+ this._batchedMesh.castShadow = true;
496
+ }
497
+ if (obj.receiveShadow === true && this._batchedMesh.receiveShadow === false) {
498
+ this._batchedMesh.receiveShadow = true;
499
+ }
500
+
501
+ try {
502
+ this.add(handle);
503
+ }
504
+ catch (e) {
505
+ console.error(`Failed adding mesh to instancing (object name: \"${obj.name}\", instances: ${this._currentInstanceCount.toLocaleString()}/${this._maxInstanceCount.toLocaleString()}, vertices: ${this._currentVertexCount.toLocaleString()}/${this._maxVertexCount.toLocaleString()}, indices: ${this._currentIndexCount.toLocaleString()}/${this._maxIndexCount.toLocaleString()})\n`, e);
506
+ if (isDevEnvironment()) {
507
+ showBalloonError("Failed instancing mesh. See the browser console for details.");
508
+ debugger;
509
+ }
510
+ return null;
511
+ }
512
+
513
+ return handle;
514
+ }
515
+
516
+
517
+ add(handle: InstanceHandle) {
518
+ const geo = handle.object.geometry as BufferGeometry;
519
+
520
+ if (!geo || !geo.attributes) {
521
+ console.error("Cannot add object to instancing without geometry", handle.name);
522
+ return false;
523
+ }
524
+
525
+ if (this.mustGrow(geo)) {
526
+ if (this.allowResize) {
527
+ this.grow(geo);
528
+ }
529
+ else {
530
+ console.error("Cannot add instance, max count reached", this.name, this.count, this._maxInstanceCount);
531
+ return false;
532
+ }
533
+ }
534
+
535
+ handle.object.updateWorldMatrix(true, true);
536
+ this.addGeometry(handle);
537
+ this._handles[handle.__instanceIndex] = handle;
538
+ this._currentInstanceCount += 1;
539
+
540
+ this.markNeedsUpdate();
541
+
542
+ if (this._currentInstanceCount > 0)
543
+ this._batchedMesh.visible = true;
544
+
545
+ return true;
546
+ }
547
+
548
+ remove(handle: InstanceHandle, delete_: boolean) {
549
+ if (!handle) {
550
+ return;
551
+ }
552
+ if (handle.__instanceIndex < 0 || this._handles[handle.__instanceIndex] != handle || this._currentInstanceCount <= 0) {
553
+ // console.warn("Cannot remove instance, handle is invalid", handle.name);
554
+ return;
555
+ }
556
+
557
+ this.removeGeometry(handle, delete_);
558
+ this._handles[handle.__instanceIndex] = null;
559
+ handle.__instanceIndex = -1;
560
+
561
+ if (this._currentInstanceCount > 0) {
562
+ this._currentInstanceCount -= 1;
563
+ }
564
+
565
+ if (this._currentInstanceCount <= 0)
566
+ this._batchedMesh.visible = false;
567
+
568
+ this.markNeedsUpdate();
569
+ }
570
+
571
+ updateInstance(mat: Matrix4, index: number) {
572
+ this._batchedMesh.setMatrixAt(index, mat);
573
+ this.markNeedsUpdate();
574
+ }
575
+
576
+ updateGeometry(geo: BufferGeometry, geometryIndex: number): boolean {
577
+ if (!this.validateGeometry(geo)) {
578
+ return false;
579
+ }
580
+
581
+ if (this.mustGrow()) {
582
+ this.grow(geo);
583
+ }
584
+ if (debugInstancing)
585
+ console.debug("[Instancing] UPDATE GEOMETRY at " + geometryIndex, this._batchedMesh["_geometryCount"], geo.name, getMeshInformation(geo), geo.attributes.position.count, geo.index ? geo.index.count : 0);
586
+
587
+ this._batchedMesh.setGeometryAt(geometryIndex, geo);
588
+ // for LOD mesh updates we need to make sure to save the geometry index
589
+ this._geometryIds.set(geo, geometryIndex);
590
+ this.markNeedsUpdate();
591
+ return true;
592
+ }
593
+
594
+ private onBeforeRender = () => {
595
+ // ensure the instanced mesh is rendered / has correct layers
596
+ this._batchedMesh.layers.enableAll();
597
+
598
+ if (this._needUpdateBounds && this._batchedMesh[$instancingAutoUpdateBounds] === true) {
599
+ if (debugInstancing === "verbose") console.log("Update instancing bounds", this.name, this._batchedMesh.matrixWorldNeedsUpdate);
600
+ this.updateBounds();
601
+ }
602
+ }
603
+
604
+ private onAfterRender = () => {
605
+ // hide the instanced mesh again when its not being rendered (for raycasting we still use the original object)
606
+ this._batchedMesh.layers.disableAll();
607
+ }
608
+
609
+ private validateGeometry(geometry: BufferGeometry): boolean {
610
+ const batchGeometry = this.geometry;
611
+
612
+ for (const attributeName in batchGeometry.attributes) {
613
+ if (attributeName === "batchId") {
614
+ continue;
615
+ }
616
+ if (!geometry.hasAttribute(attributeName)) {
617
+ if (isDevEnvironment())
618
+ console.warn(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`);
619
+ // geometry.setAttribute(attributeName, batchGeometry.getAttribute(attributeName).clone());
620
+ return false;
621
+ // throw new Error(`BatchedMesh: Added geometry missing "${attributeName}". All geometries must have consistent attributes.`);
622
+ }
623
+ // const srcAttribute = geometry.getAttribute(attributeName);
624
+ // const dstAttribute = batchGeometry.getAttribute(attributeName);
625
+ // if (srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized) {
626
+ // if (debugInstancing) throw new Error('BatchedMesh: All attributes must have a consistent itemSize and normalized value.');
627
+ // return false;
628
+ // }
629
+ }
630
+ return true;
631
+ }
632
+
633
+ private markNeedsUpdate() {
634
+ if (debugInstancing === "verbose") {
635
+ console.warn("Marking instanced mesh dirty", this.name);
636
+ }
637
+ this._needUpdateBounds = true;
638
+ // this.inst.instanceMatrix.needsUpdate = true;
639
+ }
640
+
641
+ /**
642
+ * @param geo The geometry to add (if none is provided it means the geometry is already added and just updated)
643
+ */
644
+ private mustGrow(geo?: BufferGeometry): boolean {
645
+ if (this.count >= this._maxInstanceCount) return true;
646
+ if (!geo || !geo.attributes) return false;
647
+ const meshInfo = getMeshInformation(geo);
648
+ const newVertexCount = meshInfo.vertexCount;
649
+ const newIndexCount = meshInfo.indexCount;
650
+ return this._currentVertexCount + newVertexCount > this._maxVertexCount || this._currentIndexCount + newIndexCount > this._maxIndexCount;
651
+ }
652
+
653
+ private grow(geometry: BufferGeometry) {
654
+ const growFactor = 2;
655
+ const newSize = Math.ceil(this._maxInstanceCount * growFactor);
656
+
657
+ // create a new BatchedMesh instance
658
+ const estimatedSpace = this.tryEstimateVertexCountSize(newSize, [geometry]);// geometry.attributes.position.count;
659
+ // const indices = geometry.index ? geometry.index.count : 0;
660
+ const newMaxVertexCount = Math.max(this._maxVertexCount, estimatedSpace.vertexCount);
661
+ const newMaxIndexCount = Math.max(this._maxIndexCount, estimatedSpace.indexCount, Math.ceil(this._maxVertexCount * growFactor));
662
+
663
+ if (debugInstancing) {
664
+ 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}`);
666
+ this._debugMaterial = createDebugMaterial();
667
+ }
668
+ 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}`);
670
+ }
671
+
672
+ this._maxVertexCount = newMaxVertexCount;
673
+ this._maxIndexCount = newMaxIndexCount;
674
+ const newInst = new BatchedMesh(newSize, this._maxVertexCount, this._maxIndexCount, this._debugMaterial ?? this.material);
675
+ newInst.layers = this._batchedMesh.layers;
676
+ newInst.castShadow = this._batchedMesh.castShadow;
677
+ newInst.receiveShadow = this._batchedMesh.receiveShadow;
678
+ newInst.visible = this._batchedMesh.visible;
679
+ newInst[$instancingAutoUpdateBounds] = this._batchedMesh[$instancingAutoUpdateBounds];
680
+ newInst.matrixAutoUpdate = this._batchedMesh.matrixAutoUpdate;
681
+ newInst.matrixWorldNeedsUpdate = this._batchedMesh.matrixWorldNeedsUpdate;
682
+ newInst.matrixAutoUpdate = this._batchedMesh.matrixAutoUpdate;
683
+ newInst.matrixWorld.copy(this._batchedMesh.matrixWorld);
684
+ newInst.matrix.copy(this._batchedMesh.matrix);
685
+
686
+ // dispose the old batched mesh
687
+ this._batchedMesh.dispose();
688
+ this._batchedMesh.removeFromParent();
689
+ this._geometryIds.clear();
690
+
691
+ this._batchedMesh = newInst;
692
+ this._maxInstanceCount = newSize;
693
+
694
+ // since we have a new batched mesh we need to re-add all the instances
695
+ // fixes https://linear.app/needle/issue/NE-5711
696
+
697
+ // add current instances to new instanced mesh
698
+ const original = [...this._handles];
699
+ this._handles = [];
700
+ for (const handle of original) {
701
+ if (handle && handle.__instanceIndex >= 0) {
702
+ this.addGeometry(handle);
703
+ this._handles[handle.__instanceIndex] = handle;
704
+ }
705
+ }
706
+
707
+ this._context.scene.add(newInst);
708
+ }
709
+
710
+ private tryEstimateVertexCountSize(newMaxInstances: number, _newGeometries?: BufferGeometry[], newGeometriesFactor: number = 1): MeshInformation {
711
+ /** Used geometries and how many instances use them */
712
+ const usedGeometries = new Map<BufferGeometry, MeshInformation & { count: number }>();
713
+ for (const handle of this._handles) {
714
+ if (handle && handle.__instanceIndex >= 0 && handle.object.geometry) {
715
+ if (!usedGeometries.has(handle.object.geometry as BufferGeometry)) {
716
+ const data = getMeshInformation(handle.object.geometry as BufferGeometry);
717
+ const meshinfo = { count: 1, ...data };
718
+ usedGeometries.set(handle.object.geometry as BufferGeometry, meshinfo);
719
+ }
720
+ else {
721
+ const entry = usedGeometries.get(handle.object.geometry as BufferGeometry)!;
722
+ entry.count += 1;
723
+ }
724
+
725
+ }
726
+ }
727
+
728
+ // then calculate the total vertex count
729
+ let totalVertices = 0;
730
+ let totalIndices = 0;
731
+ // let maxVertices = 0;
732
+ for (const [_geo, data] of usedGeometries) {
733
+ totalVertices += data.vertexCount * data.count;
734
+ totalIndices += data.indexCount * data.count;
735
+ // maxVertices = Math.max(maxVertices, geo.attributes.position.count * count);
736
+ }
737
+ // 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;
742
+
743
+ // if new geometries are provided we *know* that they will be added
744
+ // so we make sure to include them in the calculation
745
+ if (_newGeometries) {
746
+ for (const geo of _newGeometries) {
747
+ const meshinfo = getMeshInformation(geo);
748
+ if (meshinfo != null) {
749
+ maxVertexCount += meshinfo.vertexCount * newGeometriesFactor;
750
+ maxIndexCount += meshinfo.indexCount * newGeometriesFactor;
751
+ }
752
+
753
+ }
754
+ }
755
+
756
+ return { vertexCount: maxVertexCount, indexCount: maxIndexCount };
757
+ }
758
+
759
+
760
+ private addGeometry(handle: InstanceHandle) {
761
+
762
+ const obj = handle.object;
763
+ const geo = obj.geometry as BufferGeometry;
764
+ if (!geo) {
765
+ // if the geometry is null we cannot add it
766
+ return;
767
+ }
768
+
769
+ // otherwise add more geometry / instances
770
+ let geometryId = this._geometryIds.get(geo);
771
+ if (geometryId === undefined || geometryId === null) {
772
+ 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`);
774
+
775
+ geometryId = this._batchedMesh.addGeometry(geo, handle.maxVertexCount, handle.maxIndexCount);
776
+ this._geometryIds.set(geo, geometryId);
777
+ }
778
+ else {
779
+ if (debugInstancing === "verbose") console.log(`[Instancing] > ADD INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances`);
780
+ }
781
+ this._currentVertexCount += handle.maxVertexCount;
782
+ this._currentIndexCount += handle.maxIndexCount;
783
+ const i = this._batchedMesh.addInstance(geometryId);
784
+ handle.__geometryIndex = geometryId;
785
+ handle.__instanceIndex = i;
786
+ handle.__reservedVertexRange = handle.maxVertexCount;
787
+ handle.__reservedIndexRange = handle.maxIndexCount;
788
+ this._batchedMesh.setMatrixAt(i, handle.object.matrixWorld);
789
+ if (debugInstancing)
790
+ console.debug(`[Instancing] > ADDED INSTANCE \"${handle.name}\"\nGEOMETRY_ID=${geometryId}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
791
+
792
+ }
793
+
794
+
795
+ private removeGeometry(handle: InstanceHandle, _del: boolean) {
796
+ if (handle.__instanceIndex < 0) {
797
+ console.warn("Cannot remove geometry, instance index is invalid", handle.name);
798
+ return;
799
+ }
800
+ // deleteGeometry is currently not useable since there's no optimize method
801
+ // https://github.com/mrdoob/three.js/issues/27985
802
+ // if (del)
803
+ // this.inst.deleteGeometry(handle.__instanceIndex);
804
+ // else
805
+ // this._batchedMesh.setVisibleAt(handle.__instanceIndex, false);
806
+ if(debugInstancing) {
807
+ console.debug(`[Instancing] < REMOVE INSTANCE \"${handle.name}\" at [${handle.__instanceIndex}]\nGEOMETRY_ID=${handle.__geometryIndex}\n${this._currentInstanceCount} instances\nIndex: ${handle.__instanceIndex}`);
808
+ }
809
+ this._batchedMesh.deleteInstance(handle.__instanceIndex);
810
+ }
811
+ }
812
+
813
+ declare type BucketInfo = {
814
+ geometryIndex: number;
815
+ vertexCount: number;
816
+ indexCount: number;
817
+ }
818
+
819
+ declare type MeshInformation = {
820
+ vertexCount: number;
821
+ indexCount: number;
822
+ }
823
+
824
+ function getMeshInformation(geo: BufferGeometry): MeshInformation {
825
+ if (!geo) {
826
+ if (isDevEnvironment()) console.error("Cannot get mesh information from null geometry");
827
+ return { vertexCount: 0, indexCount: 0 };
828
+ }
829
+ let vertexCount = geo.attributes?.position?.count || 0;
830
+ let indexCount = geo.index ? geo.index.count : 0;
831
+ const lodInfo = NEEDLE_progressive.getMeshLODInformation(geo);
832
+ if (lodInfo) {
833
+ const lod0 = lodInfo.lods[0];
834
+ let lod0Count = lod0.vertexCount;
835
+ let lod0IndexCount = lod0.indexCount;
836
+ // add some wiggle room: https://linear.app/needle/issue/NE-4505
837
+ const extra = Math.min(200, Math.ceil(lod0Count * .05));
838
+ lod0Count += extra;
839
+ lod0IndexCount += 20;
840
+ vertexCount = Math.max(vertexCount, lod0Count);
841
+ indexCount = Math.max(indexCount, lod0IndexCount);
842
+ }
843
+ vertexCount = Math.ceil(vertexCount);
844
+ indexCount = Math.ceil(indexCount);
845
+ return { vertexCount, indexCount };
846
+ }
847
+
848
+ function createDebugMaterial() {
849
+ const mat = new MeshStandardMaterial({ color: new Color(Math.random(), Math.random(), Math.random()) });
850
+ mat.emissive = mat.color;
851
+ mat.emissiveIntensity = .3;
852
+ if (getParam("wireframe"))
853
+ mat.wireframe = true;
854
+ return mat;
855
+ }