@zylem/game-lib 0.7.0 → 0.8.2

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 (98) 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 +55350 -0
  5. package/dist/api/game-lib.api.md +4608 -0
  6. package/dist/api/game-lib.d.ts +8447 -0
  7. package/dist/api/game-lib.typedoc.json +352456 -0
  8. package/dist/audio.js +1 -1
  9. package/dist/{base-node-life-cycle-CnJ-7zX-.d.ts → base-node-life-cycle-BK9xebT9.d.ts} +18 -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-3PRBSSTS.js +24 -0
  14. package/dist/chunk-47DG7I7M.js +1 -0
  15. package/dist/chunk-7GYFZKK7.js +1 -0
  16. package/dist/chunk-7QF6YTEZ.js +1 -0
  17. package/dist/chunk-7WRQ2UAN.js +1 -0
  18. package/dist/chunk-BH53MBAZ.js +1 -0
  19. package/dist/chunk-BIGH6D34.js +0 -0
  20. package/dist/chunk-CD7ZOZ35.js +1 -0
  21. package/dist/chunk-CFVRRRZZ.js +1 -0
  22. package/dist/chunk-CM5YRNBJ.js +19 -0
  23. package/dist/chunk-COM6HJ2L.js +1 -0
  24. package/dist/chunk-D2PATZCC.js +1 -0
  25. package/dist/chunk-DFLI7ICU.js +0 -0
  26. package/dist/chunk-EVYHPR3J.js +1 -0
  27. package/dist/chunk-IPWUDOV5.js +1 -0
  28. package/dist/chunk-JNFFTNMH.js +1 -0
  29. package/dist/chunk-JQKS42G4.js +1 -0
  30. package/dist/chunk-KVSJE4XD.js +1 -0
  31. package/dist/chunk-MZZCDXFB.js +1 -0
  32. package/dist/chunk-ORIDWL3T.js +0 -0
  33. package/dist/{chunk-RXDTAWI2.js → chunk-PCFF4LLO.js} +1 -1
  34. package/dist/chunk-QB3NL7VQ.js +1 -0
  35. package/dist/chunk-TAUWDQZF.js +9 -0
  36. package/dist/chunk-UG22Z42P.js +1 -0
  37. package/dist/chunk-VS2D4B3W.js +1 -0
  38. package/dist/chunk-WQ3WMMZD.js +1 -0
  39. package/dist/chunk-XK63E4SX.js +1 -0
  40. package/dist/chunk-YAOXFYOD.js +1 -0
  41. package/dist/chunk-ZRT3ZQVH.js +1 -0
  42. package/dist/collision-builder-B_tm8OVy.d.ts +49 -0
  43. package/dist/core.d.ts +45 -30
  44. package/dist/core.js +1 -24
  45. package/dist/debug-state-DRoeasG2.d.ts +17 -0
  46. package/dist/debug.d.ts +71 -19
  47. package/dist/debug.js +1 -1
  48. package/dist/{default-controls-BGc61yYl.d.ts → default-controls-CAKJ5zlo.d.ts} +3 -3
  49. package/dist/entity-B9yZeBm4.d.ts +34 -0
  50. package/dist/{entity-DNkYKfdp.d.ts → entity-BGEq1yfC.d.ts} +91 -444
  51. package/dist/{entity-type-map-C94h2TDW.d.ts → entity-type-map-CW6RHQkx.d.ts} +153 -6
  52. package/dist/entity.d.ts +15 -10
  53. package/dist/entity.js +1 -1
  54. package/dist/events.d.ts +10 -1
  55. package/dist/events.js +1 -1
  56. package/dist/{game-Cuj5gy7U.d.ts → game-DbqBQiFC.d.ts} +460 -135
  57. package/dist/game-default-6AZZCNST.js +1 -0
  58. package/dist/{game-interfaces-tfpM5NBk.d.ts → game-interfaces-vF5sRi1n.d.ts} +8 -2
  59. package/dist/globals.d.ts +12 -1
  60. package/dist/globals.js +1 -1
  61. package/dist/graphics.d.ts +16 -46
  62. package/dist/graphics.js +1 -1
  63. package/dist/input-ui.d.ts +5 -4
  64. package/dist/input-ui.js +1 -1
  65. package/dist/input.d.ts +48 -4
  66. package/dist/input.js +1 -1
  67. package/dist/{material-Wz83vTTp.d.ts → material-DbSuZBbP.d.ts} +25 -50
  68. package/dist/public.d.ts +38 -0
  69. package/dist/public.js +1 -0
  70. package/dist/runtime.d.ts +7 -381
  71. package/dist/runtime.js +1 -1
  72. package/dist/schema/entity.schema.json +244 -0
  73. package/dist/schema/game-config.schema.json +643 -0
  74. package/dist/schema/input-config.schema.json +517 -0
  75. package/dist/schema/stage-config.schema.json +93 -0
  76. package/dist/schema/stage.schema.json +271 -0
  77. package/dist/schema.d.ts +550 -0
  78. package/dist/schema.js +1 -0
  79. package/dist/stage-transition-CmGpV4tc.d.ts +46 -0
  80. package/dist/vector-DN6zlPoE.d.ts +161 -0
  81. package/dist/web-components.d.ts +15 -12
  82. package/dist/web-components.js +1 -9
  83. package/dist/{zylem-stage-runtime-Cs-UDEVU.d.ts → zylem-camera-Du2UPW9O.d.ts} +74 -264
  84. package/package.json +28 -20
  85. package/dist/chunk-73VZQZUL.js +0 -1
  86. package/dist/chunk-A34ZG3L4.js +0 -1
  87. package/dist/chunk-CDPY4VOQ.js +0 -1
  88. package/dist/chunk-DR6XXZE7.js +0 -19
  89. package/dist/chunk-FM5TBEPO.js +0 -1
  90. package/dist/chunk-G2IIMSUH.js +0 -1
  91. package/dist/chunk-MSC2BEO5.js +0 -1
  92. package/dist/chunk-NIH5CONO.js +0 -1
  93. package/dist/chunk-ONWXGBWB.js +0 -1
  94. package/dist/chunk-QEDQDR27.js +0 -1
  95. package/dist/chunk-WKHW2QO2.js +0 -1
  96. package/dist/chunk-YHKXQ2ZN.js +0 -1
  97. package/dist/game-default-PZLLHYL7.js +0 -1
  98. 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-DN6zlPoE.js';
