@vulfram/engine 0.14.8-alpha → 0.19.2-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 (63) hide show
  1. package/README.md +106 -0
  2. package/package.json +60 -4
  3. package/src/core.ts +14 -0
  4. package/src/ecs.ts +1 -0
  5. package/src/engine/api.ts +222 -24
  6. package/src/engine/bridge/dispatch.ts +260 -40
  7. package/src/engine/bridge/guards.ts +4 -1
  8. package/src/engine/bridge/protocol.ts +69 -52
  9. package/src/engine/ecs/components.ts +340 -0
  10. package/src/engine/ecs/index.ts +3 -518
  11. package/src/engine/ecs/intents.ts +184 -0
  12. package/src/engine/ecs/systems.ts +26 -0
  13. package/src/engine/intents/store.ts +72 -0
  14. package/src/engine/state.ts +136 -5
  15. package/src/engine/systems/command-intent.ts +159 -14
  16. package/src/engine/systems/constraint-solve.ts +167 -0
  17. package/src/engine/systems/core-command-builder.ts +9 -268
  18. package/src/engine/systems/diagnostics.ts +20 -29
  19. package/src/engine/systems/index.ts +3 -1
  20. package/src/engine/systems/input-mirror.ts +257 -21
  21. package/src/engine/systems/resource-upload.ts +108 -58
  22. package/src/engine/systems/response-decode.ts +86 -15
  23. package/src/engine/systems/scene-sync.ts +305 -0
  24. package/src/engine/systems/ui-bridge.ts +381 -0
  25. package/src/engine/systems/utils.ts +86 -1
  26. package/src/engine/systems/world-lifecycle.ts +43 -114
  27. package/src/engine/window/manager.ts +168 -0
  28. package/src/engine/world/entities.ts +998 -91
  29. package/src/engine/world/mount.ts +195 -0
  30. package/src/engine/world/types.ts +71 -0
  31. package/src/engine/world/world-ui.ts +313 -0
  32. package/src/engine/world/world3d.ts +529 -0
  33. package/src/helpers/collision.ts +487 -0
  34. package/src/helpers/index.ts +2 -0
  35. package/src/helpers/raycast.ts +442 -0
  36. package/src/index.ts +30 -1
  37. package/src/mount.ts +2 -0
  38. package/src/types/cmds/audio.ts +73 -48
  39. package/src/types/cmds/camera.ts +12 -8
  40. package/src/types/cmds/environment.ts +9 -3
  41. package/src/types/cmds/geometry.ts +15 -16
  42. package/src/types/cmds/index.ts +234 -162
  43. package/src/types/cmds/input.ts +39 -0
  44. package/src/types/cmds/light.ts +12 -11
  45. package/src/types/cmds/material.ts +19 -21
  46. package/src/types/cmds/model.ts +17 -15
  47. package/src/types/cmds/realm.ts +23 -0
  48. package/src/types/cmds/system.ts +29 -0
  49. package/src/types/cmds/target.ts +96 -0
  50. package/src/types/cmds/texture.ts +13 -3
  51. package/src/types/cmds/ui.ts +220 -0
  52. package/src/types/cmds/window.ts +41 -204
  53. package/src/types/events/index.ts +4 -1
  54. package/src/types/events/keyboard.ts +2 -2
  55. package/src/types/events/pointer.ts +85 -13
  56. package/src/types/events/system.ts +188 -30
  57. package/src/types/events/ui.ts +21 -0
  58. package/src/types/index.ts +1 -0
  59. package/src/types/json.ts +15 -0
  60. package/src/window.ts +8 -0
  61. package/src/world-ui.ts +2 -0
  62. package/src/world3d.ts +10 -0
  63. package/tsconfig.json +0 -29
