goudengine 0.0.828 → 0.0.830

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 (68) hide show
  1. package/README.md +116 -0
  2. package/dist/generated/diagnostic.g.d.ts +15 -0
  3. package/dist/generated/diagnostic.g.d.ts.map +1 -0
  4. package/dist/generated/diagnostic.g.js +50 -0
  5. package/dist/generated/diagnostic.g.js.map +1 -0
  6. package/dist/generated/index.g.d.ts +4 -2
  7. package/dist/generated/index.g.d.ts.map +1 -1
  8. package/dist/generated/index.g.js +8 -1
  9. package/dist/generated/index.g.js.map +1 -1
  10. package/dist/generated/node/index.g.d.ts +443 -3
  11. package/dist/generated/node/index.g.d.ts.map +1 -1
  12. package/dist/generated/node/index.g.js +985 -17
  13. package/dist/generated/node/index.g.js.map +1 -1
  14. package/dist/generated/types/engine.g.d.ts +541 -0
  15. package/dist/generated/types/engine.g.d.ts.map +1 -1
  16. package/dist/generated/types/input.g.d.ts +43 -1
  17. package/dist/generated/types/input.g.d.ts.map +1 -1
  18. package/dist/generated/types/input.g.js +50 -1
  19. package/dist/generated/types/input.g.js.map +1 -1
  20. package/dist/index.d.ts +6 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +28 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/node/index.d.ts +6 -0
  25. package/dist/node/index.d.ts.map +1 -0
  26. package/dist/node/index.js +28 -0
  27. package/dist/node/index.js.map +1 -0
  28. package/dist/shared/debugger.d.ts +9 -0
  29. package/dist/shared/debugger.d.ts.map +1 -0
  30. package/dist/shared/debugger.js +11 -0
  31. package/dist/shared/debugger.js.map +1 -0
  32. package/dist/shared/network.d.ts +39 -0
  33. package/dist/shared/network.d.ts.map +1 -0
  34. package/dist/shared/network.js +66 -0
  35. package/dist/shared/network.js.map +1 -0
  36. package/dist/web/generated/types/engine.g.d.ts +541 -0
  37. package/dist/web/generated/types/engine.g.d.ts.map +1 -1
  38. package/dist/web/generated/types/input.g.d.ts +43 -1
  39. package/dist/web/generated/types/input.g.d.ts.map +1 -1
  40. package/dist/web/generated/types/input.g.js +49 -0
  41. package/dist/web/generated/types/input.g.js.map +1 -1
  42. package/dist/web/generated/web/index.g.d.ts +175 -3
  43. package/dist/web/generated/web/index.g.d.ts.map +1 -1
  44. package/dist/web/generated/web/index.g.js +497 -6
  45. package/dist/web/generated/web/index.g.js.map +1 -1
  46. package/dist/web/shared/debugger.d.ts +9 -0
  47. package/dist/web/shared/debugger.d.ts.map +1 -0
  48. package/dist/web/shared/debugger.js +7 -0
  49. package/dist/web/shared/debugger.js.map +1 -0
  50. package/dist/web/shared/network.d.ts +39 -0
  51. package/dist/web/shared/network.d.ts.map +1 -0
  52. package/dist/web/shared/network.js +61 -0
  53. package/dist/web/shared/network.js.map +1 -0
  54. package/dist/web/web/index.d.ts +6 -0
  55. package/dist/web/web/index.d.ts.map +1 -0
  56. package/dist/web/web/index.js +6 -0
  57. package/dist/web/web/index.js.map +1 -0
  58. package/goud-engine-node.darwin-arm64.node +0 -0
  59. package/goud-engine-node.darwin-x64.node +0 -0
  60. package/goud-engine-node.linux-x64-gnu.node +0 -0
  61. package/goud-engine-node.win32-x64-msvc.node +0 -0
  62. package/index.d.ts +381 -0
  63. package/index.js +56 -52
  64. package/package.json +25 -19
  65. package/wasm/goud_engine.d.ts +720 -74
  66. package/wasm/goud_engine.js +1401 -20
  67. package/wasm/goud_engine_bg.wasm +0 -0
  68. package/wasm/goud_engine_bg.wasm.d.ts +184 -74
@@ -1,3 +1,4 @@
1
+ import type { PhysicsBackend2D } from './input.g.js';
1
2
  /** 2D floating-point vector */
