murow 0.0.72 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) 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/driver/driver.js +1 -1
  4. package/dist/cjs/core/driver/drivers/immediate.js +1 -1
  5. package/dist/cjs/core/driver/drivers/raf.js +1 -1
  6. package/dist/cjs/core/driver/drivers/timeout.js +1 -1
  7. package/dist/cjs/core/input/index.js +1 -1
  8. package/dist/cjs/core/input/mouse-look/index.js +1 -0
  9. package/dist/cjs/core/input/mouse-look/mouse-look.js +1 -0
  10. package/dist/cjs/core/input/scroll-zoom/index.js +1 -0
  11. package/dist/cjs/core/input/scroll-zoom/scroll-zoom.js +1 -0
  12. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -1
  13. package/dist/cjs/ecs/component.js +1 -1
  14. package/dist/cjs/ecs/system-builder.js +1 -1
  15. package/dist/cjs/ecs/world.js +1 -1
  16. package/dist/cjs/game/loop/loop.js +1 -1
  17. package/dist/cjs/net/adapters/bun-websocket.js +1 -1
  18. package/dist/cjs/renderer/base/renderer-3d.js +1 -1
  19. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -1
  20. package/dist/cjs/renderer/prefab-bucket/index.js +1 -1
  21. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -1
  22. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -1
  23. package/dist/esm/core/binary-codec/binary-codec.js +1 -1
  24. package/dist/esm/core/driver/drivers/immediate.js +1 -1
  25. package/dist/esm/core/driver/drivers/raf.js +1 -1
  26. package/dist/esm/core/driver/drivers/timeout.js +1 -1
  27. package/dist/esm/core/input/index.js +1 -1
  28. package/dist/esm/core/input/mouse-look/index.js +1 -0
  29. package/dist/esm/core/input/mouse-look/mouse-look.js +1 -0
  30. package/dist/esm/core/input/scroll-zoom/index.js +1 -0
  31. package/dist/esm/core/input/scroll-zoom/scroll-zoom.js +1 -0
  32. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -1
  33. package/dist/esm/ecs/component.js +1 -1
  34. package/dist/esm/ecs/system-builder.js +1 -1
  35. package/dist/esm/ecs/world.js +1 -1
  36. package/dist/esm/game/loop/loop.js +1 -1
  37. package/dist/esm/net/adapters/bun-websocket.js +1 -1
  38. package/dist/esm/renderer/base/renderer-3d.js +1 -1
  39. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -1
  40. package/dist/esm/renderer/prefab-bucket/index.js +1 -1
  41. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -1
  42. package/dist/netcode/cjs/index.js +1552 -0
  43. package/dist/netcode/esm/index.js +1530 -0
  44. package/dist/netcode/types/client/game-client.d.ts +125 -0
  45. package/dist/netcode/types/client/index.d.ts +1 -0
  46. package/dist/netcode/types/client/interpolation-buffer.d.ts +37 -0
  47. package/dist/netcode/types/client/interpolation-buffer.test.d.ts +1 -0
  48. package/dist/netcode/types/codec/delta-codec.d.ts +17 -0
  49. package/dist/netcode/types/codec/delta-codec.test.d.ts +1 -0
  50. package/dist/netcode/types/codec/index.d.ts +1 -0
  51. package/dist/netcode/types/components/index.d.ts +1 -0
  52. package/dist/netcode/types/components/sync-spec.d.ts +43 -0
  53. package/dist/netcode/types/components/sync-spec.test.d.ts +1 -0
  54. package/dist/netcode/types/ctx.d.ts +105 -0
  55. package/dist/netcode/types/ctx.test.d.ts +1 -0
  56. package/dist/netcode/types/handlers/define-handlers.d.ts +47 -0
  57. package/dist/netcode/types/handlers/index.d.ts +1 -0
  58. package/dist/netcode/types/index.d.ts +11 -0
  59. package/dist/netcode/types/integration.test.d.ts +1 -0
  60. package/dist/netcode/types/intents/define-intents.d.ts +53 -0
  61. package/dist/netcode/types/intents/define-intents.test.d.ts +1 -0
  62. package/dist/netcode/types/intents/index.d.ts +1 -0
  63. package/dist/netcode/types/network/base.d.ts +120 -0
  64. package/dist/netcode/types/network/index.d.ts +2 -0
  65. package/dist/netcode/types/network/transport.d.ts +1 -0
  66. package/dist/netcode/types/packets/convergence.test.d.ts +1 -0
  67. package/dist/netcode/types/packets/harness.d.ts +103 -0
  68. package/dist/netcode/types/packets/index.d.ts +2 -0
  69. package/dist/netcode/types/packets/intermittent-intents.test.d.ts +1 -0
  70. package/dist/netcode/types/packets/pathological.test.d.ts +1 -0
  71. package/dist/netcode/types/packets/peer-interpolation.test.d.ts +1 -0
  72. package/dist/netcode/types/packets/reordering.test.d.ts +1 -0
  73. package/dist/netcode/types/packets/virtual-network.d.ts +65 -0
  74. package/dist/netcode/types/predictions/define-predictions.d.ts +45 -0
  75. package/dist/netcode/types/predictions/define-predictions.test.d.ts +1 -0
  76. package/dist/netcode/types/predictions/index.d.ts +1 -0
  77. package/dist/netcode/types/reconciliation.test.d.ts +1 -0
  78. package/dist/netcode/types/rpcs/define-rpcs.d.ts +44 -0
  79. package/dist/netcode/types/rpcs/define-rpcs.test.d.ts +1 -0
  80. package/dist/netcode/types/rpcs/index.d.ts +1 -0
  81. package/dist/netcode/types/server/game-server.d.ts +77 -0
  82. package/dist/netcode/types/server/index.d.ts +2 -0
  83. package/dist/netcode/types/server/plugins/aoi-grid.d.ts +34 -0
  84. package/dist/netcode/types/server/plugins/index.d.ts +3 -0
  85. package/dist/netcode/types/server/plugins/lag-compensation.d.ts +34 -0
  86. package/dist/netcode/types/server/plugins/plugin.d.ts +24 -0
  87. package/dist/netcode/types/tick-rate.test.d.ts +1 -0
  88. package/dist/netcode/types/transports/index.d.ts +1 -0
  89. package/dist/netcode/types/transports/memory-transport.d.ts +51 -0
  90. package/dist/netcode/types/types.test.d.ts +1 -0
  91. package/dist/types/core/binary-codec/binary-codec.d.ts +89 -31
  92. package/dist/types/core/driver/driver.d.ts +8 -8
  93. package/dist/types/core/driver/drivers/immediate.d.ts +4 -4
  94. package/dist/types/core/driver/drivers/raf.d.ts +17 -6
  95. package/dist/types/core/driver/drivers/timeout.d.ts +4 -4
  96. package/dist/types/core/input/index.d.ts +2 -0
  97. package/dist/types/core/input/mouse-look/index.d.ts +1 -0
  98. package/dist/types/core/input/mouse-look/mouse-look.d.ts +139 -0
  99. package/dist/types/core/input/scroll-zoom/index.d.ts +1 -0
  100. package/dist/types/core/input/scroll-zoom/scroll-zoom.d.ts +38 -0
  101. package/dist/types/ecs/component.d.ts +67 -11
  102. package/dist/types/ecs/entity-handle.d.ts +5 -5
  103. package/dist/types/ecs/system-builder.d.ts +13 -0
  104. package/dist/types/ecs/world.d.ts +72 -4
  105. package/dist/types/game/loop/loop.d.ts +21 -2
  106. package/dist/types/net/adapters/bun-websocket.d.ts +19 -3
  107. package/dist/types/renderer/base/renderer-3d.d.ts +1 -1
  108. package/dist/types/renderer/prefab-bucket/concrete.d.ts +42 -2
  109. package/dist/types/renderer/prefab-bucket/index.d.ts +12 -2
  110. package/dist/types/renderer/prefab-bucket/specs.d.ts +46 -3
  111. package/dist/types/renderer/types.d.ts +5 -3
  112. package/dist/webgpu/cjs/index.js +591 -40
  113. package/dist/webgpu/esm/index.js +591 -40
  114. package/dist/webgpu/types/3d/renderer.d.ts +111 -5
  115. package/package.json +6 -1
