murow 0.0.70 → 0.0.72

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 (470) hide show
  1. package/README.md +54 -37
  2. package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
  3. package/dist/cjs/core/binary-codec/index.js +1 -0
  4. package/dist/cjs/core/driver/driver.js +1 -0
  5. package/dist/cjs/core/driver/drivers/immediate.js +1 -0
  6. package/dist/cjs/core/driver/drivers/index.js +1 -0
  7. package/dist/cjs/core/driver/drivers/raf.js +1 -0
  8. package/dist/cjs/core/driver/drivers/timeout.js +1 -0
  9. package/dist/cjs/core/driver/index.js +1 -0
  10. package/dist/cjs/core/events/event-system.js +1 -0
  11. package/dist/cjs/core/events/index.js +1 -0
  12. package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
  13. package/dist/cjs/core/fixed-ticker/index.js +1 -0
  14. package/dist/cjs/core/free-list/free-list.js +1 -0
  15. package/dist/cjs/core/free-list/index.js +1 -0
  16. package/dist/cjs/core/generate-id/generate-id.js +1 -0
  17. package/dist/cjs/core/generate-id/index.js +1 -0
  18. package/dist/cjs/core/index.js +1 -0
  19. package/dist/cjs/core/input/index.js +1 -0
  20. package/dist/cjs/core/input/manager.js +1 -0
  21. package/dist/cjs/core/input/sources/browser.js +1 -0
  22. package/dist/cjs/core/input/sources/index.js +1 -0
  23. package/dist/cjs/core/input/types.js +1 -0
  24. package/dist/cjs/core/lerp/index.js +1 -0
  25. package/dist/cjs/core/lerp/lerp.js +1 -0
  26. package/dist/cjs/core/navmesh/index.js +1 -0
  27. package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
  28. package/dist/cjs/core/navmesh/navmesh.js +1 -0
  29. package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
  30. package/dist/cjs/core/pooled-codec/index.js +1 -0
  31. package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
  32. package/dist/cjs/core/prediction/index.js +1 -0
  33. package/dist/cjs/core/prediction/prediction.js +1 -0
  34. package/dist/cjs/core/ray/index.js +1 -0
  35. package/dist/cjs/core/ray/ray-2d.js +1 -0
  36. package/dist/cjs/core/ray/ray-3d.js +1 -0
  37. package/dist/cjs/core/simple-rng/index.js +1 -0
  38. package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
  39. package/dist/cjs/core/sparse-batcher/index.js +1 -0
  40. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
  41. package/dist/cjs/ecs/component-store.js +1 -0
  42. package/dist/cjs/ecs/component.js +1 -0
  43. package/dist/cjs/ecs/entity-handle.js +1 -0
  44. package/dist/cjs/ecs/index.js +1 -0
  45. package/dist/cjs/ecs/system-builder.js +1 -0
  46. package/dist/cjs/ecs/world-systems.js +1 -0
  47. package/dist/cjs/ecs/world.js +1 -0
  48. package/dist/cjs/game/index.js +1 -0
  49. package/dist/cjs/game/loop/index.js +1 -0
  50. package/dist/cjs/game/loop/loop.js +1 -0
  51. package/dist/cjs/index.js +1 -0
  52. package/dist/cjs/net/adapters/browser-websocket.js +1 -0
  53. package/dist/cjs/net/adapters/bun-websocket.js +1 -0
  54. package/dist/cjs/net/buffer-pool.js +1 -0
  55. package/dist/cjs/net/client.js +1 -0
  56. package/dist/cjs/net/index.js +1 -0
  57. package/dist/cjs/net/server.js +1 -0
  58. package/dist/cjs/net/types.js +1 -0
  59. package/dist/cjs/net/validators.js +1 -0
  60. package/dist/cjs/protocol/index.js +1 -0
  61. package/dist/cjs/protocol/intent/define-intent.js +1 -0
  62. package/dist/cjs/protocol/intent/index.js +1 -0
  63. package/dist/cjs/protocol/intent/intent-registry.js +1 -0
  64. package/dist/cjs/protocol/intent/intent.js +1 -0
  65. package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
  66. package/dist/cjs/protocol/rpc/index.js +1 -0
  67. package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
  68. package/dist/cjs/protocol/rpc/rpc.js +1 -0
  69. package/dist/cjs/protocol/snapshot/index.js +1 -0
  70. package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
  71. package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
  72. package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
  73. package/dist/cjs/renderer/base/renderer-2d.js +1 -0
  74. package/dist/cjs/renderer/base/renderer-3d.js +1 -0
  75. package/dist/cjs/renderer/base/renderer.js +1 -0
  76. package/dist/cjs/renderer/gltf/helpers.js +1 -0
  77. package/dist/cjs/renderer/gltf/parser.js +1 -0
  78. package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
  79. package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
  80. package/dist/cjs/renderer/index.js +1 -0
  81. package/dist/cjs/renderer/math.js +1 -0
  82. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
  83. package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
  84. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
  85. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
  86. package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
  87. package/dist/cjs/renderer/spritesheet/parser.js +1 -0
  88. package/dist/cjs/renderer/types.js +1 -0
  89. package/dist/esm/core/binary-codec/binary-codec.js +1 -0
  90. package/dist/esm/core/binary-codec/index.js +1 -0
  91. package/dist/esm/core/driver/driver.js +1 -0
  92. package/dist/esm/core/driver/drivers/immediate.js +1 -0
  93. package/dist/esm/core/driver/drivers/index.js +1 -0
  94. package/dist/esm/core/driver/drivers/raf.js +1 -0
  95. package/dist/esm/core/driver/drivers/timeout.js +1 -0
  96. package/dist/esm/core/driver/index.js +1 -0
  97. package/dist/esm/core/events/event-system.js +1 -0
  98. package/dist/esm/core/events/index.js +1 -0
  99. package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
  100. package/dist/esm/core/fixed-ticker/index.js +1 -0
  101. package/dist/esm/core/free-list/free-list.js +1 -0
  102. package/dist/esm/core/free-list/index.js +1 -0
  103. package/dist/esm/core/generate-id/generate-id.js +1 -0
  104. package/dist/esm/core/generate-id/index.js +1 -0
  105. package/dist/esm/core/index.js +1 -0
  106. package/dist/esm/core/input/index.js +1 -0
  107. package/dist/esm/core/input/manager.js +1 -0
  108. package/dist/esm/core/input/sources/browser.js +1 -0
  109. package/dist/esm/core/input/sources/index.js +1 -0
  110. package/dist/esm/core/input/types.js +0 -0
  111. package/dist/esm/core/lerp/index.js +1 -0
  112. package/dist/esm/core/lerp/lerp.js +1 -0
  113. package/dist/esm/core/navmesh/index.js +1 -0
  114. package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
  115. package/dist/esm/core/navmesh/navmesh.js +1 -0
  116. package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
  117. package/dist/esm/core/pooled-codec/index.js +1 -0
  118. package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
  119. package/dist/esm/core/prediction/index.js +1 -0
  120. package/dist/esm/core/prediction/prediction.js +1 -0
  121. package/dist/esm/core/ray/index.js +1 -0
  122. package/dist/esm/core/ray/ray-2d.js +1 -0
  123. package/dist/esm/core/ray/ray-3d.js +1 -0
  124. package/dist/esm/core/simple-rng/index.js +1 -0
  125. package/dist/esm/core/simple-rng/simple-rng.js +1 -0
  126. package/dist/esm/core/sparse-batcher/index.js +1 -0
  127. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
  128. package/dist/esm/ecs/component-store.js +1 -0
  129. package/dist/esm/ecs/component.js +1 -0
  130. package/dist/esm/ecs/entity-handle.js +1 -0
  131. package/dist/esm/ecs/index.js +1 -0
  132. package/dist/esm/ecs/system-builder.js +1 -0
  133. package/dist/esm/ecs/world-systems.js +1 -0
  134. package/dist/esm/ecs/world.js +1 -0
  135. package/dist/esm/game/index.js +1 -0
  136. package/dist/esm/game/loop/index.js +1 -0
  137. package/dist/esm/game/loop/loop.js +1 -0
  138. package/dist/esm/index.js +1 -0
  139. package/dist/esm/net/adapters/browser-websocket.js +1 -0
  140. package/dist/esm/net/adapters/bun-websocket.js +1 -0
  141. package/dist/esm/net/buffer-pool.js +1 -0
  142. package/dist/esm/net/client.js +1 -0
  143. package/dist/esm/net/index.js +1 -0
  144. package/dist/esm/net/server.js +1 -0
  145. package/dist/esm/net/types.js +1 -0
  146. package/dist/esm/net/validators.js +1 -0
  147. package/dist/esm/protocol/index.js +1 -0
  148. package/dist/esm/protocol/intent/define-intent.js +1 -0
  149. package/dist/esm/protocol/intent/index.js +1 -0
  150. package/dist/esm/protocol/intent/intent-registry.js +1 -0
  151. package/dist/esm/protocol/intent/intent.js +0 -0
  152. package/dist/esm/protocol/rpc/define-rpc.js +1 -0
  153. package/dist/esm/protocol/rpc/index.js +1 -0
  154. package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
  155. package/dist/esm/protocol/rpc/rpc.js +0 -0
  156. package/dist/esm/protocol/snapshot/index.js +1 -0
  157. package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
  158. package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
  159. package/dist/esm/protocol/snapshot/snapshot.js +1 -0
  160. package/dist/esm/renderer/base/renderer-2d.js +1 -0
  161. package/dist/esm/renderer/base/renderer-3d.js +1 -0
  162. package/dist/esm/renderer/base/renderer.js +1 -0
  163. package/dist/esm/renderer/gltf/helpers.js +1 -0
  164. package/dist/esm/renderer/gltf/parser.js +1 -0
  165. package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
  166. package/dist/esm/renderer/gltf/skin-parser.js +1 -0
  167. package/dist/esm/renderer/index.js +1 -0
  168. package/dist/esm/renderer/math.js +1 -0
  169. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
  170. package/dist/esm/renderer/prefab-bucket/index.js +1 -0
  171. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
  172. package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
  173. package/dist/esm/renderer/spritesheet/helpers.js +1 -0
  174. package/dist/esm/renderer/spritesheet/parser.js +1 -0
  175. package/dist/esm/renderer/types.js +0 -0
  176. package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
  177. package/dist/{core → types/core}/events/event-system.d.ts +14 -33
  178. package/dist/types/core/free-list/free-list.d.ts +31 -0
  179. package/dist/types/core/free-list/index.d.ts +1 -0
  180. package/dist/{core → types/core}/index.d.ts +5 -0
  181. package/dist/{core → types/core}/input/index.d.ts +1 -0
  182. package/dist/{core → types/core}/input/manager.d.ts +2 -0
  183. package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
  184. package/dist/types/core/ray/index.d.ts +2 -0
  185. package/dist/types/core/ray/ray-2d.d.ts +37 -0
  186. package/dist/types/core/ray/ray-3d.d.ts +42 -0
  187. package/dist/types/core/simple-rng/index.d.ts +1 -0
  188. package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
  189. package/dist/types/core/sparse-batcher/index.d.ts +1 -0
  190. package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
  191. package/dist/{ecs → types/ecs}/world.d.ts +11 -0
  192. package/dist/{game → types/game}/loop/loop.d.ts +33 -29
  193. package/dist/{index.d.ts → types/index.d.ts} +1 -0
  194. package/dist/{net → types/net}/index.d.ts +2 -2
  195. package/dist/types/renderer/base/renderer-2d.d.ts +13 -0
  196. package/dist/types/renderer/base/renderer-3d.d.ts +10 -0
  197. package/dist/types/renderer/base/renderer.d.ts +21 -0
  198. package/dist/types/renderer/gltf/helpers.d.ts +43 -0
  199. package/dist/types/renderer/gltf/parser.d.ts +49 -0
  200. package/dist/types/renderer/gltf/skeletal-animation.d.ts +96 -0
  201. package/dist/types/renderer/gltf/skin-parser.d.ts +107 -0
  202. package/dist/types/renderer/index.d.ts +15 -0
  203. package/dist/types/renderer/math.d.ts +37 -0
  204. package/dist/types/renderer/prefab-bucket/concrete.d.ts +55 -0
  205. package/dist/types/renderer/prefab-bucket/index.d.ts +113 -0
  206. package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
  207. package/dist/types/renderer/prefab-bucket/specs.d.ts +166 -0
  208. package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
  209. package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
  210. package/dist/types/renderer/types.d.ts +89 -0
  211. package/dist/webgpu/cjs/index.js +5401 -0
  212. package/dist/webgpu/esm/index.js +5378 -0
  213. package/dist/webgpu/types/2d/animation.d.ts +97 -0
  214. package/dist/webgpu/types/2d/renderer.d.ts +86 -0
  215. package/dist/webgpu/types/2d/shader.d.ts +61 -0
  216. package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
  217. package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
  218. package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
  219. package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
  220. package/dist/webgpu/types/3d/renderer.d.ts +266 -0
  221. package/dist/webgpu/types/3d/shader.d.ts +136 -0
  222. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
  223. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +25 -0
  224. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
  225. package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
  226. package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
  227. package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
  228. package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
  229. package/dist/webgpu/types/camera/index.d.ts +2 -0
  230. package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
  231. package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
  232. package/dist/webgpu/types/core/constants.d.ts +59 -0
  233. package/dist/webgpu/types/core/constants.test.d.ts +1 -0
  234. package/dist/webgpu/types/core/index.d.ts +2 -0
  235. package/dist/webgpu/types/core/types.d.ts +125 -0
  236. package/dist/webgpu/types/core/types.test.d.ts +1 -0
  237. package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
  238. package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
  239. package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
  240. package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
  241. package/dist/webgpu/types/geometry/index.d.ts +2 -0
  242. package/dist/webgpu/types/index.d.ts +35 -0
  243. package/dist/webgpu/types/particle/emitter.d.ts +36 -0
  244. package/dist/webgpu/types/shaders/index.d.ts +2 -0
  245. package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
  246. package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
  247. package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
  248. package/dist/webgpu/types/shaders/utils.d.ts +28 -0
  249. package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
  250. package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
  251. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +28 -0
  252. package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
  253. package/package.json +96 -26
  254. package/dist/core/binary-codec/binary-codec.js +0 -354
  255. package/dist/core/binary-codec/index.js +0 -1
  256. package/dist/core/driver/driver.js +0 -47
  257. package/dist/core/driver/drivers/immediate.js +0 -61
  258. package/dist/core/driver/drivers/index.js +0 -3
  259. package/dist/core/driver/drivers/raf.js +0 -62
  260. package/dist/core/driver/drivers/timeout.js +0 -71
  261. package/dist/core/driver/index.js +0 -2
  262. package/dist/core/events/event-system.js +0 -88
  263. package/dist/core/events/index.js +0 -1
  264. package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
  265. package/dist/core/fixed-ticker/index.js +0 -1
  266. package/dist/core/generate-id/generate-id.js +0 -25
  267. package/dist/core/generate-id/index.js +0 -1
  268. package/dist/core/index.js +0 -10
  269. package/dist/core/input/index.js +0 -2
  270. package/dist/core/input/manager.js +0 -211
  271. package/dist/core/input/sources/browser.js +0 -29
  272. package/dist/core/input/sources/index.js +0 -1
  273. package/dist/core/lerp/index.js +0 -1
  274. package/dist/core/lerp/lerp.js +0 -42
  275. package/dist/core/navmesh/index.js +0 -1
  276. package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
  277. package/dist/core/navmesh/navmesh.js +0 -799
  278. package/dist/core/navmesh/navmesh.worker.js +0 -79
  279. package/dist/core/pooled-codec/index.js +0 -1
  280. package/dist/core/pooled-codec/pooled-codec.js +0 -410
  281. package/dist/core/prediction/index.js +0 -1
  282. package/dist/core/prediction/prediction.js +0 -99
  283. package/dist/core.esm.js +0 -1
  284. package/dist/core.js +0 -1
  285. package/dist/ecs/component-store.js +0 -175
  286. package/dist/ecs/component.js +0 -43
  287. package/dist/ecs/entity-handle.js +0 -515
  288. package/dist/ecs/example.js +0 -125
  289. package/dist/ecs/index.js +0 -4
  290. package/dist/ecs/system-builder.js +0 -249
  291. package/dist/ecs/world-systems.js +0 -79
  292. package/dist/ecs/world.js +0 -767
  293. package/dist/game/index.js +0 -1
  294. package/dist/game/loop/index.js +0 -1
  295. package/dist/game/loop/loop.js +0 -108
  296. package/dist/index.js +0 -26
  297. package/dist/net/adapters/browser-websocket.js +0 -74
  298. package/dist/net/adapters/bun-websocket.js +0 -245
  299. package/dist/net/buffer-pool.js +0 -89
  300. package/dist/net/client.js +0 -586
  301. package/dist/net/index.js +0 -58
  302. package/dist/net/server.js +0 -974
  303. package/dist/net/types.js +0 -31
  304. package/dist/net/validators.js +0 -88
  305. package/dist/protocol/index.js +0 -92
  306. package/dist/protocol/intent/define-intent.js +0 -125
  307. package/dist/protocol/intent/index.js +0 -91
  308. package/dist/protocol/intent/intent-registry.js +0 -91
  309. package/dist/protocol/rpc/define-rpc.js +0 -84
  310. package/dist/protocol/rpc/index.js +0 -3
  311. package/dist/protocol/rpc/rpc-registry.js +0 -159
  312. package/dist/protocol/rpc/rpc.js +0 -12
  313. package/dist/protocol/snapshot/index.js +0 -43
  314. package/dist/protocol/snapshot/snapshot-codec.js +0 -67
  315. package/dist/protocol/snapshot/snapshot-registry.js +0 -168
  316. package/dist/protocol/snapshot/snapshot.js +0 -30
  317. package/src/core/binary-codec/README.md +0 -60
  318. package/src/core/binary-codec/binary-codec.test.ts +0 -300
  319. package/src/core/binary-codec/binary-codec.ts +0 -448
  320. package/src/core/binary-codec/index.ts +0 -1
  321. package/src/core/driver/README.md +0 -97
  322. package/src/core/driver/driver.test.ts +0 -414
  323. package/src/core/driver/driver.ts +0 -71
  324. package/src/core/driver/drivers/immediate.ts +0 -66
  325. package/src/core/driver/drivers/index.ts +0 -3
  326. package/src/core/driver/drivers/raf.ts +0 -67
  327. package/src/core/driver/drivers/timeout.ts +0 -77
  328. package/src/core/driver/index.ts +0 -2
  329. package/src/core/events/README.md +0 -47
  330. package/src/core/events/event-system.test.ts +0 -243
  331. package/src/core/events/event-system.ts +0 -140
  332. package/src/core/events/index.ts +0 -1
  333. package/src/core/fixed-ticker/README.md +0 -77
  334. package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
  335. package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
  336. package/src/core/fixed-ticker/index.ts +0 -1
  337. package/src/core/generate-id/README.md +0 -18
  338. package/src/core/generate-id/generate-id.test.ts +0 -79
  339. package/src/core/generate-id/generate-id.ts +0 -37
  340. package/src/core/generate-id/index.ts +0 -1
  341. package/src/core/index.ts +0 -10
  342. package/src/core/input/README.md +0 -24
  343. package/src/core/input/index.ts +0 -2
  344. package/src/core/input/manager.ts +0 -259
  345. package/src/core/input/sources/browser.ts +0 -39
  346. package/src/core/input/sources/index.ts +0 -1
  347. package/src/core/input/types.ts +0 -40
  348. package/src/core/lerp/README.md +0 -79
  349. package/src/core/lerp/index.ts +0 -1
  350. package/src/core/lerp/lerp.test.ts +0 -90
  351. package/src/core/lerp/lerp.ts +0 -42
  352. package/src/core/navmesh/README.md +0 -164
  353. package/src/core/navmesh/index.ts +0 -1
  354. package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
  355. package/src/core/navmesh/navmesh-workers.test.ts +0 -356
  356. package/src/core/navmesh/navmesh.test.ts +0 -344
  357. package/src/core/navmesh/navmesh.ts +0 -1047
  358. package/src/core/navmesh/navmesh.worker.ts +0 -147
  359. package/src/core/pooled-codec/README.md +0 -70
  360. package/src/core/pooled-codec/index.ts +0 -1
  361. package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
  362. package/src/core/pooled-codec/pooled-codec.ts +0 -504
  363. package/src/core/prediction/README.md +0 -64
  364. package/src/core/prediction/index.ts +0 -1
  365. package/src/core/prediction/prediction.test.ts +0 -423
  366. package/src/core/prediction/prediction.ts +0 -112
  367. package/src/ecs/README.md +0 -427
  368. package/src/ecs/benchmark.test.ts +0 -1645
  369. package/src/ecs/component-store.ts +0 -198
  370. package/src/ecs/component.ts +0 -90
  371. package/src/ecs/entity-handle.test.ts +0 -393
  372. package/src/ecs/entity-handle.ts +0 -563
  373. package/src/ecs/example.ts +0 -152
  374. package/src/ecs/index.ts +0 -4
  375. package/src/ecs/system-builder.ts +0 -404
  376. package/src/ecs/world-systems.ts +0 -83
  377. package/src/ecs/world.test.ts +0 -310
  378. package/src/ecs/world.ts +0 -904
  379. package/src/game/index.ts +0 -1
  380. package/src/game/loop/README.md +0 -32
  381. package/src/game/loop/index.ts +0 -1
  382. package/src/game/loop/loop.ts +0 -236
  383. package/src/index.ts +0 -32
  384. package/src/net/README.md +0 -474
  385. package/src/net/adapters/browser-websocket.ts +0 -86
  386. package/src/net/adapters/bun-websocket.ts +0 -292
  387. package/src/net/buffer-pool.ts +0 -106
  388. package/src/net/client.test.ts +0 -807
  389. package/src/net/client.ts +0 -695
  390. package/src/net/index.ts +0 -60
  391. package/src/net/server.test.ts +0 -799
  392. package/src/net/server.ts +0 -1152
  393. package/src/net/types.ts +0 -228
  394. package/src/net/validators.ts +0 -104
  395. package/src/protocol/README.md +0 -469
  396. package/src/protocol/index.ts +0 -93
  397. package/src/protocol/intent/define-intent.test.ts +0 -397
  398. package/src/protocol/intent/define-intent.ts +0 -201
  399. package/src/protocol/intent/index.ts +0 -94
  400. package/src/protocol/intent/intent-registry.test.ts +0 -198
  401. package/src/protocol/intent/intent-registry.ts +0 -112
  402. package/src/protocol/intent/intent.ts +0 -12
  403. package/src/protocol/rpc/define-rpc.test.ts +0 -141
  404. package/src/protocol/rpc/define-rpc.ts +0 -113
  405. package/src/protocol/rpc/index.ts +0 -3
  406. package/src/protocol/rpc/rpc-registry.test.ts +0 -168
  407. package/src/protocol/rpc/rpc-registry.ts +0 -176
  408. package/src/protocol/rpc/rpc.ts +0 -37
  409. package/src/protocol/snapshot/index.ts +0 -45
  410. package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
  411. package/src/protocol/snapshot/snapshot-codec.ts +0 -87
  412. package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
  413. package/src/protocol/snapshot/snapshot-registry.ts +0 -201
  414. package/src/protocol/snapshot/snapshot.test.ts +0 -76
  415. package/src/protocol/snapshot/snapshot.ts +0 -41
  416. /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
  417. /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
  418. /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
  419. /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
  420. /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
  421. /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
  422. /package/dist/{core → types/core}/driver/index.d.ts +0 -0
  423. /package/dist/{core → types/core}/events/index.d.ts +0 -0
  424. /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
  425. /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
  426. /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
  427. /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
  428. /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
  429. /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
  430. /package/dist/{core → types/core}/input/types.d.ts +0 -0
  431. /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
  432. /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
  433. /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
  434. /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
  435. /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
  436. /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
  437. /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
  438. /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
  439. /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
  440. /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
  441. /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
  442. /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
  443. /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
  444. /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
  445. /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
  446. /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
  447. /package/dist/{game → types/game}/index.d.ts +0 -0
  448. /package/dist/{game → types/game}/loop/index.d.ts +0 -0
  449. /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
  450. /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
  451. /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
  452. /package/dist/{net → types/net}/client.d.ts +0 -0
  453. /package/dist/{net → types/net}/server.d.ts +0 -0
  454. /package/dist/{net → types/net}/types.d.ts +0 -0
  455. /package/dist/{net → types/net}/validators.d.ts +0 -0
  456. /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
  457. /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
  458. /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
  459. /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
  460. /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
  461. /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
  462. /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
  463. /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
  464. /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
  465. /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
  466. /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
  467. /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
  468. /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
  469. /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
  470. /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
