@vulfram/engine 0.5.8-alpha → 0.17.1-alpha

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 (58) hide show
  1. package/README.md +106 -0
  2. package/package.json +55 -4
  3. package/src/core.ts +14 -0
  4. package/src/ecs.ts +1 -0
  5. package/src/engine/api.ts +234 -23
  6. package/src/engine/bridge/dispatch.ts +265 -40
  7. package/src/engine/bridge/guards.ts +4 -1
  8. package/src/engine/bridge/protocol.ts +72 -54
  9. package/src/engine/ecs/index.ts +187 -42
  10. package/src/engine/state.ts +133 -2
  11. package/src/engine/systems/command-intent.ts +153 -3
  12. package/src/engine/systems/constraint-solve.ts +167 -0
  13. package/src/engine/systems/core-command-builder.ts +9 -265
  14. package/src/engine/systems/diagnostics.ts +20 -19
  15. package/src/engine/systems/index.ts +3 -1
  16. package/src/engine/systems/input-mirror.ts +101 -3
  17. package/src/engine/systems/resource-upload.ts +96 -44
  18. package/src/engine/systems/response-decode.ts +69 -15
  19. package/src/engine/systems/scene-sync.ts +306 -0
  20. package/src/engine/systems/ui-bridge.ts +360 -0
  21. package/src/engine/systems/utils.ts +43 -1
  22. package/src/engine/systems/world-lifecycle.ts +72 -103
  23. package/src/engine/window/manager.ts +168 -0
  24. package/src/engine/world/entities.ts +931 -33
  25. package/src/engine/world/mount.ts +174 -0
  26. package/src/engine/world/types.ts +71 -0
  27. package/src/engine/world/world-ui.ts +266 -0
  28. package/src/engine/world/world3d.ts +280 -0
  29. package/src/index.ts +30 -1
  30. package/src/mount.ts +2 -0
  31. package/src/types/cmds/audio.ts +189 -0
  32. package/src/types/cmds/camera.ts +18 -13
  33. package/src/types/cmds/environment.ts +47 -4
  34. package/src/types/cmds/geometry.ts +18 -16
  35. package/src/types/cmds/index.ts +203 -132
  36. package/src/types/cmds/light.ts +17 -13
  37. package/src/types/cmds/material.ts +14 -13
  38. package/src/types/cmds/model.ts +40 -16
  39. package/src/types/cmds/realm.ts +25 -0
  40. package/src/types/cmds/render-graph.ts +49 -0
  41. package/src/types/cmds/resources.ts +4 -0
  42. package/src/types/cmds/shadow.ts +7 -7
  43. package/src/types/cmds/system.ts +29 -0
  44. package/src/types/cmds/target.ts +82 -0
  45. package/src/types/cmds/texture.ts +19 -5
  46. package/src/types/cmds/ui.ts +220 -0
  47. package/src/types/cmds/window.ts +41 -204
  48. package/src/types/events/index.ts +4 -1
  49. package/src/types/events/pointer.ts +42 -13
  50. package/src/types/events/system.ts +150 -7
  51. package/src/types/events/ui.ts +21 -0
  52. package/src/types/index.ts +1 -0
  53. package/src/types/json.ts +15 -0
  54. package/src/types/kinds.ts +3 -0
  55. package/src/window.ts +8 -0
  56. package/src/world-ui.ts +2 -0
  57. package/src/world3d.ts +10 -0
  58. package/tsconfig.json +0 -29
