@fps-games/editor 0.1.0
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/dist/authoring-apply.d.ts +21 -0
- package/dist/authoring-apply.d.ts.map +1 -0
- package/dist/authoring-apply.js +45 -0
- package/dist/authoring-apply.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +539 -0
- package/dist/index.js.map +1 -0
- package/dist/local-editor-harness.d.ts +173 -0
- package/dist/local-editor-harness.d.ts.map +1 -0
- package/dist/local-editor-harness.js +969 -0
- package/dist/local-editor-harness.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/camera-controller.d.ts +20 -0
- package/node_modules/@fps-games/editor-babylon/dist/camera-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/camera-controller.js +239 -0
- package/node_modules/@fps-games/editor-babylon/dist/camera-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/edit-session.d.ts +30 -0
- package/node_modules/@fps-games/editor-babylon/dist/edit-session.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/edit-session.js +297 -0
- package/node_modules/@fps-games/editor-babylon/dist/edit-session.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/editor-world.d.ts +30 -0
- package/node_modules/@fps-games/editor-babylon/dist/editor-world.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/editor-world.js +67 -0
- package/node_modules/@fps-games/editor-babylon/dist/editor-world.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/event-guard.d.ts +13 -0
- package/node_modules/@fps-games/editor-babylon/dist/event-guard.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/event-guard.js +101 -0
- package/node_modules/@fps-games/editor-babylon/dist/event-guard.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/index.d.ts +19 -0
- package/node_modules/@fps-games/editor-babylon/dist/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/index.js +18 -0
- package/node_modules/@fps-games/editor-babylon/dist/index.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/input-controller.d.ts +3 -0
- package/node_modules/@fps-games/editor-babylon/dist/input-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/input-controller.js +182 -0
- package/node_modules/@fps-games/editor-babylon/dist/input-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-adapter.d.ts +13 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-adapter.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-adapter.js +94 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-adapter.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-host.d.ts +43 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-host.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-host.js +510 -0
- package/node_modules/@fps-games/editor-babylon/dist/inspector-host.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/legacy-runtime.d.ts +5 -0
- package/node_modules/@fps-games/editor-babylon/dist/legacy-runtime.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/legacy-runtime.js +5 -0
- package/node_modules/@fps-games/editor-babylon/dist/legacy-runtime.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/material-property-adapter.d.ts +22 -0
- package/node_modules/@fps-games/editor-babylon/dist/material-property-adapter.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/material-property-adapter.js +408 -0
- package/node_modules/@fps-games/editor-babylon/dist/material-property-adapter.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/monitor.d.ts +39 -0
- package/node_modules/@fps-games/editor-babylon/dist/monitor.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/monitor.js +780 -0
- package/node_modules/@fps-games/editor-babylon/dist/monitor.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/outline-adapter.d.ts +37 -0
- package/node_modules/@fps-games/editor-babylon/dist/outline-adapter.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/outline-adapter.js +268 -0
- package/node_modules/@fps-games/editor-babylon/dist/outline-adapter.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection-selection-controller.d.ts +34 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection-selection-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection-selection-controller.js +221 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection-selection-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +90 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection.js +479 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/runtime-globals.d.ts +3 -0
- package/node_modules/@fps-games/editor-babylon/dist/runtime-globals.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/runtime-globals.js +7 -0
- package/node_modules/@fps-games/editor-babylon/dist/runtime-globals.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts +18 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js +213 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-input-controller.d.ts +36 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-input-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-input-controller.js +272 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-input-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/selection-controller.d.ts +27 -0
- package/node_modules/@fps-games/editor-babylon/dist/selection-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/selection-controller.js +308 -0
- package/node_modules/@fps-games/editor-babylon/dist/selection-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/tool-controller.d.ts +17 -0
- package/node_modules/@fps-games/editor-babylon/dist/tool-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/tool-controller.js +83 -0
- package/node_modules/@fps-games/editor-babylon/dist/tool-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts +47 -0
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js +689 -0
- package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/types.d.ts +111 -0
- package/node_modules/@fps-games/editor-babylon/dist/types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-babylon/dist/types.js +2 -0
- package/node_modules/@fps-games/editor-babylon/dist/types.js.map +1 -0
- package/node_modules/@fps-games/editor-babylon/package.json +25 -0
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts +28 -0
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/index.js +54 -0
- package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.d.ts +12 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.js +80 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-input-router.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panel-registry.d.ts +11 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panel-registry.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panel-registry.js +33 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panel-registry.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts +9 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js +444 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.d.ts +21 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js +103 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shared.d.ts +12 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shared.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shared.js +123 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shared.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shortcuts.d.ts +2 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shortcuts.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shortcuts.js +115 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-shortcuts.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-theme.d.ts +3 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-theme.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-theme.js +68 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-theme.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +183 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js +2 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts +58 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js +136 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +4 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +589 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/package.json +16 -0
- package/node_modules/@fps-games/editor-core/dist/authoring-source.d.ts +211 -0
- package/node_modules/@fps-games/editor-core/dist/authoring-source.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/authoring-source.js +511 -0
- package/node_modules/@fps-games/editor-core/dist/authoring-source.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts +132 -0
- package/node_modules/@fps-games/editor-core/dist/editor-session.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/editor-session.js +265 -0
- package/node_modules/@fps-games/editor-core/dist/editor-session.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/host-services.d.ts +24 -0
- package/node_modules/@fps-games/editor-core/dist/host-services.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/host-services.js +2 -0
- package/node_modules/@fps-games/editor-core/dist/host-services.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/index.d.ts +106 -0
- package/node_modules/@fps-games/editor-core/dist/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/index.js +217 -0
- package/node_modules/@fps-games/editor-core/dist/index.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/scene-graph.d.ts +44 -0
- package/node_modules/@fps-games/editor-core/dist/scene-graph.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/scene-graph.js +86 -0
- package/node_modules/@fps-games/editor-core/dist/scene-graph.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/scene-view-input.d.ts +41 -0
- package/node_modules/@fps-games/editor-core/dist/scene-view-input.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/scene-view-input.js +2 -0
- package/node_modules/@fps-games/editor-core/dist/scene-view-input.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/serialized-object.d.ts +53 -0
- package/node_modules/@fps-games/editor-core/dist/serialized-object.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/serialized-object.js +32 -0
- package/node_modules/@fps-games/editor-core/dist/serialized-object.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/transform-gizmo.d.ts +48 -0
- package/node_modules/@fps-games/editor-core/dist/transform-gizmo.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/transform-gizmo.js +2 -0
- package/node_modules/@fps-games/editor-core/dist/transform-gizmo.js.map +1 -0
- package/node_modules/@fps-games/editor-core/package.json +19 -0
- package/node_modules/@fps-games/editor-forge-play/dist/index.d.ts +46 -0
- package/node_modules/@fps-games/editor-forge-play/dist/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-forge-play/dist/index.js +156 -0
- package/node_modules/@fps-games/editor-forge-play/dist/index.js.map +1 -0
- package/node_modules/@fps-games/editor-forge-play/package.json +19 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.d.ts +239 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.js +54 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.js.map +1 -0
- package/node_modules/@fps-games/editor-protocol/package.json +16 -0
- package/package.json +40 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type SceneGraphNodeId = string;
|
|
2
|
+
export type SceneGraphDropPlacement = 'inside' | 'before' | 'after';
|
|
3
|
+
export interface SceneGraphTreeItem {
|
|
4
|
+
id: SceneGraphNodeId;
|
|
5
|
+
label: string;
|
|
6
|
+
parentId?: SceneGraphNodeId | null;
|
|
7
|
+
depth?: number;
|
|
8
|
+
selectable?: boolean;
|
|
9
|
+
locked?: boolean;
|
|
10
|
+
canHaveChildren?: boolean;
|
|
11
|
+
renamable?: boolean;
|
|
12
|
+
deletable?: boolean;
|
|
13
|
+
draggable?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface SceneGraphDropIntent {
|
|
16
|
+
draggedId: SceneGraphNodeId;
|
|
17
|
+
targetId: SceneGraphNodeId;
|
|
18
|
+
placement: SceneGraphDropPlacement;
|
|
19
|
+
preserveWorldTransform?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface SceneGraphRenameIntent {
|
|
22
|
+
id: SceneGraphNodeId;
|
|
23
|
+
name: string;
|
|
24
|
+
}
|
|
25
|
+
export interface SceneGraphCreateGroupIntent {
|
|
26
|
+
parentId?: SceneGraphNodeId | null;
|
|
27
|
+
activeId?: SceneGraphNodeId | null;
|
|
28
|
+
name?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface SceneGraphDeleteIntent {
|
|
31
|
+
ids: SceneGraphNodeId[];
|
|
32
|
+
activeId?: SceneGraphNodeId | null;
|
|
33
|
+
}
|
|
34
|
+
export interface SceneGraphValidationResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function validateSceneGraphRename(items: readonly SceneGraphTreeItem[], intent: SceneGraphRenameIntent): SceneGraphValidationResult;
|
|
39
|
+
export declare function validateSceneGraphDelete(items: readonly SceneGraphTreeItem[], intent: SceneGraphDeleteIntent): SceneGraphValidationResult;
|
|
40
|
+
export declare function validateSceneGraphDrop(items: readonly SceneGraphTreeItem[], intent: SceneGraphDropIntent): SceneGraphValidationResult;
|
|
41
|
+
export declare function findSceneGraphItem(items: readonly SceneGraphTreeItem[], id: SceneGraphNodeId | null | undefined): SceneGraphTreeItem | null;
|
|
42
|
+
export declare function uniqueSceneGraphNodeIds(ids: readonly SceneGraphNodeId[]): SceneGraphNodeId[];
|
|
43
|
+
export declare function isSceneGraphDescendant(items: readonly SceneGraphTreeItem[], candidateId: SceneGraphNodeId, ancestorId: SceneGraphNodeId): boolean;
|
|
44
|
+
//# sourceMappingURL=scene-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-graph.d.ts","sourceRoot":"","sources":["../src/scene-graph.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,gBAAgB,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,uBAAuB,CAAC;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,gBAAgB,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,gBAAgB,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,MAAM,EAAE,sBAAsB,GAC7B,0BAA0B,CAO5B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,MAAM,EAAE,sBAAsB,GAC7B,0BAA0B,CAS5B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,MAAM,EAAE,oBAAoB,GAC3B,0BAA0B,CAgB5B;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,EAAE,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GACtC,kBAAkB,GAAG,IAAI,CAG3B;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAS5F;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAWT"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export function validateSceneGraphRename(items, intent) {
|
|
2
|
+
const item = findSceneGraphItem(items, intent.id);
|
|
3
|
+
if (!item)
|
|
4
|
+
return invalidSceneGraphIntent('missing-node');
|
|
5
|
+
if (item.locked)
|
|
6
|
+
return invalidSceneGraphIntent('node-locked');
|
|
7
|
+
if (item.renamable === false)
|
|
8
|
+
return invalidSceneGraphIntent('node-readonly');
|
|
9
|
+
if (!intent.name.trim())
|
|
10
|
+
return invalidSceneGraphIntent('empty-name');
|
|
11
|
+
return validSceneGraphIntent();
|
|
12
|
+
}
|
|
13
|
+
export function validateSceneGraphDelete(items, intent) {
|
|
14
|
+
if (intent.ids.length === 0)
|
|
15
|
+
return invalidSceneGraphIntent('empty-selection');
|
|
16
|
+
for (const id of uniqueSceneGraphNodeIds(intent.ids)) {
|
|
17
|
+
const item = findSceneGraphItem(items, id);
|
|
18
|
+
if (!item)
|
|
19
|
+
return invalidSceneGraphIntent('missing-node');
|
|
20
|
+
if (item.locked)
|
|
21
|
+
return invalidSceneGraphIntent('node-locked');
|
|
22
|
+
if (item.deletable === false)
|
|
23
|
+
return invalidSceneGraphIntent('node-readonly');
|
|
24
|
+
}
|
|
25
|
+
return validSceneGraphIntent();
|
|
26
|
+
}
|
|
27
|
+
export function validateSceneGraphDrop(items, intent) {
|
|
28
|
+
const dragged = findSceneGraphItem(items, intent.draggedId);
|
|
29
|
+
if (!dragged)
|
|
30
|
+
return invalidSceneGraphIntent('missing-dragged-node');
|
|
31
|
+
if (dragged.locked)
|
|
32
|
+
return invalidSceneGraphIntent('dragged-node-locked');
|
|
33
|
+
if (dragged.draggable === false)
|
|
34
|
+
return invalidSceneGraphIntent('dragged-node-readonly');
|
|
35
|
+
const target = findSceneGraphItem(items, intent.targetId);
|
|
36
|
+
if (!target)
|
|
37
|
+
return invalidSceneGraphIntent('missing-target-node');
|
|
38
|
+
if (target.locked)
|
|
39
|
+
return invalidSceneGraphIntent('target-node-locked');
|
|
40
|
+
if (intent.draggedId === intent.targetId)
|
|
41
|
+
return invalidSceneGraphIntent('cannot-parent-to-self');
|
|
42
|
+
if (intent.placement === 'inside' && target.canHaveChildren === false) {
|
|
43
|
+
return invalidSceneGraphIntent('target-cannot-have-children');
|
|
44
|
+
}
|
|
45
|
+
if (isSceneGraphDescendant(items, intent.targetId, intent.draggedId)) {
|
|
46
|
+
return invalidSceneGraphIntent('cannot-parent-to-descendant');
|
|
47
|
+
}
|
|
48
|
+
return validSceneGraphIntent();
|
|
49
|
+
}
|
|
50
|
+
export function findSceneGraphItem(items, id) {
|
|
51
|
+
if (!id)
|
|
52
|
+
return null;
|
|
53
|
+
return items.find(item => item.id === id) ?? null;
|
|
54
|
+
}
|
|
55
|
+
export function uniqueSceneGraphNodeIds(ids) {
|
|
56
|
+
const result = [];
|
|
57
|
+
const seen = new Set();
|
|
58
|
+
for (const id of ids) {
|
|
59
|
+
if (!id || seen.has(id))
|
|
60
|
+
continue;
|
|
61
|
+
seen.add(id);
|
|
62
|
+
result.push(id);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
export function isSceneGraphDescendant(items, candidateId, ancestorId) {
|
|
67
|
+
const byId = new Map(items.map(item => [item.id, item]));
|
|
68
|
+
let cursor = byId.get(candidateId) ?? null;
|
|
69
|
+
const visited = new Set();
|
|
70
|
+
while (cursor?.parentId) {
|
|
71
|
+
if (cursor.parentId === ancestorId)
|
|
72
|
+
return true;
|
|
73
|
+
if (visited.has(cursor.parentId))
|
|
74
|
+
return false;
|
|
75
|
+
visited.add(cursor.parentId);
|
|
76
|
+
cursor = byId.get(cursor.parentId) ?? null;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
function validSceneGraphIntent() {
|
|
81
|
+
return { ok: true };
|
|
82
|
+
}
|
|
83
|
+
function invalidSceneGraphIntent(reason) {
|
|
84
|
+
return { ok: false, reason };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=scene-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-graph.js","sourceRoot":"","sources":["../src/scene-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type SceneViewPointerButton = 'left' | 'middle' | 'right';
|
|
2
|
+
export type SceneViewPointerIntent = 'selection-click' | 'box-select' | 'gizmo-drag' | 'view-plane-move' | 'orbit' | 'pan' | 'dolly' | 'flythrough';
|
|
3
|
+
export type SceneViewNavigationMode = 'none' | 'orbit' | 'pan' | 'dolly' | 'flythrough';
|
|
4
|
+
export interface SceneViewInputModifiers {
|
|
5
|
+
alt: boolean;
|
|
6
|
+
shift: boolean;
|
|
7
|
+
ctrl: boolean;
|
|
8
|
+
meta: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface SceneViewMouseBinding {
|
|
11
|
+
button: SceneViewPointerButton;
|
|
12
|
+
alt?: boolean;
|
|
13
|
+
shift?: boolean;
|
|
14
|
+
ctrlOrMeta?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface SceneViewPointerState {
|
|
17
|
+
pointerId: number;
|
|
18
|
+
button: SceneViewPointerButton;
|
|
19
|
+
intent: SceneViewPointerIntent;
|
|
20
|
+
start: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
};
|
|
24
|
+
current: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
};
|
|
28
|
+
delta: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
};
|
|
32
|
+
modifiers: SceneViewInputModifiers;
|
|
33
|
+
}
|
|
34
|
+
export interface SceneViewInputState {
|
|
35
|
+
activeIntent: SceneViewPointerIntent | null;
|
|
36
|
+
navigationMode: SceneViewNavigationMode;
|
|
37
|
+
activePointer: SceneViewPointerState | null;
|
|
38
|
+
pressedMovementKeys: string[];
|
|
39
|
+
flySpeed: number;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=scene-view-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-view-input.d.ts","sourceRoot":"","sources":["../src/scene-view-input.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAC9B,iBAAiB,GACjB,YAAY,GACZ,YAAY,GACZ,iBAAiB,GACjB,OAAO,GACP,KAAK,GACL,OAAO,GACP,YAAY,CAAC;AAEjB,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,YAAY,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC5C,cAAc,EAAE,uBAAuB,CAAC;IACxC,aAAa,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC5C,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-view-input.js","sourceRoot":"","sources":["../src/scene-view-input.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type SerializedPropertyPath = string;
|
|
2
|
+
export type SerializedPropertyValueType = 'string' | 'number' | 'boolean' | 'enum' | 'asset' | 'object' | 'unknown';
|
|
3
|
+
export interface SerializedPropertyContext {
|
|
4
|
+
targetId?: string;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface SerializedPropertyDescriptor<TDocument = unknown> {
|
|
8
|
+
path: SerializedPropertyPath;
|
|
9
|
+
label?: string;
|
|
10
|
+
valueType?: SerializedPropertyValueType;
|
|
11
|
+
readOnly?: boolean;
|
|
12
|
+
getValue(document: TDocument, context: SerializedPropertyContext): unknown;
|
|
13
|
+
setValue?(document: TDocument, value: unknown, context: SerializedPropertyContext): TDocument;
|
|
14
|
+
}
|
|
15
|
+
export interface SerializedProperty<TDocument = unknown> {
|
|
16
|
+
path: SerializedPropertyPath;
|
|
17
|
+
label: string;
|
|
18
|
+
valueType: SerializedPropertyValueType;
|
|
19
|
+
value: unknown;
|
|
20
|
+
mixed?: boolean;
|
|
21
|
+
readOnly: boolean;
|
|
22
|
+
descriptor: SerializedPropertyDescriptor<TDocument>;
|
|
23
|
+
}
|
|
24
|
+
export interface SerializedObject<TDocument = unknown> {
|
|
25
|
+
targetId: string;
|
|
26
|
+
label?: string;
|
|
27
|
+
properties: SerializedProperty<TDocument>[];
|
|
28
|
+
}
|
|
29
|
+
export interface SerializedMultiObject<TDocument = unknown> {
|
|
30
|
+
targetIds: string[];
|
|
31
|
+
activeId: string | null;
|
|
32
|
+
label?: string;
|
|
33
|
+
properties: SerializedProperty<TDocument>[];
|
|
34
|
+
}
|
|
35
|
+
export interface SerializedPropertyPatch {
|
|
36
|
+
targetId: string;
|
|
37
|
+
path: SerializedPropertyPath;
|
|
38
|
+
value: unknown;
|
|
39
|
+
}
|
|
40
|
+
export interface SerializedPropertyAdapter<TDocument = unknown> {
|
|
41
|
+
getSerializedObject(document: TDocument, targetId: string): SerializedObject<TDocument> | null;
|
|
42
|
+
applySerializedPropertyPatch(document: TDocument, patch: SerializedPropertyPatch): TDocument;
|
|
43
|
+
}
|
|
44
|
+
export interface CreateSerializedObjectOptions<TDocument> {
|
|
45
|
+
document: TDocument;
|
|
46
|
+
targetId: string;
|
|
47
|
+
label?: string;
|
|
48
|
+
descriptors: readonly SerializedPropertyDescriptor<TDocument>[];
|
|
49
|
+
context?: Omit<SerializedPropertyContext, 'targetId'>;
|
|
50
|
+
}
|
|
51
|
+
export declare function createSerializedObject<TDocument>(options: CreateSerializedObjectOptions<TDocument>): SerializedObject<TDocument>;
|
|
52
|
+
export declare function applySerializedPropertyPatch<TDocument>(document: TDocument, descriptors: readonly SerializedPropertyDescriptor<TDocument>[], patch: SerializedPropertyPatch, context?: Omit<SerializedPropertyContext, 'targetId'>): TDocument;
|
|
53
|
+
//# sourceMappingURL=serialized-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialized-object.d.ts","sourceRoot":"","sources":["../src/serialized-object.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function createSerializedObject(options) {
|
|
2
|
+
const context = {
|
|
3
|
+
...options.context,
|
|
4
|
+
targetId: options.targetId,
|
|
5
|
+
};
|
|
6
|
+
return {
|
|
7
|
+
targetId: options.targetId,
|
|
8
|
+
label: options.label,
|
|
9
|
+
properties: options.descriptors.map((descriptor) => ({
|
|
10
|
+
path: descriptor.path,
|
|
11
|
+
label: descriptor.label ?? descriptor.path,
|
|
12
|
+
valueType: descriptor.valueType ?? 'unknown',
|
|
13
|
+
value: descriptor.getValue(options.document, context),
|
|
14
|
+
readOnly: descriptor.readOnly === true || typeof descriptor.setValue !== 'function',
|
|
15
|
+
descriptor,
|
|
16
|
+
})),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function applySerializedPropertyPatch(document, descriptors, patch, context = {}) {
|
|
20
|
+
const descriptor = descriptors.find((candidate) => candidate.path === patch.path);
|
|
21
|
+
if (!descriptor) {
|
|
22
|
+
throw new Error(`Serialized property descriptor not found: ${patch.path}`);
|
|
23
|
+
}
|
|
24
|
+
if (descriptor.readOnly === true || typeof descriptor.setValue !== 'function') {
|
|
25
|
+
throw new Error(`Serialized property is read-only: ${patch.path}`);
|
|
26
|
+
}
|
|
27
|
+
return descriptor.setValue(document, patch.value, {
|
|
28
|
+
...context,
|
|
29
|
+
targetId: patch.targetId,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=serialized-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialized-object.js","sourceRoot":"","sources":["../src/serialized-object.ts"],"names":[],"mappings":"AA6EA,MAAM,UAAU,sBAAsB,CACpC,OAAiD;IAEjD,MAAM,OAAO,GAA8B;QACzC,GAAG,OAAO,CAAC,OAAO;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI;YAC1C,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,SAAS;YAC5C,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;YACrD,QAAQ,EAAE,UAAU,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU;YACnF,UAAU;SACX,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAmB,EACnB,WAA+D,EAC/D,KAA8B,EAC9B,UAAuD,EAAE;IAEzD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE;QAChD,GAAG,OAAO;QACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type EditorTransformTool = 'select' | 'move' | 'rotate' | 'scale';
|
|
2
|
+
export type EditorTransformSpace = 'world' | 'local';
|
|
3
|
+
export type EditorTransformConstraint = 'axis' | 'plane' | 'view-plane';
|
|
4
|
+
export interface EditorTransformVec3 {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
z: number;
|
|
8
|
+
}
|
|
9
|
+
export interface EditorTransformSnapshot {
|
|
10
|
+
position: EditorTransformVec3;
|
|
11
|
+
rotation: EditorTransformVec3;
|
|
12
|
+
scale: EditorTransformVec3;
|
|
13
|
+
}
|
|
14
|
+
export type EditorTransformGizmoDragPhase = 'idle' | 'dragging';
|
|
15
|
+
export interface EditorTransformGizmoState {
|
|
16
|
+
tool: EditorTransformTool;
|
|
17
|
+
space: EditorTransformSpace;
|
|
18
|
+
constraint?: EditorTransformConstraint;
|
|
19
|
+
selectedNodeId: string | null;
|
|
20
|
+
dragPhase: EditorTransformGizmoDragPhase;
|
|
21
|
+
draggingNodeId: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface EditorTransformGizmoCommit {
|
|
24
|
+
nodeId: string;
|
|
25
|
+
tool: Exclude<EditorTransformTool, 'select'>;
|
|
26
|
+
space: EditorTransformSpace;
|
|
27
|
+
before: EditorTransformSnapshot;
|
|
28
|
+
after: EditorTransformSnapshot;
|
|
29
|
+
}
|
|
30
|
+
export interface EditorTransformPivot {
|
|
31
|
+
mode: 'selection-center';
|
|
32
|
+
position: EditorTransformVec3;
|
|
33
|
+
}
|
|
34
|
+
export interface EditorTransformTargetSnapshot {
|
|
35
|
+
id: string;
|
|
36
|
+
before: EditorTransformSnapshot;
|
|
37
|
+
after: EditorTransformSnapshot;
|
|
38
|
+
}
|
|
39
|
+
export interface EditorTransformBatchCommit {
|
|
40
|
+
targetIds: string[];
|
|
41
|
+
activeId: string | null;
|
|
42
|
+
tool: Exclude<EditorTransformTool, 'select'>;
|
|
43
|
+
space: EditorTransformSpace;
|
|
44
|
+
constraint: EditorTransformConstraint;
|
|
45
|
+
pivot: EditorTransformPivot;
|
|
46
|
+
targets: EditorTransformTargetSnapshot[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=transform-gizmo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-gizmo.d.ts","sourceRoot":"","sources":["../src/transform-gizmo.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,MAAM,6BAA6B,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,6BAA6B,CAAC;IACzC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC7C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC7C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,UAAU,EAAE,yBAAyB,CAAC;IACtC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-gizmo.js","sourceRoot":"","sources":["../src/transform-gizmo.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fps-games/editor-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Core runtime shell and adapter contracts for fps-game-editor.",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@fps-games/editor-protocol": "0.1.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { EditorBridgeLike, EditorMessenger, EditorPlugin, EditorRuntime } from '@fps-games/editor-protocol';
|
|
2
|
+
export interface ForgePlayRuntimeRegistryState {
|
|
3
|
+
legacyRuntime?: EditorRuntime | null;
|
|
4
|
+
projectRuntime?: EditorRuntime | null;
|
|
5
|
+
}
|
|
6
|
+
export interface ForgePlayEditorWindow extends Window {
|
|
7
|
+
__bridge?: EditorBridgeLike;
|
|
8
|
+
__pendingEditorPlugin?: EditorPlugin;
|
|
9
|
+
__pendingEditorRuntime?: EditorRuntime;
|
|
10
|
+
__bridgeLegacyEditorRuntime?: EditorRuntime;
|
|
11
|
+
__BRIDGE_EDITOR_RUNTIME_STATE?: ForgePlayRuntimeRegistryState;
|
|
12
|
+
}
|
|
13
|
+
export interface ForgePlayBridgeHostOptions {
|
|
14
|
+
window?: ForgePlayEditorWindow;
|
|
15
|
+
}
|
|
16
|
+
export interface RegisterEditorPluginResult {
|
|
17
|
+
bridge: EditorBridgeLike | null;
|
|
18
|
+
registered: boolean;
|
|
19
|
+
pending: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface RegisterEditorRuntimeResult {
|
|
22
|
+
bridge: EditorBridgeLike | null;
|
|
23
|
+
registered: boolean;
|
|
24
|
+
pending: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface LegacyCommandBypassOptions extends ForgePlayBridgeHostOptions {
|
|
27
|
+
projectOwnedCommands?: Iterable<string>;
|
|
28
|
+
legacySafeCommands?: Iterable<string>;
|
|
29
|
+
}
|
|
30
|
+
export interface BridgeInspectorLoaderPatchOptions extends ForgePlayBridgeHostOptions {
|
|
31
|
+
maxAttempts?: number;
|
|
32
|
+
intervalMs?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare const DEFAULT_PROJECT_OWNED_COMMANDS: readonly ["asset.import"];
|
|
35
|
+
export declare const DEFAULT_LEGACY_SAFE_COMMANDS: readonly ["asset.drag.preview", "asset.drag.clear", "asset.drop.anchor.arm", "asset.drop.anchor.cancel", "asset.drop.anchor.set", "asset.drop.anchor.set_by_coords", "asset.drop.anchor.clear"];
|
|
36
|
+
export declare function getForgePlayWindow(options?: ForgePlayBridgeHostOptions): ForgePlayEditorWindow | null;
|
|
37
|
+
export declare function getForgePlayBridge(options?: ForgePlayBridgeHostOptions): EditorBridgeLike | null;
|
|
38
|
+
export declare function getForgePlayMessenger(options?: ForgePlayBridgeHostOptions): EditorMessenger | null;
|
|
39
|
+
export declare function registerForgePlayEditorPlugin(plugin: EditorPlugin, options?: ForgePlayBridgeHostOptions): RegisterEditorPluginResult;
|
|
40
|
+
export declare function registerForgePlayEditorRuntime(runtime: EditorRuntime, options?: ForgePlayBridgeHostOptions): RegisterEditorRuntimeResult;
|
|
41
|
+
export declare function emitForgePlayBridgeEvent(eventName: string, payload: Record<string, unknown>, options?: ForgePlayBridgeHostOptions): boolean;
|
|
42
|
+
export declare function sendForgePlayBridgeMessage(type: string, payload: Record<string, unknown>, options?: ForgePlayBridgeHostOptions): boolean;
|
|
43
|
+
export declare function installForgePlayBridgeInspectorLoaderPatch(options?: BridgeInspectorLoaderPatchOptions): boolean;
|
|
44
|
+
export declare function registerLegacyRuntimeProxy(projectRuntime: EditorRuntime, options?: ForgePlayBridgeHostOptions): RegisterEditorRuntimeResult;
|
|
45
|
+
export declare function installLegacyCommandBypass(runtime: EditorRuntime, options?: LegacyCommandBypassOptions): EditorRuntime | null;
|
|
46
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,6BAA6B;IAC5C,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,cAAc,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,qBAAsB,SAAQ,MAAM;IACnD,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,qBAAqB,CAAC,EAAE,YAAY,CAAC;IACrC,sBAAsB,CAAC,EAAE,aAAa,CAAC;IACvC,2BAA2B,CAAC,EAAE,aAAa,CAAC;IAC5C,6BAA6B,CAAC,EAAE,6BAA6B,CAAC;CAC/D;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,oBAAoB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,iCAAkC,SAAQ,0BAA0B;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,8BAA8B,2BAA4B,CAAC;AAExE,eAAO,MAAM,4BAA4B,iMAQ/B,CAAC;AAOX,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,0BAA+B,GAAG,qBAAqB,GAAG,IAAI,CAEzG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,0BAA+B,GAAG,gBAAgB,GAAG,IAAI,CAEpG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,0BAA+B,GAAG,eAAe,GAAG,IAAI,CAEtG;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,0BAA+B,GACvC,0BAA0B,CAW5B;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,0BAA+B,GACvC,2BAA2B,CAW7B;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAKT;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAKT;AAED,wBAAgB,0CAA0C,CACxD,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAqDT;AAED,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,aAAa,EAC7B,OAAO,GAAE,0BAA+B,GACvC,2BAA2B,CAc7B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,0BAA+B,GACvC,aAAa,GAAG,IAAI,CA+BtB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
export const DEFAULT_PROJECT_OWNED_COMMANDS = ['asset.import'];
|
|
2
|
+
export const DEFAULT_LEGACY_SAFE_COMMANDS = [
|
|
3
|
+
'asset.drag.preview',
|
|
4
|
+
'asset.drag.clear',
|
|
5
|
+
'asset.drop.anchor.arm',
|
|
6
|
+
'asset.drop.anchor.cancel',
|
|
7
|
+
'asset.drop.anchor.set',
|
|
8
|
+
'asset.drop.anchor.set_by_coords',
|
|
9
|
+
'asset.drop.anchor.clear',
|
|
10
|
+
];
|
|
11
|
+
function getDefaultWindow() {
|
|
12
|
+
if (typeof window === 'undefined')
|
|
13
|
+
return null;
|
|
14
|
+
return window;
|
|
15
|
+
}
|
|
16
|
+
export function getForgePlayWindow(options = {}) {
|
|
17
|
+
return options.window ?? getDefaultWindow();
|
|
18
|
+
}
|
|
19
|
+
export function getForgePlayBridge(options = {}) {
|
|
20
|
+
return getForgePlayWindow(options)?.__bridge ?? null;
|
|
21
|
+
}
|
|
22
|
+
export function getForgePlayMessenger(options = {}) {
|
|
23
|
+
return getForgePlayBridge(options)?.messenger ?? null;
|
|
24
|
+
}
|
|
25
|
+
export function registerForgePlayEditorPlugin(plugin, options = {}) {
|
|
26
|
+
const win = getForgePlayWindow(options);
|
|
27
|
+
if (win)
|
|
28
|
+
win.__pendingEditorPlugin = plugin;
|
|
29
|
+
const bridge = win?.__bridge ?? null;
|
|
30
|
+
const register = bridge?.registerEditorPlugin;
|
|
31
|
+
if (register) {
|
|
32
|
+
register(plugin);
|
|
33
|
+
return { bridge, registered: true, pending: true };
|
|
34
|
+
}
|
|
35
|
+
return { bridge, registered: false, pending: Boolean(win) };
|
|
36
|
+
}
|
|
37
|
+
export function registerForgePlayEditorRuntime(runtime, options = {}) {
|
|
38
|
+
const win = getForgePlayWindow(options);
|
|
39
|
+
if (win)
|
|
40
|
+
win.__pendingEditorRuntime = runtime;
|
|
41
|
+
const bridge = win?.__bridge ?? null;
|
|
42
|
+
const register = bridge?.registerEditorRuntime;
|
|
43
|
+
if (register) {
|
|
44
|
+
register(runtime);
|
|
45
|
+
return { bridge, registered: true, pending: true };
|
|
46
|
+
}
|
|
47
|
+
return { bridge, registered: false, pending: Boolean(win) };
|
|
48
|
+
}
|
|
49
|
+
export function emitForgePlayBridgeEvent(eventName, payload, options = {}) {
|
|
50
|
+
const event = getForgePlayMessenger(options)?.event;
|
|
51
|
+
if (!event)
|
|
52
|
+
return false;
|
|
53
|
+
event(eventName, payload);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
export function sendForgePlayBridgeMessage(type, payload, options = {}) {
|
|
57
|
+
const send = getForgePlayMessenger(options)?.send;
|
|
58
|
+
if (!send)
|
|
59
|
+
return false;
|
|
60
|
+
send(type, payload);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
export function installForgePlayBridgeInspectorLoaderPatch(options = {}) {
|
|
64
|
+
const win = getForgePlayWindow(options);
|
|
65
|
+
if (!win)
|
|
66
|
+
return false;
|
|
67
|
+
const maxAttempts = options.maxAttempts ?? 120;
|
|
68
|
+
const intervalMs = options.intervalMs ?? 250;
|
|
69
|
+
let attempts = 0;
|
|
70
|
+
const tryPatch = () => {
|
|
71
|
+
const editor = win.__bridge?.editor;
|
|
72
|
+
if (!editor) {
|
|
73
|
+
if (attempts < maxAttempts) {
|
|
74
|
+
attempts += 1;
|
|
75
|
+
win.setTimeout?.(tryPatch, intervalMs);
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (editor.__fpsGameEditorLocalInspectorLoadPatched)
|
|
80
|
+
return true;
|
|
81
|
+
const ensureLocalInspector = async () => {
|
|
82
|
+
const ensureInspectorReady = win.ensureInspectorReady;
|
|
83
|
+
const localInspector = typeof ensureInspectorReady === 'function'
|
|
84
|
+
? await ensureInspectorReady()
|
|
85
|
+
: null;
|
|
86
|
+
if (localInspector?.ShowInspector) {
|
|
87
|
+
win.INSPECTOR = localInspector;
|
|
88
|
+
}
|
|
89
|
+
return localInspector;
|
|
90
|
+
};
|
|
91
|
+
if (typeof editor.showInspector === 'function') {
|
|
92
|
+
const originalShowInspector = editor.showInspector.bind(editor);
|
|
93
|
+
editor.showInspector = async (...args) => {
|
|
94
|
+
await ensureLocalInspector();
|
|
95
|
+
return originalShowInspector(...args);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (typeof editor.loadV2 === 'function') {
|
|
99
|
+
const originalLoadV2 = editor.loadV2.bind(editor);
|
|
100
|
+
editor.loadV2 = async (...args) => {
|
|
101
|
+
const localInspector = await ensureLocalInspector();
|
|
102
|
+
if (localInspector?.ShowInspector)
|
|
103
|
+
return localInspector;
|
|
104
|
+
return originalLoadV2(...args);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
editor.__fpsGameEditorLocalInspectorLoadPatched = true;
|
|
108
|
+
return true;
|
|
109
|
+
};
|
|
110
|
+
return tryPatch();
|
|
111
|
+
}
|
|
112
|
+
export function registerLegacyRuntimeProxy(projectRuntime, options = {}) {
|
|
113
|
+
const bridge = getForgePlayBridge(options);
|
|
114
|
+
const proxy = {
|
|
115
|
+
owner: 'legacy',
|
|
116
|
+
Editor: projectRuntime.Editor,
|
|
117
|
+
Edit: projectRuntime.Edit,
|
|
118
|
+
handleCommand: projectRuntime.handleCommand.bind(projectRuntime),
|
|
119
|
+
};
|
|
120
|
+
const register = bridge?.registerEditorRuntime;
|
|
121
|
+
if (register) {
|
|
122
|
+
register(proxy);
|
|
123
|
+
return { bridge, registered: true, pending: false };
|
|
124
|
+
}
|
|
125
|
+
return { bridge, registered: false, pending: false };
|
|
126
|
+
}
|
|
127
|
+
export function installLegacyCommandBypass(runtime, options = {}) {
|
|
128
|
+
const win = getForgePlayWindow(options);
|
|
129
|
+
if (!win)
|
|
130
|
+
return null;
|
|
131
|
+
const projectOwned = new Set(options.projectOwnedCommands ?? DEFAULT_PROJECT_OWNED_COMMANDS);
|
|
132
|
+
const legacySafe = new Set(options.legacySafeCommands ?? DEFAULT_LEGACY_SAFE_COMMANDS);
|
|
133
|
+
const registryState = win.__BRIDGE_EDITOR_RUNTIME_STATE;
|
|
134
|
+
const previousLegacy = registryState?.legacyRuntime ?? win.__bridgeLegacyEditorRuntime ?? null;
|
|
135
|
+
const previousWithMarker = previousLegacy;
|
|
136
|
+
const originalLegacy = previousWithMarker?.__fpsGameEditorOriginalLegacyRuntime ?? previousLegacy;
|
|
137
|
+
const proxy = {
|
|
138
|
+
owner: 'legacy',
|
|
139
|
+
Editor: runtime.Editor,
|
|
140
|
+
Edit: runtime.Edit,
|
|
141
|
+
async handleCommand(name, params) {
|
|
142
|
+
if (projectOwned.has(name))
|
|
143
|
+
return runtime.handleCommand(name, params);
|
|
144
|
+
if (legacySafe.has(name))
|
|
145
|
+
return originalLegacy?.handleCommand?.(name, params);
|
|
146
|
+
return originalLegacy?.handleCommand?.(name, params);
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
proxy.__fpsGameEditorLegacyCommandBypass = true;
|
|
150
|
+
proxy.__fpsGameEditorOriginalLegacyRuntime = originalLegacy;
|
|
151
|
+
if (registryState)
|
|
152
|
+
registryState.legacyRuntime = proxy;
|
|
153
|
+
win.__bridgeLegacyEditorRuntime = proxy;
|
|
154
|
+
return proxy;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fps-games/editor-forge-play",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Forge Play bridge adapter for fps-game-editor.",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@fps-games/editor-protocol": "0.1.0"
|
|
18
|
+
}
|
|
19
|
+
}
|