2
3
  export interface IVec2 {
3
4
  x: number;
@@ -38,6 +39,22 @@ export interface IContact {
38
39
  normalY: number;
39
40
  penetration: number;
40
41
  }
42
+ /** Detailed payload for a 2D physics raycast hit */
43
+ export interface IPhysicsRaycastHit2D {
44
+ bodyHandle: number;
45
+ colliderHandle: number;
46
+ pointX: number;
47
+ pointY: number;
48
+ normalX: number;
49
+ normalY: number;
50
+ distance: number;
51
+ }
52
+ /** 2D collision event payload from the physics event queue */
53
+ export interface IPhysicsCollisionEvent2D {
54
+ bodyA: number;
55
+ bodyB: number;
56
+ kind: number;
57
+ }
41
58
  /** Frame timing statistics from the debug overlay rolling window */
42
59
  export interface IFpsStats {
43
60
  currentFps: number;
@@ -46,6 +63,107 @@ export interface IFpsStats {
46
63
  avgFps: number;
47
64
  frameTimeMs: number;
48
65
  }
66
+ /** Pre-init debugger runtime configuration for desktop contexts. */
67
+ export interface IDebuggerConfig {
68
+ enabled: boolean;
69
+ publishLocalAttach: boolean;
70
+ routeLabel: string;
71
+ }
72
+ /** Pre-init configuration for headless context creation. */
73
+ export interface IContextConfig {
74
+ debugger: IDebuggerConfig;
75
+ }
76
+ /** Tracked current and peak bytes for one debugger memory category. */
77
+ export interface IMemoryCategoryStats {
78
+ currentBytes: number;
79
+ peakBytes: number;
80
+ }
81
+ /** Debugger-owned aggregate memory summary for one route. */
82
+ export interface IMemorySummary {
83
+ rendering: IMemoryCategoryStats;
84
+ assets: IMemoryCategoryStats;
85
+ ecs: IMemoryCategoryStats;
86
+ ui: IMemoryCategoryStats;
87
+ audio: IMemoryCategoryStats;
88
+ network: IMemoryCategoryStats;
89
+ debugger: IMemoryCategoryStats;
90
+ other: IMemoryCategoryStats;
91
+ totalCurrentBytes: number;
92
+ totalPeakBytes: number;
93
+ }
94
+ /** Debugger frame capture artifact envelope returned directly by SDK calls. */
95
+ export interface IDebuggerCapture {
96
+ imagePng: Uint8Array;
97
+ metadataJson: string;
98
+ snapshotJson: string;
99
+ metricsTraceJson: string;
100
+ }
101
+ /** Debugger replay recording artifact envelope returned directly by SDK calls. */
102
+ export interface IDebuggerReplayArtifact {
103
+ manifestJson: string;
104
+ data: Uint8Array;
105
+ }
106
+ /** Aggregate network statistics for a network handle */
107
+ export interface INetworkStats {
108
+ bytesSent: number;
109
+ bytesReceived: number;
110
+ packetsSent: number;
111
+ packetsReceived: number;
112
+ packetsLost: number;
113
+ rttMs: number;
114
+ sendBandwidthBytesPerSec: number;
115
+ receiveBandwidthBytesPerSec: number;
116
+ packetLossPercent: number;
117
+ jitterMs: number;
118
+ }
119
+ /** Debug-only network simulation settings for a network handle */
120
+ export interface INetworkSimulationConfig {
121
+ oneWayLatencyMs: number;
122
+ jitterMs: number;
123
+ packetLossPercent: number;
124
+ }
125
+ /** Peer-preserving connection result returned by networkConnectWithPeer */
126
+ export interface INetworkConnectResult {
127
+ handle: number;
128
+ peerId: number;
129
+ }
130
+ /** Inbound network payload with the sender peer ID preserved */
131
+ export interface INetworkPacket {
132
+ peerId: number;
133
+ data: Uint8Array;
134
+ }
135
+ /** Capabilities reported by the active render provider */
136
+ export interface IRenderCapabilities {
137
+ maxTextureUnits: number;
138
+ maxTextureSize: number;
139
+ supportsInstancing: boolean;
140
+ supportsCompute: boolean;
141
+ supportsMsaa: boolean;
142
+ }
143
+ /** Capabilities reported by the active physics provider */
144
+ export interface IPhysicsCapabilities {
145
+ supportsContinuousCollision: boolean;
146
+ supportsJoints: boolean;
147
+ maxBodies: number;
148
+ }
149
+ /** Capabilities reported by the active audio provider */
150
+ export interface IAudioCapabilities {
151
+ supportsSpatial: boolean;
152
+ maxChannels: number;
153
+ }
154
+ /** Capabilities reported by the active input provider */
155
+ export interface IInputCapabilities {
156
+ supportsGamepad: boolean;
157
+ supportsTouch: boolean;
158
+ maxGamepads: number;
159
+ }
160
+ /** Capabilities reported by the active network provider */
161
+ export interface INetworkCapabilities {
162
+ supportsHosting: boolean;
163
+ maxConnections: number;
164
+ maxChannels: number;
165
+ maxMessageSize: number;
166
+ }
49
167
  /** Opaque handle to an ECS entity */
50
168
  export interface IEntity {
51
169
  readonly index: number;
@@ -81,6 +199,42 @@ export interface ISpriteData {
81
199
  customSizeY: number;
82
200
  hasCustomSize: boolean;
83
201
  }
202
+ /** C-safe UI style payload for node-level visual overrides. */
203
+ export interface IUiStyle {
204
+ backgroundColor?: IColor;
205
+ foregroundColor?: IColor;
206
+ borderColor?: IColor;
207
+ borderWidth?: number;
208
+ fontFamily?: string;
209
+ fontSize?: number;
210
+ texturePath?: string;
211
+ widgetSpacing?: number;
212
+ }
213
+ export type UiNodeId = number | bigint;
214
+ /** UI event payload returned by deterministic polling APIs. */
215
+ export interface IUiEvent {
216
+ eventKind: number;
217
+ nodeId: UiNodeId;
218
+ previousNodeId: UiNodeId;
219
+ currentNodeId: UiNodeId;
220
+ }
221
+ export type PreloadAssetKind = 'texture' | 'font';
222
+ export interface IPreloadAssetRequest {
223
+ path: string;
224
+ kind?: PreloadAssetKind;
225
+ }
226
+ export interface IPreloadProgress {
227
+ loaded: number;
228
+ total: number;
229
+ progress: number;
230
+ path: string;
231
+ kind: PreloadAssetKind;
232
+ handle: number;
233
+ }
234
+ export interface IPreloadOptions {
235
+ onProgress?: (update: IPreloadProgress) => void;
236
+ }
237
+ export type PreloadAssetInput = string | IPreloadAssetRequest;
84
238
  /** Main game engine instance. Creates a window, manages rendering, input, and ECS. */
85
239
  export interface IGoudGame {
86
240
  /** Seconds elapsed since last frame */
@@ -113,6 +267,12 @@ export interface IGoudGame {
113
267
  loadTexture(path: string): Promise<number>;
114
268
  /** Destroys a previously loaded texture */
115
269
  destroyTexture(handle: number): void;
270
+ /** Loads a font from a file path and returns its handle */
271
+ loadFont(path: string): Promise<number>;
272
+ /** Destroys a previously loaded font */
273
+ destroyFont(handle: number): boolean;
274
+ /** Draws text using a loaded font */
275
+ drawText(fontHandle: number, text: string, x: number, y: number, fontSize?: number, alignment?: number, maxWidth?: number, lineSpacing?: number, direction?: number, color?: IColor): boolean;
116
276
  /** Draws a textured sprite */
117
277
  drawSprite(texture: number, x: number, y: number, width: number, height: number, rotation?: number, color?: IColor): void;
118
278
  /** Draws a colored rectangle */
@@ -179,6 +339,16 @@ export interface IGoudGame {
179
339
  spawnBatch(count: number): IEntity[];
180
340
  /** Despawns multiple entities at once */
181
341
  despawnBatch(entities: IEntity[]): number;
342
+ /** Starts animation playback for an entity */
343
+ play(entity: IEntity): number;
344
+ /** Stops animation playback for an entity */
345
+ stop(entity: IEntity): number;
346
+ /** Sets the active animation state for an entity */
347
+ setState(entity: IEntity, stateName: string): number;
348
+ /** Sets a boolean animation parameter for an entity */
349
+ setParameterBool(entity: IEntity, name: string, value: boolean): number;
350
+ /** Sets a float animation parameter for an entity */
351
+ setParameterFloat(entity: IEntity, name: string, value: number): number;
182
352
  /** Creates a 3D cube */
183
353
  createCube(textureId: number, width: number, height: number, depth: number): number;
184
354
  /** Creates a 3D plane */
@@ -239,6 +409,48 @@ export interface IGoudGame {
239
409
  setFpsUpdateInterval(interval: number): void;
240
410
  /** Sets the screen corner where the FPS overlay is displayed */
241
411
  setFpsOverlayCorner(corner: number): void;
412
+ /** Returns the latest debugger snapshot JSON for this route. */
413
+ getDebuggerSnapshotJson(): string;
414
+ /** Returns the current process-wide debugger manifest JSON. */
415
+ getDebuggerManifestJson(): string;
416
+ /** Pauses or resumes the route-scoped debugger runtime. */
417
+ setDebuggerPaused(paused: boolean): void;
418
+ /** Consumes debugger-controlled frame or tick step budget for this route. */
419
+ stepDebugger(kind: number, count: number): void;
420
+ /** Sets the debugger-owned time-scale multiplier for this route. */
421
+ setDebuggerTimeScale(scale: number): void;
422
+ /** Enables or disables runtime-owned debug draw for this route. */
423
+ setDebuggerDebugDrawEnabled(enabled: boolean): void;
424
+ /** Queues one normalized keyboard event through the debugger control plane. */
425
+ injectDebuggerKeyEvent(key: number, pressed: boolean): void;
426
+ /** Queues one normalized mouse-button event through the debugger control plane. */
427
+ injectDebuggerMouseButton(button: number, pressed: boolean): void;
428
+ /** Queues one normalized mouse-position event through the debugger control plane. */
429
+ injectDebuggerMousePosition(position: IVec2): void;
430
+ /** Queues one normalized scroll event through the debugger control plane. */
431
+ injectDebuggerScroll(delta: IVec2): void;
432
+ /** Enables or disables per-system debugger profiling for this route. */
433
+ setDebuggerProfilingEnabled(enabled: boolean): void;
434
+ /** Selects one entity for expanded debugger inspector output. */
435
+ setDebuggerSelectedEntity(entityId: number): void;
436
+ /** Clears the selected debugger inspector entity for this route. */
437
+ clearDebuggerSelectedEntity(): void;
438
+ /** Returns debugger-owned aggregate memory statistics for this route. */
439
+ getMemorySummary(): IMemorySummary;
440
+ /** Captures the current frame plus debugger-owned metadata attachments for this route. */
441
+ captureDebuggerFrame(): IDebuggerCapture;
442
+ /** Starts debugger-owned normalized input recording for this route. */
443
+ startDebuggerRecording(): void;
444
+ /** Stops debugger-owned recording and returns the exported replay artifact. */
445
+ stopDebuggerRecording(): IDebuggerReplayArtifact;
446
+ /** Starts debugger-owned replay using previously exported recording bytes. */
447
+ startDebuggerReplay(recording: Uint8Array): void;
448
+ /** Stops any active debugger-owned replay session for this route. */
449
+ stopDebuggerReplay(): void;
450
+ /** Returns the current debugger replay status JSON for this route. */
451
+ getDebuggerReplayStatusJson(): string;
452
+ /** Returns the current debugger metrics-trace JSON for this route. */
453
+ getDebuggerMetricsTraceJson(): string;
242
454
  /** Maps an action name to a key */
243
455
  mapActionKey(action: string, key: number): boolean;
244
456
  /** Returns true if the action is currently pressed */
@@ -265,6 +477,169 @@ export interface IGoudGame {
265
477
  distance(x1: number, y1: number, x2: number, y2: number): number;
266
478
  /** Squared distance between two points */
267
479
  distanceSquared(x1: number, y1: number, x2: number, y2: number): number;
480
+ /** Casts a filtered ray and returns the full hit payload, or null when no hit is found (FFI: goud_physics_raycast_ex) */
481
+ physicsRaycastEx(originX: number, originY: number, dirX: number, dirY: number, maxDist: number, layerMask: number): IPhysicsRaycastHit2D | null;
482
+ /** Returns the number of queued physics collision events available to read (FFI: goud_physics_collision_events_count) */
483
+ physicsCollisionEventsCount(): number;
484
+ /** Reads one queued physics collision event by index, or null when the index is out of range (FFI: goud_physics_collision_events_read) */
485
+ physicsCollisionEventsRead(index: number): IPhysicsCollisionEvent2D | null;
486
+ /** Registers or clears a physics collision callback function pointer. C# callers must keep the callback delegate alive for the full registration lifetime. Python and TypeScript wrappers support clear-only (`callbackPtr = 0`, `userData = 0`) for safety. (FFI: goud_physics_set_collision_callback) */
487
+ physicsSetCollisionCallback(callbackPtr: number, userData: number): number;
488
+ /** Queries the render provider's capabilities */
489
+ getRenderCapabilities(): IRenderCapabilities;
490
+ /** Queries the physics provider's capabilities */
491
+ getPhysicsCapabilities(): IPhysicsCapabilities;
492
+ /** Queries the audio provider's capabilities */
493
+ getAudioCapabilities(): IAudioCapabilities;
494
+ /** Queries the input provider's capabilities */
495
+ getInputCapabilities(): IInputCapabilities;
496
+ /** Queries the network provider's capabilities. Throws if no network provider is installed. */
497
+ getNetworkCapabilities(): INetworkCapabilities;
498
+ /** Starts hosting on the given port with the selected transport protocol. */
499
+ networkHost(protocol: number, port: number): number;
500
+ /** Connects to a remote host with the selected transport protocol. */
501
+ networkConnect(protocol: number, address: string, port: number): number;
502
+ /** Connects to a remote host with the selected transport protocol and preserves the provider-assigned peer ID. */
503
+ networkConnectWithPeer(protocol: number, address: string, port: number): INetworkConnectResult;
504
+ /** Disconnects a network host or connection handle. */
505
+ networkDisconnect(handle: number): number;
506
+ /** Sends raw bytes to the given peer over a network handle and channel. */
507
+ networkSend(handle: number, peerId: number, data: Uint8Array, channel: number): number;
508
+ /** Receives the next buffered payload produced by networkPoll. */
509
+ networkReceive(handle: number): Uint8Array;
510
+ /** Receives the next buffered payload produced by networkPoll and preserves the sender peer ID. */
511
+ networkReceivePacket(handle: number): INetworkPacket | null;
512
+ /** Polls the network handle and buffers inbound messages for retrieval. */
513
+ networkPoll(handle: number): number;
514
+ /** Returns aggregate network statistics for a network handle. */
515
+ getNetworkStats(handle: number): INetworkStats;
516
+ /** Returns the number of connected peers for a network handle. */
517
+ networkPeerCount(handle: number): number;
518
+ /** Applies debug-only latency, jitter, and packet-loss simulation to a network handle. */
519
+ setNetworkSimulation(handle: number, config: INetworkSimulationConfig): number;
520
+ /** Clears debug-only network simulation settings from a network handle. */
521
+ clearNetworkSimulation(handle: number): number;
522
+ /** Overrides the active network handle displayed by the native debug overlay for this context. */
523
+ setNetworkOverlayHandle(handle: number): number;
524
+ /** Clears the explicit network-overlay handle override for this context. */
525
+ clearNetworkOverlayHandle(): number;
526
+ /** Plays audio from raw bytes on the default channel */
527
+ audioPlay(data: Uint8Array): number;
528
+ /** Plays audio from raw bytes on the given channel */
529
+ audioPlayOnChannel(data: Uint8Array, channel: number): number;
530
+ /** Plays audio with explicit volume, speed, looping, and channel settings */
531
+ audioPlayWithSettings(data: Uint8Array, volume: number, speed: number, looping: boolean, channel: number): number;
532
+ /** Stops a playing audio player */
533
+ audioStop(playerId: number): number;
534
+ /** Pauses a playing audio player */
535
+ audioPause(playerId: number): number;
536
+ /** Resumes a paused audio player */
537
+ audioResume(playerId: number): number;
538
+ /** Stops all active audio players */
539
+ audioStopAll(): number;
540
+ /** Sets the global audio volume */
541
+ audioSetGlobalVolume(volume: number): number;
542
+ /** Gets the global audio volume */
543
+ audioGetGlobalVolume(): number;
544
+ /** Sets the volume for a specific channel */
545
+ audioSetChannelVolume(channel: number, volume: number): number;
546
+ /** Gets the volume for a specific channel */
547
+ audioGetChannelVolume(channel: number): number;
548
+ /** Returns non-zero when the player is still playing */
549
+ audioIsPlaying(playerId: number): number;
550
+ /** Returns the number of active audio players */
551
+ audioActiveCount(): number;
552
+ /** Cleans up finished audio players */
553
+ audioCleanupFinished(): number;
554
+ /** Plays audio with 3D spatial attenuation */
555
+ audioPlaySpatial3d(data: Uint8Array, sourceX: number, sourceY: number, sourceZ: number, listenerX: number, listenerY: number, listenerZ: number, maxDistance: number, rolloff: number): number;
556
+ /** Updates 3D spatial attenuation for an active player */
557
+ audioUpdateSpatial3d(playerId: number, sourceX: number, sourceY: number, sourceZ: number, listenerX: number, listenerY: number, listenerZ: number, maxDistance: number, rolloff: number): number;
558
+ /** Sets the 3D listener position */
559
+ audioSetListenerPosition3d(x: number, y: number, z: number): number;
560
+ /** Sets the 3D source position for an active player */
561
+ audioSetSourcePosition3d(playerId: number, x: number, y: number, z: number, maxDistance: number, rolloff: number): number;
562
+ /** Sets the volume for an active player */
563
+ audioSetPlayerVolume(playerId: number, volume: number): number;
564
+ /** Sets the playback speed for an active player */
565
+ audioSetPlayerSpeed(playerId: number, speed: number): number;
566
+ /** Applies an immediate crossfade mix between two active players */
567
+ audioCrossfade(fromPlayerId: number, toPlayerId: number, mix: number): number;
568
+ /** Starts a timed crossfade from one player to a new audio asset */
569
+ audioCrossfadeTo(fromPlayerId: number, data: Uint8Array, durationSec: number, channel: number): number;
570
+ /** Mixes a secondary audio asset with a primary player */
571
+ audioMixWith(primaryPlayerId: number, data: Uint8Array, secondaryVolume: number, secondaryChannel: number): number;
572
+ /** Advances all active timed crossfades */
573
+ audioUpdateCrossfades(deltaSec: number): number;
574
+ /** Returns the number of active timed crossfades */
575
+ audioActiveCrossfadeCount(): number;
576
+ /** Activates audio playback on platforms that require user gesture initialization */
577
+ audioActivate(): number;
578
+ /** Checks if the hot-swap keyboard shortcut (F5) was pressed and cycles the render provider to null. Debug builds only. Returns true if a swap occurred. */
579
+ checkHotSwapShortcut(): boolean;
580
+ /** Preloads textures/fonts before `run()` starts and reports coarse per-asset progress. */
581
+ preload(assets: PreloadAssetInput[], options?: IPreloadOptions): Promise<Record<string, number>>;
582
+ animationLayerStackCreate(entity: IEntity): number;
583
+ animationLayerAdd(entity: IEntity, name: string, blendMode: number): number;
584
+ animationLayerSetWeight(entity: IEntity, layerIndex: number, weight: number): number;
585
+ animationLayerPlay(entity: IEntity, layerIndex: number): number;
586
+ animationLayerSetClip(entity: IEntity, layerIndex: number, frameCount: number, frameDuration: number, mode: number): number;
587
+ animationLayerAddFrame(entity: IEntity, layerIndex: number, x: number, y: number, w: number, h: number): number;
588
+ animationLayerReset(entity: IEntity, layerIndex: number): number;
589
+ animationClipAddEvent(entity: IEntity, frameIndex: number, name: string, payloadType: number, payloadInt: number, payloadFloat: number, payloadString?: string | null): number;
590
+ animationEventsCount(): number;
591
+ animationEventsRead(index: number): IAnimationEventData;
592
+ }
593
+ /** Headless engine context exposing low-level networking APIs for Node-only tests. */
594
+ export interface IGoudContext {
595
+ destroy(): boolean;
596
+ isValid(): boolean;
597
+ getNetworkCapabilities(): INetworkCapabilities;
598
+ networkHost(protocol: number, port: number): number;
599
+ networkConnect(protocol: number, address: string, port: number): number;
600
+ networkConnectWithPeer(protocol: number, address: string, port: number): INetworkConnectResult;
601
+ networkDisconnect(handle: number): number;
602
+ networkSend(handle: number, peerId: number, data: Uint8Array, channel: number): number;
603
+ networkReceive(handle: number): Uint8Array;
604
+ networkReceivePacket(handle: number): INetworkPacket | null;
605
+ networkPoll(handle: number): number;
606
+ getNetworkStats(handle: number): INetworkStats;
607
+ networkPeerCount(handle: number): number;
608
+ setNetworkSimulation(handle: number, config: INetworkSimulationConfig): number;
609
+ clearNetworkSimulation(handle: number): number;
610
+ setNetworkOverlayHandle(handle: number): number;
611
+ clearNetworkOverlayHandle(): number;
612
+ getDebuggerSnapshotJson(): string;
613
+ getDebuggerManifestJson(): string;
614
+ setDebuggerPaused(paused: boolean): void;
615
+ stepDebugger(kind: number, count: number): void;
616
+ setDebuggerTimeScale(scale: number): void;
617
+ setDebuggerDebugDrawEnabled(enabled: boolean): void;
618
+ injectDebuggerKeyEvent(key: number, pressed: boolean): void;
619
+ injectDebuggerMouseButton(button: number, pressed: boolean): void;
620
+ injectDebuggerMousePosition(position: IVec2): void;
621
+ injectDebuggerScroll(delta: IVec2): void;
622
+ setDebuggerProfilingEnabled(enabled: boolean): void;
623
+ setDebuggerSelectedEntity(entityId: number): void;
624
+ clearDebuggerSelectedEntity(): void;
625
+ getMemorySummary(): IMemorySummary;
626
+ captureDebuggerFrame(): IDebuggerCapture;
627
+ startDebuggerRecording(): void;
628
+ stopDebuggerRecording(): IDebuggerReplayArtifact;
629
+ startDebuggerReplay(recording: Uint8Array): void;
630
+ stopDebuggerReplay(): void;
631
+ getDebuggerReplayStatusJson(): string;
632
+ getDebuggerMetricsTraceJson(): string;
633
+ }
634
+ /** Data for a fired animation event */
635
+ export interface IAnimationEventData {
636
+ entity: number;
637
+ name: string;
638
+ frameIndex: number;
639
+ payloadType: number;
640
+ payloadInt: number;
641
+ payloadFloat: number;
642
+ payloadString: string;
268
643
  }
269
644
  /** Builder for configuring and creating a GoudGame instance with provider selection. */
270
645
  export interface IEngineConfig {
@@ -280,9 +655,175 @@ export interface IEngineConfig {
280
655
  setTargetFps(fps: number): IEngineConfig;
281
656
  /** Enables or disables the FPS debug overlay */
282
657
  setFpsOverlay(enabled: boolean): IEngineConfig;
658
+ /** Enables or disables physics debug visualization */
659
+ setPhysicsDebug(enabled: boolean): IEngineConfig;
660
+ /** Selects the 2D physics backend used by the built game */
661
+ setPhysicsBackend2D(backend: PhysicsBackend2D): IEngineConfig;
662
+ /** Configures debugger runtime startup for the created game. */
663
+ setDebugger(debuggerConfig: IDebuggerConfig): IEngineConfig;
283
664
  /** Consumes the config and creates a windowed GoudGame instance */
284
665
  build(): IGoudGame;
285
666
  /** Frees the config without building */
286
667
  destroy(): void;
287
668
  }
669
+ /** 2D physics simulation powered by Rapier2D */
670
+ export interface IPhysicsWorld2D {
671
+ /** Creates a 2D physics world with given gravity */
672
+ create(gravityX: number, gravityY: number): number;
673
+ /** Creates a 2D physics world with explicit backend selection */
674
+ createWithBackend(gravityX: number, gravityY: number, backend: PhysicsBackend2D): number;
675
+ /** Destroys the 2D physics world */
676
+ destroy(): number;
677
+ /** Sets the gravity vector */
678
+ setGravity(x: number, y: number): number;
679
+ /** Adds a rigid body and returns its handle */
680
+ addRigidBody(bodyType: number, x: number, y: number, gravityScale: number): number;
681
+ /** Adds a rigid body with explicit CCD control and returns its handle (FFI: goud_physics_add_rigid_body_ex) */
682
+ addRigidBodyEx(bodyType: number, x: number, y: number, gravityScale: number, ccdEnabled: boolean): number;
683
+ /** Adds a collider to a rigid body */
684
+ addCollider(bodyHandle: number, shapeType: number, width: number, height: number, radius: number, friction: number, restitution: number): number;
685
+ /** Adds a collider with sensor and collision-layer configuration (FFI: goud_physics_add_collider_ex) */
686
+ addColliderEx(bodyHandle: number, shapeType: number, width: number, height: number, radius: number, friction: number, restitution: number, isSensor: boolean, layer: number, mask: number): number;
687
+ /** Removes a rigid body from the simulation */
688
+ removeBody(handle: number): number;
689
+ /** Creates a joint between two bodies and returns its handle (FFI: goud_physics_create_joint) */
690
+ createJoint(bodyA: number, bodyB: number, kind: number, anchorAx: number, anchorAy: number, anchorBx: number, anchorBy: number, axisX: number, axisY: number, hasLimits: boolean, limitMin: number, limitMax: number, hasMotor: boolean, motorTargetVelocity: number, motorMaxForce: number): number;
691
+ /** Removes a joint from the simulation (FFI: goud_physics_remove_joint) */
692
+ removeJoint(handle: number): number;
693
+ /** Steps the physics simulation */
694
+ step(dt: number): number;
695
+ /** Gets the position of a rigid body */
696
+ getPosition(handle: number): IVec2;
697
+ /** Gets the velocity of a rigid body */
698
+ getVelocity(handle: number): IVec2;
699
+ /** Sets the velocity of a rigid body */
700
+ setVelocity(handle: number, vx: number, vy: number): number;
701
+ /** Applies a force to a rigid body */
702
+ applyForce(handle: number, fx: number, fy: number): number;
703
+ /** Applies an impulse to a rigid body */
704
+ applyImpulse(handle: number, ix: number, iy: number): number;
705
+ /** Casts a ray and returns the hit point */
706
+ raycast(originX: number, originY: number, dirX: number, dirY: number, maxDist: number): IVec2;
707
+ /** Casts a ray and returns the full raycast hit payload (FFI: goud_physics_raycast_ex) */
708
+ raycastEx(originX: number, originY: number, dirX: number, dirY: number, maxDist: number, layerMask: number): IPhysicsRaycastHit2D;
709
+ /** Returns the number of queued collision events available to read (FFI: goud_physics_collision_events_count) */
710
+ collisionEventsCount(): number;
711
+ /** Reads one queued collision event by index; kind is 0 = Enter, 1 = Stay, 2 = Exit (FFI: goud_physics_collision_events_read) */
712
+ collisionEventsRead(index: number): IPhysicsCollisionEvent2D;
713
+ /** Backward-compatible alias for collisionEventsCount (FFI: goud_physics_collision_event_count) */
714
+ collisionEventCount(): number;
715
+ /** Backward-compatible alias for collisionEventsRead (FFI: goud_physics_collision_event_read) */
716
+ collisionEventRead(index: number): IPhysicsCollisionEvent2D;
717
+ /** Registers or clears a collision callback function pointer. Keep callback storage alive for the full registration lifetime. In safety-restricted wrappers (Python/TypeScript), pass 0 for callbackPtr and userData to clear. (FFI: goud_physics_set_collision_callback) */
718
+ setCollisionCallback(callbackPtr: number, userData: number): number;
719
+ /** Gets the current gravity vector */
720
+ getGravity(): IVec2;
721
+ /** Sets the gravity scale for a rigid body */
722
+ setBodyGravityScale(handle: number, scale: number): number;
723
+ /** Gets the gravity scale for a rigid body */
724
+ getBodyGravityScale(handle: number): number;
725
+ /** Sets the friction coefficient for a collider */
726
+ setColliderFriction(handle: number, friction: number): number;
727
+ /** Gets the friction coefficient for a collider */
728
+ getColliderFriction(handle: number): number;
729
+ /** Sets the restitution (bounciness) for a collider */
730
+ setColliderRestitution(handle: number, restitution: number): number;
731
+ /** Gets the restitution (bounciness) for a collider */
732
+ getColliderRestitution(handle: number): number;
733
+ /** Set the fixed physics timestep in seconds */
734
+ setTimestep(dt: number): number;
735
+ /** Get the current fixed physics timestep in seconds */
736
+ getTimestep(): number;
737
+ }
738
+ /** 3D physics simulation powered by Rapier3D */
739
+ export interface IPhysicsWorld3D {
740
+ /** Creates a 3D physics world with given gravity */
741
+ create(gravityX: number, gravityY: number, gravityZ: number): number;
742
+ /** Destroys the 3D physics world */
743
+ destroy(): number;
744
+ /** Sets the gravity vector */
745
+ setGravity(x: number, y: number, z: number): number;
746
+ /** Adds a rigid body and returns its handle */
747
+ addRigidBody(bodyType: number, x: number, y: number, z: number, gravityScale: number): number;
748
+ /** Adds a rigid body with explicit CCD control and returns its handle (FFI: goud_physics3d_add_rigid_body_ex) */
749
+ addRigidBodyEx(bodyType: number, x: number, y: number, z: number, gravityScale: number, ccdEnabled: boolean): number;
750
+ /** Adds a collider to a rigid body */
751
+ addCollider(bodyHandle: number, shapeType: number, hx: number, hy: number, hz: number, radius: number, friction: number, restitution: number): number;
752
+ /** Removes a rigid body from the simulation */
753
+ removeBody(handle: number): number;
754
+ /** Creates a 3D joint between two bodies and returns its handle (FFI: goud_physics3d_create_joint) */
755
+ createJoint(bodyA: number, bodyB: number, kind: number, anchorAx: number, anchorAy: number, anchorAz: number, anchorBx: number, anchorBy: number, anchorBz: number, axisX: number, axisY: number, axisZ: number, hasLimits: boolean, limitMin: number, limitMax: number, hasMotor: boolean, motorTargetVelocity: number, motorMaxForce: number): number;
756
+ /** Removes a 3D joint from the simulation (FFI: goud_physics3d_remove_joint) */
757
+ removeJoint(handle: number): number;
758
+ /** Steps the physics simulation */
759
+ step(dt: number): number;
760
+ /** Gets the position of a rigid body */
761
+ getPosition(handle: number): IVec3;
762
+ /** Sets the velocity of a rigid body */
763
+ setVelocity(handle: number, vx: number, vy: number, vz: number): number;
764
+ /** Applies a force to a rigid body */
765
+ applyForce(handle: number, fx: number, fy: number, fz: number): number;
766
+ /** Applies an impulse to a rigid body */
767
+ applyImpulse(handle: number, ix: number, iy: number, iz: number): number;
768
+ /** Gets the current gravity vector */
769
+ getGravity(): IVec3;
770
+ /** Sets the gravity scale for a rigid body */
771
+ setBodyGravityScale(handle: number, scale: number): number;
772
+ /** Gets the gravity scale for a rigid body */
773
+ getBodyGravityScale(handle: number): number;
774
+ /** Sets the friction coefficient for a collider */
775
+ setColliderFriction(handle: number, friction: number): number;
776
+ /** Gets the friction coefficient for a collider */
777
+ getColliderFriction(handle: number): number;
778
+ /** Sets the restitution (bounciness) for a collider */
779
+ setColliderRestitution(handle: number, restitution: number): number;
780
+ /** Gets the restitution (bounciness) for a collider */
781
+ getColliderRestitution(handle: number): number;
782
+ /** Set the fixed physics timestep in seconds */
783
+ setTimestep(dt: number): number;
784
+ /** Get the current fixed physics timestep in seconds */
785
+ getTimestep(): number;
786
+ }
787
+ /** Immediate-mode UI manager for creating and managing UI node trees */
788
+ export interface IUiManager {
789
+ /** Runs the UI layout update tick */
790
+ update(): void;
791
+ /** Renders the UI tree */
792
+ render(): void;
793
+ /** Returns the number of live nodes in the UI tree */
794
+ nodeCount(): number;
795
+ /** Creates a new UI node with the given component type (0=Panel, -1=none) */
796
+ createNode(componentType: number): UiNodeId;
797
+ /** Removes a UI node and its subtree */
798
+ removeNode(nodeId: UiNodeId): number;
799
+ /** Sets or clears the parent of a UI node (use u64.MAX to detach) */
800
+ setParent(childId: UiNodeId, parentId: UiNodeId): number;
801
+ /** Returns the parent node ID, or u64.MAX if none */
802
+ getParent(nodeId: UiNodeId): UiNodeId;
803
+ /** Returns the number of children of a node */
804
+ getChildCount(nodeId: UiNodeId): number;
805
+ /** Returns the child node ID at a given index, or u64.MAX if out of bounds */
806
+ getChildAt(nodeId: UiNodeId, index: number): UiNodeId;
807
+ /** Sets or clears the widget component on an existing UI node */
808
+ setWidget(nodeId: UiNodeId, widgetKind: number): number;
809
+ /** Applies per-node style overrides using a C-safe style payload */
810
+ setStyle(nodeId: UiNodeId, style: IUiStyle): number;
811
+ /** Sets or creates a label widget and updates its text */
812
+ setLabelText(nodeId: UiNodeId, text: string): number;
813
+ /** Sets or creates a button widget and updates its enabled state */
814
+ setButtonEnabled(nodeId: UiNodeId, enabled: boolean): number;
815
+ /** Sets or creates an image widget and updates its texture path */
816
+ setImageTexturePath(nodeId: UiNodeId, path: string): number;
817
+ /** Sets or creates a slider widget and updates range/value/enabled */
818
+ setSlider(nodeId: UiNodeId, min: number, max: number, value: number, enabled: boolean): number;
819
+ /** Returns the number of UI events captured in the latest update tick */
820
+ eventCount(): number;
821
+ /** Reads one captured UI event by index */
822
+ eventRead(index: number): IUiEvent | null;
823
+ createPanel(): UiNodeId;
824
+ createLabel(text: string): UiNodeId;
825
+ createButton(enabled?: boolean): UiNodeId;
826
+ createImage(path: string): UiNodeId;
827
+ createSlider(min: number, max: number, value: number, enabled?: boolean): UiNodeId;
828
+ }
288
829
  //# sourceMappingURL=engine.g.d.ts.map