@vgai/editor 0.2.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/LICENSE +661 -0
- package/README.md +35 -0
- package/dist/a/b/c/test-nested.json +1 -0
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +1 -0
- package/dist/assets/SelectionBox-BXsv_6aH.js +1 -0
- package/dist/assets/browser-project-scripts-DOru4L1x.js +2 -0
- package/dist/assets/browserAll-CEkWYlFk.js +1 -0
- package/dist/assets/collision-world-DniMB0qq.glb +0 -0
- package/dist/assets/create-runtime-DYIWr3va.js +1 -0
- package/dist/assets/data-asset-Bb9sIM7i.js +5 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/fake-three-BMTQ9rl_.js +1 -0
- package/dist/assets/game-8SDZPPgH.js +1 -0
- package/dist/assets/game-BI111o5f.js +10 -0
- package/dist/assets/game-CevorxyV.js +1 -0
- package/dist/assets/game-Di1H0gFj.js +1 -0
- package/dist/assets/game-Di7XlywD.js +1 -0
- package/dist/assets/game-DjnCaw8R.js +1 -0
- package/dist/assets/game-Q9A0aXSV.js +1 -0
- package/dist/assets/game-pt_1lQLv.js +1 -0
- package/dist/assets/game-source-CvidN7AB.js +1 -0
- package/dist/assets/game-xsOho_wg.js +83 -0
- package/dist/assets/index-Bp5cecD6.js +12 -0
- package/dist/assets/index-CPVV6pjw.js +1 -0
- package/dist/assets/index-CpOnYyeD.js +213 -0
- package/dist/assets/index-Cs8xwv3e.js +1 -0
- package/dist/assets/index-DL7RcQ0n.js +27 -0
- package/dist/assets/index-Dr8H_6Rl.js +1 -0
- package/dist/assets/index-_bCaipUk.js +13650 -0
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +1 -0
- package/dist/assets/mount-manifest-Bhk0ohsl.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-CvP4UGK6.js +1 -0
- package/dist/assets/scene-query-BivAHhJu.js +1 -0
- package/dist/assets/stats.module--VATS4Kh.js +1 -0
- package/dist/assets/webworkerAll-BLrH0F6F.js +1 -0
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +1 -0
- package/dist/assets/xstate.esm-BgUD33nl.js +3 -0
- package/dist/index.html +37 -0
- package/dist/ingest/racing-game/UPSTREAM.md +68 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-italic.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-roman.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/index.css +1 -0
- package/dist/ingest/racing-game/images/bronze.png +0 -0
- package/dist/ingest/racing-game/images/gold.png +0 -0
- package/dist/ingest/racing-game/images/silver.png +0 -0
- package/dist/ingest/racing-game/index.html +15 -0
- package/dist/ingest/racing-game/models/chassis-draco.glb +0 -0
- package/dist/ingest/racing-game/models/track-draco.glb +0 -0
- package/dist/ingest/racing-game/models/wheel-draco.glb +0 -0
- package/dist/ingest/racing-game/rg-entry.js +1 -0
- package/dist/ingest/racing-game/sounds/accelerate.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/boost.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/crash.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/engine.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/honk.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/tire-brake.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/train.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/water.mp3 +0 -0
- package/dist/ingest/racing-game/textures/cursor.svg +3 -0
- package/dist/ingest/racing-game/textures/dikhololo_night_1k.hdr +0 -0
- package/dist/ingest/racing-game/textures/heightmap_1024.png +0 -0
- package/dist/ingest/racing-game/textures/mask.svg +11 -0
- package/dist/ingest/racing-game/textures/no_sound.png +0 -0
- package/dist/ingest/racing-game/three-r139.module.js +50617 -0
- package/dist/ingest/racing-game/vendor.js +179 -0
- package/dist/ingest/racing-game/vgai.game.json +20 -0
- package/dist/ingest/simcity/UPSTREAM.md +65 -0
- package/dist/ingest/simcity/favicon.ico +0 -0
- package/dist/ingest/simcity/fonts/Bebas-Regular.otf +0 -0
- package/dist/ingest/simcity/fonts/Digitalt.otf +0 -0
- package/dist/ingest/simcity/fonts/Stanberry.ttf +0 -0
- package/dist/ingest/simcity/icons/bulldozer-color.png +0 -0
- package/dist/ingest/simcity/icons/bulldozer.png +0 -0
- package/dist/ingest/simcity/icons/calendar.png +0 -0
- package/dist/ingest/simcity/icons/factory-color.png +0 -0
- package/dist/ingest/simcity/icons/factory.png +0 -0
- package/dist/ingest/simcity/icons/house-color.png +0 -0
- package/dist/ingest/simcity/icons/house.png +0 -0
- package/dist/ingest/simcity/icons/job.png +0 -0
- package/dist/ingest/simcity/icons/office.png +0 -0
- package/dist/ingest/simcity/icons/pause-color.png +0 -0
- package/dist/ingest/simcity/icons/pause.png +0 -0
- package/dist/ingest/simcity/icons/person.png +0 -0
- package/dist/ingest/simcity/icons/play-color.png +0 -0
- package/dist/ingest/simcity/icons/play.png +0 -0
- package/dist/ingest/simcity/icons/power-color.png +0 -0
- package/dist/ingest/simcity/icons/power-line-color.png +0 -0
- package/dist/ingest/simcity/icons/power.png +0 -0
- package/dist/ingest/simcity/icons/road-color.png +0 -0
- package/dist/ingest/simcity/icons/road.png +0 -0
- package/dist/ingest/simcity/icons/select-color.png +0 -0
- package/dist/ingest/simcity/icons/select.png +0 -0
- package/dist/ingest/simcity/icons/store-color.png +0 -0
- package/dist/ingest/simcity/index.html +94 -0
- package/dist/ingest/simcity/index.js +58 -0
- package/dist/ingest/simcity/main.css +233 -0
- package/dist/ingest/simcity/models/armored-truck.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-corner.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-short.glb +0 -0
- package/dist/ingest/simcity/models/building-block-5floor.glb +0 -0
- package/dist/ingest/simcity/models/building-burger-joint.glb +0 -0
- package/dist/ingest/simcity/models/building-cafe.glb +0 -0
- package/dist/ingest/simcity/models/building-casino.glb +0 -0
- package/dist/ingest/simcity/models/building-cinema.glb +0 -0
- package/dist/ingest/simcity/models/building-house-block-big.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-large.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-small.glb +0 -0
- package/dist/ingest/simcity/models/building-office-balcony.glb +0 -0
- package/dist/ingest/simcity/models/building-office-big.glb +0 -0
- package/dist/ingest/simcity/models/building-office-pyramid.glb +0 -0
- package/dist/ingest/simcity/models/building-office-tall.glb +0 -0
- package/dist/ingest/simcity/models/building-office.glb +0 -0
- package/dist/ingest/simcity/models/building-restaurant.glb +0 -0
- package/dist/ingest/simcity/models/building-skyscraper.glb +0 -0
- package/dist/ingest/simcity/models/car-ambulance-pickup.glb +0 -0
- package/dist/ingest/simcity/models/car-baywatch.glb +0 -0
- package/dist/ingest/simcity/models/car-hippie-van.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger-race.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger.glb +0 -0
- package/dist/ingest/simcity/models/car-police.glb +0 -0
- package/dist/ingest/simcity/models/car-taxi.glb +0 -0
- package/dist/ingest/simcity/models/car-tow-truck.glb +0 -0
- package/dist/ingest/simcity/models/car-truck-dump.glb +0 -0
- package/dist/ingest/simcity/models/car-veteran.glb +0 -0
- package/dist/ingest/simcity/models/construction-small.glb +0 -0
- package/dist/ingest/simcity/models/data-center.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory-old.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory.glb +0 -0
- package/dist/ingest/simcity/models/industry-refinery.glb +0 -0
- package/dist/ingest/simcity/models/industry-warehouse.glb +0 -0
- package/dist/ingest/simcity/models/power_line_pole_modified.glb +0 -0
- package/dist/ingest/simcity/models/tile-plain_grass.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-curve.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-end.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection-t.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-straight.glb +0 -0
- package/dist/ingest/simcity/models/truck.glb +0 -0
- package/dist/ingest/simcity/statusIcons/no-power.png +0 -0
- package/dist/ingest/simcity/statusIcons/no-road-access.png +0 -0
- package/dist/ingest/simcity/textures/base.png +0 -0
- package/dist/ingest/simcity/textures/grid.png +0 -0
- package/dist/ingest/simcity/textures/specular.png +0 -0
- package/dist/ingest/simcity/three-r155.module.js +51466 -0
- package/dist/ingest/simcity/vgai.game.json +20 -0
- package/dist/ingest/tanks/UPSTREAM.md +69 -0
- package/dist/ingest/tanks/index.html +214 -0
- package/dist/ingest/tanks/models/pixelTank.fbx +0 -0
- package/dist/ingest/tanks/tanks-entry.js +92 -0
- package/dist/ingest/tanks/three-r170.module.js +54571 -0
- package/dist/ingest/tanks/vgai.game.json +20 -0
- package/dist/inputmaps/default.inputmap.json +41 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/dist/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/dist/scenes/untitled.vscn.json +29 -0
- package/dist/textures/waternormals.jpg +0 -0
- package/dist-server/packaged.mjs +18155 -0
- package/package.json +36 -0
- package/server/asset-library-routes.ts +833 -0
- package/server/canonical-path.ts +50 -0
- package/server/cloud-asset-catalog.ts +101 -0
- package/server/dev.ts +350 -0
- package/server/editor-server.ts +1537 -0
- package/server/editor-sse.ts +73 -0
- package/server/game-globals-shadow.ts +58 -0
- package/server/local-asset-catalog.ts +163 -0
- package/server/packaged.ts +571 -0
- package/server/prod.ts +75 -0
- package/server/project-optimize-deps-entries.ts +149 -0
- package/server/project-view.ts +65 -0
- package/server/server-utils.ts +430 -0
- package/server/session-registry.ts +93 -0
- package/src/EditorContext.tsx +87 -0
- package/src/achieved-tier.ts +126 -0
- package/src/action-registry.ts +268 -0
- package/src/adapter-resolver.ts +1858 -0
- package/src/asset-events.ts +100 -0
- package/src/authoring/active-adapter.ts +98 -0
- package/src/authoring/active-systems.ts +50 -0
- package/src/authoring/boundary-authoring-adapter.ts +178 -0
- package/src/authoring/composite-authoring-adapter.ts +891 -0
- package/src/authoring/design-time-layers.ts +776 -0
- package/src/authoring/edit-mode-authoring.ts +643 -0
- package/src/authoring/embed-only-adapter.ts +57 -0
- package/src/authoring/ephemeral-persistence.ts +26 -0
- package/src/authoring/eyedropper-session.ts +69 -0
- package/src/authoring/first-party-hierarchy-menu.ts +74 -0
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +118 -0
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +550 -0
- package/src/authoring/first-party-inspector/HeaderSection.tsx +329 -0
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +44 -0
- package/src/authoring/first-party-inspector/register.tsx +108 -0
- package/src/authoring/ingest-authoring-adapter.ts +475 -0
- package/src/authoring/ingest-capture.ts +94 -0
- package/src/authoring/ingest-game-adapter.ts +291 -0
- package/src/authoring/ingest-iframe-adapter.ts +38 -0
- package/src/authoring/ingest-iframe-reachable-adapter.ts +401 -0
- package/src/authoring/ingest-overlay.ts +193 -0
- package/src/authoring/layered-pick.ts +87 -0
- package/src/authoring/mount-failure-report.ts +112 -0
- package/src/authoring/overlay-report.ts +52 -0
- package/src/authoring/project-scenes.ts +111 -0
- package/src/authoring/react-dom-authoring-adapter.ts +795 -0
- package/src/authoring/react-inspector-section.tsx +1041 -0
- package/src/authoring/react-world-authoring-adapter.ts +2400 -0
- package/src/authoring/root-activation.ts +61 -0
- package/src/authoring/scene-ui-layer.ts +485 -0
- package/src/authoring/story-overlay.ts +48 -0
- package/src/authoring/ui-authoring-adapter.ts +325 -0
- package/src/authoring/ui-hierarchy-menu.ts +40 -0
- package/src/authoring/ui-inspector-sections.tsx +156 -0
- package/src/authoring/undo-timeline.ts +145 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +746 -0
- package/src/authoring/viewport-pick-context.ts +31 -0
- package/src/authoring/viewport-raycast.ts +80 -0
- package/src/authoring/world-overlay.ts +76 -0
- package/src/authoring/world-pan-state.ts +115 -0
- package/src/authoring/world-session-state.ts +102 -0
- package/src/authoring/world2d-authoring-adapter.ts +313 -0
- package/src/browser-external-watch.ts +98 -0
- package/src/browser-play-entry.ts +112 -0
- package/src/browser-project-scripts.ts +112 -0
- package/src/browser-transpile.ts +246 -0
- package/src/browser-watch-reload.ts +100 -0
- package/src/command-listener.ts +326 -0
- package/src/components/AlignToolbar.tsx +189 -0
- package/src/components/AppRoot.tsx +73 -0
- package/src/components/AssetBrowser.tsx +502 -0
- package/src/components/BottomPanel.tsx +326 -0
- package/src/components/BuildPanel.tsx +455 -0
- package/src/components/CameraInfo.tsx +56 -0
- package/src/components/CommandPalette.tsx +265 -0
- package/src/components/ConsolePanel.tsx +272 -0
- package/src/components/DataPanel.tsx +1268 -0
- package/src/components/DefaultEditorLayout.tsx +509 -0
- package/src/components/FolderTree.tsx +179 -0
- package/src/components/GameHierarchy.tsx +1349 -0
- package/src/components/Inspector.tsx +671 -0
- package/src/components/InspectorToolSection.tsx +74 -0
- package/src/components/MountFailureBanner.tsx +110 -0
- package/src/components/NetworkSection.tsx +109 -0
- package/src/components/OnlineAssetBrowser.tsx +448 -0
- package/src/components/OverlayReportBanner.tsx +122 -0
- package/src/components/PlayBar.tsx +356 -0
- package/src/components/PrefabSaveDialog.tsx +201 -0
- package/src/components/ProjectHeader.tsx +174 -0
- package/src/components/ProjectScreen.tsx +1004 -0
- package/src/components/RightPanel.tsx +166 -0
- package/src/components/RootActivateDialog.tsx +105 -0
- package/src/components/SaveDialog.tsx +197 -0
- package/src/components/SaveStatus.tsx +69 -0
- package/src/components/StatsOverlay.tsx +35 -0
- package/src/components/ToolHost.tsx +80 -0
- package/src/components/Toolbar.tsx +307 -0
- package/src/components/ViewportOverlay.tsx +234 -0
- package/src/components/ViewportPanel.tsx +369 -0
- package/src/components/WorldContextMenu.tsx +257 -0
- package/src/components/WorldSelectionOverlay.tsx +2003 -0
- package/src/components/WorldTextEditor.tsx +86 -0
- package/src/components/asset-viewers/AssetViewer.tsx +38 -0
- package/src/components/asset-viewers/AudioViewer.tsx +149 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +77 -0
- package/src/components/asset-viewers/ImageViewer.tsx +65 -0
- package/src/components/asset-viewers/InputMapViewer.tsx +206 -0
- package/src/components/asset-viewers/ModelViewer.tsx +180 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +236 -0
- package/src/components/data-csv.ts +301 -0
- package/src/components/entity-name-commit.ts +18 -0
- package/src/components/inspector-property-grouping.ts +65 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +188 -0
- package/src/components/inspector-widgets/BorderEditor.tsx +305 -0
- package/src/components/inspector-widgets/ColorPicker.tsx +548 -0
- package/src/components/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/components/inspector-widgets/FontPicker.tsx +196 -0
- package/src/components/inspector-widgets/GradientEditor.tsx +277 -0
- package/src/components/inspector-widgets/ScrubbableInput.tsx +152 -0
- package/src/components/inspector-widgets/ShadowEditor.tsx +332 -0
- package/src/components/inspector-widgets/color-utils.ts +202 -0
- package/src/components/inspector-widgets/gallery-main.tsx +167 -0
- package/src/components/inspector-widgets/index.ts +22 -0
- package/src/components/inspector-widgets/shared.tsx +135 -0
- package/src/components/inspectors/AnimationSection.tsx +143 -0
- package/src/components/inspectors/AudioSection.tsx +215 -0
- package/src/components/inspectors/BoneAttachmentSection.tsx +82 -0
- package/src/components/inspectors/CameraSection.tsx +105 -0
- package/src/components/inspectors/ComponentsSection.tsx +358 -0
- package/src/components/inspectors/JointsSection.tsx +255 -0
- package/src/components/inspectors/LightSection.tsx +116 -0
- package/src/components/inspectors/MaterialSection.tsx +1189 -0
- package/src/components/inspectors/MeshSection.tsx +99 -0
- package/src/components/inspectors/NavigationSection.tsx +58 -0
- package/src/components/inspectors/ParticleSection.tsx +681 -0
- package/src/components/inspectors/PhysicsSection.tsx +326 -0
- package/src/components/inspectors/PostProcessingSection.tsx +1290 -0
- package/src/components/inspectors/RenderingSection.tsx +109 -0
- package/src/components/inspectors/ShadowSection.tsx +84 -0
- package/src/components/inspectors/SplineSection.tsx +191 -0
- package/src/components/inspectors/TransformSection.tsx +191 -0
- package/src/components/inspectors/json-schema-fields.ts +281 -0
- package/src/components/inspectors/multi-edit-utils.ts +49 -0
- package/src/components/inspectors/zod-fields.ts +184 -0
- package/src/components/primitives/ColorInput.tsx +109 -0
- package/src/components/primitives/JsonInput.tsx +98 -0
- package/src/components/primitives/NumberInput.tsx +164 -0
- package/src/components/primitives/Panel.tsx +68 -0
- package/src/components/primitives/SectionHeader.tsx +45 -0
- package/src/components/primitives/Tooltip.tsx +82 -0
- package/src/components/primitives/Vec3Input.tsx +62 -0
- package/src/components/world-overlay-gestures.ts +1438 -0
- package/src/doctor/data-checks.ts +285 -0
- package/src/doctor/report.ts +386 -0
- package/src/editor-api.ts +700 -0
- package/src/editor-console.ts +194 -0
- package/src/editor-hotkeys.ts +441 -0
- package/src/editor-layers.ts +2 -0
- package/src/editor-mode.ts +28 -0
- package/src/editor-store.ts +2225 -0
- package/src/editor-viewport.ts +1924 -0
- package/src/entity-factory.ts +221 -0
- package/src/game-globals-prelude.ts +27 -0
- package/src/gated-globals.ts +131 -0
- package/src/generated/setup-by-example.generated.ts +53 -0
- package/src/gizmo-registry.ts +608 -0
- package/src/handle-system.ts +221 -0
- package/src/hierarchy-menu-registry.ts +70 -0
- package/src/hierarchy-rows.ts +73 -0
- package/src/hosted-example.ts +160 -0
- package/src/hotkeys.ts +142 -0
- package/src/ingest/discovery-react.ts +132 -0
- package/src/ingest/discovery.ts +205 -0
- package/src/ingest/discovery2d.ts +204 -0
- package/src/ingest/esm-entry-resolution.ts +102 -0
- package/src/ingest/games/bloom-composer/game.js +99 -0
- package/src/ingest/games/bloom-composer/vgai.game.json +21 -0
- package/src/ingest/games/embed-bundle/embed.html +10 -0
- package/src/ingest/games/embed-bundle/vgai.game.json +21 -0
- package/src/ingest/games/games-fps/assets/collision-world.glb +0 -0
- package/src/ingest/games/games-fps/game.js +479 -0
- package/src/ingest/games/games-fps/vgai.game.json +24 -0
- package/src/ingest/games/iframe-reachable/game-source.js +58 -0
- package/src/ingest/games/iframe-reachable/vgai.game.json +21 -0
- package/src/ingest/games/interactive-cubes/game.js +139 -0
- package/src/ingest/games/interactive-cubes/vgai.game.json +21 -0
- package/src/ingest/games/mismatched-three/fake-three.js +38 -0
- package/src/ingest/games/mismatched-three/game.js +10 -0
- package/src/ingest/games/mismatched-three/vgai.game.json +22 -0
- package/src/ingest/games/own-three-bundled/game.js +43 -0
- package/src/ingest/games/own-three-bundled/vgai.game.json +21 -0
- package/src/ingest/games/pointerlock-maze/game.js +288 -0
- package/src/ingest/games/pointerlock-maze/vgai.game.json +22 -0
- package/src/ingest/games-2d/_fixtures/first-party-scene.scn2d.json +124 -0
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +25 -0
- package/src/ingest/games-2d/bunnymark/game.ts +88 -0
- package/src/ingest/games-2d/bunnymark/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy/game.ts +148 -0
- package/src/ingest/games-2d/flappy/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +25 -0
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +25 -0
- package/src/ingest/games-2d/tilemap-camera/game.ts +115 -0
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +21 -0
- package/src/ingest/games-react/react-rpg/entry.tsx +185 -0
- package/src/ingest/games-react/react-rpg/shims.d.ts +26 -0
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +129 -0
- package/src/ingest/games-react/react-rpg/vgai.game.json +21 -0
- package/src/ingest/host-namespace-registry.ts +196 -0
- package/src/ingest/types.ts +127 -0
- package/src/ingest-hierarchy-rows.ts +207 -0
- package/src/ingest-mode.ts +2092 -0
- package/src/ingest-siblings.ts +466 -0
- package/src/initial-scene.ts +194 -0
- package/src/inspector-section-registry.ts +117 -0
- package/src/interactive-edit-scope.ts +34 -0
- package/src/main.tsx +23 -0
- package/src/manifest-project.ts +43 -0
- package/src/model-thumbnail.ts +156 -0
- package/src/module-mode.ts +513 -0
- package/src/navmesh-handler.ts +94 -0
- package/src/packaged-runtime.ts +49 -0
- package/src/play-mode.ts +1148 -0
- package/src/playground/main.ts +206 -0
- package/src/project-manager.ts +173 -0
- package/src/scene-diff.ts +112 -0
- package/src/scene-serializer.ts +144 -0
- package/src/scene-sync.ts +587 -0
- package/src/scene-ui-mode/active-scene-ui.ts +58 -0
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +152 -0
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +29 -0
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +74 -0
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +49 -0
- package/src/scene-ui-mode/ui-prefab-io.ts +76 -0
- package/src/script-loader.ts +143 -0
- package/src/storage/fsa-storage.ts +55 -0
- package/src/storage/handle-storage.ts +150 -0
- package/src/storage/handle-store.ts +116 -0
- package/src/storage/http-storage.ts +137 -0
- package/src/storage/index.ts +147 -0
- package/src/storage/mem-storage.ts +135 -0
- package/src/storage/opfs-storage.ts +25 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/seed.ts +106 -0
- package/src/storage/types.ts +110 -0
- package/src/tool-loader.ts +291 -0
- package/src/ui-editor/inspector.tsx +563 -0
- package/src/ui-editor/node-ops.ts +266 -0
- package/src/ui-editor/overlay.tsx +380 -0
- package/src/ui-editor/palette.tsx +114 -0
- package/src/ui-editor/react-store.ts +78 -0
- package/src/ui-editor/timeline-panel.tsx +443 -0
- package/src/ui-editor/ui-edit-store.ts +552 -0
- package/src/ui-editor/ui-prefab.ts +95 -0
- package/src/ui-source/inspect.ts +544 -0
- package/src/ui-source/oid-transform.ts +133 -0
- package/src/ui-source/source-write-backend.ts +203 -0
- package/src/ui-source/tailwind-map.ts +174 -0
- package/src/ui-source/writer.ts +1175 -0
- package/src/widgets/index.ts +73 -0
- package/template/.claude/skills/editor/SKILL.md +252 -0
- package/template/CLAUDE.md +512 -0
- package/template/LICENSE +30 -0
- package/template/emit-schemas.ts +42 -0
- package/template/index.html +17 -0
- package/template/package.json +53 -0
- package/template/project.json +9 -0
- package/template/public/audio/ambient-arena.wav +0 -0
- package/template/public/audio/ambient-music.wav +0 -0
- package/template/public/audio/ambient-nature.wav +0 -0
- package/template/public/audio/ambient-wind.wav +0 -0
- package/template/public/inputmaps/default.inputmap.json +41 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/scenes/default.vscn.json +43 -0
- package/template/public/scenes/untitled.vscn.json +29 -0
- package/template/public/textures/waternormals.jpg +0 -0
- package/template/server/colyseus-setup.ts +85 -0
- package/template/server/main.ts +34 -0
- package/template/server/rooms/arena-room.ts +420 -0
- package/template/server/rooms/game-room.ts +162 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/data/README.md +40 -0
- package/template/src/data/assets.ts +31 -0
- package/template/src/data/tuning.data.json +5 -0
- package/template/src/data/tuning.schema.json +21 -0
- package/template/src/data/tuning.schema.ts +34 -0
- package/template/src/data/tuning.ts +24 -0
- package/template/src/main.ts +157 -0
- package/template/src/scripts/components/data-spinner.ts +45 -0
- package/template/src/scripts/components/scene-camera.ts +40 -0
- package/template/src/scripts/main.ts +94 -0
- package/template/src/scripts/registry.ts +46 -0
- package/template/src/tools/README.md +14 -0
- package/template/src/tools/example.tool.tsx +91 -0
- package/template/src/tools/spin.tool.tsx +101 -0
- package/template/src/ui/Button.tsx +27 -0
- package/template/src/ui/DefaultHud.tsx +40 -0
- package/template/src/ui/KeyHint.tsx +25 -0
- package/template/src/ui/Panel.tsx +52 -0
- package/template/src/ui/RebindPanel.tsx +129 -0
- package/template/src/ui/Slider.tsx +28 -0
- package/template/src/ui/StatusDot.tsx +22 -0
- package/template/src/ui/Toggle.tsx +19 -0
- package/template/src/ui/game-state.tsx +37 -0
- package/template/src/ui/index.ts +7 -0
- package/template/src/ui/mount-default-hud.tsx +19 -0
- package/template/src/ui/mount-ui.ts +15 -0
- package/template/tsconfig.json +36 -0
- package/template/validate-asset-content.ts +78 -0
- package/template/validate-manifest.ts +55 -0
- package/template/validate-scenes.ts +211 -0
- package/template/vgai.game.json +21 -0
- package/template/vite.config.ts +128 -0
- package/vite-plugin-example-assets.ts +60 -0
- package/vite-plugin-game-globals.ts +46 -0
- package/vite-plugin-game-static.ts +71 -0
- package/vite-plugin-project-game-static.ts +84 -0
- package/vite-plugin-react-game-static.ts +98 -0
- package/vite-plugin-react-world-provider.ts +81 -0
- package/vite-plugin-react-world-runtime.ts +76 -0
- package/vite-plugin-ui-oid.ts +561 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmbedOnlyAuthoringAdapter — the honest FLOOR for an OPAQUE prebuilt bundle.
|
|
3
|
+
*
|
|
4
|
+
* When a game ships as a prebuilt bundle with its own inlined `three` (no shared
|
|
5
|
+
* module, no reachable global), the scene-capture trap can't see its renderer, so
|
|
6
|
+
* the editor cannot introspect or edit its scene. Per the founding docs
|
|
7
|
+
* (`ADAPTER-ARCHITECTURE.md` §2.3, coverage table: "prebuilt bundle, three opaque
|
|
8
|
+
* → iframe embed → tier 0–1") we still HOST it — run it in an iframe, size it,
|
|
9
|
+
* dispose it — but expose no authoring. This adapter advertises exactly that: an
|
|
10
|
+
* informational hierarchy node and all `capabilities` false, so the editor's
|
|
11
|
+
* generic panels render an honest "embed-only" state instead of pretending to edit.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
AuthoringAdapter,
|
|
16
|
+
AuthoringCapabilities,
|
|
17
|
+
EditorNode,
|
|
18
|
+
HierarchyProvider,
|
|
19
|
+
} from '@engine/adapter';
|
|
20
|
+
import type { EditorStore } from '../editor-store';
|
|
21
|
+
|
|
22
|
+
const EMBED_ID = 'embed:root';
|
|
23
|
+
|
|
24
|
+
export function makeEmbedOnlyAdapter(store: EditorStore, label: string): AuthoringAdapter {
|
|
25
|
+
const node: EditorNode = {
|
|
26
|
+
id: EMBED_ID,
|
|
27
|
+
label: `${label} (embed-only)`,
|
|
28
|
+
kind: 'object',
|
|
29
|
+
parentId: null,
|
|
30
|
+
childIds: [],
|
|
31
|
+
flags: { runtimeOnly: true, locked: true },
|
|
32
|
+
};
|
|
33
|
+
const hierarchy: HierarchyProvider = {
|
|
34
|
+
roots: () => [node],
|
|
35
|
+
node: (id) => (id === EMBED_ID ? node : null),
|
|
36
|
+
object3D: () => null, // opaque — no reachable Object3D
|
|
37
|
+
idForObject3D: () => null,
|
|
38
|
+
};
|
|
39
|
+
const capabilities: AuthoringCapabilities = {
|
|
40
|
+
transform: false,
|
|
41
|
+
material: false,
|
|
42
|
+
inspectorFields: false,
|
|
43
|
+
create: false,
|
|
44
|
+
delete: false,
|
|
45
|
+
reparent: false,
|
|
46
|
+
persist: false,
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
capabilities,
|
|
50
|
+
hierarchy,
|
|
51
|
+
selection: {
|
|
52
|
+
get: () => [...store.selectedEntityIds],
|
|
53
|
+
set: (ids) => store.selectMultiple(ids),
|
|
54
|
+
},
|
|
55
|
+
subscribe: (listener) => store.subscribe(listener),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ephemeral persistence provider — for sessions whose edits must NOT survive past
|
|
3
|
+
* the session (play-mode's adoption of the live game scene; design
|
|
4
|
+
* `docs/PERSISTENCE-PROVIDER-DESIGN.md` §2/§7 slice 1).
|
|
5
|
+
*
|
|
6
|
+
* `isDirty()` is hard-coded `false`: nothing here is ever "unsaved" because there
|
|
7
|
+
* is nowhere for it to go — a no-op `save()` that pretended otherwise would lie in
|
|
8
|
+
* the save-status UI. Per the contract, the host never calls `save()` when
|
|
9
|
+
* `isDirty()` is false, so `save()` below is a documented no-op, not a silent
|
|
10
|
+
* swallow of a real write. `serialize()` still returns the live document so a
|
|
11
|
+
* future capture-style pull (design §6.5) can read it out.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { PersistenceProvider } from '@engine/adapter';
|
|
15
|
+
|
|
16
|
+
export function createEphemeralPersistence(getDoc: () => unknown): PersistenceProvider {
|
|
17
|
+
return {
|
|
18
|
+
isDirty: () => false,
|
|
19
|
+
save: async () => {
|
|
20
|
+
// Never called by the host (isDirty() is always false — see doc comment
|
|
21
|
+
// above). No-op: there is nothing to write, not a swallowed failure.
|
|
22
|
+
},
|
|
23
|
+
serialize: () => getDoc(),
|
|
24
|
+
destination: 'ephemeral (discarded on stop)',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eyedropper session (D3.d, docs/unified-world-editor/27-visual-react-editing.md
|
|
3
|
+
* §6 D3) — a module-level subscribable singleton bridging the C1 `ColorPicker`
|
|
4
|
+
* (mounted inside the Inspector panel) and the canvas (`WorldSelectionOverlay`),
|
|
5
|
+
* the two SIBLING React trees a "click the eyedropper button, then click
|
|
6
|
+
* somewhere on the canvas" gesture must cross when the native `EyeDropper` API
|
|
7
|
+
* is unavailable (the FALLBACK path this whole module exists for — see
|
|
8
|
+
* `ColorPicker.tsx`'s `handleEyedropper` and the `ColorSampleProvider` contract
|
|
9
|
+
* doc comment for why the native path needs none of this: it samples real
|
|
10
|
+
* rendered pixels itself).
|
|
11
|
+
*
|
|
12
|
+
* Mirrors `world-session-state.ts`'s "bare module singleton" shape, but keeps
|
|
13
|
+
* its OWN subscriber list (rather than piggybacking on `EditorStore.
|
|
14
|
+
* notifyIngestEdit`) since this is transient cross-panel UI state, not an
|
|
15
|
+
* authored/session toggle any editor-store snapshot needs to carry.
|
|
16
|
+
*
|
|
17
|
+
* Only ONE fallback pick can be in flight at a time — beginning a new one
|
|
18
|
+
* silently supersedes whatever was pending (mirrors the ColorPicker's own
|
|
19
|
+
* "one popover at a time" assumption; nothing today opens two eyedroppers at
|
|
20
|
+
* once).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export type EyedropperApply = (color: string | null) => void;
|
|
24
|
+
|
|
25
|
+
let activeApply: EyedropperApply | null = null;
|
|
26
|
+
const listeners = new Set<() => void>();
|
|
27
|
+
|
|
28
|
+
function notify(): void {
|
|
29
|
+
for (const l of listeners) l();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Begin a fallback eyedropper session — `apply` is the widget's own
|
|
33
|
+
* sampled-color callback, called exactly once when the session resolves
|
|
34
|
+
* (`null` color means "cancelled", e.g. Escape — never a fabricated color). */
|
|
35
|
+
export function beginEyedropperSession(apply: EyedropperApply): void {
|
|
36
|
+
activeApply = apply;
|
|
37
|
+
notify();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** True while a fallback session is awaiting a canvas click/Escape. */
|
|
41
|
+
export function isEyedropperSessionActive(): boolean {
|
|
42
|
+
return activeApply !== null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Resolve the active session with a sampled color (or `null` to cancel),
|
|
46
|
+
* then close it. A no-op if no session is active. */
|
|
47
|
+
export function resolveEyedropperSession(color: string | null): void {
|
|
48
|
+
const apply = activeApply;
|
|
49
|
+
if (!apply) return;
|
|
50
|
+
activeApply = null;
|
|
51
|
+
notify();
|
|
52
|
+
apply(color);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Subscribe to session begin/end transitions — `WorldSelectionOverlay` binds
|
|
56
|
+
* this via `useSyncExternalStore` so it re-renders (shows/hides the cursor
|
|
57
|
+
* swatch) the instant a session starts or ends. */
|
|
58
|
+
export function subscribeEyedropperSession(listener: () => void): () => void {
|
|
59
|
+
listeners.add(listener);
|
|
60
|
+
return () => listeners.delete(listener);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Test-only reset (mirrors `world-session-state.ts`'s identical helper) —
|
|
64
|
+
* drops any pending session and every subscriber so unit tests don't leak
|
|
65
|
+
* state across cases. */
|
|
66
|
+
export function _resetEyedropperSessionForTest(): void {
|
|
67
|
+
activeApply = null;
|
|
68
|
+
listeners.clear();
|
|
69
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party hierarchy context-menu extras (A2 escape hatch — see
|
|
3
|
+
* `hierarchy-menu-registry.ts`'s header comment; C2 blesses this seam as
|
|
4
|
+
* permanent).
|
|
5
|
+
*
|
|
6
|
+
* Ports the prefab Unpack/Open/Save-as actions from the deleted
|
|
7
|
+
* `SceneHierarchy.tsx`'s `ContextMenu` (former lines :258-298) behind
|
|
8
|
+
* `registerHierarchyMenuItems`, so `GameHierarchy` (the contract-only shell)
|
|
9
|
+
* never needs to know `SceneEntity`/`prefab` exist. Imported once for its
|
|
10
|
+
* side effect at boot (`main.tsx`).
|
|
11
|
+
*
|
|
12
|
+
* Scoping: `store.getEntityById(nodeId)` only resolves ids that are actually
|
|
13
|
+
* first-party `.vscn` entities in THIS store's own document — a foreign
|
|
14
|
+
* ingest/boundary node id never matches, and a composite's FOCUSED
|
|
15
|
+
* first-party child (A1 multi-world edit mode) still resolves correctly,
|
|
16
|
+
* since it shares the same store. No `instanceof`/adapter-identity check
|
|
17
|
+
* needed.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { resolveUrl } from '@engine/loader';
|
|
21
|
+
import { registerHierarchyMenuItems } from '../hierarchy-menu-registry';
|
|
22
|
+
|
|
23
|
+
// Prefab Unpack/Open/Save-as — not yet contract-expressible (StructureProvider
|
|
24
|
+
// has no "unpack"/"open source asset" verb, and InspectorProvider has no
|
|
25
|
+
// notion of "this entity IS a prefab instance"); registered by the owning
|
|
26
|
+
// adapter module (the C2-blessed pattern) rather than added as a new
|
|
27
|
+
// contract verb.
|
|
28
|
+
registerHierarchyMenuItems(
|
|
29
|
+
(ctx) => !!ctx.store.getEntityById(ctx.nodeId),
|
|
30
|
+
(ctx) => {
|
|
31
|
+
const entity = ctx.store.getEntityById(ctx.nodeId);
|
|
32
|
+
if (!entity) return [];
|
|
33
|
+
if (entity.prefab) {
|
|
34
|
+
const prefabPath = entity.prefab;
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
label: 'Unpack Prefab',
|
|
38
|
+
action: () => {
|
|
39
|
+
fetch(resolveUrl(prefabPath))
|
|
40
|
+
.then((res) => (res.ok ? res.json() : null))
|
|
41
|
+
.then((prefab) => {
|
|
42
|
+
if (prefab) ctx.store.unpackPrefab(ctx.nodeId, prefab.root);
|
|
43
|
+
})
|
|
44
|
+
.catch(() => {
|
|
45
|
+
/* ignore */
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: 'Open Prefab',
|
|
51
|
+
color: '#60a5fa',
|
|
52
|
+
action: () => {
|
|
53
|
+
window.dispatchEvent(
|
|
54
|
+
new CustomEvent('editor:open-asset', { detail: { path: prefabPath } }),
|
|
55
|
+
);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
label: 'Save as Prefab...',
|
|
63
|
+
color: '#60a5fa',
|
|
64
|
+
action: () => {
|
|
65
|
+
window.dispatchEvent(
|
|
66
|
+
new CustomEvent('editor:save-as-prefab', {
|
|
67
|
+
detail: { entityId: ctx.nodeId, name: entity.name },
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
},
|
|
74
|
+
);
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party "+ Add Section…" menu (C2, docs/unified-world-editor/26-
|
|
3
|
+
* unified-editor-spec.md §4 C2) — verbatim from the deleted
|
|
4
|
+
* `components/InspectorPanel.tsx` (former :241-339). Adds a section (Audio/
|
|
5
|
+
* Physics/Shadow/Particles/Spline) to every selected entity that's missing
|
|
6
|
+
* it, via `store.batchMutate` (free undo via `_pushUndo`).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { defaultParticlesData } from '@engine/scene/particles-factory';
|
|
10
|
+
import type { SectionProps } from '../../components/inspectors/multi-edit-utils';
|
|
11
|
+
import { useEditorStore } from '../../EditorContext';
|
|
12
|
+
|
|
13
|
+
type Entity = SectionProps['entities'][number];
|
|
14
|
+
|
|
15
|
+
interface AddSectionItem {
|
|
16
|
+
label: string;
|
|
17
|
+
/** Returns true if the entity already has this section. */
|
|
18
|
+
has: (e: Entity) => boolean;
|
|
19
|
+
/** Default data to add. */
|
|
20
|
+
defaults: Partial<Entity> | ((entity: Entity, all: Entity[]) => Partial<Entity>);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const addSectionItems: AddSectionItem[] = [
|
|
24
|
+
{
|
|
25
|
+
label: 'Bone Attachment',
|
|
26
|
+
has: (e) => !!e.boneAttachment,
|
|
27
|
+
defaults: (entity, all) => ({
|
|
28
|
+
boneAttachment: {
|
|
29
|
+
target: all.find((candidate) => candidate.id && candidate.id !== entity.id)?.id ?? '',
|
|
30
|
+
bone: 'hand_r',
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
label: 'Audio',
|
|
36
|
+
has: (e) => !!e.audio,
|
|
37
|
+
defaults: { audio: { spatial: true, volume: 1 } },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'Physics',
|
|
41
|
+
has: (e) => !!e.physics,
|
|
42
|
+
defaults: { physics: { bodyType: 'fixed', collider: { type: 'cuboid' } } },
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: 'Shadow',
|
|
46
|
+
has: (e) => !!e.shadow,
|
|
47
|
+
defaults: { shadow: { enabled: true } },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: 'Particles',
|
|
51
|
+
has: (e) => !!e.particles,
|
|
52
|
+
defaults: { particles: defaultParticlesData() },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
label: 'Spline',
|
|
56
|
+
has: (e) => !!e.spline,
|
|
57
|
+
defaults: {
|
|
58
|
+
spline: {
|
|
59
|
+
curveType: 'centripetal' as const,
|
|
60
|
+
points: [
|
|
61
|
+
[0, 0, 0] as [number, number, number],
|
|
62
|
+
[1, 0, 1] as [number, number, number],
|
|
63
|
+
[2, 0, 0] as [number, number, number],
|
|
64
|
+
],
|
|
65
|
+
closed: false,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
export function AddSectionMenu({ entities, ids }: SectionProps) {
|
|
72
|
+
const store = useEditorStore();
|
|
73
|
+
// Show items where at least one selected entity is missing that section
|
|
74
|
+
const available = addSectionItems.filter((item) => entities.some((e) => !item.has(e)));
|
|
75
|
+
if (available.length === 0) return null;
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<div style={{ padding: '6px 8px' }}>
|
|
79
|
+
<select
|
|
80
|
+
onChange={(e) => {
|
|
81
|
+
const item = available.find((i) => i.label === e.target.value);
|
|
82
|
+
if (item) {
|
|
83
|
+
const all = store.allEntities();
|
|
84
|
+
store.batchMutate(ids, (entity) => {
|
|
85
|
+
if (!item.has(entity)) {
|
|
86
|
+
Object.assign(
|
|
87
|
+
entity,
|
|
88
|
+
typeof item.defaults === 'function' ? item.defaults(entity, all) : item.defaults,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
e.target.value = '';
|
|
94
|
+
}}
|
|
95
|
+
value=""
|
|
96
|
+
style={{
|
|
97
|
+
width: '100%',
|
|
98
|
+
background: '#333',
|
|
99
|
+
color: '#c5c8ce',
|
|
100
|
+
border: '1px solid #444',
|
|
101
|
+
borderRadius: 3,
|
|
102
|
+
fontSize: 11,
|
|
103
|
+
padding: '3px 4px',
|
|
104
|
+
cursor: 'pointer',
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<option value="" disabled>
|
|
108
|
+
+ Add Section...
|
|
109
|
+
</option>
|
|
110
|
+
{available.map((item) => (
|
|
111
|
+
<option key={item.label} value={item.label}>
|
|
112
|
+
{item.label}
|
|
113
|
+
</option>
|
|
114
|
+
))}
|
|
115
|
+
</select>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|