@@ -20,11 +20,32 @@ export interface MeshInstanceHandle {
20
20
  readonly slot: number;
21
21
  readonly modelId: number;
22
22
  readonly skinned: boolean;
23
+ /** Source prefab id, or `null` if spawned from a raw model handle. */
24
+ readonly prefabId: string | null;
23
25
  setPosition(x: number, y: number, z: number): void;
24
26
  setRotation(x: number, y: number, z: number): void;
25
27
  setScale(x: number, y: number, z: number): void;
28
+ /**
29
+ * Set position WITHOUT GPU interpolation from the previous frame.
30
+ * Writes both PREV and CURR to the same value, so the next render
31
+ * produces no lerp slide. Use after teleports, network snapshot
32
+ * snaps, or any time the entity should appear at the new location
33
+ * immediately rather than smoothly moving toward it.
34
+ */
35
+ teleport(x: number, y: number, z: number): void;
36
+ /**
37
+ * Logical current position (what `setPosition` last wrote, not the interpolated render value).
38
+ * Returns a per-handle reusable tuple — do not retain across subsequent gets on the same handle.
39
+ */
40
+ readonly position: readonly [number, number, number];
41
+ /** Logical current rotation in radians. Reusable tuple; see `position`. */
42
+ readonly rotation: readonly [number, number, number];
43
+ /** Logical current scale. Reusable tuple; see `position`. */
44
+ readonly scale: readonly [number, number, number];
26
45
  play?(name: string, opts?: PlayOptions): void;
27
46
  stop?(): void;
47
+ /** Free this instance's renderer slot. Safe to call once per handle. */
48
+ destroy(): void;
28
49
  }
