murow 0.0.73 → 0.1.3

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 (188) hide show
  1. package/README.md +15 -1
  2. package/dist/cjs/core/binary-codec/binary-codec.js +1 -1
  3. package/dist/cjs/core/clock/clock.js +1 -0
  4. package/dist/cjs/core/clock/index.js +1 -0
  5. package/dist/cjs/core/driver/driver.js +1 -1
  6. package/dist/cjs/core/driver/drivers/immediate.js +1 -1
  7. package/dist/cjs/core/driver/drivers/raf.js +1 -1
  8. package/dist/cjs/core/driver/drivers/timeout.js +1 -1
  9. package/dist/cjs/core/hitbox/hitbox-library.js +1 -0
  10. package/dist/cjs/core/hitbox/hitbox.js +1 -0
  11. package/dist/cjs/core/hitbox/index.js +1 -0
  12. package/dist/cjs/core/hitbox/test.js +1 -0
  13. package/dist/cjs/core/index.js +1 -1
  14. package/dist/cjs/core/input/index.js +1 -1
  15. package/dist/cjs/core/input/mouse-look/index.js +1 -0
  16. package/dist/cjs/core/input/mouse-look/mouse-look.js +1 -0
  17. package/dist/cjs/core/input/scroll-zoom/index.js +1 -0
  18. package/dist/cjs/core/input/scroll-zoom/scroll-zoom.js +1 -0
  19. package/dist/cjs/core/prediction/prediction.js +1 -1
  20. package/dist/cjs/core/ray/ray-3d.js +1 -1
  21. package/dist/cjs/core/raycast/hit-buffer.js +1 -0
  22. package/dist/cjs/core/raycast/index.js +1 -0
  23. package/dist/cjs/core/raycast/raycaster.js +1 -0
  24. package/dist/cjs/core/slot-map/index.js +1 -0
  25. package/dist/cjs/core/slot-map/slot-map.js +1 -0
  26. package/dist/cjs/core/state-machine/index.js +1 -0
  27. package/dist/cjs/core/state-machine/state-machine.js +1 -0
  28. package/dist/cjs/core/timeline/index.js +1 -0
  29. package/dist/cjs/core/timeline/timeline.js +1 -0
  30. package/dist/cjs/ecs/component.js +1 -1
  31. package/dist/cjs/ecs/system-builder.js +1 -1
  32. package/dist/cjs/ecs/world.js +1 -1
  33. package/dist/cjs/game/loop/loop.js +1 -1
  34. package/dist/cjs/game/loop/ticker-schedule.js +1 -0
  35. package/dist/cjs/net/adapters/bun-websocket.js +1 -1
  36. package/dist/cjs/renderer/index.js +1 -1
  37. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -1
  38. package/dist/cjs/renderer/prefab-bucket/index.js +1 -1
  39. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -1
  40. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -1
  41. package/dist/cjs/renderer/raycast/index.js +1 -0
  42. package/dist/cjs/renderer/raycast/raycast.js +1 -0
  43. package/dist/esm/core/binary-codec/binary-codec.js +1 -1
  44. package/dist/esm/core/clock/clock.js +1 -0
  45. package/dist/esm/core/clock/index.js +1 -0
  46. package/dist/esm/core/driver/drivers/immediate.js +1 -1
  47. package/dist/esm/core/driver/drivers/raf.js +1 -1
  48. package/dist/esm/core/driver/drivers/timeout.js +1 -1
  49. package/dist/esm/core/hitbox/hitbox-library.js +1 -0
  50. package/dist/esm/core/hitbox/hitbox.js +1 -0
  51. package/dist/esm/core/hitbox/index.js +1 -0
  52. package/dist/esm/core/hitbox/test.js +1 -0
  53. package/dist/esm/core/index.js +1 -1
  54. package/dist/esm/core/input/index.js +1 -1
  55. package/dist/esm/core/input/mouse-look/index.js +1 -0
  56. package/dist/esm/core/input/mouse-look/mouse-look.js +1 -0
  57. package/dist/esm/core/input/scroll-zoom/index.js +1 -0
  58. package/dist/esm/core/input/scroll-zoom/scroll-zoom.js +1 -0
  59. package/dist/esm/core/prediction/prediction.js +1 -1
  60. package/dist/esm/core/ray/ray-3d.js +1 -1
  61. package/dist/esm/core/raycast/hit-buffer.js +1 -0
  62. package/dist/esm/core/raycast/index.js +1 -0
  63. package/dist/esm/core/raycast/raycaster.js +1 -0
  64. package/dist/esm/core/slot-map/index.js +1 -0
  65. package/dist/esm/core/slot-map/slot-map.js +1 -0
  66. package/dist/esm/core/state-machine/index.js +1 -0
  67. package/dist/esm/core/state-machine/state-machine.js +1 -0
  68. package/dist/esm/core/timeline/index.js +1 -0
  69. package/dist/esm/core/timeline/timeline.js +1 -0
  70. package/dist/esm/ecs/component.js +1 -1
  71. package/dist/esm/ecs/system-builder.js +1 -1
  72. package/dist/esm/ecs/world.js +1 -1
  73. package/dist/esm/game/loop/loop.js +1 -1
  74. package/dist/esm/game/loop/ticker-schedule.js +1 -0
  75. package/dist/esm/net/adapters/bun-websocket.js +1 -1
  76. package/dist/esm/renderer/index.js +1 -1
  77. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -1
  78. package/dist/esm/renderer/prefab-bucket/index.js +1 -1
  79. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -1
  80. package/dist/esm/renderer/raycast/index.js +1 -0
  81. package/dist/esm/renderer/raycast/raycast.js +1 -0
  82. package/dist/netcode/cjs/index.js +1556 -0
  83. package/dist/netcode/esm/index.js +1534 -0
  84. package/dist/netcode/types/client/game-client.d.ts +139 -0
  85. package/dist/netcode/types/client/index.d.ts +1 -0
  86. package/dist/netcode/types/client/strategies/snapshot-interpolation.d.ts +33 -0
  87. package/dist/netcode/types/client/strategies/snapshot-interpolation.test.d.ts +1 -0
  88. package/dist/netcode/types/codec/delta-codec.d.ts +17 -0
  89. package/dist/netcode/types/codec/delta-codec.test.d.ts +1 -0
  90. package/dist/netcode/types/codec/index.d.ts +1 -0
  91. package/dist/netcode/types/components/index.d.ts +1 -0
  92. package/dist/netcode/types/components/sync-spec.d.ts +49 -0
  93. package/dist/netcode/types/components/sync-spec.test.d.ts +1 -0
  94. package/dist/netcode/types/ctx.d.ts +105 -0
  95. package/dist/netcode/types/ctx.test.d.ts +1 -0
  96. package/dist/netcode/types/handlers/define-handlers.d.ts +47 -0
  97. package/dist/netcode/types/handlers/index.d.ts +1 -0
  98. package/dist/netcode/types/index.d.ts +11 -0
  99. package/dist/netcode/types/integration.test.d.ts +1 -0
  100. package/dist/netcode/types/intents/define-intents.d.ts +53 -0
  101. package/dist/netcode/types/intents/define-intents.test.d.ts +1 -0
  102. package/dist/netcode/types/intents/index.d.ts +1 -0
  103. package/dist/netcode/types/network/base.d.ts +120 -0
  104. package/dist/netcode/types/network/index.d.ts +2 -0
  105. package/dist/netcode/types/network/transport.d.ts +1 -0
  106. package/dist/netcode/types/packets/convergence.test.d.ts +1 -0
  107. package/dist/netcode/types/packets/harness.d.ts +103 -0
  108. package/dist/netcode/types/packets/index.d.ts +2 -0
  109. package/dist/netcode/types/packets/intermittent-intents.test.d.ts +1 -0
  110. package/dist/netcode/types/packets/pathological.test.d.ts +1 -0
  111. package/dist/netcode/types/packets/peer-interpolation.test.d.ts +1 -0
  112. package/dist/netcode/types/packets/reordering.test.d.ts +1 -0
  113. package/dist/netcode/types/packets/virtual-network.d.ts +65 -0
  114. package/dist/netcode/types/predictions/define-predictions.d.ts +45 -0
  115. package/dist/netcode/types/predictions/define-predictions.test.d.ts +1 -0
  116. package/dist/netcode/types/predictions/index.d.ts +1 -0
  117. package/dist/netcode/types/reconciliation.test.d.ts +1 -0
  118. package/dist/netcode/types/rpcs/define-rpcs.d.ts +44 -0
  119. package/dist/netcode/types/rpcs/define-rpcs.test.d.ts +1 -0
  120. package/dist/netcode/types/rpcs/index.d.ts +1 -0
  121. package/dist/netcode/types/server/game-server.d.ts +77 -0
  122. package/dist/netcode/types/server/index.d.ts +2 -0
  123. package/dist/netcode/types/server/plugins/aoi-grid.d.ts +34 -0
  124. package/dist/netcode/types/server/plugins/index.d.ts +3 -0
  125. package/dist/netcode/types/server/plugins/lag-compensation.d.ts +34 -0
  126. package/dist/netcode/types/server/plugins/plugin.d.ts +24 -0
  127. package/dist/netcode/types/tick-rate.test.d.ts +1 -0
  128. package/dist/netcode/types/transports/index.d.ts +1 -0
  129. package/dist/netcode/types/transports/memory-transport.d.ts +51 -0
  130. package/dist/netcode/types/types.test.d.ts +1 -0
  131. package/dist/types/core/binary-codec/binary-codec.d.ts +89 -31
  132. package/dist/types/core/clock/clock.d.ts +37 -0
  133. package/dist/types/core/clock/index.d.ts +1 -0
  134. package/dist/types/core/driver/driver.d.ts +8 -8
  135. package/dist/types/core/driver/drivers/immediate.d.ts +4 -4
  136. package/dist/types/core/driver/drivers/raf.d.ts +6 -6
  137. package/dist/types/core/driver/drivers/timeout.d.ts +4 -4
  138. package/dist/types/core/hitbox/hitbox-library.d.ts +29 -0
  139. package/dist/types/core/hitbox/hitbox.d.ts +50 -0
  140. package/dist/types/core/hitbox/index.d.ts +3 -0
  141. package/dist/types/core/hitbox/test.d.ts +44 -0
  142. package/dist/types/core/index.d.ts +6 -0
  143. package/dist/types/core/input/index.d.ts +2 -0
  144. package/dist/types/core/input/mouse-look/index.d.ts +1 -0
  145. package/dist/types/core/input/mouse-look/mouse-look.d.ts +139 -0
  146. package/dist/types/core/input/scroll-zoom/index.d.ts +1 -0
  147. package/dist/types/core/input/scroll-zoom/scroll-zoom.d.ts +38 -0
  148. package/dist/types/core/prediction/prediction.d.ts +35 -58
  149. package/dist/types/core/ray/ray-3d.d.ts +21 -1
  150. package/dist/types/core/raycast/hit-buffer.d.ts +43 -0
  151. package/dist/types/core/raycast/index.d.ts +2 -0
  152. package/dist/types/core/raycast/raycaster.d.ts +54 -0
  153. package/dist/types/core/slot-map/index.d.ts +1 -0
  154. package/dist/types/core/slot-map/slot-map.d.ts +109 -0
  155. package/dist/types/core/state-machine/index.d.ts +1 -0
  156. package/dist/types/core/state-machine/state-machine.d.ts +114 -0
  157. package/dist/types/core/timeline/index.d.ts +1 -0
  158. package/dist/types/core/timeline/timeline.d.ts +34 -0
  159. package/dist/types/ecs/component.d.ts +67 -11
  160. package/dist/types/ecs/entity-handle.d.ts +5 -5
  161. package/dist/types/ecs/system-builder.d.ts +13 -0
  162. package/dist/types/ecs/world.d.ts +72 -4
  163. package/dist/types/game/loop/loop.d.ts +51 -2
  164. package/dist/types/game/loop/ticker-schedule.d.ts +52 -0
  165. package/dist/types/net/adapters/bun-websocket.d.ts +19 -3
  166. package/dist/types/renderer/index.d.ts +1 -0
  167. package/dist/types/renderer/prefab-bucket/concrete.d.ts +16 -6
  168. package/dist/types/renderer/prefab-bucket/index.d.ts +11 -7
  169. package/dist/types/renderer/prefab-bucket/specs.d.ts +10 -0
  170. package/dist/types/renderer/raycast/index.d.ts +1 -0
  171. package/dist/types/renderer/raycast/raycast.d.ts +24 -0
  172. package/dist/types/renderer/types.d.ts +1 -0
  173. package/dist/webgpu/cjs/index.js +1897 -592
  174. package/dist/webgpu/esm/index.js +1889 -578
  175. package/dist/webgpu/types/2d/raycast.d.ts +45 -0
  176. package/dist/webgpu/types/2d/renderer.d.ts +11 -0
  177. package/dist/webgpu/types/2d/sprite-accessor.d.ts +3 -1
  178. package/dist/webgpu/types/3d/hitbox.d.ts +32 -0
  179. package/dist/webgpu/types/3d/lights.d.ts +113 -0
  180. package/dist/webgpu/types/3d/lights.test.d.ts +1 -0
  181. package/dist/webgpu/types/3d/raycast.d.ts +44 -0
  182. package/dist/webgpu/types/3d/renderer.d.ts +88 -1
  183. package/dist/webgpu/types/3d/shader.d.ts +88 -5
  184. package/dist/webgpu/types/core/types.d.ts +55 -0
  185. package/dist/webgpu/types/geometry/geometry-builder.d.ts +1 -4
  186. package/dist/webgpu/types/index.d.ts +1 -0
  187. package/dist/webgpu/types/shaders/utils.d.ts +24 -0
  188. package/package.json +6 -1