File without changes
@@ -0,0 +1 @@
1
+ import{BinaryCodec as o}from"../../core/binary-codec";class s{constructor(e){this.schema=e}encode(e){return o.encode(this.schema,e)}decode(e){const c={};for(const n of Object.keys(this.schema)){const r=this.schema[n];c[n]=r.toNil()}return o.decode(this.schema,e,c)}}function a(t){const e=t.schema,c=new s(e);return{method:t.method,codec:c,type:void 0}}export{a as defineRPC};
@@ -0,0 +1 @@
1
+ export*from"./rpc";export*from"./define-rpc";export*from"./rpc-registry";
@@ -0,0 +1 @@
1
+ class i{constructor(){this.codecs=new Map;this.methodToId=new Map;this.idToMethod=new Map;this.nextId=0}register(e){if(this.codecs.has(e.method))throw new Error(`RPC "${e.method}" is already registered`);const o=this.nextId++;this.codecs.set(e.method,e.codec),this.methodToId.set(e.method,o),this.idToMethod.set(o,e.method)}encode(e,o){const t=this.codecs.get(e.method);if(!t)throw new Error(`RPC "${e.method}" is not registered`);const n=this.methodToId.get(e.method),d=t.encode(o),r=new Uint8Array(2+d.byteLength);return new DataView(r.buffer).setUint16(0,n,!0),r.set(new Uint8Array(d),2),r}decode(e){if(e.byteLength<2)throw new Error("Buffer too small for RPC message");const t=new DataView(e.buffer,e.byteOffset).getUint16(0,!0),n=this.idToMethod.get(t);if(!n)throw new Error(`Unknown RPC method ID: ${t}`);const r=this.codecs.get(n).decode(e.slice(2));return{method:n,data:r}}has(e){return this.codecs.has(e)}getMethods(){return Array.from(this.codecs.keys())}getMethodId(e){return this.methodToId.get(e)}release(e,o){const t=this.codecs.get(e);if(!t)throw new Error(`RPC "${e}" is not registered`);"release"in t&&typeof t.release=="function"&&t.release(o)}}export{i as RpcRegistry};
File without changes
@@ -0,0 +1 @@
1
+ import{applySnapshot as t}from"./snapshot";import{SnapshotCodec as e}from"./snapshot-codec";import{SnapshotRegistry as a}from"./snapshot-registry";export{e as SnapshotCodec,a as SnapshotRegistry,t as applySnapshot};
@@ -0,0 +1 @@
1
+ class o{constructor(e){this.updatesCodec=e}encode(e){if(this.updatesCodec.calculateSize&&this.updatesCodec.encodeInto){const n=this.updatesCodec.calculateSize(e.updates),r=new Uint8Array(4+n);return new DataView(r.buffer).setUint32(0,e.tick,!0),this.updatesCodec.encodeInto(e.updates,r,4),r}const a=this.updatesCodec.encode(e.updates),t=new Uint8Array(4+a.length);return new DataView(t.buffer).setUint32(0,e.tick,!0),t.set(a,4),t}decode(e){const a=new DataView(e.buffer,e.byteOffset).getUint32(0,!0),t=e.subarray(4),n=this.updatesCodec.decode(t);return{tick:a,updates:n}}}export{o as SnapshotCodec};
@@ -0,0 +1 @@
1
+ class d{constructor(){this.codecs=new Map;this.typeIds=new Map;this.idToType=new Map;this.nextId=0}register(e,r){if(this.codecs.has(e))throw new Error(`Snapshot type "${e}" is already registered`);const t=this.nextId++;this.codecs.set(e,r),this.typeIds.set(e,t),this.idToType.set(t,e)}encode(e,r){const t=this.codecs.get(e),s=this.typeIds.get(e);if(!t||s===void 0)throw new Error(`No codec registered for snapshot type "${e}"`);if(t.calculateSize&&t.encodeInto){const a=t.calculateSize(r.updates),i=new Uint8Array(5+a);return i[0]=s,new DataView(i.buffer).setUint32(1,r.tick,!0),t.encodeInto(r.updates,i,5),i}const o=t.encode(r.updates),n=new Uint8Array(5+o.length);return n[0]=s,new DataView(n.buffer).setUint32(1,r.tick,!0),n.set(o,5),n}decode(e){const r=e[0],t=this.idToType.get(r);if(!t)throw new Error(`Unknown snapshot type ID: ${r}`);const s=this.codecs.get(t);if(!s)throw new Error(`No codec registered for snapshot type "${t}"`);const o=new DataView(e.buffer,e.byteOffset+1).getUint32(0,!0),n=e.subarray(5),a=s.decode(n);return{type:t,snapshot:{tick:o,updates:a}}}has(e){return this.codecs.has(e)}getTypes(){return Array.from(this.codecs.keys())}release(e,r){const t=this.codecs.get(e);if(!t)throw new Error(`No codec registered for snapshot type "${e}"`);"release"in t&&typeof t.release=="function"&&t.release(r)}}export{d as SnapshotRegistry};
@@ -0,0 +1 @@
1
+ function i(t,n){s(t,n.updates)}function s(t,n){for(const a in n){if(!Object.prototype.hasOwnProperty.call(n,a))continue;const e=n[a],o=t[a];e==null||Array.isArray(e)?t[a]=e:typeof e=="object"&&typeof o=="object"?s(o,e):t[a]=e}}export{i as applySnapshot};
@@ -0,0 +1 @@
1
+ import{BaseRenderer as t}from"./renderer";class p extends t{constructor(r,e){super(r,e),this.maxSprites=e.maxSprites??1024}}export{p as Base2DRenderer};
@@ -0,0 +1 @@
1
+ import{BaseRenderer as a}from"./renderer";class n extends a{constructor(r,e){super(r,e),this.maxModels=e.maxModels??32}}export{n as Base3DRenderer};
@@ -0,0 +1 @@
1
+ class o{constructor(e,r){this._width=0;this._height=0;this._initialized=!1;this.canvas=e,this.options=r,this._clearColor=r.clearColor??[0,0,0,1]}get clearColor(){return this._clearColor}set clearColor(e){this._clearColor=e}get width(){return this._width}get height(){return this._height}get initialized(){return this._initialized}}export{o as BaseRenderer};
@@ -0,0 +1 @@
1
+ const F=g("glTF"),k=g("JSON"),p=g("BIN\0"),C=65535;function U(n,r){if(new Uint32Array(n,0,1)[0]!==F)return{gltf:JSON.parse(new TextDecoder().decode(n)),glbBinaryChunk:null};let c,a=null,t=12;for(;t<n.byteLength;){const i=new Uint32Array(n,t,1)[0],u=new Uint32Array(n,t+4,1)[0];if(t+=8,u===k){const o=new Uint8Array(n,t,i);c=JSON.parse(new TextDecoder().decode(o))}else u===p&&(a=n.slice(t,t+i));t+=i}if(!c)throw new Error(`Invalid GLB: no JSON chunk in ${r}`);return{gltf:c,glbBinaryChunk:a}}function j(n,r,e,c,a){const t=new Map;for(let o=0;o<e.jointCount;o++)t.set(e.jointNodeIndices[o],o);const i=e.inverseBindMatrices,u=new Set;for(const o of n.nodes)o.mesh!==void 0&&o.skin!==void 0&&u.add(o.skin);for(const o of u){if(o===r)continue;const l=n.skins[o];if(!l)continue;const d=l.joints;if(d.length!==e.jointCount)throw new Error(`glTF has incompatible skins (skin ${o} has ${d.length} joints, canonical skin ${r} has ${e.jointCount}). Multi-skeleton models are not supported yet.`);const f=new Uint16Array(d.length);for(let s=0;s<d.length;s++){const b=t.get(d[s]);if(b===void 0)throw new Error(`glTF skin ${o} references node ${d[s]} which is not a joint in canonical skin ${r}. Multi-skeleton models are not supported yet.`);f[s]=b}const A=a(l.inverseBindMatrices).data,h=1e-4;for(let s=0;s<d.length;s++){const b=f[s];for(let w=0;w<16;w++)if(Math.abs(A[s*16+w]-i[b*16+w])>h)throw new Error(`glTF skin ${o} has different inverse bind matrices than canonical skin ${r}. Multi-skeleton models are not supported yet.`)}c.set(o,f)}}function N(n,r,e,c){const a=r!==e?c.get(r):void 0;if(!a)return n;const t=new Uint16Array(n.joints.length);for(let i=0;i<n.joints.length;i++)t[i]=a[n.joints[i]];return{joints:t,weights:n.weights}}function M(n,r){const e=new Float32Array(r(n.attributes.POSITION).data),c=n.attributes.NORMAL!==void 0?new Float32Array(r(n.attributes.NORMAL).data):void 0,a=n.attributes.TEXCOORD_0!==void 0?new Float32Array(r(n.attributes.TEXCOORD_0).data):void 0;let t;if(n.indices!==void 0){const i=r(n.indices);t=i.data.length>C?new Uint32Array(i.data):new Uint16Array(i.data)}return{positions:e,normals:c,uvs:a,indices:t}}function O(n,r,e){const c=n.length/3;for(let a=0;a<c;a++){const t=a*3,i=n[t],u=n[t+1],o=n[t+2];if(n[t]=e[0]*i+e[4]*u+e[8]*o+e[12],n[t+1]=e[1]*i+e[5]*u+e[9]*o+e[13],n[t+2]=e[2]*i+e[6]*u+e[10]*o+e[14],r){const l=r[t],d=r[t+1],f=r[t+2],y=e[0]*l+e[4]*d+e[8]*f,A=e[1]*l+e[5]*d+e[9]*f,h=e[2]*l+e[6]*d+e[10]*f,s=Math.sqrt(y*y+A*A+h*h);s>0&&(r[t]=y/s,r[t+1]=A/s,r[t+2]=h/s)}}}function g(n){return n.charCodeAt(0)|n.charCodeAt(1)<<8|n.charCodeAt(2)<<16|n.charCodeAt(3)<<24}export{O as bakeTransformIntoVertices,U as decodeGltfContainer,M as extractPrimitiveAttributes,N as remapSkinAttributes,j as validateAndBuildSkinRemaps};
@@ -0,0 +1 @@
1
+ import{nodeToMat4 as z}from"../math";import{parseSkin as E,parseAnimations as J,parsePrimitiveSkinAttributes as L,decodeAnimationClip as _,buildNodeToJointMap as W}from"./skin-parser";import{bakeTransformIntoVertices as j,decodeGltfContainer as q,extractPrimitiveAttributes as H,remapSkinAttributes as K,validateAndBuildSkinRemaps as Q}from"./helpers";async function ee(u,v){const V=await fetch(u),I=u.substring(0,u.lastIndexOf("/")+1),O=await V.arrayBuffer(),{gltf:t,glbBinaryChunk:B}=q(O,u);if(!t.meshes?.length)throw new Error(`No meshes found in ${u}`);const w=[];for(let e=0;e<(t.buffers?.length??0);e++){const n=t.buffers[e];if(B&&(!n.uri||n.uri===""))w.push(B);else if(n.uri){const i=await fetch(I+n.uri);w.push(await i.arrayBuffer())}}const d=e=>{const n=t.accessors[e],i=t.bufferViews[n.bufferView],r=w[i.buffer],s={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},o={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4},a={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},p=s[n.componentType],b=o[n.componentType],c=a[n.type]??1,S=(i.byteOffset??0)+(n.byteOffset??0),y=i.byteStride??b*c,m=b*c;if(y===m)return{data:new p(r,S,n.count*c),count:n.count,elementSize:c};const A=new p(n.count*c),h=new Uint8Array(r),k=new Uint8Array(A.buffer);for(let g=0;g<n.count;g++){const N=S+g*y,$=g*m;for(let P=0;P<m;P++)k[$+P]=h[N+P]}return{data:A,count:n.count,elementSize:c}},C=new Map,R=async e=>{if(C.has(e))return C.get(e);const n=t.images?.[e];if(!n)return;let i;if(n.bufferView!==void 0){const r=t.bufferViews[n.bufferView],s=w[r.buffer],o=new Uint8Array(s,r.byteOffset??0,r.byteLength);i=new Blob([o],{type:n.mimeType??"image/png"})}else if(n.uri){const r=n.uri.startsWith("data:")?n.uri:I+n.uri;i=await(await fetch(r)).blob()}if(i){const r=await createImageBitmap(i);return C.set(e,r),r}},G=t.nodes?.findIndex(e=>e.mesh!==void 0&&e.skin!==void 0)??-1,l=G!==-1?t.nodes[G].skin:void 0;let f=null,x=[];const M=new Map;l!==void 0&&t.skins?.[l]&&(f=E(t,l,d),x=J(t,f,d),v?.animations&&(x=x.filter(e=>v.animations.includes(e.name))),Q(t,l,f,M,d));const T=[];for(let e=0;e<t.nodes.length;e++)t.nodes[e].mesh!==void 0&&T.push(e);const F=T.length>0?T.map(e=>t.nodes[e].mesh):[0],U=[];for(const e of F){const n=t.meshes[e];if(!n)continue;const i=t.nodes.find(a=>a.mesh===e),r=i?.skin,s=f!==null&&r!==void 0;let o=null;i&&!s&&(i.scale||i.rotation||i.translation||i.matrix)&&(o=z(i));for(const a of n.primitives){const{positions:p,normals:b,uvs:c,indices:S}=H(a,d);o&&!s&&j(p,b,o);let y;if(a.material!==void 0){const k=t.materials?.[a.material]?.pbrMetallicRoughness?.baseColorTexture?.index;k!==void 0&&t.textures?.[k]&&(y=await R(t.textures[k].source))}let m,A=!1;if(s){const h=L(a,d);h&&(m=K(h,r,l,M),A=!0)}U.push({positions:p,normals:b,uvs:c,indices:S,texture:y,skinAttrs:m,skinned:A})}}let D=null;if(!v?.freezeAnimations&&f){const e=t.animations??[],n=e.map((r,s)=>r.name??`animation_${s}`),i=W(f);D={availableAnimations:n,decodeAnimation(r){const s=e.findIndex((o,a)=>(o.name??`animation_${a}`)===r);if(s<0)throw new Error(`glTF ${u} has no animation named '${r}'`);return _(e[s],`animation_${s}`,i,d)}}}return{src:u,primitives:U,skin:f?{data:f,animClips:x}:null,source:D}}export{ee as parseGltf};
@@ -0,0 +1 @@
1
+ import{trsToMat4 as g,mat4Mul as v}from"../math";import{lerp as b}from"../../core/lerp";class k{constructor(e,o){this.clips=[];this.clipsByName=new Map;this._scratchVec3=new Float32Array(3);this._scratchQuat=new Float32Array(4);this.skinData=e;const n=e.jointCount;this.localMatrices=new Float32Array(n*16),this.worldMatrices=new Float32Array(n*16),this.blendScratch=new Float32Array(n*16),this.originalRestPoseTRS=new Float32Array(e.restPoseTRS),this.currentTRS=new Float32Array(n*10),this.skelRootMat=new Float32Array(16),e.skeletonRootMatrix?this.skelRootMat.set(e.skeletonRootMatrix):(this.skelRootMat[0]=1,this.skelRootMat[5]=1,this.skelRootMat[10]=1,this.skelRootMat[15]=1),this.topoOrder=new Uint16Array(n);const r=new Uint8Array(n);let s=0;const i=t=>{if(r[t])return;r[t]=1;const d=e.parentJointIndices[t];d!==-1&&i(d),this.topoOrder[s++]=t};for(let t=0;t<n;t++)i(t);for(const t of o)this.loadClip(t)}loadClip(e,o=!0){const n=this.clips.length;return this.clips.push({id:n,name:e.name,duration:e.duration,channels:e.channels,loop:o}),this.clipsByName.set(e.name,n),n}replaceClips(e,o=!0){const n=new Map(this.clipsByName),r=this.clips.length;this.clips=[],this.clipsByName.clear();for(const i of e)this.loadClip(i,o);const s=new Int32Array(r).fill(-1);for(const[i,t]of n){const d=this.clipsByName.get(i);d!==void 0&&(s[t]=d)}return s}getClipId(e){const o=this.clipsByName.get(e);if(o===void 0)throw new Error(`Skeletal clip "${e}" not found`);return o}getClipNames(){return this.clips.map(e=>e.name)}getClip(e){return this.clips[e]??null}get clipCount(){return this.clips.length}createState(e,o=1,n=!0){return{clipId:typeof e=="string"?this.getClipId(e):e,time:0,speed:o,playing:n,loop:!0,prevClipId:-1,prevTime:0,prevSpeed:1,blendWeight:1,blendDuration:0,onEnd:()=>null}}play(e,o,n){const r=typeof o=="string"?this.getClipId(o):o,s=n?.crossfade??0;s>0&&e.playing?(e.prevClipId=e.clipId,e.prevTime=e.time,e.prevSpeed=e.speed,e.blendWeight=0,e.blendDuration=s):(e.prevClipId=-1,e.blendWeight=1,e.blendDuration=0),e.onEnd=n?.onEnd??(()=>null),e.loop=n?.loop??!0,e.clipId=r,e.time=0,e.playing=!0,n?.speed!==void 0&&(e.speed=n.speed)}stop(e){e.playing=!1}resume(e){e.playing=!0}update(e,o,n,r=0){const s=this.skinData.jointCount;e.playing&&this.advanceTime(e,o);const i=e.prevClipId!==-1&&e.blendDuration>0&&e.blendWeight<1;if(i&&(e.blendWeight+=o/e.blendDuration,e.blendWeight>=1&&(e.blendWeight=1,e.prevClipId=-1,e.blendDuration=0)),i&&e.prevClipId!==-1){const t=this.clips[e.prevClipId];t&&(e.prevTime+=o*e.prevSpeed,t.loop&&e.prevTime>=t.duration&&(e.prevTime%=t.duration)),this.evaluateClip(e.prevClipId,e.prevTime,this.blendScratch,0),this.evaluateClip(e.clipId,e.time,n,r);const d=e.blendWeight,m=this.blendScratch,l=s*16;for(let a=0;a<l;a++)n[r+a]=b(m[a],n[r+a],d)}else this.evaluateClip(e.clipId,e.time,n,r)}advanceTime(e,o){const n=this.clips[e.clipId];!n||n.duration<=0||(e.time+=o*e.speed,e.time>=n.duration&&(n.loop?e.time%=n.duration:(e.time=n.duration-1e-4,e.playing=!1)),e.time<0&&(n.loop?e.time=n.duration+e.time%n.duration:(e.time=0,e.playing=!1)))}evaluateClip(e,o,n,r){const s=this.clips[e];if(!s)return;const i=this.skinData,t=i.jointCount,d=this.localMatrices,m=this.worldMatrices,l=this.currentTRS;l.set(this.originalRestPoseTRS);for(const p of s.channels){const u=p.jointIndex;if(u>=t)continue;const h=u*10,y=this.sampleChannel(p,o);p.path==="translation"?(l[h]=y[0],l[h+1]=y[1],l[h+2]=y[2]):p.path==="rotation"?(l[h+3]=y[0],l[h+4]=y[1],l[h+5]=y[2],l[h+6]=y[3]):p.path==="scale"&&(l[h+7]=y[0],l[h+8]=y[1],l[h+9]=y[2])}for(let p=0;p<t;p++){const u=p*10;g(l[u],l[u+1],l[u+2],l[u+3],l[u+4],l[u+5],l[u+6],l[u+7],l[u+8],l[u+9],d,p*16)}const a=this.topoOrder,c=this.skelRootMat;for(let p=0;p<t;p++){const u=a[p],h=i.parentJointIndices[u];h===-1?v(c,0,d,u*16,m,u*16):v(m,h*16,d,u*16,m,u*16)}const f=i.inverseBindMatrices;for(let p=0;p<t;p++)v(m,p*16,f,p*16,n,r+p*16)}computeRestPose(e,o=0){const n=this.skinData,r=n.jointCount,s=this.localMatrices,i=this.worldMatrices,t=this.originalRestPoseTRS;for(let a=0;a<r;a++){const c=a*10;g(t[c],t[c+1],t[c+2],t[c+3],t[c+4],t[c+5],t[c+6],t[c+7],t[c+8],t[c+9],s,a*16)}const d=this.topoOrder,m=this.skelRootMat;for(let a=0;a<r;a++){const c=d[a],f=n.parentJointIndices[c];f===-1?v(m,0,s,c*16,i,c*16):v(i,f*16,s,c*16,i,c*16)}const l=n.inverseBindMatrices;for(let a=0;a<r;a++)v(i,a*16,l,a*16,e,o+a*16)}sampleChannel(e,o){const n=e.timestamps,r=e.values,s=e.path==="rotation"?4:3;if(o<=n[0])return r.subarray(0,s);if(o>=n[n.length-1])return r.subarray((n.length-1)*s,n.length*s);let i=0,t=n.length-1;for(;i<t-1;){const p=i+t>>1;n[p]<=o?i=p:t=p}if(e.interpolation==="STEP")return r.subarray(i*s,i*s+s);const d=n[i],m=n[t],l=m>d?(o-d)/(m-d):0,a=i*s,c=t*s;if(e.path==="rotation")return this.nlerpQuat(r,a,r,c,l);const f=this._scratchVec3;return f[0]=b(r[a],r[c],l),f[1]=b(r[a+1],r[c+1],l),f[2]=b(r[a+2],r[c+2],l),f}nlerpQuat(e,o,n,r,s){const i=this._scratchQuat,d=e[o]*n[r]+e[o+1]*n[r+1]+e[o+2]*n[r+2]+e[o+3]*n[r+3]<0?-1:1,m=1-s;i[0]=m*e[o]+s*n[r]*d,i[1]=m*e[o+1]+s*n[r+1]*d,i[2]=m*e[o+2]+s*n[r+2]*d,i[3]=m*e[o+3]+s*n[r+3]*d;const l=Math.sqrt(i[0]*i[0]+i[1]*i[1]+i[2]*i[2]+i[3]*i[3]);if(l>0){const a=1/l;i[0]*=a,i[1]*=a,i[2]*=a,i[3]*=a}return i}}export{k as SkeletalAnimation};
@@ -0,0 +1 @@
1
+ import{nodeToMat4 as T,mat4MulNew as F,mat4IdentityNew as k}from"../math";function D(n,t,o){const s=n.skins[t],r=s.joints,l=r.length,m=o(s.inverseBindMatrices),j=new Float32Array(m.data),y=new Uint16Array(r),f=new Map;for(let i=0;i<l;i++)f.set(r[i],i);const c=new Map;for(let i=0;i<n.nodes.length;i++){const e=n.nodes[i].children;if(e)for(const a of e)c.set(a,i)}const p=new Int16Array(l).fill(-1);for(let i=0;i<l;i++){let e=c.get(r[i]);for(;e!==void 0;){const a=f.get(e);if(a!==void 0){p[i]=a;break}e=c.get(e)}}let A=null;for(let i=0;i<l;i++){if(p[i]!==-1)continue;let e=c.get(r[i]);const a=[];for(;e!==void 0&&!f.has(e);)a.push(e),e=c.get(e);if(a.length>0){A=k();for(let d=a.length-1;d>=0;d--){const S=T(n.nodes[a[d]]);A=F(A,S)}}break}const h=new Float32Array(l*10);for(let i=0;i<l;i++){const e=v(n.nodes[r[i]]);h.set(e,i*10)}return{jointCount:l,jointNodeIndices:y,inverseBindMatrices:j,parentJointIndices:p,skeletonRootMatrix:A,restPoseTRS:h}}function O(n,t,o,s){const r=[];let l=0;for(const m of n.channels){const j=m.target.node,y=o.get(j);if(y===void 0)continue;const f=m.target.path;if(f!=="translation"&&f!=="rotation"&&f!=="scale")continue;const c=n.samplers[m.sampler],p=c.interpolation??"LINEAR";if(p!=="LINEAR"&&p!=="STEP")continue;const A=s(c.input),h=new Float32Array(A.data),i=s(c.output),e=new Float32Array(i.data);if(h.length>0){const a=h[h.length-1];a>l&&(l=a)}r.push({jointIndex:y,path:f,timestamps:h,values:e,interpolation:p})}return r.length===0?null:{name:n.name??t,duration:l,channels:r}}function N(n){const t=new Map;for(let o=0;o<n.jointCount;o++)t.set(n.jointNodeIndices[o],o);return t}function J(n,t,o){if(!n.animations?.length)return[];const s=N(t),r=[];for(let l=0;l<n.animations.length;l++){const m=O(n.animations[l],`animation_${r.length}`,s,o);m&&r.push(m)}return r}function w(n){if(n instanceof Uint8Array){const t=new Float32Array(n.length);for(let o=0;o<n.length;o++)t[o]=n[o]/255;return t}if(n instanceof Uint16Array){const t=new Float32Array(n.length);for(let o=0;o<n.length;o++)t[o]=n[o]/65535;return t}return new Float32Array(n)}function P(n){const t=n.length/4;for(let o=0;o<t;o++){const s=o*4,r=n[s]+n[s+1]+n[s+2]+n[s+3];if(r>0&&Math.abs(r-1)>1e-5){const l=1/r;n[s]*=l,n[s+1]*=l,n[s+2]*=l,n[s+3]*=l}}}function L(n,t){if(n.attributes.JOINTS_0===void 0||n.attributes.WEIGHTS_0===void 0)return null;const o=t(n.attributes.JOINTS_0),s=t(n.attributes.WEIGHTS_0),r=o.data instanceof Uint16Array?o.data:new Uint16Array(o.data),l=w(s.data);return P(l),{joints:r,weights:l}}function v(n){const t=new Float32Array(10);if(n.matrix)return t[0]=n.matrix[12],t[1]=n.matrix[13],t[2]=n.matrix[14],t[3]=0,t[4]=0,t[5]=0,t[6]=1,t[7]=1,t[8]=1,t[9]=1,t;const o=n.translation??[0,0,0],s=n.rotation??[0,0,0,1],r=n.scale??[1,1,1];return t[0]=o[0],t[1]=o[1],t[2]=o[2],t[3]=s[0],t[4]=s[1],t[5]=s[2],t[6]=s[3],t[7]=r[0],t[8]=r[1],t[9]=r[2],t}function E(){return{channels:[],keyframeData:[],clips:[],skins:[],parentIndices:[],topoOrder:[],ibmData:[],restTRS:[],skelRootMats:[],jointChannelLookup:[]}}function B(n,t,o){const s=n.skins.length,r=t.jointCount,l=n.parentIndices.length,m=n.topoOrder.length,j=n.ibmData.length/16,y=n.restTRS.length/10,f=n.skelRootMats.length/16;for(let e=0;e<r;e++)n.parentIndices.push(t.parentJointIndices[e]);const c=new Uint8Array(r),p=e=>{if(c[e])return;c[e]=1;const a=t.parentJointIndices[e];a!==-1&&p(a),n.topoOrder.push(e)};for(let e=0;e<r;e++)p(e);for(let e=0;e<t.inverseBindMatrices.length;e++)n.ibmData.push(t.inverseBindMatrices[e]);for(let e=0;e<r;e++)for(let a=0;a<10;a++)n.restTRS.push(t.restPoseTRS[e*10+a]);if(t.skeletonRootMatrix)for(let e=0;e<16;e++)n.skelRootMats.push(t.skeletonRootMatrix[e]);else{const e=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];for(let a=0;a<16;a++)n.skelRootMats.push(e[a])}const A=n.clips.length,h=n.jointChannelLookup.length;n.skins.push({jointCount:r,parentOffset:l,topoOffset:m,ibmOffset:j,restTRSOffset:y,skelRootMatIndex:f,clipOffset:A,jointLookupStart:h});const i=new Map;for(let e=0;e<r;e++)i.set(t.jointNodeIndices[e],e);for(const e of o){const a=n.channels.length,d=[...e.channels].sort((u,I)=>u.jointIndex-I.jointIndex);for(const u of d){const I=u.path==="translation"?0:u.path==="rotation"?1:2,C=u.interpolation==="STEP"?4:0,R=n.keyframeData.length,g=u.timestamps.length,M=u.path==="rotation"?4:3;for(let b=0;b<g;b++)n.keyframeData.push(u.timestamps[b]);for(let b=0;b<g*M;b++)n.keyframeData.push(u.values[b]);n.channels.push({jointIndex:u.jointIndex,pathAndInterp:I|C,keyframeCount:g,dataOffset:R})}const S=d.length;let x=0;for(let u=0;u<r;u++){const I=x;for(;x<S&&d[x].jointIndex===u;)x++;n.jointChannelLookup.push(a+I),n.jointChannelLookup.push(x-I)}n.clips.push({channelStart:a,channelCount:S,duration:e.duration,looping:1})}return s}export{N as buildNodeToJointMap,E as createPackedAnimationData,O as decodeAnimationClip,v as getNodeTRS,B as packSkinAndAnimations,J as parseAnimations,L as parsePrimitiveSkinAttributes,D as parseSkin};
@@ -0,0 +1 @@
1
+ export*from"./types";export*from"./base/renderer";export*from"./base/renderer-2d";export*from"./base/renderer-3d";export*from"./math";export*from"./gltf/skin-parser";export*from"./gltf/parser";import{SkeletalAnimation as l}from"./gltf/skeletal-animation";export*from"./spritesheet/helpers";export*from"./spritesheet/parser";export*from"./prefab-bucket";export*from"./prefab-bucket/specs";import{PrefabBucket as u}from"./prefab-bucket/concrete";export{u as PrefabBucket,l as SkeletalAnimation};
@@ -0,0 +1 @@
1
+ function N(r,n){r[n]=1,r[n+1]=0,r[n+2]=0,r[n+3]=0,r[n+4]=0,r[n+5]=1,r[n+6]=0,r[n+7]=0,r[n+8]=0,r[n+9]=0,r[n+10]=1,r[n+11]=0,r[n+12]=0,r[n+13]=0,r[n+14]=0,r[n+15]=1}function _(){const r=new Float32Array(16);return r[0]=1,r[5]=1,r[10]=1,r[15]=1,r}function I(r,n,i,a,u,y,o,c,A,F,m,l){const e=a*a,b=u*u,t=y*y,x=a*u,p=a*y,w=u*y,M=o*a,v=o*u,T=o*y;m[l]=(1-2*(b+t))*c,m[l+1]=2*(x+T)*c,m[l+2]=2*(p-v)*c,m[l+3]=0,m[l+4]=2*(x-T)*A,m[l+5]=(1-2*(e+t))*A,m[l+6]=2*(w+M)*A,m[l+7]=0,m[l+8]=2*(p+v)*F,m[l+9]=2*(w-M)*F,m[l+10]=(1-2*(e+b))*F,m[l+11]=0,m[l+12]=r,m[l+13]=n,m[l+14]=i,m[l+15]=1}function g(r){const n=new Float32Array(16);if(r.matrix)return n.set(r.matrix),n;const i=r.translation??[0,0,0],a=r.rotation??[0,0,0,1],u=r.scale??[1,1,1];return I(i[0],i[1],i[2],a[0],a[1],a[2],a[3],u[0],u[1],u[2],n,0),n}const j=new Float32Array(16);function h(r,n,i,a,u,y){for(let o=0;o<4;o++)for(let c=0;c<4;c++)j[c*4+o]=r[n+o]*i[a+c*4]+r[n+4+o]*i[a+c*4+1]+r[n+8+o]*i[a+c*4+2]+r[n+12+o]*i[a+c*4+3];u.set(j,y)}function k(r,n){const i=new Float32Array(16);for(let a=0;a<4;a++)for(let u=0;u<4;u++)i[u*4+a]=r[a]*n[u*4]+r[4+a]*n[u*4+1]+r[8+a]*n[u*4+2]+r[12+a]*n[u*4+3];return i}export{N as mat4Identity,_ as mat4IdentityNew,h as mat4Mul,k as mat4MulNew,g as nodeToMat4,I as trsToMat4};
@@ -0,0 +1 @@
1
+ import{BasePrefabBucket as s}from"./index";import{parsers2d as t,parsers3d as p}from"./parsers";class S extends s{constructor(e){const r=e==="3d"?p:t;super(e,r)}add(e){return super.add(e)}addAll(e){return super.addAll(e)}get(e){return super.get(e)}}export{S as PrefabBucket};
@@ -0,0 +1 @@
1
+ import{EventSystem as n}from"../../core/events";class o{constructor(e,t={}){this.pending=[];this.pendingIds=new Set;this.prefabs=null;this.mode=e,this.parsers=t,this.events=new n({events:["clips-changed"]})}add(e){if(this.prefabs)throw new Error("PrefabBucket: cannot add after load() \u2014 bucket is frozen");if(this.pendingIds.has(e.id))throw new Error(`PrefabBucket: duplicate id '${e.id}'`);return this.pending.push(e),this.pendingIds.add(e.id),this}addAll(e){if(this.prefabs)throw new Error("PrefabBucket: cannot add after load() \u2014 bucket is frozen");const t=new Set;for(const r of e){if(this.pendingIds.has(r.id)||t.has(r.id))throw new Error(`PrefabBucket: duplicate id '${r.id}'`);t.add(r.id)}for(const r of e)this.pending.push(r),this.pendingIds.add(r.id);return this}async load(){if(this.prefabs)return;const e={events:this.events},t=await Promise.all(this.pending.map(a=>{const s=this.parsers[a.type];if(!s)throw new Error(`PrefabBucket: no parser registered for type '${a.type}'`);return s(a,e)})),r=new Map;for(const a of t)r.set(a.id,a);this.prefabs=r,this.pending=[],this.pendingIds.clear()}get(e){if(!this.prefabs)throw new Error(`PrefabBucket: get('${e}') called before load()`);const t=this.prefabs.get(e);if(!t)throw new Error(`PrefabBucket: unknown prefab id '${e}'`);return t}get loaded(){return this.prefabs!==null}get size(){return this.prefabs?this.prefabs.size:this.pending.length}entries(){if(!this.prefabs)throw new Error("PrefabBucket: entries() called before load()");return Array.from(this.prefabs.values())}getAllByType(e){if(!this.prefabs)throw new Error(`PrefabBucket: getAllByType('${e}') called before load()`);const t=[];for(const r of this.prefabs.values())r.type===e&&t.push(r);return t}resetAnimations(){if(this.prefabs)for(const e of this.prefabs.values())e.resetAnimations?.()}}export{o as BasePrefabBucket};
@@ -0,0 +1 @@
1
+ import{parseGltf as w}from"../gltf/parser";import{parseSpritesheet as y}from"../spritesheet/parser";const v={gltf:async(n,l)=>{if(n.type!=="gltf")throw new Error("gltf parser given non-gltf spec");const t=await w(n.src,{animations:n.animations!==void 0?[...n.animations]:void 0,freezeAnimations:n.freezeAnimations===!0}),c=t.primitives.filter(o=>o.skinned).length,u=t.skin?.data.jointCount??0;let g=0;for(const o of t.primitives)g+=o.positions.length/3;const i={type:"gltf",id:n.id,parsed:t,skinnedPartCount:c,jointCount:u,totalVertexCount:g,metadata:n.metadata??{}},p=n.animations!==void 0?[...n.animations]:t.skin?.animClips.map(o=>o.name)??[];if(p.length>0){const o={};for(const d of p)o[d]=d;i.animations=o,i.animationList=p}if(n.freezeAnimations!==!0){i.loadAnimations=async d=>{const a=t.skin,f=t.source;if(!a||!f)throw new Error(`loadAnimations: prefab '${n.id}' has no source \u2014 was the model skinned and not frozen?`);const m=new Set(a.animClips.map(r=>r.name)),e=[];for(const r of d){if(m.has(r))continue;const s=f.decodeAnimation(r);s&&(a.animClips.push(s),m.add(r),e.push(r))}if(e.length>0){i.animationList||(i.animationList=[]),i.animations||(i.animations={});const r=i.animationList,s=i.animations;for(const h of e)r.push(h),s[h]=h;l.events.emit("clips-changed",{prefabId:n.id,added:e,removed:[]})}},i.unloadAnimations=d=>{const a=t.skin;if(!a)return;const f=new Set(d),m=[];if(a.animClips=a.animClips.filter(e=>f.has(e.name)?(m.push(e.name),!1):!0),m.length>0){const e=i.animationList;if(e)for(let s=e.length-1;s>=0;s--)f.has(e[s])&&e.splice(s,1);const r=i.animations;if(r)for(const s of m)delete r[s];l.events.emit("clips-changed",{prefabId:n.id,added:[],removed:m})}};const o=new Set(p);i.resetAnimations=()=>{const d=t.skin;if(!d)return;const a=[];for(const f of d.animClips)o.has(f.name)||a.push(f.name);a.length>0&&i.unloadAnimations(a)}}return i},grid:n=>{if(n.type!=="grid")throw new Error("grid parser given non-grid spec");return{type:"grid",id:n.id,size:n.size,step:n.step,lineWidth:n.lineWidth,metadata:n.metadata??{}}}},k={spritesheet:async(n,l)=>{if(n.type!=="spritesheet")throw new Error("spritesheet parser given non-spritesheet spec");const t=await y({image:n.src,frameWidth:n.frameWidth,frameHeight:n.frameHeight,data:n.data});return{type:"spritesheet",id:n.id,parsed:t,frameCount:t.uvs.length,width:t.width,height:t.height,metadata:n.metadata??{}}}};export{k as parsers2d,v as parsers3d};
File without changes
@@ -0,0 +1 @@
1
+ function c(e,n,r,o){const s=Math.floor(e/r),t=Math.floor(n/o),u=[];for(let m=0;m<t;m++)for(let a=0;a<s;a++)u.push({minX:a*r/e,minY:m*o/n,maxX:(a+1)*r/e,maxY:(m+1)*o/n});return u}function i(e){const{w:n,h:r}=e.meta.size,o=[];for(const s of Object.keys(e.frames)){const t=e.frames[s].frame;o.push({minX:t.x/n,minY:t.y/r,maxX:(t.x+t.w)/n,maxY:(t.y+t.h)/r})}return o}async function p(e){const r=await(await fetch(e)).blob();return createImageBitmap(r)}export{c as computeGridUVs,i as computeTexturePackerUVs,p as loadImage};
@@ -0,0 +1 @@
1
+ import{computeGridUVs as r,computeTexturePackerUVs as m,loadImage as p}from"./helpers";async function n(e){const t=await p(e.image);let i;if(e.data){const a=await(await fetch(e.data)).json();i=m(a)}else e.frameWidth&&e.frameHeight?i=r(t.width,t.height,e.frameWidth,e.frameHeight):i=[{minX:0,minY:0,maxX:1,maxY:1}];return{bitmap:t,uvs:i,width:t.width,height:t.height}}export{n as parseSpritesheet};
File without changes
@@ -80,6 +80,8 @@ export declare class BinaryPrimitives {
80
80
  static readonly i16: Field<number>;
81
81
  /** Signed 32-bit integer (big-endian) */
82
82
  static readonly i32: Field<number>;
83
+ /** 16-bit floating point number (IEEE 754, big-endian) */
84
+ static readonly f16: Field<number>;
83
85
  /** 32-bit floating point number (IEEE 754, big-endian) */
84
86
  static readonly f32: Field<number>;
85
87
  /** 64-bit floating point number (double, big-endian) */
@@ -154,6 +156,8 @@ export declare class BinaryCodec extends BaseBinaryCodec {
154
156
  static readonly i16: Field<number>;
155
157
  /** Signed 32-bit integer field */
156
158
  static readonly i32: Field<number>;
159
+ /** 16-bit floating point field */
160
+ static readonly f16: Field<number>;
157
161
  /** 32-bit floating point field */
158
162
  static readonly f32: Field<number>;
159
163
  /** Boolean field */
@@ -10,62 +10,43 @@ interface EventSystemProps<EventNames extends string> {
10
10
  events: EventNames[];
11
11
  }
12
12
  /**
13
- * @description
14
- * A callback-based event handling system designed to simplify
15
- * event-driven programming.
13
+ * Zero-allocation event system. Uses flat arrays instead of Map/Set
14
+ * to avoid iterator allocations on every emit().
16
15
  */
17
16
  export declare class EventSystem<EventTuple extends [string, unknown][]> {
18
- /**
19
- * @private
20
- * @description
21
- * The map of registered events and their callbacks.
22
- */
23
- private callbacks;
24
- /**
25
- * @private
26
- * @description
27
- * The list of events that were registered.
28
- */
17
+ private eventIndex;
18
+ private callbackArrays;
19
+ private callbackCounts;
29
20
  private events;
21
+ private emitting;
30
22
  constructor({ events }: EventSystemProps<string>);
31
23
  /**
32
- * @description
33
24
  * Registers a callback for an event.
34
- *
35
- * @param name Event name
36
- * @param callback Callback to run when the event is emitted
37
25
  */
38
26
  on<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name: EventName, callback: Callback<EventMapFromTuple<EventTuple>[EventName]>): void;
39
27
  /**
40
- * @description
41
28
  * Registers a callback for an event that runs only once.
42
- *
43
- * @param name Event name
44
- * @param callback Callback to run when the event is emitted
45
29
  */
46
30
  once<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name: EventName, callback: Callback<EventMapFromTuple<EventTuple>[EventName]>): void;
47
31
  /**
48
- * @description
49
32
  * Emits an event, running all registered callbacks.
50
- *
51
- * @param name Event name
52
- * @param data Event data
33
+ * Zero allocations — iterates a flat array with an index loop.
34
+ * Safe to call off() during emit (nulled slots are skipped).
53
35
  */
54
36
  emit<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name: EventName, data: EventMapFromTuple<EventTuple>[EventName]): void;
