@needle-tools/engine 5.1.3 → 5.1.4-canary.1783349759.notable-schnitzel.9bc7202

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 (520) hide show
  1. package/CHANGELOG.md +4455 -4448
  2. package/LICENSE.md +10 -10
  3. package/README.md +169 -169
  4. package/components.needle.json +1 -1
  5. package/custom-elements.json +571 -571
  6. package/dist/{needle-engine.bundle-BiLCbb4D.umd.cjs → needle-engine.bundle-Ca8ZchAT.umd.cjs} +145 -139
  7. package/dist/{needle-engine.bundle-CTHxmSih.min.js → needle-engine.bundle-CjedmjQ5.min.js} +169 -163
  8. package/dist/{needle-engine.bundle-BAT9_opF.js → needle-engine.bundle-Cy57dbzK.js} +5987 -5920
  9. package/dist/needle-engine.d.ts +12 -7
  10. package/dist/needle-engine.js +241 -241
  11. package/dist/needle-engine.min.js +1 -1
  12. package/dist/needle-engine.umd.cjs +1 -1
  13. package/lib/asap/needle-asap.js +11 -11
  14. package/lib/engine/api.d.ts +1 -1
  15. package/lib/engine/api.js +1 -1
  16. package/lib/engine/api.js.map +1 -1
  17. package/lib/engine/debug/debug_console.js +59 -59
  18. package/lib/engine/debug/debug_overlay.js +50 -50
  19. package/lib/engine/engine_accessibility.js +8 -8
  20. package/lib/engine/engine_camera.fit.js +25 -2
  21. package/lib/engine/engine_camera.fit.js.map +1 -1
  22. package/lib/engine/engine_init.js +2 -2
  23. package/lib/engine/engine_init.js.map +1 -1
  24. package/lib/engine/engine_license.d.ts +7 -7
  25. package/lib/engine/engine_license.js +142 -142
  26. package/lib/engine/engine_license.js.map +1 -1
  27. package/lib/engine/engine_lifecycle_functions_internal.js +9 -9
  28. package/lib/engine/engine_lightdata.js +21 -21
  29. package/lib/engine/engine_networking_blob.js +3 -3
  30. package/lib/engine/engine_networking_blob.js.map +1 -1
  31. package/lib/engine/engine_three_utils.js +25 -25
  32. package/lib/engine/engine_tonemapping.js +132 -132
  33. package/lib/engine/engine_utils_qrcode.js +2 -2
  34. package/lib/engine/engine_utils_qrcode.js.map +1 -1
  35. package/lib/engine/engine_utils_screenshot.d.ts +3 -1
  36. package/lib/engine/engine_utils_screenshot.js +123 -38
  37. package/lib/engine/engine_utils_screenshot.js.map +1 -1
  38. package/lib/engine/engine_utils_screenshot.needlego.d.ts +44 -0
  39. package/lib/engine/engine_utils_screenshot.needlego.js +22 -0
  40. package/lib/engine/engine_utils_screenshot.needlego.js.map +1 -0
  41. package/lib/engine/engine_utils_screenshot.xr.js +8 -8
  42. package/lib/engine/engine_utils_screenshot.xr.js.map +1 -1
  43. package/lib/engine/webcomponents/buttons.js +9 -9
  44. package/lib/engine/webcomponents/jsx.d.ts +51 -51
  45. package/lib/engine/webcomponents/logo-element.js +42 -42
  46. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  47. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  48. package/lib/engine/webcomponents/needle menu/needle-menu.js +410 -397
  49. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  50. package/lib/engine/webcomponents/needle-button.js +33 -33
  51. package/lib/engine/webcomponents/needle-engine.ar-overlay.js +53 -27
  52. package/lib/engine/webcomponents/needle-engine.ar-overlay.js.map +1 -1
  53. package/lib/engine/webcomponents/needle-engine.js +77 -77
  54. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  55. package/lib/engine/webcomponents/needle-engine.loading.js +32 -32
  56. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  57. package/lib/engine/xr/NeedleXRController.js +1 -1
  58. package/lib/engine/xr/NeedleXRSession.d.ts +3 -0
  59. package/lib/engine/xr/NeedleXRSession.js +51 -44
  60. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  61. package/lib/engine/xr/TempXRContext.js +2 -2
  62. package/lib/engine/xr/TempXRContext.js.map +1 -1
  63. package/lib/engine/xr/init.js +4 -5
  64. package/lib/engine/xr/init.js.map +1 -1
  65. package/lib/engine-components/ContactShadows.js +3 -3
  66. package/lib/engine-components/DragControls.js +4 -4
  67. package/lib/engine-components/GroundProjection.js +191 -171
  68. package/lib/engine-components/GroundProjection.js.map +1 -1
  69. package/lib/engine-components/OrbitControls.js +32 -6
  70. package/lib/engine-components/OrbitControls.js.map +1 -1
  71. package/lib/engine-components/RendererLightmap.js +24 -24
  72. package/lib/engine-components/ShadowCatcher.js +10 -10
  73. package/lib/engine-components/VideoPlayer.js +53 -53
  74. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +200 -200
  75. package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
  76. package/lib/engine-components/export/usdz/extensions/NodeMaterialConverter.js +27 -27
  77. package/lib/engine-components/postprocessing/Effects/Sharpening.js +44 -44
  78. package/lib/engine-components/webxr/WebARCameraBackground.js +19 -19
  79. package/package.json +1 -1
  80. package/plugins/common/buildinfo.js +105 -105
  81. package/plugins/common/cloud.js +6 -6
  82. package/plugins/common/config.cjs +31 -31
  83. package/plugins/common/config.js +35 -35
  84. package/plugins/common/errors.js +12 -12
  85. package/plugins/common/files.js +44 -44
  86. package/plugins/common/generator.js +10 -10
  87. package/plugins/common/license.js +611 -611
  88. package/plugins/common/logger.js +647 -647
  89. package/plugins/common/needle-engine-skill.md +175 -175
  90. package/plugins/common/needle-engine.js +43 -43
  91. package/plugins/common/npm.js +15 -15
  92. package/plugins/common/secrets.js +52 -52
  93. package/plugins/common/telemetry.js +148 -148
  94. package/plugins/common/timers.js +7 -7
  95. package/plugins/common/version.js +37 -37
  96. package/plugins/common/worker.js +134 -134
  97. package/plugins/dts-generator/dts.codegen.js +334 -334
  98. package/plugins/dts-generator/dts.scan.js +99 -99
  99. package/plugins/dts-generator/dts.writer.js +59 -59
  100. package/plugins/dts-generator/glb.discovery.js +279 -279
  101. package/plugins/dts-generator/glb.extractor.js +215 -215
  102. package/plugins/dts-generator/glb.reader.js +167 -167
  103. package/plugins/dts-generator/index.js +36 -36
  104. package/plugins/dts-generator/manifest.types.js +174 -174
  105. package/plugins/gltf-packer.mjs +1 -1
  106. package/plugins/next/alias.cjs +39 -39
  107. package/plugins/next/license.cjs +24 -24
  108. package/plugins/next/meshbvhworker-import.cjs +40 -40
  109. package/plugins/next/next.js +172 -172
  110. package/plugins/types/index.d.ts +3 -3
  111. package/plugins/types/license.d.ts +24 -24
  112. package/plugins/types/needle-bindings.d.ts +30 -30
  113. package/plugins/types/needleConfig.d.ts +27 -27
  114. package/plugins/types/userconfig.d.ts +256 -256
  115. package/plugins/types/webmanifest.d.ts +32 -32
  116. package/plugins/vite/ai.js +383 -383
  117. package/plugins/vite/alias.js +217 -217
  118. package/plugins/vite/asap.js +288 -288
  119. package/plugins/vite/build-pipeline.js +708 -708
  120. package/plugins/vite/build.js +25 -25
  121. package/plugins/vite/buildinfo.js +123 -123
  122. package/plugins/vite/config.js +106 -106
  123. package/plugins/vite/copyfiles.js +164 -164
  124. package/plugins/vite/custom-element-data.js +200 -200
  125. package/plugins/vite/defines.js +74 -74
  126. package/plugins/vite/dependencies.js +476 -476
  127. package/plugins/vite/dependency-watcher.js +335 -335
  128. package/plugins/vite/drop-client.js +78 -78
  129. package/plugins/vite/drop.js +86 -86
  130. package/plugins/vite/dts-generator.js +230 -230
  131. package/plugins/vite/editor-connection.js +131 -131
  132. package/plugins/vite/facebook-instant-games.js +104 -104
  133. package/plugins/vite/gzip.js +10 -10
  134. package/plugins/vite/imports-logger.js +156 -156
  135. package/plugins/vite/index.js +213 -213
  136. package/plugins/vite/license.js +91 -91
  137. package/plugins/vite/local-files-analysis.js +788 -788
  138. package/plugins/vite/local-files-core.js +990 -990
  139. package/plugins/vite/local-files-internals.js +28 -28
  140. package/plugins/vite/local-files-types.d.ts +149 -149
  141. package/plugins/vite/local-files-utils.js +387 -387
  142. package/plugins/vite/local-files.js +2 -2
  143. package/plugins/vite/logger.client.js +350 -350
  144. package/plugins/vite/logger.js +112 -112
  145. package/plugins/vite/logging.js +152 -152
  146. package/plugins/vite/meta.js +180 -180
  147. package/plugins/vite/needle-app.js +267 -267
  148. package/plugins/vite/npm.js +7 -7
  149. package/plugins/vite/peer.js +93 -93
  150. package/plugins/vite/poster-client.js +65 -65
  151. package/plugins/vite/poster.js +80 -80
  152. package/plugins/vite/pwa.js +663 -663
  153. package/plugins/vite/reload-client.js +15 -15
  154. package/plugins/vite/reload.js +383 -383
  155. package/plugins/vite/remote.js +124 -124
  156. package/plugins/vite/server.js +67 -67
  157. package/plugins/vite/transform-codegen.js +61 -61
  158. package/plugins/vite/transform.js +32 -32
  159. package/plugins/vite/treeshake.js +216 -216
  160. package/plugins/vite/vite-4.4-hack.js +39 -39
  161. package/src/asap/needle-asap.ts +111 -111
  162. package/src/asap/sessiongranted.ts +75 -75
  163. package/src/asap/utils.ts +4 -4
  164. package/src/engine/analytics/index.ts +10 -10
  165. package/src/engine/analytics/lcp.ts +35 -35
  166. package/src/engine/api.ts +465 -465
  167. package/src/engine/assets/index.ts +59 -59
  168. package/src/engine/assets/static.js +5 -5
  169. package/src/engine/codegen/register_types.ts +314 -314
  170. package/src/engine/debug/debug.ts +27 -27
  171. package/src/engine/debug/debug_console.ts +751 -751
  172. package/src/engine/debug/debug_environment.ts +26 -26
  173. package/src/engine/debug/debug_overlay.ts +404 -404
  174. package/src/engine/debug/debug_spatial_console.ts +436 -436
  175. package/src/engine/debug/debug_spector.ts +42 -42
  176. package/src/engine/debug/index.ts +1 -1
  177. package/src/engine/engine_accessibility.ts +197 -197
  178. package/src/engine/engine_addressables.ts +777 -777
  179. package/src/engine/engine_animation.ts +277 -277
  180. package/src/engine/engine_application.ts +133 -133
  181. package/src/engine/engine_assetdatabase.ts +396 -396
  182. package/src/engine/engine_audio.ts +260 -260
  183. package/src/engine/engine_camera.fit.ts +333 -316
  184. package/src/engine/engine_camera.ts +143 -143
  185. package/src/engine/engine_components.ts +399 -399
  186. package/src/engine/engine_components_internal.ts +40 -40
  187. package/src/engine/engine_constants.ts +57 -57
  188. package/src/engine/engine_context.ts +2106 -2106
  189. package/src/engine/engine_context_eventbus.ts +73 -73
  190. package/src/engine/engine_context_registry.ts +133 -133
  191. package/src/engine/engine_coroutine.ts +54 -54
  192. package/src/engine/engine_create_objects.ts +435 -435
  193. package/src/engine/engine_default_parameters.ts +3 -3
  194. package/src/engine/engine_disposable.ts +214 -214
  195. package/src/engine/engine_editor-sync.ts +28 -28
  196. package/src/engine/engine_feature_flags.ts +3 -3
  197. package/src/engine/engine_fileloader.js +9 -9
  198. package/src/engine/engine_gameobject.ts +760 -760
  199. package/src/engine/engine_generic_utils.js +13 -13
  200. package/src/engine/engine_gizmos.ts +598 -598
  201. package/src/engine/engine_gltf.ts +29 -29
  202. package/src/engine/engine_gltf_builtin_components.ts +334 -334
  203. package/src/engine/engine_hot_reload.ts +210 -210
  204. package/src/engine/engine_init.ts +69 -69
  205. package/src/engine/engine_input.ts +1627 -1627
  206. package/src/engine/engine_input_utils.ts +23 -23
  207. package/src/engine/engine_instancing.ts +45 -45
  208. package/src/engine/engine_instantiate_resolve.ts +434 -434
  209. package/src/engine/engine_license.ts +982 -982
  210. package/src/engine/engine_lifecycle_api.ts +113 -113
  211. package/src/engine/engine_lifecycle_functions_internal.ts +200 -200
  212. package/src/engine/engine_lightdata.ts +129 -129
  213. package/src/engine/engine_loaders.callbacks.ts +137 -137
  214. package/src/engine/engine_loaders.gltf.ts +82 -82
  215. package/src/engine/engine_loaders.ts +394 -394
  216. package/src/engine/engine_lods.ts +198 -198
  217. package/src/engine/engine_mainloop_utils.ts +483 -483
  218. package/src/engine/engine_materialpropertyblock.ts +938 -938
  219. package/src/engine/engine_math.ts +401 -401
  220. package/src/engine/engine_modules.ts +49 -49
  221. package/src/engine/engine_networking.transport.websocket.ts +45 -45
  222. package/src/engine/engine_networking.ts +1155 -1155
  223. package/src/engine/engine_networking_auto.ts +379 -379
  224. package/src/engine/engine_networking_blob.ts +269 -269
  225. package/src/engine/engine_networking_files.ts +217 -217
  226. package/src/engine/engine_networking_files_default_components.ts +58 -58
  227. package/src/engine/engine_networking_instantiate.ts +588 -588
  228. package/src/engine/engine_networking_peer.ts +160 -160
  229. package/src/engine/engine_networking_prefabs.ts +80 -80
  230. package/src/engine/engine_networking_streams.ts +724 -724
  231. package/src/engine/engine_networking_types.ts +64 -64
  232. package/src/engine/engine_networking_utils.ts +23 -23
  233. package/src/engine/engine_networking_websocket.ts +2 -2
  234. package/src/engine/engine_patcher.ts +199 -199
  235. package/src/engine/engine_physics.ts +885 -885
  236. package/src/engine/engine_physics.types.ts +46 -46
  237. package/src/engine/engine_physics_rapier.ts +1797 -1797
  238. package/src/engine/engine_playerview.ts +80 -80
  239. package/src/engine/engine_pmrem.ts +136 -136
  240. package/src/engine/engine_scenedata.ts +141 -141
  241. package/src/engine/engine_scenelighting.ts +319 -319
  242. package/src/engine/engine_serialization.ts +2 -2
  243. package/src/engine/engine_serialization_builtin_serializer.ts +486 -486
  244. package/src/engine/engine_serialization_core.ts +734 -734
  245. package/src/engine/engine_serialization_decorator.ts +107 -107
  246. package/src/engine/engine_setup.ts +1 -1
  247. package/src/engine/engine_shaders.ts +267 -267
  248. package/src/engine/engine_shims.ts +34 -34
  249. package/src/engine/engine_ssr.ts +47 -47
  250. package/src/engine/engine_texture.ts +82 -82
  251. package/src/engine/engine_three_utils.ts +943 -943
  252. package/src/engine/engine_time.ts +114 -114
  253. package/src/engine/engine_time_utils.ts +241 -241
  254. package/src/engine/engine_tonemapping.ts +208 -208
  255. package/src/engine/engine_types.ts +791 -791
  256. package/src/engine/engine_typestore.ts +91 -91
  257. package/src/engine/engine_util_decorator.ts +171 -171
  258. package/src/engine/engine_utils.ts +975 -975
  259. package/src/engine/engine_utils_attributes.ts +72 -72
  260. package/src/engine/engine_utils_format.ts +290 -290
  261. package/src/engine/engine_utils_hash.ts +65 -65
  262. package/src/engine/engine_utils_qrcode.ts +266 -266
  263. package/src/engine/engine_utils_screenshot.needlego.ts +53 -0
  264. package/src/engine/engine_utils_screenshot.ts +1020 -932
  265. package/src/engine/engine_utils_screenshot.xr.ts +103 -103
  266. package/src/engine/export/gltf/EXT_mesh_gpu_instancing_exporter.js +66 -66
  267. package/src/engine/export/gltf/Writers.ts +34 -34
  268. package/src/engine/export/gltf/index.ts +151 -151
  269. package/src/engine/export/index.ts +2 -2
  270. package/src/engine/export/state.ts +19 -19
  271. package/src/engine/export/utils.ts +61 -61
  272. package/src/engine/extensions/EXT_texture_exr.ts +50 -50
  273. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
  274. package/src/engine/extensions/NEEDLE_components.ts +290 -290
  275. package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
  276. package/src/engine/extensions/NEEDLE_lighting_settings.ts +188 -188
  277. package/src/engine/extensions/NEEDLE_lightmaps.ts +131 -131
  278. package/src/engine/extensions/NEEDLE_materialx.ts +142 -142
  279. package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
  280. package/src/engine/extensions/NEEDLE_pmrem.ts +53 -53
  281. package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
  282. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +643 -643
  283. package/src/engine/extensions/extension_resolver.ts +4 -4
  284. package/src/engine/extensions/extension_utils.ts +166 -166
  285. package/src/engine/extensions/extensions.ts +174 -174
  286. package/src/engine/extensions/index.ts +6 -6
  287. package/src/engine/extensions/usage_tracker.ts +100 -100
  288. package/src/engine/js-extensions/Camera.ts +45 -45
  289. package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
  290. package/src/engine/js-extensions/Layers.ts +22 -22
  291. package/src/engine/js-extensions/Object3D.ts +395 -395
  292. package/src/engine/js-extensions/RGBAColor.ts +126 -126
  293. package/src/engine/js-extensions/Vector.ts +31 -31
  294. package/src/engine/js-extensions/index.ts +3 -3
  295. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +128 -128
  296. package/src/engine/postprocessing/api.ts +2 -2
  297. package/src/engine/postprocessing/index.ts +2 -2
  298. package/src/engine/postprocessing/postprocessing.ts +323 -323
  299. package/src/engine/postprocessing/types.ts +43 -43
  300. package/src/engine/shaders/shaderData.ts +67 -67
  301. package/src/engine/tests/test_utils.ts +63 -63
  302. package/src/engine/webcomponents/WebXRButtons.ts +293 -293
  303. package/src/engine/webcomponents/api.ts +6 -6
  304. package/src/engine/webcomponents/buttons.ts +303 -303
  305. package/src/engine/webcomponents/font-urls.js +9 -9
  306. package/src/engine/webcomponents/fonts.ts +46 -46
  307. package/src/engine/webcomponents/icons.ts +104 -104
  308. package/src/engine/webcomponents/index.ts +2 -2
  309. package/src/engine/webcomponents/init.ts +23 -23
  310. package/src/engine/webcomponents/jsx.d.ts +51 -51
  311. package/src/engine/webcomponents/logo-element.ts +137 -137
  312. package/src/engine/webcomponents/needle menu/menu-priority.ts +20 -20
  313. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +580 -580
  314. package/src/engine/webcomponents/needle menu/needle-menu.ts +1352 -1338
  315. package/src/engine/webcomponents/needle-button.ts +222 -222
  316. package/src/engine/webcomponents/needle-engine.ar-overlay.ts +233 -205
  317. package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
  318. package/src/engine/webcomponents/needle-engine.loading.ts +404 -404
  319. package/src/engine/webcomponents/needle-engine.ts +1263 -1263
  320. package/src/engine/webcomponents/quicklook-handler.ts +37 -37
  321. package/src/engine/xr/NeedleXRController.ts +1256 -1256
  322. package/src/engine/xr/NeedleXRSession.ts +1983 -1982
  323. package/src/engine/xr/NeedleXRSync.ts +240 -240
  324. package/src/engine/xr/SceneTransition.ts +78 -78
  325. package/src/engine/xr/TempXRContext.ts +334 -334
  326. package/src/engine/xr/XRRig.ts +9 -9
  327. package/src/engine/xr/api.ts +5 -5
  328. package/src/engine/xr/events.ts +145 -145
  329. package/src/engine/xr/init.ts +46 -47
  330. package/src/engine/xr/internal.ts +34 -34
  331. package/src/engine/xr/usdz.ts +35 -35
  332. package/src/engine/xr/utils.ts +39 -39
  333. package/src/engine-components/AlignmentConstraint.ts +63 -63
  334. package/src/engine-components/Animation.ts +617 -617
  335. package/src/engine-components/AnimationBuilder.ts +472 -472
  336. package/src/engine-components/AnimationCurve.ts +153 -153
  337. package/src/engine-components/AnimationUtils.ts +18 -18
  338. package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
  339. package/src/engine-components/Animator.ts +445 -445
  340. package/src/engine-components/AnimatorController.builder.ts +387 -387
  341. package/src/engine-components/AnimatorController.ts +1320 -1320
  342. package/src/engine-components/AudioListener.ts +94 -94
  343. package/src/engine-components/AudioSource.ts +919 -919
  344. package/src/engine-components/AxesHelper.ts +80 -80
  345. package/src/engine-components/BasicIKConstraint.ts +84 -84
  346. package/src/engine-components/BoxCollider.ts +1 -1
  347. package/src/engine-components/BoxHelperComponent.ts +115 -115
  348. package/src/engine-components/Camera.ts +774 -774
  349. package/src/engine-components/CameraUtils.ts +146 -146
  350. package/src/engine-components/CharacterController.ts +327 -327
  351. package/src/engine-components/Collider.ts +526 -526
  352. package/src/engine-components/Component.ts +1417 -1417
  353. package/src/engine-components/ContactShadows.ts +629 -629
  354. package/src/engine-components/DeleteBox.ts +105 -105
  355. package/src/engine-components/DeviceFlag.ts +69 -69
  356. package/src/engine-components/DragControls.ts +1873 -1873
  357. package/src/engine-components/DragControlsConstraints.ts +487 -487
  358. package/src/engine-components/DropListener.ts +790 -790
  359. package/src/engine-components/Duplicatable.ts +239 -239
  360. package/src/engine-components/EventList.ts +308 -308
  361. package/src/engine-components/EventTrigger.ts +75 -75
  362. package/src/engine-components/EventType.ts +23 -23
  363. package/src/engine-components/Fog.ts +82 -82
  364. package/src/engine-components/Gizmos.ts +58 -58
  365. package/src/engine-components/GridHelper.ts +66 -66
  366. package/src/engine-components/GroundProjection.ts +645 -624
  367. package/src/engine-components/Interactable.ts +32 -32
  368. package/src/engine-components/Joints.ts +131 -131
  369. package/src/engine-components/LODGroup.ts +189 -189
  370. package/src/engine-components/Light.ts +635 -635
  371. package/src/engine-components/LookAtConstraint.ts +52 -52
  372. package/src/engine-components/NeedleMenu.ts +116 -116
  373. package/src/engine-components/NestedGltf.ts +135 -135
  374. package/src/engine-components/Networking.ts +142 -142
  375. package/src/engine-components/OffsetConstraint.ts +90 -90
  376. package/src/engine-components/OrbitControls.ts +1205 -1178
  377. package/src/engine-components/PlayerColor.ts +105 -105
  378. package/src/engine-components/ReflectionProbe.ts +298 -298
  379. package/src/engine-components/Renderer.ts +973 -973
  380. package/src/engine-components/RendererInstancing.ts +1020 -1020
  381. package/src/engine-components/RendererLightmap.ts +200 -200
  382. package/src/engine-components/RigidBody.ts +602 -602
  383. package/src/engine-components/SceneSwitcher.ts +1085 -1085
  384. package/src/engine-components/ScreenCapture.ts +626 -626
  385. package/src/engine-components/SeeThrough.ts +344 -344
  386. package/src/engine-components/ShadowCatcher.ts +229 -229
  387. package/src/engine-components/Skybox.ts +758 -758
  388. package/src/engine-components/SmoothFollow.ts +137 -137
  389. package/src/engine-components/SpatialTrigger.ts +277 -277
  390. package/src/engine-components/SpectatorCamera.ts +818 -818
  391. package/src/engine-components/SphereCollider.ts +1 -1
  392. package/src/engine-components/SpriteRenderer.ts +488 -488
  393. package/src/engine-components/SyncedCamera.ts +222 -222
  394. package/src/engine-components/SyncedRoom.ts +408 -408
  395. package/src/engine-components/SyncedTransform.ts +473 -473
  396. package/src/engine-components/TestRunner.ts +118 -118
  397. package/src/engine-components/TransformGizmo.ts +257 -257
  398. package/src/engine-components/VideoPlayer.ts +1100 -1100
  399. package/src/engine-components/Voip.ts +557 -557
  400. package/src/engine-components/api.ts +62 -62
  401. package/src/engine-components/codegen/components.ts +232 -232
  402. package/src/engine-components/debug/LogStats.ts +22 -22
  403. package/src/engine-components/export/gltf/GltfExport.ts +268 -268
  404. package/src/engine-components/export/usdz/Extension.ts +24 -24
  405. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2538 -2538
  406. package/src/engine-components/export/usdz/USDZExporter.ts +804 -804
  407. package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
  408. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
  409. package/src/engine-components/export/usdz/extensions/NodeMaterialConverter.ts +532 -532
  410. package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
  411. package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
  412. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
  413. package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
  414. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
  415. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1422 -1422
  416. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
  417. package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
  418. package/src/engine-components/export/usdz/index.ts +2 -2
  419. package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
  420. package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
  421. package/src/engine-components/particlesystem/ParticleSystem.ts +1371 -1371
  422. package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
  423. package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
  424. package/src/engine-components/particlesystem/api.ts +1 -1
  425. package/src/engine-components/physics/Attractor.ts +47 -47
  426. package/src/engine-components/postprocessing/Effects/Antialiasing.ts +66 -66
  427. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +117 -117
  428. package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +41 -41
  429. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +113 -113
  430. package/src/engine-components/postprocessing/Effects/DepthOfField.ts +107 -107
  431. package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +28 -28
  432. package/src/engine-components/postprocessing/Effects/Pixelation.ts +59 -59
  433. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
  434. package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +201 -201
  435. package/src/engine-components/postprocessing/Effects/Sharpening.ts +146 -146
  436. package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +65 -65
  437. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +100 -100
  438. package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -60
  439. package/src/engine-components/postprocessing/Effects/Vignette.ts +63 -63
  440. package/src/engine-components/postprocessing/PostProcessingEffect.ts +185 -185
  441. package/src/engine-components/postprocessing/PostProcessingHandler.ts +685 -685
  442. package/src/engine-components/postprocessing/Volume.ts +340 -340
  443. package/src/engine-components/postprocessing/VolumeParameter.ts +161 -161
  444. package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
  445. package/src/engine-components/postprocessing/index.ts +6 -6
  446. package/src/engine-components/postprocessing/utils.ts +161 -161
  447. package/src/engine-components/splines/Spline.ts +687 -687
  448. package/src/engine-components/splines/SplineUtils.ts +34 -34
  449. package/src/engine-components/splines/SplineWalker.ts +198 -198
  450. package/src/engine-components/splines/index.ts +2 -2
  451. package/src/engine-components/timeline/PlayableDirector.ts +877 -877
  452. package/src/engine-components/timeline/SignalAsset.ts +159 -159
  453. package/src/engine-components/timeline/TimelineBuilder.ts +845 -845
  454. package/src/engine-components/timeline/TimelineModels.ts +156 -156
  455. package/src/engine-components/timeline/TimelineTracks.ts +1067 -1067
  456. package/src/engine-components/timeline/index.ts +4 -4
  457. package/src/engine-components/ui/BaseUIComponent.ts +203 -203
  458. package/src/engine-components/ui/Button.ts +349 -349
  459. package/src/engine-components/ui/Canvas.ts +443 -443
  460. package/src/engine-components/ui/CanvasGroup.ts +58 -58
  461. package/src/engine-components/ui/EventSystem.ts +870 -870
  462. package/src/engine-components/ui/Graphic.ts +292 -292
  463. package/src/engine-components/ui/Image.ts +135 -135
  464. package/src/engine-components/ui/InputField.ts +330 -330
  465. package/src/engine-components/ui/Interfaces.ts +57 -57
  466. package/src/engine-components/ui/Layout.ts +339 -339
  467. package/src/engine-components/ui/Outline.ts +20 -20
  468. package/src/engine-components/ui/PointerEvents.ts +215 -215
  469. package/src/engine-components/ui/RaycastUtils.ts +70 -70
  470. package/src/engine-components/ui/Raycaster.ts +171 -171
  471. package/src/engine-components/ui/RectTransform.ts +381 -381
  472. package/src/engine-components/ui/SpatialHtml.ts +86 -86
  473. package/src/engine-components/ui/Symbols.ts +1 -1
  474. package/src/engine-components/ui/Text.ts +747 -747
  475. package/src/engine-components/ui/Utils.ts +113 -113
  476. package/src/engine-components/ui/index.ts +1 -1
  477. package/src/engine-components/utils/EnvironmentScene.ts +245 -245
  478. package/src/engine-components/utils/LookAt.ts +100 -100
  479. package/src/engine-components/utils/OpenURL.ts +115 -115
  480. package/src/engine-components/web/Clickthrough.ts +214 -214
  481. package/src/engine-components/web/CursorFollow.ts +320 -320
  482. package/src/engine-components/web/HoverAnimation.ts +231 -231
  483. package/src/engine-components/web/ScrollFollow.ts +663 -663
  484. package/src/engine-components/web/ViewBox.ts +426 -426
  485. package/src/engine-components/web/index.ts +4 -4
  486. package/src/engine-components/webxr/Avatar.ts +301 -301
  487. package/src/engine-components/webxr/TeleportTarget.ts +32 -32
  488. package/src/engine-components/webxr/WebARCameraBackground.ts +190 -190
  489. package/src/engine-components/webxr/WebARSessionRoot.ts +887 -887
  490. package/src/engine-components/webxr/WebXR.ts +653 -653
  491. package/src/engine-components/webxr/WebXRAvatar.ts +103 -103
  492. package/src/engine-components/webxr/WebXRImageTracking.ts +976 -976
  493. package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
  494. package/src/engine-components/webxr/WebXRRig.ts +81 -81
  495. package/src/engine-components/webxr/XRFlag.ts +177 -177
  496. package/src/engine-components/webxr/controllers/XRControllerFollow.ts +131 -131
  497. package/src/engine-components/webxr/controllers/XRControllerModel.ts +381 -381
  498. package/src/engine-components/webxr/controllers/XRControllerMovement.ts +562 -562
  499. package/src/engine-components/webxr/index.ts +2 -2
  500. package/src/engine-components/webxr/types.ts +3 -3
  501. package/src/engine-components-experimental/Presentation.ts +13 -13
  502. package/src/engine-components-experimental/api.ts +4 -4
  503. package/src/engine-components-experimental/networking/PlayerSync.ts +456 -456
  504. package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
  505. package/src/engine-schemes/COMPILE_TS.bat +11 -11
  506. package/src/engine-schemes/README.md +1 -1
  507. package/src/engine-schemes/api.ts +12 -12
  508. package/src/engine-schemes/schemes.ts +28 -28
  509. package/src/engine-schemes/synced-camera-model.ts +92 -92
  510. package/src/engine-schemes/synced-transform-model.ts +99 -99
  511. package/src/engine-schemes/syncedCamera.fbs +10 -10
  512. package/src/engine-schemes/transform.ts +50 -50
  513. package/src/engine-schemes/transforms.fbs +26 -26
  514. package/src/engine-schemes/vec.fbs +19 -19
  515. package/src/engine-schemes/vec2.ts +33 -33
  516. package/src/engine-schemes/vec3.ts +38 -38
  517. package/src/engine-schemes/vec4.ts +43 -43
  518. package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
  519. package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
  520. package/src/needle-engine.ts +76 -76
