@zylem/game-lib 0.7.0 → 0.8.0

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 (95) hide show
  1. package/README.md +15 -1
  2. package/dist/actions.d.ts +71 -8
  3. package/dist/actions.js +1 -1
  4. package/dist/api/game-lib.api.json +54074 -0
  5. package/dist/api/game-lib.api.md +4544 -0
  6. package/dist/api/game-lib.d.ts +8258 -0
  7. package/dist/api/game-lib.typedoc.json +345421 -0
  8. package/dist/audio.js +1 -1
  9. package/dist/{base-node-life-cycle-CnJ-7zX-.d.ts → base-node-life-cycle-D2NuN1VB.d.ts} +12 -4
  10. package/dist/behavior.d.ts +2 -3
  11. package/dist/behavior.js +1 -1
  12. package/dist/blueprints-TbGY-h53.d.ts +162 -0
  13. package/dist/chunk-7FR5JSQ2.js +1 -0
  14. package/dist/chunk-7GYFZKK7.js +1 -0
  15. package/dist/chunk-7WRQ2UAN.js +1 -0
  16. package/dist/chunk-BH53MBAZ.js +1 -0
  17. package/dist/chunk-BIGH6D34.js +0 -0
  18. package/dist/chunk-CM5YRNBJ.js +19 -0
  19. package/dist/chunk-COM6HJ2L.js +1 -0
  20. package/dist/chunk-D2PATZCC.js +1 -0
  21. package/dist/chunk-DFLI7ICU.js +0 -0
  22. package/dist/chunk-E3UBSUPX.js +1 -0
  23. package/dist/chunk-FKIKN7RP.js +24 -0
  24. package/dist/chunk-G4HONLWC.js +1 -0
  25. package/dist/chunk-IKWE2W6L.js +1 -0
  26. package/dist/chunk-IPWUDOV5.js +1 -0
  27. package/dist/chunk-JEHFHUH4.js +0 -0
  28. package/dist/chunk-JNKPTL77.js +1 -0
  29. package/dist/chunk-JQKS42G4.js +1 -0
  30. package/dist/chunk-M3XNO56P.js +1 -0
  31. package/dist/chunk-ORIDWL3T.js +0 -0
  32. package/dist/chunk-QB3NL7VQ.js +1 -0
  33. package/dist/chunk-TAUWDQZF.js +9 -0
  34. package/dist/chunk-VS2D4B3W.js +1 -0
  35. package/dist/chunk-WQ3WMMZD.js +1 -0
  36. package/dist/chunk-XK63E4SX.js +1 -0
  37. package/dist/chunk-XNDS4YFR.js +1 -0
  38. package/dist/chunk-XNHVRFAK.js +1 -0
  39. package/dist/chunk-ZRT3ZQVH.js +1 -0
  40. package/dist/collision-builder-jF-toPIl.d.ts +38 -0
  41. package/dist/core.d.ts +45 -30
  42. package/dist/core.js +1 -24
  43. package/dist/debug-state-BPT6jEog.d.ts +17 -0
  44. package/dist/debug.d.ts +71 -19
  45. package/dist/debug.js +1 -1
  46. package/dist/{default-controls-BGc61yYl.d.ts → default-controls-0-vCnli7.d.ts} +3 -3
  47. package/dist/{entity-DNkYKfdp.d.ts → entity-BdSI8CL3.d.ts} +63 -444
  48. package/dist/entity-DZbFQ1Wg.d.ts +28 -0
  49. package/dist/{entity-type-map-C94h2TDW.d.ts → entity-type-map-Bd69SpAS.d.ts} +153 -6
  50. package/dist/entity.d.ts +11 -8
  51. package/dist/entity.js +1 -1
  52. package/dist/events.d.ts +10 -1
  53. package/dist/events.js +1 -1
  54. package/dist/{game-Cuj5gy7U.d.ts → game-C1FHVqXl.d.ts} +429 -133
  55. package/dist/game-default-QHROHW2O.js +1 -0
  56. package/dist/{game-interfaces-tfpM5NBk.d.ts → game-interfaces-mchNYSZE.d.ts} +2 -2
  57. package/dist/globals.d.ts +12 -1
  58. package/dist/globals.js +1 -1
  59. package/dist/graphics.d.ts +16 -46
  60. package/dist/graphics.js +1 -1
  61. package/dist/input-ui.d.ts +5 -4
  62. package/dist/input-ui.js +1 -1
  63. package/dist/input.d.ts +4 -3
  64. package/dist/input.js +1 -1
  65. package/dist/{material-Wz83vTTp.d.ts → material-9vJ6SZaI.d.ts} +25 -50
  66. package/dist/public.d.ts +38 -0
  67. package/dist/public.js +1 -0
  68. package/dist/runtime.d.ts +7 -381
  69. package/dist/runtime.js +1 -1
  70. package/dist/schema/entity.schema.json +244 -0
  71. package/dist/schema/game-config.schema.json +625 -0
  72. package/dist/schema/input-config.schema.json +499 -0
  73. package/dist/schema/stage-config.schema.json +93 -0
  74. package/dist/schema/stage.schema.json +271 -0
  75. package/dist/schema.d.ts +538 -0
  76. package/dist/schema.js +1 -0
  77. package/dist/stage-transition-CmGpV4tc.d.ts +46 -0
  78. package/dist/vector-CiSHbivc.d.ts +133 -0
  79. package/dist/web-components.d.ts +15 -12
  80. package/dist/web-components.js +1 -9
  81. package/dist/{zylem-stage-runtime-Cs-UDEVU.d.ts → zylem-camera-C3bn6BTI.d.ts} +62 -264
  82. package/package.json +28 -20
  83. package/dist/chunk-73VZQZUL.js +0 -1
  84. package/dist/chunk-A34ZG3L4.js +0 -1
  85. package/dist/chunk-CDPY4VOQ.js +0 -1
  86. package/dist/chunk-DR6XXZE7.js +0 -19
  87. package/dist/chunk-FM5TBEPO.js +0 -1
  88. package/dist/chunk-G2IIMSUH.js +0 -1
  89. package/dist/chunk-NIH5CONO.js +0 -1
  90. package/dist/chunk-ONWXGBWB.js +0 -1
  91. package/dist/chunk-QEDQDR27.js +0 -1
  92. package/dist/chunk-WKHW2QO2.js +0 -1
  93. package/dist/chunk-YHKXQ2ZN.js +0 -1
  94. package/dist/game-default-PZLLHYL7.js +0 -1
  95. package/dist/world-C9zdyl5d.d.ts +0 -103
