murow 0.0.71 → 0.0.73

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 (71) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/core/driver/drivers/raf.js +1 -1
  3. package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -1
  4. package/dist/cjs/renderer/{base-2d-renderer.js → base/renderer-2d.js} +1 -1
  5. package/dist/cjs/renderer/base/renderer-3d.js +1 -0
  6. package/dist/cjs/renderer/gltf/helpers.js +1 -0
  7. package/dist/cjs/renderer/gltf/parser.js +1 -0
  8. package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
  9. package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
  10. package/dist/cjs/renderer/index.js +1 -1
  11. package/dist/cjs/renderer/math.js +1 -0
  12. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
  13. package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
  14. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
  15. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
  16. package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
  17. package/dist/cjs/renderer/spritesheet/parser.js +1 -0
  18. package/dist/cjs/renderer/types.js +1 -1
  19. package/dist/esm/core/driver/drivers/raf.js +1 -1
  20. package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -1
  21. package/dist/esm/renderer/base/renderer-2d.js +1 -0
  22. package/dist/esm/renderer/base/renderer-3d.js +1 -0
  23. package/dist/esm/renderer/gltf/helpers.js +1 -0
  24. package/dist/esm/renderer/gltf/parser.js +1 -0
  25. package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
  26. package/dist/esm/renderer/gltf/skin-parser.js +1 -0
  27. package/dist/esm/renderer/index.js +1 -1
  28. package/dist/esm/renderer/math.js +1 -0
  29. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
  30. package/dist/esm/renderer/prefab-bucket/index.js +1 -0
  31. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
  32. package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
  33. package/dist/esm/renderer/spritesheet/helpers.js +1 -0
  34. package/dist/esm/renderer/spritesheet/parser.js +1 -0
  35. package/dist/types/core/driver/drivers/raf.d.ts +13 -2
  36. package/dist/types/renderer/{base-2d-renderer.d.ts → base/renderer-2d.d.ts} +2 -2
  37. package/dist/types/renderer/{base-3d-renderer.d.ts → base/renderer-3d.d.ts} +3 -3
  38. package/dist/types/renderer/{base-renderer.d.ts → base/renderer.d.ts} +1 -1
  39. package/dist/types/renderer/gltf/helpers.d.ts +43 -0
  40. package/dist/types/renderer/gltf/parser.d.ts +49 -0
  41. package/dist/{webgpu/types/3d → types/renderer/gltf}/skeletal-animation.d.ts +8 -2
  42. package/dist/{webgpu/types/3d/gltf-skin-parser.d.ts → types/renderer/gltf/skin-parser.d.ts} +11 -5
  43. package/dist/types/renderer/index.d.ts +14 -3
  44. package/dist/types/renderer/prefab-bucket/concrete.d.ts +95 -0
  45. package/dist/types/renderer/prefab-bucket/index.d.ts +123 -0
  46. package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
  47. package/dist/types/renderer/prefab-bucket/specs.d.ts +209 -0
  48. package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
  49. package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
  50. package/dist/types/renderer/types.d.ts +19 -7
  51. package/dist/webgpu/cjs/index.js +1021 -1188
  52. package/dist/webgpu/esm/index.js +1016 -1174
  53. package/dist/webgpu/types/2d/renderer.d.ts +34 -3
  54. package/dist/webgpu/types/2d/sprite-accessor.d.ts +1 -1
  55. package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
  56. package/dist/webgpu/types/3d/renderer.d.ts +133 -15
  57. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +1 -1
  58. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +19 -2
  59. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +1 -1
  60. package/dist/webgpu/types/camera/camera-2d.d.ts +1 -1
  61. package/dist/webgpu/types/camera/camera-3d.d.ts +1 -1
  62. package/dist/webgpu/types/index.d.ts +15 -12
  63. package/dist/webgpu/types/particle/emitter.d.ts +1 -1
  64. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +5 -34
  65. package/package.json +1 -1
  66. package/dist/cjs/renderer/base-3d-renderer.js +0 -1
  67. package/dist/esm/renderer/base-2d-renderer.js +0 -1
  68. package/dist/esm/renderer/base-3d-renderer.js +0 -1
  69. /package/dist/cjs/renderer/{base-renderer.js → base/renderer.js} +0 -0
  70. /package/dist/esm/renderer/{base-renderer.js → base/renderer.js} +0 -0
  71. /package/dist/{webgpu/types/core → types/renderer}/math.d.ts +0 -0
