murow 0.0.71 → 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 (65) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/renderer/{base-2d-renderer.js → base/renderer-2d.js} +1 -1
  3. package/dist/cjs/renderer/{base-3d-renderer.js → base/renderer-3d.js} +1 -1
  4. package/dist/cjs/renderer/gltf/helpers.js +1 -0
  5. package/dist/cjs/renderer/gltf/parser.js +1 -0
  6. package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
  7. package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
  8. package/dist/cjs/renderer/index.js +1 -1
  9. package/dist/cjs/renderer/math.js +1 -0
  10. package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
  11. package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
  12. package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
  13. package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
  14. package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
  15. package/dist/cjs/renderer/spritesheet/parser.js +1 -0
  16. package/dist/cjs/renderer/types.js +1 -1
  17. package/dist/esm/renderer/base/renderer-2d.js +1 -0
  18. package/dist/esm/renderer/base/renderer-3d.js +1 -0
  19. package/dist/esm/renderer/gltf/helpers.js +1 -0
  20. package/dist/esm/renderer/gltf/parser.js +1 -0
  21. package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
  22. package/dist/esm/renderer/gltf/skin-parser.js +1 -0
  23. package/dist/esm/renderer/index.js +1 -1
  24. package/dist/esm/renderer/math.js +1 -0
  25. package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
  26. package/dist/esm/renderer/prefab-bucket/index.js +1 -0
  27. package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
  28. package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
  29. package/dist/esm/renderer/spritesheet/helpers.js +1 -0
  30. package/dist/esm/renderer/spritesheet/parser.js +1 -0
  31. package/dist/types/renderer/{base-2d-renderer.d.ts → base/renderer-2d.d.ts} +2 -2
  32. package/dist/types/renderer/{base-3d-renderer.d.ts → base/renderer-3d.d.ts} +2 -2
  33. package/dist/types/renderer/{base-renderer.d.ts → base/renderer.d.ts} +1 -1
  34. package/dist/types/renderer/gltf/helpers.d.ts +43 -0
  35. package/dist/types/renderer/gltf/parser.d.ts +49 -0
  36. package/dist/{webgpu/types/3d → types/renderer/gltf}/skeletal-animation.d.ts +8 -2
  37. package/dist/{webgpu/types/3d/gltf-skin-parser.d.ts → types/renderer/gltf/skin-parser.d.ts} +11 -5
  38. package/dist/types/renderer/index.d.ts +14 -3
  39. package/dist/types/renderer/prefab-bucket/concrete.d.ts +55 -0
  40. package/dist/types/renderer/prefab-bucket/index.d.ts +113 -0
  41. package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
  42. package/dist/types/renderer/prefab-bucket/specs.d.ts +166 -0
  43. package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
  44. package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
  45. package/dist/types/renderer/types.d.ts +17 -7
  46. package/dist/webgpu/cjs/index.js +479 -1082
  47. package/dist/webgpu/esm/index.js +485 -1079
  48. package/dist/webgpu/types/2d/renderer.d.ts +34 -3
  49. package/dist/webgpu/types/2d/sprite-accessor.d.ts +1 -1
  50. package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
  51. package/dist/webgpu/types/3d/renderer.d.ts +64 -14
  52. package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +1 -1
  53. package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +19 -2
  54. package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +1 -1
  55. package/dist/webgpu/types/camera/camera-2d.d.ts +1 -1
  56. package/dist/webgpu/types/camera/camera-3d.d.ts +1 -1
  57. package/dist/webgpu/types/index.d.ts +15 -12
  58. package/dist/webgpu/types/particle/emitter.d.ts +1 -1
  59. package/dist/webgpu/types/spritesheet/spritesheet.d.ts +5 -34
  60. package/package.json +1 -1
  61. package/dist/esm/renderer/base-2d-renderer.js +0 -1
  62. package/dist/esm/renderer/base-3d-renderer.js +0 -1
  63. /package/dist/cjs/renderer/{base-renderer.js → base/renderer.js} +0 -0
  64. /package/dist/esm/renderer/{base-renderer.js → base/renderer.js} +0 -0
  65. /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;
@@ -46,21 +46,40 @@ export interface InstanceHandle {
46
46
  readonly skinned: boolean;
47
47
  }
48
48
  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];
49
+ /**
50
+ * The model to instance. Either a renderer-internal handle (from `loadGltf`,
51
+ * `loadModel`, `createGrid`) or a prefab fetched from a `PrefabBucket3D` —
52
+ * `bucket.get('my-id')`.
53
+ */
54
+ model: ModelHandle | GltfModel | Prefab3D;
55
+ /** World position. Defaults to `[0, 0, 0]`. */
56
+ position?: readonly [x: number, y: number, z: number];
57
+ /** Euler rotation in radians. Defaults to `[0, 0, 0]`. */
58
+ rotation?: readonly [x: number, y: number, z: number];
59
+ /** Per-axis scale. Pass a single number to scale uniformly. Defaults to `[1, 1, 1]`. */
60
+ scale?: number | readonly [x: number, y: number, z: number];
61
+ /** Tint color RGB. Defaults to `[1, 1, 1]`. */
62
+ color?: readonly [r: number, g: number, b: number];
60
63
  }