@@ -1,9 +1,10 @@
1
1
  import { BufferGeometry, Material, Mesh, Group, Vector3, Color, ShaderMaterial } from 'three';
2
- import { RigidBodyDesc, ColliderDesc, RigidBody, Collider, Vector } from '@dimforge/rapier3d-compat';
3
- import { a as Vec3Input, c as Vec3, s as MaterialBuilder, M as MaterialOptions, b as Vec2Input } from './material-Wz83vTTp.js';
4
- import { S as SetupContext, f as UpdateContext, D as DestroyContext, h as SetupFunction, i as LoadedFunction, U as UpdateFunction, j as DestroyFunction, k as CleanupFunction, L as LoadedContext, C as CleanupContext } from './base-node-life-cycle-CnJ-7zX-.js';
2
+ import { SimulationColliderDefinition, TransformState, SimulationBodyDefinition, MoveableEntity, BehaviorRuntime, Vector, BehaviorDescriptor, BehaviorHandle, BehaviorRef } from '@zylem/behaviors/core';
3
+ import { c as Vec3, e as Vec3Input, b as Vec2Input, l as SimulationBody } from './vector-CiSHbivc.js';
4
+ import { M as MaterialBuilder, e as MaterialOptions } from './material-9vJ6SZaI.js';
5
+ import { C as CollisionBuilder, a as CollisionOptions } from './collision-builder-jF-toPIl.js';
6
+ import { a as SetupContext, U as UpdateContext, D as DestroyContext, h as SetupFunction, i as LoadedFunction, g as UpdateFunction, j as DestroyFunction, C as CleanupFunction, k as LoadedContext, l as CleanupContext } from './base-node-life-cycle-D2NuN1VB.js';
5
7
  import { EventEmitterDelegate, EntityEvents } from './events.js';
6
- import { TransformState, MoveableEntity, BehaviorDescriptor, BehaviorHandle, BehaviorRef } from '@zylem/behaviors/core';
7
8
 
8
9
  interface NodeInterface {
9
10
  uuid: string;
@@ -98,417 +99,19 @@ declare abstract class BaseNode<Options = any, T = any> implements NodeInterface
98
99
  private recordLifecycleRegistration;
99
100
  }
100
101
 