@@ -2,8 +2,19 @@
2
2
  * A binary field descriptor.
3
3
  * Defines how a single value is serialized/deserialized
4
4
  * at a fixed byte size.
5
+ *
6
+ * The second type parameter `A` is a compile-time-only marker for the
7
+ * typed array kind used when this field is stored in an ECS World's
8
+ * Structure-of-Arrays column. Tagging `f32 → Float32Array`, `u8 →
9
+ * Uint8Array`, etc. lets `world.fields(Component)` return precisely
10
+ * typed Float32Array / Int32Array / ... per field without casts. The
11
+ * parameter is purely structural — it never appears at runtime.
12
+ *
13
+ * Defaults to `unknown` so existing call sites continue to compile.
14
+ * Composite fields (vec2/vec3/color/string) leave `A` defaulted; only
15
+ * the scalar primitives narrow it.
5
16
  */
6
- export type Field<T> = {
17
+ export type Field<T, A = unknown> = {
7
18
  /** Size of the field in bytes */
8
19
  size: number;
9
20
  /**
@@ -23,6 +34,13 @@ export type Field<T> = {
23
34
  * Returns the nil value
24
35
  */
25
36
  toNil(): T;
37
+ /**
38
+ * Compile-time-only phantom marker for the SoA typed array kind. Never
39
+ * read at runtime; never written by any of the primitives. Exists so
40
+ * `Field<number, Float32Array>` and `Field<number, Uint8Array>` are
41
+ * structurally distinguishable to TypeScript.
42
+ */
43
+ readonly __array?: A;
26
44
  };
27
45
  /**
28
46
  * A schema mapping object keys to binary fields.
@@ -33,8 +51,19 @@ export type Field<T> = {
33
51
  * Do not rely on computed or dynamic keys.
34
52
  */
35
53
  export type Schema<T> = {
36
- [K in keyof T]: Field<T[K]>;
54
+ [K in keyof T]: Field<T[K], any>;
37
55
  };
56
+ /**
57
+ * Helper for extracting the per-field typed-array kind from a schema.
58
+ *
59
+ * Given a precise schema literal like `{ x: BinaryCodec.f32, y: BinaryCodec.u8 }`
60
+ * (inferred narrowly, not widened to `Schema<T>`), this maps each field to
61
+ * its tagged array kind: `{ x: Float32Array, y: Uint8Array }`.
62
+ *
63
+ * Fields whose `A` is `unknown` (composites: vec/color/string) fall back
64
+ * to the broad TypedArray union.
65
+ */
66
+ export type ArrayFromField<F> = F extends Field<any, infer A> ? unknown extends A ? Float32Array | Int32Array | Uint32Array | Uint16Array | Uint8Array | Int8Array | Int16Array | Float64Array : A : never;
38
67
  /**
39
68
  * Base codec implementation.
40
69
  * Handles schema-driven encoding/decoding.
@@ -69,25 +98,25 @@ export declare class BaseBinaryCodec {
69
98
  */
70
99
  export declare class BinaryPrimitives {
71
100
  /** Unsigned 8-bit integer */
72
- static readonly u8: Field<number>;
101
+ static readonly u8: Field<number, Uint8Array>;
73
102
  /** Unsigned 16-bit integer (big-endian) */
74
- static readonly u16: Field<number>;
103
+ static readonly u16: Field<number, Uint16Array>;
75
104
  /** Unsigned 32-bit integer (big-endian) */
76
- static readonly u32: Field<number>;
105
+ static readonly u32: Field<number, Uint32Array>;
77
106
  /** Signed 8-bit integer */
78
- static readonly i8: Field<number>;
107
+ static readonly i8: Field<number, Int8Array>;
79
108
  /** Signed 16-bit integer (big-endian) */
80
- static readonly i16: Field<number>;
109
+ static readonly i16: Field<number, Int16Array>;
81
110
  /** Signed 32-bit integer (big-endian) */
82
- static readonly i32: Field<number>;
83
- /** 16-bit floating point number (IEEE 754, big-endian) */
84
- static readonly f16: Field<number>;
111
+ static readonly i32: Field<number, Int32Array>;
112
+ /** 16-bit floating point number (IEEE 754, big-endian) — stored as raw u16 bits */
113
+ static readonly f16: Field<number, Uint16Array>;
85
114
  /** 32-bit floating point number (IEEE 754, big-endian) */
86
- static readonly f32: Field<number>;
115
+ static readonly f32: Field<number, Float32Array>;
87
116
  /** 64-bit floating point number (double, big-endian) */
88
- static readonly f64: Field<number>;
117
+ static readonly f64: Field<number, Float64Array>;
89
118
  /** Boolean stored as 1 byte (0 = false, 1 = true) */
90
- static readonly bool: Field<boolean>;
119
+ static readonly bool: Field<boolean, Uint8Array>;
91
120
  /**
92
121
  * String field with UTF-8 encoding and 2-byte length prefix.
93
122
  * @param maxLength Maximum number of bytes allowed
@@ -112,17 +141,17 @@ export declare class BinaryPrimitives {
112
141
  a: number;
113
142
  }>;
114
143
  /** 32-bit floating point number (IEEE 754, little-endian) */
115
- static readonly f32_le: Field<number>;
144
+ static readonly f32_le: Field<number, Float32Array>;
116
145
  /** 64-bit floating point number (double, little-endian) */
117
- static readonly f64_le: Field<number>;
146
+ static readonly f64_le: Field<number, Float64Array>;
118
147
  /** Unsigned 16-bit integer (little-endian) */
119
- static readonly u16_le: Field<number>;
148
+ static readonly u16_le: Field<number, Uint16Array>;
120
149
  /** Unsigned 32-bit integer (little-endian) */
121
- static readonly u32_le: Field<number>;
150
+ static readonly u32_le: Field<number, Uint32Array>;
122
151
  /** Signed 16-bit integer (little-endian) */
123
- static readonly i16_le: Field<number>;
152
+ static readonly i16_le: Field<number, Int16Array>;
124
153
  /** Signed 32-bit integer (little-endian) */
125
- static readonly i32_le: Field<number>;
154
+ static readonly i32_le: Field<number, Int32Array>;
126
155
  /**
127
156
  * 2D vector of f32 stored as a tuple [x, y] (little-endian).
128
157
  * Useful for compact math data or shader-friendly layouts.
@@ -145,43 +174,43 @@ export declare class BinaryPrimitives {
145
174
  */
146
175
  export declare class BinaryCodec extends BaseBinaryCodec {
147
176
  /** Unsigned 8-bit integer field */
148
- static readonly u8: Field<number>;
177
+ static readonly u8: Field<number, Uint8Array<ArrayBufferLike>>;
149
178
  /** Unsigned 16-bit integer field */
150
- static readonly u16: Field<number>;
179
+ static readonly u16: Field<number, Uint16Array<ArrayBufferLike>>;
151
180
  /** Unsigned 32-bit integer field */
152
- static readonly u32: Field<number>;
181
+ static readonly u32: Field<number, Uint32Array<ArrayBufferLike>>;
153
182
  /** Signed 8-bit integer field */
154
- static readonly i8: Field<number>;
183
+ static readonly i8: Field<number, Int8Array<ArrayBufferLike>>;
155
184
  /** Signed 16-bit integer field */
156
- static readonly i16: Field<number>;
185
+ static readonly i16: Field<number, Int16Array<ArrayBufferLike>>;
157
186
  /** Signed 32-bit integer field */
158
- static readonly i32: Field<number>;
187
+ static readonly i32: Field<number, Int32Array<ArrayBufferLike>>;
159
188
  /** 16-bit floating point field */
160
- static readonly f16: Field<number>;
189
+ static readonly f16: Field<number, Uint16Array<ArrayBufferLike>>;
161
190
  /** 32-bit floating point field */
162
- static readonly f32: Field<number>;
191
+ static readonly f32: Field<number, Float32Array<ArrayBufferLike>>;
163
192
  /** Boolean field */
164
- static readonly bool: Field<boolean>;
193
+ static readonly bool: Field<boolean, Uint8Array<ArrayBufferLike>>;
165
194
  /** String field with length prefix */
166
195
  static string: typeof BinaryPrimitives.string;
167
196
  /** 2D vector field */
168
197
  static readonly vec2: Field<{
169
198
  x: number;
170
199
  y: number;
171
- }>;
200
+ }, unknown>;
172
201
  /** 3D vector field */
173
202
  static readonly vec3: Field<{
174
203
  x: number;
175
204
  y: number;
176
205
  z: number;
177
- }>;
206
+ }, unknown>;
178
207
  /** RGBA color field */
179
208
  static readonly color: Field<{
180
209
  r: number;
181
210
  g: number;
182
211
  b: number;
183
212
  a: number;
184
- }>;
213
+ }, unknown>;
185
214
  /**
186
215
  * Encodes an object into a binary buffer.
187
216
  */