61
64
  export interface WebGPU3DRendererOptions extends Renderer3DOptions {
62
65
  maxSkinnedInstances?: number;
63
66
  maxBonesPerSkin?: number;
67
+ /**
68
+ * Pre-loaded prefab bucket. When provided, the renderer self-sizes its
69
+ * skinned-instance + bone buffers from the bucket's prefab stats, and
70
+ * uploads each prefab to the GPU during `init()`. The bucket must have
71
+ * `load()` resolved before being passed in.
72
+ *
73
+ * `maxSkinnedInstances` defaults to `maxInstances * maxSkinnedPartsPerPrefab`.
74
+ * `maxBonesPerSkin` defaults to the maximum joint count across all prefabs.
75
+ */
76
+ prefabs?: PrefabBucket3D;
77
+ /**
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.
81
+ */
82
+ maxInstances?: number;
64
83
  }
65
84
  export declare class WebGPU3DRenderer extends Base3DRenderer {
66
85
  private root;
@@ -92,6 +111,7 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
92
111
  private models;
93
112
  private nextModelId;
94
113
  private skinnedModels;
114
+ private clipResync;
95
115
  private skinnedMeshLayout;
96
116
  private rawSkinnedPipeline;
97
117
  private rawSkinnedTexturedPipeline;
@@ -103,6 +123,7 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
103
123
  private packedAnimData;
104
124
  private animComputeKernel;
105
125
  private animComputeNeedsRebuild;
126
+ private animKernelBudgets;
106
127
  private animClipTableOffset;
107
128
  private animChannelTableOffset;
108
129
  private animJointLookupOffset;
@@ -129,8 +150,16 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
129
150
  readonly camera: Camera3D;
130
151
  private uniformData;
131
152
  private lastRenderTime;
153
+ private readonly _prefabs;
132
154
  constructor(canvas: HTMLCanvasElement, options: WebGPU3DRendererOptions);
133
155
  init(): Promise<void>;
156
+ /**
157
+ * Upload every prefab in the bucket to the GPU and stash the handle on
158
+ * each prefab so `bucket.get(id)` resolves to a usable model. Also
159
+ * subscribes the resync coordinator to the bucket's `clips-changed`
160
+ * channel for lazy load/unload.
161
+ */
162
+ private uploadPrefabBucket;
134
163
  private setupResizeObserver;
135
164
  /**
136
165
  * Register a callback that fires when the canvas resizes.
@@ -187,6 +216,13 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
187
216
  loadGltf(url: string, opts?: {
188
217
  animations?: string[];
189
218
  }): Promise<GltfModel>;
219
+ /**
220
+ * Upload a previously-parsed glTF to the GPU. Returns a GltfModel handle.
221
+ * Splitting parse (CPU) from upload (GPU) lets callers parse models in parallel
222
+ * before a renderer exists and inspect joint counts / vertex totals to size the
223
+ * renderer appropriately.
224
+ */
225
+ uploadParsedGltf(parsed: ParsedGltf): GltfModel;
190
226
  /**
191
227
  * Add an instance. For skinned models, pass `linkedTo` to share bone matrices
192
228
  * with another instance (e.g., when spawning all parts of a character).
@@ -194,6 +230,20 @@ export declare class WebGPU3DRenderer extends Base3DRenderer {
194
230
  addInstance(opts: MeshInstanceOptions): InstanceHandle;
195
231
  private addGltfInstance;
196
232
  private addSkinnedInstance;
233
+ /**
234
+ * Drain pending resyncs from the coordinator. Per affected skin: rebuild
235
+ * its `SkeletalAnimation` clip list densely, remap in-flight animStates,
236
+ * then full-repack `packedAnimData`. Falls back to a kernel rebuild only
237
+ * when the new data exceeds the kernel's allocated budgets.
238
+ *
239
+ * The dense renumbering is load-bearing: the kernel reads each clip by
240
+ * its per-skin index, which must equal `SkeletalAnimation`'s clip id.
241
+ */
242
+ private syncLazyAnimationChanges;
243
+ /** Doubling-growth budgets for kernel storage buffers, with sensible floors. */
244
+ private growBudgetsForPacked;
245
+ /** Upload `packedAnimData` to the existing kernel iff it fits the current budgets. Returns false to force a rebuild. */
246
+ private tryUploadInPlace;
197
247
  /**
198
248
  * Update skeletal animations for all skinned instances. Call once per tick.
199
249
  */
@@ -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.72",
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
- 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};