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.
- package/README.md +7 -5
- package/dist/cjs/core/driver/drivers/raf.js +1 -1
- package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -1
- package/dist/cjs/renderer/{base-2d-renderer.js → base/renderer-2d.js} +1 -1
- package/dist/cjs/renderer/base/renderer-3d.js +1 -0
- package/dist/cjs/renderer/gltf/helpers.js +1 -0
- package/dist/cjs/renderer/gltf/parser.js +1 -0
- package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
- package/dist/cjs/renderer/index.js +1 -1
- package/dist/cjs/renderer/math.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
- package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
- package/dist/cjs/renderer/spritesheet/parser.js +1 -0
- package/dist/cjs/renderer/types.js +1 -1
- package/dist/esm/core/driver/drivers/raf.js +1 -1
- package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -1
- package/dist/esm/renderer/base/renderer-2d.js +1 -0
- package/dist/esm/renderer/base/renderer-3d.js +1 -0
- package/dist/esm/renderer/gltf/helpers.js +1 -0
- package/dist/esm/renderer/gltf/parser.js +1 -0
- package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/esm/renderer/gltf/skin-parser.js +1 -0
- package/dist/esm/renderer/index.js +1 -1
- package/dist/esm/renderer/math.js +1 -0
- package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/esm/renderer/prefab-bucket/index.js +1 -0
- package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
- package/dist/esm/renderer/spritesheet/helpers.js +1 -0
- package/dist/esm/renderer/spritesheet/parser.js +1 -0
- package/dist/types/core/driver/drivers/raf.d.ts +13 -2
- package/dist/types/renderer/{base-2d-renderer.d.ts → base/renderer-2d.d.ts} +2 -2
- package/dist/types/renderer/{base-3d-renderer.d.ts → base/renderer-3d.d.ts} +3 -3
- package/dist/types/renderer/{base-renderer.d.ts → base/renderer.d.ts} +1 -1
- package/dist/types/renderer/gltf/helpers.d.ts +43 -0
- package/dist/types/renderer/gltf/parser.d.ts +49 -0
- package/dist/{webgpu/types/3d → types/renderer/gltf}/skeletal-animation.d.ts +8 -2
- package/dist/{webgpu/types/3d/gltf-skin-parser.d.ts → types/renderer/gltf/skin-parser.d.ts} +11 -5
- package/dist/types/renderer/index.d.ts +14 -3
- package/dist/types/renderer/prefab-bucket/concrete.d.ts +95 -0
- package/dist/types/renderer/prefab-bucket/index.d.ts +123 -0
- package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
- package/dist/types/renderer/prefab-bucket/specs.d.ts +209 -0
- package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
- package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
- package/dist/types/renderer/types.d.ts +19 -7
- package/dist/webgpu/cjs/index.js +1021 -1188
- package/dist/webgpu/esm/index.js +1016 -1174
- package/dist/webgpu/types/2d/renderer.d.ts +34 -3
- package/dist/webgpu/types/2d/sprite-accessor.d.ts +1 -1
- package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
- package/dist/webgpu/types/3d/renderer.d.ts +133 -15
- package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +1 -1
- package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +19 -2
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +1 -1
- package/dist/webgpu/types/camera/camera-2d.d.ts +1 -1
- package/dist/webgpu/types/camera/camera-3d.d.ts +1 -1
- package/dist/webgpu/types/index.d.ts +15 -12
- package/dist/webgpu/types/particle/emitter.d.ts +1 -1
- package/dist/webgpu/types/spritesheet/spritesheet.d.ts +5 -34
- package/package.json +1 -1
- package/dist/cjs/renderer/base-3d-renderer.js +0 -1
- package/dist/esm/renderer/base-2d-renderer.js +0 -1
- package/dist/esm/renderer/base-3d-renderer.js +0 -1
- /package/dist/cjs/renderer/{base-renderer.js → base/renderer.js} +0 -0
- /package/dist/esm/renderer/{base-renderer.js → base/renderer.js} +0 -0
- /package/dist/{webgpu/types/core → types/renderer}/math.d.ts +0 -0
|
@@ -1,8 +1,24 @@
|
|
|
1
|
-
import { Base2DRenderer } from 'murow/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
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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
|
|
2
|
-
import type { Renderer3DOptions } from 'murow/renderer
|
|
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 '
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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 '
|
|
5
|
-
|
|
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 '
|
|
5
|
+
import type { PackedAnimationData } from 'murow/renderer';
|
|
6
6
|
export interface PackedBuffers {
|
|
7
7
|
skelI32: Int32Array;
|
|
8
8
|
animF32: Float32Array;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Ray3D } from "murow/core/ray";
|
|
2
|
-
import type { Camera3DState } from 'murow/renderer
|
|
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
|
-
*
|
|
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,
|
|
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,39 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
|
9
|
-
export
|
|
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 +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};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|