@@ -191,3 +220,32 @@ export declare class BinaryCodec extends BaseBinaryCodec {
191
220
  */
192
221
  static decode<T extends object>(schema: Schema<T>, buf: Uint8Array, target: T): T;
193
222
  }
223
+ export declare const u8: Field<number, Uint8Array<ArrayBufferLike>>;
224
+ export declare const u16: Field<number, Uint16Array<ArrayBufferLike>>;
225
+ export declare const u32: Field<number, Uint32Array<ArrayBufferLike>>;
226
+ export declare const i8: Field<number, Int8Array<ArrayBufferLike>>;
227
+ export declare const i16: Field<number, Int16Array<ArrayBufferLike>>;
228
+ export declare const i32: Field<number, Int32Array<ArrayBufferLike>>;
229
+ export declare const f16: Field<number, Uint16Array<ArrayBufferLike>>;
230
+ export declare const f32: Field<number, Float32Array<ArrayBufferLike>>;
231
+ export declare const f64: Field<number, Float64Array<ArrayBufferLike>>;
232
+ export declare const bool: Field<boolean, Uint8Array<ArrayBufferLike>>;
233
+ export declare const string: typeof BinaryPrimitives.string;
234
+ export declare const vec2: Field<{
235
+ x: number;
236
+ y: number;
237
+ }, unknown>;
238
+ export declare const vec3: Field<{
239
+ x: number;
240
+ y: number;
241
+ z: number;
242
+ }, unknown>;
243
+ export declare const vec2_le: Field<[number, number], unknown>;
244
+ export declare const vec3_le: Field<[number, number, number], unknown>;
245
+ export declare const vec4_le: Field<[number, number, number, number], unknown>;
246
+ export declare const color: Field<{
247
+ r: number;
248
+ g: number;
249
+ b: number;
250
+ a: number;
251
+ }, unknown>;
@@ -0,0 +1,37 @@
1
+ export interface SlewClockOptions {
2
+ /** Drift under this advances at nominal rate instead of warping. Default 0.25. */
3
+ deadZone?: number;
4
+ /** Step bounds while warping to close a gap. */
5
+ warp?: {
6
+ /** Minimum step when warping to close a gap. Default 0.6. */
7
+ min?: number;
8
+ /** Maximum step when warping to close a gap. Default 1.4. */
9
+ max?: number;
10
+ };
11
+ /** Per-unit-of-drift warp gain. Default 0.1. */
12
+ gain?: number;
13
+ }
14
+ /**
15
+ * A scalar that advances one nominal step per `advance` toward a moving
16
+ * target, slewing within a band to close drift, holding steady inside a
17
+ * dead-zone, and snapping when the forward gap is too large to chase.
18
+ *
19
+ * Domain-agnostic: the caller supplies the target and the snap threshold.
20
+ */
21
+ export declare class SlewClock {
22
+ private _value;
23
+ private readonly deadZone;
24
+ private readonly warpMin;
25
+ private readonly warpMax;
26
+ private readonly gain;
27
+ constructor(opts?: SlewClockOptions);
28
+ get value(): number;
29
+ get initialized(): boolean;
30
+ reset(): void;
31
+ /**
32
+ * Advance toward `target`. Seeds to `target` on first call. Forward drift
33
+ * beyond `snap` jumps to `target`; drift inside the dead-zone advances one
34
+ * nominal step; otherwise the step warps within the band to close the gap.
35
+ */
36
+ advance(target: number, snap: number): number;
37
+ }
@@ -0,0 +1 @@
1
+ export { SlewClock, type SlewClockOptions } from './clock';
@@ -13,7 +13,7 @@ export interface LoopDriver {
13
13
  /** Internal loop iteration method */
14
14
  loop(): void;
15
15
  /** Update callback invoked each frame with delta time in seconds */
16
- update(dt: number): void;
16
+ update(deltaTime: number): void;
17
17
  }