@@ -1,8 +1,24 @@
1
- import { Base2DRenderer } from 'murow/renderer/base-2d-renderer';
1
+ import { Base2DRenderer } from 'murow/renderer';
2
2
  import type { Renderer2DOptions, SpriteHandle, SpriteOptions, SpritesheetHandle, SpritesheetSource } from 'murow/renderer';
3
3
  import { Camera2D } from '../camera/camera-2d';
4
+ import { type ParsedSpritesheet } from 'murow/renderer';
4
5
  import { GeometryBuilder, type GeometryOptions } from '../geometry/geometry-builder';
5
6
  import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
7
+ import type { PrefabBucket2D, Prefab2D } from 'murow/renderer';
8
+ export interface WebGPU2DRendererOptions extends Renderer2DOptions {
9
+ /**
10
+ * Pre-loaded prefab bucket. When provided, the renderer uploads each prefab
11
+ * to the GPU during `init()`, and `addSprite({ prefab: bucket.get('id') })`
12
+ * resolves to the right spritesheet handle. The bucket must have `load()`
13
+ * resolved before being passed in.
14
+ */
15
+ prefabs?: PrefabBucket2D;
16
+ /**
17
+ * How many sprite instances you intend to spawn. Used to size buffers when
18
+ * `maxSprites` is not given explicitly. Defaults to 1024.
19
+ */
20
+ maxInstances?: number;
21
+ }
6
22
  export declare class WebGPU2DRenderer extends Base2DRenderer {
7
23
  private root;
8
24
  private _device;
@@ -36,8 +52,15 @@ export declare class WebGPU2DRenderer extends Base2DRenderer {
36
52
  private uniformData;
37
53
  private resizeObserver;
38
54
  private resizeCallbacks;
39
- constructor(canvas: HTMLCanvasElement, options: Renderer2DOptions);
55
+ private readonly _prefabs;
56
+ constructor(canvas: HTMLCanvasElement, options: WebGPU2DRendererOptions);
40
57
  init(): Promise<void>;
58
+ /**
59
+ * Upload every prefab in the bucket to the GPU and stash the resulting
60
+ * SpritesheetHandle on each prefab so `bucket.get(id)` returns something
61
+ * usable as a sprite source.
62
+ */
63
+ private uploadPrefabBucket;
41
64
  private setupResizeObserver;
42
65
  /**
43
66
  * Register a callback that fires when the canvas resizes.
@@ -45,7 +68,15 @@ export declare class WebGPU2DRenderer extends Base2DRenderer {
45
68
  */
46
69
  onResize(callback: (width: number, height: number) => void): void;
47
70
  loadSpritesheet(source: SpritesheetSource): Promise<SpritesheetHandle>;
48
- addSprite(opts: SpriteOptions): SpriteHandle;
71
+ /**
72
+ * Upload a previously-parsed spritesheet to the GPU. Returns a SpritesheetHandle.
73
+ * Splitting parse (CPU) from upload (GPU) lets callers parse spritesheets in parallel
74
+ * before a renderer exists.
75
+ */
76
+ uploadParsedSpritesheet(parsed: ParsedSpritesheet): SpritesheetHandle;
77
+ addSprite(opts: Omit<SpriteOptions, 'sheet'> & {
78
+ sheet: SpritesheetHandle | Prefab2D;
79
+ }): SpriteHandle;
49
80
  removeSprite(sprite: SpriteHandle): void;
50
81
  storePreviousState(): void;
51
82
  createGeometry(name: string, options: GeometryOptions): GeometryBuilder;
@@ -1,4 +1,4 @@
1
- import type { SpriteHandle } from "murow/renderer/types";
1
+ import type { SpriteHandle } from "murow/renderer";
2
2
  export declare class SpriteAccessor implements SpriteHandle {
3
3
  private dynamicData;
4
4
  private staticData;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Bridges the bucket's `clips-changed` events to per-skin resync work in the
3
+ * renderer. The renderer registers `prefabId → skinIndex` at upload time;
4
+ * subsequent events flag affected skins in a pending set the renderer drains
5
+ * each frame.
6
+ */
7
+ import type { PrefabBucket } from 'murow';
8
+ export declare class GltfClipResyncCoordinator {
9
+ private bucket;
10
+ private readonly skinIndexByPrefabId;
11
+ private readonly _pending;
12
+ constructor(bucket: PrefabBucket);
13
+ /** Map a prefab id to its index in the renderer's `skinnedModels` list. */
14
+ registerSkin(prefabId: string, skinIndex: number): void;
15
+ /** Skin indices whose clip set has changed since the last `clear()`. */
16
+ get pending(): ReadonlySet<number>;
17
+ clear(): void;
18
+ /** Unsubscribe from the bucket and reset its animation clip sets. */
19
+ dispose(): void;
20
+ }
@@ -1,8 +1,8 @@
1
- import { Base3DRenderer } from 'murow/renderer/base-3d-renderer';
2
- import type { Renderer3DOptions } from 'murow/renderer/types';
1
+ import { Base3DRenderer } from 'murow/renderer';
2
+ import type { Renderer3DOptions } from 'murow/renderer';
3
3
  import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
4
4
  import { Camera3D } from '../camera/camera-3d';
5
- import { type PlayOptions } from './skeletal-animation';
5
+ import { type ParsedGltf, type PrefabBucket3D, type Prefab3D, type PlayOptions } from 'murow/renderer';
6
6
  export interface ModelData {
7
7
  positions: Float32Array;
8
8
  normals?: Float32Array;
@@ -25,6 +25,8 @@ export interface MeshInstanceHandle {
25
25
  setScale(x: number, y: number, z: number): void;
26
26
  play?(name: string, opts?: PlayOptions): void;
27
27
  stop?(): void;
28
+ /** Free this instance's renderer slot. Safe to call once per handle. */
29
+ destroy(): void;
28
30
  }
29
31
  /** A loaded glTF model — may contain multiple mesh parts that share a skeleton. */
30
32
  export interface GltfModel {
@@ -44,23 +46,46 @@ export interface InstanceHandle {
44
46
  play?(name: string, opts?: PlayOptions): void;
45
47
  stop?(): void;
46
48
  readonly skinned: boolean;
49
+ /** Free this instance's renderer slot(s). Safe to call once per handle. */
50
+ destroy(): void;
47
51
  }
48
52
  export interface MeshInstanceOptions {
49
- model: ModelHandle | GltfModel;
50
- x?: number;
51
- y?: number;
52
- z?: number;
53
- rotX?: number;
54
- rotY?: number;
55
- rotZ?: number;
56
- scaleX?: number;
57
- scaleY?: number;
58
- scaleZ?: number;
59
- color?: [number, number, number];
53
+ /**
54
+ * The model to instance. Either a renderer-internal handle (from `loadGltf`,
55
+ * `loadModel`, `createGrid`) or a prefab fetched from a `PrefabBucket3D` —
56
+ * `bucket.get('my-id')`.
57
+ */
58
+ model: ModelHandle | GltfModel | Prefab3D;
59
+ /** World position. Defaults to `[0, 0, 0]`. */
60
+ position?: readonly [x: number, y: number, z: number];
61
+ /** Euler rotation in radians. Defaults to `[0, 0, 0]`. */
62
+ rotation?: readonly [x: number, y: number, z: number];
63
+ /** Per-axis scale. Pass a single number to scale uniformly. Defaults to `[1, 1, 1]`. */
64
+ scale?: number | readonly [x: number, y: number, z: number];
65
+ /** Tint color RGB. Defaults to `[1, 1, 1]`. */
66
+ color?: readonly [r: number, g: number, b: number];
60
67
  }
61
68
  export interface WebGPU3DRendererOptions extends Renderer3DOptions {
62
69
  maxSkinnedInstances?: number;
63
70
  maxBonesPerSkin?: number;
71
+ /**
72
+ * Pre-loaded prefab bucket. When provided, the renderer self-sizes its
73
+ * skinned-instance + bone buffers from the bucket's prefab stats, and
74
+ * uploads each prefab to the GPU during `init()`. The bucket must have
75
+ * `load()` resolved before being passed in.
76
+ *
77
+ * `maxSkinnedInstances` defaults to `maxInstances * maxSkinnedPartsPerPrefab`.
78
+ * `maxBonesPerSkin` defaults to the maximum joint count across all prefabs.
79
+ */
80
+ prefabs?: PrefabBucket3D;
81
+ /**
82
+ * Max distance (world units) at which skeletal animation is computed for
83
+ * skinned instances. Past this, instances still render but reuse their
84
+ * last bone matrices; their internal animation clocks keep ticking on
85
+ * CPU. See `renderer.setAnimationCullDistance` to change at runtime.
86
+ * Set to `Infinity` to disable. Default 50.
87
+ */
88
+ animationCullDistance?: number;
64
89
  }
65
90
  export declare class WebGPU3DRenderer extends Base3DRenderer {
66
91
  private root;
@@ -92,6 +117,7 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
92
117
  private models;
93
118
  private nextModelId;
94
119
  private skinnedModels;
120
+ private clipResync;
95
121
  private skinnedMeshLayout;
96
122
  private rawSkinnedPipeline;
97
123
  private rawSkinnedTexturedPipeline;
@@ -103,6 +129,7 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
103
129
  private packedAnimData;
104
130
  private animComputeKernel;
105
131
  private animComputeNeedsRebuild;
132
+ private animKernelBudgets;
106
133
  private animClipTableOffset;
107
134
  private animChannelTableOffset;
108
135
  private animJointLookupOffset;
@@ -115,12 +142,20 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
115
142
  private skinnedFreeList;
116
143
  private skinnedBatcher;
117
144
  private skinnedStaticDirty;
145
+ private skinnedStaticDV;
118
146
  private skinnedInstanceModelIds;
119
147
  private skinnedInstanceBoneOffsets;
120
148
  private skinnedAnimStates;
121
149
  private nextBoneOffset;
150
+ /** Reusable bone-offset blocks per skinIndex. Pushed on remove, popped on add. Indexed by skinIndex (low cardinality), so a Map of lists is fine. */
151
+ private freedBoneOffsets;
152
+ /** Per-bone-offset refcount. Linked multi-part instances share a block; freed when refcount hits 0. Indexed by boneOffset (< maxTotalBones). */
153
+ private boneOffsetRefcount;
154
+ /** Per-bone-offset skinIndex tag, so we can return the block to the right per-skin freelist on remove. */
155
+ private boneOffsetSkinIndex;
122
156
  private readonly maxSkinnedInstances;
123
157
  private readonly maxBonesPerSkin;
158
+ private animationCullDistanceSq;
124
159
  private rawSkinnedDynamicBuffer;
125
160
  private rawSkinnedStaticBuffer;
126
161
  private rawSkinnedUniformBuffer;
@@ -129,8 +164,16 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
129
164
  readonly camera: Camera3D;
130
165
  private uniformData;
131
166
  private lastRenderTime;
167
+ private readonly _prefabs;
132
168
  constructor(canvas: HTMLCanvasElement, options: WebGPU3DRendererOptions);
133
169
  init(): Promise<void>;
170
+ /**
171
+ * Upload every prefab in the bucket to the GPU and stash the handle on
172
+ * each prefab so `bucket.get(id)` resolves to a usable model. Also
173
+ * subscribes the resync coordinator to the bucket's `clips-changed`
174
+ * channel for lazy load/unload.
175
+ */
176
+ private uploadPrefabBucket;
134
177
  private setupResizeObserver;
135
178
  /**
136
179
  * Register a callback that fires when the canvas resizes.
@@ -138,6 +181,30 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
138
181
  */
139
182
  onResize(callback: (width: number, height: number) => void): void;
140
183
  createCompute(name: string, options: ComputeOptions): ComputeBuilder;
184
+ /**
185
+ * Set the maximum distance (in world units) at which the renderer keeps
186
+ * computing skeletal animation. Skinned instances farther than this are
187
+ * still drawn, but with their last-computed bone matrices instead of
188
+ * fresh ones, which saves GPU compute work. Their internal animation
189
+ * clocks keep ticking on CPU, so when they come back into range they
190
+ * resume in sync.
191
+ *
192
+ * Lower values trade visual smoothness on distant characters for FPS.
193
+ * Pass `Infinity` to disable culling entirely (always animate).
194
+ *
195
+ * Safe to call any time; takes effect on the next frame.
196
+ *
197
+ * @param distance Max distance to animate at, in world units.
198
+ */
199
+ setAnimationCullDistance(distance: number): void;
200
+ /** Current animation cull distance (in world units). See `setAnimationCullDistance`. */
201
+ get animationCullDistance(): number;
202
+ /**
203
+ * Max skinned instances the renderer was sized for at construction.
204
+ * Independent budget from `maxInstances` since skinned characters use a
205
+ * separate set of GPU buffers. Read-only.
206
+ */
207
+ get maxSkinned(): number;
141
208
  /**
142
209
  * Create a flat grid mesh on the XZ plane at Y=0.
143
210
  *
@@ -151,6 +218,18 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
151
218
  step?: number;
152
219
  lineWidth?: number;
153
220
  }): ModelHandle;
221
+ /**
222
+ * Create a unit-cube mesh centered at the origin. Pass `size` to scale the
223
+ * edge length, or keep size = 1 and scale at the instance level.
224
+ *
225
+ * ```ts
226
+ * const cube = renderer.createCube();
227
+ * renderer.addInstance({ model: cube, color: [1, 0.5, 0.2], scale: 2 });
228
+ * ```
229
+ */
230
+ createCube(opts?: {
231
+ size?: number;
232
+ }): ModelHandle;
154
233
  /**
155
234
  * Register a model. Returns a handle for addInstance().
156
235
  *
@@ -187,19 +266,58 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
187
266
  loadGltf(url: string, opts?: {
188
267
  animations?: string[];
189
268
  }): Promise<GltfModel>;
269
+ /**
270
+ * Upload a previously-parsed glTF to the GPU. Returns a GltfModel handle.
271
+ * Splitting parse (CPU) from upload (GPU) lets callers parse models in parallel
272
+ * before a renderer exists and inspect joint counts / vertex totals to size the
273
+ * renderer appropriately.
274
+ */
275
+ uploadParsedGltf(parsed: ParsedGltf): GltfModel;
190
276
  /**
191
277
  * Add an instance. For skinned models, pass `linkedTo` to share bone matrices
192
278
  * with another instance (e.g., when spawning all parts of a character).
193
279
  */
194
280
  addInstance(opts: MeshInstanceOptions): InstanceHandle;
195
281
  private addGltfInstance;
282
+ /**
283
+ * Spawn a composite prefab by spawning each of its parts at the composed
284
+ * (instance + offset) transform. The returned handle broadcasts subsequent
285
+ * `setPosition` / `setRotation` to every child, keeping each child's
286
+ * baked offset applied on top of the new value.
287
+ */
288
+ private addCompositeInstance;
196
289
  private addSkinnedInstance;
290
+ /**
291
+ * Drain pending resyncs from the coordinator. Per affected skin: rebuild
292
+ * its `SkeletalAnimation` clip list densely, remap in-flight animStates,
293
+ * then full-repack `packedAnimData`. Falls back to a kernel rebuild only
294
+ * when the new data exceeds the kernel's allocated budgets.
295
+ *
296
+ * The dense renumbering is load-bearing: the kernel reads each clip by
297
+ * its per-skin index, which must equal `SkeletalAnimation`'s clip id.
298
+ */
299
+ private syncLazyAnimationChanges;
300
+ /** Doubling-growth budgets for kernel storage buffers, with sensible floors. */
301
+ private growBudgetsForPacked;
302
+ /** Upload `packedAnimData` to the existing kernel iff it fits the current budgets. Returns false to force a rebuild. */
303
+ private tryUploadInPlace;
197
304
  /**
198
305
  * Update skeletal animations for all skinned instances. Call once per tick.
199
306
  */
200
307
  private updatedBoneOffsets;
308
+ /**
309
+ * Returns true if a skinned instance's bone-matrix compute should be
310
+ * dispatched this frame. Combines frustum culling (scaled bounding sphere)
311
+ * and a configurable distance cull from the camera. Callers pass the
312
+ * camera position + cullDistSq once outside the loop to avoid re-reading.
313
+ */
314
+ private shouldDispatchSkinning;
201
315
  private updateAnimations;
202
- removeInstance(handle: MeshInstanceHandle): void;
316
+ /**
317
+ * Free an instance's renderer slot. Equivalent to `handle.destroy()` -
318
+ * kept as a convenience for direct lookup. Safe to call multiple times.
319
+ */
320
+ removeInstance(handle: InstanceHandle): void;
203
321
  storePreviousState(): void;
204
322
  render(alpha: number): void;
205
323
  /**
@@ -1,2 +1,2 @@
1
- export { buildAnimationKernel } from './kernel';
1
+ export { buildAnimationKernel, uploadPackedToKernel, type AnimationKernelBudgets } from './kernel';
2
2
  export { packAnimationData, type PackedBuffers } from './packer';
@@ -1,8 +1,25 @@
1
1
  import { type ComputeKernel } from '../../compute/compute-builder';
2
2
  import type { TgpuRoot } from 'typegpu';
3
3
  import { type PackedBuffers } from './packer';
4
- import type { PackedAnimationData } from '../gltf-skin-parser';
5
- export declare function buildAnimationKernel(root: TgpuRoot, packed: PackedAnimationData, maxInstances: number, maxTotalBones: number): {
4
+ import type { PackedAnimationData } from 'murow/renderer';
5
+ /**
6
+ * Capacity headroom for each storage buffer. Over-allocating is harmless —
7
+ * the kernel only ever reads as far as the uploaded data describes — and
8
+ * lets resyncs upload via `writeBuffer` instead of rebuilding the kernel.
9
+ */
10
+ export interface AnimationKernelBudgets {
11
+ skelI32Capacity: number;
12
+ animF32Capacity: number;
13
+ matricesCapacity: number;
14
+ }
15
+ export declare function buildAnimationKernel(root: TgpuRoot, packed: PackedAnimationData, maxInstances: number, maxTotalBones: number, budgets: AnimationKernelBudgets): {
6
16
  kernel: ComputeKernel;
7
17
  packedBuffers: PackedBuffers;
18
+ budgets: AnimationKernelBudgets;
8
19
  };
20
+ /**
21
+ * Re-upload packed animation data into an already-built kernel. Uses
22
+ * `device.queue.writeBuffer` directly against the typed arrays — TypeGPU's
23
+ * per-element write path is dramatically slower for big buffers.
24
+ */
25
+ export declare function uploadPackedToKernel(root: TgpuRoot, kernel: ComputeKernel, pb: PackedBuffers): void;
@@ -2,7 +2,7 @@
2
2
  * Packs animation data into flat typed arrays for GPU consumption.
3
3
  * Separated from the kernel so packing logic can be tested independently.
4
4
  */
5
- import type { PackedAnimationData } from '../gltf-skin-parser';
5
+ import type { PackedAnimationData } from 'murow/renderer';
6
6
  export interface PackedBuffers {
7
7
  skelI32: Int32Array;
8
8
  animF32: Float32Array;
@@ -1,4 +1,4 @@
1
- import type { Camera2DState } from 'murow/renderer/types';
1
+ import type { Camera2DState } from 'murow/renderer';
2
2
  export declare class Camera2D implements Camera2DState {
3
3
  x: number;
4
4
  y: number;
@@ -1,5 +1,5 @@
1
1
  import { Ray3D } from "murow/core/ray";
2
- import type { Camera3DState } from 'murow/renderer/types';
2
+ import type { Camera3DState } from 'murow/renderer';
3
3
  export declare class Camera3D implements Camera3DState {
4
4
  position: [number, number, number];
5
5
  target: [number, number, number];
@@ -1,32 +1,35 @@
1
1
  /**
2
2
  * @murow/webgpu — WebGPU rendering backend for murow.
3
3
  *
4
- * Re-exports TypeGPU's data module as `d` for user-facing shader authoring.
4
+ * This package supplies the **concrete WebGPU renderers** (2D + 3D), camera
5
+ * implementations, and the GPU-bound pieces (textures, compute, geometry
6
+ * builders, TypeGPU shader authoring).
7
+ *
8
+ * Renderer-agnostic primitives — `PrefabBucket`, parsers, skeletal animation,
9
+ * spritesheet helpers — live in the top-level `murow` package and should be
10
+ * imported from there.
5
11
  */
6
12
  export { d, std } from './shaders/typegpu';
7
13
  export { WebGPU2DRenderer } from './2d/renderer';
14
+ export type { WebGPU2DRendererOptions } from './2d/renderer';
8
15
  export { SpriteAccessor } from './2d/sprite-accessor';
16
+ export { AnimationController } from './2d/animation';
17
+ export type { AnimationClip, AnimationState, AnimationClipConfig } from './2d/animation';
9
18
  export { WebGPU3DRenderer } from './3d/renderer';
10
- export type { ModelData, ModelHandle, GltfModel, InstanceHandle, MeshInstanceHandle, MeshInstanceOptions } from './3d/renderer';
19
+ export type { ModelData, ModelHandle, GltfModel, InstanceHandle, MeshInstanceHandle, MeshInstanceOptions, } from './3d/renderer';
11
20
  export { MorphAnimation } from './3d/morph-animation';
12
21
  export type { MorphClip, MorphState, MorphClipConfig } from './3d/morph-animation';
13
- export { SkeletalAnimation } from './3d/skeletal-animation';
14
- export type { SkeletalClip, SkeletalAnimState, PlayOptions } from './3d/skeletal-animation';
15
- export type { SkinData, AnimationClipData, AnimationChannel } from './3d/gltf-skin-parser';
16
22
  export { Camera2D } from './camera/camera-2d';
17
23
  export { Camera3D } from './camera/camera-3d';
18
- export { GeometryBuilder, CustomGeometry, InstanceAccessor, InstanceContext, getFieldFloats, createGeometryDataLayout } from './geometry/geometry-builder';
19
- export type { GeometryOptions, InstanceLayoutConfig, CustomGeometryLayout, GeometryDataLayout, ShaderContext } from './geometry/geometry-builder';
24
+ export { GeometryBuilder, CustomGeometry, InstanceAccessor, InstanceContext, getFieldFloats, createGeometryDataLayout, } from './geometry/geometry-builder';
25
+ export type { GeometryOptions, InstanceLayoutConfig, CustomGeometryLayout, GeometryDataLayout, ShaderContext, } from './geometry/geometry-builder';
20
26
  export { resolveBuiltInGeometry } from './geometry/built-in';
21
27
  export type { BuiltInGeometry, GeometryData } from './geometry/built-in';
22
- export { Spritesheet, computeGridUVs, computeTexturePackerUVs, loadImage, createTextureFromBitmap } from './spritesheet/spritesheet';
23
- export type { SpritesheetConfig, TexturePackerData } from './spritesheet/spritesheet';
28
+ export { Spritesheet, createTextureFromBitmap } from './spritesheet/spritesheet';
24
29
  export { ParticleEmitter } from './particle/emitter';
25
30
  export type { ParticleEmitterConfig, Range } from './particle/emitter';
26
- export { AnimationController } from './2d/animation';
27
- export type { AnimationClip, AnimationState, AnimationClipConfig } from './2d/animation';
28
31
  export { ComputeBuilder, ComputeKernel } from './compute/compute-builder';
29
32
  export type { ComputeOptions, ComputeBufferDef, ComputeInput } from './compute/compute-builder';
30
33
  export { rotate2d, worldToClip2d, worldToClip3d, remap, scaleRotate2d, inverseLerp } from './shaders/utils';
31
34
  export * from './core/constants';
32
- export { DynamicSprite, StaticSprite, SpriteUniforms, DynamicInstance3D, StaticInstance3D, DynamicMesh, StaticMesh, SkinnedStaticMesh, MeshUniforms } from './core/types';
35
+ export { DynamicSprite, StaticSprite, SpriteUniforms, DynamicInstance3D, StaticInstance3D, DynamicMesh, StaticMesh, SkinnedStaticMesh, MeshUniforms, } from './core/types';
@@ -1,4 +1,4 @@
1
- import type { SpritesheetHandle } from 'murow/renderer/types';
1
+ import type { SpritesheetHandle } from 'murow/renderer';
2
2
  import type { WebGPU2DRenderer } from '../2d/renderer';
3
3
  export interface Range {
4
4
  min: number;
@@ -1,39 +1,13 @@
1
1
  /**
2
- * Spritesheet manages sprite UV coordinates and GPU texture.
3
- * Supports grid-based spritesheets and texture-packer JSON.
2
+ * GPU-bound parts of spritesheet handling. Pure helpers (UV math, image loading)
3
+ * live in `murow/renderer/spritesheet-helpers`; they're re-exported here for
4
+ * backwards compatibility with code that did `import { ... } from 'murow/webgpu'`.
4
5
  *
5
6
  * Texture creation uses the raw GPUDevice (accessed via root.device)
6
7
  * since TypeGPU's texture API is unstable and we need copyExternalImageToTexture.
7
8
  */
8
- import type { SpritesheetHandle, SpriteUV } from 'murow/renderer/types';
9
- export interface GridSpritesheetConfig {
10
- image: string;
11
- frameWidth: number;
12
- frameHeight: number;
13
- }
14
- export interface TexturePackerFrame {
15
- frame: {
16
- x: number;
17
- y: number;
18
- w: number;
19
- h: number;
20
- };
21
- }
22
- export interface TexturePackerData {
23
- frames: Record<string, TexturePackerFrame>;
24
- meta: {
25
- size: {
26
- w: number;
27
- h: number;
28
- };
29
- };
30
- }
31
- export interface SpritesheetConfig {
32
- image: string;
33
- frameWidth?: number;
34
- frameHeight?: number;
35
- data?: string;
36
- }
9
+ import type { SpritesheetHandle, SpriteUV } from 'murow/renderer';
10
+ export { computeGridUVs, computeTexturePackerUVs, loadImage, type GridSpritesheetConfig, type SpritesheetConfig, type TexturePackerData, type TexturePackerFrame, } from 'murow/renderer';
37
11
  export declare class Spritesheet implements SpritesheetHandle {
38
12
  readonly id: number;
39
13
  readonly frameCount: number;
@@ -48,9 +22,6 @@ export declare class Spritesheet implements SpritesheetHandle {
48
22
  get width(): number;
49
23
  get height(): number;
50
24
  }
51
- export declare function computeGridUVs(imageWidth: number, imageHeight: number, frameWidth: number, frameHeight: number): SpriteUV[];
52
- export declare function computeTexturePackerUVs(data: TexturePackerData): SpriteUV[];
53
- export declare function loadImage(url: string): Promise<ImageBitmap>;
54
25
  export declare function createTextureFromBitmap(device: GPUDevice, bitmap: ImageBitmap): {
55
26
  texture: GPUTexture;
56
27
  view: GPUTextureView;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "murow",
3
- "version": "0.0.71",
3
+ "version": "0.0.73",
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",
@@ -1 +0,0 @@
1
- var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(r,e)=>{for(var a in e)s(r,a,{get:e[a],enumerable:!0})},c=(r,e,a,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!p.call(r,t)&&t!==a&&s(r,t,{get:()=>e[t],enumerable:!(n=m(e,t))||n.enumerable});return r};var D=r=>c(s({},"__esModule",{value:!0}),r);var x={};l(x,{Base3DRenderer:()=>i});module.exports=D(x);var o=require("./base-renderer");class i extends o.BaseRenderer{constructor(e,a){super(e,a),this.maxModels=a.maxModels}}
@@ -1 +0,0 @@
1
- import{BaseRenderer as t}from"./base-renderer";class p extends t{constructor(r,e){super(r,e),this.maxSprites=e.maxSprites}}export{p as Base2DRenderer};
@@ -1 +0,0 @@
1
- import{BaseRenderer as a}from"./base-renderer";class n extends a{constructor(r,e){super(r,e),this.maxModels=e.maxModels}}export{n as Base3DRenderer};