@needle-tools/engine 3.28.6-beta → 3.28.7-beta.1

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 (848) hide show
  1. package/CHANGELOG.md +2259 -2253
  2. package/LICENSE.md +10 -10
  3. package/README.md +52 -52
  4. package/dist/needle-engine.js +7 -10
  5. package/dist/needle-engine.light.js +7 -10
  6. package/dist/needle-engine.light.min.js +7 -10
  7. package/dist/needle-engine.light.umd.cjs +7 -10
  8. package/dist/needle-engine.min.js +7 -10
  9. package/dist/needle-engine.umd.cjs +7 -10
  10. package/lib/engine/api.d.ts +52 -52
  11. package/lib/engine/api.js +51 -51
  12. package/lib/engine/assets/index.d.ts +1 -1
  13. package/lib/engine/assets/index.js +4 -4
  14. package/lib/engine/codegen/register_types.d.ts +1 -1
  15. package/lib/engine/codegen/register_types.js +439 -439
  16. package/lib/engine/debug/debug.d.ts +12 -12
  17. package/lib/engine/debug/debug.js +26 -26
  18. package/lib/engine/debug/debug_console.d.ts +2 -2
  19. package/lib/engine/debug/debug_console.js +204 -204
  20. package/lib/engine/debug/debug_overlay.d.ts +10 -10
  21. package/lib/engine/debug/debug_overlay.js +277 -277
  22. package/lib/engine/debug/index.d.ts +1 -1
  23. package/lib/engine/debug/index.js +1 -1
  24. package/lib/engine/engine_addressables.d.ts +75 -75
  25. package/lib/engine/engine_addressables.js +441 -441
  26. package/lib/engine/engine_application.d.ts +19 -19
  27. package/lib/engine/engine_application.js +45 -45
  28. package/lib/engine/engine_assetdatabase.d.ts +25 -25
  29. package/lib/engine/engine_assetdatabase.js +341 -341
  30. package/lib/engine/engine_camera.d.ts +6 -6
  31. package/lib/engine/engine_camera.js +23 -23
  32. package/lib/engine/engine_components.d.ts +17 -17
  33. package/lib/engine/engine_components.js +273 -273
  34. package/lib/engine/engine_components_internal.d.ts +11 -11
  35. package/lib/engine/engine_components_internal.js +41 -41
  36. package/lib/engine/engine_constants.d.ts +5 -5
  37. package/lib/engine/engine_constants.js +32 -32
  38. package/lib/engine/engine_context.d.ts +269 -269
  39. package/lib/engine/engine_context.js +1242 -1242
  40. package/lib/engine/engine_context_registry.d.ts +50 -50
  41. package/lib/engine/engine_context_registry.js +89 -89
  42. package/lib/engine/engine_coroutine.d.ts +4 -4
  43. package/lib/engine/engine_coroutine.js +21 -21
  44. package/lib/engine/engine_create_objects.d.ts +13 -13
  45. package/lib/engine/engine_create_objects.js +33 -33
  46. package/lib/engine/engine_default_parameters.d.ts +2 -2
  47. package/lib/engine/engine_default_parameters.js +3 -3
  48. package/lib/engine/engine_editor-sync.d.ts +17 -17
  49. package/lib/engine/engine_editor-sync.js +7 -7
  50. package/lib/engine/engine_element.d.ts +55 -55
  51. package/lib/engine/engine_element.js +559 -559
  52. package/lib/engine/engine_element_attributes.d.ts +49 -49
  53. package/lib/engine/engine_element_attributes.js +1 -1
  54. package/lib/engine/engine_element_extras.d.ts +6 -6
  55. package/lib/engine/engine_element_extras.js +13 -13
  56. package/lib/engine/engine_element_loading.d.ts +40 -40
  57. package/lib/engine/engine_element_loading.js +312 -312
  58. package/lib/engine/engine_element_overlay.d.ts +19 -19
  59. package/lib/engine/engine_element_overlay.js +143 -143
  60. package/lib/engine/engine_fileloader.d.ts +3 -3
  61. package/lib/engine/engine_fileloader.js +7 -7
  62. package/lib/engine/engine_gameobject.d.ts +39 -39
  63. package/lib/engine/engine_gameobject.js +559 -559
  64. package/lib/engine/engine_generic_utils.d.ts +1 -1
  65. package/lib/engine/engine_generic_utils.js +13 -13
  66. package/lib/engine/engine_gizmos.d.ts +26 -26
  67. package/lib/engine/engine_gizmos.js +282 -282
  68. package/lib/engine/engine_gltf.d.ts +13 -13
  69. package/lib/engine/engine_gltf.js +15 -15
  70. package/lib/engine/engine_gltf_builtin_components.d.ts +7 -7
  71. package/lib/engine/engine_gltf_builtin_components.js +298 -298
  72. package/lib/engine/engine_hot_reload.d.ts +5 -5
  73. package/lib/engine/engine_hot_reload.js +182 -182
  74. package/lib/engine/engine_input.d.ts +129 -129
  75. package/lib/engine/engine_input.js +799 -799
  76. package/lib/engine/engine_input_utils.d.ts +2 -2
  77. package/lib/engine/engine_input_utils.js +22 -22
  78. package/lib/engine/engine_instancing.d.ts +16 -16
  79. package/lib/engine/engine_instancing.js +36 -36
  80. package/lib/engine/engine_license.d.ts +4 -4
  81. package/lib/engine/engine_license.js +398 -398
  82. package/lib/engine/engine_lifecycle_api.d.ts +14 -14
  83. package/lib/engine/engine_lifecycle_api.js +24 -24
  84. package/lib/engine/engine_lifecycle_functions_internal.d.ts +6 -6
  85. package/lib/engine/engine_lifecycle_functions_internal.js +28 -28
  86. package/lib/engine/engine_lightdata.d.ts +23 -23
  87. package/lib/engine/engine_lightdata.js +86 -86
  88. package/lib/engine/engine_loaders.d.ts +7 -7
  89. package/lib/engine/engine_loaders.js +69 -69
  90. package/lib/engine/engine_mainloop_utils.d.ts +13 -13
  91. package/lib/engine/engine_mainloop_utils.js +426 -426
  92. package/lib/engine/engine_math.d.ts +43 -43
  93. package/lib/engine/engine_math.js +147 -147
  94. package/lib/engine/engine_networking.d.ts +176 -176
  95. package/lib/engine/engine_networking.js +649 -649
  96. package/lib/engine/engine_networking_auto.d.ts +24 -24
  97. package/lib/engine/engine_networking_auto.js +324 -324
  98. package/lib/engine/engine_networking_files.d.ts +23 -23
  99. package/lib/engine/engine_networking_files.js +176 -176
  100. package/lib/engine/engine_networking_files_default_components.d.ts +3 -3
  101. package/lib/engine/engine_networking_files_default_components.js +39 -39
  102. package/lib/engine/engine_networking_instantiate.d.ts +39 -39
  103. package/lib/engine/engine_networking_instantiate.js +302 -302
  104. package/lib/engine/engine_networking_peer.d.ts +15 -15
  105. package/lib/engine/engine_networking_peer.js +132 -132
  106. package/lib/engine/engine_networking_streams.d.ts +90 -90
  107. package/lib/engine/engine_networking_streams.js +428 -428
  108. package/lib/engine/engine_networking_types.d.ts +14 -14
  109. package/lib/engine/engine_networking_types.js +7 -7
  110. package/lib/engine/engine_networking_utils.d.ts +2 -2
  111. package/lib/engine/engine_networking_utils.js +20 -20
  112. package/lib/engine/engine_patcher.d.ts +10 -10
  113. package/lib/engine/engine_patcher.js +142 -142
  114. package/lib/engine/engine_physics.d.ts +115 -115
  115. package/lib/engine/engine_physics.js +228 -228
  116. package/lib/engine/engine_physics.types.d.ts +37 -37
  117. package/lib/engine/engine_physics.types.js +33 -33
  118. package/lib/engine/engine_physics_rapier.d.ts +112 -112
  119. package/lib/engine/engine_physics_rapier.js +1266 -1266
  120. package/lib/engine/engine_playerview.d.ts +26 -26
  121. package/lib/engine/engine_playerview.js +64 -64
  122. package/lib/engine/engine_scenelighting.d.ts +74 -74
  123. package/lib/engine/engine_scenelighting.js +285 -285
  124. package/lib/engine/engine_scenetools.d.ts +35 -35
  125. package/lib/engine/engine_scenetools.js +212 -212
  126. package/lib/engine/engine_serialization.d.ts +4 -4
  127. package/lib/engine/engine_serialization.js +4 -4
  128. package/lib/engine/engine_serialization_builtin_serializer.d.ts +62 -62
  129. package/lib/engine/engine_serialization_builtin_serializer.js +369 -369
  130. package/lib/engine/engine_serialization_core.d.ts +84 -84
  131. package/lib/engine/engine_serialization_core.js +576 -576
  132. package/lib/engine/engine_serialization_decorator.d.ts +15 -15
  133. package/lib/engine/engine_serialization_decorator.js +54 -54
  134. package/lib/engine/engine_setup.d.ts +1 -1
  135. package/lib/engine/engine_setup.js +2 -2
  136. package/lib/engine/engine_shaders.d.ts +31 -31
  137. package/lib/engine/engine_shaders.js +229 -229
  138. package/lib/engine/engine_shims.d.ts +3 -3
  139. package/lib/engine/engine_shims.js +22 -22
  140. package/lib/engine/engine_texture.d.ts +20 -20
  141. package/lib/engine/engine_texture.js +57 -57
  142. package/lib/engine/engine_three_utils.d.ts +51 -51
  143. package/lib/engine/engine_three_utils.js +342 -342
  144. package/lib/engine/engine_time.d.ts +19 -19
  145. package/lib/engine/engine_time.js +47 -47
  146. package/lib/engine/engine_types.d.ts +358 -358
  147. package/lib/engine/engine_types.js +72 -72
  148. package/lib/engine/engine_typestore.d.ts +16 -16
  149. package/lib/engine/engine_typestore.js +35 -35
  150. package/lib/engine/engine_util_decorator.d.ts +12 -12
  151. package/lib/engine/engine_util_decorator.js +115 -115
  152. package/lib/engine/engine_utils.d.ts +104 -104
  153. package/lib/engine/engine_utils.js +518 -518
  154. package/lib/engine/engine_utils_screenshot.d.ts +10 -10
  155. package/lib/engine/engine_utils_screenshot.js +70 -70
  156. package/lib/engine/engine_web_api.d.ts +12 -12
  157. package/lib/engine/engine_web_api.js +112 -112
  158. package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
  159. package/lib/engine/extensions/EXT_texture_exr.js +32 -32
  160. package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +116 -116
  161. package/lib/engine/extensions/NEEDLE_animator_controller_model.js +91 -91
  162. package/lib/engine/extensions/NEEDLE_components.d.ts +33 -33
  163. package/lib/engine/extensions/NEEDLE_components.js +206 -206
  164. package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
  165. package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
  166. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +38 -38
  167. package/lib/engine/extensions/NEEDLE_lighting_settings.js +183 -183
  168. package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
  169. package/lib/engine/extensions/NEEDLE_lightmaps.js +108 -108
  170. package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
  171. package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
  172. package/lib/engine/extensions/NEEDLE_progressive.d.ts +41 -41
  173. package/lib/engine/extensions/NEEDLE_progressive.js +366 -366
  174. package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
  175. package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
  176. package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +39 -39
  177. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +544 -544
  178. package/lib/engine/extensions/extension_resolver.d.ts +4 -4
  179. package/lib/engine/extensions/extension_resolver.js +1 -1
  180. package/lib/engine/extensions/extension_utils.d.ts +2 -2
  181. package/lib/engine/extensions/extension_utils.js +140 -140
  182. package/lib/engine/extensions/extensions.d.ts +21 -21
  183. package/lib/engine/extensions/extensions.js +94 -94
  184. package/lib/engine/extensions/index.d.ts +5 -5
  185. package/lib/engine/extensions/index.js +5 -5
  186. package/lib/engine/extensions/usage_tracker.d.ts +13 -13
  187. package/lib/engine/extensions/usage_tracker.js +61 -61
  188. package/lib/engine/js-extensions/Camera.d.ts +1 -1
  189. package/lib/engine/js-extensions/Camera.js +36 -36
  190. package/lib/engine/js-extensions/Layers.d.ts +3 -3
  191. package/lib/engine/js-extensions/Layers.js +19 -19
  192. package/lib/engine/js-extensions/index.d.ts +2 -2
  193. package/lib/engine/js-extensions/index.js +2 -2
  194. package/lib/engine/shaders/shaderData.d.ts +55 -55
  195. package/lib/engine/shaders/shaderData.js +58 -58
  196. package/lib/engine/tests/test_utils.d.ts +2 -2
  197. package/lib/engine/tests/test_utils.js +53 -53
  198. package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
  199. package/lib/engine-components/AlignmentConstraint.js +39 -39
  200. package/lib/engine-components/Animation.d.ts +53 -53
  201. package/lib/engine-components/Animation.js +333 -333
  202. package/lib/engine-components/AnimationCurve.d.ts +16 -16
  203. package/lib/engine-components/AnimationCurve.js +97 -97
  204. package/lib/engine-components/AnimationUtils.d.ts +8 -8
  205. package/lib/engine-components/AnimationUtils.js +110 -110
  206. package/lib/engine-components/Animator.d.ts +81 -81
  207. package/lib/engine-components/Animator.js +229 -229
  208. package/lib/engine-components/AnimatorController.d.ts +57 -57
  209. package/lib/engine-components/AnimatorController.js +887 -887
  210. package/lib/engine-components/AudioListener.d.ts +7 -7
  211. package/lib/engine-components/AudioListener.js +30 -30
  212. package/lib/engine-components/AudioSource.d.ts +61 -61
  213. package/lib/engine-components/AudioSource.js +422 -422
  214. package/lib/engine-components/AvatarLoader.d.ts +19 -19
  215. package/lib/engine-components/AvatarLoader.js +173 -173
  216. package/lib/engine-components/AxesHelper.d.ts +9 -9
  217. package/lib/engine-components/AxesHelper.js +44 -44
  218. package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
  219. package/lib/engine-components/BasicIKConstraint.js +43 -43
  220. package/lib/engine-components/BoxHelperComponent.d.ts +16 -16
  221. package/lib/engine-components/BoxHelperComponent.js +89 -89
  222. package/lib/engine-components/Camera.d.ts +70 -70
  223. package/lib/engine-components/Camera.js +450 -450
  224. package/lib/engine-components/CameraUtils.d.ts +1 -1
  225. package/lib/engine-components/CameraUtils.js +77 -77
  226. package/lib/engine-components/CharacterController.d.ts +46 -46
  227. package/lib/engine-components/CharacterController.js +227 -227
  228. package/lib/engine-components/Collider.d.ts +46 -46
  229. package/lib/engine-components/Collider.js +153 -153
  230. package/lib/engine-components/Component.d.ts +228 -228
  231. package/lib/engine-components/Component.js +541 -541
  232. package/lib/engine-components/ContactShadows.d.ts +23 -23
  233. package/lib/engine-components/ContactShadows.js +233 -233
  234. package/lib/engine-components/DeleteBox.d.ts +9 -9
  235. package/lib/engine-components/DeleteBox.js +30 -30
  236. package/lib/engine-components/DeviceFlag.d.ts +12 -12
  237. package/lib/engine-components/DeviceFlag.js +43 -43
  238. package/lib/engine-components/DragControls.d.ts +51 -51
  239. package/lib/engine-components/DragControls.js +516 -516
  240. package/lib/engine-components/DropListener.d.ts +15 -15
  241. package/lib/engine-components/DropListener.js +120 -120
  242. package/lib/engine-components/Duplicatable.d.ts +16 -16
  243. package/lib/engine-components/Duplicatable.js +150 -150
  244. package/lib/engine-components/EventList.d.ts +28 -28
  245. package/lib/engine-components/EventList.js +105 -105
  246. package/lib/engine-components/EventTrigger.d.ts +12 -12
  247. package/lib/engine-components/EventTrigger.js +50 -50
  248. package/lib/engine-components/EventType.d.ts +19 -19
  249. package/lib/engine-components/EventType.js +71 -71
  250. package/lib/engine-components/FlyControls.d.ts +7 -7
  251. package/lib/engine-components/FlyControls.js +25 -25
  252. package/lib/engine-components/Fog.d.ts +20 -20
  253. package/lib/engine-components/Fog.js +60 -60
  254. package/lib/engine-components/Gizmos.d.ts +12 -12
  255. package/lib/engine-components/Gizmos.js +60 -60
  256. package/lib/engine-components/GridHelper.d.ts +12 -12
  257. package/lib/engine-components/GridHelper.js +47 -47
  258. package/lib/engine-components/GroundProjection.d.ts +21 -21
  259. package/lib/engine-components/GroundProjection.js +97 -97
  260. package/lib/engine-components/Interactable.d.ts +10 -10
  261. package/lib/engine-components/Interactable.js +11 -11
  262. package/lib/engine-components/Joints.d.ts +19 -19
  263. package/lib/engine-components/Joints.js +51 -51
  264. package/lib/engine-components/LODGroup.d.ts +30 -30
  265. package/lib/engine-components/LODGroup.js +145 -145
  266. package/lib/engine-components/Light.d.ts +75 -75
  267. package/lib/engine-components/Light.js +475 -475
  268. package/lib/engine-components/LookAtConstraint.d.ts +7 -7
  269. package/lib/engine-components/LookAtConstraint.js +17 -17
  270. package/lib/engine-components/NestedGltf.d.ts +11 -11
  271. package/lib/engine-components/NestedGltf.js +74 -74
  272. package/lib/engine-components/Networking.d.ts +11 -11
  273. package/lib/engine-components/Networking.js +70 -70
  274. package/lib/engine-components/OffsetConstraint.d.ts +14 -14
  275. package/lib/engine-components/OffsetConstraint.js +65 -65
  276. package/lib/engine-components/OrbitControls.d.ts +111 -111
  277. package/lib/engine-components/OrbitControls.js +646 -646
  278. package/lib/engine-components/ParticleSystem.d.ts +145 -145
  279. package/lib/engine-components/ParticleSystem.js +1077 -1077
  280. package/lib/engine-components/ParticleSystemModules.d.ts +489 -489
  281. package/lib/engine-components/ParticleSystemModules.js +1667 -1667
  282. package/lib/engine-components/ParticleSystemSubEmitter.d.ts +25 -25
  283. package/lib/engine-components/ParticleSystemSubEmitter.js +86 -86
  284. package/lib/engine-components/PlayerColor.d.ts +13 -13
  285. package/lib/engine-components/PlayerColor.js +83 -83
  286. package/lib/engine-components/ReflectionProbe.d.ts +22 -22
  287. package/lib/engine-components/ReflectionProbe.js +181 -181
  288. package/lib/engine-components/Renderer.d.ts +112 -112
  289. package/lib/engine-components/Renderer.js +1029 -1029
  290. package/lib/engine-components/RendererLightmap.d.ts +19 -19
  291. package/lib/engine-components/RendererLightmap.js +127 -127
  292. package/lib/engine-components/RigidBody.d.ts +120 -120
  293. package/lib/engine-components/RigidBody.js +452 -452
  294. package/lib/engine-components/SceneSwitcher.d.ts +72 -72
  295. package/lib/engine-components/SceneSwitcher.js +583 -583
  296. package/lib/engine-components/ScreenCapture.d.ts +64 -64
  297. package/lib/engine-components/ScreenCapture.js +405 -405
  298. package/lib/engine-components/ShadowCatcher.d.ts +18 -18
  299. package/lib/engine-components/ShadowCatcher.js +144 -144
  300. package/lib/engine-components/Skybox.d.ts +23 -23
  301. package/lib/engine-components/Skybox.js +287 -287
  302. package/lib/engine-components/SmoothFollow.d.ts +14 -14
  303. package/lib/engine-components/SmoothFollow.js +63 -63
  304. package/lib/engine-components/SpatialTrigger.d.ts +27 -27
  305. package/lib/engine-components/SpatialTrigger.js +144 -144
  306. package/lib/engine-components/SpectatorCamera.d.ts +45 -45
  307. package/lib/engine-components/SpectatorCamera.js +593 -593
  308. package/lib/engine-components/SpriteRenderer.d.ts +48 -48
  309. package/lib/engine-components/SpriteRenderer.js +257 -257
  310. package/lib/engine-components/SyncedCamera.d.ts +27 -27
  311. package/lib/engine-components/SyncedCamera.js +187 -187
  312. package/lib/engine-components/SyncedRoom.d.ts +24 -24
  313. package/lib/engine-components/SyncedRoom.js +162 -162
  314. package/lib/engine-components/SyncedTransform.d.ts +35 -35
  315. package/lib/engine-components/SyncedTransform.js +265 -265
  316. package/lib/engine-components/TestRunner.d.ts +13 -13
  317. package/lib/engine-components/TestRunner.js +99 -99
  318. package/lib/engine-components/TransformGizmo.d.ts +16 -16
  319. package/lib/engine-components/TransformGizmo.js +148 -148
  320. package/lib/engine-components/VideoPlayer.d.ts +86 -86
  321. package/lib/engine-components/VideoPlayer.js +792 -792
  322. package/lib/engine-components/Voip.d.ts +29 -29
  323. package/lib/engine-components/Voip.js +203 -203
  324. package/lib/engine-components/XRFlag.d.ts +33 -33
  325. package/lib/engine-components/XRFlag.js +128 -128
  326. package/lib/engine-components/api.d.ts +15 -15
  327. package/lib/engine-components/api.js +15 -15
  328. package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +10 -10
  329. package/lib/engine-components/avatar/AvatarBlink_Simple.js +75 -75
  330. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +13 -13
  331. package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +74 -74
  332. package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +27 -27
  333. package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +119 -119
  334. package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +13 -13
  335. package/lib/engine-components/avatar/Avatar_MouthShapes.js +78 -78
  336. package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +8 -8
  337. package/lib/engine-components/avatar/Avatar_MustacheShake.js +28 -28
  338. package/lib/engine-components/codegen/components.d.ts +216 -216
  339. package/lib/engine-components/codegen/components.js +217 -217
  340. package/lib/engine-components/debug/LogStats.d.ts +5 -5
  341. package/lib/engine-components/debug/LogStats.js +18 -18
  342. package/lib/engine-components/export/gltf/GltfExport.d.ts +25 -25
  343. package/lib/engine-components/export/gltf/GltfExport.js +215 -215
  344. package/lib/engine-components/export/index.d.ts +1 -1
  345. package/lib/engine-components/export/index.js +1 -1
  346. package/lib/engine-components/export/usdz/Extension.d.ts +10 -10
  347. package/lib/engine-components/export/usdz/Extension.js +1 -1
  348. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +114 -114
  349. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1211 -1211
  350. package/lib/engine-components/export/usdz/USDZExporter.d.ts +59 -59
  351. package/lib/engine-components/export/usdz/USDZExporter.js +450 -450
  352. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +69 -69
  353. package/lib/engine-components/export/usdz/extensions/Animation.js +650 -650
  354. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
  355. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
  356. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +55 -55
  357. package/lib/engine-components/export/usdz/extensions/USDZText.js +246 -246
  358. package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
  359. package/lib/engine-components/export/usdz/extensions/USDZUI.js +100 -100
  360. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
  361. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
  362. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +9 -9
  363. package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +52 -52
  364. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +22 -22
  365. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +134 -134
  366. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +126 -126
  367. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +824 -824
  368. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +133 -133
  369. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +464 -464
  370. package/lib/engine-components/export/usdz/index.d.ts +3 -3
  371. package/lib/engine-components/export/usdz/index.js +2 -2
  372. package/lib/engine-components/export/usdz/utils/animationutils.d.ts +3 -3
  373. package/lib/engine-components/export/usdz/utils/animationutils.js +85 -85
  374. package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
  375. package/lib/engine-components/export/usdz/utils/quicklook.js +35 -35
  376. package/lib/engine-components/export/usdz/utils/timeutils.d.ts +1 -1
  377. package/lib/engine-components/export/usdz/utils/timeutils.js +14 -14
  378. package/lib/engine-components/js-extensions/ExtensionUtils.d.ts +6 -6
  379. package/lib/engine-components/js-extensions/ExtensionUtils.js +65 -65
  380. package/lib/engine-components/js-extensions/Object3D.d.ts +2 -2
  381. package/lib/engine-components/js-extensions/Object3D.js +140 -140
  382. package/lib/engine-components/js-extensions/RGBAColor.d.ts +14 -14
  383. package/lib/engine-components/js-extensions/RGBAColor.js +49 -49
  384. package/lib/engine-components/js-extensions/index.d.ts +3 -3
  385. package/lib/engine-components/js-extensions/index.js +3 -3
  386. package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +13 -13
  387. package/lib/engine-components/postprocessing/Effects/Antialiasing.js +45 -45
  388. package/lib/engine-components/postprocessing/Effects/Bloom.d.ts +12 -12
  389. package/lib/engine-components/postprocessing/Effects/Bloom.js +77 -77
  390. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +8 -8
  391. package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +38 -38
  392. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +12 -12
  393. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +81 -81
  394. package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +21 -21
  395. package/lib/engine-components/postprocessing/Effects/DepthOfField.js +97 -97
  396. package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +7 -7
  397. package/lib/engine-components/postprocessing/Effects/Pixelation.js +28 -28
  398. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +13 -13
  399. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +86 -86
  400. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +24 -24
  401. package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +94 -94
  402. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +13 -13
  403. package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +62 -62
  404. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +16 -16
  405. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +51 -51
  406. package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +11 -11
  407. package/lib/engine-components/postprocessing/Effects/Vignette.js +56 -56
  408. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +33 -33
  409. package/lib/engine-components/postprocessing/PostProcessingEffect.js +126 -126
  410. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +22 -22
  411. package/lib/engine-components/postprocessing/PostProcessingHandler.js +201 -201
  412. package/lib/engine-components/postprocessing/Volume.d.ts +25 -25
  413. package/lib/engine-components/postprocessing/Volume.js +193 -193
  414. package/lib/engine-components/postprocessing/VolumeParameter.d.ts +22 -22
  415. package/lib/engine-components/postprocessing/VolumeParameter.js +80 -80
  416. package/lib/engine-components/postprocessing/VolumeProfile.d.ts +7 -7
  417. package/lib/engine-components/postprocessing/VolumeProfile.js +41 -41
  418. package/lib/engine-components/postprocessing/index.d.ts +4 -4
  419. package/lib/engine-components/postprocessing/index.js +4 -4
  420. package/lib/engine-components/timeline/PlayableDirector.d.ts +107 -107
  421. package/lib/engine-components/timeline/PlayableDirector.js +624 -624
  422. package/lib/engine-components/timeline/SignalAsset.d.ts +18 -18
  423. package/lib/engine-components/timeline/SignalAsset.js +124 -124
  424. package/lib/engine-components/timeline/TimelineModels.d.ts +88 -88
  425. package/lib/engine-components/timeline/TimelineModels.js +22 -22
  426. package/lib/engine-components/timeline/TimelineTracks.d.ts +90 -90
  427. package/lib/engine-components/timeline/TimelineTracks.js +825 -825
  428. package/lib/engine-components/timeline/index.d.ts +4 -4
  429. package/lib/engine-components/timeline/index.js +3 -3
  430. package/lib/engine-components/ui/BaseUIComponent.d.ts +31 -31
  431. package/lib/engine-components/ui/BaseUIComponent.js +161 -161
  432. package/lib/engine-components/ui/Button.d.ts +56 -56
  433. package/lib/engine-components/ui/Button.js +282 -282
  434. package/lib/engine-components/ui/Canvas.d.ts +67 -67
  435. package/lib/engine-components/ui/Canvas.js +382 -382
  436. package/lib/engine-components/ui/CanvasGroup.d.ts +15 -15
  437. package/lib/engine-components/ui/CanvasGroup.js +53 -53
  438. package/lib/engine-components/ui/EventSystem.d.ts +102 -102
  439. package/lib/engine-components/ui/EventSystem.js +641 -641
  440. package/lib/engine-components/ui/Graphic.d.ts +45 -45
  441. package/lib/engine-components/ui/Graphic.js +236 -236
  442. package/lib/engine-components/ui/Image.d.ts +27 -27
  443. package/lib/engine-components/ui/Image.js +107 -107
  444. package/lib/engine-components/ui/InputField.d.ts +34 -34
  445. package/lib/engine-components/ui/InputField.js +234 -234
  446. package/lib/engine-components/ui/Interfaces.d.ts +38 -38
  447. package/lib/engine-components/ui/Interfaces.js +12 -12
  448. package/lib/engine-components/ui/Layout.d.ts +72 -72
  449. package/lib/engine-components/ui/Layout.js +318 -318
  450. package/lib/engine-components/ui/Outline.d.ts +7 -7
  451. package/lib/engine-components/ui/Outline.js +20 -20
  452. package/lib/engine-components/ui/PointerEvents.d.ts +64 -64
  453. package/lib/engine-components/ui/PointerEvents.js +68 -68
  454. package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
  455. package/lib/engine-components/ui/RaycastUtils.js +67 -67
  456. package/lib/engine-components/ui/Raycaster.d.ts +18 -18
  457. package/lib/engine-components/ui/Raycaster.js +69 -69
  458. package/lib/engine-components/ui/RectTransform.d.ts +61 -61
  459. package/lib/engine-components/ui/RectTransform.js +343 -343
  460. package/lib/engine-components/ui/SpatialHtml.d.ts +6 -6
  461. package/lib/engine-components/ui/SpatialHtml.js +57 -57
  462. package/lib/engine-components/ui/Text.d.ts +74 -74
  463. package/lib/engine-components/ui/Text.js +534 -534
  464. package/lib/engine-components/ui/Utils.d.ts +23 -23
  465. package/lib/engine-components/ui/Utils.js +90 -90
  466. package/lib/engine-components/ui/index.d.ts +1 -1
  467. package/lib/engine-components/ui/index.js +1 -1
  468. package/lib/engine-components/utils/LookAt.d.ts +13 -13
  469. package/lib/engine-components/utils/LookAt.js +59 -59
  470. package/lib/engine-components/utils/OpenURL.d.ts +21 -21
  471. package/lib/engine-components/utils/OpenURL.js +124 -124
  472. package/lib/engine-components/webxr/WebARCameraBackground.d.ts +19 -19
  473. package/lib/engine-components/webxr/WebARCameraBackground.js +193 -193
  474. package/lib/engine-components/webxr/WebARSessionRoot.d.ts +38 -38
  475. package/lib/engine-components/webxr/WebARSessionRoot.js +407 -407
  476. package/lib/engine-components/webxr/WebXR.d.ts +110 -110
  477. package/lib/engine-components/webxr/WebXR.js +672 -672
  478. package/lib/engine-components/webxr/WebXRAvatar.d.ts +61 -61
  479. package/lib/engine-components/webxr/WebXRAvatar.js +289 -289
  480. package/lib/engine-components/webxr/WebXRController.d.ts +154 -154
  481. package/lib/engine-components/webxr/WebXRController.js +1028 -1028
  482. package/lib/engine-components/webxr/WebXRGrabRendering.d.ts +42 -42
  483. package/lib/engine-components/webxr/WebXRGrabRendering.js +137 -137
  484. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +49 -49
  485. package/lib/engine-components/webxr/WebXRImageTracking.js +336 -336
  486. package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +49 -49
  487. package/lib/engine-components/webxr/WebXRPlaneTracking.js +372 -372
  488. package/lib/engine-components/webxr/WebXRRig.d.ts +4 -4
  489. package/lib/engine-components/webxr/WebXRRig.js +19 -19
  490. package/lib/engine-components/webxr/WebXRSync.d.ts +54 -54
  491. package/lib/engine-components/webxr/WebXRSync.js +410 -410
  492. package/lib/engine-components/webxr/index.d.ts +4 -4
  493. package/lib/engine-components/webxr/index.js +4 -4
  494. package/lib/engine-components-experimental/Presentation.d.ts +6 -6
  495. package/lib/engine-components-experimental/Presentation.js +9 -9
  496. package/lib/engine-components-experimental/api.d.ts +1 -1
  497. package/lib/engine-components-experimental/api.js +1 -1
  498. package/lib/engine-components-experimental/networking/PlayerSync.d.ts +50 -50
  499. package/lib/engine-components-experimental/networking/PlayerSync.js +200 -200
  500. package/lib/engine-schemes/api.d.ts +1 -1
  501. package/lib/engine-schemes/api.js +1 -1
  502. package/lib/engine-schemes/schemes.d.ts +7 -7
  503. package/lib/engine-schemes/schemes.js +19 -19
  504. package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
  505. package/lib/engine-schemes/synced-camera-model.js +67 -67
  506. package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
  507. package/lib/engine-schemes/synced-transform-model.js +66 -66
  508. package/lib/engine-schemes/transform.d.ts +12 -12
  509. package/lib/engine-schemes/transform.js +39 -39
  510. package/lib/engine-schemes/vec3.d.ts +11 -11
  511. package/lib/engine-schemes/vec3.js +29 -29
  512. package/lib/engine-schemes/vec4.d.ts +12 -12
  513. package/lib/engine-schemes/vec4.js +33 -33
  514. package/lib/engine-schemes/vr-user-state-buffer.d.ts +36 -36
  515. package/lib/engine-schemes/vr-user-state-buffer.js +103 -103
  516. package/lib/include/three/ARButton.d.ts +3 -3
  517. package/lib/include/three/ARButton.js +151 -151
  518. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
  519. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
  520. package/lib/include/three/VRButton.d.ts +5 -5
  521. package/lib/include/three/VRButton.js +118 -118
  522. package/lib/needle-engine.d.ts +6 -6
  523. package/lib/needle-engine.js +49 -49
  524. package/package.json +1 -1
  525. package/plugins/common/config.cjs +14 -14
  526. package/plugins/common/config.js +19 -19
  527. package/plugins/common/generator.js +10 -10
  528. package/plugins/common/license.cjs +30 -30
  529. package/plugins/common/version.js +11 -11
  530. package/plugins/next/license.cjs +4 -4
  531. package/plugins/next/next.js +70 -70
  532. package/plugins/types/index.d.ts +1 -1
  533. package/plugins/types/needleConfig.d.ts +21 -21
  534. package/plugins/types/userconfig.d.ts +42 -42
  535. package/plugins/vite/alias.js +70 -70
  536. package/plugins/vite/build.js +19 -19
  537. package/plugins/vite/config.js +73 -73
  538. package/plugins/vite/copyfiles.js +134 -134
  539. package/plugins/vite/defines.js +45 -45
  540. package/plugins/vite/dependency-watcher.js +224 -224
  541. package/plugins/vite/drop-client.js +76 -76
  542. package/plugins/vite/drop.js +82 -82
  543. package/plugins/vite/editor-connection.js +121 -121
  544. package/plugins/vite/facebook-instant-games.js +99 -99
  545. package/plugins/vite/gzip.js +5 -5
  546. package/plugins/vite/imports-logger.js +143 -143
  547. package/plugins/vite/index.js +81 -81
  548. package/plugins/vite/license.js +42 -42
  549. package/plugins/vite/meta.js +149 -149
  550. package/plugins/vite/peer.js +31 -31
  551. package/plugins/vite/poster-client.js +59 -59
  552. package/plugins/vite/poster.js +73 -73
  553. package/plugins/vite/reload-client.js +15 -15
  554. package/plugins/vite/reload.js +363 -363
  555. package/plugins/vite/transform-codegen.js +55 -55
  556. package/plugins/vite/vite-4.4-hack.js +31 -31
  557. package/src/engine/api.ts +54 -54
  558. package/src/engine/assets/index.ts +4 -4
  559. package/src/engine/codegen/register_types.ts +441 -441
  560. package/src/engine/debug/debug.ts +29 -29
  561. package/src/engine/debug/debug_console.ts +213 -213
  562. package/src/engine/debug/debug_overlay.ts +283 -283
  563. package/src/engine/engine.ts +13 -13
  564. package/src/engine/engine_addressables.ts +494 -494
  565. package/src/engine/engine_application.ts +53 -53
  566. package/src/engine/engine_assetdatabase.ts +383 -383
  567. package/src/engine/engine_camera.ts +32 -32
  568. package/src/engine/engine_components.ts +266 -266
  569. package/src/engine/engine_components_internal.ts +42 -42
  570. package/src/engine/engine_constants.ts +42 -42
  571. package/src/engine/engine_context.ts +1386 -1386
  572. package/src/engine/engine_context_registry.ts +103 -103
  573. package/src/engine/engine_coroutine.ts +24 -24
  574. package/src/engine/engine_create_objects.ts +39 -39
  575. package/src/engine/engine_default_parameters.ts +3 -3
  576. package/src/engine/engine_editor-sync.ts +29 -29
  577. package/src/engine/engine_element.ts +592 -592
  578. package/src/engine/engine_element_attributes.ts +61 -61
  579. package/src/engine/engine_element_extras.ts +16 -16
  580. package/src/engine/engine_element_loading.ts +341 -341
  581. package/src/engine/engine_element_overlay.ts +160 -160
  582. package/src/engine/engine_fileloader.js +8 -8
  583. package/src/engine/engine_gameobject.ts +621 -621
  584. package/src/engine/engine_generic_utils.js +13 -13
  585. package/src/engine/engine_gizmos.ts +321 -321
  586. package/src/engine/engine_gltf.ts +30 -30
  587. package/src/engine/engine_gltf_builtin_components.ts +350 -350
  588. package/src/engine/engine_hot_reload.ts +196 -196
  589. package/src/engine/engine_input.ts +879 -879
  590. package/src/engine/engine_input_utils.ts +23 -23
  591. package/src/engine/engine_instancing.ts +42 -42
  592. package/src/engine/engine_license.ts +413 -413
  593. package/src/engine/engine_lifecycle_api.ts +29 -29
  594. package/src/engine/engine_lifecycle_functions_internal.ts +36 -36
  595. package/src/engine/engine_lightdata.ts +113 -113
  596. package/src/engine/engine_loaders.ts +77 -77
  597. package/src/engine/engine_mainloop_utils.ts +431 -431
  598. package/src/engine/engine_math.ts +174 -174
  599. package/src/engine/engine_networking.ts +742 -742
  600. package/src/engine/engine_networking_auto.ts +373 -373
  601. package/src/engine/engine_networking_files.ts +206 -206
  602. package/src/engine/engine_networking_files_default_components.ts +54 -54
  603. package/src/engine/engine_networking_instantiate.ts +362 -362
  604. package/src/engine/engine_networking_peer.ts +158 -158
  605. package/src/engine/engine_networking_streams.ts +489 -489
  606. package/src/engine/engine_networking_types.ts +18 -18
  607. package/src/engine/engine_networking_utils.ts +23 -23
  608. package/src/engine/engine_networking_websocket.ts +2 -2
  609. package/src/engine/engine_patcher.ts +199 -199
  610. package/src/engine/engine_physics.ts +287 -287
  611. package/src/engine/engine_physics.types.ts +43 -43
  612. package/src/engine/engine_physics_rapier.ts +1385 -1385
  613. package/src/engine/engine_playerview.ts +79 -79
  614. package/src/engine/engine_scenelighting.ts +313 -313
  615. package/src/engine/engine_scenetools.ts +242 -242
  616. package/src/engine/engine_serialization.ts +6 -6
  617. package/src/engine/engine_serialization_builtin_serializer.ts +415 -415
  618. package/src/engine/engine_serialization_core.ts +680 -680
  619. package/src/engine/engine_serialization_decorator.ts +68 -68
  620. package/src/engine/engine_setup.ts +1 -1
  621. package/src/engine/engine_shaders.ts +242 -242
  622. package/src/engine/engine_shims.ts +28 -28
  623. package/src/engine/engine_texture.ts +70 -70
  624. package/src/engine/engine_three_utils.ts +382 -382
  625. package/src/engine/engine_time.ts +55 -55
  626. package/src/engine/engine_types.ts +489 -489
  627. package/src/engine/engine_typestore.ts +41 -41
  628. package/src/engine/engine_util_decorator.ts +134 -134
  629. package/src/engine/engine_utils.ts +605 -605
  630. package/src/engine/engine_utils_screenshot.ts +84 -84
  631. package/src/engine/engine_web_api.ts +119 -119
  632. package/src/engine/extensions/EXT_texture_exr.ts +49 -49
  633. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +193 -193
  634. package/src/engine/extensions/NEEDLE_components.ts +250 -250
  635. package/src/engine/extensions/NEEDLE_gameobject_data.ts +82 -82
  636. package/src/engine/extensions/NEEDLE_lighting_settings.ts +210 -210
  637. package/src/engine/extensions/NEEDLE_lightmaps.ts +130 -130
  638. package/src/engine/extensions/NEEDLE_persistent_assets.ts +75 -75
  639. package/src/engine/extensions/NEEDLE_progressive.ts +412 -412
  640. package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
  641. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +618 -618
  642. package/src/engine/extensions/extension_resolver.ts +4 -4
  643. package/src/engine/extensions/extension_utils.ts +149 -149
  644. package/src/engine/extensions/extensions.ts +118 -118
  645. package/src/engine/extensions/index.ts +4 -4
  646. package/src/engine/extensions/usage_tracker.ts +95 -95
  647. package/src/engine/js-extensions/Camera.ts +34 -34
  648. package/src/engine/js-extensions/Layers.ts +19 -19
  649. package/src/engine/js-extensions/index.ts +1 -1
  650. package/src/engine/shaders/shaderData.ts +67 -67
  651. package/src/engine/tests/test_utils.ts +63 -63
  652. package/src/engine-components/AlignmentConstraint.ts +35 -35
  653. package/src/engine-components/Animation.ts +345 -345
  654. package/src/engine-components/AnimationCurve.ts +83 -83
  655. package/src/engine-components/AnimationUtils.ts +117 -117
  656. package/src/engine-components/Animator.ts +243 -243
  657. package/src/engine-components/AnimatorController.ts +1020 -1020
  658. package/src/engine-components/AudioListener.ts +32 -32
  659. package/src/engine-components/AudioSource.ts +419 -419
  660. package/src/engine-components/AvatarLoader.ts +204 -204
  661. package/src/engine-components/AxesHelper.ts +33 -33
  662. package/src/engine-components/BasicIKConstraint.ts +53 -53
  663. package/src/engine-components/BoxCollider.ts +1 -1
  664. package/src/engine-components/BoxHelperComponent.ts +100 -100
  665. package/src/engine-components/Camera.ts +454 -454
  666. package/src/engine-components/CameraUtils.ts +89 -89
  667. package/src/engine-components/CharacterController.ts +243 -243
  668. package/src/engine-components/Collider.ts +160 -160
  669. package/src/engine-components/Component.ts +670 -670
  670. package/src/engine-components/ContactShadows.ts +265 -265
  671. package/src/engine-components/DeleteBox.ts +35 -35
  672. package/src/engine-components/DeviceFlag.ts +42 -42
  673. package/src/engine-components/DragControls.ts +574 -574
  674. package/src/engine-components/DropListener.ts +112 -112
  675. package/src/engine-components/Duplicatable.ts +146 -146
  676. package/src/engine-components/EventList.ts +125 -125
  677. package/src/engine-components/EventTrigger.ts +47 -47
  678. package/src/engine-components/EventType.ts +87 -87
  679. package/src/engine-components/FlyControls.ts +31 -31
  680. package/src/engine-components/Fog.ts +59 -59
  681. package/src/engine-components/Gizmos.ts +52 -52
  682. package/src/engine-components/GridHelper.ts +40 -40
  683. package/src/engine-components/GroundProjection.ts +97 -97
  684. package/src/engine-components/Interactable.ts +18 -18
  685. package/src/engine-components/Joints.ts +51 -51
  686. package/src/engine-components/LODGroup.ts +145 -145
  687. package/src/engine-components/Light.ts +493 -493
  688. package/src/engine-components/LookAtConstraint.ts +11 -11
  689. package/src/engine-components/NestedGltf.ts +70 -70
  690. package/src/engine-components/Networking.ts +72 -72
  691. package/src/engine-components/OffsetConstraint.ts +59 -59
  692. package/src/engine-components/OrbitControls.ts +653 -653
  693. package/src/engine-components/ParticleSystem.ts +1192 -1192
  694. package/src/engine-components/ParticleSystemModules.ts +1481 -1481
  695. package/src/engine-components/ParticleSystemSubEmitter.ts +110 -110
  696. package/src/engine-components/PlayerColor.ts +93 -93
  697. package/src/engine-components/ReflectionProbe.ts +192 -192
  698. package/src/engine-components/Renderer.ts +1125 -1125
  699. package/src/engine-components/RendererLightmap.ts +145 -145
  700. package/src/engine-components/RigidBody.ts +453 -453
  701. package/src/engine-components/SceneSwitcher.ts +594 -594
  702. package/src/engine-components/ScreenCapture.ts +437 -437
  703. package/src/engine-components/ShadowCatcher.ts +149 -149
  704. package/src/engine-components/Skybox.ts +281 -281
  705. package/src/engine-components/SmoothFollow.ts +57 -57
  706. package/src/engine-components/SpatialTrigger.ts +142 -142
  707. package/src/engine-components/SpectatorCamera.ts +675 -675
  708. package/src/engine-components/SphereCollider.ts +1 -1
  709. package/src/engine-components/SpriteRenderer.ts +244 -244
  710. package/src/engine-components/SyncedCamera.ts +208 -208
  711. package/src/engine-components/SyncedRoom.ts +166 -166
  712. package/src/engine-components/SyncedTransform.ts +336 -336
  713. package/src/engine-components/TestRunner.ts +114 -114
  714. package/src/engine-components/TransformGizmo.ts +157 -157
  715. package/src/engine-components/VideoPlayer.ts +831 -831
  716. package/src/engine-components/Voip.ts +214 -214
  717. package/src/engine-components/XRFlag.ts +138 -138
  718. package/src/engine-components/api.ts +22 -22
  719. package/src/engine-components/avatar/AvatarBlink_Simple.ts +67 -67
  720. package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +68 -68
  721. package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +136 -136
  722. package/src/engine-components/avatar/Avatar_MouthShapes.ts +81 -81
  723. package/src/engine-components/avatar/Avatar_MustacheShake.ts +28 -28
  724. package/src/engine-components/codegen/components.ts +216 -216
  725. package/src/engine-components/debug/LogStats.ts +21 -21
  726. package/src/engine-components/export/gltf/GltfExport.ts +231 -231
  727. package/src/engine-components/export/usdz/Extension.ts +11 -11
  728. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1773 -1773
  729. package/src/engine-components/export/usdz/USDZExporter.ts +477 -477
  730. package/src/engine-components/export/usdz/extensions/Animation.ts +774 -774
  731. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
  732. package/src/engine-components/export/usdz/extensions/USDZText.ts +287 -287
  733. package/src/engine-components/export/usdz/extensions/USDZUI.ts +119 -119
  734. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +98 -98
  735. package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +67 -67
  736. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +202 -202
  737. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +963 -963
  738. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +517 -517
  739. package/src/engine-components/export/usdz/index.ts +2 -2
  740. package/src/engine-components/export/usdz/utils/animationutils.ts +100 -100
  741. package/src/engine-components/export/usdz/utils/quicklook.ts +42 -42
  742. package/src/engine-components/export/usdz/utils/timeutils.ts +19 -19
  743. package/src/engine-components/js-extensions/ExtensionUtils.ts +81 -81
  744. package/src/engine-components/js-extensions/Object3D.ts +181 -181
  745. package/src/engine-components/js-extensions/RGBAColor.ts +54 -54
  746. package/src/engine-components/js-extensions/Vector.ts +16 -16
  747. package/src/engine-components/js-extensions/index.ts +2 -2
  748. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +51 -51
  749. package/src/engine-components/postprocessing/Effects/Bloom.ts +76 -76
  750. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +35 -35
  751. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +96 -96
  752. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +93 -93
  753. package/src/engine-components/postprocessing/Effects/Pixelation.ts +26 -26
  754. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +84 -84
  755. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +98 -98
  756. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +55 -55
  757. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +54 -54
  758. package/src/engine-components/postprocessing/Effects/Vignette.ts +54 -54
  759. package/src/engine-components/postprocessing/PostProcessingEffect.ts +148 -148
  760. package/src/engine-components/postprocessing/PostProcessingHandler.ts +232 -232
  761. package/src/engine-components/postprocessing/Volume.ts +216 -216
  762. package/src/engine-components/postprocessing/VolumeParameter.ts +92 -92
  763. package/src/engine-components/postprocessing/VolumeProfile.ts +40 -40
  764. package/src/engine-components/postprocessing/index.ts +3 -3
  765. package/src/engine-components/timeline/PlayableDirector.ts +666 -666
  766. package/src/engine-components/timeline/SignalAsset.ts +138 -138
  767. package/src/engine-components/timeline/TimelineModels.ts +93 -93
  768. package/src/engine-components/timeline/TimelineTracks.ts +906 -906
  769. package/src/engine-components/timeline/index.ts +3 -3
  770. package/src/engine-components/ui/BaseUIComponent.ts +195 -195
  771. package/src/engine-components/ui/Button.ts +283 -283
  772. package/src/engine-components/ui/Canvas.ts +390 -390
  773. package/src/engine-components/ui/CanvasGroup.ts +49 -49
  774. package/src/engine-components/ui/EventSystem.ts +736 -736
  775. package/src/engine-components/ui/Graphic.ts +255 -255
  776. package/src/engine-components/ui/Image.ts +102 -102
  777. package/src/engine-components/ui/InputField.ts +290 -290
  778. package/src/engine-components/ui/Interfaces.ts +57 -57
  779. package/src/engine-components/ui/Layout.ts +322 -322
  780. package/src/engine-components/ui/Outline.ts +12 -12
  781. package/src/engine-components/ui/PointerEvents.ts +118 -118
  782. package/src/engine-components/ui/RaycastUtils.ts +68 -68
  783. package/src/engine-components/ui/Raycaster.ts +73 -73
  784. package/src/engine-components/ui/RectTransform.ts +364 -364
  785. package/src/engine-components/ui/SpatialHtml.ts +63 -63
  786. package/src/engine-components/ui/Text.ts +572 -572
  787. package/src/engine-components/ui/Utils.ts +110 -110
  788. package/src/engine-components/utils/LookAt.ts +65 -65
  789. package/src/engine-components/utils/OpenURL.ts +118 -118
  790. package/src/engine-components/webxr/WebARCameraBackground.ts +224 -224
  791. package/src/engine-components/webxr/WebARSessionRoot.ts +446 -446
  792. package/src/engine-components/webxr/WebXR.ts +761 -761
  793. package/src/engine-components/webxr/WebXRAvatar.ts +356 -356
  794. package/src/engine-components/webxr/WebXRController.ts +1168 -1168
  795. package/src/engine-components/webxr/WebXRGrabRendering.ts +150 -150
  796. package/src/engine-components/webxr/WebXRImageTracking.ts +371 -371
  797. package/src/engine-components/webxr/WebXRPlaneTracking.ts +429 -429
  798. package/src/engine-components/webxr/WebXRRig.ts +21 -21
  799. package/src/engine-components/webxr/WebXRSync.ts +463 -463
  800. package/src/engine-components/webxr/index.ts +3 -3
  801. package/src/engine-components-experimental/Presentation.ts +12 -12
  802. package/src/engine-components-experimental/networking/PlayerSync.ts +217 -217
  803. package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
  804. package/src/engine-schemes/COMPILE_TS.bat +11 -11
  805. package/src/engine-schemes/schemes.ts +27 -27
  806. package/src/engine-schemes/synced-camera-model.ts +92 -92
  807. package/src/engine-schemes/synced-transform-model.ts +90 -90
  808. package/src/engine-schemes/syncedCamera.fbs +10 -10
  809. package/src/engine-schemes/transform.ts +50 -50
  810. package/src/engine-schemes/transforms.fbs +25 -25
  811. package/src/engine-schemes/vec.fbs +19 -19
  812. package/src/engine-schemes/vec2.ts +33 -33
  813. package/src/engine-schemes/vec3.ts +38 -38
  814. package/src/engine-schemes/vec4.ts +43 -43
  815. package/src/engine-schemes/vr-user-state-buffer.ts +138 -138
  816. package/src/engine-schemes/vrUserStateBuffer.fbs +16 -16
  817. package/src/include/draco/draco_decoder.js +34 -34
  818. package/src/include/draco/draco_wasm_wrapper.js +117 -117
  819. package/src/include/ktx2/basis_transcoder.js +21 -21
  820. package/src/include/needle/arial-msdf.json +1471 -1471
  821. package/src/include/three/ARButton.js +231 -231
  822. package/src/include/three/DragControls.js +231 -231
  823. package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
  824. package/src/include/three/VRButton.js +194 -194
  825. package/src/needle-engine.ts +55 -55
  826. package/src/engine/dist/api.js +0 -73
  827. package/src/engine/dist/api.js.meta +0 -7
  828. package/src/engine/dist/engine_networking_streams.js +0 -474
  829. package/src/engine/dist/engine_networking_streams.js.meta +0 -7
  830. package/src/engine-schemes/dist/api.js +0 -17
  831. package/src/engine-schemes/dist/api.js.meta +0 -7
  832. package/src/engine-schemes/dist/schemes.js +0 -25
  833. package/src/engine-schemes/dist/schemes.js.meta +0 -7
  834. package/src/engine-schemes/dist/synced-camera-model.js +0 -74
  835. package/src/engine-schemes/dist/synced-camera-model.js.meta +0 -7
  836. package/src/engine-schemes/dist/synced-transform-model.js +0 -73
  837. package/src/engine-schemes/dist/synced-transform-model.js.meta +0 -7
  838. package/src/engine-schemes/dist/transform.js +0 -46
  839. package/src/engine-schemes/dist/transform.js.meta +0 -7
  840. package/src/engine-schemes/dist/vec2.js +0 -32
  841. package/src/engine-schemes/dist/vec2.js.meta +0 -7
  842. package/src/engine-schemes/dist/vec3.js +0 -36
  843. package/src/engine-schemes/dist/vec3.js.meta +0 -7
  844. package/src/engine-schemes/dist/vec4.js +0 -40
  845. package/src/engine-schemes/dist/vec4.js.meta +0 -7
  846. package/src/engine-schemes/dist/vr-user-state-buffer.js +0 -110
  847. package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +0 -7
  848. package/src/engine-schemes/flatc.exe +0 -0