4
+ import { M as MaterialBuilder, e as MaterialOptions } from './material-DbSuZBbP.js';
5
+ import { C as CollisionBuilder, L as LockAxesInput, a as CollisionOptions } from './collision-builder-B_tm8OVy.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-BK9xebT9.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,12 +242,22 @@ 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 */
636
252
  collisionType?: string;
637
253
  /** Allowed collision types for filtering */
638
254
  collisionFilter?: string[];
255
+ /** Gravity scale applied at body spawn (no live setter FFI; default 1). */
256
+ gravityScale?: number;
257
+ /** Lock rotation axes at body spawn: `true` for all, or per-axis tuple. */
258
+ lockRotations?: LockAxesInput;
259
+ /** Lock translation axes at body spawn: `true` for all, or per-axis tuple. */
260
+ lockTranslations?: LockAxesInput;
639
261
  }
640
262
  interface BoxCollisionOptions extends BaseCollisionOptions {
641
263
  /** Box dimensions (default: 1x1x1) */
@@ -771,13 +393,13 @@ type IBuilder<BuilderOptions = any> = {
771
393
  postBuild: (options: BuilderOptions) => BuilderOptions;
772
394
  };
773
395
  type GameEntitySimulationMode = 'ts' | 'runtime';
774
- type GameEntityRenderMode = 'mesh' | 'instanced';
396
+ /** Scene-direct, WebGPU bundle (static), or instanced pack. Default `none`. */
397
+ type RenderCategory = 'none' | 'environment' | 'pack';
775
398
  type RuntimeEntityBodyMode = 'dynamic' | 'static' | 'none';
776
399
  type RuntimeEntityColorMode = 'base' | 'heatTint';
777
400
  interface RuntimeEntityOptions {
778
401
  simulation?: GameEntitySimulationMode;
779
- render?: GameEntityRenderMode;
780
- batchKeyOverride?: string;
402
+ packKeyOverride?: string;
781
403
  body?: RuntimeEntityBodyMode;
782
404
  colorMode?: RuntimeEntityColorMode;
783
405
  }
@@ -786,7 +408,19 @@ type GameEntityOptions = {
786
408
  color?: Color;
787
409
  size?: Vec3Input;
788
410
  position?: Vec3Input;
789
- batched?: boolean;
411
+ /**
412
+ * Spawn visibility behavior:
413
+ * - `undefined` (default): hidden while `spawnEntity` runs, revealed once
414
+ * the spawn finalizes — even if no position was assigned.
415
+ * - `true` (strict): stays hidden until the first `setPosition`/`setPose`,
416
+ * for spawner patterns that place the entity frames after spawn.
417
+ * - `false`: never hidden during spawn.
418
+ */
419
+ hideUntilPositioned?: boolean;
420
+ /** Explicit render visibility. When false, entity stays hidden until {@link GameEntity.reveal}. */
421
+ visible?: boolean;
422
+ /** Render path: `environment` (bundle), `pack` (instanced), or `none` (default). */
423
+ category?: RenderCategory;
790
424
  runtime?: RuntimeEntityOptions;
791
425
  collision?: Partial<CollisionOptions>;
792
426
  material?: Partial<MaterialOptions>;
@@ -814,52 +448,65 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
814
448
  group: Group | undefined;
815
449
  mesh: Mesh | undefined;
816
450
  materials: Material[] | undefined;
817
- bodyDesc: RigidBodyDesc | null;
818
- body: RigidBody | null;
451
+ bodyDesc: SimulationBodyDefinition | null;
452
+ body: SimulationBody | null;
819
453
  physicsAttached: boolean;
820
- colliderDesc: ColliderDesc | undefined;
821
- collider: Collider | undefined;
454
+ /**
455
+ * The physics world that currently owns this entity's body/colliders.
456
+ * Tagged on registration and checked on teardown so a stale world never
457
+ * frees handles another world now owns (which would poison the wasm
458
+ * simulation). Untyped to avoid a circular import.
459
+ */
460
+ physicsWorldRef: unknown;
461
+ colliderDesc: SimulationColliderDefinition | undefined;
822
462
  custom: Record<string, any>;
823
463
  /** All collider descriptions for this entity (including primary) */
824
- colliderDescs: ColliderDesc[];
825
- /** All colliders attached to this entity's rigid body */
826
- colliders: Collider[];
464
+ colliderDescs: SimulationColliderDefinition[];
827
465
  /** Additional meshes for compound visual entities (added via add()) */
828
466
  compoundMeshes: Mesh[];
829
467
  debugInfo: Record<string, any>;
830
468
  debugMaterial: ShaderMaterial | undefined;
831
469
  collisionDelegate: CollisionDelegate<this, O>;
832
470
  collisionType?: string;
833
- /** Batch key for instanced rendering (null if not instanced) */
834
- batchKey: string | null;
835
- /** Index within the instanced mesh batch */
471
+ /** Pack key for instanced rendering (null if not instanced) */
472
+ packKey: string | null;
473
+ /** Bundle key for WebGPU bundle rendering (null if not bundled) */
474
+ bundleKey: string | null;
475
+ /** Index within the instanced mesh pack */
836
476
  instanceId: number;
837
477
  /** Whether this entity uses instanced rendering */
838
478
  isInstanced: boolean;
839
- /** Runtime slot index when owned by a stage runtime adapter (legacy alias for runtimeHandle). */
840
- runtimeSlot: number;
479
+ /** Whether this entity is drawn via a WebGPU render bundle */
480
+ isBundled: boolean;
841
481
  /**
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.
482
+ * Raw wasm slot index for this entity in the stage's `Simulation`; -1 when
483
+ * not attached. Behavior systems address the runtime's slot-indexed buffers by
484
+ * this slot.
846
485
  */
847
486
  runtimeHandle: number;
848
- /** True once the entity has been attached to the wasm `StageSimulation`. */
487
+ /** True once the entity has been spawned into the wasm simulation. */
849
488
  runtimeAttached: boolean;
850
489
  /**
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.
490
+ * The stage simulation's low-level runtime adapter. Set by
491
+ * `ZylemWorld.addEntity()` so {@link GameEntity.getPose} /
492
+ * {@link GameEntity.setPose} and behavior descriptors can route through
493
+ * the runtime without threading the handle around.
855
494
  */
856
- wasmStageRef: WasmStageRuntime | null;
495
+ wasmStageRef: BehaviorRuntime | null;
857
496
  protected eventDelegate: EventEmitterDelegate<EntityEvents>;
858
497
  private behaviorRefs;
859
498
  private cloneFactory;
860
499
  private trackAddedComponents;
861
500
  private trackedComponents;
862
501
  transformStore: TransformState;
502
+ /** Hide render target until spawn placement is confirmed. */
503
+ _spawnPlacementPending: boolean;
504
+ /** Author passed `position` in create options. */
505
+ _spawnPositionExplicit: boolean;
506
+ /** setPosition / setPose assigned a spawn placement during this spawn. */
507
+ _spawnPlacementReady: boolean;
508
+ /** True while {@link StageEntityDelegate.spawnEntity} is running for this entity. */
509
+ _spawnInProgress: boolean;
863
510
  moveX: (delta: number) => void;
864
511
  moveY: (delta: number) => void;
865
512
  moveZ: (delta: number) => void;
@@ -892,11 +539,12 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
892
539
  setRotation: (x: number, y: number, z: number) => void;
893
540
  getRotation: () => any;
894
541
  constructor();
542
+ private wrapSpawnPlacementMutators;
543
+ /** Make the entity visible, clearing spawn placement pending state. */
544
+ reveal(): void;
895
545
  /**
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.
546
+ * Read the entity's pose from the wasm simulation. Returns `null` when
547
+ * the entity has not been spawned into the runtime yet.
900
548
  */
901
549
  getPose(): {
902
550
  position: Vec3;
@@ -908,8 +556,7 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
908
556
  };
909
557
  } | null;
910
558
  /**
911
- * Write the entity's pose. Routes through the unified-Stage wasm runtime
912
- * when present; otherwise writes to the legacy TS Rapier `RigidBody`.
559
+ * Write the entity's pose into the wasm simulation.
913
560
  *
914
561
  * Either or both of `position` and `rotation` may be omitted to leave
915
562
  * that component unchanged.
@@ -1040,4 +687,4 @@ declare class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implem
1040
687
  */
1041
688
  declare function create(options?: Partial<GameEntityOptions>): GameEntity<GameEntityOptions>;
1042
689
 
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 };
690
+ 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 };