18
18
  /**
19
19
  * Type of driver to use for the game loop.
@@ -35,24 +35,24 @@ export type DriverType = 'server-immediate' | 'client' | 'server-timeout';
35
35
  * @example
36
36
  * ```typescript
37
37
  * // Client
38
- * const clientDriver = createDriver('client', (dt) => {
39
- * game.update(dt);
38
+ * const clientDriver = createDriver('client', (deltaTime) => {
39
+ * game.update(deltaTime);
40
40
  * renderer.render();
41
41
  * });
42
42
  * clientDriver.start();
43
43
  *
44
44
  * // Server (maximum performance)
45
- * const serverDriver = createDriver('server', (dt) => {
46
- * simulation.tick(dt);
45
+ * const serverDriver = createDriver('server', (deltaTime) => {
46
+ * simulation.tick(deltaTime);
47
47
  * });
48
48
  * serverDriver.start();
49
49
  *
50
50
  * // Server (balanced with I/O)
51
- * const balancedDriver = createDriver('server-timeout', (dt) => {
52
- * simulation.tick(dt);
51
+ * const balancedDriver = createDriver('server-timeout', (deltaTime) => {
52
+ * simulation.tick(deltaTime);
53
53
  * handleNetworkIO();
54
54
  * });
55
55
  * balancedDriver.start();
56
56
  * ```
57
57
  */
