lecodes-sdk 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/README.md +114 -0
  2. package/dist/global.d.ts +503 -0
  3. package/dist/host.d.ts +61 -0
  4. package/dist/inject.js +4730 -0
  5. package/dist/types/animate/animate.d.ts +20 -0
  6. package/dist/types/animate/bezier.d.ts +2 -0
  7. package/dist/types/animate/easings.d.ts +21 -0
  8. package/dist/types/canvas/Canvas.d.ts +168 -0
  9. package/dist/types/core/Aspect.d.ts +171 -0
  10. package/dist/types/core/InspectorUI.d.ts +88 -0
  11. package/dist/types/core/StateMachine.d.ts +81 -0
  12. package/dist/types/core/color.d.ts +13 -0
  13. package/dist/types/core/compWrite.d.ts +11 -0
  14. package/dist/types/core/events.d.ts +11 -0
  15. package/dist/types/core/fields.d.ts +58 -0
  16. package/dist/types/core/registry.d.ts +7 -0
  17. package/dist/types/core/signals.d.ts +29 -0
  18. package/dist/types/core/time.d.ts +31 -0
  19. package/dist/types/g2/Camera2D.d.ts +19 -0
  20. package/dist/types/g2/CharacterController2D.d.ts +134 -0
  21. package/dist/types/g2/Node2D.d.ts +91 -0
  22. package/dist/types/g2/OneWay2D.d.ts +24 -0
  23. package/dist/types/g2/Physics2D.d.ts +147 -0
  24. package/dist/types/g2/Scene2D.d.ts +72 -0
  25. package/dist/types/g2/Shape2D.d.ts +58 -0
  26. package/dist/types/g2/Sprite.d.ts +51 -0
  27. package/dist/types/g2/SpriteAnimation.d.ts +50 -0
  28. package/dist/types/g2/SpriteSheet.d.ts +69 -0
  29. package/dist/types/g2/Texture2D.d.ts +16 -0
  30. package/dist/types/g2/Tilemap.d.ts +20 -0
  31. package/dist/types/g2/Tileset.d.ts +32 -0
  32. package/dist/types/g2/Trigger2D.d.ts +20 -0
  33. package/dist/types/g2/autotile.d.ts +133 -0
  34. package/dist/types/g2/cells.d.ts +14 -0
  35. package/dist/types/g2/defineScene2d.d.ts +141 -0
  36. package/dist/types/g2/groups2d.d.ts +16 -0
  37. package/dist/types/g2/loop.d.ts +4 -0
  38. package/dist/types/g2/scenarios2d.d.ts +30 -0
  39. package/dist/types/g2/touch.d.ts +2 -0
  40. package/dist/types/gl/Camera.d.ts +79 -0
  41. package/dist/types/gl/CameraPlace.d.ts +26 -0
  42. package/dist/types/gl/CharacterController.d.ts +98 -0
  43. package/dist/types/gl/Gearbox.d.ts +86 -0
  44. package/dist/types/gl/Geometry.d.ts +39 -0
  45. package/dist/types/gl/IK.d.ts +53 -0
  46. package/dist/types/gl/InstancedMesh.d.ts +46 -0
  47. package/dist/types/gl/Light.d.ts +73 -0
  48. package/dist/types/gl/Lightmap.d.ts +85 -0
  49. package/dist/types/gl/Locomotion.d.ts +279 -0
  50. package/dist/types/gl/Material.d.ts +100 -0
  51. package/dist/types/gl/Mesh.d.ts +33 -0
  52. package/dist/types/gl/Model.d.ts +53 -0
  53. package/dist/types/gl/NavAgent.d.ts +99 -0
  54. package/dist/types/gl/NavMesh.d.ts +169 -0
  55. package/dist/types/gl/Node.d.ts +99 -0
  56. package/dist/types/gl/Noise.d.ts +20 -0
  57. package/dist/types/gl/Particles.d.ts +277 -0
  58. package/dist/types/gl/Physics.d.ts +91 -0
  59. package/dist/types/gl/Plane.d.ts +19 -0
  60. package/dist/types/gl/Ragdoll.d.ts +86 -0
  61. package/dist/types/gl/Ray.d.ts +8 -0
  62. package/dist/types/gl/Scene.d.ts +221 -0
  63. package/dist/types/gl/Shape.d.ts +122 -0
  64. package/dist/types/gl/Terrain.d.ts +280 -0
  65. package/dist/types/gl/Texture.d.ts +27 -0
  66. package/dist/types/gl/Trigger.d.ts +10 -0
  67. package/dist/types/gl/Vehicle.d.ts +191 -0
  68. package/dist/types/gl/Wheel.d.ts +95 -0
  69. package/dist/types/gl/animation/AnimationClip.d.ts +60 -0
  70. package/dist/types/gl/animation/Animator.d.ts +219 -0
  71. package/dist/types/gl/animation/Layer.d.ts +31 -0
  72. package/dist/types/gl/animation/Loop.d.ts +17 -0
  73. package/dist/types/gl/animation/Playback.d.ts +36 -0
  74. package/dist/types/gl/animation/core.d.ts +367 -0
  75. package/dist/types/gl/controls.d.ts +19 -0
  76. package/dist/types/gl/physicsEvents.d.ts +1 -0
  77. package/dist/types/gl/scenarios.d.ts +98 -0
  78. package/dist/types/gl/state.d.ts +5 -0
  79. package/dist/types/gl/terrainMesh.d.ts +46 -0
  80. package/dist/types/gl/touch.d.ts +2 -0
  81. package/dist/types/inject.d.ts +123 -0
  82. package/dist/types/math/Mathf.d.ts +39 -0
  83. package/dist/types/math/mat4.d.ts +66 -0
  84. package/dist/types/math/quat.d.ts +53 -0
  85. package/dist/types/math/vec.d.ts +129 -0
  86. package/dist/types/net/codec.d.ts +25 -0
  87. package/dist/types/net/core.d.ts +106 -0
  88. package/dist/types/net/index.d.ts +80 -0
  89. package/dist/types/net/replication.d.ts +101 -0
  90. package/dist/types/plugins/camera.d.ts +25 -0
  91. package/dist/types/plugins/geolocation.d.ts +39 -0
  92. package/dist/types/plugins/oauth.d.ts +25 -0
  93. package/dist/types/plugins/permission.d.ts +1 -0
  94. package/dist/types/plugins/push.d.ts +46 -0
  95. package/dist/types/plugins/qr.d.ts +21 -0
  96. package/dist/types/plugins/service.d.ts +33 -0
  97. package/dist/types/runtime/app.d.ts +67 -0
  98. package/dist/types/runtime/appEvents.d.ts +7 -0
  99. package/dist/types/runtime/channel.d.ts +1 -0
  100. package/dist/types/runtime/clipboard.d.ts +7 -0
  101. package/dist/types/runtime/datetime.d.ts +80 -0
  102. package/dist/types/runtime/device.d.ts +126 -0
  103. package/dist/types/runtime/fetch.d.ts +31 -0
  104. package/dist/types/runtime/files.d.ts +33 -0
  105. package/dist/types/runtime/input.d.ts +121 -0
  106. package/dist/types/runtime/media.d.ts +46 -0
  107. package/dist/types/runtime/misc.d.ts +11 -0
  108. package/dist/types/runtime/net.d.ts +15 -0
  109. package/dist/types/runtime/rpc.d.ts +44 -0
  110. package/dist/types/runtime/service.d.ts +1 -0
  111. package/dist/types/runtime/share.d.ts +2 -0
  112. package/dist/types/runtime/storage.d.ts +5 -0
  113. package/dist/types/runtime/touch.d.ts +56 -0
  114. package/dist/types/scene/defineScene.d.ts +296 -0
  115. package/dist/types/scene/editorPlugins.d.ts +82 -0
  116. package/dist/types/scene/gizmos.d.ts +56 -0
  117. package/dist/types/scene/grammar.d.ts +56 -0
  118. package/dist/types/scene/level.d.ts +98 -0
  119. package/dist/types/scene/material.d.ts +76 -0
  120. package/dist/types/server/auth/appConfig.d.ts +16 -0
  121. package/dist/types/server/auth/global.d.ts +56 -0
  122. package/dist/types/server/auth/models.d.ts +164 -0
  123. package/dist/types/server/auth/types.d.ts +56 -0
  124. package/dist/types/server/channel.d.ts +28 -0
  125. package/dist/types/server/context.d.ts +27 -0
  126. package/dist/types/server/db/defineDb.d.ts +36 -0
  127. package/dist/types/server/db/fields.d.ts +146 -0
  128. package/dist/types/server/db/index.d.ts +6 -0
  129. package/dist/types/server/db/marci/query.d.ts +326 -0
  130. package/dist/types/server/db/types.d.ts +163 -0
  131. package/dist/types/server/errors.d.ts +8 -0
  132. package/dist/types/server/inject.d.ts +5 -0
  133. package/dist/types/ui/NativeView.d.ts +38 -0
  134. package/dist/types/ui/UI.d.ts +27 -0
  135. package/dist/types/ui/UIBottomSheet.d.ts +71 -0
  136. package/dist/types/ui/UIButton.d.ts +30 -0
  137. package/dist/types/ui/UIContainer.d.ts +33 -0
  138. package/dist/types/ui/UIImage.d.ts +35 -0
  139. package/dist/types/ui/UIInput.d.ts +110 -0
  140. package/dist/types/ui/UIModal.d.ts +70 -0
  141. package/dist/types/ui/UINode.d.ts +363 -0
  142. package/dist/types/ui/UIPager.d.ts +123 -0
  143. package/dist/types/ui/UIPopover.d.ts +39 -0
  144. package/dist/types/ui/UIScreen.d.ts +57 -0
  145. package/dist/types/ui/UIScrollable.d.ts +40 -0
  146. package/dist/types/ui/UISpacer.d.ts +9 -0
  147. package/dist/types/ui/UITabs.d.ts +96 -0
  148. package/dist/types/ui/UIText.d.ts +19 -0
  149. package/dist/types/ui/UIVideo.d.ts +28 -0
  150. package/dist/types/ui/UIVirtualizedList.d.ts +97 -0
  151. package/dist/types/ui/UIWidget.d.ts +65 -0
  152. package/dist/types/ui/fonts.d.ts +9 -0
  153. package/dist/types/ui/presentable.d.ts +68 -0
  154. package/dist/types/ui/router.d.ts +40 -0
  155. package/dist/types/ui/theme.d.ts +26 -0
  156. package/dist/types.json +1 -0
  157. package/package.json +46 -0
  158. package/prompts/2d.md +395 -0
  159. package/prompts/3d-scene-files.md +113 -0
  160. package/prompts/3d-scene.md +119 -0
  161. package/prompts/3d.md +303 -0
  162. package/prompts/README.md +142 -0
  163. package/prompts/ar.md +109 -0
  164. package/prompts/canvas.md +27 -0
  165. package/prompts/compose.ts +46 -0
  166. package/prompts/concept.md +49 -0
  167. package/prompts/core-design.md +75 -0
  168. package/prompts/core.md +264 -0
  169. package/prompts/design.md +218 -0
  170. package/prompts/dist/2d-game.md +1530 -0
  171. package/prompts/dist/3d-app.md +1672 -0
  172. package/prompts/dist/ar-app.md +1548 -0
  173. package/prompts/dist/concept.md +49 -0
  174. package/prompts/dist/design.md +498 -0
  175. package/prompts/dist/ui-app.md +1134 -0
  176. package/prompts/index.md +37 -0
  177. package/prompts/intake-prompt.md +33 -0
  178. package/prompts/namer-prompt.md +12 -0
  179. package/prompts/router-prompt.md +50 -0
  180. package/prompts/select.ts +111 -0
  181. package/prompts/ui-design.md +203 -0
  182. package/prompts/ui.md +803 -0
  183. package/src/animate/animate.ts +238 -0
  184. package/src/animate/bezier.ts +138 -0
  185. package/src/animate/easings.ts +126 -0
  186. package/src/bridges.d.ts +1345 -0
  187. package/src/canvas/Canvas.ts +305 -0
  188. package/src/compile/__tests__/assetIconMacro.test.ts +219 -0
  189. package/src/compile/__tests__/assetMacro.test.ts +74 -0
  190. package/src/compile/__tests__/assetName.test.ts +55 -0
  191. package/src/compile/__tests__/compile.test.ts +287 -0
  192. package/src/compile/__tests__/detectEntry.test.ts +132 -0
  193. package/src/compile/__tests__/fontMacro.test.ts +199 -0
  194. package/src/compile/aspectMacro.ts +86 -0
  195. package/src/compile/assetIconMacro.ts +384 -0
  196. package/src/compile/assetMacro.ts +146 -0
  197. package/src/compile/assetName.ts +50 -0
  198. package/src/compile/bundler.ts +287 -0
  199. package/src/compile/compileProject.ts +127 -0
  200. package/src/compile/detectEntry.ts +128 -0
  201. package/src/compile/fontMacro.ts +459 -0
  202. package/src/compile/fontRegistry.ts +78 -0
  203. package/src/compile/header.ts +67 -0
  204. package/src/compile/index.ts +100 -0
  205. package/src/compile/libraryImports.ts +52 -0
  206. package/src/compile/liteMaterial.ts +247 -0
  207. package/src/compile/sceneEditor.ts +88 -0
  208. package/src/compile/serverSplit.ts +233 -0
  209. package/src/compile/serverTypes.ts +227 -0
  210. package/src/compile/sfnt.ts +98 -0
  211. package/src/compile/shaderSchema.ts +202 -0
  212. package/src/compile/shaderTargets.ts +77 -0
  213. package/src/compile/sourcemap.ts +25 -0
  214. package/src/core/Aspect.ts +568 -0
  215. package/src/core/InspectorUI.ts +212 -0
  216. package/src/core/StateMachine.ts +308 -0
  217. package/src/core/__tests__/stateMachine.test.ts +132 -0
  218. package/src/core/color.ts +66 -0
  219. package/src/core/compWrite.ts +42 -0
  220. package/src/core/events.ts +38 -0
  221. package/src/core/fields.ts +120 -0
  222. package/src/core/registry.ts +23 -0
  223. package/src/core/signals.ts +277 -0
  224. package/src/core/time.ts +84 -0
  225. package/src/g2/Camera2D.ts +40 -0
  226. package/src/g2/CharacterController2D.ts +276 -0
  227. package/src/g2/Node2D.ts +267 -0
  228. package/src/g2/OneWay2D.ts +66 -0
  229. package/src/g2/Physics2D.ts +346 -0
  230. package/src/g2/Scene2D.ts +209 -0
  231. package/src/g2/Shape2D.ts +259 -0
  232. package/src/g2/Sprite.ts +89 -0
  233. package/src/g2/SpriteAnimation.ts +171 -0
  234. package/src/g2/SpriteSheet.ts +166 -0
  235. package/src/g2/Texture2D.ts +47 -0
  236. package/src/g2/Tilemap.ts +41 -0
  237. package/src/g2/Tileset.ts +71 -0
  238. package/src/g2/Trigger2D.ts +77 -0
  239. package/src/g2/autotile.ts +433 -0
  240. package/src/g2/cells.ts +91 -0
  241. package/src/g2/defineScene2d.ts +381 -0
  242. package/src/g2/groups2d.ts +106 -0
  243. package/src/g2/loop.ts +50 -0
  244. package/src/g2/scenarios2d.ts +69 -0
  245. package/src/g2/touch.ts +83 -0
  246. package/src/gl/Camera.ts +160 -0
  247. package/src/gl/CameraPlace.ts +52 -0
  248. package/src/gl/CharacterController.ts +238 -0
  249. package/src/gl/Gearbox.ts +212 -0
  250. package/src/gl/Geometry.ts +279 -0
  251. package/src/gl/IK.ts +193 -0
  252. package/src/gl/InstancedMesh.ts +132 -0
  253. package/src/gl/Light.ts +135 -0
  254. package/src/gl/Lightmap.ts +402 -0
  255. package/src/gl/Locomotion.ts +498 -0
  256. package/src/gl/Material.ts +279 -0
  257. package/src/gl/Mesh.ts +83 -0
  258. package/src/gl/Model.ts +124 -0
  259. package/src/gl/NavAgent.ts +337 -0
  260. package/src/gl/NavMesh.ts +397 -0
  261. package/src/gl/Node.ts +350 -0
  262. package/src/gl/Noise.ts +30 -0
  263. package/src/gl/Particles.ts +676 -0
  264. package/src/gl/Physics.ts +222 -0
  265. package/src/gl/Plane.ts +53 -0
  266. package/src/gl/Ragdoll.ts +270 -0
  267. package/src/gl/Ray.ts +16 -0
  268. package/src/gl/Scene.ts +505 -0
  269. package/src/gl/Shape.ts +409 -0
  270. package/src/gl/Terrain.ts +1092 -0
  271. package/src/gl/Texture.ts +63 -0
  272. package/src/gl/Trigger.ts +45 -0
  273. package/src/gl/Vehicle.ts +473 -0
  274. package/src/gl/Wheel.ts +240 -0
  275. package/src/gl/animation/AnimationClip.ts +204 -0
  276. package/src/gl/animation/Animator.ts +329 -0
  277. package/src/gl/animation/Layer.ts +39 -0
  278. package/src/gl/animation/Loop.ts +31 -0
  279. package/src/gl/animation/Playback.ts +52 -0
  280. package/src/gl/animation/core.ts +670 -0
  281. package/src/gl/controls.ts +95 -0
  282. package/src/gl/physicsEvents.ts +20 -0
  283. package/src/gl/scenarios.ts +291 -0
  284. package/src/gl/state.ts +6 -0
  285. package/src/gl/terrainMesh.ts +219 -0
  286. package/src/gl/touch.ts +68 -0
  287. package/src/host.d.ts +61 -0
  288. package/src/inject.ts +203 -0
  289. package/src/math/Mathf.ts +118 -0
  290. package/src/math/mat4.ts +278 -0
  291. package/src/math/quat.ts +232 -0
  292. package/src/math/vec.ts +255 -0
  293. package/src/net/codec.ts +119 -0
  294. package/src/net/core.ts +384 -0
  295. package/src/net/index.ts +181 -0
  296. package/src/net/replication.ts +622 -0
  297. package/src/plugins/camera.ts +81 -0
  298. package/src/plugins/geolocation.ts +123 -0
  299. package/src/plugins/oauth.ts +61 -0
  300. package/src/plugins/permission.ts +7 -0
  301. package/src/plugins/push.ts +132 -0
  302. package/src/plugins/qr.ts +73 -0
  303. package/src/plugins/service.ts +47 -0
  304. package/src/runtime/app.ts +101 -0
  305. package/src/runtime/appEvents.ts +54 -0
  306. package/src/runtime/channel.ts +61 -0
  307. package/src/runtime/clipboard.ts +20 -0
  308. package/src/runtime/datetime.ts +329 -0
  309. package/src/runtime/device.ts +293 -0
  310. package/src/runtime/fetch.ts +77 -0
  311. package/src/runtime/files.ts +108 -0
  312. package/src/runtime/input.ts +175 -0
  313. package/src/runtime/media.ts +111 -0
  314. package/src/runtime/misc.ts +16 -0
  315. package/src/runtime/net.ts +36 -0
  316. package/src/runtime/rpc.ts +218 -0
  317. package/src/runtime/service.ts +83 -0
  318. package/src/runtime/share.ts +9 -0
  319. package/src/runtime/storage.ts +13 -0
  320. package/src/runtime/touch.ts +76 -0
  321. package/src/scene/defineScene.ts +1396 -0
  322. package/src/scene/editorPlugins.ts +110 -0
  323. package/src/scene/gizmos.ts +148 -0
  324. package/src/scene/grammar.ts +120 -0
  325. package/src/scene/level.ts +296 -0
  326. package/src/scene/material.ts +188 -0
  327. package/src/server/auth/appConfig.ts +12 -0
  328. package/src/server/auth/global.ts +80 -0
  329. package/src/server/auth/host.ts +318 -0
  330. package/src/server/auth/models.ts +83 -0
  331. package/src/server/auth/types.ts +50 -0
  332. package/src/server/channel.ts +56 -0
  333. package/src/server/context.ts +36 -0
  334. package/src/server/db/defineDb.ts +237 -0
  335. package/src/server/db/fields.ts +132 -0
  336. package/src/server/db/httpTransport.ts +93 -0
  337. package/src/server/db/index.ts +7 -0
  338. package/src/server/db/marci/query.ts +412 -0
  339. package/src/server/db/types.ts +202 -0
  340. package/src/server/errors.ts +12 -0
  341. package/src/server/host.ts +74 -0
  342. package/src/server/inject.ts +13 -0
  343. package/src/server/runtime.ts +133 -0
  344. package/src/server/validate.ts +87 -0
  345. package/src/ui/NativeView.ts +142 -0
  346. package/src/ui/UI.ts +39 -0
  347. package/src/ui/UIBottomSheet.ts +139 -0
  348. package/src/ui/UIButton.ts +101 -0
  349. package/src/ui/UIContainer.ts +60 -0
  350. package/src/ui/UIImage.ts +83 -0
  351. package/src/ui/UIInput.ts +185 -0
  352. package/src/ui/UIModal.ts +139 -0
  353. package/src/ui/UINode.ts +830 -0
  354. package/src/ui/UIPager.ts +362 -0
  355. package/src/ui/UIPopover.ts +100 -0
  356. package/src/ui/UIScreen.ts +123 -0
  357. package/src/ui/UIScrollable.ts +87 -0
  358. package/src/ui/UISpacer.ts +14 -0
  359. package/src/ui/UITabs.ts +236 -0
  360. package/src/ui/UIText.ts +51 -0
  361. package/src/ui/UIVideo.ts +88 -0
  362. package/src/ui/UIVirtualizedList.ts +241 -0
  363. package/src/ui/UIWidget.ts +127 -0
  364. package/src/ui/fonts.ts +13 -0
  365. package/src/ui/presentable.ts +117 -0
  366. package/src/ui/router.ts +132 -0
  367. package/src/ui/theme.ts +84 -0