@@ -1,1030 +1,1030 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { Behaviour, GameObject } from "./Component.js";
8
- import * as THREE from "three";
9
- // import { RendererCustomShader } from "./RendererCustomShader.js";
10
- import { RendererLightmap } from "./RendererLightmap.js";
11
- import { FrameEvent } from "../engine/engine_setup.js";
12
- import { getParam } from "../engine/engine_utils.js";
13
- import { serializable } from "../engine/engine_serialization_decorator.js";
14
- import { AxesHelper, Material, Object3D, SkinnedMesh, Vector4 } from "three";
15
- import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
16
- import { NEEDLE_progressive } from "../engine/extensions/NEEDLE_progressive.js";
17
- import { $instancingAutoUpdateBounds, $instancingRenderer, InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
18
- import { ReflectionProbe } from "./ReflectionProbe.js";
19
- import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
20
- import { isLocalNetwork } from "../engine/engine_networking_utils.js";
21
- import { showBalloonWarning } from "../engine/debug/index.js";
22
- import { Gizmos } from "../engine/engine_gizmos.js";
23
- import { getTempVector } from "../engine/engine_three_utils.js";
24
- // for staying compatible with old code
25
- export { InstancingUtil } from "../engine/engine_instancing.js";
26
- const debugRenderer = getParam("debugrenderer");
27
- const debugskinnedmesh = getParam("debugskinnedmesh");
28
- const suppressInstancing = getParam("noInstancing");
29
- const debugInstancing = getParam("debuginstancing");
30
- const debugProgressiveLoading = getParam("debugprogressive");
31
- const suppressProgressiveLoading = getParam("noprogressive");
32
- const showWireframe = getParam("wireframe");
33
- export var ReflectionProbeUsage;
34
- (function (ReflectionProbeUsage) {
35
- ReflectionProbeUsage[ReflectionProbeUsage["Off"] = 0] = "Off";
36
- ReflectionProbeUsage[ReflectionProbeUsage["BlendProbes"] = 1] = "BlendProbes";
37
- ReflectionProbeUsage[ReflectionProbeUsage["BlendProbesAndSkybox"] = 2] = "BlendProbesAndSkybox";
38
- ReflectionProbeUsage[ReflectionProbeUsage["Simple"] = 3] = "Simple";
39
- })(ReflectionProbeUsage || (ReflectionProbeUsage = {}));
40
- export class FieldWithDefault {
41
- path = null;
42
- asset = null;
43
- default;
44
- }
45
- export var RenderState;
46
- (function (RenderState) {
47
- RenderState[RenderState["Both"] = 0] = "Both";
48
- RenderState[RenderState["Back"] = 1] = "Back";
49
- RenderState[RenderState["Front"] = 2] = "Front";
50
- })(RenderState || (RenderState = {}));
51
- // support sharedMaterials[index] assigning materials directly to the objects
52
- class SharedMaterialArray {
53
- _renderer;
54
- _targets = [];
55
- _indexMapMaxIndex;
56
- _indexMap;
57
- _changed = false;
58
- get changed() {
59
- return this._changed;
60
- }
61
- set changed(value) {
62
- if (value === true) {
63
- if (debugRenderer)
64
- console.warn("SharedMaterials have changed: " + this._renderer.name, this);
65
- }
66
- this._changed = value;
67
- }
68
- is(renderer) {
69
- return this._renderer === renderer;
70
- }
71
- constructor(renderer, originalMaterials) {
72
- this._renderer = renderer;
73
- const setMaterial = this.setMaterial.bind(this);
74
- const getMaterial = this.getMaterial.bind(this);
75
- const go = renderer.gameObject;
76
- this._targets = [];
77
- if (go) {
78
- switch (go.type) {
79
- case "Group":
80
- this._targets = [...go.children];
81
- break;
82
- case "SkinnedMesh":
83
- case "Mesh":
84
- this._targets.push(go);
85
- break;
86
- }
87
- }
88
- // this is useful to have an index map when e.g. materials are trying to be assigned by index
89
- let hasMissingMaterials = false;
90
- let indexMap = undefined;
91
- let maxIndex = 0;
92
- for (let i = 0; i < this._targets.length; i++) {
93
- const target = this._targets[i];
94
- if (!target)
95
- continue;
96
- const mat = target.material;
97
- if (!mat)
98
- continue;
99
- // set the shadow side to the same as the side of the material, three flips this for some reason
100
- mat.shadowSide = mat.side;
101
- for (let k = 0; k < originalMaterials.length; k++) {
102
- const orig = originalMaterials[k];
103
- if (!orig) {
104
- hasMissingMaterials = true;
105
- continue;
106
- }
107
- if (mat.name === orig.name) {
108
- if (indexMap === undefined)
109
- indexMap = new Map();
110
- indexMap.set(k, i);
111
- maxIndex = Math.max(maxIndex, k);
112
- // console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
113
- break;
114
- }
115
- }
116
- }
117
- if (hasMissingMaterials) {
118
- this._indexMapMaxIndex = maxIndex;
119
- this._indexMap = indexMap;
120
- const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
121
- console.warn(warningMessage);
122
- if (isLocalNetwork())
123
- showBalloonWarning("Found renderer with missing materials: please check the console for details.");
124
- }
125
- // this lets us override the javascript indexer, only works in ES6 tho
126
- // but like that we can use sharedMaterials[index] and it will be assigned to the object directly
127
- return new Proxy(this, {
128
- get(target, key) {
129
- if (typeof key === "string") {
130
- const index = parseInt(key);
131
- if (!isNaN(index)) {
132
- return getMaterial(index);
133
- }
134
- }
135
- return target[key];
136
- },
137
- set(target, key, value) {
138
- if (typeof key === "string")
139
- setMaterial(value, Number.parseInt(key));
140
- // console.log(target, key, value);
141
- if (Reflect.set(target, key, value)) {
142
- if (value instanceof Material)
143
- target.changed = true;
144
- return true;
145
- }
146
- return false;
147
- }
148
- });
149
- }
150
- get length() {
151
- if (this._indexMapMaxIndex !== undefined)
152
- return this._indexMapMaxIndex + 1;
153
- return this._targets.length;
154
- }
155
- // iterator to support: for(const mat of sharedMaterials)
156
- *[Symbol.iterator]() {
157
- for (let i = 0; i < this.length; i++) {
158
- yield this.getMaterial(i);
159
- }
160
- }
161
- resolveIndex(index) {
162
- const map = this._indexMap;
163
- // if we have a index map it means that some materials were missing
164
- if (map) {
165
- if (map.has(index))
166
- return map.get(index);
167
- // return -1;
168
- }
169
- return index;
170
- }
171
- setMaterial(mat, index) {
172
- index = this.resolveIndex(index);
173
- if (index < 0 || index >= this._targets.length)
174
- return;
175
- const target = this._targets[index];
176
- if (!target || target["material"] === undefined)
177
- return;
178
- target["material"] = mat;
179
- this.changed = true;
180
- }
181
- getMaterial(index) {
182
- index = this.resolveIndex(index);
183
- if (index < 0)
184
- return null;
185
- const obj = this._targets;
186
- if (index >= obj.length)
187
- return null;
188
- const target = obj[index];
189
- if (!target)
190
- return null;
191
- return target["material"];
192
- }
193
- }
194
- export class Renderer extends Behaviour {
195
- /** Set the rendering state only of an object (makes it visible or invisible) without affecting component state or child hierarchy visibility! You can also just enable/disable the Renderer component on that object for the same effect!
196
- *
197
- * If you want to activate or deactivate a complete object you can use obj.visible as usual (it acts the same as setActive in Unity) */
198
- static setVisible(obj, visible) {
199
- setCustomVisibility(obj, visible);
200
- }
201
- receiveShadows = false;
202
- shadowCastingMode = ShadowCastingMode.Off;
203
- lightmapIndex = -1;
204
- lightmapScaleOffset = new THREE.Vector4(1, 1, 0, 0);
205
- enableInstancing = undefined;
206
- renderOrder = undefined;
207
- allowOcclusionWhenDynamic = true;
208
- probeAnchor;
209
- reflectionProbeUsage = ReflectionProbeUsage.Off;
210
- // custom shader
211
- // get materialProperties(): Array<MaterialProperties> | undefined {
212
- // return this._materialProperties;
213
- // }
214
- // set materialProperties(value: Array<MaterialProperties> | undefined) {
215
- // this._materialProperties = value;
216
- // }
217
- // private customShaderHandler: RendererCustomShader | undefined = undefined;
218
- // private _materialProperties: Array<MaterialProperties> | undefined = undefined;
219
- _lightmaps;
220
- get sharedMesh() {
221
- if (this.gameObject.type === "Mesh") {
222
- return this.gameObject;
223
- }
224
- else if (this.gameObject.type === "SkinnesMesh") {
225
- return this.gameObject;
226
- }
227
- else if (this.gameObject.type === "Group") {
228
- return this.gameObject.children[0];
229
- }
230
- return undefined;
231
- }
232
- get sharedMaterial() {
233
- return this.sharedMaterials[0];
234
- }
235
- set sharedMaterial(mat) {
236
- const cur = this.sharedMaterials[0];
237
- if (cur === mat)
238
- return;
239
- this.sharedMaterials[0] = mat;
240
- this.applyLightmapping();
241
- }
242
- /**@deprecated please use sharedMaterial */
243
- get material() {
244
- return this.sharedMaterials[0];
245
- }
246
- /**@deprecated please use sharedMaterial */
247
- set material(mat) {
248
- this.sharedMaterial = mat;
249
- }
250
- _sharedMaterials;
251
- _originalMaterials;
252
- // this is just available during deserialization
253
- set sharedMaterials(_val) {
254
- // TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
255
- if (!this._originalMaterials) {
256
- this._originalMaterials = _val;
257
- }
258
- else if (_val) {
259
- let didWarn = false;
260
- for (let i = 0; i < this._sharedMaterials.length; i++) {
261
- const mat = i < _val.length ? _val[i] : null;
262
- if (mat && mat instanceof Material) {
263
- this.sharedMaterials[i] = mat;
264
- }
265
- else {
266
- if (!didWarn) {
267
- didWarn = true;
268
- console.warn("Can not assign null as material: " + this.name, mat);
269
- }
270
- }
271
- }
272
- }
273
- }
274
- //@ts-ignore
275
- get sharedMaterials() {
276
- if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
277
- if (!this._originalMaterials)
278
- this._originalMaterials = [];
279
- this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
280
- }
281
- return this._sharedMaterials;
282
- }
283
- static get shouldSuppressInstancing() {
284
- return suppressInstancing;
285
- }
286
- _lightmapTextureOverride = undefined;
287
- get lightmap() {
288
- if (this._lightmaps?.length) {
289
- return this._lightmaps[0].lightmap;
290
- }
291
- return null;
292
- }
293
- /** set undefined to return to default lightmap */
294
- set lightmap(tex) {
295
- this._lightmapTextureOverride = tex;
296
- if (tex === undefined) {
297
- tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
298
- }
299
- if (this._lightmaps?.length) {
300
- for (const lm of this._lightmaps) {
301
- lm.lightmap = tex;
302
- }
303
- }
304
- }
305
- get hasLightmap() {
306
- const lm = this.lightmap;
307
- return lm !== null && lm !== undefined;
308
- }
309
- allowProgressiveLoading = true;
310
- registering() {
311
- if (!this.enabled) {
312
- this.setVisibility(false);
313
- }
314
- }
315
- awake() {
316
- if (debugRenderer)
317
- console.log("Renderer ", this.name, this);
318
- this.clearInstancingState();
319
- if (this.probeAnchor && debugRenderer)
320
- this.probeAnchor.add(new AxesHelper(.2));
321
- this._reflectionProbe = null;
322
- if (this.isMultiMaterialObject(this.gameObject)) {
323
- for (const child of this.gameObject.children) {
324
- this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
325
- child.layers.mask = this.gameObject.layers.mask;
326
- }
327
- if (this.renderOrder !== undefined) {
328
- // Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
329
- // or perhaps just regular child objects that have their own renderer component (?)
330
- let index = 0;
331
- for (let i = 0; i < this.gameObject.children.length; i++) {
332
- const ch = this.gameObject.children[i];
333
- // ignore nested groups or objects that have their own renderer (aka their own render order settings)
334
- if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer))
335
- continue;
336
- if (this.renderOrder.length <= index) {
337
- console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
338
- continue;
339
- }
340
- // if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
341
- ch.renderOrder = this.renderOrder[index];
342
- index += 1;
343
- }
344
- }
345
- }
346
- // TODO: custom shader with sub materials
347
- else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
348
- this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
349
- if (this.renderOrder !== undefined && this.renderOrder.length > 0)
350
- this.gameObject.renderOrder = this.renderOrder[0];
351
- }
352
- else {
353
- this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
354
- }
355
- this.applyLightmapping();
356
- if (showWireframe) {
357
- for (let i = 0; i < this.sharedMaterials.length; i++) {
358
- const mat = this.sharedMaterials[i];
359
- if (mat) {
360
- mat.wireframe = true;
361
- }
362
- }
363
- }
364
- }
365
- applyLightmapping() {
366
- if (this.lightmapIndex >= 0) {
367
- const type = this.gameObject.type;
368
- // use the override lightmap if its not undefined
369
- const tex = this._lightmapTextureOverride !== undefined
370
- ? this._lightmapTextureOverride
371
- : this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
372
- if (tex) {
373
- if (!this._lightmaps)
374
- this._lightmaps = [];
375
- if (type === "Mesh") {
376
- const mat = this.gameObject["material"];
377
- if (!mat?.isMeshBasicMaterial) {
378
- if (this._lightmaps.length <= 0) {
379
- const rm = new RendererLightmap(this.gameObject, this.context);
380
- this._lightmaps.push(rm);
381
- }
382
- const rm = this._lightmaps[0];
383
- rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
384
- }
385
- else {
386
- if (mat)
387
- console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name);
388
- }
389
- }
390
- // for multi materials we need to loop through children
391
- // and then we add a lightmap renderer component to each of them
392
- else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
393
- for (let i = 0; i < this.gameObject.children.length; i++) {
394
- const child = this.gameObject.children[i];
395
- if (!child["material"]?.isMeshBasicMaterial) {
396
- let rm = undefined;
397
- if (i >= this._lightmaps.length) {
398
- rm = new RendererLightmap(child, this.context);
399
- this._lightmaps.push(rm);
400
- }
401
- else
402
- rm = this._lightmaps[i];
403
- rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
404
- }
405
- }
406
- }
407
- }
408
- else {
409
- if (debugRenderer)
410
- console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
411
- }
412
- }
413
- }
414
- _isInstancingEnabled = false;
415
- handles = undefined;
416
- prevLayers = undefined;
417
- clearInstancingState() {
418
- this._isInstancingEnabled = false;
419
- this.handles = undefined;
420
- this.prevLayers = undefined;
421
- }
422
- setInstancingEnabled(enabled) {
423
- if (this._isInstancingEnabled === enabled)
424
- return enabled && (this.handles === undefined || this.handles != null && this.handles.length > 0);
425
- this._isInstancingEnabled = enabled;
426
- if (enabled) {
427
- if (this.handles === undefined) {
428
- this.handles = instancing.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
429
- if (this.handles) {
430
- GameObject.markAsInstancedRendered(this.gameObject, true);
431
- return true;
432
- }
433
- }
434
- else if (this.handles !== null) {
435
- for (const handler of this.handles) {
436
- handler.updateInstanceMatrix(true);
437
- handler.add();
438
- }
439
- GameObject.markAsInstancedRendered(this.gameObject, true);
440
- return true;
441
- }
442
- }
443
- else {
444
- if (this.handles) {
445
- for (const handler of this.handles) {
446
- handler.remove();
447
- }
448
- }
449
- return true;
450
- }
451
- return false;
452
- }
453
- /** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
454
- * This is a separate method to be overrideable from user code
455
- */
456
- useInstanceMatrixWorldAutoUpdate() {
457
- return true;
458
- }
459
- start() {
460
- if (this.enableInstancing && !suppressInstancing) {
461
- this.setInstancingEnabled(true);
462
- // make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
463
- // in the first frame we want the updated matrix then to be applied immediately to the instancing
464
- InstancingUtil.markDirty(this.gameObject);
465
- }
466
- this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
467
- if (this.isMultiMaterialObject(this.gameObject)) {
468
- for (let i = 0; i < this.gameObject.children.length; i++) {
469
- const ch = this.gameObject.children[i];
470
- ch.frustumCulled = this.allowOcclusionWhenDynamic;
471
- }
472
- }
473
- }
474
- onEnable() {
475
- this.setVisibility(true);
476
- if (this._isInstancingEnabled) {
477
- this.setInstancingEnabled(true);
478
- }
479
- else if (this.enabled) {
480
- // this.gameObject.visible = true;
481
- this.applyStencil();
482
- }
483
- this.updateReflectionProbe();
484
- }
485
- onDisable() {
486
- this.setVisibility(false);
487
- if (this.handles && this.handles.length > 0) {
488
- this.setInstancingEnabled(false);
489
- }
490
- }
491
- onDestroy() {
492
- this.handles = null;
493
- if (this.isMultiMaterialObject(this.gameObject)) {
494
- for (const child of this.gameObject.children) {
495
- this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
496
- }
497
- }
498
- else {
499
- this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
500
- }
501
- }
502
- applyStencil() {
503
- NEEDLE_render_objects.applyStencil(this);
504
- }
505
- onBeforeRender() {
506
- if (!this.gameObject) {
507
- return;
508
- }
509
- if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
510
- for (const ch of this.gameObject.children) {
511
- this.applySettings(ch);
512
- }
513
- }
514
- else {
515
- this.applySettings(this.gameObject);
516
- }
517
- if (this.sharedMaterials.changed) {
518
- this.sharedMaterials.changed = false;
519
- this.applyLightmapping();
520
- }
521
- if (this.handles?.length) {
522
- // if (this.name === "Darbouka")
523
- // console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
524
- const needsUpdate = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true; // || this.gameObject.matrixWorldNeedsUpdate;
525
- if (needsUpdate) {
526
- if (debugInstancing)
527
- console.log("UPDATE INSTANCED MATRICES", this.context.time.frame);
528
- this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
529
- const remove = false; // Math.random() < .01;
530
- for (let i = this.handles.length - 1; i >= 0; i--) {
531
- const h = this.handles[i];
532
- if (remove) {
533
- h.remove();
534
- this.handles.splice(i, 1);
535
- }
536
- else
537
- h.updateInstanceMatrix();
538
- }
539
- this.gameObject.matrixWorldNeedsUpdate = false;
540
- }
541
- }
542
- if (this.handles && this.handles.length <= 0) {
543
- GameObject.markAsInstancedRendered(this.gameObject, false);
544
- }
545
- if (this._isInstancingEnabled && this.handles) {
546
- for (let i = 0; i < this.handles.length; i++) {
547
- const handle = this.handles[i];
548
- if (!this.prevLayers)
549
- this.prevLayers = [];
550
- const layer = handle.object.layers.mask;
551
- if (i >= this.prevLayers.length)
552
- this.prevLayers.push(layer);
553
- else
554
- this.prevLayers[i] = layer;
555
- handle.object.layers.disableAll();
556
- }
557
- }
558
- for (const mat of this.sharedMaterials) {
559
- if (mat)
560
- this.loadProgressiveTextures(mat);
561
- }
562
- if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
563
- this._reflectionProbe.onSet(this);
564
- }
565
- }
566
- onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
567
- if (material.envMapIntensity !== undefined) {
568
- const factor = this.hasLightmap ? Math.PI : 1;
569
- const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
570
- material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
571
- }
572
- // if (this._reflectionProbe?.texture) {
573
- // material.envMap = this._reflectionProbe.texture;
574
- // // this.context.renderer.prop
575
- // // console.log(material.name);
576
- // // this.context.renderer.properties.get(material);
577
- // // this.context.renderer.properties.update(material, "environment", this._reflectionProbe.texture);
578
- // }
579
- // _scene.environment = null;
580
- // else _scene.environment = Renderer.envmap;
581
- // if (!material.envmap)
582
- // material.envMap = Renderer.envmap;
583
- // material.needsUpdate = true;
584
- // if (!camera) {
585
- // let isXRCamera = false;
586
- // if (this.context.isInXR) {
587
- // // @ts-ignore
588
- // const arr = this.context.renderer.xr.getCamera() as ArrayCamera;
589
- // if (arr.cameras?.length > 0) {
590
- // camera = arr;
591
- // isXRCamera = true;
592
- // }
593
- // }
594
- // }
595
- // if (this.customShaderHandler) {
596
- // this.customShaderHandler.onBeforeRender(renderer, scene, camera, geometry, material, group);
597
- // }
598
- // else if (this.rawShaderHandler) {
599
- // for (const h of this.rawShaderHandler) {
600
- // h.onBeforeRender(this.gameObject, camera);
601
- // }
602
- // }
603
- if (this._lightmaps) {
604
- for (const lm of this._lightmaps) {
605
- lm.updateLightmapUniforms(material);
606
- }
607
- }
608
- };
609
- onAfterRender() {
610
- if (this._isInstancingEnabled && this.handles && this.prevLayers && this.prevLayers.length >= this.handles.length) {
611
- for (let i = 0; i < this.handles.length; i++) {
612
- const handle = this.handles[i];
613
- handle.object.layers.mask = this.prevLayers[i];
614
- }
615
- }
616
- if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
617
- this._reflectionProbe.onUnset(this);
618
- }
619
- }
620
- loadProgressiveTextures(material) {
621
- // progressive load before rendering so we only load textures for visible materials
622
- if (!suppressProgressiveLoading && material) {
623
- if (material["_didRequestTextureLOD"] === undefined && this.allowProgressiveLoading) {
624
- material["_didRequestTextureLOD"] = 0;
625
- if (debugProgressiveLoading) {
626
- console.log("Load material LOD", material.name);
627
- }
628
- return NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
629
- }
630
- }
631
- return Promise.resolve(true);
632
- }
633
- applySettings(go) {
634
- go.receiveShadow = this.receiveShadows;
635
- if (this.shadowCastingMode == ShadowCastingMode.On) {
636
- go.castShadow = true;
637
- }
638
- else
639
- go.castShadow = false;
640
- }
641
- _reflectionProbe = null;
642
- updateReflectionProbe() {
643
- // handle reflection probe
644
- this._reflectionProbe = null;
645
- if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
646
- if (!this.probeAnchor)
647
- return;
648
- // update the reflection probe right before rendering
649
- // if we do it immediately the reflection probe might not be enabled yet
650
- // (since this method is called from onEnable)
651
- this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
652
- }
653
- }
654
- *_updateReflectionProbe() {
655
- const obj = this.probeAnchor || this.gameObject;
656
- const isAnchor = this.probeAnchor ? true : false;
657
- this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
658
- }
659
- setVisibility(visible) {
660
- if (!this.isMultiMaterialObject(this.gameObject)) {
661
- setCustomVisibility(this.gameObject, visible);
662
- }
663
- else {
664
- for (const ch of this.gameObject.children) {
665
- if (this.isMeshOrSkinnedMesh(ch)) {
666
- setCustomVisibility(ch, visible);
667
- }
668
- }
669
- }
670
- }
671
- isMultiMaterialObject(obj) {
672
- return obj.type === "Group";
673
- }
674
- isMeshOrSkinnedMesh(obj) {
675
- return obj.type === "Mesh" || obj.type === "SkinnedMesh";
676
- }
677
- }
678
- __decorate([
679
- serializable()
680
- ], Renderer.prototype, "receiveShadows", void 0);
681
- __decorate([
682
- serializable()
683
- ], Renderer.prototype, "shadowCastingMode", void 0);
684
- __decorate([
685
- serializable()
686
- ], Renderer.prototype, "lightmapIndex", void 0);
687
- __decorate([
688
- serializable(Vector4)
689
- ], Renderer.prototype, "lightmapScaleOffset", void 0);
690
- __decorate([
691
- serializable()
692
- ], Renderer.prototype, "enableInstancing", void 0);
693
- __decorate([
694
- serializable()
695
- ], Renderer.prototype, "renderOrder", void 0);
696
- __decorate([
697
- serializable()
698
- ], Renderer.prototype, "allowOcclusionWhenDynamic", void 0);
699
- __decorate([
700
- serializable(Object3D)
701
- ], Renderer.prototype, "probeAnchor", void 0);
702
- __decorate([
703
- serializable()
704
- ], Renderer.prototype, "reflectionProbeUsage", void 0);
705
- export class MeshRenderer extends Renderer {
706
- }
707
- export class SkinnedMeshRenderer extends MeshRenderer {
708
- awake() {
709
- super.awake();
710
- // disable skinned mesh occlusion because of https://github.com/mrdoob/three.js/issues/14499
711
- this.allowOcclusionWhenDynamic = false;
712
- // If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
713
- this.gameObject.parent?.updateWorldMatrix(false, true);
714
- }
715
- onBeforeRender() {
716
- super.onBeforeRender();
717
- if (debugskinnedmesh && this.gameObject instanceof SkinnedMesh && this.gameObject.boundingSphere) {
718
- const tempCenter = getTempVector(this.gameObject.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
719
- Gizmos.DrawWireSphere(tempCenter, this.gameObject.boundingSphere.radius, "red");
720
- }
721
- }
722
- }
723
- export var ShadowCastingMode;
724
- (function (ShadowCastingMode) {
725
- /// <summary>
726
- /// <para>No shadows are cast from this object.</para>
727
- /// </summary>
728
- ShadowCastingMode[ShadowCastingMode["Off"] = 0] = "Off";
729
- /// <summary>
730
- /// <para>Shadows are cast from this object.</para>
731
- /// </summary>
732
- ShadowCastingMode[ShadowCastingMode["On"] = 1] = "On";
733
- /// <summary>
734
- /// <para>Shadows are cast from this object, treating it as two-sided.</para>
735
- /// </summary>
736
- ShadowCastingMode[ShadowCastingMode["TwoSided"] = 2] = "TwoSided";
737
- /// <summary>
738
- /// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
739
- /// </summary>
740
- ShadowCastingMode[ShadowCastingMode["ShadowsOnly"] = 3] = "ShadowsOnly";
741
- })(ShadowCastingMode || (ShadowCastingMode = {}));
742
- ;
743
- class InstancingHandler {
744
- objs = [];
745
- setup(renderer, obj, context, handlesArray, args, level = 0) {
746
- // 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
747
- renderer.applySettings(obj);
748
- const res = this.tryCreateOrAddInstance(obj, context, args);
749
- if (res) {
750
- renderer.loadProgressiveTextures(res.instancer.material);
751
- if (handlesArray === null)
752
- handlesArray = [];
753
- handlesArray.push(res);
754
- }
755
- else if (level <= 0 && obj.type !== "Mesh") {
756
- const nextLevel = level + 1;
757
- for (const ch of obj.children) {
758
- handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
759
- }
760
- }
761
- if (level === 0) {
762
- // For multi material objects we only want to track the root object's matrix
763
- if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
764
- this.autoUpdateInstanceMatrix(obj);
765
- }
766
- }
767
- return handlesArray;
768
- }
769
- tryCreateOrAddInstance(obj, context, args) {
770
- if (obj.type === "Mesh") {
771
- const index = args.foundMeshes;
772
- args.foundMeshes += 1;
773
- if (!args.rend.enableInstancing)
774
- return null;
775
- if (index >= args.rend.enableInstancing.length) {
776
- // console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
777
- return null;
778
- }
779
- if (!args.rend.enableInstancing[index]) {
780
- // instancing is disabled
781
- // console.log("Instancing is disabled", obj);
782
- return null;
783
- }
784
- // instancing is enabled:
785
- const mesh = obj;
786
- const geo = mesh.geometry;
787
- const mat = mesh.material;
788
- for (const i of this.objs) {
789
- if (i.isFull())
790
- continue;
791
- if (i.geo === geo && i.material === mat) {
792
- const handle = i.addInstance(mesh);
793
- return handle;
794
- }
795
- }
796
- // console.log("Add new instance mesh renderer", obj);
797
- const i = new InstancedMeshRenderer(obj.name, geo, mat, 200, context);
798
- this.objs.push(i);
799
- const handle = i.addInstance(mesh);
800
- return handle;
801
- }
802
- return null;
803
- }
804
- autoUpdateInstanceMatrix(obj) {
805
- const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
806
- const previousMatrix = obj.matrixWorld.clone();
807
- const matrixChangeWrapper = (a, b) => {
808
- const newMatrixWorld = original(a, b);
809
- if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
810
- previousMatrix.copy(newMatrixWorld);
811
- obj[NEED_UPDATE_INSTANCE_KEY] = true;
812
- }
813
- return newMatrixWorld;
814
- };
815
- obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
816
- // wrap matrixWorldNeedsUpdate
817
- // let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
818
- // Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
819
- // get: () => {
820
- // return originalMatrixWorldNeedsUpdate;
821
- // },
822
- // set: (value: boolean) => {
823
- // if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
824
- // originalMatrixWorldNeedsUpdate = value;
825
- // }
826
- // });
827
- }
828
- }
829
- const instancing = new InstancingHandler();
830
- class InstanceHandle {
831
- get name() {
832
- return this.object.name;
833
- }
834
- instanceIndex = -1;
835
- object;
836
- instancer;
837
- constructor(instanceIndex, originalObject, instancer) {
838
- this.instanceIndex = instanceIndex;
839
- this.object = originalObject;
840
- this.instancer = instancer;
841
- originalObject[$instancingRenderer] = instancer;
842
- GameObject.markAsInstancedRendered(originalObject, true);
843
- }
844
- updateInstanceMatrix(updateChildren = false) {
845
- if (this.instanceIndex < 0)
846
- return;
847
- this.object.updateWorldMatrix(true, updateChildren);
848
- this.instancer.updateInstance(this.object.matrixWorld, this.instanceIndex);
849
- }
850
- setMatrix(matrix) {
851
- if (this.instanceIndex < 0)
852
- return;
853
- this.instancer.updateInstance(matrix, this.instanceIndex);
854
- }
855
- add() {
856
- if (this.instanceIndex >= 0)
857
- return;
858
- this.instancer.add(this);
859
- }
860
- remove() {
861
- if (this.instanceIndex < 0)
862
- return;
863
- this.instancer.remove(this);
864
- }
865
- }
866
- class InstancedMeshRenderer {
867
- /** The three instanced mesh
868
- * @link https://threejs.org/docs/#api/en/objects/InstancedMesh
869
- */
870
- get mesh() {
871
- return this.inst;
872
- }
873
- get visible() {
874
- return this.inst.visible;
875
- }
876
- set visible(val) {
877
- this.inst.visible = val;
878
- }
879
- get castShadow() {
880
- return this.inst.castShadow;
881
- }
882
- set castShadow(val) {
883
- this.inst.castShadow = val;
884
- }
885
- set receiveShadow(val) {
886
- this.inst.receiveShadow = val;
887
- }
888
- updateBounds(box = true, sphere = true) {
889
- this._needUpdateBounds = false;
890
- if (box)
891
- this.inst.computeBoundingBox();
892
- if (sphere)
893
- this.inst.computeBoundingSphere();
894
- }
895
- name = "";
896
- geo;
897
- material;
898
- get currentCount() { return this.inst.count; }
899
- context;
900
- inst;
901
- handles = [];
902
- maxCount;
903
- static nullMatrix = new THREE.Matrix4();
904
- isFull() {
905
- return this.currentCount >= this.maxCount;
906
- }
907
- _needUpdateBounds = false;
908
- constructor(name, geo, material, count, context) {
909
- this.name = name;
910
- this.geo = geo;
911
- this.material = material;
912
- this.context = context;
913
- this.maxCount = count;
914
- if (debugInstancing) {
915
- material = new THREE.MeshBasicMaterial({ color: this.randomColor() });
916
- }
917
- this.inst = new THREE.InstancedMesh(geo, material, count);
918
- this.inst[$instancingAutoUpdateBounds] = true;
919
- this.inst.count = 0;
920
- this.inst.layers.set(2);
921
- this.inst.visible = true;
922
- // Not handled by RawShaderMaterial, so we need to set the define explicitly.
923
- // Edge case: theoretically some users of the material could use it in an
924
- // instanced fashion, and some others not. In that case, the material would not
925
- // be able to be shared between the two use cases. We could probably add a
926
- // onBeforeRender call for the InstancedMesh and set the define there.
927
- // Same would apply if we support skinning -
928
- // there we would have to split instanced batches so that the ones using skinning
929
- // are all in the same batch.
930
- if (material instanceof THREE.RawShaderMaterial) {
931
- material.defines["USE_INSTANCING"] = true;
932
- material.needsUpdate = true;
933
- }
934
- // this.inst.castShadow = true;
935
- // this.inst.receiveShadow = true;
936
- this.context.scene.add(this.inst);
937
- context.pre_render_callbacks.push(this.onBeforeRender);
938
- // console.log(this.inst);
939
- // this.context.pre_render_callbacks.push(this.onPreRender.bind(this));
940
- // setInterval(() => {
941
- // this.inst.visible = !this.inst.visible;
942
- // }, 500);
943
- }
944
- onBeforeRender = () => {
945
- if (this._needUpdateBounds && this.inst[$instancingAutoUpdateBounds] === true) {
946
- if (debugInstancing)
947
- console.log("Update instancing bounds", this.name, this.inst.matrixWorldNeedsUpdate);
948
- this.updateBounds();
949
- }
950
- };
951
- randomColor() {
952
- return new THREE.Color(Math.random(), Math.random(), Math.random());
953
- }
954
- addInstance(obj) {
955
- if (this.currentCount >= this.maxCount) {
956
- console.error("TOO MANY INSTANCES - resize is not yet implemented!", this.inst.count); // todo: make it resize
957
- return null;
958
- }
959
- const handle = new InstanceHandle(-1, obj, this);
960
- if (obj.castShadow === true && this.inst.castShadow === false) {
961
- this.inst.castShadow = true;
962
- }
963
- if (obj.receiveShadow === true && this.inst.receiveShadow === false) {
964
- this.inst.receiveShadow = true;
965
- }
966
- this.add(handle);
967
- return handle;
968
- }
969
- add(handle) {
970
- if (handle.instanceIndex < 0) {
971
- handle.instanceIndex = this.currentCount;
972
- // console.log(handle.instanceIndex, this.currentCount);
973
- if (handle.instanceIndex >= this.handles.length)
974
- this.handles.push(handle);
975
- else
976
- this.handles[handle.instanceIndex] = handle;
977
- }
978
- // console.log("Handle instance");
979
- handle.object.updateWorldMatrix(true, true);
980
- this.inst.setMatrixAt(handle.instanceIndex, handle.object.matrixWorld);
981
- this.inst.instanceMatrix.needsUpdate = true;
982
- this.inst.count += 1;
983
- this._needUpdateBounds = true;
984
- if (this.inst.count > 0)
985
- this.inst.visible = true;
986
- // console.log("Added", this.name, this.inst.count, this.handles);
987
- }
988
- remove(handle) {
989
- if (!handle)
990
- return;
991
- if (handle.instanceIndex < 0 || handle.instanceIndex >= this.handles.length || this.inst.count <= 0) {
992
- return;
993
- }
994
- if (this.handles[handle.instanceIndex] !== handle) {
995
- console.error("instance handle is not part of renderer, was it removed before?", handle.instanceIndex, this.name);
996
- const index = this.handles.indexOf(handle);
997
- if (index < 0)
998
- return;
999
- handle.instanceIndex = index;
1000
- }
1001
- this.handles[handle.instanceIndex] = null;
1002
- this.inst.setMatrixAt(handle.instanceIndex, InstancedMeshRenderer.nullMatrix);
1003
- const removedLastElement = handle.instanceIndex >= this.currentCount - 1;
1004
- // console.log(removedLastElement, this.currentCount, handle.instanceIndex, this.handles);
1005
- if (!removedLastElement && this.currentCount > 0) {
1006
- const lastElement = this.handles[this.currentCount - 1];
1007
- if (lastElement) {
1008
- lastElement.instanceIndex = handle.instanceIndex;
1009
- lastElement.updateInstanceMatrix();
1010
- this.handles[handle.instanceIndex] = lastElement;
1011
- this.handles[this.currentCount - 1] = null;
1012
- // this.inst.setMatrixAt(handle.instanceIndex, lastElement.object.matrixWorld);
1013
- // this.inst.setMatrixAt(this.currentCount - 1, InstancedMeshRenderer.nullMatrix);
1014
- }
1015
- }
1016
- if (this.inst.count > 0)
1017
- this.inst.count -= 1;
1018
- handle.instanceIndex = -1;
1019
- this._needUpdateBounds = true;
1020
- if (this.inst.count <= 0)
1021
- this.inst.visible = false;
1022
- this.inst.instanceMatrix.needsUpdate = true;
1023
- }
1024
- updateInstance(mat, index) {
1025
- this.inst.setMatrixAt(index, mat);
1026
- this.inst.instanceMatrix.needsUpdate = true;
1027
- this._needUpdateBounds = true;
1028
- }
1029
- }
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Behaviour, GameObject } from "./Component.js";
8
+ import * as THREE from "three";
9
+ // import { RendererCustomShader } from "./RendererCustomShader.js";
10
+ import { RendererLightmap } from "./RendererLightmap.js";
11
+ import { FrameEvent } from "../engine/engine_setup.js";
12
+ import { getParam } from "../engine/engine_utils.js";
13
+ import { serializable } from "../engine/engine_serialization_decorator.js";
14
+ import { AxesHelper, Material, Object3D, SkinnedMesh, Vector4 } from "three";
15
+ import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects.js";
16
+ import { NEEDLE_progressive } from "../engine/extensions/NEEDLE_progressive.js";
17
+ import { $instancingAutoUpdateBounds, $instancingRenderer, InstancingUtil, NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing.js";
18
+ import { ReflectionProbe } from "./ReflectionProbe.js";
19
+ import { setCustomVisibility } from "../engine/js-extensions/Layers.js";
20
+ import { isLocalNetwork } from "../engine/engine_networking_utils.js";
21
+ import { showBalloonWarning } from "../engine/debug/index.js";
22
+ import { Gizmos } from "../engine/engine_gizmos.js";
23
+ import { getTempVector } from "../engine/engine_three_utils.js";
24
+ // for staying compatible with old code
25
+ export { InstancingUtil } from "../engine/engine_instancing.js";
26
+ const debugRenderer = getParam("debugrenderer");
27
+ const debugskinnedmesh = getParam("debugskinnedmesh");
28
+ const suppressInstancing = getParam("noInstancing");
29
+ const debugInstancing = getParam("debuginstancing");
30
+ const debugProgressiveLoading = getParam("debugprogressive");
31
+ const suppressProgressiveLoading = getParam("noprogressive");
32
+ const showWireframe = getParam("wireframe");
33
+ export var ReflectionProbeUsage;
34
+ (function (ReflectionProbeUsage) {
35
+ ReflectionProbeUsage[ReflectionProbeUsage["Off"] = 0] = "Off";
36
+ ReflectionProbeUsage[ReflectionProbeUsage["BlendProbes"] = 1] = "BlendProbes";
37
+ ReflectionProbeUsage[ReflectionProbeUsage["BlendProbesAndSkybox"] = 2] = "BlendProbesAndSkybox";
38
+ ReflectionProbeUsage[ReflectionProbeUsage["Simple"] = 3] = "Simple";
39
+ })(ReflectionProbeUsage || (ReflectionProbeUsage = {}));
40
+ export class FieldWithDefault {
41
+ path = null;
42
+ asset = null;
43
+ default;
44
+ }
45
+ export var RenderState;
46
+ (function (RenderState) {
47
+ RenderState[RenderState["Both"] = 0] = "Both";
48
+ RenderState[RenderState["Back"] = 1] = "Back";
49
+ RenderState[RenderState["Front"] = 2] = "Front";
50
+ })(RenderState || (RenderState = {}));
51
+ // support sharedMaterials[index] assigning materials directly to the objects
52
+ class SharedMaterialArray {
53
+ _renderer;
54
+ _targets = [];
55
+ _indexMapMaxIndex;
56
+ _indexMap;
57
+ _changed = false;
58
+ get changed() {
59
+ return this._changed;
60
+ }
61
+ set changed(value) {
62
+ if (value === true) {
63
+ if (debugRenderer)
64
+ console.warn("SharedMaterials have changed: " + this._renderer.name, this);
65
+ }
66
+ this._changed = value;
67
+ }
68
+ is(renderer) {
69
+ return this._renderer === renderer;
70
+ }
71
+ constructor(renderer, originalMaterials) {
72
+ this._renderer = renderer;
73
+ const setMaterial = this.setMaterial.bind(this);
74
+ const getMaterial = this.getMaterial.bind(this);
75
+ const go = renderer.gameObject;
76
+ this._targets = [];
77
+ if (go) {
78
+ switch (go.type) {
79
+ case "Group":
80
+ this._targets = [...go.children];
81
+ break;
82
+ case "SkinnedMesh":
83
+ case "Mesh":
84
+ this._targets.push(go);
85
+ break;
86
+ }
87
+ }
88
+ // this is useful to have an index map when e.g. materials are trying to be assigned by index
89
+ let hasMissingMaterials = false;
90
+ let indexMap = undefined;
91
+ let maxIndex = 0;
92
+ for (let i = 0; i < this._targets.length; i++) {
93
+ const target = this._targets[i];
94
+ if (!target)
95
+ continue;
96
+ const mat = target.material;
97
+ if (!mat)
98
+ continue;
99
+ // set the shadow side to the same as the side of the material, three flips this for some reason
100
+ mat.shadowSide = mat.side;
101
+ for (let k = 0; k < originalMaterials.length; k++) {
102
+ const orig = originalMaterials[k];
103
+ if (!orig) {
104
+ hasMissingMaterials = true;
105
+ continue;
106
+ }
107
+ if (mat.name === orig.name) {
108
+ if (indexMap === undefined)
109
+ indexMap = new Map();
110
+ indexMap.set(k, i);
111
+ maxIndex = Math.max(maxIndex, k);
112
+ // console.log(`Material ${mat.name} at ${k} was found at index ${i} in renderer ${renderer.name}.`)
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ if (hasMissingMaterials) {
118
+ this._indexMapMaxIndex = maxIndex;
119
+ this._indexMap = indexMap;
120
+ const warningMessage = `Renderer ${renderer.name} was initialized with missing materials - this may lead to unexpected behaviour when trying to access sharedMaterials by index.`;
121
+ console.warn(warningMessage);
122
+ if (isLocalNetwork())
123
+ showBalloonWarning("Found renderer with missing materials: please check the console for details.");
124
+ }
125
+ // this lets us override the javascript indexer, only works in ES6 tho
126
+ // but like that we can use sharedMaterials[index] and it will be assigned to the object directly
127
+ return new Proxy(this, {
128
+ get(target, key) {
129
+ if (typeof key === "string") {
130
+ const index = parseInt(key);
131
+ if (!isNaN(index)) {
132
+ return getMaterial(index);
133
+ }
134
+ }
135
+ return target[key];
136
+ },
137
+ set(target, key, value) {
138
+ if (typeof key === "string")
139
+ setMaterial(value, Number.parseInt(key));
140
+ // console.log(target, key, value);
141
+ if (Reflect.set(target, key, value)) {
142
+ if (value instanceof Material)
143
+ target.changed = true;
144
+ return true;
145
+ }
146
+ return false;
147
+ }
148
+ });
149
+ }
150
+ get length() {
151
+ if (this._indexMapMaxIndex !== undefined)
152
+ return this._indexMapMaxIndex + 1;
153
+ return this._targets.length;
154
+ }
155
+ // iterator to support: for(const mat of sharedMaterials)
156
+ *[Symbol.iterator]() {
157
+ for (let i = 0; i < this.length; i++) {
158
+ yield this.getMaterial(i);
159
+ }
160
+ }
161
+ resolveIndex(index) {
162
+ const map = this._indexMap;
163
+ // if we have a index map it means that some materials were missing
164
+ if (map) {
165
+ if (map.has(index))
166
+ return map.get(index);
167
+ // return -1;
168
+ }
169
+ return index;
170
+ }
171
+ setMaterial(mat, index) {
172
+ index = this.resolveIndex(index);
173
+ if (index < 0 || index >= this._targets.length)
174
+ return;
175
+ const target = this._targets[index];
176
+ if (!target || target["material"] === undefined)
177
+ return;
178
+ target["material"] = mat;
179
+ this.changed = true;
180
+ }
181
+ getMaterial(index) {
182
+ index = this.resolveIndex(index);
183
+ if (index < 0)
184
+ return null;
185
+ const obj = this._targets;
186
+ if (index >= obj.length)
187
+ return null;
188
+ const target = obj[index];
189
+ if (!target)
190
+ return null;
191
+ return target["material"];
192
+ }
193
+ }
194
+ export class Renderer extends Behaviour {
195
+ /** Set the rendering state only of an object (makes it visible or invisible) without affecting component state or child hierarchy visibility! You can also just enable/disable the Renderer component on that object for the same effect!
196
+ *
197
+ * If you want to activate or deactivate a complete object you can use obj.visible as usual (it acts the same as setActive in Unity) */
198
+ static setVisible(obj, visible) {
199
+ setCustomVisibility(obj, visible);
200
+ }
201
+ receiveShadows = false;
202
+ shadowCastingMode = ShadowCastingMode.Off;
203
+ lightmapIndex = -1;
204
+ lightmapScaleOffset = new THREE.Vector4(1, 1, 0, 0);
205
+ enableInstancing = undefined;
206
+ renderOrder = undefined;
207
+ allowOcclusionWhenDynamic = true;
208
+ probeAnchor;
209
+ reflectionProbeUsage = ReflectionProbeUsage.Off;
210
+ // custom shader
211
+ // get materialProperties(): Array<MaterialProperties> | undefined {
212
+ // return this._materialProperties;
213
+ // }
214
+ // set materialProperties(value: Array<MaterialProperties> | undefined) {
215
+ // this._materialProperties = value;
216
+ // }
217
+ // private customShaderHandler: RendererCustomShader | undefined = undefined;
218
+ // private _materialProperties: Array<MaterialProperties> | undefined = undefined;
219
+ _lightmaps;
220
+ get sharedMesh() {
221
+ if (this.gameObject.type === "Mesh") {
222
+ return this.gameObject;
223
+ }
224
+ else if (this.gameObject.type === "SkinnesMesh") {
225
+ return this.gameObject;
226
+ }
227
+ else if (this.gameObject.type === "Group") {
228
+ return this.gameObject.children[0];
229
+ }
230
+ return undefined;
231
+ }
232
+ get sharedMaterial() {
233
+ return this.sharedMaterials[0];
234
+ }
235
+ set sharedMaterial(mat) {
236
+ const cur = this.sharedMaterials[0];
237
+ if (cur === mat)
238
+ return;
239
+ this.sharedMaterials[0] = mat;
240
+ this.applyLightmapping();
241
+ }
242
+ /**@deprecated please use sharedMaterial */
243
+ get material() {
244
+ return this.sharedMaterials[0];
245
+ }
246
+ /**@deprecated please use sharedMaterial */
247
+ set material(mat) {
248
+ this.sharedMaterial = mat;
249
+ }
250
+ _sharedMaterials;
251
+ _originalMaterials;
252
+ // this is just available during deserialization
253
+ set sharedMaterials(_val) {
254
+ // TODO: elements in the array might be missing at the moment which leads to problems if an index is serialized
255
+ if (!this._originalMaterials) {
256
+ this._originalMaterials = _val;
257
+ }
258
+ else if (_val) {
259
+ let didWarn = false;
260
+ for (let i = 0; i < this._sharedMaterials.length; i++) {
261
+ const mat = i < _val.length ? _val[i] : null;
262
+ if (mat && mat instanceof Material) {
263
+ this.sharedMaterials[i] = mat;
264
+ }
265
+ else {
266
+ if (!didWarn) {
267
+ didWarn = true;
268
+ console.warn("Can not assign null as material: " + this.name, mat);
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
274
+ //@ts-ignore
275
+ get sharedMaterials() {
276
+ if (!this._sharedMaterials || !this._sharedMaterials.is(this)) {
277
+ if (!this._originalMaterials)
278
+ this._originalMaterials = [];
279
+ this._sharedMaterials = new SharedMaterialArray(this, this._originalMaterials);
280
+ }
281
+ return this._sharedMaterials;
282
+ }
283
+ static get shouldSuppressInstancing() {
284
+ return suppressInstancing;
285
+ }
286
+ _lightmapTextureOverride = undefined;
287
+ get lightmap() {
288
+ if (this._lightmaps?.length) {
289
+ return this._lightmaps[0].lightmap;
290
+ }
291
+ return null;
292
+ }
293
+ /** set undefined to return to default lightmap */
294
+ set lightmap(tex) {
295
+ this._lightmapTextureOverride = tex;
296
+ if (tex === undefined) {
297
+ tex = this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
298
+ }
299
+ if (this._lightmaps?.length) {
300
+ for (const lm of this._lightmaps) {
301
+ lm.lightmap = tex;
302
+ }
303
+ }
304
+ }
305
+ get hasLightmap() {
306
+ const lm = this.lightmap;
307
+ return lm !== null && lm !== undefined;
308
+ }
309
+ allowProgressiveLoading = true;
310
+ registering() {
311
+ if (!this.enabled) {
312
+ this.setVisibility(false);
313
+ }
314
+ }
315
+ awake() {
316
+ if (debugRenderer)
317
+ console.log("Renderer ", this.name, this);
318
+ this.clearInstancingState();
319
+ if (this.probeAnchor && debugRenderer)
320
+ this.probeAnchor.add(new AxesHelper(.2));
321
+ this._reflectionProbe = null;
322
+ if (this.isMultiMaterialObject(this.gameObject)) {
323
+ for (const child of this.gameObject.children) {
324
+ this.context.addBeforeRenderListener(child, this.onBeforeRenderThree);
325
+ child.layers.mask = this.gameObject.layers.mask;
326
+ }
327
+ if (this.renderOrder !== undefined) {
328
+ // Objects can have nested renderers (e.g. contain 2 meshes and then again another group)
329
+ // or perhaps just regular child objects that have their own renderer component (?)
330
+ let index = 0;
331
+ for (let i = 0; i < this.gameObject.children.length; i++) {
332
+ const ch = this.gameObject.children[i];
333
+ // ignore nested groups or objects that have their own renderer (aka their own render order settings)
334
+ if (!this.isMeshOrSkinnedMesh(ch) || GameObject.getComponent(ch, Renderer))
335
+ continue;
336
+ if (this.renderOrder.length <= index) {
337
+ console.warn("Incorrect renderOrder element count", this, this.renderOrder.length + " but expected " + this.gameObject.children.length, "Index: " + index, "ChildElement:", ch);
338
+ continue;
339
+ }
340
+ // if(debugRenderer) console.log("Setting render order", ch, this.renderOrder[index])
341
+ ch.renderOrder = this.renderOrder[index];
342
+ index += 1;
343
+ }
344
+ }
345
+ }
346
+ // TODO: custom shader with sub materials
347
+ else if (this.isMeshOrSkinnedMesh(this.gameObject)) {
348
+ this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
349
+ if (this.renderOrder !== undefined && this.renderOrder.length > 0)
350
+ this.gameObject.renderOrder = this.renderOrder[0];
351
+ }
352
+ else {
353
+ this.context.addBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
354
+ }
355
+ this.applyLightmapping();
356
+ if (showWireframe) {
357
+ for (let i = 0; i < this.sharedMaterials.length; i++) {
358
+ const mat = this.sharedMaterials[i];
359
+ if (mat) {
360
+ mat.wireframe = true;
361
+ }
362
+ }
363
+ }
364
+ }
365
+ applyLightmapping() {
366
+ if (this.lightmapIndex >= 0) {
367
+ const type = this.gameObject.type;
368
+ // use the override lightmap if its not undefined
369
+ const tex = this._lightmapTextureOverride !== undefined
370
+ ? this._lightmapTextureOverride
371
+ : this.context.lightmaps.tryGetLightmap(this.sourceId, this.lightmapIndex);
372
+ if (tex) {
373
+ if (!this._lightmaps)
374
+ this._lightmaps = [];
375
+ if (type === "Mesh") {
376
+ const mat = this.gameObject["material"];
377
+ if (!mat?.isMeshBasicMaterial) {
378
+ if (this._lightmaps.length <= 0) {
379
+ const rm = new RendererLightmap(this.gameObject, this.context);
380
+ this._lightmaps.push(rm);
381
+ }
382
+ const rm = this._lightmaps[0];
383
+ rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
384
+ }
385
+ else {
386
+ if (mat)
387
+ console.warn("Lightmapping is not supported on MeshBasicMaterial", mat.name);
388
+ }
389
+ }
390
+ // for multi materials we need to loop through children
391
+ // and then we add a lightmap renderer component to each of them
392
+ else if (this.isMultiMaterialObject(this.gameObject) && this.sharedMaterials.length > 0) {
393
+ for (let i = 0; i < this.gameObject.children.length; i++) {
394
+ const child = this.gameObject.children[i];
395
+ if (!child["material"]?.isMeshBasicMaterial) {
396
+ let rm = undefined;
397
+ if (i >= this._lightmaps.length) {
398
+ rm = new RendererLightmap(child, this.context);
399
+ this._lightmaps.push(rm);
400
+ }
401
+ else
402
+ rm = this._lightmaps[i];
403
+ rm.init(this.lightmapIndex, this.lightmapScaleOffset, tex);
404
+ }
405
+ }
406
+ }
407
+ }
408
+ else {
409
+ if (debugRenderer)
410
+ console.warn("Lightmap not found", this.sourceId, this.lightmapIndex);
411
+ }
412
+ }
413
+ }
414
+ _isInstancingEnabled = false;
415
+ handles = undefined;
416
+ prevLayers = undefined;
417
+ clearInstancingState() {
418
+ this._isInstancingEnabled = false;
419
+ this.handles = undefined;
420
+ this.prevLayers = undefined;
421
+ }
422
+ setInstancingEnabled(enabled) {
423
+ if (this._isInstancingEnabled === enabled)
424
+ return enabled && (this.handles === undefined || this.handles != null && this.handles.length > 0);
425
+ this._isInstancingEnabled = enabled;
426
+ if (enabled) {
427
+ if (this.handles === undefined) {
428
+ this.handles = instancing.setup(this, this.gameObject, this.context, null, { rend: this, foundMeshes: 0, useMatrixWorldAutoUpdate: this.useInstanceMatrixWorldAutoUpdate() });
429
+ if (this.handles) {
430
+ GameObject.markAsInstancedRendered(this.gameObject, true);
431
+ return true;
432
+ }
433
+ }
434
+ else if (this.handles !== null) {
435
+ for (const handler of this.handles) {
436
+ handler.updateInstanceMatrix(true);
437
+ handler.add();
438
+ }
439
+ GameObject.markAsInstancedRendered(this.gameObject, true);
440
+ return true;
441
+ }
442
+ }
443
+ else {
444
+ if (this.handles) {
445
+ for (const handler of this.handles) {
446
+ handler.remove();
447
+ }
448
+ }
449
+ return true;
450
+ }
451
+ return false;
452
+ }
453
+ /** Return true to wrap matrix update events for instanced rendering to update instance matrices automatically when matrixWorld changes
454
+ * This is a separate method to be overrideable from user code
455
+ */
456
+ useInstanceMatrixWorldAutoUpdate() {
457
+ return true;
458
+ }
459
+ start() {
460
+ if (this.enableInstancing && !suppressInstancing) {
461
+ this.setInstancingEnabled(true);
462
+ // make sure the instance is marked dirty once for cases where e.g. an animator animates the instanced object
463
+ // in the first frame we want the updated matrix then to be applied immediately to the instancing
464
+ InstancingUtil.markDirty(this.gameObject);
465
+ }
466
+ this.gameObject.frustumCulled = this.allowOcclusionWhenDynamic;
467
+ if (this.isMultiMaterialObject(this.gameObject)) {
468
+ for (let i = 0; i < this.gameObject.children.length; i++) {
469
+ const ch = this.gameObject.children[i];
470
+ ch.frustumCulled = this.allowOcclusionWhenDynamic;
471
+ }
472
+ }
473
+ }
474
+ onEnable() {
475
+ this.setVisibility(true);
476
+ if (this._isInstancingEnabled) {
477
+ this.setInstancingEnabled(true);
478
+ }
479
+ else if (this.enabled) {
480
+ // this.gameObject.visible = true;
481
+ this.applyStencil();
482
+ }
483
+ this.updateReflectionProbe();
484
+ }
485
+ onDisable() {
486
+ this.setVisibility(false);
487
+ if (this.handles && this.handles.length > 0) {
488
+ this.setInstancingEnabled(false);
489
+ }
490
+ }
491
+ onDestroy() {
492
+ this.handles = null;
493
+ if (this.isMultiMaterialObject(this.gameObject)) {
494
+ for (const child of this.gameObject.children) {
495
+ this.context.removeBeforeRenderListener(child, this.onBeforeRenderThree);
496
+ }
497
+ }
498
+ else {
499
+ this.context.removeBeforeRenderListener(this.gameObject, this.onBeforeRenderThree);
500
+ }
501
+ }
502
+ applyStencil() {
503
+ NEEDLE_render_objects.applyStencil(this);
504
+ }
505
+ onBeforeRender() {
506
+ if (!this.gameObject) {
507
+ return;
508
+ }
509
+ if (this.isMultiMaterialObject(this.gameObject) && this.gameObject.children?.length > 0) {
510
+ for (const ch of this.gameObject.children) {
511
+ this.applySettings(ch);
512
+ }
513
+ }
514
+ else {
515
+ this.applySettings(this.gameObject);
516
+ }
517
+ if (this.sharedMaterials.changed) {
518
+ this.sharedMaterials.changed = false;
519
+ this.applyLightmapping();
520
+ }
521
+ if (this.handles?.length) {
522
+ // if (this.name === "Darbouka")
523
+ // console.log(this.name, this.gameObject.matrixWorldNeedsUpdate);
524
+ const needsUpdate = this.gameObject[NEED_UPDATE_INSTANCE_KEY] === true; // || this.gameObject.matrixWorldNeedsUpdate;
525
+ if (needsUpdate) {
526
+ if (debugInstancing)
527
+ console.log("UPDATE INSTANCED MATRICES", this.context.time.frame);
528
+ this.gameObject[NEED_UPDATE_INSTANCE_KEY] = false;
529
+ const remove = false; // Math.random() < .01;
530
+ for (let i = this.handles.length - 1; i >= 0; i--) {
531
+ const h = this.handles[i];
532
+ if (remove) {
533
+ h.remove();
534
+ this.handles.splice(i, 1);
535
+ }
536
+ else
537
+ h.updateInstanceMatrix();
538
+ }
539
+ this.gameObject.matrixWorldNeedsUpdate = false;
540
+ }
541
+ }
542
+ if (this.handles && this.handles.length <= 0) {
543
+ GameObject.markAsInstancedRendered(this.gameObject, false);
544
+ }
545
+ if (this._isInstancingEnabled && this.handles) {
546
+ for (let i = 0; i < this.handles.length; i++) {
547
+ const handle = this.handles[i];
548
+ if (!this.prevLayers)
549
+ this.prevLayers = [];
550
+ const layer = handle.object.layers.mask;
551
+ if (i >= this.prevLayers.length)
552
+ this.prevLayers.push(layer);
553
+ else
554
+ this.prevLayers[i] = layer;
555
+ handle.object.layers.disableAll();
556
+ }
557
+ }
558
+ for (const mat of this.sharedMaterials) {
559
+ if (mat)
560
+ this.loadProgressiveTextures(mat);
561
+ }
562
+ if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
563
+ this._reflectionProbe.onSet(this);
564
+ }
565
+ }
566
+ onBeforeRenderThree = (_renderer, _scene, _camera, _geometry, material, _group) => {
567
+ if (material.envMapIntensity !== undefined) {
568
+ const factor = this.hasLightmap ? Math.PI : 1;
569
+ const environmentIntensity = this.context.mainCameraComponent?.environmentIntensity ?? 1;
570
+ material.envMapIntensity = Math.max(0, environmentIntensity * this.context.sceneLighting.environmentIntensity / factor);
571
+ }
572
+ // if (this._reflectionProbe?.texture) {
573
+ // material.envMap = this._reflectionProbe.texture;
574
+ // // this.context.renderer.prop
575
+ // // console.log(material.name);
576
+ // // this.context.renderer.properties.get(material);
577
+ // // this.context.renderer.properties.update(material, "environment", this._reflectionProbe.texture);
578
+ // }
579
+ // _scene.environment = null;
580
+ // else _scene.environment = Renderer.envmap;
581
+ // if (!material.envmap)
582
+ // material.envMap = Renderer.envmap;
583
+ // material.needsUpdate = true;
584
+ // if (!camera) {
585
+ // let isXRCamera = false;
586
+ // if (this.context.isInXR) {
587
+ // // @ts-ignore
588
+ // const arr = this.context.renderer.xr.getCamera() as ArrayCamera;
589
+ // if (arr.cameras?.length > 0) {
590
+ // camera = arr;
591
+ // isXRCamera = true;
592
+ // }
593
+ // }
594
+ // }
595
+ // if (this.customShaderHandler) {
596
+ // this.customShaderHandler.onBeforeRender(renderer, scene, camera, geometry, material, group);
597
+ // }
598
+ // else if (this.rawShaderHandler) {
599
+ // for (const h of this.rawShaderHandler) {
600
+ // h.onBeforeRender(this.gameObject, camera);
601
+ // }
602
+ // }
603
+ if (this._lightmaps) {
604
+ for (const lm of this._lightmaps) {
605
+ lm.updateLightmapUniforms(material);
606
+ }
607
+ }
608
+ };
609
+ onAfterRender() {
610
+ if (this._isInstancingEnabled && this.handles && this.prevLayers && this.prevLayers.length >= this.handles.length) {
611
+ for (let i = 0; i < this.handles.length; i++) {
612
+ const handle = this.handles[i];
613
+ handle.object.layers.mask = this.prevLayers[i];
614
+ }
615
+ }
616
+ if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off && this._reflectionProbe) {
617
+ this._reflectionProbe.onUnset(this);
618
+ }
619
+ }
620
+ loadProgressiveTextures(material) {
621
+ // progressive load before rendering so we only load textures for visible materials
622
+ if (!suppressProgressiveLoading && material) {
623
+ if (material["_didRequestTextureLOD"] === undefined && this.allowProgressiveLoading) {
624
+ material["_didRequestTextureLOD"] = 0;
625
+ if (debugProgressiveLoading) {
626
+ console.log("Load material LOD", material.name);
627
+ }
628
+ return NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
629
+ }
630
+ }
631
+ return Promise.resolve(true);
632
+ }
633
+ applySettings(go) {
634
+ go.receiveShadow = this.receiveShadows;
635
+ if (this.shadowCastingMode == ShadowCastingMode.On) {
636
+ go.castShadow = true;
637
+ }
638
+ else
639
+ go.castShadow = false;
640
+ }
641
+ _reflectionProbe = null;
642
+ updateReflectionProbe() {
643
+ // handle reflection probe
644
+ this._reflectionProbe = null;
645
+ if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
646
+ if (!this.probeAnchor)
647
+ return;
648
+ // update the reflection probe right before rendering
649
+ // if we do it immediately the reflection probe might not be enabled yet
650
+ // (since this method is called from onEnable)
651
+ this.startCoroutine(this._updateReflectionProbe(), FrameEvent.LateUpdate);
652
+ }
653
+ }
654
+ *_updateReflectionProbe() {
655
+ const obj = this.probeAnchor || this.gameObject;
656
+ const isAnchor = this.probeAnchor ? true : false;
657
+ this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor, this.probeAnchor);
658
+ }
659
+ setVisibility(visible) {
660
+ if (!this.isMultiMaterialObject(this.gameObject)) {
661
+ setCustomVisibility(this.gameObject, visible);
662
+ }
663
+ else {
664
+ for (const ch of this.gameObject.children) {
665
+ if (this.isMeshOrSkinnedMesh(ch)) {
666
+ setCustomVisibility(ch, visible);
667
+ }
668
+ }
669
+ }
670
+ }
671
+ isMultiMaterialObject(obj) {
672
+ return obj.type === "Group";
673
+ }
674
+ isMeshOrSkinnedMesh(obj) {
675
+ return obj.type === "Mesh" || obj.type === "SkinnedMesh";
676
+ }
677
+ }
678
+ __decorate([
679
+ serializable()
680
+ ], Renderer.prototype, "receiveShadows", void 0);
681
+ __decorate([
682
+ serializable()
683
+ ], Renderer.prototype, "shadowCastingMode", void 0);
684
+ __decorate([
685
+ serializable()
686
+ ], Renderer.prototype, "lightmapIndex", void 0);
687
+ __decorate([
688
+ serializable(Vector4)
689
+ ], Renderer.prototype, "lightmapScaleOffset", void 0);
690
+ __decorate([
691
+ serializable()
692
+ ], Renderer.prototype, "enableInstancing", void 0);
693
+ __decorate([
694
+ serializable()
695
+ ], Renderer.prototype, "renderOrder", void 0);
696
+ __decorate([
697
+ serializable()
698
+ ], Renderer.prototype, "allowOcclusionWhenDynamic", void 0);
699
+ __decorate([
700
+ serializable(Object3D)
701
+ ], Renderer.prototype, "probeAnchor", void 0);
702
+ __decorate([
703
+ serializable()
704
+ ], Renderer.prototype, "reflectionProbeUsage", void 0);
705
+ export class MeshRenderer extends Renderer {
706
+ }
707
+ export class SkinnedMeshRenderer extends MeshRenderer {
708
+ awake() {
709
+ super.awake();
710
+ // disable skinned mesh occlusion because of https://github.com/mrdoob/three.js/issues/14499
711
+ this.allowOcclusionWhenDynamic = false;
712
+ // If we don't do that here the bounding sphere matrix used for raycasts will be wrong. Not sure *why* this is necessary
713
+ this.gameObject.parent?.updateWorldMatrix(false, true);
714
+ }
715
+ onBeforeRender() {
716
+ super.onBeforeRender();
717
+ if (debugskinnedmesh && this.gameObject instanceof SkinnedMesh && this.gameObject.boundingSphere) {
718
+ const tempCenter = getTempVector(this.gameObject.boundingSphere.center).applyMatrix4(this.gameObject.matrixWorld);
719
+ Gizmos.DrawWireSphere(tempCenter, this.gameObject.boundingSphere.radius, "red");
720
+ }
721
+ }
722
+ }
723
+ export var ShadowCastingMode;
724
+ (function (ShadowCastingMode) {
725
+ /// <summary>
726
+ /// <para>No shadows are cast from this object.</para>
727
+ /// </summary>
728
+ ShadowCastingMode[ShadowCastingMode["Off"] = 0] = "Off";
729
+ /// <summary>
730
+ /// <para>Shadows are cast from this object.</para>
731
+ /// </summary>
732
+ ShadowCastingMode[ShadowCastingMode["On"] = 1] = "On";
733
+ /// <summary>
734
+ /// <para>Shadows are cast from this object, treating it as two-sided.</para>
735
+ /// </summary>
736
+ ShadowCastingMode[ShadowCastingMode["TwoSided"] = 2] = "TwoSided";
737
+ /// <summary>
738
+ /// <para>Object casts shadows, but is otherwise invisible in the Scene.</para>
739
+ /// </summary>
740
+ ShadowCastingMode[ShadowCastingMode["ShadowsOnly"] = 3] = "ShadowsOnly";
741
+ })(ShadowCastingMode || (ShadowCastingMode = {}));
742
+ ;
743
+ class InstancingHandler {
744
+ objs = [];
745
+ setup(renderer, obj, context, handlesArray, args, level = 0) {
746
+ // 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
747
+ renderer.applySettings(obj);
748
+ const res = this.tryCreateOrAddInstance(obj, context, args);
749
+ if (res) {
750
+ renderer.loadProgressiveTextures(res.instancer.material);
751
+ if (handlesArray === null)
752
+ handlesArray = [];
753
+ handlesArray.push(res);
754
+ }
755
+ else if (level <= 0 && obj.type !== "Mesh") {
756
+ const nextLevel = level + 1;
757
+ for (const ch of obj.children) {
758
+ handlesArray = this.setup(renderer, ch, context, handlesArray, args, nextLevel);
759
+ }
760
+ }
761
+ if (level === 0) {
762
+ // For multi material objects we only want to track the root object's matrix
763
+ if (args.useMatrixWorldAutoUpdate && handlesArray && handlesArray.length >= 0) {
764
+ this.autoUpdateInstanceMatrix(obj);
765
+ }
766
+ }
767
+ return handlesArray;
768
+ }
769
+ tryCreateOrAddInstance(obj, context, args) {
770
+ if (obj.type === "Mesh") {
771
+ const index = args.foundMeshes;
772
+ args.foundMeshes += 1;
773
+ if (!args.rend.enableInstancing)
774
+ return null;
775
+ if (index >= args.rend.enableInstancing.length) {
776
+ // console.error("Something is wrong with instance setup", obj, args.rend.enableInstancing, index);
777
+ return null;
778
+ }
779
+ if (!args.rend.enableInstancing[index]) {
780
+ // instancing is disabled
781
+ // console.log("Instancing is disabled", obj);
782
+ return null;
783
+ }
784
+ // instancing is enabled:
785
+ const mesh = obj;
786
+ const geo = mesh.geometry;
787
+ const mat = mesh.material;
788
+ for (const i of this.objs) {
789
+ if (i.isFull())
790
+ continue;
791
+ if (i.geo === geo && i.material === mat) {
792
+ const handle = i.addInstance(mesh);
793
+ return handle;
794
+ }
795
+ }
796
+ // console.log("Add new instance mesh renderer", obj);
797
+ const i = new InstancedMeshRenderer(obj.name, geo, mat, 200, context);
798
+ this.objs.push(i);
799
+ const handle = i.addInstance(mesh);
800
+ return handle;
801
+ }
802
+ return null;
803
+ }
804
+ autoUpdateInstanceMatrix(obj) {
805
+ const original = obj.matrixWorld["multiplyMatrices"].bind(obj.matrixWorld);
806
+ const previousMatrix = obj.matrixWorld.clone();
807
+ const matrixChangeWrapper = (a, b) => {
808
+ const newMatrixWorld = original(a, b);
809
+ if (obj[NEED_UPDATE_INSTANCE_KEY] || previousMatrix.equals(newMatrixWorld) === false) {
810
+ previousMatrix.copy(newMatrixWorld);
811
+ obj[NEED_UPDATE_INSTANCE_KEY] = true;
812
+ }
813
+ return newMatrixWorld;
814
+ };
815
+ obj.matrixWorld["multiplyMatrices"] = matrixChangeWrapper;
816
+ // wrap matrixWorldNeedsUpdate
817
+ // let originalMatrixWorldNeedsUpdate = obj.matrixWorldNeedsUpdate;
818
+ // Object.defineProperty(obj, "matrixWorldNeedsUpdate", {
819
+ // get: () => {
820
+ // return originalMatrixWorldNeedsUpdate;
821
+ // },
822
+ // set: (value: boolean) => {
823
+ // if(value) console.warn("SET MATRIX WORLD NEEDS UPDATE");
824
+ // originalMatrixWorldNeedsUpdate = value;
825
+ // }
826
+ // });
827
+ }
828
+ }
829
+ const instancing = new InstancingHandler();
830
+ class InstanceHandle {
831
+ get name() {
832
+ return this.object.name;
833
+ }
834
+ instanceIndex = -1;
835
+ object;
836
+ instancer;
837
+ constructor(instanceIndex, originalObject, instancer) {
838
+ this.instanceIndex = instanceIndex;
839
+ this.object = originalObject;
840
+ this.instancer = instancer;
841
+ originalObject[$instancingRenderer] = instancer;
842
+ GameObject.markAsInstancedRendered(originalObject, true);
843
+ }
844
+ updateInstanceMatrix(updateChildren = false) {
845
+ if (this.instanceIndex < 0)
846
+ return;
847
+ this.object.updateWorldMatrix(true, updateChildren);
848
+ this.instancer.updateInstance(this.object.matrixWorld, this.instanceIndex);
849
+ }
850
+ setMatrix(matrix) {
851
+ if (this.instanceIndex < 0)
852
+ return;
853
+ this.instancer.updateInstance(matrix, this.instanceIndex);
854
+ }
855
+ add() {
856
+ if (this.instanceIndex >= 0)
857
+ return;
858
+ this.instancer.add(this);
859
+ }
860
+ remove() {
861
+ if (this.instanceIndex < 0)
862
+ return;
863
+ this.instancer.remove(this);
864
+ }
865
+ }
866
+ class InstancedMeshRenderer {
867
+ /** The three instanced mesh
868
+ * @link https://threejs.org/docs/#api/en/objects/InstancedMesh
869
+ */
870
+ get mesh() {
871
+ return this.inst;
872
+ }
873
+ get visible() {
874
+ return this.inst.visible;
875
+ }
876
+ set visible(val) {
877
+ this.inst.visible = val;
878
+ }
879
+ get castShadow() {
880
+ return this.inst.castShadow;
881
+ }
882
+ set castShadow(val) {
883
+ this.inst.castShadow = val;
884
+ }
885
+ set receiveShadow(val) {
886
+ this.inst.receiveShadow = val;
887
+ }
888
+ updateBounds(box = true, sphere = true) {
889
+ this._needUpdateBounds = false;
890
+ if (box)
891
+ this.inst.computeBoundingBox();
892
+ if (sphere)
893
+ this.inst.computeBoundingSphere();
894
+ }
895
+ name = "";
896
+ geo;
897
+ material;
898
+ get currentCount() { return this.inst.count; }
899
+ context;
900
+ inst;
901
+ handles = [];
902
+ maxCount;
903
+ static nullMatrix = new THREE.Matrix4();
904
+ isFull() {
905
+ return this.currentCount >= this.maxCount;
906
+ }
907
+ _needUpdateBounds = false;
908
+ constructor(name, geo, material, count, context) {
909
+ this.name = name;
910
+ this.geo = geo;
911
+ this.material = material;
912
+ this.context = context;
913
+ this.maxCount = count;
914
+ if (debugInstancing) {
915
+ material = new THREE.MeshBasicMaterial({ color: this.randomColor() });
916
+ }
917
+ this.inst = new THREE.InstancedMesh(geo, material, count);
918
+ this.inst[$instancingAutoUpdateBounds] = true;
919
+ this.inst.count = 0;
920
+ this.inst.layers.set(2);
921
+ this.inst.visible = true;
922
+ // Not handled by RawShaderMaterial, so we need to set the define explicitly.
923
+ // Edge case: theoretically some users of the material could use it in an
924
+ // instanced fashion, and some others not. In that case, the material would not
925
+ // be able to be shared between the two use cases. We could probably add a
926
+ // onBeforeRender call for the InstancedMesh and set the define there.
927
+ // Same would apply if we support skinning -
928
+ // there we would have to split instanced batches so that the ones using skinning
929
+ // are all in the same batch.
930
+ if (material instanceof THREE.RawShaderMaterial) {
931
+ material.defines["USE_INSTANCING"] = true;
932
+ material.needsUpdate = true;
933
+ }
934
+ // this.inst.castShadow = true;
935
+ // this.inst.receiveShadow = true;
936
+ this.context.scene.add(this.inst);
937
+ context.pre_render_callbacks.push(this.onBeforeRender);
938
+ // console.log(this.inst);
939
+ // this.context.pre_render_callbacks.push(this.onPreRender.bind(this));
940
+ // setInterval(() => {
941
+ // this.inst.visible = !this.inst.visible;
942
+ // }, 500);
943
+ }
944
+ onBeforeRender = () => {
945
+ if (this._needUpdateBounds && this.inst[$instancingAutoUpdateBounds] === true) {
946
+ if (debugInstancing)
947
+ console.log("Update instancing bounds", this.name, this.inst.matrixWorldNeedsUpdate);
948
+ this.updateBounds();
949
+ }
950
+ };
951
+ randomColor() {
952
+ return new THREE.Color(Math.random(), Math.random(), Math.random());
953
+ }
954
+ addInstance(obj) {
955
+ if (this.currentCount >= this.maxCount) {
956
+ console.error("TOO MANY INSTANCES - resize is not yet implemented!", this.inst.count); // todo: make it resize
957
+ return null;
958
+ }
959
+ const handle = new InstanceHandle(-1, obj, this);
960
+ if (obj.castShadow === true && this.inst.castShadow === false) {
961
+ this.inst.castShadow = true;
962
+ }
963
+ if (obj.receiveShadow === true && this.inst.receiveShadow === false) {
964
+ this.inst.receiveShadow = true;
965
+ }
966
+ this.add(handle);
967
+ return handle;
968
+ }
969
+ add(handle) {
970
+ if (handle.instanceIndex < 0) {
971
+ handle.instanceIndex = this.currentCount;
972
+ // console.log(handle.instanceIndex, this.currentCount);
973
+ if (handle.instanceIndex >= this.handles.length)
974
+ this.handles.push(handle);
975
+ else
976
+ this.handles[handle.instanceIndex] = handle;
977
+ }
978
+ // console.log("Handle instance");
979
+ handle.object.updateWorldMatrix(true, true);
980
+ this.inst.setMatrixAt(handle.instanceIndex, handle.object.matrixWorld);
981
+ this.inst.instanceMatrix.needsUpdate = true;
982
+ this.inst.count += 1;
983
+ this._needUpdateBounds = true;
984
+ if (this.inst.count > 0)
985
+ this.inst.visible = true;
986
+ // console.log("Added", this.name, this.inst.count, this.handles);
987
+ }
988
+ remove(handle) {
989
+ if (!handle)
990
+ return;
991
+ if (handle.instanceIndex < 0 || handle.instanceIndex >= this.handles.length || this.inst.count <= 0) {
992
+ return;
993
+ }
994
+ if (this.handles[handle.instanceIndex] !== handle) {
995
+ console.error("instance handle is not part of renderer, was it removed before?", handle.instanceIndex, this.name);
996
+ const index = this.handles.indexOf(handle);
997
+ if (index < 0)
998
+ return;
999
+ handle.instanceIndex = index;
1000
+ }
1001
+ this.handles[handle.instanceIndex] = null;
1002
+ this.inst.setMatrixAt(handle.instanceIndex, InstancedMeshRenderer.nullMatrix);
1003
+ const removedLastElement = handle.instanceIndex >= this.currentCount - 1;
1004
+ // console.log(removedLastElement, this.currentCount, handle.instanceIndex, this.handles);
1005
+ if (!removedLastElement && this.currentCount > 0) {
1006
+ const lastElement = this.handles[this.currentCount - 1];
1007
+ if (lastElement) {
1008
+ lastElement.instanceIndex = handle.instanceIndex;
1009
+ lastElement.updateInstanceMatrix();
1010
+ this.handles[handle.instanceIndex] = lastElement;
1011
+ this.handles[this.currentCount - 1] = null;
1012
+ // this.inst.setMatrixAt(handle.instanceIndex, lastElement.object.matrixWorld);
1013
+ // this.inst.setMatrixAt(this.currentCount - 1, InstancedMeshRenderer.nullMatrix);
1014
+ }
1015
+ }
1016
+ if (this.inst.count > 0)
1017
+ this.inst.count -= 1;
1018
+ handle.instanceIndex = -1;
1019
+ this._needUpdateBounds = true;
1020
+ if (this.inst.count <= 0)
1021
+ this.inst.visible = false;
1022
+ this.inst.instanceMatrix.needsUpdate = true;
1023
+ }
1024
+ updateInstance(mat, index) {
1025
+ this.inst.setMatrixAt(index, mat);
1026
+ this.inst.instanceMatrix.needsUpdate = true;
1027
+ this._needUpdateBounds = true;
1028
+ }
1029
+ }
1030
1030
  //# sourceMappingURL=Renderer.js.map