58
- export declare function createDriver(type: DriverType, update: (dt: number) => void): ImmediateDriver | RafDriver | TimeoutDriver;
58
+ export declare function createDriver(type: DriverType, update: (deltaTime: number) => void): ImmediateDriver | RafDriver | TimeoutDriver;
@@ -11,19 +11,19 @@ import { LoopDriver } from "../driver";
11
11
  *
12
12
  * @example
13
13
  * ```typescript
14
- * const driver = new ImmediateDriver((dt) => {
15
- * world.tick(dt);
14
+ * const driver = new ImmediateDriver((deltaTime) => {
15
+ * world.tick(deltaTime);
16
16
  * broadcastState();
17
17
  * });
18
18
  * driver.start();
19
19
  * ```
20
20
  */
21
21
  export declare class ImmediateDriver implements LoopDriver {
22
- update: (dt: number) => void;
22
+ update: (deltaTime: number) => void;
23
23
  /**
24
24
  * @param update - Callback invoked each tick with delta time in seconds
25
25
  */
26
- constructor(update: (dt: number) => void);
26
+ constructor(update: (deltaTime: number) => void);
27
27
  private last;
28
28
  private running;
29
29
  /**
@@ -9,26 +9,26 @@ import { LoopDriver } from "../driver";
9
9
  *
10
10
  * @example
11
11
  * ```typescript
12
- * const driver = new RafDriver((dt) => {
13
- * player.update(dt);
12
+ * const driver = new RafDriver((deltaTime) => {
13
+ * player.update(deltaTime);
14
14
  * renderer.render();
15
15
  * });
16
16
  * driver.start();
17
17
  * ```
18
18
  */
19
19
  export declare class RafDriver implements LoopDriver {
20
- update: (dt: number) => void;
20
+ update: (deltaTime: number) => void;
21
21
  /**
22
22
  * Hard upper bound on a single frame's delta, in ms. Long pauses (tab
23
23
  * backgrounded, breakpoint hit, browser throttling) deliver one huge
24
24
  * frame on resume. Clamping keeps the engine from trying to "catch up"
25
25
  * by replaying that lost time at high speed.
26
26
  */
27
- private static readonly MAX_DT_MS;
27
+ private static readonly MAX_DELTA_MS;
28
28
  /**
29
29
  * @param update - Callback invoked each frame with delta time in seconds
30
30
  */
31
- constructor(update: (dt: number) => void);
31
+ constructor(update: (deltaTime: number) => void);
32
32
  private last;
33
33
  private running;
34
34
  private rafId;
@@ -48,7 +48,7 @@ export declare class RafDriver implements LoopDriver {
48
48
  /**
49
49
  * Internal loop method that calculates delta time and schedules the next frame.
50
50
  *
51
- * Delta time is provided in seconds, clamped to `MAX_DT_MS` so a paused
51
+ * Delta time is provided in seconds, clamped to `MAX_DELTA_MS` so a paused
52
52
  * tab doesn't deliver a multi-second frame.
53
53
  */
54
54
  loop: () => void;
@@ -16,19 +16,19 @@ import { LoopDriver } from "../driver";
16
16
  *
17
17
  * @example
18
18
  * ```typescript
19
- * const driver = new TimeoutDriver((dt) => {
20
- * world.tick(dt);
19
+ * const driver = new TimeoutDriver((deltaTime) => {
20
+ * world.tick(deltaTime);
21
21
  * broadcastState();
22
22
  * });
23
23
  * driver.start();
24
24
  * ```
25
25
  */
26
26
  export declare class TimeoutDriver implements LoopDriver {
27
- update: (dt: number) => void;
27
+ update: (deltaTime: number) => void;
28
28
  /**
29
29
  * @param update - Callback invoked each tick with delta time in seconds
30
30
  */
31
- constructor(update: (dt: number) => void);
31
+ constructor(update: (deltaTime: number) => void);
32
32
  private last;
33
33
  private running;
34
34
  /**
@@ -0,0 +1,29 @@
1
+ import { Hitbox } from './hitbox';
2
+ /**
3
+ * HitboxLibrary — a named, mode-typed registry of `Hitbox` definitions.
4
+ *
5
+ * The canonical set of collision archetypes a game uses, declared once in
6
+ * shared code and read by the renderer (client picking), game logic, and a
7
+ * headless server alike. Resolves by name (`get`, serializable/authoring)
8
+ * or by index (`at`, for ECS components that store a numeric archetype).
9
+ *
10
+ * `add` accumulates the name union, so `bucket.hitboxes(lib)` can offer the
11
+ * registered names as an autocompleting, typo-checked literal type.
12
+ */
13
+ export declare class HitboxLibrary<M extends '2d' | '3d' = '3d', Names extends string = never> {
14
+ readonly mode: M;
15
+ private readonly names;
16
+ private readonly boxes;
17
+ private readonly index;
18
+ constructor(mode: M);
19
+ /** Register a hitbox under `name`. Returns a library whose type carries the new name. */
20
+ add<const N extends string>(name: N, hitbox: Hitbox<M>): HitboxLibrary<M, Names | N>;
21
+ /** Resolve by name. Throws on an unknown name. */
22
+ get(name: Names): Hitbox<M>;
23
+ /** Resolve by index — the fast path for ECS components storing a numeric archetype. */
24
+ at(index: number): Hitbox<M>;
25
+ /** Numeric index for a name, for storing on an entity. Throws on an unknown name. */
26
+ indexOf(name: Names): number;
27
+ /** Registered names, in insertion order. */
28
+ keys(): readonly string[];
29
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Hitbox — a named set of collision shapes in model-local space.
3
+ *
4
+ * Declared once and shared across every prefab/instance that uses it. Pure
5
+ * data: no GPU, no per-instance state. The renderer picks against it; game
6
+ * logic and a headless server run authoritative hit tests against the same
7
+ * object. Shapes are scaled by instance scale at test time.
8
+ *
9
+ * The mode parameter (`'2d'` | `'3d'`) gates which shapes `add` accepts and
10
+ * accumulates the part-name union so consumers can narrow `hit.part`.
11
+ */
12
+ export type Shape3D = {
13
+ readonly shape: 'sphere';
14
+ readonly radius: number;
15
+ readonly offset?: readonly [number, number, number];
16
+ } | {
17
+ readonly shape: 'box';
18
+ readonly size: readonly [number, number, number];
19
+ readonly offset?: readonly [number, number, number];
20
+ } | {
21
+ readonly shape: 'cylinder';
22
+ readonly radius: number;
23
+ readonly height: number;
24
+ readonly offset?: readonly [number, number, number];
25
+ };
26
+ export type Shape2D = {
27
+ readonly shape: 'circle';
28
+ readonly radius: number;
29
+ readonly offset?: readonly [number, number];
30
+ } | {
31
+ readonly shape: 'rect';
32
+ readonly size: readonly [number, number];
33
+ readonly offset?: readonly [number, number];
34
+ } | {
35
+ readonly shape: 'capsule';
36
+ readonly radius: number;
37
+ readonly length: number;
38
+ readonly offset?: readonly [number, number];
39
+ };
40
+ export type ShapeForMode<M extends '2d' | '3d'> = M extends '3d' ? Shape3D : Shape2D;
41
+ export type HitboxPart<M extends '2d' | '3d'> = {
42
+ readonly name: string;
43
+ } & ShapeForMode<M>;
44
+ export declare class Hitbox<M extends '2d' | '3d' = '3d', Names extends string = never> {
45
+ readonly mode: M;
46
+ readonly parts: readonly HitboxPart<M>[];
47
+ constructor(mode: M, parts?: readonly HitboxPart<M>[]);
48
+ /** Add a named shape. Returns a new Hitbox whose type carries the added name. */
49
+ add<const N extends string>(name: N, shape: ShapeForMode<M>): Hitbox<M, Names | N>;
50
+ }
@@ -0,0 +1,3 @@
1
+ export * from './hitbox';
2
+ export * from './hitbox-library';
3
+ export * from './test';
@@ -0,0 +1,44 @@
1
+ import type { Ray3D } from '../ray/ray-3d';
2
+ import type { Hitbox, HitboxPart } from './hitbox';
3
+ /** Nearest part struck plus where. The `point` is filled in 3D only. */
4
+ export interface PartHit {
5
+ part: string;
6
+ distance: number;
7
+ point: [number, number, number];
8
+ }
9
+ /**
10
+ * A 3D part resolved to world space: its center after offset, and the
11
+ * half-extents after per-axis scale. Single-radius shapes (sphere,
12
+ * cylinder) inflate by the largest relevant axis so they enclose a
13
+ * non-uniformly scaled visual rather than clipping inside it. The single
14
+ * source of placement truth shared by picking and debug rendering.
15
+ */
16
+ export interface PlacedPart {
17
+ cx: number;
18
+ cy: number;
19
+ cz: number;
20
+ hx: number;
21
+ hy: number;
22
+ hz: number;
23
+ }
24
+ /** Place a 3D part at world center `(cx,cy,cz)` grown by scale `(sx,sy,sz)`. Reused output. */
25
+ export declare function placePart3D(part: HitboxPart<'3d'>, cx: number, cy: number, cz: number, sx: number, sy: number, sz: number): PlacedPart;
26
+ /**
27
+ * Entry-test a ray against a 3D hitbox placed at world center `(cx,cy,cz)`
28
+ * and grown by per-axis scale `(sx,sy,sz)`. Returns the nearest part the
29
+ * ray enters (a reused object, valid until the next call) or `null`.
30
+ */
31
+ export declare function testHitbox3D(ray: Ray3D, hitbox: Hitbox<'3d'>, cx: number, cy: number, cz: number, sx: number, sy: number, sz: number): PartHit | null;
32
+ /**
33
+ * Point-test against a 2D hitbox at center `(cx,cy)`, scaled `(sx,sy)`,
34
+ * rotated by `rot` radians. The world point is rotated into the hitbox's
35
+ * local frame, then tested against each part. Returns the first part
36
+ * containing the point (a reused object) or `null`.
37
+ */
38
+ export declare function testHitbox2D(hitbox: Hitbox<'2d'>, cx: number, cy: number, sx: number, sy: number, rot: number, wx: number, wy: number): PartHit | null;
39
+ /**
40
+ * Point inside a sprite's rendered quad: an `sx` by `sy` rect centered at
41
+ * `(cx,cy)`, rotated by `rot`. The default pick bound for a sprite with no
42
+ * declared hitbox.
43
+ */
44
+ export declare function pointInQuad2D(cx: number, cy: number, sx: number, sy: number, rot: number, wx: number, wy: number): boolean;
@@ -7,9 +7,15 @@ export * from './driver';
7
7
  export * from './navmesh';
8
8
  export * from './pooled-codec';
9
9
  export * from './prediction';
10
+ export * from './clock';
11
+ export * from './timeline';
10
12
  export * from './input';
11
13
  export * from './free-list';
12
14
  export * from './sparse-batcher';
15
+ export * from './slot-map';
16
+ export * from './state-machine';
13
17
  export * from './simple-rng';
14
18
  export * from './ray';
19
+ export * from './raycast';
20
+ export * from './hitbox';
15
21
  export * from '../renderer';
@@ -1,3 +1,5 @@
1
1
  export * from "./manager";
2
2
  export * from "./sources";
3
+ export * from "./mouse-look";
4
+ export * from "./scroll-zoom";
3
5
  export type { InputSnapshot } from "./types";
@@ -0,0 +1 @@
1
+ export * from "./mouse-look";