101
- /**
102
- * `WasmStageRuntime` — owns one wasm `WebAssembly.Instance` of `@zylem/runtime`
103
- * and exposes the unified-Stage FFI as a set of typed TypeScript methods.
104
- * Replaces the legacy {@link ZylemRuntimeStageAdapter} + {@link ZylemWorld}
105
- * pair; every `ZylemStage` instantiates exactly one `WasmStageRuntime`.
106
- *
107
- * The runtime is the single source of truth for per-frame physics state.
108
- * TS-side behaviors and visual layers (destructible-3d, particle-emitter,
109
- * screen-visibility) read transforms from the render buffer; sim-only
110
- * behaviors push their attach/query payload through the per-behavior
111
- * helpers exposed here.
112
- */
113
- /** Sentinel handle for "no entity / failed allocation". Mirrors `INVALID_SLOT` in Rust. */
114
- declare const STAGE_INVALID_SLOT = 4294967295;
115
- /** Fixed render-buffer stride in floats. Must match `STAGE_RENDER_STRIDE` in Rust. */
116
- declare const STAGE_RENDER_STRIDE = 12;
117
- /** Fixed event-buffer stride in floats. Must match `STAGE_EVENT_STRIDE` in Rust. */
118
- declare const STAGE_EVENT_STRIDE = 6;
119
- /** Fixed pose-scratch stride in floats. Must match `POSE_SCRATCH_LEN` in Rust. */
120
- declare const STAGE_POSE_LEN = 7;
121
- declare const enum StageBodyKind {
122
- Dynamic = 0,
123
- Static = 1,
124
- KinematicPosition = 2,
125
- KinematicVelocity = 3
126
- }
127
- declare const enum StageBoundaryDim {
128
- Two = 2,
129
- Three = 3
130
- }
131
- declare const enum StageRicochetDim {
132
- Two = 2,
133
- Three = 3
134
- }
135
- declare const enum StageRicochetReflection {
136
- Mirror = 0,
137
- Angled = 1
138
- }
139
- declare const enum StageTopDownPlane {
140
- Xy = 0,
141
- Xz = 1
142
- }
143
- declare const enum StageEventType {
144
- CollisionStarted = 1,
145
- CollisionStopped = 2,
146
- BoundaryHit = 3,
147
- Ricochet = 4,
148
- RegionEntered = 5,
149
- JumpStarted = 6,
150
- Landed = 7,
151
- Wrapped = 8,
152
- CooldownFired = 9
153
- }
154
- interface StageEvent {
155
- type: StageEventType;
156
- primarySlot: number | null;
157
- secondarySlot: number | null;
158
- payload: [number, number, number];
159
- }
160
- interface StagePose {
161
- position: [number, number, number];
162
- rotation: [number, number, number, number];
163
- }
164
- interface StageBodyConfig {
165
- kind: StageBodyKind;
166
- position: readonly [number, number, number];
167
- rotation: readonly [number, number, number, number];
168
- linearDamping: number;
169
- angularDamping: number;
170
- gravityScale: number;
171
- canSleep: boolean;
172
- ccdEnabled: boolean;
173
- lockRotation: readonly [boolean, boolean, boolean];
174
- lockTranslation: readonly [boolean, boolean, boolean];
175
- }
176
- type StageColliderShape = {
177
- type: 'box';
178
- halfExtents: readonly [number, number, number];
179
- } | {
180
- type: 'sphere';
181
- radius: number;
182
- } | {
183
- type: 'capsule';
184
- halfHeight: number;
185
- radius: number;
186
- } | {
187
- type: 'cylinder';
188
- halfHeight: number;
189
- radius: number;
190
- } | {
191
- type: 'convexHull';
192
- vertices: Float32Array;
193
- } | {
194
- type: 'trimesh';
195
- vertices: Float32Array;
196
- indices: Uint32Array;
197
- } | {
198
- type: 'heightfield';
199
- rows: number;
200
- cols: number;
201
- scale: readonly [number, number, number];
202
- heights: Float32Array;
203
- };
204
- interface StageColliderConfig {
205
- shape: StageColliderShape;
206
- offset: readonly [number, number, number];
207
- friction: number;
208
- restitution: number;
209
- sensor: boolean;
210
- /** Packed Rapier interaction-groups: high 16 bits = membership, low 16 bits = filter. */
211
- collisionGroups: number;
212
- }
213
- /** Minimal exports surface used by `WasmStageRuntime`. Mirrors `stage_ffi.rs`. */
214
- interface StageWasmExports {
215
- readonly memory: WebAssembly.Memory;
216
- zylem_stage_create(initialCapacity: number): number;
217
- zylem_stage_destroy(): void;
218
- zylem_stage_set_gravity(x: number, y: number, z: number): void;
219
- zylem_stage_step(dt: number): number;
220
- zylem_stage_active_count(): number;
221
- zylem_stage_capacity(): number;
222
- zylem_stage_tick_count(): number;
223
- zylem_stage_create_entity(): number;
224
- zylem_stage_destroy_entity(slot: number): number;
225
- zylem_stage_attach_body(slot: number, kind: number, px: number, py: number, pz: number, rx: number, ry: number, rz: number, rw: number, linearDamping: number, angularDamping: number, gravityScale: number, canSleep: number, ccdEnabled: number, lockRotX: number, lockRotY: number, lockRotZ: number, lockTransX: number, lockTransY: number, lockTransZ: number): number;
226
- zylem_stage_add_collider_box(slot: number, hx: number, hy: number, hz: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
227
- zylem_stage_add_collider_sphere(slot: number, radius: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
228
- zylem_stage_add_collider_capsule(slot: number, halfHeight: number, radius: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
229
- zylem_stage_add_collider_cylinder(slot: number, halfHeight: number, radius: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
230
- zylem_stage_add_collider_convex_hull(slot: number, vertexOffset: number, vertexCount: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
231
- zylem_stage_add_collider_trimesh(slot: number, vertexOffset: number, vertexCount: number, indexOffset: number, indexCount: number, ox: number, oy: number, oz: number, friction: number, restitution: number, sensor: number, collisionGroups: number): number;
232
- zylem_stage_add_collider_heightfield(slot: number, rows: number, cols: number, sx: number, sy: number, sz: number, heightOffset: number, px: number, py: number, pz: number, friction: number, restitution: number, collisionGroups: number): number;
233
- zylem_stage_get_pose(slot: number): number;
234
- zylem_stage_pose_ptr(): number;
235
- zylem_stage_pose_len(): number;
236
- zylem_stage_set_position(slot: number, x: number, y: number, z: number): number;
237
- zylem_stage_set_rotation(slot: number, x: number, y: number, z: number, w: number): number;
238
- zylem_stage_set_linvel(slot: number, x: number, y: number, z: number): number;
239
- zylem_stage_get_linvel(slot: number): number;
240
- zylem_stage_set_angvel(slot: number, x: number, y: number, z: number): number;
241
- zylem_stage_apply_impulse(slot: number, x: number, y: number, z: number): number;
242
- zylem_stage_vec3_ptr(): number;
243
- zylem_stage_render_ptr(): number;
244
- zylem_stage_render_len(): number;
245
- zylem_stage_render_stride(): number;
246
- zylem_stage_event_ptr(): number;
247
- zylem_stage_event_len(): number;
248
- zylem_stage_event_count(): number;
249
- zylem_stage_event_stride(): number;
250
- zylem_stage_query_ptr(): number;
251
- zylem_stage_query_len(): number;
252
- zylem_stage_scratch_ptr(): number;
253
- zylem_stage_scratch_capacity(): number;
254
- zylem_stage_attach_cooldown(slot: number): number;
255
- zylem_stage_cooldown_register(slot: number, id: number, duration: number, immediate: number): number;
256
- zylem_stage_cooldown_fire(slot: number, id: number): number;
257
- zylem_stage_cooldown_reset(slot: number, id: number): number;
258
- zylem_stage_cooldown_remaining(slot: number, id: number): number;
259
- zylem_stage_attach_world_boundary(slot: number, dim: number, top: number, bottom: number, left: number, right: number, front: number, back: number, padding: number): number;
260
- zylem_stage_query_world_boundary(slot: number): number;
261
- zylem_stage_attach_screen_wrap(slot: number, width: number, height: number, centerX: number, centerY: number, edgeThreshold: number): number;
262
- zylem_stage_query_screen_wrap(slot: number): number;
263
- zylem_stage_attach_ricochet(slot: number, dim: number, minSpeed: number, maxSpeed: number, speedMultiplier: number, maxAngleDeg: number, reflectionMode: number): number;
264
- zylem_stage_query_ricochet(slot: number): number;
265
- zylem_stage_attach_thruster(slot: number, maxSpeed: number, acceleration: number, turnRateRadS: number, linearDamping: number): number;
266
- zylem_stage_set_thruster_input(slot: number, thrust: number, turn: number): void;
267
- zylem_stage_query_thruster(slot: number): number;
268
- zylem_stage_attach_top_down(slot: number, plane: number, speed: number, faceMovement: number): number;
269
- zylem_stage_set_top_down_input(slot: number, a: number, b: number): void;
270
- zylem_stage_attach_jumper_2d(slot: number, jumpForce: number, maxJumps: number, jumpBufferTime: number, coyoteTime: number, gravity: number): number;
271
- zylem_stage_set_jumper_2d_input(slot: number, jumpPressed: number): void;
272
- zylem_stage_query_jumper_2d(slot: number): number;
273
- zylem_stage_attach_jumper_3d(slot: number, jumpForce: number, maxJumps: number, gravity: number): number;
274
- zylem_stage_set_jumper_3d_input(slot: number, jump: number): void;
275
- zylem_stage_query_jumper_3d(slot: number): number;
276
- zylem_stage_attach_shooter_2d(slot: number, fireRateHz: number, muzzleOffsetX: number, muzzleOffsetY: number, muzzleSpeed: number): number;
277
- zylem_stage_shooter_2d_fire(slot: number, x: number, y: number, z: number, yaw: number): number;
278
- zylem_stage_query_shooter_2d(slot: number): number;
279
- zylem_stage_attach_platformer_3d(slot: number, halfHeight: number, radius: number, walkSpeed: number, runSpeed: number, jumpForce: number, maxJumps: number, gravity: number): number;
280
- zylem_stage_set_platformer_3d_input_axes(slot: number, moveX: number, moveZ: number): void;
281
- zylem_stage_set_platformer_3d_input_buttons(slot: number, jump: number, run: number): void;
282
- zylem_stage_query_platformer_3d(slot: number): number;
283
- zylem_stage_attach_first_person(slot: number, walkSpeed: number, runSpeed: number, eyeHeight: number, lookSensitivity: number): number;
284
- zylem_stage_set_first_person_input(slot: number, moveX: number, moveZ: number, lookYaw: number, lookPitch: number, run: number): void;
285
- zylem_stage_query_first_person(slot: number): number;
286
- zylem_stage_invalid_slot(): number;
287
- }
288
- /** Default options for `createWasmStageRuntime`. */
289
- interface WasmStageRuntimeOptions {
290
- initialCapacity?: number;
291
- gravity?: readonly [number, number, number];
292
- imports?: WebAssembly.Imports;
293
- }
294
- /**
295
- * Owns the wasm instance plus the live float-views over its render / event /
296
- * pose / scratch buffers. The instance is per-`ZylemStage`; each stage gets
297
- * its own `WebAssembly.Instance` so the singleton inside `stage_ffi.rs`
298
- * stays single-stage scoped (today's `thread_local!` contract).
299
- */
300
- declare class WasmStageRuntime {
301
- readonly exports: StageWasmExports;
302
- private readonly memory;
303
- private renderView;
304
- private eventView;
305
- private poseView;
306
- private vec3View;
307
- private queryView;
308
- private scratchView;
309
- constructor(exports: StageWasmExports, options?: WasmStageRuntimeOptions);
310
- /** Recreate typed views over wasm memory. Call after step() or whenever memory may have grown. */
311
- refreshViews(): void;
312
- /** Step the simulation by `dt` seconds. Refreshes views afterwards. */
313
- step(dt: number): number;
314
- dispose(): void;
315
- get tickCount(): number;
316
- get activeCount(): number;
317
- setGravity(x: number, y: number, z: number): void;
318
- createEntity(): number;
319
- destroyEntity(slot: number): boolean;
320
- attachBody(slot: number, config: StageBodyConfig): boolean;
321
- addCollider(slot: number, config: StageColliderConfig): boolean;
322
- private stageScratch;
323
- private stageScratchIndices;
324
- getPose(slot: number, out?: StagePose): StagePose | null;
325
- setPosition(slot: number, x: number, y: number, z: number): boolean;
326
- setRotation(slot: number, x: number, y: number, z: number, w: number): boolean;
327
- setLinearVelocity(slot: number, x: number, y: number, z: number): boolean;
328
- getLinearVelocity(slot: number, out?: [number, number, number]): [number, number, number] | null;
329
- setAngularVelocity(slot: number, x: number, y: number, z: number): boolean;
330
- applyImpulse(slot: number, x: number, y: number, z: number): boolean;
331
- /** Read-only view over the render buffer; one slot occupies {@link STAGE_RENDER_STRIDE} floats. */
332
- get render(): Float32Array;
333
- get renderStride(): number;
334
- /** Drain the wasm event buffer into a fresh array of typed events. */
335
- drainEvents(): StageEvent[];
336
- get queryScratch(): Float32Array;
337
- attachCooldown(slot: number): boolean;
338
- registerCooldown(slot: number, id: number, durationSeconds: number, immediate?: boolean): boolean;
339
- fireCooldown(slot: number, id: number): boolean;
340
- resetCooldown(slot: number, id: number): boolean;
341
- cooldownRemaining(slot: number, id: number): number;
342
- attachWorldBoundary(slot: number, dim: StageBoundaryDim, bounds: {
343
- top: number;
344
- bottom: number;
345
- left: number;
346
- right: number;
347
- front: number;
348
- back: number;
349
- padding?: number;
350
- }): boolean;
351
- queryWorldBoundary(slot: number): {
352
- hits: number;
353
- clamped: [number, number, number];
354
- } | null;
355
- attachScreenWrap(slot: number, opts: {
356
- width: number;
357
- height: number;
358
- centerX?: number;
359
- centerY?: number;
360
- edgeThreshold?: number;
361
- }): boolean;
362
- queryScreenWrap(slot: number): {
363
- fsm: number;
364
- lastWrappedAxes: number;
365
- } | null;
366
- attachRicochet(slot: number, dim: StageRicochetDim, opts: {
367
- minSpeed: number;
368
- maxSpeed: number;
369
- speedMultiplier: number;
370
- maxAngleDeg: number;
371
- reflectionMode: StageRicochetReflection;
372
- }): boolean;
373
- queryRicochet(slot: number): {
374
- bounces: number;
375
- lastKind: number;
376
- } | null;
377
- attachThruster(slot: number, opts: {
378
- maxSpeed: number;
379
- acceleration: number;
380
- turnRateRadPerSec: number;
381
- linearDamping: number;
382
- }): boolean;
383
- setThrusterInput(slot: number, thrust: number, turn: number): void;
384
- queryThruster(slot: number): {
385
- headingRad: number;
386
- speed: number;
387
- } | null;
388
- attachTopDown(slot: number, opts: {
389
- plane: StageTopDownPlane;
390
- speed: number;
391
- faceMovement?: boolean;
392
- }): boolean;
393
- setTopDownInput(slot: number, axisA: number, axisB: number): void;
394
- attachJumper2D(slot: number, opts: {
395
- jumpForce: number;
396
- maxJumps: number;
397
- jumpBufferTime: number;
398
- coyoteTime: number;
399
- gravity: number;
400
- }): boolean;
401
- setJumper2DInput(slot: number, jumpPressed: boolean): void;
402
- queryJumper2D(slot: number): {
403
- grounded: boolean;
404
- jumpCount: number;
405
- coyote: number;
406
- jumpBuffer: number;
407
- } | null;
408
- attachJumper3D(slot: number, opts: {
409
- jumpForce: number;
410
- maxJumps: number;
411
- gravity: number;
412
- }): boolean;
413
- setJumper3DInput(slot: number, jump: boolean): void;
414
- queryJumper3D(slot: number): {
415
- grounded: boolean;
416
- jumpCount: number;
417
- verticalVelocity: number;
418
- } | null;
419
- attachShooter2D(slot: number, opts: {
420
- fireRateHz: number;
421
- muzzleOffsetX: number;
422
- muzzleOffsetY: number;
423
- muzzleSpeed: number;
424
- }): boolean;
425
- fireShooter2D(slot: number, x: number, y: number, z: number, yaw: number): boolean;
426
- queryShooter2D(slot: number): {
427
- cooldown: number;
428
- firedCount: number;
429
- } | null;
430
- attachPlatformer3D(slot: number, opts: {
431
- halfHeight: number;
432
- radius: number;
433
- walkSpeed: number;
434
- runSpeed: number;
435
- jumpForce: number;
436
- maxJumps: number;
437
- gravity: number;
438
- }): boolean;
439
- setPlatformer3DInputAxes(slot: number, moveX: number, moveZ: number): void;
440
- setPlatformer3DInputButtons(slot: number, jump: boolean, run: boolean): void;
441
- queryPlatformer3D(slot: number): {
442
- grounded: boolean;
443
- jumpCount: number;
444
- fsmState: number;
445
- speed: number;
446
- } | null;
447
- attachFirstPerson(slot: number, opts: {
448
- walkSpeed: number;
449
- runSpeed: number;
450
- eyeHeight: number;
451
- lookSensitivity: number;
452
- }): boolean;
453
- setFirstPersonInput(slot: number, opts: {
454
- moveX: number;
455
- moveZ: number;
456
- lookYawDelta: number;
457
- lookPitchDelta: number;
458
- run: boolean;
459
- }): void;
460
- queryFirstPerson(slot: number): {
461
- yaw: number;
462
- pitch: number;
463
- speed: number;
464
- eyeHeight: number;
465
- } | null;
466
- }
467
- /** Loads + instantiates a wasm module and constructs a `WasmStageRuntime`. */
468
- declare function createWasmStageRuntime(source: RequestInfo | URL | ArrayBuffer, options?: WasmStageRuntimeOptions): Promise<WasmStageRuntime>;
469
-
470
- /**
471
- * Options for configuring entity collision behavior.
472
- */
473
- interface CollisionOptions {
474
- static?: boolean;
475
- sensor?: boolean;
476
- size?: Vec3Input;
477
- position?: Vec3Input;
478
- collisionType?: string;
479
- collisionFilter?: string[];
480
- }
481
- declare class CollisionBuilder {
482
- static: boolean;
483
- sensor: boolean;
484
- gravity: Vec3;
485
- build(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc];
486
- withCollision(collisionOptions: Partial<CollisionOptions>): this;
487
- collider(options: CollisionOptions): ColliderDesc;
488
- bodyDesc({ isDynamicBody }: {
489
- isDynamicBody?: boolean | undefined;
490
- }): RigidBodyDesc;
491
- }
492
-
493
102
  /**
494
103
  * TODO: allow for multiple materials requires geometry groups
495
104
  * TODO: allow for instanced uniforms
496
105
  * TODO: allow for geometry groups
497
- * TODO: allow for batched meshes
498
- * import { InstancedUniformsMesh } from 'three-instanced-uniforms-mesh';
499
- * may not need geometry groups for shaders though
500
- * setGeometry<T extends BufferGeometry>(geometry: T) {
501
- * MeshBuilder.bachedMesh = new BatchedMesh(10, 5000, 10000, material);
502
- * }
503
106
  */
504
- type MeshBuilderOptions = Partial<Pick<GameEntityOptions, 'batched' | 'material'>>;
107
+ type MeshBuilderOptions = Partial<Pick<GameEntityOptions, 'material'>>;
505
108
  declare class MeshBuilder {
506
- _build(meshOptions: MeshBuilderOptions, geometry: BufferGeometry, materials: Material[]): Mesh;
109
+ _build(_meshOptions: MeshBuilderOptions, geometry: BufferGeometry, materials: Material[]): Mesh;
507
110
  _postBuild(): void;
508
111
  }
509
112
 
510
113
  declare abstract class EntityCollisionBuilder extends CollisionBuilder {
511
- abstract collider(options: GameEntityOptions): ColliderDesc;
114
+ abstract collider(options: GameEntityOptions): SimulationColliderDefinition;
512
115
  }
513
116
  declare abstract class EntityMeshBuilder extends MeshBuilder {
514
117
  build(options: GameEntityOptions): BufferGeometry;
@@ -528,8 +131,17 @@ declare abstract class EntityBuilder<T extends GameEntity<U> & P, U extends Game
528
131
  protected abstract createEntity(options: Partial<U>): T;
529
132
  }
530
133
 
134
+ /** Structural slice of the physics body used by rotation helpers. */
135
+ interface RotatableBodyLike {
136
+ rotation(): {
137
+ x: number;
138
+ y: number;
139
+ z: number;
140
+ w: number;
141
+ };
142
+ }
531
143
  interface RotatableEntity {
532
- body: RigidBody | null;
144
+ body: RotatableBodyLike | null;
533
145
  group: any;
534
146
  transformStore?: TransformState;
535
147
  }
@@ -615,14 +227,14 @@ interface RotatableEntityAPI extends RotatableEntity {
615
227
  }
616
228
 
617
229
  /**
618
- * A built collision component containing a rigid body description and collider description.
619
- * Returned by collision factory functions (boxCollision, sphereCollision, etc.)
620
- * and consumed by GameEntity.add().
230
+ * A built collision component containing plain body and collider definitions
231
+ * for the behaviors `Simulation`. Returned by collision factory functions
232
+ * (boxCollision, sphereCollision, etc.) and consumed by GameEntity.add().
621
233
  */
622
234
  interface CollisionComponent {
623
235
  __kind: 'collision';
624
- bodyDesc: RigidBodyDesc;
625
- colliderDesc: ColliderDesc;
236
+ bodyDesc: SimulationBodyDefinition;
237
+ colliderDesc: SimulationColliderDefinition;
626
238
  cloneComponent: () => CollisionComponent;
627
239
  }
628
240
  interface BaseCollisionOptions {
@@ -630,6 +242,10 @@ interface BaseCollisionOptions {
630
242
  static?: boolean;
631
243
  /** Whether this collider is a sensor */
632
244
  sensor?: boolean;
245
+ /** Allow the body to sleep when at rest (recommended for bulk dynamic scenes) */
246
+ canSleep?: boolean;
247
+ /** Continuous collision detection (expensive at scale; disable for small boxes) */
248
+ ccdEnabled?: boolean;
633
249
  /** Position offset relative to the entity origin */
634
250
  offset?: Vec3Input;
635
251
  /** Collision type string for group filtering */
@@ -771,13 +387,13 @@ type IBuilder<BuilderOptions = any> = {
771
387
  postBuild: (options: BuilderOptions) => BuilderOptions;
772
388
  };
773
389
  type GameEntitySimulationMode = 'ts' | 'runtime';
774
- type GameEntityRenderMode = 'mesh' | 'instanced';
390
+ /** Scene-direct, WebGPU bundle (static), or instanced pack. Default `none`. */
391
+ type RenderCategory = 'none' | 'environment' | 'pack';
775
392
  type RuntimeEntityBodyMode = 'dynamic' | 'static' | 'none';
776
393
  type RuntimeEntityColorMode = 'base' | 'heatTint';
777
394
  interface RuntimeEntityOptions {
778
395
  simulation?: GameEntitySimulationMode;
779
- render?: GameEntityRenderMode;
780
- batchKeyOverride?: string;
396
+ packKeyOverride?: string;
781
397
  body?: RuntimeEntityBodyMode;
782
398
  colorMode?: RuntimeEntityColorMode;
783
399
  }
@@ -786,7 +402,8 @@ type GameEntityOptions = {
786
402
  color?: Color;
787
403
  size?: Vec3Input;
788
404
  position?: Vec3Input;
789
- batched?: boolean;
405
+ /** Render path: `environment` (bundle), `pack` (instanced), or `none` (default). */
406
+ category?: RenderCategory;
790
407
  runtime?: RuntimeEntityOptions;
791
408
  collision?: Partial<CollisionOptions>;
792
409
  material?: Partial<MaterialOptions>;
@@ -814,46 +431,51 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
814
431
  group: Group | undefined;
815
432
  mesh: Mesh | undefined;
816
433
  materials: Material[] | undefined;
817
- bodyDesc: RigidBodyDesc | null;
818
- body: RigidBody | null;
434
+ bodyDesc: SimulationBodyDefinition | null;
435
+ body: SimulationBody | null;
819
436
  physicsAttached: boolean;
820
- colliderDesc: ColliderDesc | undefined;
821
- collider: Collider | undefined;
437
+ /**
438
+ * The physics world that currently owns this entity's body/colliders.
439
+ * Tagged on registration and checked on teardown so a stale world never
440
+ * frees handles another world now owns (which would poison the wasm
441
+ * simulation). Untyped to avoid a circular import.
442
+ */
443
+ physicsWorldRef: unknown;
444
+ colliderDesc: SimulationColliderDefinition | undefined;
822
445
  custom: Record<string, any>;
823
446
  /** All collider descriptions for this entity (including primary) */
824
- colliderDescs: ColliderDesc[];
825
- /** All colliders attached to this entity's rigid body */
826
- colliders: Collider[];
447
+ colliderDescs: SimulationColliderDefinition[];
827
448
  /** Additional meshes for compound visual entities (added via add()) */
828
449
  compoundMeshes: Mesh[];
829
450
  debugInfo: Record<string, any>;
830
451
  debugMaterial: ShaderMaterial | undefined;
831
452
  collisionDelegate: CollisionDelegate<this, O>;
832
453
  collisionType?: string;
833
- /** Batch key for instanced rendering (null if not instanced) */
834
- batchKey: string | null;
835
- /** Index within the instanced mesh batch */
454
+ /** Pack key for instanced rendering (null if not instanced) */
455
+ packKey: string | null;
456
+ /** Bundle key for WebGPU bundle rendering (null if not bundled) */
457
+ bundleKey: string | null;
458
+ /** Index within the instanced mesh pack */
836
459
  instanceId: number;
837
460
  /** Whether this entity uses instanced rendering */
838
461
  isInstanced: boolean;
839
- /** Runtime slot index when owned by a stage runtime adapter (legacy alias for runtimeHandle). */
840
- runtimeSlot: number;
462
+ /** Whether this entity is drawn via a WebGPU render bundle */
463
+ isBundled: boolean;
841
464
  /**
842
- * Stable u32 handle into the wasm `StageSimulation`. Returned by
843
- * `WasmStageRuntime.createEntity()`; -1 means the entity is not currently
844
- * attached to the runtime. Replaces `runtimeSlot` and the legacy
845
- * `entity.body` / `entity.collider` fields once Phase 3 lands.
465
+ * Raw wasm slot index for this entity in the stage's `Simulation`; -1 when
466
+ * not attached. Behavior systems address the runtime's slot-indexed buffers by
467
+ * this slot.
846
468
  */
847
469
  runtimeHandle: number;
848
- /** True once the entity has been attached to the wasm `StageSimulation`. */
470
+ /** True once the entity has been spawned into the wasm simulation. */
849
471
  runtimeAttached: boolean;
850
472
  /**
851
- * Optional reference to the stage's {@link WasmStageRuntime}. Set by
852
- * `StageEntityDelegate.spawnEntity()` so {@link GameEntity.getPose} /
853
- * {@link GameEntity.setPose} can route through the unified-Stage runtime
854
- * without each call site needing to thread the wasm handle around.
473
+ * The stage simulation's low-level runtime adapter. Set by
474
+ * `ZylemWorld.addEntity()` so {@link GameEntity.getPose} /
475
+ * {@link GameEntity.setPose} and behavior descriptors can route through
476
+ * the runtime without threading the handle around.
855
477
  */
856
- wasmStageRef: WasmStageRuntime | null;
478
+ wasmStageRef: BehaviorRuntime | null;
857
479
  protected eventDelegate: EventEmitterDelegate<EntityEvents>;
858
480
  private behaviorRefs;
859
481
  private cloneFactory;
@@ -893,10 +515,8 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
893
515
  getRotation: () => any;
894
516
  constructor();
895
517
  /**
896
- * Read the entity's pose. Prefers the unified-Stage wasm runtime when
897
- * the entity has a live `runtimeHandle`; otherwise falls back to the
898
- * legacy TS Rapier `RigidBody` translation/rotation. Returns `null` when
899
- * neither source is available.
518
+ * Read the entity's pose from the wasm simulation. Returns `null` when
519
+ * the entity has not been spawned into the runtime yet.
900
520
  */
901
521
  getPose(): {
902
522
  position: Vec3;
@@ -908,8 +528,7 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
908
528
  };
909
529
  } | null;
910
530
  /**
911
- * Write the entity's pose. Routes through the unified-Stage wasm runtime
912
- * when present; otherwise writes to the legacy TS Rapier `RigidBody`.
531
+ * Write the entity's pose into the wasm simulation.
913
532
  *
914
533
  * Either or both of `position` and `rotation` may be omitted to leave
915
534
  * that component unchanged.
@@ -1040,4 +659,4 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
1040
659
  */
1041
660
  declare function create(options?: Partial<GameEntityOptions>): GameEntity<GameEntityOptions>;
1042
661
 
1043
- export { type Action as A, setRotationDegrees as B, setRotationDegreesY as C, setRotationDegreesX as D, setRotationDegreesZ as E, setRotation as F, GameEntity as G, getRotation as H, type GameEntityOptions as I, EntityBuilder as J, EntityMeshBuilder as K, EntityCollisionBuilder as L, BaseNode as M, create as N, boxCollision as O, sphereCollision as P, coneCollision as Q, pyramidCollision as R, StageBodyKind as S, cylinderCollision as T, pillCollision as U, planeCollision as V, type WasmStageRuntimeOptions as W, zoneCollision as X, type CollisionComponent as Y, type NodeInterface as Z, GameEntityLifeCycle as _, type StageBodyConfig as a, type StageColliderConfig as b, type StageColliderShape as c, type StageEvent as d, type StagePose as e, type StageWasmExports as f, StageBoundaryDim as g, StageEventType as h, StageRicochetDim as i, StageRicochetReflection as j, StageTopDownPlane as k, STAGE_EVENT_STRIDE as l, STAGE_INVALID_SLOT as m, STAGE_POSE_LEN as n, STAGE_RENDER_STRIDE as o, WasmStageRuntime as p, createWasmStageRuntime as q, rotateInDirection as r, rotateYEuler as s, rotateEuler as t, rotateX as u, rotateY as v, rotateZ as w, setRotationY as x, setRotationX as y, setRotationZ as z };
662
+ export { type Action as A, BaseNode as B, type CollisionComponent as C, EntityMeshBuilder as D, EntityBuilder as E, EntityCollisionBuilder as F, GameEntity as G, type NodeInterface as N, type GameEntityOptions as a, boxCollision as b, create as c, coneCollision as d, cylinderCollision as e, pillCollision as f, planeCollision as g, rotateYEuler as h, rotateEuler as i, rotateX as j, rotateY as k, rotateZ as l, setRotationY as m, setRotationX as n, setRotationZ as o, pyramidCollision as p, setRotationDegrees as q, rotateInDirection as r, sphereCollision as s, setRotationDegreesY as t, setRotationDegreesX as u, setRotationDegreesZ as v, setRotation as w, getRotation as x, GameEntityLifeCycle as y, zoneCollision as z };
@@ -0,0 +1,28 @@
1
+ import { Group, Mesh } from 'three';
2
+ import { l as SimulationBody } from './vector-CiSHbivc.js';
3
+
4
+ type LifecycleFunction<T> = (params?: any) => void;
5
+ interface Entity<T = any> {
6
+ setup: (entity: T) => void;
7
+ destroy: () => void;
8
+ update: LifecycleFunction<T>;
9
+ type: string;
10
+ _collision?: (entity: any, other: any, globals?: any) => void;
11
+ _destroy?: (globals?: any) => void;
12
+ name?: string;
13
+ tag?: Set<string>;
14
+ }
15
+ interface StageEntity extends Entity {
16
+ uuid: string;
17
+ body: SimulationBody;
18
+ group: Group;
19
+ mesh: Mesh;
20
+ instanceId: number;
21
+ isInstanced?: boolean;
22
+ isBundled?: boolean;
23
+ controlledRotation: boolean;
24
+ name: string;
25
+ markedForRemoval: boolean;
26
+ }
27
+
28
+ export type { Entity as E, LifecycleFunction as L, StageEntity as S };