55
37
  /**
56
- * @description
57
38
  * Removes a callback from an event.
58
- *
59
- * @param name Event name
60
- * @param callback Callback to remove
39
+ * During emit: nulls the slot (compacted after emit finishes).
40
+ * Outside emit: swap-and-pop for O(1).
61
41
  */
62
42
  off<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name: EventName, callback: Callback<EventMapFromTuple<EventTuple>[EventName]>): void;
63
43
  /**
64
- * @description
65
44
  * Removes all callbacks.
66
- *
67
- * @param name Optional event name
68
45
  */
69
46
  clear<EventName extends keyof EventMapFromTuple<EventTuple> & string>(name?: EventName): void;
47
+ /**
48
+ * Remove null gaps left by off() during emit.
49
+ */
50
+ private compact;
70
51
  }
71
52
  export {};
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Free list allocator. Zero-GC, O(1) alloc/free.
3
+ */
4
+ export declare class FreeList {
5
+ private freeList;
6
+ private freeCount;
7
+ private capacity;
8
+ constructor(capacity: number);
9
+ /**
10
+ * Allocate an index from the pool.
11
+ * @returns Available index, or -1 if exhausted
12
+ */
13
+ allocate(): number;
14
+ /**
15
+ * Return an index to the pool for reuse.
16
+ * @param index Index to free
17
+ */
18
+ free(index: number): void;
19
+ /**
20
+ * Check if an index can be allocated.
21
+ */
22
+ hasAvailable(): boolean;
23
+ /**
24
+ * Get number of available slots.
25
+ */
26
+ getAvailableCount(): number;
27
+ /**
28
+ * Get number of allocated slots.
29
+ */
30
+ getAllocatedCount(): number;
31
+ }
@@ -0,0 +1 @@
1
+ export * from "./free-list";
@@ -8,3 +8,8 @@ export * from './navmesh';
8
8
  export * from './pooled-codec';