@@ -0,0 +1,279 @@
1
+ import { Aspect } from "../core/Aspect";
2
+ import { Vec3, type Vec3Like } from "../math/vec";
3
+ import { Animator, type FeetOptions, type WarpOptions } from "./animation/Animator";
4
+ import type { Node } from "./Node";
5
+ /** How fast the character wants to go: the gait picks its clips and its speed. */
6
+ export type Gait = "walk" | "run" | "sprint";
7
+ /** What the engine shows: the idle, a start, the gait loop, a turn while moving, a stop, or a turn on the spot. */
8
+ export type LocomotionState = "idle" | "start" | "move" | "turn" | "stop" | "spin";
9
+ /** Who moves the body:
10
+ * `'hybrid'` (the default) — the clip's own recorded motion moves it; while the gait loop shows it
11
+ * is ADJUSTED toward what the simulation wants by at most `tuning.adjust` metres a second, and a
12
+ * start / turn / stop / spin moves it alone. The recording keeps the feet honest, the clamp keeps
13
+ * the player in charge of the arcs. What a pack authored with root motion wants.
14
+ * `'code'` — the simulation moves it and the animation has to be warped to follow (stride warping);
15
+ * for packs recorded in place.
16
+ * `'data'` — the clips' root motion moves it and nothing adjusts it; the simulation only predicts. */
17
+ export type Displacement = "hybrid" | "code" | "data";
18
+ /** One clip of the set: its name, or the name with what the clip itself cannot say — `gait` (which
19
+ * gait a transition belongs to: a walking body plays the walking starts, stops and turns; left out =
20
+ * any gait) — and overrides for what the engine would otherwise measure: `angle` (degrees the clip
21
+ * turns the body, + = left) for a start / turn / spin, `speed` (m/s) for a gait clip. */
22
+ export type LocomotionClip = string | {
23
+ clip: string;
24
+ gait?: Gait;
25
+ angle?: number;
26
+ speed?: number;
27
+ };
28
+ /** The clips the selector may show. Everything but `idle` is a list; an empty one simply means the
29
+ * engine never shows that kind (a pack without turns steers through them instead). */
30
+ export type LocomotionSet = {
31
+ /** standing still */
32
+ idle?: LocomotionClip;
33
+ /** the gait loop's members, slowest first — walk, run, sprint. Blended by the simulated speed. */
34
+ gaits?: LocomotionClip[];
35
+ /** standing → moving, one per direction (the engine picks by the turn each one makes) */
36
+ starts?: LocomotionClip[];
37
+ /** moving → standing */
38
+ stops?: LocomotionClip[];
39
+ /** turns taken while moving */
40
+ turns?: LocomotionClip[];
41
+ /** turns on the spot — what a facing still owed by a standing body plays */
42
+ spins?: LocomotionClip[];
43
+ };
44
+ /** The tuning. Times are seconds, speeds m/s, angles degrees. */
45
+ export type LocomotionTuning = {
46
+ /** How briskly the simulated speed reaches the wanted one — the halflife of the difference, per
47
+ * gait (default 0.27 walking, 0.2 running). Smaller = more responsive, larger = heavier. */
48
+ responseWalk?: number;
49
+ responseRun?: number;
50
+ /** How briskly the body brakes when nothing is asked for (default 0.15). Braking is not
51
+ * acceleration backwards: a body plants and stops in far less than it takes to reach a run, and
52
+ * with the gait's own number the tail of the curve is a long, visible glide. */
53
+ responseStop?: number;
54
+ /** The same for the facing (default 0.15). */
55
+ responseFacing?: number;
56
+ /** Top speed per gait. Left out (the default), each gait travels at the speed its own clip was
57
+ * recorded at — which is what keeps the feet from sliding. */
58
+ speeds?: Partial<Record<Gait, number>>;
59
+ /** The step warp's split when a gait is asked for at a speed that is not its clip's own: the
60
+ * STRIDE (spatial squash of the leg's reach) gets ratio^strideShare, clamped to `strideBand`,
61
+ * and the cadence takes all the rest — the asked speed is always delivered exactly.
62
+ * 0 = all cadence (slow motion), 1 = all stride (within the band). Default 0.5. */
63
+ strideShare?: number;
64
+ /** How far the stride's share may squash or stretch the legs' reach (default [0.85, 1.15]) —
65
+ * past it the warp re-bends legs the clip authored straight. */
66
+ strideBand?: [number, number];
67
+ /** PIN the step warp's stride ratio (a tuning bench's knob): the step width is held at exactly
68
+ * this, whatever speed is asked — the body's speed falls out of stride × cadence instead of
69
+ * driving the split. Leave out (or 0) for automatic. */
70
+ warpStride?: number;
71
+ /** PIN the step warp's cadence ratio the same way — the animation's pace held at exactly this.
72
+ * With both pinned, stride and pace are fully independent. Leave out (or 0) for automatic. */
73
+ warpCadence?: number;
74
+ /** Cap on how fast the body may turn by STEERING, deg/s (default: uncapped) — the arc it walks when
75
+ * the heading is off by less than `turnMin`. A start / turn / spin clip owns the facing while it
76
+ * turns: the body then turns exactly as much as the (warped) animation does. */
77
+ turnRate?: number;
78
+ /** Heading error that plays a turn clip instead of steering through it (default 60°). Which turn
79
+ * clip is not a threshold: every one is entered where the gait phase allows nearest to its pivot,
80
+ * and the one whose turn LEFT from there best answers the error wins. */
81
+ turnMin?: number;
82
+ /** Facing still owed by a standing body that turns it on the spot (default 30°). Less than this it
83
+ * accepts — a standing body never rotates by code, that is the one thing no tuning makes look right. */
84
+ spinMin?: number;
85
+ /** Transition seconds between clips (default 0.2), and into the idle after a stop (default 0.3). */
86
+ blend?: number;
87
+ stopBlend?: number;
88
+ /** How far a start / turn / spin clip's recorded turn may be SCALED so it delivers exactly the heading
89
+ * asked for, as a fraction (default 0.3 = ×0.7 … ×1.3). What lies beyond the clamp is steered once
90
+ * the body moves. 0 = the recording is law. */
91
+ yawWarp?: number;
92
+ /** A start or a turn hands over to the gait loop at the first foot-down after its turn is delivered
93
+ * at which its pose is within this many metres of the loop's — the engine's baked fit curve —
94
+ * instead of at its end (default 0.15). 0 = at the end. */
95
+ exitTolerance?: number;
96
+ /** A stop asked to move again resumes the gait loop while the body still travels at this fraction of
97
+ * the gait's speed or more (default 0.5); slower, it starts afresh. */
98
+ resumeSpeed?: number;
99
+ /** …and then let it play this many more FOOT-DOWNS before handing over (default 0). `exitTolerance`
100
+ * answers "when has this pose become the walk's", which is the earliest honest moment and not always
101
+ * the best-looking one — a start that has just found the gait still reads as a start for another step
102
+ * or two. 1 or 2 gives a take room to finish its thought; a take that runs out hands over at its own
103
+ * end regardless, so nothing can hang. */
104
+ exitSteps?: number;
105
+ /** How much braking room, in metres, to trade for each second of a stop take's lead-in that would
106
+ * otherwise be skipped (default 0). A stop cannot be rewound — the variants are one cycle long, so
107
+ * no earlier frame has the same foot down — so the only way to begin a stop nearer its own start is
108
+ * to prefer the VARIANT that starts there for the foot the body happens to be on. Raise it (0.5…1.5)
109
+ * to see the whole braking gesture; leave it at 0 to land exactly where the body should stop. */
110
+ stopEarly?: number;
111
+ /** How much braking room, in metres, one extra FOOT-DOWN in the stop is worth (default 0). A stop
112
+ * take is one cycle long, so wanting another step means wanting a LONGER variant, and a longer one
113
+ * lands the body further along than it asked to stop — the trade is this number. Around 1 buys a
114
+ * second step on a pack like Mobility Pro; 0 lands exactly where the body should stop. */
115
+ stopSteps?: number;
116
+ /** How far a stop take's pose may be from the one showing, in metres, for it to be entered BEFORE
117
+ * its own first foot-down (default 0.25). Ahead of that footfall a take's phase curve is an
118
+ * extrapolation: it can match the body's phase arithmetically with the legs at a different stage
119
+ * of the stride, which is why the pose is asked directly. 0 = never enter a take early — the body
120
+ * then takes whatever later entry matches its foot, which on a walk can be three quarters of the
121
+ * way through a take, on top of one of its plants. */
122
+ stopFit?: number;
123
+ /** What a metre of POSE distance at the entry is worth against a metre of braking room when the
124
+ * variants are ranked (default 1). Both are metres and the feet pay both: room the body has not
125
+ * got is taken out of the root while a foot is planted, and a pose the transition has to hide is
126
+ * dragged out of that same foot over the blend. 0 = rank by braking room alone, which picks a
127
+ * take by where it ENDS and lets it start from any pose at all. */
128
+ stopPose?: number;
129
+ /** Input magnitude below which a stick counts as released (default 0.2). */
130
+ deadZone?: number;
131
+ /** `displacement: 'hybrid'`: how far, m/s, the body may be pushed off what the animation recorded,
132
+ * toward what the simulation wants, while the gait loop shows (default 0.5) — a start, turn, stop
133
+ * or spin moves the body alone, since pushing it there is its planted foot skating. 0 = the
134
+ * recording is law; large = the code is law — responsive, and the feet start lying. */
135
+ adjust?: number;
136
+ };
137
+ /** One stop take as the selector weighed it, from `stopReport()`. A stop is chosen for the foot the
138
+ * body stands on and the room it needs: `phaseOk` and `afterFirstStep` are the two pass/fail rules,
139
+ * `score` ranks whatever passed (lower wins), and `chosen` marks the one that plays. */
140
+ export type StopCandidate = {
141
+ /** the take's clip name */
142
+ clip: string;
143
+ /** seconds into it the entry would be — near its end means its braking gesture is skipped */
144
+ at: number;
145
+ /** metres it still travels from that entry */
146
+ room: number;
147
+ /** metres this body needs to come to rest (the same for every row) */
148
+ need: number;
149
+ /** seconds from the entry to its next foot-down */
150
+ wait: number;
151
+ /** foot-downs left after the entry: 0 = it plants where it stands */
152
+ steps: number;
153
+ /** does it have a frame at the body's own cycle phase (the right foot down)? */
154
+ phaseOk: boolean;
155
+ /** is that frame at or after its own first foot-down? Ahead of it the phase curve is an
156
+ * extrapolation — it can match arithmetically at the wrong stage of the stride */
157
+ afterFirstStep: boolean;
158
+ /** …and it is ahead of it, but its POSE matched what is showing closely enough to be let in
159
+ * anyway (`fit` under `tuning.stopFit`) */
160
+ earlyByPose: boolean;
161
+ /** the one that is playing */
162
+ chosen: boolean;
163
+ /** |room − need| + the pose distance + how late in the take (lower wins) */
164
+ score: number;
165
+ /** how far this entry's pose is from the one showing, in the fit measure's metres (-1 = not
166
+ * measured). Under `tuning.stopFit` an entry ahead of the take's first foot-down is allowed. */
167
+ fit: number;
168
+ };
169
+ export type LocomotionEvents = {
170
+ /** What the selector shows changed. */
171
+ state: (state: LocomotionState) => void;
172
+ };
173
+ export declare class Locomotion extends Aspect<"loco", Node, LocomotionEvents> {
174
+ static readonly aspect = "loco";
175
+ /** The animator whose clips are shown. Default: the first one on this node or under it (a Model
176
+ * child), which is the usual character — a capsule node with the model inside. */
177
+ animator?: Animator;
178
+ /** The clips the selector may show. */
179
+ set: LocomotionSet;
180
+ /** Who moves the body (see `Displacement`). */
181
+ displacement: Displacement;
182
+ /** The feel (see `LocomotionTuning`). */
183
+ tuning: LocomotionTuning;
184
+ /** Fit the POSE to what the body does — stride and orientation warping (see `Animator.warp`, which
185
+ * this simply sets). The simulation feeds the engine the body's motion every frame, so here it
186
+ * only has to be turned on: `warp: true`, or `{ stride: [0.7, 1.4], orientation: 45 }`. Off by
187
+ * default — a pack whose gaits already cover the speeds it is played at does not need it. */
188
+ warp?: WarpOptions | boolean;
189
+ /** The FEET (see `Animator.feet`, which this simply sets). Default: the foot lock on, ground IK off
190
+ * — a planted foot stays where it landed through every transition the selector makes, which is the
191
+ * last of the slide once the recording moves the body. `true` = lock + ground IK (stairs, slopes);
192
+ * `false` = neither; or the options themselves. */
193
+ feet?: FeetOptions | boolean;
194
+ private _loco;
195
+ private _dir;
196
+ private _face;
197
+ private _mag;
198
+ private _gait;
199
+ private _seq;
200
+ private readonly _in;
201
+ private readonly _out;
202
+ private readonly _names;
203
+ private _report?;
204
+ private get anim();
205
+ private get controller();
206
+ protected onAttach(): void;
207
+ protected onDetach(): void;
208
+ /** Re-read the set and the tuning — after changing either at runtime (a weapon that changes the
209
+ * walk, a slowed-down character). */
210
+ rebuild(): void;
211
+ /** Register one clip of the set: the engine measures the clip's own turn / speed unless given. */
212
+ private enter;
213
+ /** Why the stop that is playing is the one that plays: every candidate the selector weighed, in
214
+ * the order it weighed them. Read it when a stop looks wrong — the answer is usually that the
215
+ * take that would have looked right was rejected by one of the two rules, not that the score
216
+ * picked badly. Empty until a stop has been chosen (and on hosts without the debug read). */
217
+ stopReport(): StopCandidate[];
218
+ /** Re-push the TUNING alone — the numbers, not the clip set. What a live tweak wants (a debug
219
+ * slider, a character that gets heavier when hurt): `rebuild()` also re-measures the set, which
220
+ * mid-clip is more than a changed number asks for. */
221
+ retune(): void;
222
+ private pushTuning;
223
+ /** State the movement intent for this frame: a world direction (its length is the stick's pull,
224
+ * clamped to 1) and the gait. `null` = no movement — the body stops, but it keeps facing where it
225
+ * was last asked to, and turns there on the spot if it still owes the turn.
226
+ * `face` states a facing of its own (aiming, strafing, a camera-relative shooter). */
227
+ move(direction: Vec3Like | null | undefined, options?: {
228
+ gait?: Gait;
229
+ face?: Vec3Like;
230
+ }): void;
231
+ /** Face this way without moving — the facing intent on its own (`Vec3`, or a heading in degrees,
232
+ * 0 = +Z, + = toward +X). A standing body turns to it on the spot. */
233
+ face(direction: Vec3Like | number): void;
234
+ /** The gait the intent asks for. */
235
+ get gait(): Gait;
236
+ set gait(g: Gait);
237
+ /** Is a movement intent standing right now? (The debug answer to "is a key held".) */
238
+ get moving(): boolean;
239
+ /** The direction the intent points, world. */
240
+ get direction(): Vec3;
241
+ /** The heading the intent asks the body to face, degrees (0 = +Z, + = toward +X). */
242
+ get heading(): number;
243
+ /** The speed the intent asks for, m/s — it jumps the moment a key goes down or the gait changes.
244
+ * `speed` is what the body has made of it. */
245
+ get intentSpeed(): number;
246
+ /** What the selector shows. */
247
+ get state(): LocomotionState;
248
+ /** The body's speed, m/s — the simulation's, which is what the animation is fitted to. */
249
+ get speed(): number;
250
+ /** The body's velocity, world m/s. */
251
+ get velocity(): Vec3;
252
+ /** Where the body faces, degrees (0 = +Z, + = toward +X) — the node's yaw, which this drives. */
253
+ get facing(): number;
254
+ /** Where the base layer is in the gait cycle, 0–1 (-1 when what shows has no cycle). */
255
+ get phase(): number;
256
+ /** How far the STOP that is showing was entered from the phase the body was on, in cycles, signed —
257
+ * measured at the switch. 0 while no stop shows; ±0.5 would be the other foot on the ground. */
258
+ get stopFootOffset(): number;
259
+ /** Foot-downs left in the stop that is showing, counted from the frame it was entered at. 0 means it
260
+ * was entered past its own last footfall — the body will not step, it will only settle. -1 when no
261
+ * stop shows. The number behind "he did not take a step, he just pulled the foot back". */
262
+ get stopStepsLeft(): number;
263
+ /** Seconds from the frame the shown stop was entered at to its next foot-down. Large means it was
264
+ * entered just AFTER a footfall: the leg is planted and then held still until the one after, which
265
+ * reads as a foot that sticks. -1 when no stop shows. */
266
+ get stopStepWait(): number;
267
+ /** Degrees the clip showing still turns the body by (a start / turn / spin, after its warp); 0 for
268
+ * the loop and the idle — the heading the engine has committed to but not yet delivered. */
269
+ get yawLeft(): number;
270
+ /** The shown transition's clip time and the time it hands over at, seconds (-1 for the loop / idle;
271
+ * `exitAt` -1 = at the clip's end). A debug readout. */
272
+ get clipTime(): number;
273
+ get exitAt(): number;
274
+ /** Where the body will be in 0.2 / 0.4 / 0.7 s if the intent holds — the path the selector judges
275
+ * a turn by, and a debug overlay's dots. */
276
+ get trajectory(): Vec3[];
277
+ protected updateBefore(dt: number): void;
278
+ protected updateFixed(dt: number): void;
279
+ }
@@ -0,0 +1,100 @@
1
+ import { type ColorInput } from "../core/color";
2
+ import { type FetchResponse } from "../runtime/fetch";
3
+ import { Texture } from "./Texture";
4
+ import type { Canvas } from "../canvas/Canvas";
5
+ type UniformValue = string | Texture | number | boolean | number[] | Float32Array | null;
6
+ export type MaterialColorOptions = {
7
+ color?: ColorInput;
8
+ map?: Texture | Canvas | null;
9
+ };
10
+ /** `Material.unlit` options. */
11
+ export type UnlitMaterialOptions = MaterialColorOptions & {
12
+ /** Alpha-blend this material instead of drawing it opaque. Opaque is the default: a blended draw
13
+ * writes no depth, is sorted back-to-front and casts no shadow, which is rarely what a flat
14
+ * colour wants. Turn it on for anything that must show what is behind it — a glass pane, a
15
+ * fading marker, a sprite whose texture has cut-out alpha. Only then does `color`'s own alpha
16
+ * (`"#ffffff80"`) mean anything; the opaque material has no alpha channel at all. */
17
+ transparent?: boolean;
18
+ };
19
+ /** `Material.particles` options — the default point-sprite material for particle systems. */
20
+ export type ParticlesMaterialOptions = {
21
+ /** Sprite texture — a single image or a flipbook sheet of frames. Unset = soft round dot. */
22
+ map?: Texture | null;
23
+ /** Flipbook grid: `N` = an N×N sheet, `[cols, rows]` = a non-square one. Frames run
24
+ * left-to-right, top-to-bottom; drive the index via `particles.frame`. Default 1. */
25
+ sheet?: number | [number, number];
26
+ /** Extra brightness multiplier for a glow look (0 = off). */
27
+ emissive?: number;
28
+ /** (`render` quad / stretch) a second sheet on the same grid, ADDED as `emissiveMap × emissiveColor`
29
+ * — keyed by `map`'s alpha, not tinted by the particle colour. A fireball = a smoke `map` whose
30
+ * colour curve goes dark + a fire `emissiveMap` that keeps glowing while alpha lasts. */
31
+ emissiveMap?: Texture | null;
32
+ /** Multiplier for `emissiveMap`; an `[r, g, b]` array may exceed 1 (HDR glow). Default 0 (off). */
33
+ emissiveColor?: ColorInput;
34
+ /** (`render` quad / stretch) crossfade each flipbook frame into the next by the fractional frame
35
+ * index instead of snapping — smooth sheet playback at any frame rate. Default false. */
36
+ frameBlend?: boolean;
37
+ /** Compositing: `"alpha"` (default — smoke, dust) or `"add"` (fire, sparks, magic). */
38
+ blend?: "alpha" | "add";
39
+ /** Soft radial falloff toward the sprite edge. Defaults to true without a map, false with one. */
40
+ soft?: boolean;
41
+ /** Soft particles: fade each sprite out over this many metres as it cuts into the scene geometry
42
+ * behind it (Unity's "Soft Particles Factor"), so smoke and dust no longer slice through the
43
+ * ground and walls with a hard edge. 0 = off (default). Reads the scene's depth buffer, which the
44
+ * engine keeps bound while any soft system is on screen — the extra depth pass is only paid then.
45
+ * Filament hosts (desktop / web / Android / Apple); web-lite draws such sprites unfaded. */
46
+ depthFade?: number;
47
+ /** How each particle is drawn: `'point'` (default — GPU point sprites, cheapest), `'quad'`
48
+ * (real camera-facing quads — no driver size cap, geometric rotation), or `'stretch'`
49
+ * (quads stretched along velocity — sparks, rain, speed streaks). `'ribbon'` is what `Trail`
50
+ * uses internally. */
51
+ render?: "point" | "quad" | "stretch" | "ribbon";
52
+ /** (`render: 'stretch'`) extra sprite length in world units per unit of speed:
53
+ * length = size + stretch·|velocity|. Default 0.05. */
54
+ stretch?: number;
55
+ };
56
+ /** `Material.lit` options — PBR scalars on top of the color/map pair. */
57
+ export type LitMaterialOptions = MaterialColorOptions & {
58
+ /** Perceptual roughness, 0 (mirror) … 1 (matte). Unset = the shader's default. */
59
+ roughness?: number;
60
+ /** Metallic factor, 0 (dielectric) … 1 (metal). Unset = the shader's default. */
61
+ metallic?: number;
62
+ };
63
+ export declare class Material {
64
+ readonly shader: FetchResponse | "unknown";
65
+ readonly uniforms: Record<string, UniformValue>;
66
+ private _colorKey;
67
+ constructor(shader: FetchResponse | number);
68
+ /** Set a uniform (chainable). */
69
+ set(key: string, value: UniformValue): this;
70
+ set color(c: ColorInput);
71
+ set map(value: Texture | Canvas | null);
72
+ /** PBR lit material. */
73
+ static lit(options?: LitMaterialOptions): Material;
74
+ /** Unlit (flat) material — opaque unless `transparent` asks for alpha blending. */
75
+ static unlit(options?: UnlitMaterialOptions): Material;
76
+ /** Default particle material — camera-facing point sprites with tint/opacity/rotation/flipbook
77
+ * driven by the particle curves. Uniforms all default to 0 on a fresh instance, so every look
78
+ * knob is primed here; JS writes after construction override them. */
79
+ static particles(options?: ParticlesMaterialOptions): Material;
80
+ /** Material that samples a VideoPlayer's texture. */
81
+ static video(map?: Texture): Material;
82
+ /** The lightmap material (docs/lightmap-plan.md): PBR base colour × a baked shadow/AO atlas on UV1.
83
+ * Models take it through `Model.load(…, { lightmap: true })`; `Lightmap.load` builds one per static
84
+ * Mesh. Parameters use gltfio's names (`baseColorFactor`, `baseColorMap`, `roughnessFactor`,
85
+ * `metallicFactor`) plus `lightmap`, `lightmapST`, `ambientScale`, `sunStrength` (the sun / IBL terms come from
86
+ * filament's per-frame uniforms inside the shader). */
87
+ static lightmap(): Material;
88
+ /** The terrain splat material (docs/terrain-plan.md §1.5): four albedo (+ normal-map) layers blended by
89
+ * a control map on the terrain's own grid, per-layer `tiling` (metres per repeat) / `roughness` /
90
+ * `normalScale` / `triplanar`, lightmap-aware (the same `lightmap` / `lightmapST` block as
91
+ * `Material.lightmap`). `Terrain` builds and owns one per terrain; the uniforms are primed here so an
92
+ * unset layer is white and an unbaked terrain is fully lit. */
93
+ static terrain(): Material;
94
+ private static _lmTemplate;
95
+ /** Shadow-catcher material (transparent except where shadows fall). */
96
+ static shadow(color?: ColorInput): Material;
97
+ /** Load a custom compiled shader (.mat URL) as a material. */
98
+ static load(url: string): Promise<Material>;
99
+ }
100
+ export {};
@@ -0,0 +1,33 @@
1
+ import { type Vec3Like } from "../math/vec";
2
+ import { Geometry, type CylinderOptions, type PlaneOptions, type SphereOptions } from "./Geometry";
3
+ import { Material } from "./Material";
4
+ import { Node } from "./Node";
5
+ /** Common transform/render options every primitive factory accepts. */
6
+ export type MeshOptions = {
7
+ material?: Material;
8
+ position?: Vec3Like;
9
+ eulerAngles?: Vec3Like;
10
+ scale?: Vec3Like | number;
11
+ name?: string;
12
+ castShadows?: boolean;
13
+ receiveShadows?: boolean;
14
+ };
15
+ export declare class Mesh extends Node {
16
+ private _geometry?;
17
+ constructor(geometry?: Geometry, material?: Material);
18
+ get geometry(): Geometry | undefined;
19
+ /** A Mesh always carries a material (slot 0) — see Node.setMaterial for the slot API. */
20
+ get material(): Material;
21
+ set material(m: Material);
22
+ set culling(v: boolean);
23
+ set castShadows(v: boolean);
24
+ set receiveShadows(v: boolean);
25
+ static box(options?: MeshOptions & {
26
+ size?: Vec3Like | number;
27
+ }): Mesh;
28
+ static sphere(options?: MeshOptions & SphereOptions): Mesh;
29
+ static cylinder(options?: MeshOptions & CylinderOptions): Mesh;
30
+ static plane(options?: MeshOptions & PlaneOptions): Mesh;
31
+ /** Wrap a custom Geometry. */
32
+ static from(geometry: Geometry, options?: MeshOptions): Mesh;
33
+ }
@@ -0,0 +1,53 @@
1
+ import { type FetchResponse } from "../runtime/fetch";
2
+ import { Node } from "./Node";
3
+ import { Animator, type LodMode } from "./animation/Animator";
4
+ export declare class Model extends Node {
5
+ /** The model's Animator — always present, its clip table = the GLB's embedded clips. Configure
6
+ * more (external clips, blend spaces, layers) with `model.aspect(Animator, {...})`. */
7
+ readonly anim: Animator;
8
+ constructor(internalId: number);
9
+ /** Does this model cast a real-time shadow? Unlike Mesh (one renderable) a GLB is a whole
10
+ * hierarchy, so the flag goes to EVERY renderable of the instance. A first-person viewmodel —
11
+ * arms, weapon, attachments — sets it false: it lives in front of the camera and its shadow
12
+ * is never wanted. */
13
+ get castShadows(): boolean;
14
+ set castShadows(v: boolean);
15
+ /** Is this model lit by other casters' shadows? Same instance-wide reach as castShadows. */
16
+ get receiveShadows(): boolean;
17
+ set receiveShadows(v: boolean);
18
+ /** Frustum culling for the whole instance: a model the camera cannot see skips the draw and the
19
+ * shadow pass. ON by default where the host keeps a skinned mesh's bounds honest — the engine refits
20
+ * them to the joints every frame, so a walking, kneeling or ragdolled body is never culled while on
21
+ * screen (`_creator.skinnedCullingSupported`); OFF (always draw) on hosts without that, where
22
+ * Filament would cull an animated body by its bind-pose box. `false` = always draw (a skybox-sized
23
+ * mesh, a debugging aid); `true` forces it on regardless of the host. */
24
+ get culling(): boolean;
25
+ set culling(v: boolean);
26
+ /** Level of detail (docs/lod-plan.md). `'auto'` (default): the engine shows the `_LOD<n>` mesh level
27
+ * that fits the model's size on screen (`lecodes assets doctor --lod` makes them) and scales the
28
+ * animation rate with it; a number 0–3 pins that level for both — `0` = always full detail (a hero,
29
+ * a showcase), `2`/`3` = always cheap (a crowd filler). `model.anim.lod = 'full'` keeps the animation
30
+ * exact while the mesh still switches. No-op on hosts without the LOD pass. */
31
+ get lod(): LodMode;
32
+ set lod(v: LodMode);
33
+ private static _cullDefault;
34
+ /** Duplicate this model — a deep copy of the GLB (meshes, skeleton, animation clips), attached to
35
+ * the same parent and scene and sharing this model's current transform. The clone has its own
36
+ * independent animation state (reach it via clone.anim). Mirrors this model's culling flag. */
37
+ clone(): Model;
38
+ /** Load a GLB model. Returns its root as a Model; play its baked clips via model.anim. */
39
+ static load(source: string | FetchResponse, options?: {
40
+ /** Frustum culling — see `culling` (default: on where the host refits skinned bounds, else off). */
41
+ culling?: boolean;
42
+ onProgress?: (p: {
43
+ loaded: number;
44
+ total?: number;
45
+ }) => void;
46
+ /** Baked lighting (docs/lightmap-plan.md). `true` = a STATIC: loads through the lightmap material so
47
+ * `Lightmap.load` can bind its atlas rect (the GLB needs TEXCOORD_1 — `lecodes assets doctor
48
+ * --lightmap-uv`). `'dynamic'` = a mover: the same material, lit by the level's light VOLUME instead
49
+ * (no UV1 needed). Omitted: `'dynamic'` while a scene file with `env.lightmap.volume` is running,
50
+ * else off. `false` = the standard shader. Hosts without lightmap support ignore it. */
51
+ lightmap?: boolean | "dynamic";
52
+ }): Promise<Model>;
53
+ }
@@ -0,0 +1,99 @@
1
+ import { Aspect } from "../core/Aspect";
2
+ import type { FieldMeta } from "../core/fields";
3
+ import { Vec3, type Vec3Like } from "../math/vec";
4
+ import { NavCrowd } from "./NavMesh";
5
+ import type { Node } from "./Node";
6
+ export type NavAgentState = "idle" | "moving" | "arrived" | "blocked" | "offmesh";
7
+ export type NavAgentAvoidance = "off" | "low" | "medium" | "high";
8
+ export type NavAgentDrive = "position" | "controller";
9
+ export type NavAgentEvents = {
10
+ /** Reached the target (within `stopDistance`). */
11
+ arrive: () => void;
12
+ /** The target cannot be reached — the agent stopped at the closest point (or nowhere near). */
13
+ blocked: () => void;
14
+ };
15
+ export declare class NavAgent extends Aspect<"agent", Node, NavAgentEvents> {
16
+ static readonly aspect = "agent";
17
+ /** The crowd advances first, then every agent applies its slot. */
18
+ static after: (typeof NavCrowd)[];
19
+ static fields: FieldMeta<NavAgent>;
20
+ private _radius;
21
+ private _height;
22
+ private _speed;
23
+ private _acceleration;
24
+ private _avoidance;
25
+ private _separation;
26
+ private _include;
27
+ private _exclude;
28
+ /** deg/s the node turns toward its velocity; 0 = never touch the rotation. */
29
+ turnSpeed: number;
30
+ /** How the node follows its slot. */
31
+ drive: NavAgentDrive;
32
+ /** Reached = within this many metres (along the corridor) of the target. */
33
+ stopDistance: number;
34
+ /** Agent radius (metres). Defaults to the navmesh's. */
35
+ get radius(): number;
36
+ set radius(v: number);
37
+ get height(): number;
38
+ set height(v: number);
39
+ /** Top speed (m/s). */
40
+ get speed(): number;
41
+ set speed(v: number);
42
+ get acceleration(): number;
43
+ set acceleration(v: number);
44
+ /** Local (agent-vs-agent) avoidance quality. */
45
+ get avoidance(): NavAgentAvoidance;
46
+ set avoidance(v: NavAgentAvoidance);
47
+ /** Separation force weight (0 = none). */
48
+ get separation(): number;
49
+ set separation(v: number);
50
+ /** Area names this agent may walk (default: all). */
51
+ get include(): string[] | undefined;
52
+ set include(v: string[] | undefined);
53
+ /** Area names this agent never enters. */
54
+ get exclude(): string[] | undefined;
55
+ set exclude(v: string[] | undefined);
56
+ state: NavAgentState;
57
+ /** The current velocity after avoidance (m/s). */
58
+ readonly velocity: Vec3;
59
+ /** The velocity the corridor asked for, before avoidance. */
60
+ readonly desiredVelocity: Vec3;
61
+ /** Metres left along the corridor (-1 = no target). */
62
+ remainingDistance: number;
63
+ /** Where the agent is going, or null. */
64
+ get target(): Vec3 | null;
65
+ get hasPath(): boolean;
66
+ private _crowd;
67
+ private _slot;
68
+ private _target;
69
+ /** velocity-driven (`move`) rather than target-driven */
70
+ private _steering;
71
+ private _dirty;
72
+ private _faceX;
73
+ private _faceZ;
74
+ private _retryAt;
75
+ private _lastSeen;
76
+ private _still;
77
+ private _near;
78
+ private _slow;
79
+ onAttach(): void;
80
+ onReconfigure(): void;
81
+ onDetach(): void;
82
+ /** Walk to a point. False = no walkable polygon near it (or no navmesh) — the current target stays. */
83
+ goTo(target: Vec3Like): boolean;
84
+ /** Drop the target and decelerate to a stop. */
85
+ stop(): void;
86
+ /**
87
+ * Steer by velocity instead of a target — a player on WASD, a scripted push: the crowd keeps
88
+ * the node on the mesh and avoids the other agents, no path and no arrival. Call it every fixed
89
+ * step (the last velocity holds until the next call); `move(0, 0)` stops. Cancels `goTo`.
90
+ * False = no navmesh / off the mesh.
91
+ */
92
+ move(vx: number, vz: number): boolean;
93
+ /** Teleport (a spawn, a respawn). The target, if any, is kept. */
94
+ warp(p: Vec3Like): void;
95
+ private params;
96
+ updateFixed(dt: number): void;
97
+ private finish;
98
+ private face;
99
+ }