29
50
  /** A loaded glTF model — may contain multiple mesh parts that share a skeleton. */
30
51
  export interface GltfModel {
@@ -41,9 +62,30 @@ export interface InstanceHandle {
41
62
  setPosition(x: number, y: number, z: number): void;
42
63
  setRotation(x: number, y: number, z: number): void;
43
64
  setScale(x: number, y: number, z: number): void;
65
+ /**
66
+ * Set position WITHOUT GPU interpolation from the previous frame.
67
+ * Writes both PREV and CURR to the same value, so the next render
68
+ * produces no lerp slide. Use after teleports, network snapshot
69
+ * snaps, or any time the entity should appear at the new location
70
+ * immediately.
71
+ */
72
+ teleport(x: number, y: number, z: number): void;
73
+ /**
74
+ * Logical current position (what `setPosition` last wrote, not the interpolated render value).
75
+ * Returns a per-handle reusable tuple — do not retain across subsequent gets on the same handle.
76
+ */
77
+ readonly position: readonly [number, number, number];
78
+ /** Logical current rotation in radians. Reusable tuple; see `position`. */
79
+ readonly rotation: readonly [number, number, number];
80
+ /** Logical current scale. Reusable tuple; see `position`. */
81
+ readonly scale: readonly [number, number, number];
44
82
  play?(name: string, opts?: PlayOptions): void;
45
83
  stop?(): void;
46
84
  readonly skinned: boolean;
85
+ /** Source prefab id, or `null` if spawned from a raw model handle. */
86
+ readonly prefabId: string | null;
87
+ /** Free this instance's renderer slot(s). Safe to call once per handle. */
88
+ destroy(): void;
47
89
  }
48
90
  export interface MeshInstanceOptions {
49
91
  /**
@@ -75,11 +117,13 @@ export interface WebGPU3DRendererOptions extends Renderer3DOptions {
75
117
  */
76
118
  prefabs?: PrefabBucket3D;
77
119
  /**
78
- * How many instances you intend to spawn. Used together with `prefabs` to
79
- * size the skinned-instance budget. Ignored if `maxSkinnedInstances` is set
80
- * explicitly. Defaults to `maxModels` when only `prefabs` is provided.
120
+ * Max distance (world units) at which skeletal animation is computed for
121
+ * skinned instances. Past this, instances still render but reuse their
122
+ * last bone matrices; their internal animation clocks keep ticking on
123
+ * CPU. See `renderer.setAnimationCullDistance` to change at runtime.
124
+ * Set to `Infinity` to disable. Default 50.
81
125
  */
82
- maxInstances?: number;
126
+ animationCullDistance?: number;
83
127
  }
84
128
  export declare class WebGPU3DRenderer extends Base3DRenderer {
85
129
  private root;
@@ -136,12 +180,20 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
136
180
  private skinnedFreeList;
137
181
  private skinnedBatcher;
138
182
  private skinnedStaticDirty;
183
+ private skinnedStaticDV;
139
184
  private skinnedInstanceModelIds;
140
185
  private skinnedInstanceBoneOffsets;
141
186
  private skinnedAnimStates;
142
187
  private nextBoneOffset;
188
+ /** Reusable bone-offset blocks per skinIndex. Pushed on remove, popped on add. Indexed by skinIndex (low cardinality), so a Map of lists is fine. */
189
+ private freedBoneOffsets;
190
+ /** Per-bone-offset refcount. Linked multi-part instances share a block; freed when refcount hits 0. Indexed by boneOffset (< maxTotalBones). */
191
+ private boneOffsetRefcount;
192
+ /** Per-bone-offset skinIndex tag, so we can return the block to the right per-skin freelist on remove. */
193
+ private boneOffsetSkinIndex;
143
194
  private readonly maxSkinnedInstances;
144
195
  private readonly maxBonesPerSkin;
196
+ private animationCullDistanceSq;
145
197
  private rawSkinnedDynamicBuffer;
146
198
  private rawSkinnedStaticBuffer;
147
199
  private rawSkinnedUniformBuffer;
@@ -167,6 +219,30 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
167
219
  */
168
220
  onResize(callback: (width: number, height: number) => void): void;
169
221
  createCompute(name: string, options: ComputeOptions): ComputeBuilder;
222
+ /**
223
+ * Set the maximum distance (in world units) at which the renderer keeps
224
+ * computing skeletal animation. Skinned instances farther than this are
225
+ * still drawn, but with their last-computed bone matrices instead of
226
+ * fresh ones, which saves GPU compute work. Their internal animation
227
+ * clocks keep ticking on CPU, so when they come back into range they
228
+ * resume in sync.
229
+ *
230
+ * Lower values trade visual smoothness on distant characters for FPS.
231
+ * Pass `Infinity` to disable culling entirely (always animate).
232
+ *
233
+ * Safe to call any time; takes effect on the next frame.
234
+ *
235
+ * @param distance Max distance to animate at, in world units.
236
+ */
237
+ setAnimationCullDistance(distance: number): void;
238
+ /** Current animation cull distance (in world units). See `setAnimationCullDistance`. */
239
+ get animationCullDistance(): number;
240
+ /**
241
+ * Max skinned instances the renderer was sized for at construction.
242
+ * Independent budget from `maxInstances` since skinned characters use a
243
+ * separate set of GPU buffers. Read-only.
244
+ */
245
+ get maxSkinned(): number;
170
246
  /**
171
247
  * Create a flat grid mesh on the XZ plane at Y=0.
172
248
  *
@@ -180,6 +256,18 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
180
256
  step?: number;
181
257
  lineWidth?: number;
182
258
  }): ModelHandle;
259
+ /**
260
+ * Create a unit-cube mesh centered at the origin. Pass `size` to scale the
261
+ * edge length, or keep size = 1 and scale at the instance level.
262
+ *
263
+ * ```ts
264
+ * const cube = renderer.createCube();
265
+ * renderer.addInstance({ model: cube, color: [1, 0.5, 0.2], scale: 2 });
266
+ * ```
267
+ */
268
+ createCube(opts?: {
269
+ size?: number;
270
+ }): ModelHandle;
183
271
  /**
184
272
  * Register a model. Returns a handle for addInstance().
185
273
  *
@@ -229,6 +317,13 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
229
317
  */
230
318
  addInstance(opts: MeshInstanceOptions): InstanceHandle;
231
319
  private addGltfInstance;
320
+ /**
321
+ * Spawn a composite prefab by spawning each of its parts at the composed
322
+ * (instance + offset) transform. The returned handle broadcasts subsequent
323
+ * `setPosition` / `setRotation` to every child, keeping each child's
324
+ * baked offset applied on top of the new value.
325
+ */
326
+ private addCompositeInstance;
232
327
  private addSkinnedInstance;
233
328
  /**
234
329
  * Drain pending resyncs from the coordinator. Per affected skin: rebuild
@@ -248,8 +343,19 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
248
343
  * Update skeletal animations for all skinned instances. Call once per tick.
249
344
  */
250
345
  private updatedBoneOffsets;
346
+ /**
347
+ * Returns true if a skinned instance's bone-matrix compute should be
348
+ * dispatched this frame. Combines frustum culling (scaled bounding sphere)
349
+ * and a configurable distance cull from the camera. Callers pass the
350
+ * camera position + cullDistSq once outside the loop to avoid re-reading.
351
+ */
352
+ private shouldDispatchSkinning;
251
353
  private updateAnimations;
252
- removeInstance(handle: MeshInstanceHandle): void;
354
+ /**
355
+ * Free an instance's renderer slot. Equivalent to `handle.destroy()` -
356
+ * kept as a convenience for direct lookup. Safe to call multiple times.
357
+ */
358
+ removeInstance(handle: InstanceHandle): void;
253
359
  storePreviousState(): void;
254
360
  render(alpha: number): void;
255
361
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "murow",
3
- "version": "0.0.72",
3
+ "version": "0.1.1",
4
4
  "description": "A lightweight TypeScript game engine for server-authoritative multiplayer games",
5
5
  "types": "dist/types/index.d.ts",
6
6
  "type": "module",
@@ -112,6 +112,11 @@
112
112
  "types": "./dist/webgpu/types/index.d.ts",
113
113
  "import": "./dist/webgpu/esm/index.js",
114
114
  "require": "./dist/webgpu/cjs/index.js"
115
+ },
116
+ "./netcode": {
117
+ "types": "./dist/netcode/types/index.d.ts",
118
+ "import": "./dist/netcode/esm/index.js",
119
+ "require": "./dist/netcode/cjs/index.js"
115
120
  }
116
121
  },
117
122
  "optionalDependencies": {