9
9
  export * from './prediction';
10
10
  export * from './input';
11
+ export * from './free-list';
12
+ export * from './sparse-batcher';
13
+ export * from './simple-rng';
14
+ export * from './ray';
15
+ export * from '../renderer';
@@ -1,2 +1,3 @@
1
1
  export * from "./manager";
2
2
  export * from "./sources";
3
+ export type { InputSnapshot } from "./types";
@@ -12,6 +12,8 @@ export declare class InputManager {
12
12
  private keys;
13
13
  private prevKeys;
14
14
  private mouse;
15
+ private lastClientX;
16
+ private lastClientY;
15
17
  private prevMouse;
16
18
  private snapshotA;
17
19
  private snapshotB;
@@ -69,26 +69,6 @@ export interface PolygonObstacle extends BaseObstacle {
69
69
  pos: Vec2;
70
70
  rotation?: number;
71
71
  }
72
- /**
73
- * Manages obstacles with spatial hashing for fast queries.
74
- * Version tracking prevents unnecessary rebuilds.
75
- */
76
- declare class Obstacles {
77
- private items;
78
- private spatial;
79
- private _cachedItems;
80
- dirty: boolean;
81
- version: number;
82
- add(obstacle: ObstacleInput): ObstacleId;
83
- move(id: ObstacleId, pos: Vec2): void;
84
- remove(id: ObstacleId): void;
85
- /**
86
- * Fast spatial query using hash grid.
87
- * O(1) average case instead of O(n) linear scan.
88
- */
89
- at(pos: Vec2): Obstacle | undefined;
90
- get values(): Obstacle[];
91
- }
92
72
  type NavType = 'grid' | 'graph';
93
73
  /**
94
74
  * Navigation mesh with spatial hashing and smart rebuild.
@@ -132,7 +112,7 @@ export declare class NavMesh<TWorkers extends boolean | 'auto' = false> {
132
112
  private grid?;
133
113
  private graph?;
134
114
  private lastVersion;
135
- obstacles: Obstacles;
115
+ private obstacles;
136
116
  private options;
137
117
  private workerPool?;
138
118
  private pendingPaths;
@@ -0,0 +1,2 @@
1
+ export * from './ray-2d';
2
+ export * from './ray-3d';
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Ray2D — a 2D ray defined by an origin and a normalized direction.
3
+ * Zero allocations per intersection test.
4
+ *
5
+ * All intersection methods return the parametric distance `t` along the ray
6
+ * to the first hit point, or `null` if there is no intersection.
7
+ * A hit point can be retrieved via `ray.at(t)`.
8
+ */
9
+ export declare class Ray2D {
10
+ origin: [number, number];
11
+ direction: [number, number];
12
+ private _point;
13
+ /**
14
+ * Set origin and direction. Direction is normalized automatically.
15
+ */
16
+ set(ox: number, oy: number, dx: number, dy: number): void;
17
+ /**
18
+ * Returns the point at distance `t` along the ray.
19
+ * Reuses an internal buffer — copy if you need to store the result.
20
+ */
21
+ at(t: number): [number, number];
22
+ /**
23
+ * Intersection with a line segment from (ax, ay) to (bx, by).
24
+ * Returns `t` if the ray hits the segment, `null` otherwise.
25
+ */
26
+ intersectsSegment(ax: number, ay: number, bx: number, by: number): number | null;
27
+ /**
28
+ * Intersection with a circle at (cx, cy) with radius r.
29
+ * Returns `t` at the entry point (or exit if origin is inside), `null` if no hit.
30
+ */
31
+ intersectsCircle(cx: number, cy: number, r: number): number | null;
32
+ /**
33
+ * Intersection with an axis-aligned bounding box.
34
+ * Returns `t` at the entry point, `null` if no hit.
35
+ */
36
+ intersectsAABB(minX: number, minY: number, maxX: number, maxY: number): number | null;
37
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Ray3D — a 3D ray defined by an origin and a normalized direction.
3
+ * Zero allocations per intersection test.
4
+ *
5
+ * All intersection methods return the parametric distance `t` along the ray
6
+ * to the first hit point, or `null` if there is no intersection.
7
+ * A hit point can be retrieved via `ray.at(t)`.
8
+ */
9
+ export declare class Ray3D {
10
+ origin: [number, number, number];
11
+ direction: [number, number, number];
12
+ private _point;
13
+ /**
14
+ * Set origin and direction. Direction is normalized automatically.
15
+ */
16
+ set(ox: number, oy: number, oz: number, dx: number, dy: number, dz: number): void;
17
+ /**
18
+ * Returns the point at distance `t` along the ray.
19
+ * Reuses an internal buffer — copy if you need to store the result.
20
+ */
21
+ at(t: number): [number, number, number];
22
+ /**
23
+ * Intersection with a plane defined by normal (nx, ny, nz) and offset d (n·x = d).
24
+ * Returns `t` at the hit point, `null` if the ray is parallel or hits behind the origin.
25
+ */
26
+ intersectsPlane(nx: number, ny: number, nz: number, d: number): number | null;
27
+ /**
28
+ * Intersection with a sphere at (cx, cy, cz) with radius r.
29
+ * Returns `t` at the entry point (or exit if origin is inside), `null` if no hit.
30
+ */
31
+ intersectsSphere(cx: number, cy: number, cz: number, r: number): number | null;
32
+ /**
33
+ * Intersection with an axis-aligned bounding box.
34
+ * Returns `t` at the entry point, `null` if no hit.
35
+ */
36
+ intersectsAABB(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): number | null;
37
+ /**
38
+ * Intersection with a triangle using the Möller–Trumbore algorithm.
39
+ * Returns `t` at the hit point, `null` if no hit.
40
+ */
41
+ intersectsTriangle(ax: number, ay: number, az: number, bx: number, by: number, bz: number, cx: number, cy: number, cz: number): number | null;
42
+ }
@@ -0,0 +1 @@
1
+ export * from "./simple-rng";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * SimpleRNG — deterministic, seedable, zero-allocation pseudo-random number generator.
3
+ * Uses a 32-bit LCG (Linear Congruential Generator).
4
+ *
5
+ * Ideal for gameplay logic that must be reproducible (multiplayer, replays),
6
+ * particle systems, procedural generation, and any hot path where
7
+ * Math.random() is too slow or non-deterministic.
8
+ */
9
+ export declare class SimpleRNG {
10
+ private state;
11
+ constructor(seed?: number);
12
+ /**
13
+ * Returns a float in [0, 1).
14
+ */
15
+ rand(): number;
16
+ /**
17
+ * Returns a float in [min, max).
18
+ */
19
+ range(min: number, max: number): number;
20
+ /**
21
+ * Returns an integer in [min, max] (inclusive).
22
+ */
23
+ int(min: number, max: number): number;
24
+ /**
25
+ * Returns true with the given probability (0-1).
26
+ */
27
+ chance(probability: number): boolean;
28
+ /**
29
+ * Pick a random element from an array.
30
+ */
31
+ pick<T>(array: T[]): T;
32
+ /**
33
+ * Reset to a new seed.
34
+ */
35
+ seed(value: number): void;
36
+ }
@@ -0,0 +1 @@
1
+ export * from "./sparse-batcher";
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SparseBatcher — organizes sprite slots into [layer][sheet] buckets for draw calls.
3
+ * Only allocates buckets that are actually used. Most games use <10 buckets total.
4
+ *
5
+ * Memory (10k sprites, 3 layers × 4 sheets = 12 buckets):
6
+ * buckets: 12 × 10,000 × 4 bytes = ~480 KB (lazy, only used buckets)
7
+ * bucketSizes: 16384 × 4 bytes = 64 KB
8
+ * activeBuckets: 16384 × 2 bytes = 32 KB
9
+ * Total: ~576 KB base + buckets as needed
10
+ *
11
+ * MAX_SHEETS = 64 supports up to 64 unique model/spritesheet IDs per layer.
12
+ */
13
+ export declare class SparseBatcher {
14
+ private static readonly MAX_LAYERS;
15
+ private static readonly MAX_SHEETS;
16
+ private static readonly MAX_BUCKETS;
17
+ private readonly BUCKET_INITIAL_SIZE;
18
+ private buckets;
19
+ private bucketSizes;
20
+ private activeBuckets;
21
+ private sortBuffer;
22
+ private activeCount;
23
+ private readonly capacity;
24
+ constructor(capacity: number);
25
+ /**
26
+ * Compute a flat key from layer + sheet.
27
+ */
28
+ private key;
29
+ /**
30
+ * Register a sprite slot into its (layer, sheet) bucket.
31
+ */
32
+ add(layer: number, sheetId: number, slot: number): void;
33
+ /**
34
+ * Remove a sprite slot from its (layer, sheet) bucket.
35
+ * Uses swap-and-pop for O(1) removal within the bucket.
36
+ */
37
+ remove(layer: number, sheetId: number, slot: number): void;
38
+ /**
39
+ * Iterate active buckets in layer order (back-to-front), zero allocations.
40
+ * Callback receives sheetId and a subarray view of instance indices.
41
+ */
42
+ each(cb: (sheetId: number, instances: Uint32Array, count: number) => void): void;
43
+ /**
44
+ * Get the number of active buckets.
45
+ */
46
+ getActiveCount(): number;
47
+ /**
48
+ * Get total sprite count across all buckets.
49
+ */
50
+ getTotalCount(): number;
51
+ /**
52
+ * Clear all buckets.
53
+ */
54
+ clear(): void;
55
+ }
@@ -68,6 +68,8 @@ export declare class World extends WorldSystems {
68
68
  private archetypeVersion;
69
69
  private queryCacheVersions;
70
70
  private queryMaskCache;
71
+ private despawnedBuffer;
72
+ private despawnedCount;
71
73
  private worldId;
72
74
  constructor(config: WorldConfig);
73
75
  /**
@@ -135,6 +137,15 @@ export declare class World extends WorldSystems {
135
137
  * Check if an entity is alive
136
138
  */
137
139
  isAlive(entity: Entity): boolean;
140
+ /**
141
+ * Get entities despawned since the last flushDespawned() call.
142
+ * Returns a subarray view — zero allocations.
143
+ */
144
+ getDespawned(): Uint32Array;
145
+ /**
146
+ * Clear the despawn tracker. Call once per tick after processing despawns.
147
+ */
148
+ flushDespawned(): void;
138
149
  /**
139
150
  * Invalidate all query caches (called on archetype changes).
140
151
  */