@@ -0,0 +1,280 @@
1
+ import { createWorld3D as createWorld3DRaw } from '../api';
2
+ import type {
3
+ CameraProps,
4
+ GeometryProps,
5
+ LightProps,
6
+ MaterialProps,
7
+ ModelProps,
8
+ TagProps,
9
+ TextureProps,
10
+ TransformProps,
11
+ } from '../ecs';
12
+ import type {
13
+ CmdAudioListenerUpdateArgs,
14
+ CmdAudioResourceUpsertArgs,
15
+ CmdAudioSourceCreateArgs,
16
+ CmdAudioSourceTransportArgs,
17
+ } from '../../types/cmds/audio';
18
+ import type { EnvironmentConfig } from '../../types/cmds/environment';
19
+ import type { CmdGizmoDrawAabbArgs, CmdGizmoDrawLineArgs } from '../../types/cmds/gizmo';
20
+ import type { CmdPoseUpdateArgs } from '../../types/cmds/model';
21
+ import type { ShadowConfig } from '../../types/cmds/shadow';
22
+ import type { NotificationLevel } from '../../types/kinds';
23
+ import {
24
+ audioListenerUpdate as audioListenerUpdateRaw,
25
+ audioResourceCreate as audioResourceCreateRaw,
26
+ audioSourceCreate as audioSourceCreateRaw,
27
+ audioSourcePlay as audioSourcePlayRaw,
28
+ configureEnvironment as configureEnvironmentRaw,
29
+ configureShadows as configureShadowsRaw,
30
+ createCamera as createCameraRaw,
31
+ createEntity as createEntityRaw,
32
+ createGeometry as createGeometryRaw,
33
+ createLight as createLightRaw,
34
+ createMaterial as createMaterialRaw,
35
+ createModel as createModelRaw,
36
+ createTexture as createTextureRaw,
37
+ createTag as createTagRaw,
38
+ drawGizmoAabb as drawGizmoAabbRaw,
39
+ drawGizmoLine as drawGizmoLineRaw,
40
+ getModelId as getModelIdRaw,
41
+ getWindowSize as getWindowSizeRaw,
42
+ getWorldRealmId as getWorldRealmIdRaw,
43
+ isKeyPressed as isKeyPressedRaw,
44
+ isWindowCloseRequested as isWindowCloseRequestedRaw,
45
+ listCameras as listCamerasRaw,
46
+ listGeometries as listGeometriesRaw,
47
+ listLights as listLightsRaw,
48
+ listMaterials as listMaterialsRaw,
49
+ listModels as listModelsRaw,
50
+ listTextures as listTexturesRaw,
51
+ poseUpdate as poseUpdateRaw,
52
+ removeEntity as removeEntityRaw,
53
+ sendNotification as sendNotificationRaw,
54
+ setParent as setParentRaw,
55
+ updateTransform as updateTransformRaw,
56
+ } from './entities';
57
+ import type {
58
+ CommandId,
59
+ EntityId,
60
+ GeometryId,
61
+ MaterialId,
62
+ TextureId,
63
+ World3DId,
64
+ } from './types';
65
+ import {
66
+ asCommandId,
67
+ asEntityId,
68
+ asGeometryId,
69
+ asMaterialId,
70
+ asTextureId,
71
+ asWorld3DId,
72
+ asWorldNumber,
73
+ } from './types';
74
+
75
+ export type Create3DWorldOptions = {
76
+ outputSurfaceId?: number;
77
+ importance?: number;
78
+ cachePolicy?: number;
79
+ flags?: number;
80
+ };
81
+
82
+ type Create3DAudioSourceArgs = Omit<CmdAudioSourceCreateArgs, 'realmId' | 'modelId'>
83
+ & ({ modelId: number } | { entityId: EntityId });
84
+
85
+ /**
86
+ * Creates a 3D world.
87
+ *
88
+ * The world is realm-backed internally, but realm details are hidden from this API.
89
+ * Use `Mount.mountWorld(...)` to present this world into one or more targets.
90
+ */
91
+ export function create3DWorld(options?: Create3DWorldOptions): World3DId {
92
+ return asWorld3DId(createWorld3DRaw(options));
93
+ }
94
+
95
+ /** Creates an entity in a 3D world. */
96
+ export function create3DEntity(worldId: World3DId): EntityId {
97
+ return asEntityId(createEntityRaw(asWorldNumber(worldId)));
98
+ }
99
+
100
+ /** Removes an entity and all mirrored components from a 3D world. */
101
+ export function remove3DEntity(worldId: World3DId, entityId: EntityId): void {
102
+ removeEntityRaw(asWorldNumber(worldId), entityId as number);
103
+ }
104
+
105
+ /** Upserts camera component intent for an entity in a 3D world. */
106
+ export function create3DCamera(worldId: World3DId, entityId: EntityId, props: CameraProps): void {
107
+ createCameraRaw(asWorldNumber(worldId), entityId as number, props);
108
+ }
109
+
110
+ /** Upserts light component intent for an entity in a 3D world. */
111
+ export function create3DLight(worldId: World3DId, entityId: EntityId, props: LightProps): void {
112
+ createLightRaw(asWorldNumber(worldId), entityId as number, props);
113
+ }
114
+
115
+ /** Upserts model component intent for an entity in a 3D world. */
116
+ export function create3DModel(worldId: World3DId, entityId: EntityId, props: ModelProps): void {
117
+ createModelRaw(asWorldNumber(worldId), entityId as number, props);
118
+ }
119
+
120
+ /** Upserts transform component intent for an entity in a 3D world. */
121
+ export function update3DTransform(worldId: World3DId, entityId: EntityId, props: TransformProps): void {
122
+ updateTransformRaw(asWorldNumber(worldId), entityId as number, props);
123
+ }
124
+
125
+ /** Attaches or updates a tag component in a 3D world. */
126
+ export function create3DTag(worldId: World3DId, entityId: EntityId, props: TagProps): void {
127
+ createTagRaw(asWorldNumber(worldId), entityId as number, props);
128
+ }
129
+
130
+ /** Sets parent-child relationship between entities. */
131
+ export function set3DParent(worldId: World3DId, childEntityId: EntityId, parentEntityId: EntityId | null): void {
132
+ setParentRaw(asWorldNumber(worldId), childEntityId as number, parentEntityId as number | null);
133
+ }
134
+
135
+ /** Creates a material resource and returns its typed id. */
136
+ export function create3DMaterial(worldId: World3DId, props: MaterialProps): MaterialId {
137
+ return asMaterialId(createMaterialRaw(asWorldNumber(worldId), props));
138
+ }
139
+
140
+ /** Creates a geometry resource and returns its typed id. */
141
+ export function create3DGeometry(worldId: World3DId, props: GeometryProps): GeometryId {
142
+ return asGeometryId(createGeometryRaw(asWorldNumber(worldId), props));
143
+ }
144
+
145
+ /** Creates a texture resource and returns its typed id. */
146
+ export function create3DTexture(worldId: World3DId, props: TextureProps): TextureId {
147
+ return asTextureId(createTextureRaw(asWorldNumber(worldId), props));
148
+ }
149
+
150
+ /** Configures environment/post-processing for a 3D world. */
151
+ export function configure3DEnvironment(worldId: World3DId, config: EnvironmentConfig): void {
152
+ configureEnvironmentRaw(asWorldNumber(worldId), config);
153
+ }
154
+
155
+ /** Configures shadows for a 3D world. */
156
+ export function configure3DShadows(worldId: World3DId, config: ShadowConfig): void {
157
+ configureShadowsRaw(asWorldNumber(worldId), config);
158
+ }
159
+
160
+ /** Draws a debug line gizmo. */
161
+ export function draw3DGizmoLine(worldId: World3DId, args: CmdGizmoDrawLineArgs): void {
162
+ drawGizmoLineRaw(asWorldNumber(worldId), args);
163
+ }
164
+
165
+ /** Draws a debug axis-aligned bounding box gizmo. */
166
+ export function draw3DGizmoAabb(worldId: World3DId, args: CmdGizmoDrawAabbArgs): void {
167
+ drawGizmoAabbRaw(asWorldNumber(worldId), args);
168
+ }
169
+
170
+ /** Updates pose data for XR/trackers. */
171
+ export function update3DPose(worldId: World3DId, args: CmdPoseUpdateArgs): CommandId {
172
+ return asCommandId(poseUpdateRaw(asWorldNumber(worldId), args));
173
+ }
174
+
175
+ /** Requests a model list from core for this world. */
176
+ export function list3DModels(worldId: World3DId): CommandId {
177
+ return asCommandId(listModelsRaw(asWorldNumber(worldId)));
178
+ }
179
+
180
+ /** Requests a material list from core for this world. */
181
+ export function list3DMaterials(worldId: World3DId): CommandId {
182
+ return asCommandId(listMaterialsRaw(asWorldNumber(worldId)));
183
+ }
184
+
185
+ /** Requests a texture list from core for this world. */
186
+ export function list3DTextures(worldId: World3DId): CommandId {
187
+ return asCommandId(listTexturesRaw(asWorldNumber(worldId)));
188
+ }
189
+
190
+ /** Requests a geometry list from core for this world. */
191
+ export function list3DGeometries(worldId: World3DId): CommandId {
192
+ return asCommandId(listGeometriesRaw(asWorldNumber(worldId)));
193
+ }
194
+
195
+ /** Requests a light list from core for this world. */
196
+ export function list3DLights(worldId: World3DId): CommandId {
197
+ return asCommandId(listLightsRaw(asWorldNumber(worldId)));
198
+ }
199
+
200
+ /** Requests a camera list from core for this world. */
201
+ export function list3DCameras(worldId: World3DId): CommandId {
202
+ return asCommandId(listCamerasRaw(asWorldNumber(worldId)));
203
+ }
204
+
205
+ /** Returns true while a key is pressed in this world input state. */
206
+ export function is3DKeyPressed(worldId: World3DId, keyCode: number): boolean {
207
+ return isKeyPressedRaw(asWorldNumber(worldId), keyCode);
208
+ }
209
+
210
+ /** Returns true when close was requested for this world's primary window. */
211
+ export function is3DWindowCloseRequested(worldId: World3DId): boolean {
212
+ return isWindowCloseRequestedRaw(asWorldNumber(worldId));
213
+ }
214
+
215
+ /** Returns current size for this world's primary window. */
216
+ export function get3DWindowSize(worldId: World3DId): [number, number] {
217
+ return getWindowSizeRaw(asWorldNumber(worldId));
218
+ }
219
+
220
+ /** Sends a host notification scoped to this world. */
221
+ export function send3DNotification(
222
+ worldId: World3DId,
223
+ args: { level: NotificationLevel; title: string; message: string },
224
+ ): void {
225
+ sendNotificationRaw(asWorldNumber(worldId), args);
226
+ }
227
+
228
+ /** Updates audio listener parameters. */
229
+ export function update3DAudioListener(
230
+ worldId: World3DId,
231
+ args: CmdAudioListenerUpdateArgs,
232
+ ): CommandId {
233
+ return asCommandId(audioListenerUpdateRaw(asWorldNumber(worldId), args));
234
+ }
235
+
236
+ /** Creates or updates an audio resource. */
237
+ export function create3DAudioResource(
238
+ worldId: World3DId,
239
+ args: CmdAudioResourceUpsertArgs,
240
+ ): CommandId {
241
+ return asCommandId(audioResourceCreateRaw(asWorldNumber(worldId), args));
242
+ }
243
+
244
+ /** Creates an audio source with realm id resolved internally from world state. */
245
+ export function create3DAudioSource(
246
+ worldId: World3DId,
247
+ args: Create3DAudioSourceArgs,
248
+ ): CommandId {
249
+ const rawWorldId = asWorldNumber(worldId);
250
+ const realmId = getWorldRealmIdRaw(rawWorldId);
251
+ if (realmId == null) {
252
+ throw new Error('World is not ready for audio source creation.');
253
+ }
254
+
255
+ const modelId = 'modelId' in args
256
+ ? args.modelId
257
+ : getModelIdRaw(rawWorldId, args.entityId as number);
258
+ if (modelId == null) {
259
+ throw new Error('Audio source entity has no resolved model yet.');
260
+ }
261
+ const baseArgs = 'modelId' in args
262
+ ? args
263
+ : (({ entityId: _entityId, ...rest }) => rest)(args);
264
+
265
+ return asCommandId(
266
+ audioSourceCreateRaw(rawWorldId, {
267
+ ...baseArgs,
268
+ modelId,
269
+ realmId,
270
+ }),
271
+ );
272
+ }
273
+
274
+ /** Starts playback on an audio source. */
275
+ export function play3DAudioSource(
276
+ worldId: World3DId,
277
+ args: Omit<CmdAudioSourceTransportArgs, 'action'>,
278
+ ): CommandId {
279
+ return asCommandId(audioSourcePlayRaw(asWorldNumber(worldId), args));
280
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,35 @@
1
1
  export { EngineError } from './engine/errors';
2
- export * from './engine/api';
3
2
  export * from './engine/ecs';
3
+ export * as Mount from './engine/world/mount';
4
+ export * as World3D from './engine/world/world3d';
5
+ export * as WorldUI from './engine/world/world-ui';
6
+ export {
7
+ disposeEngine,
8
+ initEngine,
9
+ registerComponent,
10
+ registerSystem,
11
+ tick,
12
+ uploadBuffer,
13
+ } from './engine/api';
14
+ export {
15
+ closeWindow,
16
+ createWindow,
17
+ focusWindow,
18
+ requestAttention,
19
+ updateWindow,
20
+ } from './engine/window/manager';
21
+ export type {
22
+ CommandId,
23
+ EntityId,
24
+ GeometryId,
25
+ MaterialId,
26
+ TargetId,
27
+ TextureId,
28
+ WindowId,
29
+ World3DId,
30
+ WorldId,
31
+ WorldUIId,
32
+ } from './engine/world/types';
4
33
  export * as Types from './types';
5
34
  export type {
6
35
  BufferResult,
package/src/mount.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './engine/world/mount';
2
+ export type { TargetId, WindowId, WorldId } from './engine/world/types';
@@ -0,0 +1,189 @@
1
+ import type { AudioPlayMode } from '../kinds';
2
+
3
+ export interface AudioSpatialParams {
4
+ minDistance: number;
5
+ maxDistance: number;
6
+ rolloff: number;
7
+ coneInner: number;
8
+ coneOuter: number;
9
+ coneOuterGain: number;
10
+ }
11
+
12
+ /** Command payload for updating the listener transform explicitly. */
13
+ export interface CmdAudioListenerUpdateArgs {
14
+ position: [number, number, number];
15
+ velocity: [number, number, number];
16
+ forward: [number, number, number];
17
+ up: [number, number, number];
18
+ }
19
+
20
+ /** Command payload for binding the listener to a model. */
21
+ export interface CmdAudioListenerCreateArgs {
22
+ realmId: number;
23
+ modelId: number;
24
+ }
25
+
26
+ /** Command payload for disposing the listener binding. */
27
+ export interface CmdAudioListenerDisposeArgs {
28
+ realmId: number;
29
+ }
30
+
31
+ export interface CmdResultAudioListenerCreate {
32
+ success: boolean;
33
+ message: string;
34
+ }
35
+
36
+ export interface CmdResultAudioListenerDispose {
37
+ success: boolean;
38
+ message: string;
39
+ }
40
+
41
+ export interface CmdResultAudioListenerUpdate {
42
+ success: boolean;
43
+ message: string;
44
+ }
45
+
46
+ /** Upsert payload accepted by the core (`create` or `update`). */
47
+ export type CmdAudioListenerUpsertArgs =
48
+ | CmdAudioListenerCreateArgs
49
+ | CmdAudioListenerUpdateArgs;
50
+
51
+ /** Backward-compatible aliases. */
52
+ export type CmdResultAudioListenerUpsert = CmdResultAudioListenerUpdate;
53
+
54
+ /** Command payload for creating/updating an audio resource from uploaded bytes. */
55
+ export interface CmdAudioResourceUpsertArgs {
56
+ resourceId: number;
57
+ bufferId: number;
58
+ totalBytes?: number;
59
+ offsetBytes?: number;
60
+ }
61
+
62
+ export interface CmdResultAudioResourceUpsert {
63
+ success: boolean;
64
+ message: string;
65
+ pending: boolean;
66
+ receivedBytes: number;
67
+ totalBytes: number;
68
+ complete: boolean;
69
+ }
70
+
71
+ /** Command payload for creating a source bound to a model. */
72
+ export interface CmdAudioSourceCreateArgs {
73
+ realmId: number;
74
+ sourceId: number;
75
+ modelId: number;
76
+ position: [number, number, number];
77
+ velocity: [number, number, number];
78
+ orientation: [number, number, number, number];
79
+ gain: number;
80
+ pitch: number;
81
+ spatial: AudioSpatialParams;
82
+ }
83
+
84
+ export interface CmdResultAudioSourceCreate {
85
+ success: boolean;
86
+ message: string;
87
+ }
88
+
89
+ /** Command payload for updating source params. */
90
+ export interface CmdAudioSourceUpdateArgs {
91
+ sourceId: number;
92
+ realmId?: number;
93
+ modelId?: number;
94
+ position?: [number, number, number];
95
+ velocity?: [number, number, number];
96
+ orientation?: [number, number, number, number];
97
+ gain?: number;
98
+ pitch?: number;
99
+ spatial?: AudioSpatialParams;
100
+ }
101
+
102
+ export interface CmdResultAudioSourceUpdate {
103
+ success: boolean;
104
+ message: string;
105
+ }
106
+
107
+ /** Upsert payload accepted by the core (`create` or `update`). */
108
+ export type CmdAudioSourceUpsertArgs =
109
+ | CmdAudioSourceCreateArgs
110
+ | CmdAudioSourceUpdateArgs;
111
+
112
+ /** Backward-compatible aliases. */
113
+ export type CmdResultAudioSourceUpsert = CmdResultAudioSourceUpdate;
114
+
115
+ export type AudioSourceTransportAction = 'play' | 'pause' | 'stop';
116
+
117
+ /** Command payload for playback transport control. */
118
+ export interface CmdAudioSourceTransportArgs {
119
+ sourceId: number;
120
+ action: AudioSourceTransportAction;
121
+ resourceId?: number;
122
+ timelineId?: number;
123
+ intensity?: number;
124
+ delayMs?: number;
125
+ mode?: AudioPlayMode;
126
+ }
127
+
128
+ export interface CmdResultAudioSourceTransport {
129
+ success: boolean;
130
+ message: string;
131
+ }
132
+
133
+ /** Command payload for disposing a source. */
134
+ export interface CmdAudioSourceDisposeArgs {
135
+ sourceId: number;
136
+ }
137
+
138
+ export interface CmdResultAudioSourceDispose {
139
+ success: boolean;
140
+ message: string;
141
+ }
142
+
143
+ /** Command payload for disposing an audio resource. */
144
+ export interface CmdAudioResourceDisposeArgs {
145
+ resourceId: number;
146
+ }
147
+
148
+ export interface CmdResultAudioResourceDispose {
149
+ success: boolean;
150
+ message: string;
151
+ }
152
+
153
+ /** Command payload for listing current audio runtime state. */
154
+ export interface CmdAudioStateGetArgs {
155
+ includeListener?: boolean;
156
+ includeSources?: boolean;
157
+ includeStreams?: boolean;
158
+ }
159
+
160
+ export interface AudioListenerBindingState {
161
+ realmId: number;
162
+ modelId: number;
163
+ }
164
+
165
+ export interface AudioSourceStateEntry {
166
+ sourceId: number;
167
+ realmId?: number;
168
+ modelId?: number;
169
+ position: [number, number, number];
170
+ velocity: [number, number, number];
171
+ orientation: [number, number, number, number];
172
+ gain: number;
173
+ pitch: number;
174
+ }
175
+
176
+ export interface AudioStreamStateEntry {
177
+ resourceId: number;
178
+ receivedBytes: number;
179
+ totalBytes: number;
180
+ complete: boolean;
181
+ }
182
+
183
+ export interface CmdResultAudioStateGet {
184
+ success: boolean;
185
+ message: string;
186
+ listener?: AudioListenerBindingState;
187
+ sources: AudioSourceStateEntry[];
188
+ streams: AudioStreamStateEntry[];
189
+ }
@@ -1,4 +1,5 @@
1
1
  import type { CameraKind } from '../kinds';
2
+ import type { ResourceEntry } from './resources';
2
3
 
3
4
  /** Viewport value expressed as relative (0..1) or absolute pixels. */
4
5
  export interface ViewValue {
@@ -14,7 +15,7 @@ export interface ViewPosition {
14
15
 
15
16
  /** Command payload for creating a camera. */
16
17
  export interface CmdCameraCreateArgs {
17
- windowId: number;
18
+ realmId: number;
18
19
  cameraId: number;
19
20
  label?: string;
20
21
  transform: number[]; // Mat4 (16 elements)
@@ -27,16 +28,11 @@ export interface CmdCameraCreateArgs {
27
28
  orthoScale: number;
28
29
  }
29
30
 
30
- /** Result payload for camera create. */
31
- export interface CmdResultCameraCreate {
32
- success: boolean;
33
- message: string;
34
- }
35
-
36
31
  /** Command payload for updating a camera. */
37
32
  export interface CmdCameraUpdateArgs {
38
- windowId: number;
33
+ realmId: number;
39
34
  cameraId: number;
35
+ label?: string;
40
36
  transform?: number[];
41
37
  kind?: CameraKind;
42
38
  flags?: number;
@@ -47,15 +43,22 @@ export interface CmdCameraUpdateArgs {
47
43
  orthoScale?: number;
48
44
  }
49
45
 
50
- /** Result payload for camera update. */
51
- export interface CmdResultCameraUpdate {
46
+ /** Result payload for camera upsert. */
47
+ export interface CmdResultCameraUpsert {
52
48
  success: boolean;
53
49
  message: string;
54
50
  }
55
51
 
52
+ /** Upsert payload accepted by the core (`create` or `update`). */
53
+ export type CmdCameraUpsertArgs = CmdCameraCreateArgs | CmdCameraUpdateArgs;
54
+
55
+ /** Backward-compatible aliases. */
56
+ export type CmdResultCameraCreate = CmdResultCameraUpsert;
57
+ export type CmdResultCameraUpdate = CmdResultCameraUpsert;
58
+
56
59
  /** Command payload for disposing a camera. */
57
60
  export interface CmdCameraDisposeArgs {
58
- windowId: number;
61
+ realmId: number;
59
62
  cameraId: number;
60
63
  }
61
64
 
@@ -66,11 +69,13 @@ export interface CmdResultCameraDispose {
66
69
  }
67
70
 
68
71
  /** Command payload for listing cameras. */
69
- export interface CmdCameraListArgs {}
72
+ export interface CmdCameraListArgs {
73
+ windowId: number;
74
+ }
70
75
 
71
76
  /** Result payload for camera list. */
72
77
  export interface CmdResultCameraList {
73
78
  success: boolean;
74
79
  message: string;
75
- content: number[]; // List of camera IDs
80
+ cameras: ResourceEntry[];
76
81
  }
@@ -11,31 +11,74 @@ export interface SkyboxConfig {
11
11
  mode: SkyboxMode;
12
12
  intensity: number;
13
13
  rotation: number;
14
- tint: [number, number, number];
14
+ groundColor: [number, number, number];
15
+ horizonColor: [number, number, number];
16
+ skyColor: [number, number, number];
15
17
  cubemapTextureId?: number | null;
16
18
  }
17
19
 
20
+ /** Post-processing configuration. */
21
+ export interface PostProcessConfig {
22
+ filterEnabled: boolean;
23
+ filterExposure: number;
24
+ filterGamma: number;
25
+ filterSaturation: number;
26
+ filterContrast: number;
27
+ filterVignette: number;
28
+ filterGrain: number;
29
+ filterChromaticAberration: number;
30
+ filterBlur: number;
31
+ filterSharpen: number;
32
+ filterTonemapMode: number;
33
+ outlineEnabled: boolean;
34
+ outlineStrength: number;
35
+ outlineThreshold: number;
36
+ outlineWidth: number;
37
+ outlineQuality: number;
38
+ filterPosterizeSteps: number;
39
+ cellShading: boolean;
40
+ ssaoEnabled: boolean;
41
+ ssaoStrength: number;
42
+ ssaoRadius: number;
43
+ ssaoBias: number;
44
+ ssaoPower: number;
45
+ ssaoBlurRadius: number;
46
+ ssaoBlurDepthThreshold: number;
47
+ bloomEnabled: boolean;
48
+ bloomThreshold: number;
49
+ bloomKnee: number;
50
+ bloomIntensity: number;
51
+ bloomScatter: number;
52
+ }
53
+
18
54
  /** Environment configuration for a window. */
19
55
  export interface EnvironmentConfig {
20
56
  msaa: MsaaConfig;
21
57
  skybox: SkyboxConfig;
58
+ clearColor: [number, number, number, number];
59
+ post: PostProcessConfig;
22
60
  }
23
61
 
24
62
  /** Command payload for creating environment settings. */
25
63
  export interface CmdEnvironmentCreateArgs {
26
- windowId: number;
64
+ environmentId: number;
27
65
  config: EnvironmentConfig;
28
66
  }
29
67
 
30
68
  /** Command payload for updating environment settings. */
31
69
  export interface CmdEnvironmentUpdateArgs {
32
- windowId: number;
70
+ environmentId: number;
33
71
  config: EnvironmentConfig;
34
72
  }
35
73
 
74
+ /** Upsert payload accepted by the core (`create` or `update`). */
75
+ export type CmdEnvironmentUpsertArgs =
76
+ | CmdEnvironmentCreateArgs
77
+ | CmdEnvironmentUpdateArgs;
78
+
36
79
  /** Command payload for disposing environment settings. */
37
80
  export interface CmdEnvironmentDisposeArgs {
38
- windowId: number;
81
+ environmentId: number;
39
82
  }
40
83
 
41
84
  /** Result payload for environment commands. */