@@ -1,387 +1,387 @@
1
- import { AnimationClip, Object3D } from "three";
2
- import type { Light, Material, PerspectiveCamera } from "three";
3
-
4
- import { AnimatorConditionMode, AnimatorControllerParameterType } from "../engine/extensions/NEEDLE_animator_controller_model.js";
5
- import type { AnimatorControllerModel, Condition, Parameter, State, Transition } from "../engine/extensions/NEEDLE_animator_controller_model.js";
6
- import { InstantiateIdProvider } from "../engine/engine_networking_instantiate.js";
7
- import { AnimatorController } from "./AnimatorController.js";
8
- import { resolveClipSource, track as trackFn, type TrackDescriptor, type TrackOptions, type AnimationKeyframe, type Tween, type Vec3Value, type QuatValue, type EulerValue, type ColorValue } from "./AnimationBuilder.js";
9
-
10
- /** Keyframe array or tween shorthand */
11
- type KF<V> = AnimationKeyframe<V>[] | Tween<V>;
12
-
13
- /** Extracts parameter names of a given type from the builder's tracked parameter map */
14
- type ParamNamesOfType<TParams, PType extends string> = {
15
- [K in keyof TParams & string]: TParams[K] extends PType ? K : never
16
- }[keyof TParams & string];
17
-
18
-
19
- /**
20
- * Configuration for an animation state in the builder
21
- */
22
- export declare type StateOptions = {
23
- /**
24
- * The animation clip for this state. Accepts:
25
- * - A pre-built `AnimationClip`
26
- * - A single {@link TrackDescriptor} from {@link track}
27
- * - An array of {@link TrackDescriptor}s (multiple tracks combined into one clip)
28
- *
29
- * When omitted, use {@link AnimatorControllerBuilder.track .track()} to define animation tracks inline.
30
- */
31
- clip?: AnimationClip | TrackDescriptor | TrackDescriptor[];
32
- /** Whether the animation should loop (default: false) */
33
- loop?: boolean;
34
- /** Base speed multiplier (default: 1) */
35
- speed?: number;
36
- /** Name of a float parameter to multiply with speed */
37
- speedParameter?: string;
38
- /** Normalized cycle offset 0-1 (default: 0) */
39
- cycleOffset?: number;
40
- /** Name of a float parameter to use as cycle offset */
41
- cycleOffsetParameter?: string;
42
- }
43
-
44
- /**
45
- * Configuration for a transition in the builder
46
- */
47
- export declare type TransitionOptions = {
48
- /** Duration of the crossfade in seconds (default: 0) */
49
- duration?: number;
50
- /** Normalized exit time 0-1. When set, the transition waits until the source animation reaches this point before transitioning. */
51
- exitTime?: number;
52
- /** Normalized offset into the destination state's animation (default: 0) */
53
- offset?: number;
54
- /** Whether duration is in seconds (true) or normalized (false) (default: false) */
55
- hasFixedDuration?: boolean;
56
- }
57
-
58
- /** String condition modes for the builder, mapped to {@link AnimatorConditionMode} */
59
- export type ConditionMode = "if" | "ifNot" | "greater" | "less" | "equals" | "notEqual";
60
-
61
- function conditionModeToEnum(mode: ConditionMode): AnimatorConditionMode {
62
- switch (mode) {
63
- case "if": return AnimatorConditionMode.If;
64
- case "ifNot": return AnimatorConditionMode.IfNot;
65
- case "greater": return AnimatorConditionMode.Greater;
66
- case "less": return AnimatorConditionMode.Less;
67
- case "equals": return AnimatorConditionMode.Equals;
68
- case "notEqual": return AnimatorConditionMode.NotEqual;
69
- }
70
- }
71
-
72
- type BuilderTransition = {
73
- to: string;
74
- options: TransitionOptions;
75
- conditions: Array<{ parameter: string; mode: ConditionMode; threshold: number }>;
76
- };
77
-
78
- type BuilderState = {
79
- name: string;
80
- options: StateOptions;
81
- inlineTracks: TrackDescriptor[];
82
- transitions: BuilderTransition[];
83
- };
84
-
85
- /**
86
- * A fluent builder for creating {@link AnimatorController} instances from code.
87
- *
88
- * Use {@link AnimatorControllerBuilder.create} or {@link AnimatorController.build} to create a new builder.
89
- *
90
- * The builder tracks state names and parameter types through the fluent chain,
91
- * providing autocomplete for state names in `.transition()` and type-aware
92
- * `.condition()` calls (e.g., trigger parameters don't require a mode argument).
93
- *
94
- * @example With pre-built AnimationClips
95
- * ```ts
96
- * const controller = AnimatorControllerBuilder.create("CharacterController")
97
- * .floatParameter("Speed", 0)
98
- * .triggerParameter("Jump")
99
- * .state("Idle", { clip: idleClip, loop: true })
100
- * .state("Walk", { clip: walkClip, loop: true })
101
- * .state("Jump", { clip: jumpClip })
102
- * .transition("Idle", "Walk", { duration: 0.25 })
103
- * .condition("Speed", "greater", 0.1)
104
- * .transition("Walk", "Idle", { duration: 0.25 })
105
- * .condition("Speed", "less", 0.1)
106
- * .transition("*", "Jump", { duration: 0.1 })
107
- * .condition("Jump")
108
- * .transition("Jump", "Idle", { hasExitTime: true, exitTime: 0.9, duration: 0.25 })
109
- * .build();
110
- * ```
111
- *
112
- * @example With inline tracks (no pre-built clips needed)
113
- * ```ts
114
- * const controller = AnimatorControllerBuilder.create("Door")
115
- * .boolParameter("Open", false)
116
- * .state("Closed", { loop: true })
117
- * .track(door, "position", { from: [0, 0, 0], to: [0, 0, 0], duration: 1 })
118
- * .state("Open", { loop: true })
119
- * .track(door, "position", { from: [0, 0, 0], to: [2, 0, 0], duration: 1 })
120
- * .track(light, "intensity", { from: 0, to: 5, duration: 1 })
121
- * .transition("Closed", "Open", { duration: 0.25 })
122
- * .condition("Open", "if")
123
- * .transition("Open", "Closed", { duration: 0.25 })
124
- * .condition("Open", "ifNot")
125
- * .build(room);
126
- * ```
127
- *
128
- * @typeParam TStates - Union of state names added via `.state()`. Used for autocomplete and validation in `.transition()` and `.defaultState()`.
129
- * @typeParam TParams - Record mapping parameter names to their types (`"trigger"`, `"bool"`, `"float"`, `"int"`). Used for type-aware `.condition()` overloads.
130
- *
131
- * @category Animation and Sequencing
132
- * @group Utilities
133
- */
134
- export class AnimatorControllerBuilder<
135
- TStates extends string = never,
136
- TParams extends Record<string, "trigger" | "bool" | "float" | "int"> = {},
137
- > {
138
- private _name: string;
139
- private _parameters: Parameter[] = [];
140
- private _states: BuilderState[] = [];
141
- private _anyStateTransitions: BuilderTransition[] = [];
142
- private _defaultStateName: string | null = null;
143
- private _lastTransition: BuilderTransition | null = null;
144
- private _lastState: BuilderState | null = null;
145
-
146
- /**
147
- * Creates a new AnimatorControllerBuilder instance.
148
- * @param name - Optional name for the controller
149
- */
150
- static create(name?: string): AnimatorControllerBuilder {
151
- return new AnimatorControllerBuilder(name);
152
- }
153
-
154
- constructor(name?: string) {
155
- this._name = name ?? "AnimatorController";
156
- }
157
-
158
- /** Adds a float parameter */
159
- floatParameter<N extends string>(name: N, defaultValue: number = 0): AnimatorControllerBuilder<TStates, TParams & Record<N, "float">> {
160
- this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Float, value: defaultValue });
161
- return this as any;
162
- }
163
-
164
- /** Adds an integer parameter */
165
- intParameter<N extends string>(name: N, defaultValue: number = 0): AnimatorControllerBuilder<TStates, TParams & Record<N, "int">> {
166
- this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Int, value: defaultValue });
167
- return this as any;
168
- }
169
-
170
- /** Adds a boolean parameter */
171
- boolParameter<N extends string>(name: N, defaultValue: boolean = false): AnimatorControllerBuilder<TStates, TParams & Record<N, "bool">> {
172
- this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Bool, value: defaultValue });
173
- return this as any;
174
- }
175
-
176
- /** Adds a trigger parameter */
177
- triggerParameter<N extends string>(name: N): AnimatorControllerBuilder<TStates, TParams & Record<N, "trigger">> {
178
- this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Trigger, value: false });
179
- return this as any;
180
- }
181
-
182
- /**
183
- * Adds a state to the controller. The first state added becomes the default state.
184
- *
185
- * When `options.clip` is provided, the state uses that clip directly.
186
- * When omitted, chain `.track()` calls to define animation tracks inline:
187
- * ```ts
188
- * .state("Open", { loop: true })
189
- * .track(door, "position", { from: [0,0,0], to: [2,0,0], duration: 1 })
190
- * .track(light, "intensity", { from: 0, to: 5, duration: 1 })
191
- * ```
192
- *
193
- * @param name - Unique name for the state
194
- * @param options - State configuration including clip, loop, speed. When omitted, use `.track()` to add animation data.
195
- */
196
- state<N extends string>(name: N, options?: StateOptions): AnimatorControllerBuilder<TStates | N, TParams> {
197
- const state: BuilderState = { name, options: options ?? {}, inlineTracks: [], transitions: [] };
198
- this._states.push(state);
199
- this._lastState = state;
200
- return this as any;
201
- }
202
-
203
- /**
204
- * Adds a transition between two states.
205
- * Use `"*"` as the source to create a transition from any state.
206
- * Chain `.condition()` calls after this to add conditions.
207
- * @param from - Source state name, or `"*"` for any-state transition
208
- * @param to - Destination state name
209
- * @param options - Transition configuration
210
- */
211
- transition(from: TStates | "*", to: TStates, options?: TransitionOptions): AnimatorControllerBuilder<TStates, TParams> {
212
- this._lastState = null;
213
- const t: BuilderTransition = { to: to as string, options: options ?? {}, conditions: [] };
214
- if (from === "*") {
215
- this._anyStateTransitions.push(t);
216
- }
217
- else {
218
- const state = this._states.find(s => s.name === from);
219
- if (!state) throw new Error(`AnimatorControllerBuilder: source state "${from}" not found. Add it with .state() first.`);
220
- state.transitions.push(t);
221
- }
222
- this._lastTransition = t;
223
- return this as any;
224
- }
225
-
226
- /**
227
- * Adds a condition to the most recently added transition.
228
- * Multiple conditions on the same transition are AND-ed together.
229
- *
230
- * The required arguments depend on the parameter type:
231
- * - **Trigger**: `.condition("Jump")` — mode defaults to `"if"`, no threshold needed
232
- * - **Bool**: `.condition("Open", "if")` or `.condition("Open", "ifNot")`
233
- * - **Float/Int**: `.condition("Speed", "greater", 0.1)`
234
- *
235
- * @param parameter - Name of the parameter to evaluate
236
- */
237
- // Trigger parameters: mode is optional (defaults to "if")
238
- condition(parameter: ParamNamesOfType<TParams, "trigger">, mode?: "if" | "ifNot"): AnimatorControllerBuilder<TStates, TParams>;
239
- // Bool parameters: mode is required
240
- condition(parameter: ParamNamesOfType<TParams, "bool">, mode: "if" | "ifNot"): AnimatorControllerBuilder<TStates, TParams>;
241
- // Float/Int parameters: mode and optional threshold
242
- condition(parameter: ParamNamesOfType<TParams, "float" | "int">, mode: "greater" | "less" | "equals" | "notEqual", threshold?: number): AnimatorControllerBuilder<TStates, TParams>;
243
- condition(parameter: string, mode?: ConditionMode, threshold?: number): AnimatorControllerBuilder<TStates, TParams> {
244
- if (!this._lastTransition) throw new Error("AnimatorControllerBuilder: .condition() must be called after .transition()");
245
- this._lastTransition.conditions.push({ parameter, mode: mode ?? "if", threshold: threshold ?? 0 });
246
- return this as any;
247
- }
248
-
249
- // --- Object3D ---
250
- /** Adds an animation track for an Object3D's position or scale to the current state */
251
- track(target: Object3D, property: "position" | "scale", keyframes: KF<Vec3Value>, options?: TrackOptions): this;
252
- /** Adds an animation track for an Object3D's quaternion to the current state */
253
- track(target: Object3D, property: "quaternion", keyframes: KF<QuatValue>, options?: TrackOptions): this;
254
- /** Adds an animation track for an Object3D's rotation (Euler, converted to quaternion) to the current state */
255
- track(target: Object3D, property: "rotation", keyframes: KF<EulerValue>, options?: TrackOptions): this;
256
- /** Adds an animation track for an Object3D's visibility to the current state */
257
- track(target: Object3D, property: "visible", keyframes: KF<boolean>, options?: TrackOptions): this;
258
- // --- Material ---
259
- /** Adds an animation track for a material's numeric property to the current state */
260
- track(target: Material, property: "opacity" | "roughness" | "metalness" | "alphaTest" | "emissiveIntensity" | "envMapIntensity" | "bumpScale" | "displacementScale" | "displacementBias", keyframes: KF<number>, options?: TrackOptions): this;
261
- /** Adds an animation track for a material's color property to the current state */
262
- track(target: Material, property: "color" | "emissive", keyframes: KF<ColorValue>, options?: TrackOptions): this;
263
- // --- Light ---
264
- /** Adds an animation track for a light's numeric property to the current state */
265
- track(target: Light, property: "intensity" | "distance" | "angle" | "penumbra" | "decay", keyframes: KF<number>, options?: TrackOptions): this;
266
- /** Adds an animation track for a light's color to the current state */
267
- track(target: Light, property: "color", keyframes: KF<ColorValue>, options?: TrackOptions): this;
268
- // --- Camera ---
269
- /** Adds an animation track for a camera's numeric property to the current state */
270
- track(target: PerspectiveCamera, property: "fov" | "near" | "far" | "zoom", keyframes: KF<number>, options?: TrackOptions): this;
271
- /**
272
- * Adds an animation track to the most recently added state.
273
- * Must be called after `.state()`. The track has the same type-safe overloads
274
- * as the standalone {@link track} function.
275
- *
276
- * @param target - The object whose type determines valid properties and value types
277
- * @param property - The property to animate
278
- * @param keyframes - Keyframe array or {@link Tween} shorthand
279
- * @param options - Optional {@link TrackOptions} with a `root` for named targeting
280
- */
281
- track(target: object, property: string, keyframes: KF<any>, options?: TrackOptions): this {
282
- if (!this._lastState) throw new Error("AnimatorControllerBuilder: .track() must be called after .state()");
283
- if (this._lastState.options.clip) throw new Error(`AnimatorControllerBuilder: state "${this._lastState.name}" already has a clip. Use either .track() or { clip: ... }, not both.`);
284
- this._lastState.inlineTracks.push(trackFn(target as Object3D, property as "position", keyframes, options));
285
- return this;
286
- }
287
-
288
- /**
289
- * Sets which state is the default/entry state.
290
- * If not called, the first added state is used.
291
- * @param name - Name of the state
292
- */
293
- defaultState(name: TStates): AnimatorControllerBuilder<TStates, TParams> {
294
- this._defaultStateName = name as string;
295
- return this as any;
296
- }
297
-
298
- /**
299
- * Builds and returns the {@link AnimatorController}.
300
- * Resolves all state name references to indices.
301
- * @param root - Optional root Object3D for resolving {@link TrackDescriptor} track paths.
302
- * When provided, tracks targeting a different object use `target.name` for named resolution.
303
- */
304
- build(root?: Object3D): AnimatorController {
305
- const stateIndexMap = new Map<string, number>();
306
- this._states.forEach((s, i) => stateIndexMap.set(s.name, i));
307
-
308
- let defaultStateIndex = 0;
309
- if (this._defaultStateName !== null) {
310
- const idx = stateIndexMap.get(this._defaultStateName);
311
- if (idx === undefined) throw new Error(`AnimatorControllerBuilder: default state "${this._defaultStateName}" not found`);
312
- defaultStateIndex = idx;
313
- }
314
-
315
- const resolveTransition = (t: BuilderTransition): Transition => {
316
- const destIndex = stateIndexMap.get(t.to);
317
- if (destIndex === undefined) throw new Error(`AnimatorControllerBuilder: transition target "${t.to}" not found`);
318
- return {
319
- exitTime: t.options.exitTime ?? 1,
320
- hasExitTime: t.options.exitTime !== undefined,
321
- duration: t.options.duration ?? 0,
322
- offset: t.options.offset ?? 0,
323
- hasFixedDuration: t.options.hasFixedDuration ?? false,
324
- destinationState: destIndex,
325
- conditions: t.conditions.map(c => ({
326
- parameter: c.parameter,
327
- mode: conditionModeToEnum(c.mode),
328
- threshold: c.threshold,
329
- })),
330
- };
331
- };
332
-
333
- const states: State[] = this._states.map((s, index) => {
334
- const transitions: Transition[] = s.transitions.map(resolveTransition);
335
-
336
- // Replicate any-state transitions onto every state (except self-targeting)
337
- for (const anyT of this._anyStateTransitions) {
338
- const destIndex = stateIndexMap.get(anyT.to);
339
- if (destIndex === index) continue;
340
- transitions.push(resolveTransition(anyT));
341
- }
342
-
343
- // Resolve clip: from options.clip, inline .track() calls, or error
344
- let clip: AnimationClip;
345
- if (s.options.clip) {
346
- clip = resolveClipSource(s.options.clip, root);
347
- }
348
- else if (s.inlineTracks.length > 0) {
349
- clip = resolveClipSource(s.inlineTracks, root);
350
- }
351
- else {
352
- throw new Error(`AnimatorControllerBuilder: state "${s.name}" has no clip and no inline tracks. Provide { clip } or chain .track() calls.`);
353
- }
354
-
355
- return {
356
- name: s.name,
357
- hash: index,
358
- motion: {
359
- name: clip.name,
360
- clip: clip,
361
- isLooping: s.options.loop ?? false,
362
- },
363
- transitions,
364
- behaviours: [],
365
- speed: s.options.speed,
366
- speedParameter: s.options.speedParameter,
367
- cycleOffset: s.options.cycleOffset,
368
- cycleOffsetParameter: s.options.cycleOffsetParameter,
369
- };
370
- });
371
-
372
- const model: AnimatorControllerModel = {
373
- name: this._name,
374
- guid: new InstantiateIdProvider(Date.now()).generateUUID(),
375
- parameters: this._parameters,
376
- layers: [{
377
- name: "Base Layer",
378
- stateMachine: {
379
- defaultState: defaultStateIndex,
380
- states,
381
- }
382
- }],
383
- };
384
-
385
- return new AnimatorController(model);
386
- }
387
- }
1
+ import { AnimationClip, Object3D } from "three";
2
+ import type { Light, Material, PerspectiveCamera } from "three";
3
+
4
+ import { AnimatorConditionMode, AnimatorControllerParameterType } from "../engine/extensions/NEEDLE_animator_controller_model.js";
5
+ import type { AnimatorControllerModel, Condition, Parameter, State, Transition } from "../engine/extensions/NEEDLE_animator_controller_model.js";
6
+ import { InstantiateIdProvider } from "../engine/engine_networking_instantiate.js";
7
+ import { AnimatorController } from "./AnimatorController.js";
8
+ import { resolveClipSource, track as trackFn, type TrackDescriptor, type TrackOptions, type AnimationKeyframe, type Tween, type Vec3Value, type QuatValue, type EulerValue, type ColorValue } from "./AnimationBuilder.js";
9
+
10
+ /** Keyframe array or tween shorthand */
11
+ type KF<V> = AnimationKeyframe<V>[] | Tween<V>;
12
+
13
+ /** Extracts parameter names of a given type from the builder's tracked parameter map */
14
+ type ParamNamesOfType<TParams, PType extends string> = {
15
+ [K in keyof TParams & string]: TParams[K] extends PType ? K : never
16
+ }[keyof TParams & string];
17
+
18
+
19
+ /**
20
+ * Configuration for an animation state in the builder
21
+ */
22
+ export declare type StateOptions = {
23
+ /**
24
+ * The animation clip for this state. Accepts:
25
+ * - A pre-built `AnimationClip`
26
+ * - A single {@link TrackDescriptor} from {@link track}
27
+ * - An array of {@link TrackDescriptor}s (multiple tracks combined into one clip)
28
+ *
29
+ * When omitted, use {@link AnimatorControllerBuilder.track .track()} to define animation tracks inline.
30
+ */
31
+ clip?: AnimationClip | TrackDescriptor | TrackDescriptor[];
32
+ /** Whether the animation should loop (default: false) */
33
+ loop?: boolean;
34
+ /** Base speed multiplier (default: 1) */
35
+ speed?: number;
36
+ /** Name of a float parameter to multiply with speed */
37
+ speedParameter?: string;
38
+ /** Normalized cycle offset 0-1 (default: 0) */
39
+ cycleOffset?: number;
40
+ /** Name of a float parameter to use as cycle offset */
41
+ cycleOffsetParameter?: string;
42
+ }
43
+
44
+ /**
45
+ * Configuration for a transition in the builder
46
+ */
47
+ export declare type TransitionOptions = {
48
+ /** Duration of the crossfade in seconds (default: 0) */
49
+ duration?: number;
50
+ /** Normalized exit time 0-1. When set, the transition waits until the source animation reaches this point before transitioning. */
51
+ exitTime?: number;
52
+ /** Normalized offset into the destination state's animation (default: 0) */
53
+ offset?: number;
54
+ /** Whether duration is in seconds (true) or normalized (false) (default: false) */
55
+ hasFixedDuration?: boolean;
56
+ }
57
+
58
+ /** String condition modes for the builder, mapped to {@link AnimatorConditionMode} */
59
+ export type ConditionMode = "if" | "ifNot" | "greater" | "less" | "equals" | "notEqual";
60
+
61
+ function conditionModeToEnum(mode: ConditionMode): AnimatorConditionMode {
62
+ switch (mode) {
63
+ case "if": return AnimatorConditionMode.If;
64
+ case "ifNot": return AnimatorConditionMode.IfNot;
65
+ case "greater": return AnimatorConditionMode.Greater;
66
+ case "less": return AnimatorConditionMode.Less;
67
+ case "equals": return AnimatorConditionMode.Equals;
68
+ case "notEqual": return AnimatorConditionMode.NotEqual;
69
+ }
70
+ }
71
+
72
+ type BuilderTransition = {
73
+ to: string;
74
+ options: TransitionOptions;
75
+ conditions: Array<{ parameter: string; mode: ConditionMode; threshold: number }>;
76
+ };
77
+
78
+ type BuilderState = {
79
+ name: string;
80
+ options: StateOptions;
81
+ inlineTracks: TrackDescriptor[];
82
+ transitions: BuilderTransition[];
83
+ };
84
+
85
+ /**
86
+ * A fluent builder for creating {@link AnimatorController} instances from code.
87
+ *
88
+ * Use {@link AnimatorControllerBuilder.create} or {@link AnimatorController.build} to create a new builder.
89
+ *
90
+ * The builder tracks state names and parameter types through the fluent chain,
91
+ * providing autocomplete for state names in `.transition()` and type-aware
92
+ * `.condition()` calls (e.g., trigger parameters don't require a mode argument).
93
+ *
94
+ * @example With pre-built AnimationClips
95
+ * ```ts
96
+ * const controller = AnimatorControllerBuilder.create("CharacterController")
97
+ * .floatParameter("Speed", 0)
98
+ * .triggerParameter("Jump")
99
+ * .state("Idle", { clip: idleClip, loop: true })
100
+ * .state("Walk", { clip: walkClip, loop: true })
101
+ * .state("Jump", { clip: jumpClip })
102
+ * .transition("Idle", "Walk", { duration: 0.25 })
103
+ * .condition("Speed", "greater", 0.1)
104
+ * .transition("Walk", "Idle", { duration: 0.25 })
105
+ * .condition("Speed", "less", 0.1)
106
+ * .transition("*", "Jump", { duration: 0.1 })
107
+ * .condition("Jump")
108
+ * .transition("Jump", "Idle", { hasExitTime: true, exitTime: 0.9, duration: 0.25 })
109
+ * .build();
110
+ * ```
111
+ *
112
+ * @example With inline tracks (no pre-built clips needed)
113
+ * ```ts
114
+ * const controller = AnimatorControllerBuilder.create("Door")
115
+ * .boolParameter("Open", false)
116
+ * .state("Closed", { loop: true })
117
+ * .track(door, "position", { from: [0, 0, 0], to: [0, 0, 0], duration: 1 })
118
+ * .state("Open", { loop: true })
119
+ * .track(door, "position", { from: [0, 0, 0], to: [2, 0, 0], duration: 1 })
120
+ * .track(light, "intensity", { from: 0, to: 5, duration: 1 })
121
+ * .transition("Closed", "Open", { duration: 0.25 })
122
+ * .condition("Open", "if")
123
+ * .transition("Open", "Closed", { duration: 0.25 })
124
+ * .condition("Open", "ifNot")
125
+ * .build(room);
126
+ * ```
127
+ *
128
+ * @typeParam TStates - Union of state names added via `.state()`. Used for autocomplete and validation in `.transition()` and `.defaultState()`.
129
+ * @typeParam TParams - Record mapping parameter names to their types (`"trigger"`, `"bool"`, `"float"`, `"int"`). Used for type-aware `.condition()` overloads.
130
+ *
131
+ * @category Animation and Sequencing
132
+ * @group Utilities
133
+ */
134
+ export class AnimatorControllerBuilder<
135
+ TStates extends string = never,
136
+ TParams extends Record<string, "trigger" | "bool" | "float" | "int"> = {},
137
+ > {
138
+ private _name: string;
139
+ private _parameters: Parameter[] = [];
140
+ private _states: BuilderState[] = [];
141
+ private _anyStateTransitions: BuilderTransition[] = [];
142
+ private _defaultStateName: string | null = null;
143
+ private _lastTransition: BuilderTransition | null = null;
144
+ private _lastState: BuilderState | null = null;
145
+
146
+ /**
147
+ * Creates a new AnimatorControllerBuilder instance.
148
+ * @param name - Optional name for the controller
149
+ */
150
+ static create(name?: string): AnimatorControllerBuilder {
151
+ return new AnimatorControllerBuilder(name);
152
+ }
153
+
154
+ constructor(name?: string) {
155
+ this._name = name ?? "AnimatorController";
156
+ }
157
+
158
+ /** Adds a float parameter */
159
+ floatParameter<N extends string>(name: N, defaultValue: number = 0): AnimatorControllerBuilder<TStates, TParams & Record<N, "float">> {
160
+ this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Float, value: defaultValue });
161
+ return this as any;
162
+ }
163
+
164
+ /** Adds an integer parameter */
165
+ intParameter<N extends string>(name: N, defaultValue: number = 0): AnimatorControllerBuilder<TStates, TParams & Record<N, "int">> {
166
+ this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Int, value: defaultValue });
167
+ return this as any;
168
+ }
169
+
170
+ /** Adds a boolean parameter */
171
+ boolParameter<N extends string>(name: N, defaultValue: boolean = false): AnimatorControllerBuilder<TStates, TParams & Record<N, "bool">> {
172
+ this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Bool, value: defaultValue });
173
+ return this as any;
174
+ }
175
+
176
+ /** Adds a trigger parameter */
177
+ triggerParameter<N extends string>(name: N): AnimatorControllerBuilder<TStates, TParams & Record<N, "trigger">> {
178
+ this._parameters.push({ name, hash: this._parameters.length, type: AnimatorControllerParameterType.Trigger, value: false });
179
+ return this as any;
180
+ }
181
+
182
+ /**
183
+ * Adds a state to the controller. The first state added becomes the default state.
184
+ *
185
+ * When `options.clip` is provided, the state uses that clip directly.
186
+ * When omitted, chain `.track()` calls to define animation tracks inline:
187
+ * ```ts
188
+ * .state("Open", { loop: true })
189
+ * .track(door, "position", { from: [0,0,0], to: [2,0,0], duration: 1 })
190
+ * .track(light, "intensity", { from: 0, to: 5, duration: 1 })
191
+ * ```
192
+ *
193
+ * @param name - Unique name for the state
194
+ * @param options - State configuration including clip, loop, speed. When omitted, use `.track()` to add animation data.
195
+ */
196
+ state<N extends string>(name: N, options?: StateOptions): AnimatorControllerBuilder<TStates | N, TParams> {
197
+ const state: BuilderState = { name, options: options ?? {}, inlineTracks: [], transitions: [] };
198
+ this._states.push(state);
199
+ this._lastState = state;
200
+ return this as any;
201
+ }
202
+
203
+ /**
204
+ * Adds a transition between two states.
205
+ * Use `"*"` as the source to create a transition from any state.
206
+ * Chain `.condition()` calls after this to add conditions.
207
+ * @param from - Source state name, or `"*"` for any-state transition
208
+ * @param to - Destination state name
209
+ * @param options - Transition configuration
210
+ */
211
+ transition(from: TStates | "*", to: TStates, options?: TransitionOptions): AnimatorControllerBuilder<TStates, TParams> {
212
+ this._lastState = null;
213
+ const t: BuilderTransition = { to: to as string, options: options ?? {}, conditions: [] };
214
+ if (from === "*") {
215
+ this._anyStateTransitions.push(t);
216
+ }
217
+ else {
218
+ const state = this._states.find(s => s.name === from);
219
+ if (!state) throw new Error(`AnimatorControllerBuilder: source state "${from}" not found. Add it with .state() first.`);
220
+ state.transitions.push(t);
221
+ }
222
+ this._lastTransition = t;
223
+ return this as any;
224
+ }
225
+
226
+ /**
227
+ * Adds a condition to the most recently added transition.
228
+ * Multiple conditions on the same transition are AND-ed together.
229
+ *
230
+ * The required arguments depend on the parameter type:
231
+ * - **Trigger**: `.condition("Jump")` — mode defaults to `"if"`, no threshold needed
232
+ * - **Bool**: `.condition("Open", "if")` or `.condition("Open", "ifNot")`
233
+ * - **Float/Int**: `.condition("Speed", "greater", 0.1)`
234
+ *
235
+ * @param parameter - Name of the parameter to evaluate
236
+ */
237
+ // Trigger parameters: mode is optional (defaults to "if")
238
+ condition(parameter: ParamNamesOfType<TParams, "trigger">, mode?: "if" | "ifNot"): AnimatorControllerBuilder<TStates, TParams>;
239
+ // Bool parameters: mode is required
240
+ condition(parameter: ParamNamesOfType<TParams, "bool">, mode: "if" | "ifNot"): AnimatorControllerBuilder<TStates, TParams>;
241
+ // Float/Int parameters: mode and optional threshold
242
+ condition(parameter: ParamNamesOfType<TParams, "float" | "int">, mode: "greater" | "less" | "equals" | "notEqual", threshold?: number): AnimatorControllerBuilder<TStates, TParams>;
243
+ condition(parameter: string, mode?: ConditionMode, threshold?: number): AnimatorControllerBuilder<TStates, TParams> {
244
+ if (!this._lastTransition) throw new Error("AnimatorControllerBuilder: .condition() must be called after .transition()");
245
+ this._lastTransition.conditions.push({ parameter, mode: mode ?? "if", threshold: threshold ?? 0 });
246
+ return this as any;
247
+ }
248
+
249
+ // --- Object3D ---
250
+ /** Adds an animation track for an Object3D's position or scale to the current state */
251
+ track(target: Object3D, property: "position" | "scale", keyframes: KF<Vec3Value>, options?: TrackOptions): this;
252
+ /** Adds an animation track for an Object3D's quaternion to the current state */
253
+ track(target: Object3D, property: "quaternion", keyframes: KF<QuatValue>, options?: TrackOptions): this;
254
+ /** Adds an animation track for an Object3D's rotation (Euler, converted to quaternion) to the current state */
255
+ track(target: Object3D, property: "rotation", keyframes: KF<EulerValue>, options?: TrackOptions): this;
256
+ /** Adds an animation track for an Object3D's visibility to the current state */
257
+ track(target: Object3D, property: "visible", keyframes: KF<boolean>, options?: TrackOptions): this;
258
+ // --- Material ---
259
+ /** Adds an animation track for a material's numeric property to the current state */
260
+ track(target: Material, property: "opacity" | "roughness" | "metalness" | "alphaTest" | "emissiveIntensity" | "envMapIntensity" | "bumpScale" | "displacementScale" | "displacementBias", keyframes: KF<number>, options?: TrackOptions): this;
261
+ /** Adds an animation track for a material's color property to the current state */
262
+ track(target: Material, property: "color" | "emissive", keyframes: KF<ColorValue>, options?: TrackOptions): this;
263
+ // --- Light ---
264
+ /** Adds an animation track for a light's numeric property to the current state */
265
+ track(target: Light, property: "intensity" | "distance" | "angle" | "penumbra" | "decay", keyframes: KF<number>, options?: TrackOptions): this;
266
+ /** Adds an animation track for a light's color to the current state */
267
+ track(target: Light, property: "color", keyframes: KF<ColorValue>, options?: TrackOptions): this;
268
+ // --- Camera ---
269
+ /** Adds an animation track for a camera's numeric property to the current state */
270
+ track(target: PerspectiveCamera, property: "fov" | "near" | "far" | "zoom", keyframes: KF<number>, options?: TrackOptions): this;
271
+ /**
272
+ * Adds an animation track to the most recently added state.
273
+ * Must be called after `.state()`. The track has the same type-safe overloads
274
+ * as the standalone {@link track} function.
275
+ *
276
+ * @param target - The object whose type determines valid properties and value types
277
+ * @param property - The property to animate
278
+ * @param keyframes - Keyframe array or {@link Tween} shorthand
279
+ * @param options - Optional {@link TrackOptions} with a `root` for named targeting
280
+ */
281
+ track(target: object, property: string, keyframes: KF<any>, options?: TrackOptions): this {
282
+ if (!this._lastState) throw new Error("AnimatorControllerBuilder: .track() must be called after .state()");
283
+ if (this._lastState.options.clip) throw new Error(`AnimatorControllerBuilder: state "${this._lastState.name}" already has a clip. Use either .track() or { clip: ... }, not both.`);
284
+ this._lastState.inlineTracks.push(trackFn(target as Object3D, property as "position", keyframes, options));
285
+ return this;
286
+ }
287
+
288
+ /**
289
+ * Sets which state is the default/entry state.
290
+ * If not called, the first added state is used.
291
+ * @param name - Name of the state
292
+ */
293
+ defaultState(name: TStates): AnimatorControllerBuilder<TStates, TParams> {
294
+ this._defaultStateName = name as string;
295
+ return this as any;
296
+ }
297
+
298
+ /**
299
+ * Builds and returns the {@link AnimatorController}.
300
+ * Resolves all state name references to indices.
301
+ * @param root - Optional root Object3D for resolving {@link TrackDescriptor} track paths.
302
+ * When provided, tracks targeting a different object use `target.name` for named resolution.
303
+ */
304
+ build(root?: Object3D): AnimatorController {
305
+ const stateIndexMap = new Map<string, number>();
306
+ this._states.forEach((s, i) => stateIndexMap.set(s.name, i));
307
+
308
+ let defaultStateIndex = 0;
309
+ if (this._defaultStateName !== null) {
310
+ const idx = stateIndexMap.get(this._defaultStateName);
311
+ if (idx === undefined) throw new Error(`AnimatorControllerBuilder: default state "${this._defaultStateName}" not found`);
312
+ defaultStateIndex = idx;
313
+ }
314
+
315
+ const resolveTransition = (t: BuilderTransition): Transition => {
316
+ const destIndex = stateIndexMap.get(t.to);
317
+ if (destIndex === undefined) throw new Error(`AnimatorControllerBuilder: transition target "${t.to}" not found`);
318
+ return {
319
+ exitTime: t.options.exitTime ?? 1,
320
+ hasExitTime: t.options.exitTime !== undefined,
321
+ duration: t.options.duration ?? 0,
322
+ offset: t.options.offset ?? 0,
323
+ hasFixedDuration: t.options.hasFixedDuration ?? false,
324
+ destinationState: destIndex,
325
+ conditions: t.conditions.map(c => ({
326
+ parameter: c.parameter,
327
+ mode: conditionModeToEnum(c.mode),
328
+ threshold: c.threshold,
329
+ })),
330
+ };
331
+ };
332
+
333
+ const states: State[] = this._states.map((s, index) => {
334
+ const transitions: Transition[] = s.transitions.map(resolveTransition);
335
+
336
+ // Replicate any-state transitions onto every state (except self-targeting)
337
+ for (const anyT of this._anyStateTransitions) {
338
+ const destIndex = stateIndexMap.get(anyT.to);
339
+ if (destIndex === index) continue;
340
+ transitions.push(resolveTransition(anyT));
341
+ }
342
+
343
+ // Resolve clip: from options.clip, inline .track() calls, or error
344
+ let clip: AnimationClip;
345
+ if (s.options.clip) {
346
+ clip = resolveClipSource(s.options.clip, root);
347
+ }
348
+ else if (s.inlineTracks.length > 0) {
349
+ clip = resolveClipSource(s.inlineTracks, root);
350
+ }
351
+ else {
352
+ throw new Error(`AnimatorControllerBuilder: state "${s.name}" has no clip and no inline tracks. Provide { clip } or chain .track() calls.`);
353
+ }
354
+
355
+ return {
356
+ name: s.name,
357
+ hash: index,
358
+ motion: {
359
+ name: clip.name,
360
+ clip: clip,
361
+ isLooping: s.options.loop ?? false,
362
+ },
363
+ transitions,
364
+ behaviours: [],
365
+ speed: s.options.speed,
366
+ speedParameter: s.options.speedParameter,
367
+ cycleOffset: s.options.cycleOffset,
368
+ cycleOffsetParameter: s.options.cycleOffsetParameter,
369
+ };
370
+ });
371
+
372
+ const model: AnimatorControllerModel = {
373
+ name: this._name,
374
+ guid: new InstantiateIdProvider(Date.now()).generateUUID(),
375
+ parameters: this._parameters,
376
+ layers: [{
377
+ name: "Base Layer",
378
+ stateMachine: {
379
+ defaultState: defaultStateIndex,
380
+ states,
381
+ }
382
+ }],
383
+ };
384
+
385
+ return new AnimatorController(model);
386
+ }
387
+ }