@vulfram/engine 0.14.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.
- package/README.md +106 -0
- package/package.json +55 -4
- package/src/core.ts +14 -0
- package/src/ecs.ts +1 -0
- package/src/engine/api.ts +234 -23
- package/src/engine/bridge/dispatch.ts +265 -40
- package/src/engine/bridge/guards.ts +4 -1
- package/src/engine/bridge/protocol.ts +69 -52
- package/src/engine/ecs/index.ts +185 -42
- package/src/engine/state.ts +133 -2
- package/src/engine/systems/command-intent.ts +153 -3
- package/src/engine/systems/constraint-solve.ts +167 -0
- package/src/engine/systems/core-command-builder.ts +9 -268
- package/src/engine/systems/diagnostics.ts +20 -19
- package/src/engine/systems/index.ts +3 -1
- package/src/engine/systems/input-mirror.ts +101 -3
- package/src/engine/systems/resource-upload.ts +96 -44
- package/src/engine/systems/response-decode.ts +69 -15
- package/src/engine/systems/scene-sync.ts +306 -0
- package/src/engine/systems/ui-bridge.ts +360 -0
- package/src/engine/systems/utils.ts +43 -1
- package/src/engine/systems/world-lifecycle.ts +37 -102
- package/src/engine/window/manager.ts +168 -0
- package/src/engine/world/entities.ts +821 -78
- package/src/engine/world/mount.ts +174 -0
- package/src/engine/world/types.ts +71 -0
- package/src/engine/world/world-ui.ts +266 -0
- package/src/engine/world/world3d.ts +280 -0
- package/src/index.ts +30 -1
- package/src/mount.ts +2 -0
- package/src/types/cmds/audio.ts +73 -48
- package/src/types/cmds/camera.ts +12 -8
- package/src/types/cmds/environment.ts +9 -3
- package/src/types/cmds/geometry.ts +13 -14
- package/src/types/cmds/index.ts +198 -168
- package/src/types/cmds/light.ts +12 -11
- package/src/types/cmds/material.ts +9 -11
- package/src/types/cmds/model.ts +17 -15
- package/src/types/cmds/realm.ts +25 -0
- package/src/types/cmds/system.ts +19 -0
- package/src/types/cmds/target.ts +82 -0
- package/src/types/cmds/texture.ts +13 -3
- package/src/types/cmds/ui.ts +220 -0
- package/src/types/cmds/window.ts +41 -204
- package/src/types/events/index.ts +4 -1
- package/src/types/events/pointer.ts +42 -13
- package/src/types/events/system.ts +144 -30
- package/src/types/events/ui.ts +21 -0
- package/src/types/index.ts +1 -0
- package/src/types/json.ts +15 -0
- package/src/window.ts +8 -0
- package/src/world-ui.ts +2 -0
- package/src/world3d.ts +10 -0
- package/tsconfig.json +0 -29
|
@@ -1,33 +1,63 @@
|
|
|
1
1
|
import type { ElementState, TouchPhase } from '../kinds';
|
|
2
2
|
|
|
3
|
-
/** Scroll delta reported in line or pixel units. */
|
|
4
3
|
export type ScrollDelta =
|
|
5
4
|
| { type: 'line'; value: [number, number] }
|
|
6
5
|
| { type: 'pixel'; value: [number, number] };
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
export type PointerTraceStage =
|
|
8
|
+
| 'root-window'
|
|
9
|
+
| 'capture'
|
|
10
|
+
| 'focus-fallback'
|
|
11
|
+
| 'connector-hit'
|
|
12
|
+
| 'realm-plane-hit'
|
|
13
|
+
| 'hop-forward'
|
|
14
|
+
| 'stop-no-hit'
|
|
15
|
+
| 'stop-cycle'
|
|
16
|
+
| 'stop-step-budget';
|
|
17
|
+
|
|
18
|
+
export interface PointerTraceHop {
|
|
19
|
+
stage: PointerTraceStage;
|
|
20
|
+
realmId?: number;
|
|
21
|
+
targetId?: number;
|
|
22
|
+
layerRealmId?: number;
|
|
23
|
+
connectorId?: number;
|
|
24
|
+
surfaceId?: number;
|
|
25
|
+
cameraId?: number;
|
|
26
|
+
uv?: [number, number];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PointerEventTrace {
|
|
30
|
+
windowId: number;
|
|
31
|
+
realmId: number;
|
|
32
|
+
targetId?: number;
|
|
33
|
+
connectorId?: number;
|
|
34
|
+
sourceRealmId?: number;
|
|
35
|
+
uv?: [number, number];
|
|
36
|
+
hops: PointerTraceHop[];
|
|
37
|
+
}
|
|
38
|
+
|
|
9
39
|
export interface PointerEventOnMoveData {
|
|
10
40
|
windowId: number;
|
|
11
41
|
pointerType: number;
|
|
12
42
|
pointerId: number;
|
|
13
43
|
position: [number, number];
|
|
44
|
+
trace?: PointerEventTrace;
|
|
14
45
|
}
|
|
15
46
|
|
|
16
|
-
/** Payload for pointer enter event. */
|
|
17
47
|
export interface PointerEventOnEnterData {
|
|
18
48
|
windowId: number;
|
|
19
49
|
pointerType: number;
|
|
20
50
|
pointerId: number;
|
|
51
|
+
trace?: PointerEventTrace;
|
|
21
52
|
}
|
|
22
53
|
|
|
23
|
-
/** Payload for pointer leave event. */
|
|
24
54
|
export interface PointerEventOnLeaveData {
|
|
25
55
|
windowId: number;
|
|
26
56
|
pointerType: number;
|
|
27
57
|
pointerId: number;
|
|
58
|
+
trace?: PointerEventTrace;
|
|
28
59
|
}
|
|
29
60
|
|
|
30
|
-
/** Payload for pointer button event. */
|
|
31
61
|
export interface PointerEventOnButtonData {
|
|
32
62
|
windowId: number;
|
|
33
63
|
pointerType: number;
|
|
@@ -35,51 +65,51 @@ export interface PointerEventOnButtonData {
|
|
|
35
65
|
button: MouseButton;
|
|
36
66
|
state: ElementState;
|
|
37
67
|
position: [number, number];
|
|
68
|
+
trace?: PointerEventTrace;
|
|
38
69
|
}
|
|
39
70
|
|
|
40
|
-
/** Payload for pointer scroll event. */
|
|
41
71
|
export interface PointerEventOnScrollData {
|
|
42
72
|
windowId: number;
|
|
43
73
|
delta: ScrollDelta;
|
|
44
74
|
phase: TouchPhase;
|
|
75
|
+
trace?: PointerEventTrace;
|
|
45
76
|
}
|
|
46
77
|
|
|
47
|
-
/** Payload for touch event. */
|
|
48
78
|
export interface PointerEventOnTouchData {
|
|
49
79
|
windowId: number;
|
|
50
80
|
pointerId: number;
|
|
51
81
|
phase: TouchPhase;
|
|
52
82
|
position: [number, number];
|
|
53
83
|
pressure?: number;
|
|
84
|
+
trace?: PointerEventTrace;
|
|
54
85
|
}
|
|
55
86
|
|
|
56
|
-
/** Payload for pinch gesture event. */
|
|
57
87
|
export interface PointerEventOnPinchGestureData {
|
|
58
88
|
windowId: number;
|
|
59
89
|
delta: number;
|
|
60
90
|
phase: TouchPhase;
|
|
91
|
+
trace?: PointerEventTrace;
|
|
61
92
|
}
|
|
62
93
|
|
|
63
|
-
/** Payload for pan gesture event. */
|
|
64
94
|
export interface PointerEventOnPanGestureData {
|
|
65
95
|
windowId: number;
|
|
66
96
|
delta: [number, number];
|
|
67
97
|
phase: TouchPhase;
|
|
98
|
+
trace?: PointerEventTrace;
|
|
68
99
|
}
|
|
69
100
|
|
|
70
|
-
/** Payload for rotation gesture event. */
|
|
71
101
|
export interface PointerEventOnRotationGestureData {
|
|
72
102
|
windowId: number;
|
|
73
103
|
delta: number;
|
|
74
104
|
phase: TouchPhase;
|
|
105
|
+
trace?: PointerEventTrace;
|
|
75
106
|
}
|
|
76
107
|
|
|
77
|
-
/** Payload for double tap gesture event. */
|
|
78
108
|
export interface PointerEventOnDoubleTapGestureData {
|
|
79
109
|
windowId: number;
|
|
110
|
+
trace?: PointerEventTrace;
|
|
80
111
|
}
|
|
81
112
|
|
|
82
|
-
/** Discriminated union of pointer events. */
|
|
83
113
|
export type PointerEvent =
|
|
84
114
|
| { event: 'on-move'; data: PointerEventOnMoveData }
|
|
85
115
|
| { event: 'on-enter'; data: PointerEventOnEnterData }
|
|
@@ -95,7 +125,6 @@ export type PointerEvent =
|
|
|
95
125
|
data: PointerEventOnDoubleTapGestureData;
|
|
96
126
|
};
|
|
97
127
|
|
|
98
|
-
/** Mouse button identifiers. */
|
|
99
128
|
export enum MouseButton {
|
|
100
129
|
Left = 0,
|
|
101
130
|
Right = 1,
|
|
@@ -1,42 +1,156 @@
|
|
|
1
|
-
|
|
2
|
-
export interface SystemEventOnNotificationData {
|
|
3
|
-
id: string;
|
|
4
|
-
}
|
|
1
|
+
import type { CursorGrabMode } from '../kinds';
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
export interface SystemEventTextureReadyData {
|
|
8
|
-
window_id: number;
|
|
9
|
-
texture_id: number;
|
|
10
|
-
success: boolean;
|
|
11
|
-
message: string;
|
|
12
|
-
}
|
|
3
|
+
export type PointerTraceLevel = 'off' | 'errors' | 'basic' | 'full';
|
|
13
4
|
|
|
14
|
-
|
|
15
|
-
export interface SystemEventAudioReadyData {
|
|
16
|
-
resource_id: number;
|
|
17
|
-
success: boolean;
|
|
18
|
-
message: string;
|
|
19
|
-
}
|
|
5
|
+
export type UiViewportClass = 'root' | 'deferred' | 'immediate' | 'embedded';
|
|
20
6
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
7
|
+
export type UiViewportCommand =
|
|
8
|
+
| { type: 'close' }
|
|
9
|
+
| { type: 'title'; content: { title: string } }
|
|
10
|
+
| { type: 'inner-size'; content: { width: number; height: number } }
|
|
11
|
+
| { type: 'outer-position'; content: { x: number; y: number } }
|
|
12
|
+
| { type: 'resizable'; content: { value: boolean } }
|
|
13
|
+
| { type: 'decorations'; content: { value: boolean } }
|
|
14
|
+
| { type: 'fullscreen'; content: { value: boolean } }
|
|
15
|
+
| { type: 'minimized'; content: { value: boolean } }
|
|
16
|
+
| { type: 'maximized'; content: { value: boolean } }
|
|
17
|
+
| { type: 'focus' }
|
|
18
|
+
| { type: 'screenshot' }
|
|
19
|
+
| { type: 'cursor-visible'; content: { value: boolean } }
|
|
20
|
+
| { type: 'cursor-grab'; content: { mode: CursorGrabMode } }
|
|
21
|
+
| { type: 'ime-allowed'; content: { value: boolean } }
|
|
22
|
+
| {
|
|
23
|
+
type: 'ime-rect';
|
|
24
|
+
content: { minX: number; minY: number; maxX: number; maxY: number };
|
|
25
|
+
};
|
|
28
26
|
|
|
29
|
-
/** Discriminated union of system-level events. */
|
|
30
27
|
export type SystemEvent =
|
|
28
|
+
| {
|
|
29
|
+
event: 'error';
|
|
30
|
+
data: {
|
|
31
|
+
scope: string;
|
|
32
|
+
message: string;
|
|
33
|
+
commandId?: number;
|
|
34
|
+
commandType?: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
31
37
|
| { event: 'on-resume' }
|
|
32
38
|
| { event: 'on-suspend' }
|
|
33
39
|
| { event: 'on-memory-warning' }
|
|
34
40
|
| { event: 'on-exit' }
|
|
35
|
-
| { event: 'on-notification-clicked'; data:
|
|
36
|
-
| { event: 'on-notification-dismissed'; data:
|
|
37
|
-
| {
|
|
38
|
-
|
|
41
|
+
| { event: 'on-notification-clicked'; data: { id: string } }
|
|
42
|
+
| { event: 'on-notification-dismissed'; data: { id: string } }
|
|
43
|
+
| {
|
|
44
|
+
event: 'texture-ready';
|
|
45
|
+
data: { windowId: number; textureId: number; success: boolean; message: string };
|
|
46
|
+
}
|
|
47
|
+
| {
|
|
48
|
+
event: 'texture-processing-started';
|
|
49
|
+
data: { windowId: number; textureId: number; totalBytes: number };
|
|
50
|
+
}
|
|
51
|
+
| {
|
|
52
|
+
event: 'texture-processing-progress';
|
|
53
|
+
data: {
|
|
54
|
+
windowId: number;
|
|
55
|
+
textureId: number;
|
|
56
|
+
processedBytes: number;
|
|
57
|
+
totalBytes: number;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
| {
|
|
61
|
+
event: 'texture-processing-finished';
|
|
62
|
+
data: {
|
|
63
|
+
windowId: number;
|
|
64
|
+
textureId: number;
|
|
65
|
+
success: boolean;
|
|
66
|
+
message: string;
|
|
67
|
+
totalBytes: number;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
| {
|
|
71
|
+
event: 'ui-image-ready';
|
|
72
|
+
data: { imageId: number; success: boolean; message: string };
|
|
73
|
+
}
|
|
74
|
+
| {
|
|
75
|
+
event: 'ui-image-processing-started';
|
|
76
|
+
data: { imageId: number; totalBytes: number };
|
|
77
|
+
}
|
|
78
|
+
| {
|
|
79
|
+
event: 'ui-image-processing-progress';
|
|
80
|
+
data: { imageId: number; processedBytes: number; totalBytes: number };
|
|
81
|
+
}
|
|
82
|
+
| {
|
|
83
|
+
event: 'ui-image-processing-finished';
|
|
84
|
+
data: {
|
|
85
|
+
imageId: number;
|
|
86
|
+
success: boolean;
|
|
87
|
+
message: string;
|
|
88
|
+
totalBytes: number;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
| {
|
|
92
|
+
event: 'audio-ready';
|
|
93
|
+
data: { resourceId: number; success: boolean; message: string };
|
|
94
|
+
}
|
|
39
95
|
| {
|
|
40
96
|
event: 'audio-stream-progress';
|
|
41
|
-
data:
|
|
97
|
+
data: {
|
|
98
|
+
resourceId: number;
|
|
99
|
+
receivedBytes: number;
|
|
100
|
+
totalBytes: number;
|
|
101
|
+
complete: boolean;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
| {
|
|
105
|
+
event: 'ui-open-url';
|
|
106
|
+
data: { windowId: number; realmId: number; url: string; newTab: boolean };
|
|
107
|
+
}
|
|
108
|
+
| {
|
|
109
|
+
event: 'ui-clipboard-set-text';
|
|
110
|
+
data: { windowId: number; realmId: number; text: string };
|
|
111
|
+
}
|
|
112
|
+
| {
|
|
113
|
+
event: 'ui-clipboard-request-copy';
|
|
114
|
+
data: { windowId: number; realmId: number };
|
|
115
|
+
}
|
|
116
|
+
| {
|
|
117
|
+
event: 'ui-clipboard-request-cut';
|
|
118
|
+
data: { windowId: number; realmId: number };
|
|
119
|
+
}
|
|
120
|
+
| {
|
|
121
|
+
event: 'ui-clipboard-request-paste';
|
|
122
|
+
data: { windowId: number; realmId: number };
|
|
123
|
+
}
|
|
124
|
+
| {
|
|
125
|
+
event: 'ui-screenshot-request';
|
|
126
|
+
data: { windowId: number; realmId: number };
|
|
127
|
+
}
|
|
128
|
+
| {
|
|
129
|
+
event: 'ui-viewport-sync';
|
|
130
|
+
data: {
|
|
131
|
+
windowId: number;
|
|
132
|
+
realmId: number;
|
|
133
|
+
viewportId: number;
|
|
134
|
+
parentViewportId?: number;
|
|
135
|
+
class: UiViewportClass;
|
|
136
|
+
title?: string;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
| {
|
|
140
|
+
event: 'ui-viewport-command';
|
|
141
|
+
data: {
|
|
142
|
+
windowId: number;
|
|
143
|
+
realmId: number;
|
|
144
|
+
viewportId: number;
|
|
145
|
+
command: UiViewportCommand;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
| {
|
|
149
|
+
event: 'ui-viewport-fallback-embedded';
|
|
150
|
+
data: {
|
|
151
|
+
windowId: number;
|
|
152
|
+
realmId: number;
|
|
153
|
+
viewportId: number;
|
|
154
|
+
parentViewportId?: number;
|
|
155
|
+
};
|
|
42
156
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type UiEventKind =
|
|
2
|
+
| 'click'
|
|
3
|
+
| 'double-click'
|
|
4
|
+
| 'pressed'
|
|
5
|
+
| 'released'
|
|
6
|
+
| 'hover-enter'
|
|
7
|
+
| 'hover-leave'
|
|
8
|
+
| 'changed'
|
|
9
|
+
| 'change-commit'
|
|
10
|
+
| 'focus'
|
|
11
|
+
| 'blur'
|
|
12
|
+
| 'submit'
|
|
13
|
+
| 'anim-complete';
|
|
14
|
+
|
|
15
|
+
export interface UiEvent {
|
|
16
|
+
realmId: number;
|
|
17
|
+
documentId: number;
|
|
18
|
+
nodeId: number;
|
|
19
|
+
kind: UiEventKind;
|
|
20
|
+
label?: string;
|
|
21
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-like values that are safe to serialize across the host/core boundary.
|
|
3
|
+
*/
|
|
4
|
+
export type JsonValue =
|
|
5
|
+
| null
|
|
6
|
+
| boolean
|
|
7
|
+
| number
|
|
8
|
+
| string
|
|
9
|
+
| JsonValue[]
|
|
10
|
+
| { [key: string]: JsonValue };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convenience alias for object-shaped JSON payloads.
|
|
14
|
+
*/
|
|
15
|
+
export type JsonObject = { [key: string]: JsonValue };
|
package/src/window.ts
ADDED
package/src/world-ui.ts
ADDED
package/src/world3d.ts
ADDED
package/tsconfig.json
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
// Environment setup & latest features
|
|
4
|
-
"lib": ["ESNext"],
|
|
5
|
-
"target": "ESNext",
|
|
6
|
-
"module": "Preserve",
|
|
7
|
-
"moduleDetection": "force",
|
|
8
|
-
"jsx": "react-jsx",
|
|
9
|
-
"allowJs": true,
|
|
10
|
-
|
|
11
|
-
// Bundler mode
|
|
12
|
-
"moduleResolution": "bundler",
|
|
13
|
-
"allowImportingTsExtensions": true,
|
|
14
|
-
"verbatimModuleSyntax": true,
|
|
15
|
-
"noEmit": true,
|
|
16
|
-
|
|
17
|
-
// Best practices
|
|
18
|
-
"strict": true,
|
|
19
|
-
"skipLibCheck": true,
|
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"noUncheckedIndexedAccess": true,
|
|
22
|
-
"noImplicitOverride": true,
|
|
23
|
-
|
|
24
|
-
// Some stricter flags (disabled by default)
|
|
25
|
-
"noUnusedLocals": false,
|
|
26
|
-
"noUnusedParameters": false,
|
|
27
|
-
"noPropertyAccessFromIndexSignature": false
|
|
28
|
-
}
|
|
29
|
-
}
|