@@ -0,0 +1,340 @@
1
+ import type { ViewPosition } from '../../types/cmds/camera';
2
+ import type { GeometryPrimitiveEntry } from '../../types/cmds/geometry';
3
+ import type { MaterialOptions } from '../../types/cmds/material';
4
+ import type { ForwardAtlasOptions } from '../../types/cmds/texture';
5
+ import type { GamepadEvent, SystemEvent, UiEvent } from '../../types/events';
6
+ import type {
7
+ CameraKind,
8
+ LightKind,
9
+ MaterialKind,
10
+ TextureCreateMode,
11
+ } from '../../types/kinds';
12
+ import type { JsonObject, JsonValue } from '../../types/json';
13
+
14
+ /** Transform component data used to position entities. */
15
+ export interface TransformProps {
16
+ position?: [number, number, number];
17
+ rotation?: [number, number, number, number];
18
+ scale?: [number, number, number];
19
+ layerMask?: number;
20
+ visible?: boolean;
21
+ }
22
+
23
+ /** Fully-resolved transform component stored in the ECS. */
24
+ export interface TransformComponent extends Required<Omit<TransformProps, never>> {
25
+ type: 'Transform';
26
+ }
27
+
28
+ /** Parent link data used for hierarchical transforms. */
29
+ export interface ParentProps {
30
+ parentId: number;
31
+ }
32
+
33
+ /** Parent component stored in the ECS. */
34
+ export interface ParentComponent extends ParentProps {
35
+ type: 'Parent';
36
+ }
37
+
38
+ /** Camera component configuration. */
39
+ export interface CameraProps {
40
+ kind?: CameraKind;
41
+ near?: number;
42
+ far?: number;
43
+ order?: number;
44
+ viewPosition?: ViewPosition;
45
+ orthoScale?: number;
46
+ }
47
+
48
+ /** Camera component stored in the ECS. */
49
+ export interface CameraComponent extends Required<Omit<CameraProps, 'viewPosition'>> {
50
+ type: 'Camera';
51
+ id: number;
52
+ viewPosition?: ViewPosition;
53
+ skipUpdate?: boolean;
54
+ }
55
+
56
+ /** Light component configuration. */
57
+ export interface LightProps {
58
+ kind?: LightKind;
59
+ color?: [number, number, number];
60
+ intensity?: number;
61
+ range?: number;
62
+ castShadow?: boolean;
63
+ direction?: [number, number, number];
64
+ spotInnerOuter?: [number, number];
65
+ }
66
+
67
+ /** Light component stored in the ECS. */
68
+ export interface LightComponent extends Required<Omit<LightProps, never>> {
69
+ type: 'Light';
70
+ id: number;
71
+ skipUpdate?: boolean;
72
+ }
73
+
74
+ /** Model component configuration. */
75
+ export interface ModelProps {
76
+ geometryId: number;
77
+ materialId?: number;
78
+ castShadow?: boolean;
79
+ receiveShadow?: boolean;
80
+ castOutline?: boolean;
81
+ outlineColor?: [number, number, number, number];
82
+ }
83
+
84
+ /** Model component stored in the ECS. */
85
+ export interface ModelComponent extends Required<Omit<ModelProps, 'materialId'>> {
86
+ type: 'Model';
87
+ id: number;
88
+ materialId?: number;
89
+ skipUpdate?: boolean;
90
+ }
91
+
92
+ /** Tag component configuration. */
93
+ export interface TagProps {
94
+ name?: string;
95
+ labels?: string[];
96
+ }
97
+
98
+ /** Tag component stored in the ECS. */
99
+ export interface TagComponent {
100
+ type: 'Tag';
101
+ name: string;
102
+ labels: Set<string>;
103
+ }
104
+
105
+ /** InputState: Stores the current input state for a world. */
106
+ export interface InputStateComponent {
107
+ type: 'InputState';
108
+ keysPressed: Set<number>;
109
+ keysJustPressed: Set<number>;
110
+ keysJustReleased: Set<number>;
111
+ pointerButtons: Set<number>;
112
+ pointerPosition: [number, number];
113
+ pointerDelta: [number, number];
114
+ pointerJustPressed: Set<number>;
115
+ pointerJustReleased: Set<number>;
116
+ pointerWindowId?: number;
117
+ pointerWindowSize?: [number, number];
118
+ pointerTargetId?: number;
119
+ pointerPositionTarget?: [number, number];
120
+ pointerTargetSize?: [number, number];
121
+ pointerTargetUv?: [number, number];
122
+ pointerTargetDelta?: [number, number];
123
+ scrollDelta: [number, number];
124
+ imeEnabled: boolean;
125
+ imePreeditText?: string;
126
+ imeCursorRange?: [number, number];
127
+ imeCommitText?: string;
128
+ }
129
+
130
+ /** WindowState: Stores window events and state. */
131
+ export interface WindowStateComponent {
132
+ type: 'WindowState';
133
+ focused: boolean;
134
+ size: [number, number];
135
+ position: [number, number];
136
+ scaleFactor: number;
137
+ closeRequested: boolean;
138
+ resizedThisFrame: boolean;
139
+ movedThisFrame: boolean;
140
+ focusChangedThisFrame: boolean;
141
+ }
142
+
143
+ /** Gamepad state mirrored from core gamepad events. */
144
+ export interface GamepadStateComponent {
145
+ type: 'GamepadState';
146
+ connected: Map<number, { name: string }>;
147
+ buttons: Map<number, Map<number, { pressed: boolean; value: number }>>;
148
+ axes: Map<number, Map<number, number>>;
149
+ eventsThisFrame: GamepadEvent[];
150
+ }
151
+
152
+ /** System events mirrored for host-level integrations. */
153
+ export interface SystemEventStateComponent {
154
+ type: 'SystemEventState';
155
+ eventsThisFrame: SystemEvent[];
156
+ lastError?: {
157
+ scope: string;
158
+ message: string;
159
+ commandId?: number;
160
+ commandType?: string;
161
+ };
162
+ }
163
+
164
+ /** UI events mirrored from core UI event channel. */
165
+ export interface UiEventStateComponent {
166
+ type: 'UiEventState';
167
+ eventsThisFrame: UiEvent[];
168
+ }
169
+
170
+ /** Focus traversal behavior when reaching first/last input. */
171
+ export type UiFocusCycleMode = 'wrap' | 'clamp';
172
+
173
+ /** Form scope state used to control focus traversal. */
174
+ export interface UiFormScope {
175
+ formId: string;
176
+ windowId: number;
177
+ realmId: number;
178
+ documentId: number;
179
+ disabled: boolean;
180
+ cycleMode: UiFocusCycleMode;
181
+ activeFieldsetId?: string;
182
+ activeNodeId?: number;
183
+ }
184
+
185
+ /** Fieldset scope metadata. */
186
+ export interface UiFieldsetScope {
187
+ formId: string;
188
+ fieldsetId: string;
189
+ disabled: boolean;
190
+ legendNodeId?: number;
191
+ }
192
+
193
+ /** Focusable node metadata for tab ordering. */
194
+ export interface UiFocusableNode {
195
+ formId: string;
196
+ nodeId: number;
197
+ tabIndex: number;
198
+ fieldsetId?: string;
199
+ disabled: boolean;
200
+ orderHint: number;
201
+ }
202
+
203
+ /** UI runtime state mirrored in the ECS world. */
204
+ export interface UiStateComponent {
205
+ type: 'UiState';
206
+ forms: Map<string, UiFormScope>;
207
+ fieldsets: Map<string, UiFieldsetScope>;
208
+ nodes: Map<number, UiFocusableNode>;
209
+ focusByWindow: Map<number, { formId: string; nodeId: number }>;
210
+ }
211
+
212
+ /** Base properties shared by resources. */
213
+ export interface BaseResourceProps {
214
+ label?: string;
215
+ }
216
+
217
+ /** Material resource configuration. */
218
+ export interface MaterialProps extends BaseResourceProps {
219
+ kind: MaterialKind;
220
+ options: MaterialOptions;
221
+ }
222
+
223
+ /** Options for cube primitive geometry. */
224
+ export interface CubeOptions {
225
+ size?: [number, number, number];
226
+ }
227
+
228
+ /** Options for plane primitive geometry. */
229
+ export interface PlaneOptions {
230
+ size?: [number, number, number];
231
+ subdivisions?: number;
232
+ }
233
+
234
+ /** Options for sphere primitive geometry. */
235
+ export interface SphereOptions {
236
+ radius?: number;
237
+ sectors?: number;
238
+ stacks?: number;
239
+ }
240
+
241
+ /** Options for cylinder primitive geometry. */
242
+ export interface CylinderOptions {
243
+ radius?: number;
244
+ height?: number;
245
+ sectors?: number;
246
+ segments?: number;
247
+ }
248
+
249
+ /** Options for torus primitive geometry. */
250
+ export interface TorusOptions {
251
+ majorRadius?: number;
252
+ minorRadius?: number;
253
+ majorSegments?: number;
254
+ minorSegments?: number;
255
+ radialSegments?: number;
256
+ tubularSegments?: number;
257
+ }
258
+
259
+ /** Options for pyramid primitive geometry. */
260
+ export interface PyramidOptions {
261
+ size?: [number, number, number];
262
+ subdivisions?: number;
263
+ }
264
+
265
+ /** Geometry resource configuration (primitive or custom). */
266
+ export type GeometryProps = BaseResourceProps & (
267
+ | {
268
+ type: 'custom';
269
+ entries: GeometryPrimitiveEntry[];
270
+ }
271
+ | ({ type: 'primitive' } & (
272
+ | { shape: 'cube'; options?: CubeOptions }
273
+ | { shape: 'plane'; options?: PlaneOptions }
274
+ | { shape: 'sphere'; options?: SphereOptions }
275
+ | { shape: 'cylinder'; options?: CylinderOptions }
276
+ | { shape: 'torus'; options?: TorusOptions }
277
+ | { shape: 'pyramid'; options?: PyramidOptions }
278
+ ))
279
+ );
280
+
281
+ /** Texture resource configuration. */
282
+ export interface TextureProps extends BaseResourceProps {
283
+ srgb?: boolean;
284
+ mode?: TextureCreateMode;
285
+ atlasOptions?: ForwardAtlasOptions;
286
+ source:
287
+ | { type: 'buffer'; bufferId: number }
288
+ | { type: 'color'; color: [number, number, number, number] };
289
+ }
290
+
291
+ /** Custom component payload stored in the ECS. */
292
+ export interface CustomComponent {
293
+ type: string;
294
+ data: JsonObject;
295
+ }
296
+
297
+ /** Union of all built-in component types. */
298
+ export type Component =
299
+ | TransformComponent
300
+ | ParentComponent
301
+ | CameraComponent
302
+ | LightComponent
303
+ | ModelComponent
304
+ | TagComponent
305
+ | InputStateComponent
306
+ | WindowStateComponent
307
+ | GamepadStateComponent
308
+ | SystemEventStateComponent
309
+ | UiEventStateComponent
310
+ | UiStateComponent
311
+ | CustomComponent;
312
+
313
+ /** String literal type for component identifiers. */
314
+ export type ComponentType = Component['type'];
315
+
316
+ /** Supported property types for custom schemas. */
317
+ export type PropertyType =
318
+ | 'number'
319
+ | 'string'
320
+ | 'boolean'
321
+ | 'vec2'
322
+ | 'vec3'
323
+ | 'vec4'
324
+ | 'quat'
325
+ | 'entity'
326
+ | 'resource'
327
+ | 'array'
328
+ | 'object';
329
+
330
+ /** Schema entry describing a custom component field. */
331
+ export interface SchemaProperty {
332
+ type: PropertyType;
333
+ default?: JsonValue;
334
+ optional?: boolean;
335
+ }
336
+
337
+ /** Schema definition for a custom component. */
338
+ export interface ComponentSchema {
339
+ [key: string]: SchemaProperty;
340
+ }