@fps-games/editor 0.1.6-beta.1 → 0.1.7-beta.2
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/agent-bridge/capabilities/assets.d.ts +8 -0
- package/dist/agent-bridge/capabilities/assets.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/assets.js +226 -0
- package/dist/agent-bridge/capabilities/assets.js.map +1 -0
- package/dist/agent-bridge/capabilities/editor-state.d.ts +5 -0
- package/dist/agent-bridge/capabilities/editor-state.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/editor-state.js +72 -0
- package/dist/agent-bridge/capabilities/editor-state.js.map +1 -0
- package/dist/agent-bridge/capabilities/host-lifecycle.d.ts +4 -0
- package/dist/agent-bridge/capabilities/host-lifecycle.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/host-lifecycle.js +87 -0
- package/dist/agent-bridge/capabilities/host-lifecycle.js.map +1 -0
- package/dist/agent-bridge/capabilities/prefabs.d.ts +5 -0
- package/dist/agent-bridge/capabilities/prefabs.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/prefabs.js +735 -0
- package/dist/agent-bridge/capabilities/prefabs.js.map +1 -0
- package/dist/agent-bridge/capabilities/scene-objects.d.ts +9 -0
- package/dist/agent-bridge/capabilities/scene-objects.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/scene-objects.js +394 -0
- package/dist/agent-bridge/capabilities/scene-objects.js.map +1 -0
- package/dist/agent-bridge/capabilities/selection.d.ts +5 -0
- package/dist/agent-bridge/capabilities/selection.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/selection.js +57 -0
- package/dist/agent-bridge/capabilities/selection.js.map +1 -0
- package/dist/agent-bridge/capabilities/shadows.d.ts +5 -0
- package/dist/agent-bridge/capabilities/shadows.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/shadows.js +1876 -0
- package/dist/agent-bridge/capabilities/shadows.js.map +1 -0
- package/dist/agent-bridge/capabilities/transform.d.ts +5 -0
- package/dist/agent-bridge/capabilities/transform.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/transform.js +162 -0
- package/dist/agent-bridge/capabilities/transform.js.map +1 -0
- package/dist/agent-bridge/capabilities/ui-regions.d.ts +4 -0
- package/dist/agent-bridge/capabilities/ui-regions.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/ui-regions.js +168 -0
- package/dist/agent-bridge/capabilities/ui-regions.js.map +1 -0
- package/dist/agent-bridge/capabilities/viewport.d.ts +5 -0
- package/dist/agent-bridge/capabilities/viewport.d.ts.map +1 -0
- package/dist/agent-bridge/capabilities/viewport.js +407 -0
- package/dist/agent-bridge/capabilities/viewport.js.map +1 -0
- package/dist/agent-bridge/capability-sources.d.ts +6 -0
- package/dist/agent-bridge/capability-sources.d.ts.map +1 -0
- package/dist/agent-bridge/capability-sources.js +26 -0
- package/dist/agent-bridge/capability-sources.js.map +1 -0
- package/dist/agent-bridge/diagnostics.d.ts +12 -0
- package/dist/agent-bridge/diagnostics.d.ts.map +1 -0
- package/dist/agent-bridge/diagnostics.js +45 -0
- package/dist/agent-bridge/diagnostics.js.map +1 -0
- package/dist/agent-bridge/index.d.ts +5 -0
- package/dist/agent-bridge/index.d.ts.map +1 -0
- package/dist/agent-bridge/index.js +5 -0
- package/dist/agent-bridge/index.js.map +1 -0
- package/dist/agent-bridge/register.d.ts +4 -0
- package/dist/agent-bridge/register.d.ts.map +1 -0
- package/dist/agent-bridge/register.js +908 -0
- package/dist/agent-bridge/register.js.map +1 -0
- package/dist/agent-bridge/shared.d.ts +189 -0
- package/dist/agent-bridge/shared.d.ts.map +1 -0
- package/dist/agent-bridge/shared.js +39 -0
- package/dist/agent-bridge/shared.js.map +1 -0
- package/dist/agent-bridge/source-types.d.ts +90 -0
- package/dist/agent-bridge/source-types.d.ts.map +1 -0
- package/dist/agent-bridge/source-types.js +2 -0
- package/dist/agent-bridge/source-types.js.map +1 -0
- package/dist/build-info.json +17 -17
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/local-editor-agent-bridge-transport.d.ts +95 -0
- package/dist/local-editor-agent-bridge-transport.d.ts.map +1 -0
- package/dist/local-editor-agent-bridge-transport.js +340 -0
- package/dist/local-editor-agent-bridge-transport.js.map +1 -0
- package/dist/local-editor-agent-bridge.d.ts +2 -0
- package/dist/local-editor-agent-bridge.d.ts.map +1 -0
- package/dist/local-editor-agent-bridge.js +2 -0
- package/dist/local-editor-agent-bridge.js.map +1 -0
- package/dist/local-editor-harness.d.ts +26 -2
- package/dist/local-editor-harness.d.ts.map +1 -1
- package/dist/local-editor-harness.js +773 -75
- package/dist/local-editor-harness.js.map +1 -1
- package/dist/playable-babylon-rendering.js +20 -0
- package/dist/playable-babylon-rendering.js.map +1 -1
- package/dist/playable-local-editor-host.d.ts +5 -0
- package/dist/playable-local-editor-host.d.ts.map +1 -1
- package/dist/playable-local-editor-host.js +2 -0
- package/dist/playable-local-editor-host.js.map +1 -1
- package/dist/playable-sdk.d.ts +1 -1
- package/dist/playable-sdk.d.ts.map +1 -1
- package/dist/playable-sdk.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.js +6 -4
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/blob-shadow-system.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.js +103 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-shaders.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.js +330 -27
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/planar-shadow-system.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.js +159 -0
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-artifact-system.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-baker.js +8 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/static-projected-shadow-baker.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.d.ts +53 -2
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.d.ts.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.js +1 -0
- package/node_modules/@fps-games/babylon-renderer/dist/shadows/types.js.map +1 -1
- package/node_modules/@fps-games/babylon-renderer/package.json +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +30 -0
- package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/projection.js +346 -11
- package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts +11 -0
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js +113 -29
- package/node_modules/@fps-games/editor-babylon/dist/scene-view-camera-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.d.ts +13 -1
- package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.js +543 -3
- package/node_modules/@fps-games/editor-babylon/dist/shadow-preview-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-babylon/package.json +5 -5
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts +5 -2
- package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/index.js +3 -1
- package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-context-menu.js +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-context-menu.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.js +7 -9
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-actions.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-attach-dialog.js +2 -2
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-attach-dialog.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.d.ts +21 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.js +75 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-command-adapter.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js +288 -71
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-controller.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts +5 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js +92 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-scope.js.map +1 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.d.ts +3 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js +22 -7
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-tree.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts +4 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js +21 -14
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-hierarchy-view.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js +6 -4
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts +19 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js +79 -39
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js +2 -2
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-primitives.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +68 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts +2 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js +10 -0
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +3 -2
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +401 -241
- package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-camera-debug-panel.d.ts +1 -0
- package/node_modules/@fps-games/editor-browser/dist/runtime-camera-debug-panel.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-camera-debug-panel.js +1 -0
- package/node_modules/@fps-games/editor-browser/dist/runtime-camera-debug-panel.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-debug-panel-shell.d.ts +2 -0
- package/node_modules/@fps-games/editor-browser/dist/runtime-debug-panel-shell.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-debug-panel-shell.js +27 -13
- package/node_modules/@fps-games/editor-browser/dist/runtime-debug-panel-shell.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-lighting-debug-panel.d.ts +1 -0
- package/node_modules/@fps-games/editor-browser/dist/runtime-lighting-debug-panel.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-browser/dist/runtime-lighting-debug-panel.js +1 -0
- package/node_modules/@fps-games/editor-browser/dist/runtime-lighting-debug-panel.js.map +1 -1
- package/node_modules/@fps-games/editor-browser/package.json +3 -3
- package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts +18 -0
- package/node_modules/@fps-games/editor-core/dist/agent-bridge.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/agent-bridge.js +102 -0
- package/node_modules/@fps-games/editor-core/dist/agent-bridge.js.map +1 -0
- package/node_modules/@fps-games/editor-core/dist/index.d.ts +1 -0
- package/node_modules/@fps-games/editor-core/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/index.js +1 -0
- package/node_modules/@fps-games/editor-core/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts +1 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-core/dist/viewport-tools.js.map +1 -1
- package/node_modules/@fps-games/editor-core/package.json +2 -2
- package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.js +9 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/config.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.d.ts +6 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js +89 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/generated-module.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.d.ts +18 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.js +121 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/identity.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/index.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.d.ts +27 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.js +782 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/metadata.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.d.ts +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.js +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/node.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.d.ts +80 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.js +600 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/registry.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.d.ts +51 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.js +2 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-database/types.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.d.ts +0 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.js +4 -42
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/document.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.d.ts +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.js +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.js +2 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/placement.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/types.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/asset-placement/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.d.ts +42 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js +612 -8
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/helpers.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/types.d.ts +42 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/document/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.d.ts +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.js +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.js +16 -9
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/schema.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.d.ts +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.js +28 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/field-schema/validators.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.js +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.d.ts +82 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.js +396 -22
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/document-sections.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.d.ts +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.js +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.js +0 -3
- package/node_modules/@fps-games/editor-playable-sdk/dist/inspector/validation.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.d.ts +29 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.js +143 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/lighting-debug/math.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.js +99 -11
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/field-patch.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.js +4 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/reducer.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.js +19 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/mutation/transform.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js +19 -3
- package/node_modules/@fps-games/editor-playable-sdk/dist/rendering-profile/panel.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.d.ts +1 -2
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js +0 -14
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/assets.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.d.ts +1 -7
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.js +3 -32
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/import-plan.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.js +16 -32
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/nodes.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/types.d.ts +5 -22
- package/node_modules/@fps-games/editor-playable-sdk/dist/runtime-preview/types.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.d.ts +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.js +996 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/compiler.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.js +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/index.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.d.ts +152 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.js +2 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-compiler/types.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.js +4 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/protocol.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.js +224 -12
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/descriptors.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.js +158 -50
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/inspector.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.js +45 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/serialized-property/patch.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.d.ts +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.js +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/index.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.d.ts +21 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.js +158 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/legacy.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.d.ts +5 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.js +83 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/quality.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.d.ts +35 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.js +363 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/resolver.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.d.ts +105 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.js +6 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/shadow-system/types.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.js +44 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/static-shadows/artifact.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.d.ts +26 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.js +105 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/asset-authoring.js.map +1 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js +3 -0
- package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js.map +1 -1
- package/node_modules/@fps-games/editor-playable-sdk/package.json +3 -3
- package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts +1127 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.js +2180 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-bridge.js.map +1 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts +68 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-trace.d.ts.map +1 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js +23 -0
- package/node_modules/@fps-games/editor-protocol/dist/agent-trace.js.map +1 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.d.ts +2 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.d.ts.map +1 -1
- package/node_modules/@fps-games/editor-protocol/dist/index.js +2 -0
- package/node_modules/@fps-games/editor-protocol/dist/index.js.map +1 -1
- package/node_modules/@fps-games/editor-protocol/package.json +1 -1
- package/package.json +8 -8
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { mergeArtistMaterialProfiles, } from '@fps-games/editor-protocol';
|
|
2
2
|
import { isEditorSceneArtistMaterialPatchPath, normalizeEditorSceneMaterialSlotOwnerPath, readEditorSceneChildMaterialBindingOwnerPath, readEditorSceneMaterialSlotBindingSlotId, } from '../material-binding/paths.js';
|
|
3
|
+
export const EDITOR_SCENE_PREFAB_COMPOSITION_VERSION = 1;
|
|
4
|
+
export const EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID = 'prefab-root';
|
|
5
|
+
export const EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID = 'prefab-model';
|
|
3
6
|
const EDITOR_SCENE_PREFAB_OVERRIDE_FIELD_PATH_PREFIX = 'prefab.';
|
|
4
7
|
const EDITOR_SCENE_PREFAB_CORE_MATERIAL_OVERRIDE_PROFILE_FIELD_PATHS = new Set([
|
|
5
8
|
'profile.baseColor.color',
|
|
@@ -30,6 +33,512 @@ export function isEditorScenePrefabInstance(gameObject) {
|
|
|
30
33
|
export function resolveEditorScenePrefabSourceAssetId(prefabAsset) {
|
|
31
34
|
return readEditorSceneNonEmptyString(prefabAsset?.prefab?.sourceAssetId);
|
|
32
35
|
}
|
|
36
|
+
export function readEditorScenePrefabRootNodeId(prefabAsset) {
|
|
37
|
+
if (!prefabAsset?.prefab)
|
|
38
|
+
return null;
|
|
39
|
+
const nodes = readEditorScenePrefabExplicitNodes(prefabAsset.prefab);
|
|
40
|
+
const explicitRootNodeId = readEditorSceneNonEmptyString(prefabAsset.prefab.rootNodeId);
|
|
41
|
+
if (explicitRootNodeId && nodes.some(node => node.id === explicitRootNodeId))
|
|
42
|
+
return explicitRootNodeId;
|
|
43
|
+
const explicitRoot = nodes.find(node => node.kind === 'root' && !node.parentId);
|
|
44
|
+
if (explicitRoot)
|
|
45
|
+
return explicitRoot.id;
|
|
46
|
+
if (nodes.length > 0)
|
|
47
|
+
return null;
|
|
48
|
+
const legacyRoot = createEditorScenePrefabLegacyRootNode(prefabAsset);
|
|
49
|
+
return legacyRoot ? legacyRoot.id : null;
|
|
50
|
+
}
|
|
51
|
+
export function readEditorScenePrefabNodes(prefabAsset) {
|
|
52
|
+
if (!prefabAsset?.prefab)
|
|
53
|
+
return [];
|
|
54
|
+
const explicitNodes = readEditorScenePrefabExplicitNodes(prefabAsset.prefab);
|
|
55
|
+
if (explicitNodes.length > 0)
|
|
56
|
+
return explicitNodes;
|
|
57
|
+
return createEditorScenePrefabLegacyCompositionNodes(prefabAsset);
|
|
58
|
+
}
|
|
59
|
+
export function findEditorScenePrefabNode(prefabAsset, nodeId) {
|
|
60
|
+
const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
|
|
61
|
+
if (!normalizedNodeId)
|
|
62
|
+
return null;
|
|
63
|
+
return readEditorScenePrefabNodes(prefabAsset).find(node => node.id === normalizedNodeId) ?? null;
|
|
64
|
+
}
|
|
65
|
+
export function readEditorScenePrefabNodeChildren(prefabAsset, parentNodeId) {
|
|
66
|
+
const normalizedParentId = readEditorSceneNonEmptyString(parentNodeId);
|
|
67
|
+
return readEditorScenePrefabNodes(prefabAsset).filter((node) => {
|
|
68
|
+
const parentId = readEditorSceneNonEmptyString(node.parentId);
|
|
69
|
+
return normalizedParentId ? parentId === normalizedParentId : !parentId;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function ensureEditorScenePrefabComposition(prefabAsset) {
|
|
73
|
+
if (!isEditorScenePrefabAsset(prefabAsset)) {
|
|
74
|
+
return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
|
|
75
|
+
code: 'prefab.invalidDefinition',
|
|
76
|
+
severity: 'error',
|
|
77
|
+
message: `Asset "${prefabAsset.id}" is not a valid prefab definition.`,
|
|
78
|
+
assetId: prefabAsset.id,
|
|
79
|
+
}]);
|
|
80
|
+
}
|
|
81
|
+
const next = cloneEditorScenePrefabAssetWithComposition(prefabAsset);
|
|
82
|
+
return createEditorScenePrefabMutationResult(next, JSON.stringify(next.prefab) !== JSON.stringify(prefabAsset.prefab));
|
|
83
|
+
}
|
|
84
|
+
export function selectEditorScenePrefabNode(prefabAsset, nodeId) {
|
|
85
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
86
|
+
if (!prepared.ok)
|
|
87
|
+
return prepared;
|
|
88
|
+
const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
|
|
89
|
+
const node = normalizedNodeId ? findEditorScenePrefabNode(prepared.prefabAsset, normalizedNodeId) : null;
|
|
90
|
+
if (!node) {
|
|
91
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
92
|
+
code: 'prefab.nodeNotFound',
|
|
93
|
+
severity: 'error',
|
|
94
|
+
message: `Prefab node "${nodeId}" was not found.`,
|
|
95
|
+
assetId: prefabAsset.id,
|
|
96
|
+
nodeId,
|
|
97
|
+
}]);
|
|
98
|
+
}
|
|
99
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [], {
|
|
100
|
+
selectedNodeId: node.id,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function renameEditorScenePrefabAsset(document, assetId, displayName) {
|
|
104
|
+
const normalizedAssetId = readEditorSceneNonEmptyString(assetId);
|
|
105
|
+
const prefabAsset = normalizedAssetId
|
|
106
|
+
? document.assets.find(asset => asset.id === normalizedAssetId && isEditorScenePrefabAsset(asset))
|
|
107
|
+
: null;
|
|
108
|
+
if (!prefabAsset) {
|
|
109
|
+
return createEditorScenePrefabMutationResult({
|
|
110
|
+
id: normalizedAssetId ?? String(assetId ?? ''),
|
|
111
|
+
type: 'prefab',
|
|
112
|
+
prefab: { sourceAssetId: '' },
|
|
113
|
+
}, false, null, [{
|
|
114
|
+
code: 'prefab.invalidDefinition',
|
|
115
|
+
severity: 'error',
|
|
116
|
+
message: `Prefab asset "${assetId}" was not found.`,
|
|
117
|
+
assetId,
|
|
118
|
+
}]);
|
|
119
|
+
}
|
|
120
|
+
const nameResult = normalizeEditorScenePrefabEditableName(displayName);
|
|
121
|
+
if (!nameResult.ok) {
|
|
122
|
+
return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
|
|
123
|
+
code: 'prefab.invalidName',
|
|
124
|
+
severity: 'error',
|
|
125
|
+
message: nameResult.message,
|
|
126
|
+
assetId: prefabAsset.id,
|
|
127
|
+
}]);
|
|
128
|
+
}
|
|
129
|
+
const normalizedDisplayName = nameResult.name;
|
|
130
|
+
const lowerName = normalizedDisplayName.toLowerCase();
|
|
131
|
+
const conflict = document.assets.find(candidate => (candidate.id !== prefabAsset.id
|
|
132
|
+
&& isEditorScenePrefabAsset(candidate)
|
|
133
|
+
&& readEditorSceneNonEmptyString(candidate.displayName)?.toLowerCase() === lowerName));
|
|
134
|
+
if (conflict) {
|
|
135
|
+
return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
|
|
136
|
+
code: 'prefab.nameConflict',
|
|
137
|
+
severity: 'error',
|
|
138
|
+
message: `Prefab asset name "${normalizedDisplayName}" is already used by "${conflict.id}".`,
|
|
139
|
+
assetId: prefabAsset.id,
|
|
140
|
+
}]);
|
|
141
|
+
}
|
|
142
|
+
if (prefabAsset.displayName === normalizedDisplayName) {
|
|
143
|
+
return createEditorScenePrefabMutationResult(prefabAsset, false);
|
|
144
|
+
}
|
|
145
|
+
const next = cloneEditorScenePrefabAssetWithComposition({
|
|
146
|
+
...structuredClone(prefabAsset),
|
|
147
|
+
displayName: normalizedDisplayName,
|
|
148
|
+
});
|
|
149
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(next);
|
|
150
|
+
if (rootNodeId && Array.isArray(next.prefab?.nodes)) {
|
|
151
|
+
const rootIndex = next.prefab.nodes.findIndex(node => node.id === rootNodeId);
|
|
152
|
+
if (rootIndex >= 0) {
|
|
153
|
+
next.prefab.nodes = [...next.prefab.nodes];
|
|
154
|
+
next.prefab.nodes[rootIndex] = {
|
|
155
|
+
...structuredClone(next.prefab.nodes[rootIndex]),
|
|
156
|
+
name: normalizedDisplayName,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return createEditorScenePrefabMutationResult(next, true);
|
|
161
|
+
}
|
|
162
|
+
export function renameEditorScenePrefabNode(prefabAsset, nodeId, name) {
|
|
163
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
164
|
+
if (!prepared.ok)
|
|
165
|
+
return prepared;
|
|
166
|
+
const normalizedNodeId = readEditorSceneNonEmptyString(nodeId);
|
|
167
|
+
const node = normalizedNodeId ? findEditorScenePrefabNode(prepared.prefabAsset, normalizedNodeId) : null;
|
|
168
|
+
if (!node) {
|
|
169
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
170
|
+
code: 'prefab.nodeNotFound',
|
|
171
|
+
severity: 'error',
|
|
172
|
+
message: `Prefab node "${nodeId}" was not found.`,
|
|
173
|
+
assetId: prefabAsset.id,
|
|
174
|
+
nodeId,
|
|
175
|
+
}]);
|
|
176
|
+
}
|
|
177
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
|
|
178
|
+
if (node.id === rootNodeId) {
|
|
179
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
|
|
180
|
+
code: 'prefab.rootRenameRejected',
|
|
181
|
+
severity: 'error',
|
|
182
|
+
message: 'Prefab root node name follows the prefab asset displayName; use prefab.asset.rename instead.',
|
|
183
|
+
assetId: prefabAsset.id,
|
|
184
|
+
nodeId: node.id,
|
|
185
|
+
}]);
|
|
186
|
+
}
|
|
187
|
+
const nameResult = normalizeEditorScenePrefabEditableName(name);
|
|
188
|
+
if (!nameResult.ok) {
|
|
189
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
|
|
190
|
+
code: 'prefab.invalidName',
|
|
191
|
+
severity: 'error',
|
|
192
|
+
message: nameResult.message,
|
|
193
|
+
assetId: prefabAsset.id,
|
|
194
|
+
nodeId: node.id,
|
|
195
|
+
}]);
|
|
196
|
+
}
|
|
197
|
+
const normalizedName = nameResult.name;
|
|
198
|
+
const siblings = readEditorScenePrefabNodeChildren(prepared.prefabAsset, node.parentId);
|
|
199
|
+
const conflict = siblings.find(candidate => (candidate.id !== node.id
|
|
200
|
+
&& readEditorSceneNonEmptyString(candidate.name)?.toLowerCase() === normalizedName.toLowerCase()));
|
|
201
|
+
if (conflict) {
|
|
202
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, node, [{
|
|
203
|
+
code: 'prefab.nameConflict',
|
|
204
|
+
severity: 'error',
|
|
205
|
+
message: `Prefab node name "${normalizedName}" is already used by sibling "${conflict.id}".`,
|
|
206
|
+
assetId: prefabAsset.id,
|
|
207
|
+
nodeId: node.id,
|
|
208
|
+
parentId: node.parentId,
|
|
209
|
+
}]);
|
|
210
|
+
}
|
|
211
|
+
return updateEditorScenePrefabNode(prepared.prefabAsset, node.id, (candidate) => ({
|
|
212
|
+
...candidate,
|
|
213
|
+
name: normalizedName,
|
|
214
|
+
}));
|
|
215
|
+
}
|
|
216
|
+
export function createEditorScenePrefabNodeFromAsset(prefabAsset, asset, options = {}) {
|
|
217
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
218
|
+
if (!prepared.ok)
|
|
219
|
+
return prepared;
|
|
220
|
+
if (asset.id === prefabAsset.id) {
|
|
221
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
222
|
+
code: 'prefab.selfReferenceRejected',
|
|
223
|
+
severity: 'error',
|
|
224
|
+
message: `Prefab "${prefabAsset.id}" cannot contain itself directly.`,
|
|
225
|
+
assetId: asset.id,
|
|
226
|
+
}]);
|
|
227
|
+
}
|
|
228
|
+
const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
|
|
229
|
+
if (!parentResult.ok)
|
|
230
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
|
|
231
|
+
const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
|
|
232
|
+
const isChildPrefab = isEditorScenePrefabAsset(asset);
|
|
233
|
+
const isModel = asset.type !== 'prefab' && (asset.type === 'glb' || asset.type === 'model' || asset.type === 'gltf');
|
|
234
|
+
if (!isChildPrefab && !isModel) {
|
|
235
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
236
|
+
code: 'prefab.assetUnsupported',
|
|
237
|
+
severity: 'error',
|
|
238
|
+
message: `Asset "${asset.id}" cannot be added to a prefab composition.`,
|
|
239
|
+
assetId: asset.id,
|
|
240
|
+
}]);
|
|
241
|
+
}
|
|
242
|
+
const node = {
|
|
243
|
+
id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, `${isChildPrefab ? 'prefab' : 'model'}-${asset.id}`),
|
|
244
|
+
...(options.guid ? { guid: options.guid } : {}),
|
|
245
|
+
name: options.name ?? asset.displayName ?? asset.id,
|
|
246
|
+
parentId: parentResult.parentId,
|
|
247
|
+
kind: isChildPrefab ? 'prefabInstance' : 'model',
|
|
248
|
+
...(options.transform ? { transform: structuredClone(options.transform) } : {}),
|
|
249
|
+
...(isChildPrefab ? { childPrefabId: asset.id } : { sourceAssetId: asset.id }),
|
|
250
|
+
...(readEditorSceneNonEmptyString(options.sourceNodePath) ? { sourceNodePath: readEditorSceneNonEmptyString(options.sourceNodePath) } : {}),
|
|
251
|
+
};
|
|
252
|
+
return appendEditorScenePrefabNode(prepared.prefabAsset, node);
|
|
253
|
+
}
|
|
254
|
+
export function createEditorScenePrefabPrimitiveNode(prefabAsset, options) {
|
|
255
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
256
|
+
if (!prepared.ok)
|
|
257
|
+
return prepared;
|
|
258
|
+
const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
|
|
259
|
+
if (!parentResult.ok)
|
|
260
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
|
|
261
|
+
const shape = readEditorSceneNonEmptyString(options.shape);
|
|
262
|
+
if (!shape) {
|
|
263
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
264
|
+
code: 'prefab.assetUnsupported',
|
|
265
|
+
severity: 'error',
|
|
266
|
+
message: 'Prefab primitive shape must be a non-empty string.',
|
|
267
|
+
assetId: prefabAsset.id,
|
|
268
|
+
}]);
|
|
269
|
+
}
|
|
270
|
+
const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
|
|
271
|
+
const node = {
|
|
272
|
+
id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, `primitive-${shape}`),
|
|
273
|
+
...(options.guid ? { guid: options.guid } : {}),
|
|
274
|
+
name: options.name ?? `${shape[0].toUpperCase()}${shape.slice(1)}`,
|
|
275
|
+
parentId: parentResult.parentId,
|
|
276
|
+
kind: 'primitive',
|
|
277
|
+
primitive: { shape },
|
|
278
|
+
...(options.transform ? { transform: structuredClone(options.transform) } : {}),
|
|
279
|
+
};
|
|
280
|
+
return appendEditorScenePrefabNode(prepared.prefabAsset, node);
|
|
281
|
+
}
|
|
282
|
+
export function createEditorScenePrefabGroupNode(prefabAsset, options = {}) {
|
|
283
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
284
|
+
if (!prepared.ok)
|
|
285
|
+
return prepared;
|
|
286
|
+
const parentResult = resolveEditorScenePrefabMutationParent(prepared.prefabAsset, options.parentId);
|
|
287
|
+
if (!parentResult.ok)
|
|
288
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, parentResult.diagnostics);
|
|
289
|
+
const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
|
|
290
|
+
const node = {
|
|
291
|
+
id: options.id ?? createUniqueEditorScenePrefabNodeId(nodes, 'group'),
|
|
292
|
+
...(options.guid ? { guid: options.guid } : {}),
|
|
293
|
+
name: options.name ?? 'Empty',
|
|
294
|
+
parentId: parentResult.parentId,
|
|
295
|
+
kind: 'group',
|
|
296
|
+
...(options.transform ? { transform: structuredClone(options.transform) } : {}),
|
|
297
|
+
};
|
|
298
|
+
return appendEditorScenePrefabNode(prepared.prefabAsset, node);
|
|
299
|
+
}
|
|
300
|
+
export function setEditorScenePrefabNodeTransform(prefabAsset, nodeId, transform) {
|
|
301
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
302
|
+
if (!prepared.ok)
|
|
303
|
+
return prepared;
|
|
304
|
+
if (!transform || transform.type !== 'Transform') {
|
|
305
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
306
|
+
code: 'prefab.invalidTransform',
|
|
307
|
+
severity: 'error',
|
|
308
|
+
message: `Prefab node "${nodeId}" requires a Transform component payload.`,
|
|
309
|
+
assetId: prefabAsset.id,
|
|
310
|
+
nodeId,
|
|
311
|
+
}]);
|
|
312
|
+
}
|
|
313
|
+
return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => ({
|
|
314
|
+
...node,
|
|
315
|
+
transform: structuredClone(transform),
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
export function setEditorScenePrefabNodeShadow(prefabAsset, nodeId, shadow) {
|
|
319
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
320
|
+
if (!prepared.ok)
|
|
321
|
+
return prepared;
|
|
322
|
+
return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => {
|
|
323
|
+
const defaults = { ...(node.defaults ?? {}) };
|
|
324
|
+
if (shadow && Object.keys(shadow).length > 0)
|
|
325
|
+
defaults.shadow = structuredClone(shadow);
|
|
326
|
+
else
|
|
327
|
+
delete defaults.shadow;
|
|
328
|
+
if (Object.keys(defaults).length > 0)
|
|
329
|
+
return { ...node, defaults };
|
|
330
|
+
const { defaults: _defaults, ...rest } = node;
|
|
331
|
+
return rest;
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
export function reparentEditorScenePrefabNode(prefabAsset, nodeId, parentId) {
|
|
335
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
336
|
+
if (!prepared.ok)
|
|
337
|
+
return prepared;
|
|
338
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
|
|
339
|
+
if (nodeId === rootNodeId) {
|
|
340
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
341
|
+
code: 'prefab.rootReparentRejected',
|
|
342
|
+
severity: 'error',
|
|
343
|
+
message: 'Prefab root node cannot be reparented.',
|
|
344
|
+
assetId: prefabAsset.id,
|
|
345
|
+
nodeId,
|
|
346
|
+
}]);
|
|
347
|
+
}
|
|
348
|
+
const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
|
|
349
|
+
if (!nodes.some(node => node.id === nodeId)) {
|
|
350
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
351
|
+
code: 'prefab.nodeNotFound',
|
|
352
|
+
severity: 'error',
|
|
353
|
+
message: `Prefab node "${nodeId}" was not found.`,
|
|
354
|
+
assetId: prefabAsset.id,
|
|
355
|
+
nodeId,
|
|
356
|
+
}]);
|
|
357
|
+
}
|
|
358
|
+
if (!nodes.some(node => node.id === parentId)) {
|
|
359
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
360
|
+
code: 'prefab.parentNotFound',
|
|
361
|
+
severity: 'error',
|
|
362
|
+
message: `Prefab parent node "${parentId}" was not found.`,
|
|
363
|
+
assetId: prefabAsset.id,
|
|
364
|
+
nodeId,
|
|
365
|
+
parentId,
|
|
366
|
+
}]);
|
|
367
|
+
}
|
|
368
|
+
if (nodeId === parentId || isEditorScenePrefabNodeDescendant(nodes, parentId, nodeId)) {
|
|
369
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
370
|
+
code: 'prefab.cycleReparentRejected',
|
|
371
|
+
severity: 'error',
|
|
372
|
+
message: `Prefab node "${nodeId}" cannot be parented under its own descendant "${parentId}".`,
|
|
373
|
+
assetId: prefabAsset.id,
|
|
374
|
+
nodeId,
|
|
375
|
+
parentId,
|
|
376
|
+
}]);
|
|
377
|
+
}
|
|
378
|
+
return updateEditorScenePrefabNode(prepared.prefabAsset, nodeId, (node) => ({
|
|
379
|
+
...node,
|
|
380
|
+
parentId,
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
export function deleteEditorScenePrefabNode(prefabAsset, nodeId) {
|
|
384
|
+
const prepared = ensureEditorScenePrefabComposition(prefabAsset);
|
|
385
|
+
if (!prepared.ok)
|
|
386
|
+
return prepared;
|
|
387
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prepared.prefabAsset);
|
|
388
|
+
if (nodeId === rootNodeId) {
|
|
389
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
390
|
+
code: 'prefab.rootDeleteRejected',
|
|
391
|
+
severity: 'error',
|
|
392
|
+
message: 'Prefab root node cannot be deleted.',
|
|
393
|
+
assetId: prefabAsset.id,
|
|
394
|
+
nodeId,
|
|
395
|
+
}]);
|
|
396
|
+
}
|
|
397
|
+
const nodes = readEditorScenePrefabNodes(prepared.prefabAsset);
|
|
398
|
+
const target = nodes.find(node => node.id === nodeId);
|
|
399
|
+
if (!target) {
|
|
400
|
+
return createEditorScenePrefabMutationResult(prepared.prefabAsset, false, null, [{
|
|
401
|
+
code: 'prefab.nodeNotFound',
|
|
402
|
+
severity: 'error',
|
|
403
|
+
message: `Prefab node "${nodeId}" was not found.`,
|
|
404
|
+
assetId: prefabAsset.id,
|
|
405
|
+
nodeId,
|
|
406
|
+
}]);
|
|
407
|
+
}
|
|
408
|
+
const deleted = new Set();
|
|
409
|
+
collectEditorScenePrefabNodeSubtree(nodes, nodeId, deleted);
|
|
410
|
+
const next = structuredClone(prepared.prefabAsset);
|
|
411
|
+
next.prefab = structuredClone(next.prefab);
|
|
412
|
+
next.prefab.nodes = nodes.filter(node => !deleted.has(node.id));
|
|
413
|
+
return createEditorScenePrefabMutationResult(next, true, target, [], {
|
|
414
|
+
deletedNodeIds: [...deleted],
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
function createEditorScenePrefabMutationResult(prefabAsset, changed, node = null, diagnostics = [], extra = {}) {
|
|
418
|
+
return {
|
|
419
|
+
ok: diagnostics.every(diagnostic => diagnostic.severity !== 'error'),
|
|
420
|
+
changed,
|
|
421
|
+
prefabAsset,
|
|
422
|
+
...(extra.selectedNodeId ? { selectedNodeId: extra.selectedNodeId } : {}),
|
|
423
|
+
...(extra.createdNodeId ? { createdNodeId: extra.createdNodeId } : {}),
|
|
424
|
+
...(extra.deletedNodeIds ? { deletedNodeIds: [...extra.deletedNodeIds] } : {}),
|
|
425
|
+
...(node ? { node: structuredClone(node) } : {}),
|
|
426
|
+
diagnostics: diagnostics.map(diagnostic => ({ ...diagnostic })),
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
function cloneEditorScenePrefabAssetWithComposition(prefabAsset) {
|
|
430
|
+
const next = structuredClone(prefabAsset);
|
|
431
|
+
const nodes = readEditorScenePrefabNodes(prefabAsset);
|
|
432
|
+
next.prefab = structuredClone(next.prefab);
|
|
433
|
+
next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
|
|
434
|
+
next.prefab.nodes = nodes;
|
|
435
|
+
const rootNodeId = readEditorScenePrefabRootNodeId({ ...prefabAsset, prefab: { ...prefabAsset.prefab, nodes } });
|
|
436
|
+
if (rootNodeId)
|
|
437
|
+
next.prefab.rootNodeId = rootNodeId;
|
|
438
|
+
else
|
|
439
|
+
delete next.prefab.rootNodeId;
|
|
440
|
+
return next;
|
|
441
|
+
}
|
|
442
|
+
function resolveEditorScenePrefabMutationParent(prefabAsset, parentId) {
|
|
443
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
|
|
444
|
+
const normalizedParentId = readEditorSceneNonEmptyString(parentId) ?? rootNodeId;
|
|
445
|
+
if (!normalizedParentId || !findEditorScenePrefabNode(prefabAsset, normalizedParentId)) {
|
|
446
|
+
return {
|
|
447
|
+
ok: false,
|
|
448
|
+
diagnostics: [{
|
|
449
|
+
code: 'prefab.parentNotFound',
|
|
450
|
+
severity: 'error',
|
|
451
|
+
message: `Prefab parent node "${normalizedParentId ?? parentId ?? 'root'}" was not found.`,
|
|
452
|
+
assetId: prefabAsset.id,
|
|
453
|
+
...(normalizedParentId ? { parentId: normalizedParentId } : {}),
|
|
454
|
+
}],
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
return { ok: true, parentId: normalizedParentId };
|
|
458
|
+
}
|
|
459
|
+
function appendEditorScenePrefabNode(prefabAsset, node) {
|
|
460
|
+
const next = structuredClone(prefabAsset);
|
|
461
|
+
const nodes = readEditorScenePrefabNodes(prefabAsset);
|
|
462
|
+
const nodeId = createUniqueEditorScenePrefabNodeId(nodes, node.id);
|
|
463
|
+
const nextNode = {
|
|
464
|
+
...structuredClone(node),
|
|
465
|
+
id: nodeId,
|
|
466
|
+
};
|
|
467
|
+
next.prefab = structuredClone(next.prefab);
|
|
468
|
+
next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
|
|
469
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
|
|
470
|
+
if (rootNodeId)
|
|
471
|
+
next.prefab.rootNodeId = rootNodeId;
|
|
472
|
+
else
|
|
473
|
+
delete next.prefab.rootNodeId;
|
|
474
|
+
next.prefab.nodes = [...nodes, nextNode];
|
|
475
|
+
return createEditorScenePrefabMutationResult(next, true, nextNode, [], {
|
|
476
|
+
createdNodeId: nextNode.id,
|
|
477
|
+
selectedNodeId: nextNode.id,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
function updateEditorScenePrefabNode(prefabAsset, nodeId, update) {
|
|
481
|
+
const nodes = readEditorScenePrefabNodes(prefabAsset);
|
|
482
|
+
const index = nodes.findIndex(node => node.id === nodeId);
|
|
483
|
+
if (index < 0) {
|
|
484
|
+
return createEditorScenePrefabMutationResult(prefabAsset, false, null, [{
|
|
485
|
+
code: 'prefab.nodeNotFound',
|
|
486
|
+
severity: 'error',
|
|
487
|
+
message: `Prefab node "${nodeId}" was not found.`,
|
|
488
|
+
assetId: prefabAsset.id,
|
|
489
|
+
nodeId,
|
|
490
|
+
}]);
|
|
491
|
+
}
|
|
492
|
+
const updated = update(structuredClone(nodes[index]));
|
|
493
|
+
const nextNodes = [...nodes];
|
|
494
|
+
nextNodes[index] = updated;
|
|
495
|
+
const next = structuredClone(prefabAsset);
|
|
496
|
+
next.prefab = structuredClone(next.prefab);
|
|
497
|
+
next.prefab.compositionVersion = EDITOR_SCENE_PREFAB_COMPOSITION_VERSION;
|
|
498
|
+
const rootNodeId = readEditorScenePrefabRootNodeId(prefabAsset);
|
|
499
|
+
if (rootNodeId)
|
|
500
|
+
next.prefab.rootNodeId = rootNodeId;
|
|
501
|
+
else
|
|
502
|
+
delete next.prefab.rootNodeId;
|
|
503
|
+
next.prefab.nodes = nextNodes;
|
|
504
|
+
return createEditorScenePrefabMutationResult(next, JSON.stringify(nodes[index]) !== JSON.stringify(updated), updated, [], {
|
|
505
|
+
selectedNodeId: updated.id,
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
function createUniqueEditorScenePrefabNodeId(nodes, preferredId) {
|
|
509
|
+
const used = new Set(nodes.map(node => node.id));
|
|
510
|
+
const base = normalizeEditorScenePrefabIdentifierPart(preferredId) ?? 'prefab_node';
|
|
511
|
+
if (!used.has(base))
|
|
512
|
+
return base;
|
|
513
|
+
let suffix = 1;
|
|
514
|
+
let candidate = `${base}_${suffix}`;
|
|
515
|
+
while (used.has(candidate)) {
|
|
516
|
+
suffix += 1;
|
|
517
|
+
candidate = `${base}_${suffix}`;
|
|
518
|
+
}
|
|
519
|
+
return candidate;
|
|
520
|
+
}
|
|
521
|
+
function isEditorScenePrefabNodeDescendant(nodes, candidateNodeId, ancestorNodeId) {
|
|
522
|
+
let current = nodes.find(node => node.id === candidateNodeId);
|
|
523
|
+
const visited = new Set();
|
|
524
|
+
while (current?.parentId) {
|
|
525
|
+
if (current.parentId === ancestorNodeId)
|
|
526
|
+
return true;
|
|
527
|
+
if (visited.has(current.parentId))
|
|
528
|
+
return false;
|
|
529
|
+
visited.add(current.parentId);
|
|
530
|
+
current = nodes.find(node => node.id === current?.parentId);
|
|
531
|
+
}
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
function collectEditorScenePrefabNodeSubtree(nodes, nodeId, output) {
|
|
535
|
+
if (output.has(nodeId))
|
|
536
|
+
return;
|
|
537
|
+
output.add(nodeId);
|
|
538
|
+
for (const child of nodes.filter(node => node.parentId === nodeId)) {
|
|
539
|
+
collectEditorScenePrefabNodeSubtree(nodes, child.id, output);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
33
542
|
export function createEditorScenePrefabDefinitionFromAsset(sourceAsset, options = {}) {
|
|
34
543
|
return {
|
|
35
544
|
id: options.id ?? `${sourceAsset.id}-prefab`,
|
|
@@ -41,10 +550,98 @@ export function createEditorScenePrefabDefinitionFromAsset(sourceAsset, options
|
|
|
41
550
|
sourceAssetId: sourceAsset.id,
|
|
42
551
|
...(sourceAsset.guid ? { sourceAssetGuid: sourceAsset.guid } : {}),
|
|
43
552
|
...(options.defaults ? { defaults: { ...options.defaults } } : {}),
|
|
553
|
+
compositionVersion: EDITOR_SCENE_PREFAB_COMPOSITION_VERSION,
|
|
554
|
+
rootNodeId: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
|
|
555
|
+
nodes: [
|
|
556
|
+
{
|
|
557
|
+
id: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
|
|
558
|
+
name: options.displayName ?? createEditorScenePrefabDisplayName(sourceAsset),
|
|
559
|
+
kind: 'root',
|
|
560
|
+
...(options.defaults ? { defaults: { ...options.defaults } } : {}),
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
id: EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID,
|
|
564
|
+
name: sourceAsset.displayName ?? sourceAsset.id,
|
|
565
|
+
parentId: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
|
|
566
|
+
kind: 'model',
|
|
567
|
+
sourceAssetId: sourceAsset.id,
|
|
568
|
+
},
|
|
569
|
+
],
|
|
44
570
|
},
|
|
45
571
|
...(options.metadata ? { metadata: { ...options.metadata } } : {}),
|
|
46
572
|
};
|
|
47
573
|
}
|
|
574
|
+
function readEditorScenePrefabExplicitNodes(prefab) {
|
|
575
|
+
if (!Array.isArray(prefab.nodes))
|
|
576
|
+
return [];
|
|
577
|
+
const nodes = [];
|
|
578
|
+
for (const rawNode of prefab.nodes) {
|
|
579
|
+
const node = readEditorScenePrefabNode(rawNode);
|
|
580
|
+
if (node && !nodes.some(existing => existing.id === node.id))
|
|
581
|
+
nodes.push(node);
|
|
582
|
+
}
|
|
583
|
+
return structuredClone(nodes);
|
|
584
|
+
}
|
|
585
|
+
function readEditorScenePrefabNode(value) {
|
|
586
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
587
|
+
return null;
|
|
588
|
+
const record = value;
|
|
589
|
+
const id = readEditorSceneNonEmptyString(record.id);
|
|
590
|
+
if (!id || !isEditorScenePrefabNodeKind(record.kind))
|
|
591
|
+
return null;
|
|
592
|
+
return {
|
|
593
|
+
id,
|
|
594
|
+
...(readEditorSceneNonEmptyString(record.guid) ? { guid: readEditorSceneNonEmptyString(record.guid) } : {}),
|
|
595
|
+
...(readEditorSceneNonEmptyString(record.name) ? { name: readEditorSceneNonEmptyString(record.name) } : {}),
|
|
596
|
+
...(readEditorSceneNonEmptyString(record.parentId) ? { parentId: readEditorSceneNonEmptyString(record.parentId) } : {}),
|
|
597
|
+
kind: record.kind,
|
|
598
|
+
...(record.transform ? { transform: structuredClone(record.transform) } : {}),
|
|
599
|
+
...(readEditorSceneNonEmptyString(record.sourceAssetId) ? { sourceAssetId: readEditorSceneNonEmptyString(record.sourceAssetId) } : {}),
|
|
600
|
+
...(readEditorSceneNonEmptyString(record.sourceNodePath) ? { sourceNodePath: readEditorSceneNonEmptyString(record.sourceNodePath) } : {}),
|
|
601
|
+
...(readEditorSceneNonEmptyString(record.childPrefabId) ? { childPrefabId: readEditorSceneNonEmptyString(record.childPrefabId) } : {}),
|
|
602
|
+
...(record.primitive ? { primitive: structuredClone(record.primitive) } : {}),
|
|
603
|
+
...(record.light ? { light: structuredClone(record.light) } : {}),
|
|
604
|
+
...(record.defaults ? { defaults: structuredClone(record.defaults) } : {}),
|
|
605
|
+
...(record.overrides ? { overrides: structuredClone(record.overrides) } : {}),
|
|
606
|
+
...(record.metadata ? { metadata: structuredClone(record.metadata) } : {}),
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
function isEditorScenePrefabNodeKind(value) {
|
|
610
|
+
return value === 'root'
|
|
611
|
+
|| value === 'group'
|
|
612
|
+
|| value === 'model'
|
|
613
|
+
|| value === 'primitive'
|
|
614
|
+
|| value === 'light'
|
|
615
|
+
|| value === 'prefabInstance'
|
|
616
|
+
|| value === 'collision';
|
|
617
|
+
}
|
|
618
|
+
function createEditorScenePrefabLegacyCompositionNodes(prefabAsset) {
|
|
619
|
+
const root = createEditorScenePrefabLegacyRootNode(prefabAsset);
|
|
620
|
+
const sourceAssetId = resolveEditorScenePrefabSourceAssetId(prefabAsset);
|
|
621
|
+
if (!root || !sourceAssetId)
|
|
622
|
+
return [];
|
|
623
|
+
return [
|
|
624
|
+
root,
|
|
625
|
+
{
|
|
626
|
+
id: EDITOR_SCENE_PREFAB_LEGACY_MODEL_NODE_ID,
|
|
627
|
+
name: readEditorSceneNonEmptyString(prefabAsset.displayName) ?? sourceAssetId,
|
|
628
|
+
parentId: root.id,
|
|
629
|
+
kind: 'model',
|
|
630
|
+
sourceAssetId,
|
|
631
|
+
},
|
|
632
|
+
];
|
|
633
|
+
}
|
|
634
|
+
function createEditorScenePrefabLegacyRootNode(prefabAsset) {
|
|
635
|
+
if (!resolveEditorScenePrefabSourceAssetId(prefabAsset))
|
|
636
|
+
return null;
|
|
637
|
+
return {
|
|
638
|
+
id: EDITOR_SCENE_PREFAB_LEGACY_ROOT_NODE_ID,
|
|
639
|
+
name: readEditorSceneNonEmptyString(prefabAsset.displayName) ?? 'Prefab',
|
|
640
|
+
kind: 'root',
|
|
641
|
+
...(prefabAsset.prefab?.defaults ? { defaults: structuredClone(prefabAsset.prefab.defaults) } : {}),
|
|
642
|
+
...(prefabAsset.prefab?.overrides ? { overrides: structuredClone(prefabAsset.prefab.overrides) } : {}),
|
|
643
|
+
};
|
|
644
|
+
}
|
|
48
645
|
export function createEditorScenePrefabInstanceGameObject(input) {
|
|
49
646
|
const sourceAssetId = resolveEditorScenePrefabSourceAssetId(input.prefabAsset);
|
|
50
647
|
if (!sourceAssetId) {
|
|
@@ -59,6 +656,7 @@ export function createEditorScenePrefabInstanceGameObject(input) {
|
|
|
59
656
|
...(input.parentId ? { parentId: input.parentId } : {}),
|
|
60
657
|
active: input.active ?? defaults?.active ?? true,
|
|
61
658
|
...(input.shadowMode ?? defaults?.shadowMode ? { shadowMode: input.shadowMode ?? defaults?.shadowMode } : {}),
|
|
659
|
+
...(input.shadow ?? defaults?.shadow ? { shadow: structuredClone(input.shadow ?? defaults?.shadow) } : {}),
|
|
62
660
|
prefab: {
|
|
63
661
|
prefabId: input.prefabAsset.id,
|
|
64
662
|
...(input.prefabAsset.guid ? { prefabGuid: input.prefabAsset.guid } : {}),
|
|
@@ -374,8 +972,7 @@ export function resolveEditorSceneGameObjectRendering(gameObject) {
|
|
|
374
972
|
? gameObject.rendering
|
|
375
973
|
: undefined;
|
|
376
974
|
const renderingGroupId = readEditorSceneGameObjectRenderingGroupId(rendering?.renderingGroupId);
|
|
377
|
-
const alphaIndex = readEditorSceneFiniteNumber(rendering?.alphaIndex)
|
|
378
|
-
?? readEditorSceneLegacyGroundDecalAlphaIndex(gameObject);
|
|
975
|
+
const alphaIndex = readEditorSceneFiniteNumber(rendering?.alphaIndex);
|
|
379
976
|
const resolved = {};
|
|
380
977
|
if (renderingGroupId != null)
|
|
381
978
|
resolved.renderingGroupId = renderingGroupId;
|
|
@@ -395,18 +992,25 @@ function isEditorSceneTransformComponent(component) {
|
|
|
395
992
|
function isEditorSceneModelRendererComponent(component) {
|
|
396
993
|
return component.type === 'ModelRenderer';
|
|
397
994
|
}
|
|
398
|
-
function readEditorSceneLegacyGroundDecalAlphaIndex(gameObject) {
|
|
399
|
-
const groundDecal = gameObject.groundDecal;
|
|
400
|
-
if (!groundDecal || typeof groundDecal !== 'object' || Array.isArray(groundDecal))
|
|
401
|
-
return null;
|
|
402
|
-
return readEditorSceneFiniteNumber(groundDecal.alphaIndex);
|
|
403
|
-
}
|
|
404
995
|
function readEditorSceneFiniteNumber(value) {
|
|
405
996
|
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
406
997
|
}
|
|
407
998
|
function readEditorSceneNonEmptyString(value) {
|
|
408
999
|
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;
|
|
409
1000
|
}
|
|
1001
|
+
function normalizeEditorScenePrefabEditableName(value) {
|
|
1002
|
+
if (typeof value !== 'string')
|
|
1003
|
+
return { ok: false, message: 'Prefab name must be a string.' };
|
|
1004
|
+
const name = value.trim();
|
|
1005
|
+
if (!name)
|
|
1006
|
+
return { ok: false, message: 'Prefab name cannot be empty.' };
|
|
1007
|
+
if (name.length > 80)
|
|
1008
|
+
return { ok: false, message: 'Prefab name cannot be longer than 80 characters.' };
|
|
1009
|
+
if (/[\u0000-\u001f\u007f/\\]/u.test(name)) {
|
|
1010
|
+
return { ok: false, message: 'Prefab name cannot contain control characters, /, or \\.' };
|
|
1011
|
+
}
|
|
1012
|
+
return { ok: true, name };
|
|
1013
|
+
}
|
|
410
1014
|
function findEditorSceneGameObject(document, gameObjectId) {
|
|
411
1015
|
return document.scene.gameObjects.find(gameObject => gameObject.id === gameObjectId) ?? null;
|
|
412
1016
|
}
|