@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
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# vgai editor
|
|
2
|
+
|
|
3
|
+
The vgai visual editor: a browser-based React app with a Three.js viewport
|
|
4
|
+
(orbit camera, transform gizmo, marquee selection), hierarchy/inspector/
|
|
5
|
+
asset panels, prefabs, undo/redo, play mode (hands the in-memory scene to
|
|
6
|
+
the real engine runtime, then adopts the live scene so the panels drive
|
|
7
|
+
live objects), and ingest mode (`?ingest=<id>` mounts an unmodified
|
|
8
|
+
vendored game through the adapter seam; edits persist to an overlay, never
|
|
9
|
+
to the game source).
|
|
10
|
+
|
|
11
|
+
**License: AGPL-3.0-only** (see [LICENSE](./LICENSE)). This matters only if
|
|
12
|
+
you modify or host *the editor itself* — offering a modified editor to
|
|
13
|
+
others (including as a web service) obliges you to share your editor
|
|
14
|
+
changes. **Making games with the editor places zero obligations on your
|
|
15
|
+
game**; the scaffolded project template ([template/](./template/)) is MIT.
|
|
16
|
+
Commercial terms are available — see the repo-root
|
|
17
|
+
[COMMERCIAL.md](../../COMMERCIAL.md).
|
|
18
|
+
|
|
19
|
+
## Run it
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run dev # from the repo root — http://localhost:5173
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The hosted build (no install) is at https://vgai-editor.pages.dev.
|
|
26
|
+
|
|
27
|
+
## Orientation
|
|
28
|
+
|
|
29
|
+
- Architecture notes live in the repo-root [CLAUDE.md](../../CLAUDE.md)
|
|
30
|
+
(Editor section) and [ARCHITECTURE.md](../../ARCHITECTURE.md): the
|
|
31
|
+
THREE.Scene is the store; `editor-store.ts` is a mutation façade;
|
|
32
|
+
descriptors are truth for properties, live objects for transforms.
|
|
33
|
+
- `template/` — the starter project scaffolded by `create-vgai-project`.
|
|
34
|
+
- `src/ingest/`, `src/authoring/` — unmodified-game ingestion and the
|
|
35
|
+
AuthoringAdapter seam. `e2e/` — the Playwright suite.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"test":true}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ad as T,U as q,ae as S,L as _,af as z,ab as E,a9 as m,ac as C,N as j,ag as D,ah as O,ai as Q}from"./index-_bCaipUk.js";const L=new C,P=new m,y=new m,V=new m,b=new m,v=new m,A=new C,H=new m,B=new m,G=new m,k=new E;class N{constructor(e,t=[]){this.mesh=e,this.iks=t,this._valid()}update(){const e=this.iks;for(let t=0,n=e.length;t<n;t++)this.updateOne(e[t]);return this}updateOne(e){const t=this.mesh.skeleton.bones,n=Math,c=t[e.effector],h=t[e.target];P.setFromMatrixPosition(h.matrixWorld);const a=e.links,p=e.iteration!==void 0?e.iteration:1;for(let i=0;i<p;i++){let r=!1;for(let s=0,u=a.length;s<u;s++){const l=t[a[s].index];if(a[s].enabled===!1)break;const g=a[s].limitation,w=a[s].rotationMin,f=a[s].rotationMax;l.matrixWorld.decompose(v,A,H),A.invert(),V.setFromMatrixPosition(c.matrixWorld),b.subVectors(V,v),b.applyQuaternion(A),b.normalize(),y.subVectors(P,v),y.applyQuaternion(A),y.normalize();let o=y.dot(b);if(o>1?o=1:o<-1&&(o=-1),o=n.acos(o),!(o<1e-5)){if(e.minAngle!==void 0&&o<e.minAngle&&(o=e.minAngle),e.maxAngle!==void 0&&o>e.maxAngle&&(o=e.maxAngle),B.crossVectors(b,y),B.normalize(),L.setFromAxisAngle(B,o),l.quaternion.multiply(L),g!==void 0){let d=l.quaternion.w;d>1&&(d=1);const M=n.sqrt(1-d*d);l.quaternion.set(g.x*M,g.y*M,g.z*M,d)}w!==void 0&&l.rotation.setFromVector3(G.setFromEuler(l.rotation).max(w)),f!==void 0&&l.rotation.setFromVector3(G.setFromEuler(l.rotation).min(f)),l.updateMatrixWorld(!0),r=!0}}if(!r)break}return this}createHelper(e){return new I(this.mesh,this.iks,e)}_valid(){const e=this.iks,t=this.mesh.skeleton.bones;for(let n=0,c=e.length;n<c;n++){const h=e[n],a=t[h.effector],p=h.links;let i,r;i=a;for(let s=0,u=p.length;s<u;s++)r=t[p[s].index],i.parent!==r&&console.warn("THREE.CCDIKSolver: bone "+i.name+" is not the child of bone "+r.name),i=r}}}function W(x,e){return G.setFromMatrixPosition(x.matrixWorld).applyMatrix4(e)}function F(x,e,t,n){const c=W(t,n);x[e*3+0]=c.x,x[e*3+1]=c.y,x[e*3+2]=c.z}class I extends T{constructor(e,t=[],n=.25){super(),this.root=e,this.iks=t,this.matrix.copy(e.matrixWorld),this.matrixAutoUpdate=!1,this.sphereGeometry=new q(n,16,8),this.targetSphereMaterial=new S({color:new _(16746632),depthTest:!1,depthWrite:!1,transparent:!0}),this.effectorSphereMaterial=new S({color:new _(8978312),depthTest:!1,depthWrite:!1,transparent:!0}),this.linkSphereMaterial=new S({color:new _(8947967),depthTest:!1,depthWrite:!1,transparent:!0}),this.lineMaterial=new z({color:new _(16711680),depthTest:!1,depthWrite:!1,transparent:!0}),this._init()}updateMatrixWorld(e){const t=this.root;if(this.visible){let n=0;const c=this.iks,h=t.skeleton.bones;k.copy(t.matrixWorld).invert();for(let a=0,p=c.length;a<p;a++){const i=c[a],r=h[i.target],s=h[i.effector],u=this.children[n++],l=this.children[n++];u.position.copy(W(r,k)),l.position.copy(W(s,k));for(let f=0,o=i.links.length;f<o;f++){const d=i.links[f],M=h[d.index];this.children[n++].position.copy(W(M,k))}const g=this.children[n++],w=g.geometry.attributes.position.array;F(w,0,r,k),F(w,1,s,k);for(let f=0,o=i.links.length;f<o;f++){const d=i.links[f],M=h[d.index];F(w,f+2,M,k)}g.geometry.attributes.position.needsUpdate=!0}}this.matrix.copy(t.matrixWorld),super.updateMatrixWorld(e)}dispose(){this.sphereGeometry.dispose(),this.targetSphereMaterial.dispose(),this.effectorSphereMaterial.dispose(),this.linkSphereMaterial.dispose(),this.lineMaterial.dispose();const e=this.children;for(let t=0;t<e.length;t++){const n=e[t];n.isLine&&n.geometry.dispose()}}_init(){const e=this,t=this.iks;function n(i){const r=new O,s=new Float32Array((2+i.links.length)*3);return r.setAttribute("position",new Q(s,3)),r}function c(){return new j(e.sphereGeometry,e.targetSphereMaterial)}function h(){return new j(e.sphereGeometry,e.effectorSphereMaterial)}function a(){return new j(e.sphereGeometry,e.linkSphereMaterial)}function p(i){return new D(n(i),e.lineMaterial)}for(let i=0,r=t.length;i<r;i++){const s=t[i];this.add(c()),this.add(h());for(let u=0,l=s.links.length;u<l;u++)this.add(a());this.add(p(s))}}}export{I as CCDIKHelper,N as CCDIKSolver};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a9 as a,aa as v,ab as S,ac as L}from"./index-_bCaipUk.js";const C=new v,m=new a,p=new a,r=new a,i=new a,n=new a,o=new a,c=new a,l=new a,u=new a,x=new a,f=new a,y=new a,w=new a,F=new a,g=new S,I=new L,N=new a;class T{constructor(s,e,t=Number.MAX_VALUE){this.camera=s,this.scene=e,this.startPoint=new a,this.endPoint=new a,this.collection=[],this.instances={},this.deep=t}select(s,e){return this.startPoint=s||this.startPoint,this.endPoint=e||this.endPoint,this.collection=[],this.updateFrustum(this.startPoint,this.endPoint),this.searchChildInFrustum(C,this.scene),this.collection}updateFrustum(s,e){if(s=s||this.startPoint,e=e||this.endPoint,s.x===e.x&&(e.x+=Number.EPSILON),s.y===e.y&&(e.y+=Number.EPSILON),this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(),this.camera.isPerspectiveCamera){p.copy(s),p.x=Math.min(s.x,e.x),p.y=Math.max(s.y,e.y),e.x=Math.max(s.x,e.x),e.y=Math.min(s.y,e.y),r.setFromMatrixPosition(this.camera.matrixWorld),i.copy(p),n.set(e.x,p.y,0),o.copy(e),c.set(p.x,e.y,0),i.unproject(this.camera),n.unproject(this.camera),o.unproject(this.camera),c.unproject(this.camera),y.copy(i).sub(r),w.copy(n).sub(r),F.copy(o).sub(r),y.normalize(),w.normalize(),F.normalize(),y.multiplyScalar(this.deep),w.multiplyScalar(this.deep),F.multiplyScalar(this.deep),y.add(r),w.add(r),F.add(r);const t=C.planes;t[0].setFromCoplanarPoints(r,i,n),t[1].setFromCoplanarPoints(r,n,o),t[2].setFromCoplanarPoints(o,c,r),t[3].setFromCoplanarPoints(c,i,r),t[4].setFromCoplanarPoints(n,o,c),t[5].setFromCoplanarPoints(F,w,y),t[5].normal.multiplyScalar(-1)}else if(this.camera.isOrthographicCamera){const t=Math.min(s.x,e.x),d=Math.max(s.y,e.y),_=Math.max(s.x,e.x),M=Math.min(s.y,e.y);i.set(t,d,-1),n.set(_,d,-1),o.set(_,M,-1),c.set(t,M,-1),l.set(t,d,1),u.set(_,d,1),x.set(_,M,1),f.set(t,M,1),i.unproject(this.camera),n.unproject(this.camera),o.unproject(this.camera),c.unproject(this.camera),l.unproject(this.camera),u.unproject(this.camera),x.unproject(this.camera),f.unproject(this.camera);const h=C.planes;h[0].setFromCoplanarPoints(i,l,u),h[1].setFromCoplanarPoints(n,u,x),h[2].setFromCoplanarPoints(x,f,c),h[3].setFromCoplanarPoints(f,l,i),h[4].setFromCoplanarPoints(n,o,c),h[5].setFromCoplanarPoints(x,u,l),h[5].normal.multiplyScalar(-1)}else console.error("THREE.SelectionBox: Unsupported camera type.")}searchChildInFrustum(s,e){if(e.isMesh||e.isLine||e.isPoints)if(e.isInstancedMesh){this.instances[e.uuid]=[];for(let t=0;t<e.count;t++)e.getMatrixAt(t,g),g.decompose(m,I,N),m.applyMatrix4(e.matrixWorld),s.containsPoint(m)&&this.instances[e.uuid].push(t)}else e.geometry.boundingSphere===null&&e.geometry.computeBoundingSphere(),m.copy(e.geometry.boundingSphere.center),m.applyMatrix4(e.matrixWorld),s.containsPoint(m)&&this.collection.push(e);if(e.children.length>0)for(let t=0;t<e.children.length;t++)this.searchChildInFrustum(s,e.children[t])}}export{T as SelectionBox};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SelectionBox-BXsv_6aH.js","assets/index-_bCaipUk.js","assets/CCDIKSolver-Dz-ysxZF.js","assets/index-CPVV6pjw.js","assets/index-Dr8H_6Rl.js","assets/xstate-animation-binding-1NGLmw6y.js","assets/data-asset-Bb9sIM7i.js","assets/scene-query-BivAHhJu.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{o as E,p as a,_ as t,r as d}from"./index-_bCaipUk.js";let n=!1;const s={three:()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.T),[]),"three/addons/controls/OrbitControls.js":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.j0),[]),"three/addons/interactive/SelectionBox.js":()=>t(()=>import("./SelectionBox-BXsv_6aH.js"),__vite__mapDeps([0,1])),"three/addons/loaders/RGBELoader.js":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iU),[]),"three/addons/utils/BufferGeometryUtils.js":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iO),[]),"three/addons/utils/SkeletonUtils.js":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iW),[]),"three/examples/jsm/animation/CCDIKSolver.js":()=>t(()=>import("./CCDIKSolver-Dz-ysxZF.js"),__vite__mapDeps([2,1])),"three.quarks":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iY),[]),"quarks.core":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iX),[]),postprocessing:()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.i_),[]),gsap:()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iT),[]),zod:()=>t(()=>import("./index-CPVV6pjw.js"),__vite__mapDeps([3,1])),react:()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.i),[]),"react/jsx-runtime":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.j),[]),"react-dom/client":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.c),[]),"@engine/adapter":()=>t(()=>import("./index-Dr8H_6Rl.js"),__vite__mapDeps([4,1])),"@engine/ai/navigation":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iV),[]),"@engine/animation/xstate-animation-binding":()=>t(()=>import("./xstate-animation-binding-1NGLmw6y.js"),__vite__mapDeps([5,1])),"@engine/audio":()=>t(()=>import("./index-CpOnYyeD.js"),[]),"@engine/data/data-asset":()=>t(()=>import("./data-asset-Bb9sIM7i.js"),__vite__mapDeps([6,1])),"@engine/ecs/game-component":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iS),[]),"@engine/scene/scene-loader":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iZ),[]),"@engine/scene/scene-query":()=>t(()=>import("./scene-query-BivAHhJu.js"),__vite__mapDeps([7,1])),"@engine/scene/user-data":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iQ),[]),"@engine/setup/setup-renderer":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.i$),[]),"@engine/loader":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iP),[]),"@engine/scene/parse":()=>t(()=>import("./index-_bCaipUk.js").then(e=>e.iR),[]),xstate:()=>t(()=>import("./xstate.esm-BgUD33nl.js"),[])},c=Object.keys(s);async function u(){if(n)return;const e=await Promise.all(Object.entries(s).map(async([o,i])=>[o,await i()])),_=Object.fromEntries(e);d(_),n=!0}async function m(){await u();const e="/project-scripts.bundle.js",_=await fetch(e);if(!_.ok)throw new Error(`Failed to fetch ${e} (${_.status}) — is the project-scripts bundle built?`);const o=await _.text(),i=await E(o,"project-scripts.bundle.js");if(typeof i.setup!="function")throw new Error("project-scripts bundle does not export a setup() function");const r=i.components;return a(r??{}),{setup:i.setup,components:r}}export{c as REGISTERED_BUNDLE_SPECIFIERS,m as loadBrowserProjectScripts};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ax as a,ay as s,a4 as i,az as e,aA as t,aB as n,aC as d}from"./index-_bCaipUk.js";import"./webworkerAll-BLrH0F6F.js";a.add(s);a.mixin(i,e);a.add(t);a.add(n);a.mixin(i,d);
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as M,d as P,V as F,T as B,e as H,g as O,s as L,h as I,k as U,m as j,a as A}from"./index-_bCaipUk.js";import{n as ae}from"./index-_bCaipUk.js";function q(e){return O(e)?{physics:e.ctx.physics,collisions:e.ctx.collisions,camera:e.ctx.camera,frame:e.frame}:{}}function G(e,n,t,r){const o=H({id:r?.id??"main",kind:"threejs",pausable:r?.pausable??!0,adapter:n,mounted:t,scene:t.scene,...q(t)});return O(t)&&t.ctx.components.adoptWorld(o),e.registerWorld(o),o}function V(e,n,t){return G(e,n,t)}function $(e){return e.firstParty!==!0?{}:{physics2d:e.ctx.physics2d,collisions2d:e.ctx.collisions2d,frame:e.frame}}function N(e,n,t,r){const o=r?.id??"main",a=t.firstParty===!0,c=H({id:o,kind:"pixijs",pausable:r?.pausable??!0,adapter:n,mounted:t,stage:t.stage,...$(t)});return a&&t.ctx.components.adoptWorld(c),e.registerWorld(c),c}function J(e,n,t,r,o){const a=H({id:o?.id??"main",kind:"react",pausable:o?.pausable??!0,adapter:n,mounted:t,container:r});return e.registerWorld(a),a}function K(e){return"worlds"in e}async function se(e){if(K(e))return ne(e);const{canvas:n,width:t,height:r,adapter:o,...a}=e,c=Math.max(1,t??n.width),i=Math.max(1,r??n.height),l=M(n,c,i),y=j();let d;const x=document.getElementById("example-ui");x instanceof HTMLDivElement?d=x:(d=document.createElement("div"),d.id="example-ui",d.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:2;",(n.parentElement??document.getElementById("ui-overlay")??document.body).appendChild(d));const u=new Set,w={onUpdate(g){return u.add(g),()=>u.delete(g)}};let p=null;const E=I({fixedTimestep:1/60,maxSubSteps:8,update:g=>{p&&m.runFrame(g);for(const C of u)C(g)}}),m=P({loop:E,assets:y}),R={three:B,surface:{canvas:n,width:c,height:i},renderer:l,loop:w,assets:y,ui:d,game:m,requestSystem:()=>null},b=o??new F(a),h=await b.mount(R);p=h,V(m,b,h),E.start();function f(){E.stop(),h.dispose(),l.dispose(),l.forceContextLoss()}return{stop:f,pause(){m.play.pause()},resume(){m.play.resume()},step(){m.play.step()},resize(g,C){const S=Math.max(1,g),k=Math.max(1,C);l.setSize(S,k),h.resize?.(S,k)},get scene(){return h.scene},get camera(){return h.camera},get mounted(){return h},game:m}}function Q(){return{setPixelRatio(){},setClearColor(){},setSize(){},dispose(){},forceContextLoss(){}}}function X(e){if(e.firstParty!==!0)return;const t=e.ctx.app?.renderer?.events?.rootBoundary;if(!(!t||typeof t.hitTest!="function"))return(r,o)=>t.hitTest(r,o)!=null}async function Y(e,n){const{game:t,canvas:r,w:o,h:a,dpr:c,isBottom:i,headless:l,uiContainer:y,loopHandle:d,assets:x}=n,u=l?Q():M(r,o,a,void 0,{alpha:!i,preserveDrawingBuffer:!0});u.setSize(o,a,!1),r.style.width="100%",r.style.height="100%",u.setPixelRatio(c),i||u.setClearColor(0,0);const w={three:B,surface:{canvas:r,width:o,height:a},renderer:u,loop:d,assets:x,ui:y,headless:l,game:t,requestSystem:()=>null},p=await e.adapter.mount(w);return G(t,e.adapter,p,{id:e.id,pausable:e.pausable}),{mountedEntry:{id:e.id,kind:"threejs",element:r,mounted:p,renderer:u},routerEntry:{id:e.id,zOrder:e.zOrder??0,canvas:r,hitTest:e.hitTest}}}async function Z(e,n){const{game:t,canvas:r,w:o,h:a,dpr:c,isBottom:i,uiContainer:l}=n,y={canvas:r,width:o,height:a,ui:l,dpr:c,transparent:!i,preserveDrawingBuffer:!0},d=await e.adapter.mount(y);return N(t,e.adapter,d,{id:e.id,pausable:e.pausable}),{mountedEntry:{id:e.id,kind:"pixijs",element:r,mounted:d,renderer:void 0},routerEntry:{id:e.id,zOrder:e.zOrder??0,canvas:r,hitTest:e.hitTest??X(d)}}}async function _(e,n,t){t.style.pointerEvents="none",t.style.width="100%",t.style.height="100%";const r={container:t,game:n},o=await e.adapter.mount(r);return J(n,e.adapter,o,t,{id:e.id,pausable:e.pausable}),{mountedEntry:{id:e.id,kind:"react",element:t,mounted:o,renderer:void 0}}}function ee(e){return()=>{}}async function te(e,n,t){const{surfacesById:r,...o}=t,a=[],c=[];for(const i of e){const l=i.id===n;if(i.kind==="react"){const w=r.get(i.id),{mountedEntry:p}=await _(i,o.game,w);a.push(p);continue}const y=r.get(i.id),d={...o,canvas:y,isBottom:l};let x,u;i.kind==="threejs"?{mountedEntry:x,routerEntry:u}=await Y(i,d):i.kind==="pixijs"?{mountedEntry:x,routerEntry:u}=await Z(i,d):A(i,"create-runtime mount loop"),a.push(x),c.push(u)}return{mountedEntries:a,routerEntries:c}}async function ne(e){const{container:n,worlds:t,width:r,height:o,headless:a=!1}=e;if(t.length===0)throw new Error("createGameRuntime: `worlds` must contain at least one world.");const c=t,i=Math.max(1,r??n.clientWidth??0),l=Math.max(1,o??n.clientHeight??0),y=a?1:Math.min(typeof window<"u"&&window.devicePixelRatio||1,2);n.style.position||(n.style.position="relative");const d=L(c.map(s=>({id:s.id,zOrder:s.zOrder??0,hitTest:s.hitTest}))),x=d[0]?.id,u=new Map(c.map(s=>[s.id,s.kind])),w=new Map;d.forEach((s,W)=>{const T=u.get(s.id)==="react",v=document.createElement(T?"div":"canvas");if(!T){const z=v;z.width=i,z.height=l}v.style.cssText=`position:absolute;top:0;left:0;width:100%;height:100%;z-index:${W+1};`,n.appendChild(v),w.set(s.id,v)});const p=document.createElement("div");p.id="vgai-ui-overlay",p.style.cssText=`position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:${d.length+1};`,n.appendChild(p);const E=j(),m=new Set,R={onUpdate(s){return m.add(s),()=>m.delete(s)}};let b=!1;const h=I({fixedTimestep:1/60,maxSubSteps:8,update:s=>{b&&f.runFrame(s);for(const W of m)W(s)}}),f=P({loop:h,assets:E}),{mountedEntries:g,routerEntries:C}=await te(c,x,{game:f,surfacesById:w,w:i,h:l,dpr:y,headless:a,uiContainer:p,loopHandle:R,assets:E}),S=U(n,C);b=!0,h.start();const k=ee();function D(){h.stop(),S.dispose();for(const s of g)s.mounted.dispose(),s.renderer?.dispose(),s.renderer?.forceContextLoss(),n.removeChild(s.element);n.removeChild(p),k()}return{stop:D,pause(){f.play.pause()},resume(){f.play.resume()},step(){f.play.step()},resize(s,W){const T=Math.max(1,s),v=Math.max(1,W);for(const z of g)z.renderer?.setSize(T,v,!1),z.mounted.resize?.(T,v)},get scene(){const s=f.defaultWorld.mounted;return s.kind==="threejs"?s.scene:void 0},get camera(){const s=f.defaultWorld.mounted;return s.kind==="threejs"?s.camera:void 0},get mounted(){return f.defaultWorld.mounted},game:f}}export{ae as adoptSceneCamera,se as createGameRuntime,V as registerDefaultThreeWorld,N as registerPixiWorld,J as registerReactWorld,G as registerThreeWorld};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{an as p}from"./index-_bCaipUk.js";function h(n,e,t){let o=c(n,e,t);const s=new Set;return{get:()=>o,sourcePath:t,subscribe(r){return s.add(r),()=>s.delete(r)},hotSwap(r){let i;try{i=c(n,r,t)}catch(a){console.error(`[data] hot edit rejected, keeping previous values.
|
|
2
|
+
${String(a)}`);return}o=i;for(const a of s)a(o)}}}function u(n){const e=p(n,{io:"input"});if(e.type==="object"){const t=e.properties??{};t.$schema??={type:"string"},e.properties=t}return e}function c(n,e,t){const o=e!==null&&typeof e=="object"&&!Array.isArray(e)&&"$schema"in e?Object.fromEntries(Object.entries(e).filter(([r])=>r!=="$schema")):e,s=n.safeParse(o);if(!s.success){const r=s.error.issues.map(i=>` - ${i.path.join(".")||"(root)"}: ${i.message}`).join(`
|
|
3
|
+
`);throw new Error(`Data asset "${t}" failed its schema:
|
|
4
|
+
${r}
|
|
5
|
+
Fix the JSON to match the Zod schema (its emitted twin, "${t.replace(/\.data\.json$/,".schema.json")}", documents every field — re-emit with \`npm run emit-schemas\` if the schema changed). Worked example: the template's src/data/.`)}return s.data}export{h as defineData,c as parseDataJson,u as toDataJsonSchema};
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const s=globalThis.__vgaiGameDocument||globalThis.document;class n{constructor(){this.domElement=s.createElement("canvas"),this._cb=null}setSize(e,t){this.domElement.width=e,this.domElement.height=t}setAnimationLoop(e){this._cb=e;const t=()=>{this._cb&&(this._cb(),requestAnimationFrame(t))};e&&requestAnimationFrame(t)}render(){const e=this.domElement.getContext("2d");e&&(e.fillStyle="#224466",e.fillRect(0,0,this.domElement.width,this.domElement.height))}}class o{constructor(){this.isScene=!0}}class m{}export{m as PerspectiveCamera,o as Scene,n as WebGLRenderer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a2 as C,a4 as w,a7 as T,a3 as v,a8 as _}from"./index-_bCaipUk.js";const y=globalThis.__vgaiGameWindow||globalThis.window,m=globalThis.__vgaiGameDocument||globalThis.document;function k(){return globalThis.__world2dGameContainer??m.body}function h(l,a,e){const d=m.createElement("canvas");d.width=e,d.height=e;const n=d.getContext("2d");return n.fillStyle=l,n.fillRect(0,0,e,e),n.fillStyle=a,n.fillRect(2,2,e-4,3),n.fillRect(2,e-5,e-4,3),_.from(d)}A();async function A(){const l=new C;await l.init({width:640,height:480,background:"#0c1a12",antialias:!1}),k().appendChild(l.canvas);const a=32,e=60,d=40,n=new w;l.stage.addChild(n);const g=h("#3a7d44","#2f6638",a),p=h("#6b6b7b","#54545f",a),x=h("#2f6db0","#255a93",a),f=new T;n.addChild(f);let c=99;const u=()=>(c=c*1103515245+12345&2147483647,c/2147483647);for(let i=0;i<d;i++)for(let r=0;r<e;r++){const s=u(),b=s<.12?x:s<.24?p:g;f.tile(b,r*a,i*a)}const t=new w;t.addChild(new v().roundRect(-12,-12,24,24,5).fill("#ffd23f").stroke({width:2,color:"#c98a00"})),t.x=e*a/2,t.y=d*a/2,n.addChild(t);const o={};y.addEventListener("keydown",i=>{o[i.code]=!0}),y.addEventListener("keyup",i=>{o[i.code]=!1}),l.ticker.add(i=>{const s=5*i.deltaTime;(o.ArrowLeft||o.KeyA)&&(t.x-=s),(o.ArrowRight||o.KeyD)&&(t.x+=s),(o.ArrowUp||o.KeyW)&&(t.y-=s),(o.ArrowDown||o.KeyS)&&(t.y+=s),t.x=Math.max(0,Math.min(e*a,t.x)),t.y=Math.max(0,Math.min(d*a,t.y)),n.x=l.screen.width/2-t.x,n.y=l.screen.height/2-t.y}),globalThis.__tilemapCamera={app:l,tiles:e*d,playerPos:()=>({x:t.x,y:t.y}),press:(i,r)=>{o[i]=r}}}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{a9 as u,aX as Q,aY as pt,aZ as gt,a_ as rt,a$ as ot,b0 as mt,b1 as ft,ah as tt,af as bt,av as yt,S as vt,L as wt,ar as At,P as xt,as as _t,X as Et,M as $t,b2 as St,b3 as Ct,aV as kt,$ as Lt,N as zt,b4 as Mt,b5 as Vt}from"./index-_bCaipUk.js";import{S as Dt}from"./stats.module--VATS4Kh.js";class O{constructor(t=new u(0,0,0),e=new u(0,1,0),i=1){this.start=t,this.end=e,this.radius=i}clone(){return new O(this.start.clone(),this.end.clone(),this.radius)}set(t,e,i){this.start.copy(t),this.end.copy(e),this.radius=i}copy(t){this.start.copy(t.start),this.end.copy(t.end),this.radius=t.radius}getCenter(t){return t.copy(this.end).add(this.start).multiplyScalar(.5)}translate(t){this.start.add(t),this.end.add(t)}checkAABBAxis(t,e,i,r,s,n,l,a,d){return(s-t<d||s-i<d)&&(t-n<d||i-n<d)&&(l-e<d||l-r<d)&&(e-a<d||r-a<d)}intersectsBox(t){return this.checkAABBAxis(this.start.x,this.start.y,this.end.x,this.end.y,t.min.x,t.max.x,t.min.y,t.max.y,this.radius)&&this.checkAABBAxis(this.start.x,this.start.z,this.end.x,this.end.z,t.min.x,t.max.x,t.min.z,t.max.z,this.radius)&&this.checkAABBAxis(this.start.y,this.start.z,this.end.y,this.end.z,t.min.y,t.max.y,t.min.z,t.max.z,this.radius)}}const V=new u,D=new u,I=new u,T=new u,w=new gt,W=new rt,Tt=new rt,P=new ot,B=new O,Bt=new u,Ft=new u,It=new u,Pt=1e-10;function Ht(o,t,e=null,i=null){const r=Bt.copy(o.end).sub(o.start),s=Ft.copy(t.end).sub(t.start),n=It.copy(t.start).sub(o.start),l=r.dot(s),a=r.dot(r),d=s.dot(s),h=s.dot(n),p=r.dot(n);let c,b;const k=a*d-l*l;if(Math.abs(k)<Pt){const M=-h/d,L=(l-h)/d;Math.abs(M-.5)<Math.abs(L-.5)?(c=0,b=M):(c=1,b=L)}else c=(h*l+p*d)/k,b=(c*l-h)/d;b=Math.max(0,Math.min(1,b)),c=Math.max(0,Math.min(1,c)),e&&e.copy(r).multiplyScalar(c).add(o.start),i&&i.copy(s).multiplyScalar(b).add(t.start)}class N{constructor(t){this.box=t,this.bounds=new Q,this.subTrees=[],this.triangles=[],this.layers=new pt}addTriangle(t){return this.bounds.min.x=Math.min(this.bounds.min.x,t.a.x,t.b.x,t.c.x),this.bounds.min.y=Math.min(this.bounds.min.y,t.a.y,t.b.y,t.c.y),this.bounds.min.z=Math.min(this.bounds.min.z,t.a.z,t.b.z,t.c.z),this.bounds.max.x=Math.max(this.bounds.max.x,t.a.x,t.b.x,t.c.x),this.bounds.max.y=Math.max(this.bounds.max.y,t.a.y,t.b.y,t.c.y),this.bounds.max.z=Math.max(this.bounds.max.z,t.a.z,t.b.z,t.c.z),this.triangles.push(t),this}calcBox(){return this.box=this.bounds.clone(),this.box.min.x-=.01,this.box.min.y-=.01,this.box.min.z-=.01,this}split(t){if(!this.box)return;const e=[],i=D.copy(this.box.max).sub(this.box.min).multiplyScalar(.5);for(let s=0;s<2;s++)for(let n=0;n<2;n++)for(let l=0;l<2;l++){const a=new Q,d=V.set(s,n,l);a.min.copy(this.box.min).add(d.multiply(i)),a.max.copy(a.min).add(i),e.push(new N(a))}let r;for(;r=this.triangles.pop();)for(let s=0;s<e.length;s++)e[s].box.intersectsTriangle(r)&&e[s].triangles.push(r);for(let s=0;s<e.length;s++){const n=e[s].triangles.length;n>8&&t<16&&e[s].split(t+1),n!==0&&this.subTrees.push(e[s])}return this}build(){return this.calcBox(),this.split(0),this}getRayTriangles(t,e){for(let i=0;i<this.subTrees.length;i++){const r=this.subTrees[i];if(t.intersectsBox(r.box))if(r.triangles.length>0)for(let s=0;s<r.triangles.length;s++)e.indexOf(r.triangles[s])===-1&&e.push(r.triangles[s]);else r.getRayTriangles(t,e)}return e}triangleCapsuleIntersect(t,e){e.getPlane(w);const i=w.distanceToPoint(t.start)-t.radius,r=w.distanceToPoint(t.end)-t.radius;if(i>0&&r>0||i<-t.radius&&r<-t.radius)return!1;const s=Math.abs(i/(Math.abs(i)+Math.abs(r))),n=V.copy(t.start).lerp(t.end,s);if(e.containsPoint(n))return{normal:w.normal.clone(),point:n.clone(),depth:Math.abs(Math.min(i,r))};const l=t.radius*t.radius,a=W.set(t.start,t.end),d=[[e.a,e.b],[e.b,e.c],[e.c,e.a]];for(let h=0;h<d.length;h++){const p=Tt.set(d[h][0],d[h][1]);if(Ht(a,p,I,T),I.distanceToSquared(T)<l)return{normal:I.clone().sub(T).normalize(),point:T.clone(),depth:t.radius-I.distanceTo(T)}}return!1}triangleSphereIntersect(t,e){if(e.getPlane(w),!t.intersectsPlane(w))return!1;const i=Math.abs(w.distanceToSphere(t)),r=t.radius*t.radius-i*i,s=w.projectPoint(t.center,V);if(e.containsPoint(t.center))return{normal:w.normal.clone(),point:s.clone(),depth:Math.abs(w.distanceToSphere(t))};const n=[[e.a,e.b],[e.b,e.c],[e.c,e.a]];for(let l=0;l<n.length;l++){W.set(n[l][0],n[l][1]),W.closestPointToPoint(s,!0,D);const a=D.distanceToSquared(t.center);if(a<r)return{normal:t.center.clone().sub(D).normalize(),point:D.clone(),depth:t.radius-Math.sqrt(a)}}return!1}getSphereTriangles(t,e){for(let i=0;i<this.subTrees.length;i++){const r=this.subTrees[i];if(t.intersectsBox(r.box))if(r.triangles.length>0)for(let s=0;s<r.triangles.length;s++)e.indexOf(r.triangles[s])===-1&&e.push(r.triangles[s]);else r.getSphereTriangles(t,e)}}getCapsuleTriangles(t,e){for(let i=0;i<this.subTrees.length;i++){const r=this.subTrees[i];if(t.intersectsBox(r.box))if(r.triangles.length>0)for(let s=0;s<r.triangles.length;s++)e.indexOf(r.triangles[s])===-1&&e.push(r.triangles[s]);else r.getCapsuleTriangles(t,e)}}sphereIntersect(t){P.copy(t);const e=[];let i,r=!1;this.getSphereTriangles(t,e);for(let s=0;s<e.length;s++)(i=this.triangleSphereIntersect(P,e[s]))&&(r=!0,P.center.add(i.normal.multiplyScalar(i.depth)));if(r){const s=P.center.clone().sub(t.center),n=s.length();return{normal:s.normalize(),depth:n}}return!1}capsuleIntersect(t){B.copy(t);const e=[];let i,r=!1;this.getCapsuleTriangles(B,e);for(let s=0;s<e.length;s++)(i=this.triangleCapsuleIntersect(B,e[s]))&&(r=!0,B.translate(i.normal.multiplyScalar(i.depth)));if(r){const s=B.getCenter(new u).sub(t.getCenter(V)),n=s.length();return{normal:s.normalize(),depth:n}}return!1}rayIntersect(t){if(t.direction.length()===0)return;const e=[];let i,r,s=1e100;this.getRayTriangles(t,e);for(let n=0;n<e.length;n++){const l=t.intersectTriangle(e[n].a,e[n].b,e[n].c,!0,V);if(l){const a=l.sub(t.origin).length();s>a&&(r=l.clone().add(t.origin),s=a,i=e[n])}}return s<1e100?{distance:s,triangle:i,position:r}:!1}fromGraphNode(t){return t.updateWorldMatrix(!0,!0),t.traverse(e=>{if(e.isMesh===!0&&this.layers.test(e.layers)){let i,r=!1;e.geometry.index!==null?(r=!0,i=e.geometry.toNonIndexed()):i=e.geometry;const s=i.getAttribute("position");for(let n=0;n<s.count;n+=3){const l=new u().fromBufferAttribute(s,n),a=new u().fromBufferAttribute(s,n+1),d=new u().fromBufferAttribute(s,n+2);l.applyMatrix4(e.matrixWorld),a.applyMatrix4(e.matrixWorld),d.applyMatrix4(e.matrixWorld),this.addTriangle(new mt(l,a,d))}r&&i.dispose()}}),this.build(),this}clear(){return this.box=null,this.bounds.makeEmpty(),this.subTrees.length=0,this.triangles.length=0,this}}class Ot extends ft{constructor(t,e=16776960){super(new tt,new bt({color:e,toneMapped:!1})),this.octree=t,this.color=e,this.type="OctreeHelper",this.update()}update(){const t=[];function e(i){for(let r=0;r<i.length;r++){const s=i[r].box.min,n=i[r].box.max;t.push(n.x,n.y,n.z),t.push(s.x,n.y,n.z),t.push(s.x,n.y,n.z),t.push(s.x,s.y,n.z),t.push(s.x,s.y,n.z),t.push(n.x,s.y,n.z),t.push(n.x,s.y,n.z),t.push(n.x,n.y,n.z),t.push(n.x,n.y,s.z),t.push(s.x,n.y,s.z),t.push(s.x,n.y,s.z),t.push(s.x,s.y,s.z),t.push(s.x,s.y,s.z),t.push(n.x,s.y,s.z),t.push(n.x,s.y,s.z),t.push(n.x,n.y,s.z),t.push(n.x,n.y,n.z),t.push(n.x,n.y,s.z),t.push(s.x,n.y,n.z),t.push(s.x,n.y,s.z),t.push(s.x,s.y,n.z),t.push(s.x,s.y,s.z),t.push(n.x,s.y,n.z),t.push(n.x,s.y,s.z),e(i[r].subTrees)}}e(this.octree.subTrees),this.geometry.dispose(),this.geometry=new tt,this.geometry.setAttribute("position",new yt(t,3))}dispose(){this.geometry.dispose(),this.material.dispose()}}/**
|
|
2
|
+
* lil-gui
|
|
3
|
+
* https://lil-gui.georgealways.com
|
|
4
|
+
* @version 0.17.0
|
|
5
|
+
* @author George Michael Brower
|
|
6
|
+
* @license MIT
|
|
7
|
+
*/class x{constructor(t,e,i,r,s="div"){this.parent=t,this.object=e,this.property=i,this._disabled=!1,this._hidden=!1,this.initialValue=this.getValue(),this.domElement=document.createElement("div"),this.domElement.classList.add("controller"),this.domElement.classList.add(r),this.$name=document.createElement("div"),this.$name.classList.add("name"),x.nextNameID=x.nextNameID||0,this.$name.id="lil-gui-name-"+ ++x.nextNameID,this.$widget=document.createElement(s),this.$widget.classList.add("widget"),this.$disable=this.$widget,this.domElement.appendChild(this.$name),this.domElement.appendChild(this.$widget),this.parent.children.push(this),this.parent.controllers.push(this),this.parent.$children.appendChild(this.domElement),this._listenCallback=this._listenCallback.bind(this),this.name(i)}name(t){return this._name=t,this.$name.innerHTML=t,this}onChange(t){return this._onChange=t,this}_callOnChange(){this.parent._callOnChange(this),this._onChange!==void 0&&this._onChange.call(this,this.getValue()),this._changed=!0}onFinishChange(t){return this._onFinishChange=t,this}_callOnFinishChange(){this._changed&&(this.parent._callOnFinishChange(this),this._onFinishChange!==void 0&&this._onFinishChange.call(this,this.getValue())),this._changed=!1}reset(){return this.setValue(this.initialValue),this._callOnFinishChange(),this}enable(t=!0){return this.disable(!t)}disable(t=!0){return t===this._disabled||(this._disabled=t,this.domElement.classList.toggle("disabled",t),this.$disable.toggleAttribute("disabled",t)),this}show(t=!0){return this._hidden=!t,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}options(t){const e=this.parent.add(this.object,this.property,t);return e.name(this._name),this.destroy(),e}min(t){return this}max(t){return this}step(t){return this}decimals(t){return this}listen(t=!0){return this._listening=t,this._listenCallbackID!==void 0&&(cancelAnimationFrame(this._listenCallbackID),this._listenCallbackID=void 0),this._listening&&this._listenCallback(),this}_listenCallback(){this._listenCallbackID=requestAnimationFrame(this._listenCallback);const t=this.save();t!==this._listenPrevValue&&this.updateDisplay(),this._listenPrevValue=t}getValue(){return this.object[this.property]}setValue(t){return this.object[this.property]=t,this._callOnChange(),this.updateDisplay(),this}updateDisplay(){return this}load(t){return this.setValue(t),this._callOnFinishChange(),this}save(){return this.getValue()}destroy(){this.listen(!1),this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.controllers.splice(this.parent.controllers.indexOf(this),1),this.parent.$children.removeChild(this.domElement)}}class Gt extends x{constructor(t,e,i){super(t,e,i,"boolean","label"),this.$input=document.createElement("input"),this.$input.setAttribute("type","checkbox"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$widget.appendChild(this.$input),this.$input.addEventListener("change",()=>{this.setValue(this.$input.checked),this._callOnFinishChange()}),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.checked=this.getValue(),this}}function X(o){let t,e;return(t=o.match(/(#|0x)?([a-f0-9]{6})/i))?e=t[2]:(t=o.match(/rgb\(\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)\s*\)/))?e=parseInt(t[1]).toString(16).padStart(2,0)+parseInt(t[2]).toString(16).padStart(2,0)+parseInt(t[3]).toString(16).padStart(2,0):(t=o.match(/^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i))&&(e=t[1]+t[1]+t[2]+t[2]+t[3]+t[3]),!!e&&"#"+e}const Yt={isPrimitive:!0,match:o=>typeof o=="string",fromHexString:X,toHexString:X},F={isPrimitive:!0,match:o=>typeof o=="number",fromHexString:o=>parseInt(o.substring(1),16),toHexString:o=>"#"+o.toString(16).padStart(6,0)},Wt={isPrimitive:!1,match:Array.isArray,fromHexString(o,t,e=1){const i=F.fromHexString(o);t[0]=(i>>16&255)/255*e,t[1]=(i>>8&255)/255*e,t[2]=(255&i)/255*e},toHexString:([o,t,e],i=1)=>F.toHexString(o*(i=255/i)<<16^t*i<<8^e*i<<0)},jt={isPrimitive:!1,match:o=>Object(o)===o,fromHexString(o,t,e=1){const i=F.fromHexString(o);t.r=(i>>16&255)/255*e,t.g=(i>>8&255)/255*e,t.b=(255&i)/255*e},toHexString:({r:o,g:t,b:e},i=1)=>F.toHexString(o*(i=255/i)<<16^t*i<<8^e*i<<0)},Rt=[Yt,F,Wt,jt];class Xt extends x{constructor(t,e,i,r){var s;super(t,e,i,"color"),this.$input=document.createElement("input"),this.$input.setAttribute("type","color"),this.$input.setAttribute("tabindex",-1),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$text=document.createElement("input"),this.$text.setAttribute("type","text"),this.$text.setAttribute("spellcheck","false"),this.$text.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this.$display.appendChild(this.$input),this.$widget.appendChild(this.$display),this.$widget.appendChild(this.$text),this._format=(s=this.initialValue,Rt.find(n=>n.match(s))),this._rgbScale=r,this._initialValueHexString=this.save(),this._textFocused=!1,this.$input.addEventListener("input",()=>{this._setValueFromHexString(this.$input.value)}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$text.addEventListener("input",()=>{const n=X(this.$text.value);n&&this._setValueFromHexString(n)}),this.$text.addEventListener("focus",()=>{this._textFocused=!0,this.$text.select()}),this.$text.addEventListener("blur",()=>{this._textFocused=!1,this.updateDisplay(),this._callOnFinishChange()}),this.$disable=this.$text,this.updateDisplay()}reset(){return this._setValueFromHexString(this._initialValueHexString),this}_setValueFromHexString(t){if(this._format.isPrimitive){const e=this._format.fromHexString(t);this.setValue(e)}else this._format.fromHexString(t,this.getValue(),this._rgbScale),this._callOnChange(),this.updateDisplay()}save(){return this._format.toHexString(this.getValue(),this._rgbScale)}load(t){return this._setValueFromHexString(t),this._callOnFinishChange(),this}updateDisplay(){return this.$input.value=this._format.toHexString(this.getValue(),this._rgbScale),this._textFocused||(this.$text.value=this.$input.value.substring(1)),this.$display.style.backgroundColor=this.$input.value,this}}class j extends x{constructor(t,e,i){super(t,e,i,"function"),this.$button=document.createElement("button"),this.$button.appendChild(this.$name),this.$widget.appendChild(this.$button),this.$button.addEventListener("click",r=>{r.preventDefault(),this.getValue().call(this.object)}),this.$button.addEventListener("touchstart",()=>{},{passive:!0}),this.$disable=this.$button}}class Kt extends x{constructor(t,e,i,r,s,n){super(t,e,i,"number"),this._initInput(),this.min(r),this.max(s);const l=n!==void 0;this.step(l?n:this._getImplicitStep(),l),this.updateDisplay()}decimals(t){return this._decimals=t,this.updateDisplay(),this}min(t){return this._min=t,this._onUpdateMinMax(),this}max(t){return this._max=t,this._onUpdateMinMax(),this}step(t,e=!0){return this._step=t,this._stepExplicit=e,this}updateDisplay(){const t=this.getValue();if(this._hasSlider){let e=(t-this._min)/(this._max-this._min);e=Math.max(0,Math.min(e,1)),this.$fill.style.width=100*e+"%"}return this._inputFocused||(this.$input.value=this._decimals===void 0?t:t.toFixed(this._decimals)),this}_initInput(){this.$input=document.createElement("input"),this.$input.setAttribute("type","number"),this.$input.setAttribute("step","any"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$widget.appendChild(this.$input),this.$disable=this.$input;const t=h=>{const p=parseFloat(this.$input.value);isNaN(p)||(this._snapClampSetValue(p+h),this.$input.value=this.getValue())};let e,i,r,s,n,l=!1;const a=h=>{if(l){const p=h.clientX-e,c=h.clientY-i;Math.abs(c)>5?(h.preventDefault(),this.$input.blur(),l=!1,this._setDraggingStyle(!0,"vertical")):Math.abs(p)>5&&d()}if(!l){const p=h.clientY-r;n-=p*this._step*this._arrowKeyMultiplier(h),s+n>this._max?n=this._max-s:s+n<this._min&&(n=this._min-s),this._snapClampSetValue(s+n)}r=h.clientY},d=()=>{this._setDraggingStyle(!1,"vertical"),this._callOnFinishChange(),window.removeEventListener("mousemove",a),window.removeEventListener("mouseup",d)};this.$input.addEventListener("input",()=>{let h=parseFloat(this.$input.value);isNaN(h)||(this._stepExplicit&&(h=this._snap(h)),this.setValue(this._clamp(h)))}),this.$input.addEventListener("keydown",h=>{h.code==="Enter"&&this.$input.blur(),h.code==="ArrowUp"&&(h.preventDefault(),t(this._step*this._arrowKeyMultiplier(h))),h.code==="ArrowDown"&&(h.preventDefault(),t(this._step*this._arrowKeyMultiplier(h)*-1))}),this.$input.addEventListener("wheel",h=>{this._inputFocused&&(h.preventDefault(),t(this._step*this._normalizeMouseWheel(h)))},{passive:!1}),this.$input.addEventListener("mousedown",h=>{e=h.clientX,i=r=h.clientY,l=!0,s=this.getValue(),n=0,window.addEventListener("mousemove",a),window.addEventListener("mouseup",d)}),this.$input.addEventListener("focus",()=>{this._inputFocused=!0}),this.$input.addEventListener("blur",()=>{this._inputFocused=!1,this.updateDisplay(),this._callOnFinishChange()})}_initSlider(){this._hasSlider=!0,this.$slider=document.createElement("div"),this.$slider.classList.add("slider"),this.$fill=document.createElement("div"),this.$fill.classList.add("fill"),this.$slider.appendChild(this.$fill),this.$widget.insertBefore(this.$slider,this.$input),this.domElement.classList.add("hasSlider");const t=c=>{const b=this.$slider.getBoundingClientRect();let k=(M=c,L=b.left,Z=b.right,Y=this._min,q=this._max,(M-L)/(Z-L)*(q-Y)+Y);var M,L,Z,Y,q;this._snapClampSetValue(k)},e=c=>{t(c.clientX)},i=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("mousemove",e),window.removeEventListener("mouseup",i)};let r,s,n=!1;const l=c=>{c.preventDefault(),this._setDraggingStyle(!0),t(c.touches[0].clientX),n=!1},a=c=>{if(n){const b=c.touches[0].clientX-r,k=c.touches[0].clientY-s;Math.abs(b)>Math.abs(k)?l(c):(window.removeEventListener("touchmove",a),window.removeEventListener("touchend",d))}else c.preventDefault(),t(c.touches[0].clientX)},d=()=>{this._callOnFinishChange(),this._setDraggingStyle(!1),window.removeEventListener("touchmove",a),window.removeEventListener("touchend",d)},h=this._callOnFinishChange.bind(this);let p;this.$slider.addEventListener("mousedown",c=>{this._setDraggingStyle(!0),t(c.clientX),window.addEventListener("mousemove",e),window.addEventListener("mouseup",i)}),this.$slider.addEventListener("touchstart",c=>{c.touches.length>1||(this._hasScrollBar?(r=c.touches[0].clientX,s=c.touches[0].clientY,n=!0):l(c),window.addEventListener("touchmove",a,{passive:!1}),window.addEventListener("touchend",d))},{passive:!1}),this.$slider.addEventListener("wheel",c=>{if(Math.abs(c.deltaX)<Math.abs(c.deltaY)&&this._hasScrollBar)return;c.preventDefault();const b=this._normalizeMouseWheel(c)*this._step;this._snapClampSetValue(this.getValue()+b),this.$input.value=this.getValue(),clearTimeout(p),p=setTimeout(h,400)},{passive:!1})}_setDraggingStyle(t,e="horizontal"){this.$slider&&this.$slider.classList.toggle("active",t),document.body.classList.toggle("lil-gui-dragging",t),document.body.classList.toggle("lil-gui-"+e,t)}_getImplicitStep(){return this._hasMin&&this._hasMax?(this._max-this._min)/1e3:.1}_onUpdateMinMax(){!this._hasSlider&&this._hasMin&&this._hasMax&&(this._stepExplicit||this.step(this._getImplicitStep(),!1),this._initSlider(),this.updateDisplay())}_normalizeMouseWheel(t){let{deltaX:e,deltaY:i}=t;return Math.floor(t.deltaY)!==t.deltaY&&t.wheelDelta&&(e=0,i=-t.wheelDelta/120,i*=this._stepExplicit?1:10),e+-i}_arrowKeyMultiplier(t){let e=this._stepExplicit?1:10;return t.shiftKey?e*=10:t.altKey&&(e/=10),e}_snap(t){const e=Math.round(t/this._step)*this._step;return parseFloat(e.toPrecision(15))}_clamp(t){return t<this._min&&(t=this._min),t>this._max&&(t=this._max),t}_snapClampSetValue(t){this.setValue(this._clamp(this._snap(t)))}get _hasScrollBar(){const t=this.parent.root.$children;return t.scrollHeight>t.clientHeight}get _hasMin(){return this._min!==void 0}get _hasMax(){return this._max!==void 0}}class Nt extends x{constructor(t,e,i,r){super(t,e,i,"option"),this.$select=document.createElement("select"),this.$select.setAttribute("aria-labelledby",this.$name.id),this.$display=document.createElement("div"),this.$display.classList.add("display"),this._values=Array.isArray(r)?r:Object.values(r),this._names=Array.isArray(r)?r:Object.keys(r),this._names.forEach(s=>{const n=document.createElement("option");n.innerHTML=s,this.$select.appendChild(n)}),this.$select.addEventListener("change",()=>{this.setValue(this._values[this.$select.selectedIndex]),this._callOnFinishChange()}),this.$select.addEventListener("focus",()=>{this.$display.classList.add("focus")}),this.$select.addEventListener("blur",()=>{this.$display.classList.remove("focus")}),this.$widget.appendChild(this.$select),this.$widget.appendChild(this.$display),this.$disable=this.$select,this.updateDisplay()}updateDisplay(){const t=this.getValue(),e=this._values.indexOf(t);return this.$select.selectedIndex=e,this.$display.innerHTML=e===-1?t:this._names[e],this}}class Jt extends x{constructor(t,e,i){super(t,e,i,"string"),this.$input=document.createElement("input"),this.$input.setAttribute("type","text"),this.$input.setAttribute("aria-labelledby",this.$name.id),this.$input.addEventListener("input",()=>{this.setValue(this.$input.value)}),this.$input.addEventListener("keydown",r=>{r.code==="Enter"&&this.$input.blur()}),this.$input.addEventListener("blur",()=>{this._callOnFinishChange()}),this.$widget.appendChild(this.$input),this.$disable=this.$input,this.updateDisplay()}updateDisplay(){return this.$input.value=this.getValue(),this}}let et=!1;class J{constructor({parent:t,autoPlace:e=t===void 0,container:i,width:r,title:s="Controls",injectStyles:n=!0,touchStyles:l=!0}={}){if(this.parent=t,this.root=t?t.root:this,this.children=[],this.controllers=[],this.folders=[],this._closed=!1,this._hidden=!1,this.domElement=document.createElement("div"),this.domElement.classList.add("lil-gui"),this.$title=document.createElement("div"),this.$title.classList.add("title"),this.$title.setAttribute("role","button"),this.$title.setAttribute("aria-expanded",!0),this.$title.setAttribute("tabindex",0),this.$title.addEventListener("click",()=>this.openAnimated(this._closed)),this.$title.addEventListener("keydown",a=>{a.code!=="Enter"&&a.code!=="Space"||(a.preventDefault(),this.$title.click())}),this.$title.addEventListener("touchstart",()=>{},{passive:!0}),this.$children=document.createElement("div"),this.$children.classList.add("children"),this.domElement.appendChild(this.$title),this.domElement.appendChild(this.$children),this.title(s),l&&this.domElement.classList.add("allow-touch-styles"),this.parent)return this.parent.children.push(this),this.parent.folders.push(this),void this.parent.$children.appendChild(this.domElement);this.domElement.classList.add("root"),!et&&n&&((function(a){const d=document.createElement("style");d.innerHTML=a;const h=document.querySelector("head link[rel=stylesheet], head style");h?document.head.insertBefore(d,h):document.head.appendChild(d)})('.lil-gui{--background-color:#1f1f1f;--text-color:#ebebeb;--title-background-color:#111;--title-text-color:#ebebeb;--widget-color:#424242;--hover-color:#4f4f4f;--focus-color:#595959;--number-color:#2cc9ff;--string-color:#a2db3c;--font-size:11px;--input-font-size:11px;--font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;--font-family-mono:Menlo,Monaco,Consolas,"Droid Sans Mono",monospace;--padding:4px;--spacing:4px;--widget-height:20px;--name-width:45%;--slider-knob-width:2px;--slider-input-width:27%;--color-input-width:27%;--slider-input-min-width:45px;--color-input-min-width:45px;--folder-indent:7px;--widget-padding:0 0 0 3px;--widget-border-radius:2px;--checkbox-size:calc(var(--widget-height)*0.75);--scrollbar-width:5px;background-color:var(--background-color);color:var(--text-color);font-family:var(--font-family);font-size:var(--font-size);font-style:normal;font-weight:400;line-height:1;text-align:left;touch-action:manipulation;user-select:none;-webkit-user-select:none}.lil-gui,.lil-gui *{box-sizing:border-box;margin:0;padding:0}.lil-gui.root{display:flex;flex-direction:column;width:var(--width,245px)}.lil-gui.root>.title{background:var(--title-background-color);color:var(--title-text-color)}.lil-gui.root>.children{overflow-x:hidden;overflow-y:auto}.lil-gui.root>.children::-webkit-scrollbar{background:var(--background-color);height:var(--scrollbar-width);width:var(--scrollbar-width)}.lil-gui.root>.children::-webkit-scrollbar-thumb{background:var(--focus-color);border-radius:var(--scrollbar-width)}.lil-gui.force-touch-styles{--widget-height:28px;--padding:6px;--spacing:6px;--font-size:13px;--input-font-size:16px;--folder-indent:10px;--scrollbar-width:7px;--slider-input-min-width:50px;--color-input-min-width:65px}.lil-gui.autoPlace{max-height:100%;position:fixed;right:15px;top:0;z-index:1001}.lil-gui .controller{align-items:center;display:flex;margin:var(--spacing) 0;padding:0 var(--padding)}.lil-gui .controller.disabled{opacity:.5}.lil-gui .controller.disabled,.lil-gui .controller.disabled *{pointer-events:none!important}.lil-gui .controller>.name{flex-shrink:0;line-height:var(--widget-height);min-width:var(--name-width);padding-right:var(--spacing);white-space:pre}.lil-gui .controller .widget{align-items:center;display:flex;min-height:var(--widget-height);position:relative;width:100%}.lil-gui .controller.string input{color:var(--string-color)}.lil-gui .controller.boolean .widget{cursor:pointer}.lil-gui .controller.color .display{border-radius:var(--widget-border-radius);height:var(--widget-height);position:relative;width:100%}.lil-gui .controller.color input[type=color]{cursor:pointer;height:100%;opacity:0;width:100%}.lil-gui .controller.color input[type=text]{flex-shrink:0;font-family:var(--font-family-mono);margin-left:var(--spacing);min-width:var(--color-input-min-width);width:var(--color-input-width)}.lil-gui .controller.option select{max-width:100%;opacity:0;position:absolute;width:100%}.lil-gui .controller.option .display{background:var(--widget-color);border-radius:var(--widget-border-radius);height:var(--widget-height);line-height:var(--widget-height);max-width:100%;overflow:hidden;padding-left:.55em;padding-right:1.75em;pointer-events:none;position:relative;word-break:break-all}.lil-gui .controller.option .display.active{background:var(--focus-color)}.lil-gui .controller.option .display:after{bottom:0;content:"↕";font-family:lil-gui;padding-right:.375em;position:absolute;right:0;top:0}.lil-gui .controller.option .widget,.lil-gui .controller.option select{cursor:pointer}.lil-gui .controller.number input{color:var(--number-color)}.lil-gui .controller.number.hasSlider input{flex-shrink:0;margin-left:var(--spacing);min-width:var(--slider-input-min-width);width:var(--slider-input-width)}.lil-gui .controller.number .slider{background-color:var(--widget-color);border-radius:var(--widget-border-radius);cursor:ew-resize;height:var(--widget-height);overflow:hidden;padding-right:var(--slider-knob-width);touch-action:pan-y;width:100%}.lil-gui .controller.number .slider.active{background-color:var(--focus-color)}.lil-gui .controller.number .slider.active .fill{opacity:.95}.lil-gui .controller.number .fill{border-right:var(--slider-knob-width) solid var(--number-color);box-sizing:content-box;height:100%}.lil-gui-dragging .lil-gui{--hover-color:var(--widget-color)}.lil-gui-dragging *{cursor:ew-resize!important}.lil-gui-dragging.lil-gui-vertical *{cursor:ns-resize!important}.lil-gui .title{--title-height:calc(var(--widget-height) + var(--spacing)*1.25);-webkit-tap-highlight-color:transparent;text-decoration-skip:objects;cursor:pointer;font-weight:600;height:var(--title-height);line-height:calc(var(--title-height) - 4px);outline:none;padding:0 var(--padding)}.lil-gui .title:before{content:"▾";display:inline-block;font-family:lil-gui;padding-right:2px}.lil-gui .title:active{background:var(--title-background-color);opacity:.75}.lil-gui.root>.title:focus{text-decoration:none!important}.lil-gui.closed>.title:before{content:"▸"}.lil-gui.closed>.children{opacity:0;transform:translateY(-7px)}.lil-gui.closed:not(.transition)>.children{display:none}.lil-gui.transition>.children{overflow:hidden;pointer-events:none;transition-duration:.3s;transition-property:height,opacity,transform;transition-timing-function:cubic-bezier(.2,.6,.35,1)}.lil-gui .children:empty:before{content:"Empty";display:block;font-style:italic;height:var(--widget-height);line-height:var(--widget-height);margin:var(--spacing) 0;opacity:.5;padding:0 var(--padding)}.lil-gui.root>.children>.lil-gui>.title{border-width:0;border-bottom:1px solid var(--widget-color);border-left:0 solid var(--widget-color);border-right:0 solid var(--widget-color);border-top:1px solid var(--widget-color);transition:border-color .3s}.lil-gui.root>.children>.lil-gui.closed>.title{border-bottom-color:transparent}.lil-gui+.controller{border-top:1px solid var(--widget-color);margin-top:0;padding-top:var(--spacing)}.lil-gui .lil-gui .lil-gui>.title{border:none}.lil-gui .lil-gui .lil-gui>.children{border:none;border-left:2px solid var(--widget-color);margin-left:var(--folder-indent)}.lil-gui .lil-gui .controller{border:none}.lil-gui input{-webkit-tap-highlight-color:transparent;background:var(--widget-color);border:0;border-radius:var(--widget-border-radius);color:var(--text-color);font-family:var(--font-family);font-size:var(--input-font-size);height:var(--widget-height);outline:none;width:100%}.lil-gui input:disabled{opacity:1}.lil-gui input[type=number],.lil-gui input[type=text]{padding:var(--widget-padding)}.lil-gui input[type=number]:focus,.lil-gui input[type=text]:focus{background:var(--focus-color)}.lil-gui input::-webkit-inner-spin-button,.lil-gui input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.lil-gui input[type=number]{-moz-appearance:textfield}.lil-gui input[type=checkbox]{appearance:none;-webkit-appearance:none;border-radius:var(--widget-border-radius);cursor:pointer;height:var(--checkbox-size);text-align:center;width:var(--checkbox-size)}.lil-gui input[type=checkbox]:checked:before{content:"✓";font-family:lil-gui;font-size:var(--checkbox-size);line-height:var(--checkbox-size)}.lil-gui button{-webkit-tap-highlight-color:transparent;background:var(--widget-color);border:1px solid var(--widget-color);border-radius:var(--widget-border-radius);color:var(--text-color);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size);height:var(--widget-height);line-height:calc(var(--widget-height) - 4px);outline:none;text-align:center;text-transform:none;width:100%}.lil-gui button:active{background:var(--focus-color)}@font-face{font-family:lil-gui;src:url("data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUsAAsAAAAACJwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAAH4AAADAImwmYE9TLzIAAAGIAAAAPwAAAGBKqH5SY21hcAAAAcgAAAD0AAACrukyyJBnbHlmAAACvAAAAF8AAACEIZpWH2hlYWQAAAMcAAAAJwAAADZfcj2zaGhlYQAAA0QAAAAYAAAAJAC5AHhobXR4AAADXAAAABAAAABMAZAAAGxvY2EAAANsAAAAFAAAACgCEgIybWF4cAAAA4AAAAAeAAAAIAEfABJuYW1lAAADoAAAASIAAAIK9SUU/XBvc3QAAATEAAAAZgAAAJCTcMc2eJxVjbEOgjAURU+hFRBK1dGRL+ALnAiToyMLEzFpnPz/eAshwSa97517c/MwwJmeB9kwPl+0cf5+uGPZXsqPu4nvZabcSZldZ6kfyWnomFY/eScKqZNWupKJO6kXN3K9uCVoL7iInPr1X5baXs3tjuMqCtzEuagm/AAlzQgPAAB4nGNgYRBlnMDAysDAYM/gBiT5oLQBAwuDJAMDEwMrMwNWEJDmmsJwgCFeXZghBcjlZMgFCzOiKOIFAB71Bb8AeJy1kjFuwkAQRZ+DwRAwBtNQRUGKQ8OdKCAWUhAgKLhIuAsVSpWz5Bbkj3dEgYiUIszqWdpZe+Z7/wB1oCYmIoboiwiLT2WjKl/jscrHfGg/pKdMkyklC5Zs2LEfHYpjcRoPzme9MWWmk3dWbK9ObkWkikOetJ554fWyoEsmdSlt+uR0pCJR34b6t/TVg1SY3sYvdf8vuiKrpyaDXDISiegp17p7579Gp3p++y7HPAiY9pmTibljrr85qSidtlg4+l25GLCaS8e6rRxNBmsnERunKbaOObRz7N72ju5vdAjYpBXHgJylOAVsMseDAPEP8LYoUHicY2BiAAEfhiAGJgZWBgZ7RnFRdnVJELCQlBSRlATJMoLV2DK4glSYs6ubq5vbKrJLSbGrgEmovDuDJVhe3VzcXFwNLCOILB/C4IuQ1xTn5FPilBTj5FPmBAB4WwoqAHicY2BkYGAA4sk1sR/j+W2+MnAzpDBgAyEMQUCSg4EJxAEAwUgFHgB4nGNgZGBgSGFggJMhDIwMqEAYAByHATJ4nGNgAIIUNEwmAABl3AGReJxjYAACIQYlBiMGJ3wQAEcQBEV4nGNgZGBgEGZgY2BiAAEQyQWEDAz/wXwGAAsPATIAAHicXdBNSsNAHAXwl35iA0UQXYnMShfS9GPZA7T7LgIu03SSpkwzYTIt1BN4Ak/gKTyAeCxfw39jZkjymzcvAwmAW/wgwHUEGDb36+jQQ3GXGot79L24jxCP4gHzF/EIr4jEIe7wxhOC3g2TMYy4Q7+Lu/SHuEd/ivt4wJd4wPxbPEKMX3GI5+DJFGaSn4qNzk8mcbKSR6xdXdhSzaOZJGtdapd4vVPbi6rP+cL7TGXOHtXKll4bY1Xl7EGnPtp7Xy2n00zyKLVHfkHBa4IcJ2oD3cgggWvt/V/FbDrUlEUJhTn/0azVWbNTNr0Ens8de1tceK9xZmfB1CPjOmPH4kitmvOubcNpmVTN3oFJyjzCvnmrwhJTzqzVj9jiSX911FjeAAB4nG3HMRKCMBBA0f0giiKi4DU8k0V2GWbIZDOh4PoWWvq6J5V8If9NVNQcaDhyouXMhY4rPTcG7jwYmXhKq8Wz+p762aNaeYXom2n3m2dLTVgsrCgFJ7OTmIkYbwIbC6vIB7WmFfAAAA==") format("woff")}@media (pointer:coarse){.lil-gui.allow-touch-styles{--widget-height:28px;--padding:6px;--spacing:6px;--font-size:13px;--input-font-size:16px;--folder-indent:10px;--scrollbar-width:7px;--slider-input-min-width:50px;--color-input-min-width:65px}}@media (hover:hover){.lil-gui .controller.color .display:hover:before{border:1px solid #fff9;border-radius:var(--widget-border-radius);bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.lil-gui .controller.option .display.focus{background:var(--focus-color)}.lil-gui .controller.option .widget:hover .display{background:var(--hover-color)}.lil-gui .controller.number .slider:hover{background-color:var(--hover-color)}body:not(.lil-gui-dragging) .lil-gui .title:hover{background:var(--title-background-color);opacity:.85}.lil-gui .title:focus{text-decoration:underline var(--focus-color)}.lil-gui input:hover{background:var(--hover-color)}.lil-gui input:active{background:var(--focus-color)}.lil-gui input[type=checkbox]:focus{box-shadow:inset 0 0 0 1px var(--focus-color)}.lil-gui button:hover{background:var(--hover-color);border-color:var(--hover-color)}.lil-gui button:focus{border-color:var(--focus-color)}}'),et=!0),i?i.appendChild(this.domElement):e&&(this.domElement.classList.add("autoPlace"),document.body.appendChild(this.domElement)),r&&this.domElement.style.setProperty("--width",r+"px"),this.domElement.addEventListener("keydown",a=>a.stopPropagation()),this.domElement.addEventListener("keyup",a=>a.stopPropagation())}add(t,e,i,r,s){if(Object(i)===i)return new Nt(this,t,e,i);const n=t[e];switch(typeof n){case"number":return new Kt(this,t,e,i,r,s);case"boolean":return new Gt(this,t,e);case"string":return new Jt(this,t,e);case"function":return new j(this,t,e)}console.error(`gui.add failed
|
|
8
|
+
property:`,e,`
|
|
9
|
+
object:`,t,`
|
|
10
|
+
value:`,n)}addColor(t,e,i=1){return new Xt(this,t,e,i)}addFolder(t){return new J({parent:this,title:t})}load(t,e=!0){return t.controllers&&this.controllers.forEach(i=>{i instanceof j||i._name in t.controllers&&i.load(t.controllers[i._name])}),e&&t.folders&&this.folders.forEach(i=>{i._title in t.folders&&i.load(t.folders[i._title])}),this}save(t=!0){const e={controllers:{},folders:{}};return this.controllers.forEach(i=>{if(!(i instanceof j)){if(i._name in e.controllers)throw new Error(`Cannot save GUI with duplicate property "${i._name}"`);e.controllers[i._name]=i.save()}}),t&&this.folders.forEach(i=>{if(i._title in e.folders)throw new Error(`Cannot save GUI with duplicate folder "${i._title}"`);e.folders[i._title]=i.save()}),e}open(t=!0){return this._closed=!t,this.$title.setAttribute("aria-expanded",!this._closed),this.domElement.classList.toggle("closed",this._closed),this}close(){return this.open(!1)}show(t=!0){return this._hidden=!t,this.domElement.style.display=this._hidden?"none":"",this}hide(){return this.show(!1)}openAnimated(t=!0){return this._closed=!t,this.$title.setAttribute("aria-expanded",!this._closed),requestAnimationFrame(()=>{const e=this.$children.clientHeight;this.$children.style.height=e+"px",this.domElement.classList.add("transition");const i=s=>{s.target===this.$children&&(this.$children.style.height="",this.domElement.classList.remove("transition"),this.$children.removeEventListener("transitionend",i))};this.$children.addEventListener("transitionend",i);const r=t?this.$children.scrollHeight:0;this.domElement.classList.toggle("closed",!t),requestAnimationFrame(()=>{this.$children.style.height=r+"px"})}),this}title(t){return this._title=t,this.$title.innerHTML=t,this}reset(t=!0){return(t?this.controllersRecursive():this.controllers).forEach(e=>e.reset()),this}onChange(t){return this._onChange=t,this}_callOnChange(t){this.parent&&this.parent._callOnChange(t),this._onChange!==void 0&&this._onChange.call(this,{object:t.object,property:t.property,value:t.getValue(),controller:t})}onFinishChange(t){return this._onFinishChange=t,this}_callOnFinishChange(t){this.parent&&this.parent._callOnFinishChange(t),this._onFinishChange!==void 0&&this._onFinishChange.call(this,{object:t.object,property:t.property,value:t.getValue(),controller:t})}destroy(){this.parent&&(this.parent.children.splice(this.parent.children.indexOf(this),1),this.parent.folders.splice(this.parent.folders.indexOf(this),1)),this.domElement.parentElement&&this.domElement.parentElement.removeChild(this.domElement),Array.from(this.children).forEach(t=>t.destroy())}controllersRecursive(){let t=Array.from(this.controllers);return this.folders.forEach(e=>{t=t.concat(e.controllersRecursive())}),t}foldersRecursive(){let t=Array.from(this.folders);return this.folders.forEach(e=>{t=t.concat(e.foldersRecursive())}),t}}const A=globalThis.__vgaiGameWindow||globalThis.window,_=globalThis.__vgaiGameDocument||globalThis.document,Ut=new Vt,S=new vt;S.background=new wt(8965358);S.fog=new At(8965358,0,50);const f=new xt(70,A.innerWidth/A.innerHeight,.1,1e3);f.rotation.order="YXZ";const lt=new _t(9290206,26253,1.5);lt.position.set(2,1,1);S.add(lt);const y=new Et(16777215,2.5);y.position.set(-5,25,-1);y.castShadow=!0;y.shadow.camera.near=.01;y.shadow.camera.far=500;y.shadow.camera.right=30;y.shadow.camera.left=-30;y.shadow.camera.top=30;y.shadow.camera.bottom=-30;y.shadow.mapSize.width=1024;y.shadow.mapSize.height=1024;y.shadow.radius=4;y.shadow.bias=-6e-5;S.add(y);const U=_.getElementById("container"),E=new $t({antialias:!0});E.setPixelRatio(A.devicePixelRatio);E.setSize(A.innerWidth,A.innerHeight);E.setAnimationLoop(de);E.shadowMap.enabled=!0;E.shadowMap.type=St;E.toneMapping=Ct;U.appendChild(E.domElement);const G=new Dt;G.domElement.style.position="absolute";G.domElement.style.top="0px";U.appendChild(G.domElement);const at=30,Zt=100,ht=.2,it=5,qt=new kt(ht,5),Qt=new Lt({color:14605965}),$=[];let R=0;for(let o=0;o<Zt;o++){const t=new zt(qt,Qt);t.castShadow=!0,t.receiveShadow=!0,S.add(t),$.push({mesh:t,collider:new ot(new u(0,-100,0),ht),velocity:new u})}const H=new N,g=new O(new u(0,.35,0),new u(0,1,0),.35),m=new u,v=new u;let z=!1,dt=0;const C={},K=new u,ct=new u,ut=new u;_.addEventListener("keydown",o=>{C[o.code]=!0});_.addEventListener("keyup",o=>{C[o.code]=!1});U.addEventListener("mousedown",()=>{_.body.requestPointerLock(),dt=performance.now()});_.addEventListener("mouseup",()=>{_.pointerLockElement!==null&&ee()});_.body.addEventListener("mousemove",o=>{_.pointerLockElement===_.body&&(f.rotation.y-=o.movementX/500,f.rotation.x-=o.movementY/500)});A.addEventListener("resize",te);function te(){f.aspect=A.innerWidth/A.innerHeight,f.updateProjectionMatrix(),E.setSize(A.innerWidth,A.innerHeight)}function ee(){const o=$[R];f.getWorldDirection(v),o.collider.center.copy(g.end).addScaledVector(v,g.radius*1.5);const t=15+30*(1-Math.exp((dt-performance.now())*.001));o.velocity.copy(v).multiplyScalar(t),o.velocity.addScaledVector(m,2),R=(R+1)%$.length}function ie(){const o=H.capsuleIntersect(g);z=!1,o&&(z=o.normal.y>0,z||m.addScaledVector(o.normal,-o.normal.dot(m)),o.depth>=1e-10&&g.translate(o.normal.multiplyScalar(o.depth)))}function se(o){let t=Math.exp(-4*o)-1;z||(m.y-=at*o,t*=.1),m.addScaledVector(m,t);const e=m.clone().multiplyScalar(o);g.translate(e),ie(),f.position.copy(g.end)}function ne(o){const t=K.addVectors(g.start,g.end).multiplyScalar(.5),e=o.collider.center,i=g.radius+o.collider.radius,r=i*i;for(const s of[g.start,g.end,t]){const n=s.distanceToSquared(e);if(n<r){const l=K.subVectors(s,e).normalize(),a=ct.copy(l).multiplyScalar(l.dot(m)),d=ut.copy(l).multiplyScalar(l.dot(o.velocity));m.add(d).sub(a),o.velocity.add(a).sub(d);const h=(i-Math.sqrt(n))/2;e.addScaledVector(l,-h)}}}function re(){for(let o=0,t=$.length;o<t;o++){const e=$[o];for(let i=o+1;i<t;i++){const r=$[i],s=e.collider.center.distanceToSquared(r.collider.center),n=e.collider.radius+r.collider.radius,l=n*n;if(s<l){const a=K.subVectors(e.collider.center,r.collider.center).normalize(),d=ct.copy(a).multiplyScalar(a.dot(e.velocity)),h=ut.copy(a).multiplyScalar(a.dot(r.velocity));e.velocity.add(h).sub(d),r.velocity.add(d).sub(h);const p=(n-Math.sqrt(s))/2;e.collider.center.addScaledVector(a,p),r.collider.center.addScaledVector(a,-p)}}}}function oe(o){$.forEach(t=>{t.collider.center.addScaledVector(t.velocity,o);const e=H.sphereIntersect(t.collider);e?(t.velocity.addScaledVector(e.normal,-e.normal.dot(t.velocity)*1.5),t.collider.center.add(e.normal.multiplyScalar(e.depth))):t.velocity.y-=at*o;const i=Math.exp(-1.5*o)-1;t.velocity.addScaledVector(t.velocity,i),ne(t)}),re();for(const t of $)t.mesh.position.copy(t.collider.center)}function st(){return f.getWorldDirection(v),v.y=0,v.normalize(),v}function nt(){return f.getWorldDirection(v),v.y=0,v.normalize(),v.cross(f.up),v}function le(o){const t=o*(z?25:8);C.KeyW&&m.add(st().multiplyScalar(t)),C.KeyS&&m.add(st().multiplyScalar(-t)),C.KeyA&&m.add(nt().multiplyScalar(-t)),C.KeyD&&m.add(nt().multiplyScalar(t)),z&&C.Space&&(m.y=15)}const ae=new Mt().setPath("./models/gltf/");ae.load("collision-world.glb",o=>{S.add(o.scene),H.fromGraphNode(o.scene),o.scene.traverse(i=>{i.isMesh&&(i.castShadow=!0,i.receiveShadow=!0,i.material.map&&(i.material.map.anisotropy=4))});const t=new Ot(H);t.visible=!1,S.add(t),new J({width:200}).add({debug:!1},"debug").onChange(function(i){t.visible=i})});function he(){f.position.y<=-25&&(g.start.set(0,.35,0),g.end.set(0,1,0),g.radius=.35,f.position.copy(g.end),f.rotation.set(0,0,0))}function de(){const o=Math.min(.05,Ut.getDelta())/it;for(let t=0;t<it;t++)le(o),se(o),oe(o),he();E.render(S,f),G.update()}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Z as x,P as g,S as u,L as w,X as b,O as H,N as v,$ as y,a0 as z,M as P,a1 as d}from"./index-_bCaipUk.js";import{S as R}from"./stats.module--VATS4Kh.js";const t=globalThis.__vgaiGameWindow||globalThis.window,c=globalThis.__vgaiGameDocument||globalThis.document;let m,n,r,h,o,e,s=0;const f=new x,l=5;T();function T(){n=new g(70,t.innerWidth/t.innerHeight,.1,100),r=new u,r.background=new w(15790320);const a=new b(16777215,3);a.position.set(1,1,1).normalize(),r.add(a);const p=new H;for(let M=0;M<2e3;M++){const i=new v(p,new y({color:Math.random()*16777215}));i.position.x=Math.random()*40-20,i.position.y=Math.random()*40-20,i.position.z=Math.random()*40-20,i.rotation.x=Math.random()*2*Math.PI,i.rotation.y=Math.random()*2*Math.PI,i.rotation.z=Math.random()*2*Math.PI,i.scale.x=Math.random()+.5,i.scale.y=Math.random()+.5,i.scale.z=Math.random()+.5,r.add(i)}h=new z,o=new P({antialias:!0}),o.setPixelRatio(t.devicePixelRatio),o.setSize(t.innerWidth,t.innerHeight),o.setAnimationLoop(S),c.body.appendChild(o.domElement),m=new R,c.body.appendChild(m.dom),c.addEventListener("mousemove",L),t.addEventListener("resize",W)}function W(){n.aspect=t.innerWidth/t.innerHeight,n.updateProjectionMatrix(),o.setSize(t.innerWidth,t.innerHeight)}function L(a){f.x=a.clientX/t.innerWidth*2-1,f.y=-(a.clientY/t.innerHeight)*2+1}function S(){C(),m.update()}function C(){s+=.1,n.position.x=l*Math.sin(d.degToRad(s)),n.position.y=l*Math.sin(d.degToRad(s)),n.position.z=l*Math.cos(d.degToRad(s)),n.lookAt(r.position),n.updateMatrixWorld(),h.setFromCamera(f,n);const a=h.intersectObjects(r.children,!1);a.length>0?e!=a[0].object&&(e&&e.material.emissive.setHex(e.currentHex),e=a[0].object,e.currentHex=e.material.emissive.getHex(),e.material.emissive.setHex(16711680)):(e&&e.material.emissive.setHex(e.currentHex),e=null),o.render(r,n)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{WebGLRenderer as i,Scene as t,PerspectiveCamera as a}from"./fake-three-BMTQ9rl_.js";const n=globalThis.__vgaiGameWindow||globalThis.window,o=globalThis.__vgaiGameDocument||globalThis.document,e=new i;e.setSize(n.innerWidth,n.innerHeight);(o.getElementById("container")||o.body).appendChild(e.domElement);const d=new t,m=new a;e.setAnimationLoop(()=>e.render(d,m));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a2 as M,a4 as _,a3 as p,a6 as W}from"./index-_bCaipUk.js";const E=globalThis.__vgaiGameWindow||globalThis.window,L=globalThis.__vgaiGameDocument||globalThis.document;function H(){return globalThis.__world2dGameContainer??L.body}R();async function R(){const a=new M;await a.init({width:480,height:640,background:"#4ec0ca",antialias:!0}),H().appendChild(a.canvas);const w=480,c=640,b=new _;a.stage.addChild(b);const e=new _,C=new p().roundRect(-14,-12,28,24,8).fill("#ffd23f").stroke({width:2,color:"#c98a00"}),u=new p().ellipse(-2,2,9,6).fill("#fff3b0");e.addChild(C,u),e.x=w*.3,e.y=c*.5,b.addChild(e);const d=[],x=170,l=64;let y=7;const T=()=>(y=y*1103515245+12345&2147483647,y/2147483647);function k(o){const n=120+T()*(c-240-x),t=new p().rect(0,0,l,n).fill("#5dbb46").stroke({width:3,color:"#3f8a30"}),i=new p().rect(0,0,l,c-n-x).fill("#5dbb46").stroke({width:3,color:"#3f8a30"});t.x=o,t.y=0,i.x=o,i.y=n+x,b.addChild(t,i),d.push({top:t,bot:i,x:o,scored:!1})}for(let o=0;o<4;o++)k(w+o*220);const r=new W({text:"Score: 0",style:{fontSize:28,fill:"#fff",fontWeight:"bold"}});r.x=16,r.y=16,a.stage.addChild(r);let f=0,h=0,s=!1,g=0;const G=.5,A=-8.5;function m(){if(s){e.y=c*.5,f=0,h=0,s=!1;for(let o=0;o<d.length;o++)d[o].x=w+o*220;return}f=A}E.addEventListener("keydown",o=>{(o.code==="Space"||o.code==="ArrowUp")&&m()}),a.canvas.addEventListener("pointerdown",m),a.ticker.add(o=>{const n=o.deltaTime;if(g+=n,u.scale.y=.6+Math.abs(Math.sin(g*.3))*.8,!s){f+=G*n,e.y+=f*n,e.rotation=Math.max(-.5,Math.min(1.2,f*.05));for(const t of d){t.x-=2.2*n,t.top.x=t.x,t.bot.x=t.x,t.x+l<0&&(t.x+=d.length*220,t.scored=!1),!t.scored&&t.x+l<e.x&&(t.scored=!0,h++,r.text=`Score: ${h}`);const i=e.x-14,v=e.y-12;if(i+28>t.x&&i<t.x+l){const P=t.top.height,S=t.bot.y;(v<P||v+24>S)&&(s=!0)}}(e.y>c-12||e.y<0)&&(s=!0),s&&(r.text=`Score: ${h} — tap to retry`)}}),globalThis.__flappy={app:a,score:()=>h}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ap as G,a9 as k,aq as N,L as H,P as T,S as X,ar as Y,as as q,a0 as O,at as U,au as S,av as C,ae as V,N as D,O as Q,aw as Z,M as J}from"./index-_bCaipUk.js";const p=new N(0,0,0,"YXZ"),b=new k,$={type:"change"},ee={type:"lock"},te={type:"unlock"},R=Math.PI/2;class oe extends G{constructor(r,t=null){super(r,t),this.isLocked=!1,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.pointerSpeed=1,this._onMouseMove=ne.bind(this),this._onPointerlockChange=re.bind(this),this._onPointerlockError=se.bind(this),this.domElement!==null&&this.connect()}connect(){this.domElement.ownerDocument.addEventListener("mousemove",this._onMouseMove),this.domElement.ownerDocument.addEventListener("pointerlockchange",this._onPointerlockChange),this.domElement.ownerDocument.addEventListener("pointerlockerror",this._onPointerlockError)}disconnect(){this.domElement.ownerDocument.removeEventListener("mousemove",this._onMouseMove),this.domElement.ownerDocument.removeEventListener("pointerlockchange",this._onPointerlockChange),this.domElement.ownerDocument.removeEventListener("pointerlockerror",this._onPointerlockError)}dispose(){this.disconnect()}getObject(){return console.warn("THREE.PointerLockControls: getObject() has been deprecated. Use controls.object instead."),this.object}getDirection(r){return r.set(0,0,-1).applyQuaternion(this.object.quaternion)}moveForward(r){if(this.enabled===!1)return;const t=this.object;b.setFromMatrixColumn(t.matrix,0),b.crossVectors(t.up,b),t.position.addScaledVector(b,r)}moveRight(r){if(this.enabled===!1)return;const t=this.object;b.setFromMatrixColumn(t.matrix,0),t.position.addScaledVector(b,r)}lock(){this.domElement.requestPointerLock()}unlock(){this.domElement.ownerDocument.exitPointerLock()}}function ne(n){if(this.enabled===!1||this.isLocked===!1)return;const r=n.movementX||n.mozMovementX||n.webkitMovementX||0,t=n.movementY||n.mozMovementY||n.webkitMovementY||0,s=this.object;p.setFromQuaternion(s.quaternion),p.y-=r*.002*this.pointerSpeed,p.x-=t*.002*this.pointerSpeed,p.x=Math.max(R-this.maxPolarAngle,Math.min(R-this.minPolarAngle,p.x)),s.quaternion.setFromEuler(p),this.dispatchEvent($)}function re(){this.domElement.ownerDocument.pointerLockElement===this.domElement?(this.dispatchEvent(ee),this.isLocked=!0):(this.dispatchEvent(te),this.isLocked=!1)}function se(){console.error("THREE.PointerLockControls: Unable to use Pointer Lock API")}const a=globalThis.__vgaiGameWindow||globalThis.window,w=globalThis.__vgaiGameDocument||globalThis.document;let y,m,f,i;const K=[];let M,E=!1,x=!1,L=!1,P=!1,A=!1,F=performance.now();const o=new k,g=new k,u=new k,l=new H;ie();function ie(){y=new T(75,a.innerWidth/a.innerHeight,1,1e3),y.position.y=10,m=new X,m.background=new H(16777215),m.fog=new Y(16777215,0,750);const n=new q(15658751,7829384,2.5);n.position.set(.5,1,.75),m.add(n),i=new oe(y,w.body);const r=w.getElementById("blocker"),t=w.getElementById("instructions");t.addEventListener("click",function(){i.lock()}),i.addEventListener("lock",function(){t.style.display="none",r.style.display="none"}),i.addEventListener("unlock",function(){r.style.display="block",t.style.display=""}),m.add(i.object);const s=function(e){switch(e.code){case"ArrowUp":case"KeyW":E=!0;break;case"ArrowLeft":case"KeyA":L=!0;break;case"ArrowDown":case"KeyS":x=!0;break;case"ArrowRight":case"KeyD":P=!0;break;case"Space":A===!0&&(o.y+=350),A=!1;break}},B=function(e){switch(e.code){case"ArrowUp":case"KeyW":E=!1;break;case"ArrowLeft":case"KeyA":L=!1;break;case"ArrowDown":case"KeyS":x=!1;break;case"ArrowRight":case"KeyD":P=!1;break}};w.addEventListener("keydown",s),w.addEventListener("keyup",B),M=new O(new k,new k(0,-1,0),0,10);let d=new U(2e3,2e3,100,100);d.rotateX(-Math.PI/2);let h=d.attributes.position;for(let e=0,c=h.count;e<c;e++)u.fromBufferAttribute(h,e),u.x+=Math.random()*20-10,u.y+=Math.random()*2,u.z+=Math.random()*20-10,h.setXYZ(e,u.x,u.y,u.z);d=d.toNonIndexed(),h=d.attributes.position;const j=[];for(let e=0,c=h.count;e<c;e++)l.setHSL(Math.random()*.3+.5,.75,Math.random()*.25+.75,S),j.push(l.r,l.g,l.b);d.setAttribute("color",new C(j,3));const I=new V({vertexColors:!0}),W=new D(d,I);m.add(W);const _=new Q(20,20,20).toNonIndexed();h=_.attributes.position;const z=[];for(let e=0,c=h.count;e<c;e++)l.setHSL(Math.random()*.3+.5,.75,Math.random()*.25+.75,S),z.push(l.r,l.g,l.b);_.setAttribute("color",new C(z,3));for(let e=0;e<500;e++){const c=new Z({specular:16777215,flatShading:!0,vertexColors:!0});c.color.setHSL(Math.random()*.2+.5,.75,Math.random()*.25+.75,S);const v=new D(_,c);v.position.x=Math.floor(Math.random()*20-10)*20,v.position.y=Math.floor(Math.random()*20)*20+10,v.position.z=Math.floor(Math.random()*20-10)*20,m.add(v),K.push(v)}f=new J({antialias:!0}),f.setPixelRatio(a.devicePixelRatio),f.setSize(a.innerWidth,a.innerHeight),f.setAnimationLoop(ce),w.body.appendChild(f.domElement),a.addEventListener("resize",ae)}function ae(){y.aspect=a.innerWidth/a.innerHeight,y.updateProjectionMatrix(),f.setSize(a.innerWidth,a.innerHeight)}function ce(){const n=performance.now();if(i.isLocked===!0){M.ray.origin.copy(i.object.position),M.ray.origin.y-=10;const t=M.intersectObjects(K,!1).length>0,s=(n-F)/1e3;o.x-=o.x*10*s,o.z-=o.z*10*s,o.y-=9.8*100*s,g.z=Number(E)-Number(x),g.x=Number(P)-Number(L),g.normalize(),(E||x)&&(o.z-=g.z*400*s),(L||P)&&(o.x-=g.x*400*s),t===!0&&(o.y=Math.max(0,o.y),A=!0),i.moveRight(-o.x*s),i.moveForward(-o.z*s),i.object.position.y+=o.y*s,i.object.position.y<10&&(o.y=0,i.object.position.y=10,A=!0)}F=n,f.render(m,y)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a2 as u,a3 as h,a4 as v,a5 as y}from"./index-_bCaipUk.js";const x=globalThis.__vgaiGameDocument||globalThis.document;function g(){return globalThis.__world2dGameContainer??x.body}p();async function p(){const t=new u;await t.init({width:800,height:600,background:"#1a1a2e",antialias:!1}),g().appendChild(t.canvas);const r=new h().roundRect(0,0,26,32,6).fill("#ffd166").circle(8,10,3).fill("#222").circle(18,10,3).fill("#222"),d=t.renderer.generateTexture(r),a=[],s=new v;t.stage.addChild(s);const e=800,c=600,f=.5;let i=12345;const o=()=>(i=i*1103515245+12345&2147483647,i/2147483647);function l(){const n=new y(d);n.anchor.set(.5),n.x=e/2,n.y=0,n.tint=o()*16777215|0,s.addChild(n),a.push({s:n,vx:(o()-.5)*12,vy:o()*6})}for(let n=0;n<250;n++)l();t.ticker.add(()=>{if(a.length<1500)for(let n=0;n<4;n++)l();for(const n of a)n.s.x+=n.vx,n.s.y+=n.vy,n.vy+=f,n.s.x>e?(n.s.x=e,n.vx=-n.vx):n.s.x<0&&(n.s.x=0,n.vx=-n.vx),n.s.y>c&&(n.s.y=c,n.vy=-n.vy*.85)}),globalThis.__bunnymark={app:t,count:()=>a.length}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as d,S as c,L as l,P as m,X as h,N as w,O as g,Q as b}from"./index-_bCaipUk.js";const e=globalThis.__vgaiGameWindow||globalThis.window,i=globalThis.__vgaiGameDocument||globalThis.document,n=new d({antialias:!0});n.setSize(e.innerWidth,e.innerHeight);(i.getElementById("container")||i.body).appendChild(n.domElement);const t=new c;t.background=new l(2105384);const r=new m(60,e.innerWidth/e.innerHeight,.1,100);r.position.set(0,1.5,5);const o=new h(16777215,1.2);o.position.set(2,3,4);o.name="KeyLight";t.add(o);const a=new w(new g(1,1,1),new b({color:3368652}));a.name="OwnThreeCube";t.add(a);let s=0;n.setAnimationLoop(()=>{s+=.01,a.rotation.y=s,n.render(t,r)});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as h,L as l,P as f,M as w,N as s,O as p,Q as r,U as u,X as b,Y as g}from"./index-_bCaipUk.js";const c=globalThis.__vgaiGameDocument||globalThis.document,e=new h;e.name="BundleScene";e.background=new l(1053724);const n=new f(60,innerWidth/innerHeight,.1,100);n.position.set(0,1.6,5);const d=c.createElement("canvas"),t=new w({canvas:d,antialias:!0});t.setSize(innerWidth,innerHeight,!1);c.body.appendChild(d);const a=new s(new p(1,1,1),new r({color:16733491}));a.name="HeroCube";e.add(a);const i=new s(new u(.6,24,16),new r({color:3377407}));i.name="Orb";i.position.set(2.2,0,0);e.add(i);const o=new b(16777215,2.2);o.position.set(3,5,2);o.name="Sun";e.add(o);e.add(new g(4210768,1));t.setAnimationLoop(m=>{a.rotation.y=m*.001,t.render(e,n)});addEventListener("resize",()=>{n.aspect=innerWidth/innerHeight,n.updateProjectionMatrix(),t.setSize(innerWidth,innerHeight,!1)});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import{aN as P,L as v,Z as u,aO as S,aP as w,aQ as y,aR as p,a9 as d,aS as _,aT as H,ae as z,aU as A,M as V,S as Q,P as W,X as E,N as L,aV as I,aW as N}from"./index-_bCaipUk.js";class O extends P{constructor(e,l,i=null,a=null,t=null){super(),this.scene=e,this.camera=l,this.overrideMaterial=i,this.clearColor=a,this.clearAlpha=t,this.clear=!0,this.clearDepth=!1,this.needsSwap=!1,this._oldClearColor=new v}render(e,l,i){const a=e.autoClear;e.autoClear=!1;let t,o;this.overrideMaterial!==null&&(o=this.scene.overrideMaterial,this.scene.overrideMaterial=this.overrideMaterial),this.clearColor!==null&&(e.getClearColor(this._oldClearColor),e.setClearColor(this.clearColor,e.getClearAlpha())),this.clearAlpha!==null&&(t=e.getClearAlpha(),e.setClearAlpha(this.clearAlpha)),this.clearDepth==!0&&e.clearDepth(),e.setRenderTarget(this.renderToScreen?null:i),this.clear===!0&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),e.render(this.scene,this.camera),this.clearColor!==null&&e.setClearColor(this._oldClearColor),this.clearAlpha!==null&&e.setClearAlpha(t),this.overrideMaterial!==null&&(this.scene.overrideMaterial=o),e.autoClear=a}}const G={uniforms:{tDiffuse:{value:null},luminosityThreshold:{value:1},smoothWidth:{value:1},defaultColor:{value:new v(0)},defaultOpacity:{value:0}},vertexShader:`
|
|
2
|
+
|
|
3
|
+
varying vec2 vUv;
|
|
4
|
+
|
|
5
|
+
void main() {
|
|
6
|
+
|
|
7
|
+
vUv = uv;
|
|
8
|
+
|
|
9
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
10
|
+
|
|
11
|
+
}`,fragmentShader:`
|
|
12
|
+
|
|
13
|
+
uniform sampler2D tDiffuse;
|
|
14
|
+
uniform vec3 defaultColor;
|
|
15
|
+
uniform float defaultOpacity;
|
|
16
|
+
uniform float luminosityThreshold;
|
|
17
|
+
uniform float smoothWidth;
|
|
18
|
+
|
|
19
|
+
varying vec2 vUv;
|
|
20
|
+
|
|
21
|
+
void main() {
|
|
22
|
+
|
|
23
|
+
vec4 texel = texture2D( tDiffuse, vUv );
|
|
24
|
+
|
|
25
|
+
float v = luminance( texel.xyz );
|
|
26
|
+
|
|
27
|
+
vec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );
|
|
28
|
+
|
|
29
|
+
float alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );
|
|
30
|
+
|
|
31
|
+
gl_FragColor = mix( outputColor, texel, alpha );
|
|
32
|
+
|
|
33
|
+
}`};class f extends P{constructor(e,l,i,a){super(),this.strength=l!==void 0?l:1,this.radius=i,this.threshold=a,this.resolution=e!==void 0?new u(e.x,e.y):new u(256,256),this.clearColor=new v(0,0,0),this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.nMips=5;let t=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);this.renderTargetBright=new S(t,o,{type:w}),this.renderTargetBright.texture.name="UnrealBloomPass.bright",this.renderTargetBright.texture.generateMipmaps=!1;for(let n=0;n<this.nMips;n++){const C=new S(t,o,{type:w});C.texture.name="UnrealBloomPass.h"+n,C.texture.generateMipmaps=!1,this.renderTargetsHorizontal.push(C);const M=new S(t,o,{type:w});M.texture.name="UnrealBloomPass.v"+n,M.texture.generateMipmaps=!1,this.renderTargetsVertical.push(M),t=Math.round(t/2),o=Math.round(o/2)}const c=G;this.highPassUniforms=y.clone(c.uniforms),this.highPassUniforms.luminosityThreshold.value=a,this.highPassUniforms.smoothWidth.value=.01,this.materialHighPassFilter=new p({uniforms:this.highPassUniforms,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader}),this.separableBlurMaterials=[];const s=[3,5,7,9,11];t=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);for(let n=0;n<this.nMips;n++)this.separableBlurMaterials.push(this.getSeperableBlurMaterial(s[n])),this.separableBlurMaterials[n].uniforms.invSize.value=new u(1/t,1/o),t=Math.round(t/2),o=Math.round(o/2);this.compositeMaterial=this.getCompositeMaterial(this.nMips),this.compositeMaterial.uniforms.blurTexture1.value=this.renderTargetsVertical[0].texture,this.compositeMaterial.uniforms.blurTexture2.value=this.renderTargetsVertical[1].texture,this.compositeMaterial.uniforms.blurTexture3.value=this.renderTargetsVertical[2].texture,this.compositeMaterial.uniforms.blurTexture4.value=this.renderTargetsVertical[3].texture,this.compositeMaterial.uniforms.blurTexture5.value=this.renderTargetsVertical[4].texture,this.compositeMaterial.uniforms.bloomStrength.value=l,this.compositeMaterial.uniforms.bloomRadius.value=.1;const F=[1,.8,.6,.4,.2];this.compositeMaterial.uniforms.bloomFactors.value=F,this.bloomTintColors=[new d(1,1,1),new d(1,1,1),new d(1,1,1),new d(1,1,1),new d(1,1,1)],this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors;const b=_;this.copyUniforms=y.clone(b.uniforms),this.blendMaterial=new p({uniforms:this.copyUniforms,vertexShader:b.vertexShader,fragmentShader:b.fragmentShader,blending:H,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new v,this.oldClearAlpha=1,this.basic=new z,this.fsQuad=new A(null)}dispose(){for(let e=0;e<this.renderTargetsHorizontal.length;e++)this.renderTargetsHorizontal[e].dispose();for(let e=0;e<this.renderTargetsVertical.length;e++)this.renderTargetsVertical[e].dispose();this.renderTargetBright.dispose();for(let e=0;e<this.separableBlurMaterials.length;e++)this.separableBlurMaterials[e].dispose();this.compositeMaterial.dispose(),this.blendMaterial.dispose(),this.basic.dispose(),this.fsQuad.dispose()}setSize(e,l){let i=Math.round(e/2),a=Math.round(l/2);this.renderTargetBright.setSize(i,a);for(let t=0;t<this.nMips;t++)this.renderTargetsHorizontal[t].setSize(i,a),this.renderTargetsVertical[t].setSize(i,a),this.separableBlurMaterials[t].uniforms.invSize.value=new u(1/i,1/a),i=Math.round(i/2),a=Math.round(a/2)}render(e,l,i,a,t){e.getClearColor(this._oldClearColor),this.oldClearAlpha=e.getClearAlpha();const o=e.autoClear;e.autoClear=!1,e.setClearColor(this.clearColor,0),t&&e.state.buffers.stencil.setTest(!1),this.renderToScreen&&(this.fsQuad.material=this.basic,this.basic.map=i.texture,e.setRenderTarget(null),e.clear(),this.fsQuad.render(e)),this.highPassUniforms.tDiffuse.value=i.texture,this.highPassUniforms.luminosityThreshold.value=this.threshold,this.fsQuad.material=this.materialHighPassFilter,e.setRenderTarget(this.renderTargetBright),e.clear(),this.fsQuad.render(e);let c=this.renderTargetBright;for(let s=0;s<this.nMips;s++)this.fsQuad.material=this.separableBlurMaterials[s],this.separableBlurMaterials[s].uniforms.colorTexture.value=c.texture,this.separableBlurMaterials[s].uniforms.direction.value=f.BlurDirectionX,e.setRenderTarget(this.renderTargetsHorizontal[s]),e.clear(),this.fsQuad.render(e),this.separableBlurMaterials[s].uniforms.colorTexture.value=this.renderTargetsHorizontal[s].texture,this.separableBlurMaterials[s].uniforms.direction.value=f.BlurDirectionY,e.setRenderTarget(this.renderTargetsVertical[s]),e.clear(),this.fsQuad.render(e),c=this.renderTargetsVertical[s];this.fsQuad.material=this.compositeMaterial,this.compositeMaterial.uniforms.bloomStrength.value=this.strength,this.compositeMaterial.uniforms.bloomRadius.value=this.radius,this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,e.setRenderTarget(this.renderTargetsHorizontal[0]),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.blendMaterial,this.copyUniforms.tDiffuse.value=this.renderTargetsHorizontal[0].texture,t&&e.state.buffers.stencil.setTest(!0),this.renderToScreen?(e.setRenderTarget(null),this.fsQuad.render(e)):(e.setRenderTarget(i),this.fsQuad.render(e)),e.setClearColor(this._oldClearColor,this.oldClearAlpha),e.autoClear=o}getSeperableBlurMaterial(e){const l=[];for(let i=0;i<e;i++)l.push(.39894*Math.exp(-.5*i*i/(e*e))/e);return new p({defines:{KERNEL_RADIUS:e},uniforms:{colorTexture:{value:null},invSize:{value:new u(.5,.5)},direction:{value:new u(.5,.5)},gaussianCoefficients:{value:l}},vertexShader:`varying vec2 vUv;
|
|
34
|
+
void main() {
|
|
35
|
+
vUv = uv;
|
|
36
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
37
|
+
}`,fragmentShader:`#include <common>
|
|
38
|
+
varying vec2 vUv;
|
|
39
|
+
uniform sampler2D colorTexture;
|
|
40
|
+
uniform vec2 invSize;
|
|
41
|
+
uniform vec2 direction;
|
|
42
|
+
uniform float gaussianCoefficients[KERNEL_RADIUS];
|
|
43
|
+
|
|
44
|
+
void main() {
|
|
45
|
+
float weightSum = gaussianCoefficients[0];
|
|
46
|
+
vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;
|
|
47
|
+
for( int i = 1; i < KERNEL_RADIUS; i ++ ) {
|
|
48
|
+
float x = float(i);
|
|
49
|
+
float w = gaussianCoefficients[i];
|
|
50
|
+
vec2 uvOffset = direction * invSize * x;
|
|
51
|
+
vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
|
|
52
|
+
vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
|
|
53
|
+
diffuseSum += (sample1 + sample2) * w;
|
|
54
|
+
weightSum += 2.0 * w;
|
|
55
|
+
}
|
|
56
|
+
gl_FragColor = vec4(diffuseSum/weightSum, 1.0);
|
|
57
|
+
}`})}getCompositeMaterial(e){return new p({defines:{NUM_MIPS:e},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:`varying vec2 vUv;
|
|
58
|
+
void main() {
|
|
59
|
+
vUv = uv;
|
|
60
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
61
|
+
}`,fragmentShader:`varying vec2 vUv;
|
|
62
|
+
uniform sampler2D blurTexture1;
|
|
63
|
+
uniform sampler2D blurTexture2;
|
|
64
|
+
uniform sampler2D blurTexture3;
|
|
65
|
+
uniform sampler2D blurTexture4;
|
|
66
|
+
uniform sampler2D blurTexture5;
|
|
67
|
+
uniform float bloomStrength;
|
|
68
|
+
uniform float bloomRadius;
|
|
69
|
+
uniform float bloomFactors[NUM_MIPS];
|
|
70
|
+
uniform vec3 bloomTintColors[NUM_MIPS];
|
|
71
|
+
|
|
72
|
+
float lerpBloomFactor(const in float factor) {
|
|
73
|
+
float mirrorFactor = 1.2 - factor;
|
|
74
|
+
return mix(factor, mirrorFactor, bloomRadius);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
void main() {
|
|
78
|
+
gl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +
|
|
79
|
+
lerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +
|
|
80
|
+
lerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +
|
|
81
|
+
lerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +
|
|
82
|
+
lerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );
|
|
83
|
+
}`})}}f.BlurDirectionX=new u(1,0);f.BlurDirectionY=new u(0,1);const r=globalThis.__vgaiGameWindow||globalThis.window,D=globalThis.__vgaiGameDocument||globalThis.document,R=r.devicePixelRatio||1,h=new V({antialias:!0});h.setPixelRatio(R);h.setSize(r.innerWidth,r.innerHeight);(D.getElementById("container")||D.body).appendChild(h.domElement);const x=new Q;x.background=new v(328970);const g=new W(60,r.innerWidth/r.innerHeight,.1,100);g.position.set(0,1.2,4.5);const U=new E(16777215,.6);U.position.set(2,3,4);U.name="KeyLight";x.add(U);const T=new L(new I(1,1),new z({color:16773808}));T.name="BloomCore";x.add(T);const m=new N(h);m.setPixelRatio(R);m.setSize(r.innerWidth,r.innerHeight);m.addPass(new O(x,g));const j=new f(new u(r.innerWidth,r.innerHeight),1.6,.5,.1);m.addPass(j);r.addEventListener("resize",()=>{g.aspect=r.innerWidth/r.innerHeight,g.updateProjectionMatrix(),h.setSize(r.innerWidth,r.innerHeight),m.setSize(r.innerWidth,r.innerHeight)});r.__vgaiBloomComposer={composerSize:()=>[m.writeBuffer.width,m.writeBuffer.height],rendererSize:()=>[h.domElement.width,h.domElement.height],pixelRatio:()=>h.getPixelRatio()};let B=0;h.setAnimationLoop(()=>{B+=.01,T.rotation.y=B,T.rotation.x=B*.6,m.render()});
|