@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.
Files changed (519) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +35 -0
  3. package/dist/a/b/c/test-nested.json +1 -0
  4. package/dist/assets/CCDIKSolver-Dz-ysxZF.js +1 -0
  5. package/dist/assets/SelectionBox-BXsv_6aH.js +1 -0
  6. package/dist/assets/browser-project-scripts-DOru4L1x.js +2 -0
  7. package/dist/assets/browserAll-CEkWYlFk.js +1 -0
  8. package/dist/assets/collision-world-DniMB0qq.glb +0 -0
  9. package/dist/assets/create-runtime-DYIWr3va.js +1 -0
  10. package/dist/assets/data-asset-Bb9sIM7i.js +5 -0
  11. package/dist/assets/esbuild-BHljloGq.wasm +0 -0
  12. package/dist/assets/fake-three-BMTQ9rl_.js +1 -0
  13. package/dist/assets/game-8SDZPPgH.js +1 -0
  14. package/dist/assets/game-BI111o5f.js +10 -0
  15. package/dist/assets/game-CevorxyV.js +1 -0
  16. package/dist/assets/game-Di1H0gFj.js +1 -0
  17. package/dist/assets/game-Di7XlywD.js +1 -0
  18. package/dist/assets/game-DjnCaw8R.js +1 -0
  19. package/dist/assets/game-Q9A0aXSV.js +1 -0
  20. package/dist/assets/game-pt_1lQLv.js +1 -0
  21. package/dist/assets/game-source-CvidN7AB.js +1 -0
  22. package/dist/assets/game-xsOho_wg.js +83 -0
  23. package/dist/assets/index-Bp5cecD6.js +12 -0
  24. package/dist/assets/index-CPVV6pjw.js +1 -0
  25. package/dist/assets/index-CpOnYyeD.js +213 -0
  26. package/dist/assets/index-Cs8xwv3e.js +1 -0
  27. package/dist/assets/index-DL7RcQ0n.js +27 -0
  28. package/dist/assets/index-Dr8H_6Rl.js +1 -0
  29. package/dist/assets/index-_bCaipUk.js +13650 -0
  30. package/dist/assets/ingest-siblings-Dz8eEqrV.js +1 -0
  31. package/dist/assets/mount-manifest-Bhk0ohsl.js +1 -0
  32. package/dist/assets/recast-navigation.wasm-compat-CvP4UGK6.js +1 -0
  33. package/dist/assets/scene-query-BivAHhJu.js +1 -0
  34. package/dist/assets/stats.module--VATS4Kh.js +1 -0
  35. package/dist/assets/webworkerAll-BLrH0F6F.js +1 -0
  36. package/dist/assets/xstate-animation-binding-1NGLmw6y.js +1 -0
  37. package/dist/assets/xstate.esm-BgUD33nl.js +3 -0
  38. package/dist/index.html +37 -0
  39. package/dist/ingest/racing-game/UPSTREAM.md +68 -0
  40. package/dist/ingest/racing-game/a/Inter-Black.woff +0 -0
  41. package/dist/ingest/racing-game/a/Inter-Black.woff2 +0 -0
  42. package/dist/ingest/racing-game/a/Inter-BlackItalic.woff +0 -0
  43. package/dist/ingest/racing-game/a/Inter-BlackItalic.woff2 +0 -0
  44. package/dist/ingest/racing-game/a/Inter-Bold.woff +0 -0
  45. package/dist/ingest/racing-game/a/Inter-Bold.woff2 +0 -0
  46. package/dist/ingest/racing-game/a/Inter-BoldItalic.woff +0 -0
  47. package/dist/ingest/racing-game/a/Inter-BoldItalic.woff2 +0 -0
  48. package/dist/ingest/racing-game/a/Inter-ExtraBold.woff +0 -0
  49. package/dist/ingest/racing-game/a/Inter-ExtraBold.woff2 +0 -0
  50. package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff +0 -0
  51. package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff2 +0 -0
  52. package/dist/ingest/racing-game/a/Inter-ExtraLight.woff +0 -0
  53. package/dist/ingest/racing-game/a/Inter-ExtraLight.woff2 +0 -0
  54. package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff +0 -0
  55. package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff2 +0 -0
  56. package/dist/ingest/racing-game/a/Inter-Italic.woff +0 -0
  57. package/dist/ingest/racing-game/a/Inter-Italic.woff2 +0 -0
  58. package/dist/ingest/racing-game/a/Inter-Light.woff +0 -0
  59. package/dist/ingest/racing-game/a/Inter-Light.woff2 +0 -0
  60. package/dist/ingest/racing-game/a/Inter-LightItalic.woff +0 -0
  61. package/dist/ingest/racing-game/a/Inter-LightItalic.woff2 +0 -0
  62. package/dist/ingest/racing-game/a/Inter-Medium.woff +0 -0
  63. package/dist/ingest/racing-game/a/Inter-Medium.woff2 +0 -0
  64. package/dist/ingest/racing-game/a/Inter-MediumItalic.woff +0 -0
  65. package/dist/ingest/racing-game/a/Inter-MediumItalic.woff2 +0 -0
  66. package/dist/ingest/racing-game/a/Inter-Regular.woff +0 -0
  67. package/dist/ingest/racing-game/a/Inter-Regular.woff2 +0 -0
  68. package/dist/ingest/racing-game/a/Inter-SemiBold.woff +0 -0
  69. package/dist/ingest/racing-game/a/Inter-SemiBold.woff2 +0 -0
  70. package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff +0 -0
  71. package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff2 +0 -0
  72. package/dist/ingest/racing-game/a/Inter-Thin.woff +0 -0
  73. package/dist/ingest/racing-game/a/Inter-Thin.woff2 +0 -0
  74. package/dist/ingest/racing-game/a/Inter-ThinItalic.woff +0 -0
  75. package/dist/ingest/racing-game/a/Inter-ThinItalic.woff2 +0 -0
  76. package/dist/ingest/racing-game/a/Inter-italic.var.woff2 +0 -0
  77. package/dist/ingest/racing-game/a/Inter-roman.var.woff2 +0 -0
  78. package/dist/ingest/racing-game/a/Inter.var.woff2 +0 -0
  79. package/dist/ingest/racing-game/a/index.css +1 -0
  80. package/dist/ingest/racing-game/images/bronze.png +0 -0
  81. package/dist/ingest/racing-game/images/gold.png +0 -0
  82. package/dist/ingest/racing-game/images/silver.png +0 -0
  83. package/dist/ingest/racing-game/index.html +15 -0
  84. package/dist/ingest/racing-game/models/chassis-draco.glb +0 -0
  85. package/dist/ingest/racing-game/models/track-draco.glb +0 -0
  86. package/dist/ingest/racing-game/models/wheel-draco.glb +0 -0
  87. package/dist/ingest/racing-game/rg-entry.js +1 -0
  88. package/dist/ingest/racing-game/sounds/accelerate.mp3 +0 -0
  89. package/dist/ingest/racing-game/sounds/boost.mp3 +0 -0
  90. package/dist/ingest/racing-game/sounds/crash.mp3 +0 -0
  91. package/dist/ingest/racing-game/sounds/engine.mp3 +0 -0
  92. package/dist/ingest/racing-game/sounds/honk.mp3 +0 -0
  93. package/dist/ingest/racing-game/sounds/tire-brake.mp3 +0 -0
  94. package/dist/ingest/racing-game/sounds/train.mp3 +0 -0
  95. package/dist/ingest/racing-game/sounds/water.mp3 +0 -0
  96. package/dist/ingest/racing-game/textures/cursor.svg +3 -0
  97. package/dist/ingest/racing-game/textures/dikhololo_night_1k.hdr +0 -0
  98. package/dist/ingest/racing-game/textures/heightmap_1024.png +0 -0
  99. package/dist/ingest/racing-game/textures/mask.svg +11 -0
  100. package/dist/ingest/racing-game/textures/no_sound.png +0 -0
  101. package/dist/ingest/racing-game/three-r139.module.js +50617 -0
  102. package/dist/ingest/racing-game/vendor.js +179 -0
  103. package/dist/ingest/racing-game/vgai.game.json +20 -0
  104. package/dist/ingest/simcity/UPSTREAM.md +65 -0
  105. package/dist/ingest/simcity/favicon.ico +0 -0
  106. package/dist/ingest/simcity/fonts/Bebas-Regular.otf +0 -0
  107. package/dist/ingest/simcity/fonts/Digitalt.otf +0 -0
  108. package/dist/ingest/simcity/fonts/Stanberry.ttf +0 -0
  109. package/dist/ingest/simcity/icons/bulldozer-color.png +0 -0
  110. package/dist/ingest/simcity/icons/bulldozer.png +0 -0
  111. package/dist/ingest/simcity/icons/calendar.png +0 -0
  112. package/dist/ingest/simcity/icons/factory-color.png +0 -0
  113. package/dist/ingest/simcity/icons/factory.png +0 -0
  114. package/dist/ingest/simcity/icons/house-color.png +0 -0
  115. package/dist/ingest/simcity/icons/house.png +0 -0
  116. package/dist/ingest/simcity/icons/job.png +0 -0
  117. package/dist/ingest/simcity/icons/office.png +0 -0
  118. package/dist/ingest/simcity/icons/pause-color.png +0 -0
  119. package/dist/ingest/simcity/icons/pause.png +0 -0
  120. package/dist/ingest/simcity/icons/person.png +0 -0
  121. package/dist/ingest/simcity/icons/play-color.png +0 -0
  122. package/dist/ingest/simcity/icons/play.png +0 -0
  123. package/dist/ingest/simcity/icons/power-color.png +0 -0
  124. package/dist/ingest/simcity/icons/power-line-color.png +0 -0
  125. package/dist/ingest/simcity/icons/power.png +0 -0
  126. package/dist/ingest/simcity/icons/road-color.png +0 -0
  127. package/dist/ingest/simcity/icons/road.png +0 -0
  128. package/dist/ingest/simcity/icons/select-color.png +0 -0
  129. package/dist/ingest/simcity/icons/select.png +0 -0
  130. package/dist/ingest/simcity/icons/store-color.png +0 -0
  131. package/dist/ingest/simcity/index.html +94 -0
  132. package/dist/ingest/simcity/index.js +58 -0
  133. package/dist/ingest/simcity/main.css +233 -0
  134. package/dist/ingest/simcity/models/armored-truck.glb +0 -0
  135. package/dist/ingest/simcity/models/building-block-4floor-corner.glb +0 -0
  136. package/dist/ingest/simcity/models/building-block-4floor-short.glb +0 -0
  137. package/dist/ingest/simcity/models/building-block-5floor.glb +0 -0
  138. package/dist/ingest/simcity/models/building-burger-joint.glb +0 -0
  139. package/dist/ingest/simcity/models/building-cafe.glb +0 -0
  140. package/dist/ingest/simcity/models/building-casino.glb +0 -0
  141. package/dist/ingest/simcity/models/building-cinema.glb +0 -0
  142. package/dist/ingest/simcity/models/building-house-block-big.glb +0 -0
  143. package/dist/ingest/simcity/models/building-house-family-large.glb +0 -0
  144. package/dist/ingest/simcity/models/building-house-family-small.glb +0 -0
  145. package/dist/ingest/simcity/models/building-office-balcony.glb +0 -0
  146. package/dist/ingest/simcity/models/building-office-big.glb +0 -0
  147. package/dist/ingest/simcity/models/building-office-pyramid.glb +0 -0
  148. package/dist/ingest/simcity/models/building-office-tall.glb +0 -0
  149. package/dist/ingest/simcity/models/building-office.glb +0 -0
  150. package/dist/ingest/simcity/models/building-restaurant.glb +0 -0
  151. package/dist/ingest/simcity/models/building-skyscraper.glb +0 -0
  152. package/dist/ingest/simcity/models/car-ambulance-pickup.glb +0 -0
  153. package/dist/ingest/simcity/models/car-baywatch.glb +0 -0
  154. package/dist/ingest/simcity/models/car-hippie-van.glb +0 -0
  155. package/dist/ingest/simcity/models/car-passenger-race.glb +0 -0
  156. package/dist/ingest/simcity/models/car-passenger.glb +0 -0
  157. package/dist/ingest/simcity/models/car-police.glb +0 -0
  158. package/dist/ingest/simcity/models/car-taxi.glb +0 -0
  159. package/dist/ingest/simcity/models/car-tow-truck.glb +0 -0
  160. package/dist/ingest/simcity/models/car-truck-dump.glb +0 -0
  161. package/dist/ingest/simcity/models/car-veteran.glb +0 -0
  162. package/dist/ingest/simcity/models/construction-small.glb +0 -0
  163. package/dist/ingest/simcity/models/data-center.glb +0 -0
  164. package/dist/ingest/simcity/models/industry-factory-old.glb +0 -0
  165. package/dist/ingest/simcity/models/industry-factory.glb +0 -0
  166. package/dist/ingest/simcity/models/industry-refinery.glb +0 -0
  167. package/dist/ingest/simcity/models/industry-warehouse.glb +0 -0
  168. package/dist/ingest/simcity/models/power_line_pole_modified.glb +0 -0
  169. package/dist/ingest/simcity/models/tile-plain_grass.glb +0 -0
  170. package/dist/ingest/simcity/models/tile-road-curve.glb +0 -0
  171. package/dist/ingest/simcity/models/tile-road-end.glb +0 -0
  172. package/dist/ingest/simcity/models/tile-road-intersection-t.glb +0 -0
  173. package/dist/ingest/simcity/models/tile-road-intersection.glb +0 -0
  174. package/dist/ingest/simcity/models/tile-road-straight.glb +0 -0
  175. package/dist/ingest/simcity/models/truck.glb +0 -0
  176. package/dist/ingest/simcity/statusIcons/no-power.png +0 -0
  177. package/dist/ingest/simcity/statusIcons/no-road-access.png +0 -0
  178. package/dist/ingest/simcity/textures/base.png +0 -0
  179. package/dist/ingest/simcity/textures/grid.png +0 -0
  180. package/dist/ingest/simcity/textures/specular.png +0 -0
  181. package/dist/ingest/simcity/three-r155.module.js +51466 -0
  182. package/dist/ingest/simcity/vgai.game.json +20 -0
  183. package/dist/ingest/tanks/UPSTREAM.md +69 -0
  184. package/dist/ingest/tanks/index.html +214 -0
  185. package/dist/ingest/tanks/models/pixelTank.fbx +0 -0
  186. package/dist/ingest/tanks/tanks-entry.js +92 -0
  187. package/dist/ingest/tanks/three-r170.module.js +54571 -0
  188. package/dist/ingest/tanks/vgai.game.json +20 -0
  189. package/dist/inputmaps/default.inputmap.json +41 -0
  190. package/dist/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  191. package/dist/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  192. package/dist/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  193. package/dist/scenes/untitled.vscn.json +29 -0
  194. package/dist/textures/waternormals.jpg +0 -0
  195. package/dist-server/packaged.mjs +18155 -0
  196. package/package.json +36 -0
  197. package/server/asset-library-routes.ts +833 -0
  198. package/server/canonical-path.ts +50 -0
  199. package/server/cloud-asset-catalog.ts +101 -0
  200. package/server/dev.ts +350 -0
  201. package/server/editor-server.ts +1537 -0
  202. package/server/editor-sse.ts +73 -0
  203. package/server/game-globals-shadow.ts +58 -0
  204. package/server/local-asset-catalog.ts +163 -0
  205. package/server/packaged.ts +571 -0
  206. package/server/prod.ts +75 -0
  207. package/server/project-optimize-deps-entries.ts +149 -0
  208. package/server/project-view.ts +65 -0
  209. package/server/server-utils.ts +430 -0
  210. package/server/session-registry.ts +93 -0
  211. package/src/EditorContext.tsx +87 -0
  212. package/src/achieved-tier.ts +126 -0
  213. package/src/action-registry.ts +268 -0
  214. package/src/adapter-resolver.ts +1858 -0
  215. package/src/asset-events.ts +100 -0
  216. package/src/authoring/active-adapter.ts +98 -0
  217. package/src/authoring/active-systems.ts +50 -0
  218. package/src/authoring/boundary-authoring-adapter.ts +178 -0
  219. package/src/authoring/composite-authoring-adapter.ts +891 -0
  220. package/src/authoring/design-time-layers.ts +776 -0
  221. package/src/authoring/edit-mode-authoring.ts +643 -0
  222. package/src/authoring/embed-only-adapter.ts +57 -0
  223. package/src/authoring/ephemeral-persistence.ts +26 -0
  224. package/src/authoring/eyedropper-session.ts +69 -0
  225. package/src/authoring/first-party-hierarchy-menu.ts +74 -0
  226. package/src/authoring/first-party-inspector/AddSectionMenu.tsx +118 -0
  227. package/src/authoring/first-party-inspector/EnvironmentSection.tsx +550 -0
  228. package/src/authoring/first-party-inspector/HeaderSection.tsx +329 -0
  229. package/src/authoring/first-party-inspector/is-first-party-selection.ts +44 -0
  230. package/src/authoring/first-party-inspector/register.tsx +108 -0
  231. package/src/authoring/ingest-authoring-adapter.ts +475 -0
  232. package/src/authoring/ingest-capture.ts +94 -0
  233. package/src/authoring/ingest-game-adapter.ts +291 -0
  234. package/src/authoring/ingest-iframe-adapter.ts +38 -0
  235. package/src/authoring/ingest-iframe-reachable-adapter.ts +401 -0
  236. package/src/authoring/ingest-overlay.ts +193 -0
  237. package/src/authoring/layered-pick.ts +87 -0
  238. package/src/authoring/mount-failure-report.ts +112 -0
  239. package/src/authoring/overlay-report.ts +52 -0
  240. package/src/authoring/project-scenes.ts +111 -0
  241. package/src/authoring/react-dom-authoring-adapter.ts +795 -0
  242. package/src/authoring/react-inspector-section.tsx +1041 -0
  243. package/src/authoring/react-world-authoring-adapter.ts +2400 -0
  244. package/src/authoring/root-activation.ts +61 -0
  245. package/src/authoring/scene-ui-layer.ts +485 -0
  246. package/src/authoring/story-overlay.ts +48 -0
  247. package/src/authoring/ui-authoring-adapter.ts +325 -0
  248. package/src/authoring/ui-hierarchy-menu.ts +40 -0
  249. package/src/authoring/ui-inspector-sections.tsx +156 -0
  250. package/src/authoring/undo-timeline.ts +145 -0
  251. package/src/authoring/vgai-scene-authoring-adapter.ts +746 -0
  252. package/src/authoring/viewport-pick-context.ts +31 -0
  253. package/src/authoring/viewport-raycast.ts +80 -0
  254. package/src/authoring/world-overlay.ts +76 -0
  255. package/src/authoring/world-pan-state.ts +115 -0
  256. package/src/authoring/world-session-state.ts +102 -0
  257. package/src/authoring/world2d-authoring-adapter.ts +313 -0
  258. package/src/browser-external-watch.ts +98 -0
  259. package/src/browser-play-entry.ts +112 -0
  260. package/src/browser-project-scripts.ts +112 -0
  261. package/src/browser-transpile.ts +246 -0
  262. package/src/browser-watch-reload.ts +100 -0
  263. package/src/command-listener.ts +326 -0
  264. package/src/components/AlignToolbar.tsx +189 -0
  265. package/src/components/AppRoot.tsx +73 -0
  266. package/src/components/AssetBrowser.tsx +502 -0
  267. package/src/components/BottomPanel.tsx +326 -0
  268. package/src/components/BuildPanel.tsx +455 -0
  269. package/src/components/CameraInfo.tsx +56 -0
  270. package/src/components/CommandPalette.tsx +265 -0
  271. package/src/components/ConsolePanel.tsx +272 -0
  272. package/src/components/DataPanel.tsx +1268 -0
  273. package/src/components/DefaultEditorLayout.tsx +509 -0
  274. package/src/components/FolderTree.tsx +179 -0
  275. package/src/components/GameHierarchy.tsx +1349 -0
  276. package/src/components/Inspector.tsx +671 -0
  277. package/src/components/InspectorToolSection.tsx +74 -0
  278. package/src/components/MountFailureBanner.tsx +110 -0
  279. package/src/components/NetworkSection.tsx +109 -0
  280. package/src/components/OnlineAssetBrowser.tsx +448 -0
  281. package/src/components/OverlayReportBanner.tsx +122 -0
  282. package/src/components/PlayBar.tsx +356 -0
  283. package/src/components/PrefabSaveDialog.tsx +201 -0
  284. package/src/components/ProjectHeader.tsx +174 -0
  285. package/src/components/ProjectScreen.tsx +1004 -0
  286. package/src/components/RightPanel.tsx +166 -0
  287. package/src/components/RootActivateDialog.tsx +105 -0
  288. package/src/components/SaveDialog.tsx +197 -0
  289. package/src/components/SaveStatus.tsx +69 -0
  290. package/src/components/StatsOverlay.tsx +35 -0
  291. package/src/components/ToolHost.tsx +80 -0
  292. package/src/components/Toolbar.tsx +307 -0
  293. package/src/components/ViewportOverlay.tsx +234 -0
  294. package/src/components/ViewportPanel.tsx +369 -0
  295. package/src/components/WorldContextMenu.tsx +257 -0
  296. package/src/components/WorldSelectionOverlay.tsx +2003 -0
  297. package/src/components/WorldTextEditor.tsx +86 -0
  298. package/src/components/asset-viewers/AssetViewer.tsx +38 -0
  299. package/src/components/asset-viewers/AudioViewer.tsx +149 -0
  300. package/src/components/asset-viewers/GenericJsonViewer.tsx +77 -0
  301. package/src/components/asset-viewers/ImageViewer.tsx +65 -0
  302. package/src/components/asset-viewers/InputMapViewer.tsx +206 -0
  303. package/src/components/asset-viewers/ModelViewer.tsx +180 -0
  304. package/src/components/asset-viewers/OnlineAssetDetail.tsx +236 -0
  305. package/src/components/data-csv.ts +301 -0
  306. package/src/components/entity-name-commit.ts +18 -0
  307. package/src/components/inspector-property-grouping.ts +65 -0
  308. package/src/components/inspector-widgets/AlignmentGrid.tsx +188 -0
  309. package/src/components/inspector-widgets/BorderEditor.tsx +305 -0
  310. package/src/components/inspector-widgets/ColorPicker.tsx +548 -0
  311. package/src/components/inspector-widgets/FilterEditor.tsx +108 -0
  312. package/src/components/inspector-widgets/FontPicker.tsx +196 -0
  313. package/src/components/inspector-widgets/GradientEditor.tsx +277 -0
  314. package/src/components/inspector-widgets/ScrubbableInput.tsx +152 -0
  315. package/src/components/inspector-widgets/ShadowEditor.tsx +332 -0
  316. package/src/components/inspector-widgets/color-utils.ts +202 -0
  317. package/src/components/inspector-widgets/gallery-main.tsx +167 -0
  318. package/src/components/inspector-widgets/index.ts +22 -0
  319. package/src/components/inspector-widgets/shared.tsx +135 -0
  320. package/src/components/inspectors/AnimationSection.tsx +143 -0
  321. package/src/components/inspectors/AudioSection.tsx +215 -0
  322. package/src/components/inspectors/BoneAttachmentSection.tsx +82 -0
  323. package/src/components/inspectors/CameraSection.tsx +105 -0
  324. package/src/components/inspectors/ComponentsSection.tsx +358 -0
  325. package/src/components/inspectors/JointsSection.tsx +255 -0
  326. package/src/components/inspectors/LightSection.tsx +116 -0
  327. package/src/components/inspectors/MaterialSection.tsx +1189 -0
  328. package/src/components/inspectors/MeshSection.tsx +99 -0
  329. package/src/components/inspectors/NavigationSection.tsx +58 -0
  330. package/src/components/inspectors/ParticleSection.tsx +681 -0
  331. package/src/components/inspectors/PhysicsSection.tsx +326 -0
  332. package/src/components/inspectors/PostProcessingSection.tsx +1290 -0
  333. package/src/components/inspectors/RenderingSection.tsx +109 -0
  334. package/src/components/inspectors/ShadowSection.tsx +84 -0
  335. package/src/components/inspectors/SplineSection.tsx +191 -0
  336. package/src/components/inspectors/TransformSection.tsx +191 -0
  337. package/src/components/inspectors/json-schema-fields.ts +281 -0
  338. package/src/components/inspectors/multi-edit-utils.ts +49 -0
  339. package/src/components/inspectors/zod-fields.ts +184 -0
  340. package/src/components/primitives/ColorInput.tsx +109 -0
  341. package/src/components/primitives/JsonInput.tsx +98 -0
  342. package/src/components/primitives/NumberInput.tsx +164 -0
  343. package/src/components/primitives/Panel.tsx +68 -0
  344. package/src/components/primitives/SectionHeader.tsx +45 -0
  345. package/src/components/primitives/Tooltip.tsx +82 -0
  346. package/src/components/primitives/Vec3Input.tsx +62 -0
  347. package/src/components/world-overlay-gestures.ts +1438 -0
  348. package/src/doctor/data-checks.ts +285 -0
  349. package/src/doctor/report.ts +386 -0
  350. package/src/editor-api.ts +700 -0
  351. package/src/editor-console.ts +194 -0
  352. package/src/editor-hotkeys.ts +441 -0
  353. package/src/editor-layers.ts +2 -0
  354. package/src/editor-mode.ts +28 -0
  355. package/src/editor-store.ts +2225 -0
  356. package/src/editor-viewport.ts +1924 -0
  357. package/src/entity-factory.ts +221 -0
  358. package/src/game-globals-prelude.ts +27 -0
  359. package/src/gated-globals.ts +131 -0
  360. package/src/generated/setup-by-example.generated.ts +53 -0
  361. package/src/gizmo-registry.ts +608 -0
  362. package/src/handle-system.ts +221 -0
  363. package/src/hierarchy-menu-registry.ts +70 -0
  364. package/src/hierarchy-rows.ts +73 -0
  365. package/src/hosted-example.ts +160 -0
  366. package/src/hotkeys.ts +142 -0
  367. package/src/ingest/discovery-react.ts +132 -0
  368. package/src/ingest/discovery.ts +205 -0
  369. package/src/ingest/discovery2d.ts +204 -0
  370. package/src/ingest/esm-entry-resolution.ts +102 -0
  371. package/src/ingest/games/bloom-composer/game.js +99 -0
  372. package/src/ingest/games/bloom-composer/vgai.game.json +21 -0
  373. package/src/ingest/games/embed-bundle/embed.html +10 -0
  374. package/src/ingest/games/embed-bundle/vgai.game.json +21 -0
  375. package/src/ingest/games/games-fps/assets/collision-world.glb +0 -0
  376. package/src/ingest/games/games-fps/game.js +479 -0
  377. package/src/ingest/games/games-fps/vgai.game.json +24 -0
  378. package/src/ingest/games/iframe-reachable/game-source.js +58 -0
  379. package/src/ingest/games/iframe-reachable/vgai.game.json +21 -0
  380. package/src/ingest/games/interactive-cubes/game.js +139 -0
  381. package/src/ingest/games/interactive-cubes/vgai.game.json +21 -0
  382. package/src/ingest/games/mismatched-three/fake-three.js +38 -0
  383. package/src/ingest/games/mismatched-three/game.js +10 -0
  384. package/src/ingest/games/mismatched-three/vgai.game.json +22 -0
  385. package/src/ingest/games/own-three-bundled/game.js +43 -0
  386. package/src/ingest/games/own-three-bundled/vgai.game.json +21 -0
  387. package/src/ingest/games/pointerlock-maze/game.js +288 -0
  388. package/src/ingest/games/pointerlock-maze/vgai.game.json +22 -0
  389. package/src/ingest/games-2d/_fixtures/first-party-scene.scn2d.json +124 -0
  390. package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +25 -0
  391. package/src/ingest/games-2d/bunnymark/game.ts +88 -0
  392. package/src/ingest/games-2d/bunnymark/vgai.game.json +21 -0
  393. package/src/ingest/games-2d/flappy/game.ts +148 -0
  394. package/src/ingest/games-2d/flappy/vgai.game.json +21 -0
  395. package/src/ingest/games-2d/flappy-pixi/vgai.game.json +25 -0
  396. package/src/ingest/games-2d/puzzling-potions/vgai.game.json +25 -0
  397. package/src/ingest/games-2d/tilemap-camera/game.ts +115 -0
  398. package/src/ingest/games-2d/tilemap-camera/vgai.game.json +21 -0
  399. package/src/ingest/games-react/react-rpg/entry.tsx +185 -0
  400. package/src/ingest/games-react/react-rpg/shims.d.ts +26 -0
  401. package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +129 -0
  402. package/src/ingest/games-react/react-rpg/vgai.game.json +21 -0
  403. package/src/ingest/host-namespace-registry.ts +196 -0
  404. package/src/ingest/types.ts +127 -0
  405. package/src/ingest-hierarchy-rows.ts +207 -0
  406. package/src/ingest-mode.ts +2092 -0
  407. package/src/ingest-siblings.ts +466 -0
  408. package/src/initial-scene.ts +194 -0
  409. package/src/inspector-section-registry.ts +117 -0
  410. package/src/interactive-edit-scope.ts +34 -0
  411. package/src/main.tsx +23 -0
  412. package/src/manifest-project.ts +43 -0
  413. package/src/model-thumbnail.ts +156 -0
  414. package/src/module-mode.ts +513 -0
  415. package/src/navmesh-handler.ts +94 -0
  416. package/src/packaged-runtime.ts +49 -0
  417. package/src/play-mode.ts +1148 -0
  418. package/src/playground/main.ts +206 -0
  419. package/src/project-manager.ts +173 -0
  420. package/src/scene-diff.ts +112 -0
  421. package/src/scene-serializer.ts +144 -0
  422. package/src/scene-sync.ts +587 -0
  423. package/src/scene-ui-mode/active-scene-ui.ts +58 -0
  424. package/src/scene-ui-mode/scene-ui-palette-panel.tsx +152 -0
  425. package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +29 -0
  426. package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +74 -0
  427. package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +49 -0
  428. package/src/scene-ui-mode/ui-prefab-io.ts +76 -0
  429. package/src/script-loader.ts +143 -0
  430. package/src/storage/fsa-storage.ts +55 -0
  431. package/src/storage/handle-storage.ts +150 -0
  432. package/src/storage/handle-store.ts +116 -0
  433. package/src/storage/http-storage.ts +137 -0
  434. package/src/storage/index.ts +147 -0
  435. package/src/storage/mem-storage.ts +135 -0
  436. package/src/storage/opfs-storage.ts +25 -0
  437. package/src/storage/paths.ts +26 -0
  438. package/src/storage/seed.ts +106 -0
  439. package/src/storage/types.ts +110 -0
  440. package/src/tool-loader.ts +291 -0
  441. package/src/ui-editor/inspector.tsx +563 -0
  442. package/src/ui-editor/node-ops.ts +266 -0
  443. package/src/ui-editor/overlay.tsx +380 -0
  444. package/src/ui-editor/palette.tsx +114 -0
  445. package/src/ui-editor/react-store.ts +78 -0
  446. package/src/ui-editor/timeline-panel.tsx +443 -0
  447. package/src/ui-editor/ui-edit-store.ts +552 -0
  448. package/src/ui-editor/ui-prefab.ts +95 -0
  449. package/src/ui-source/inspect.ts +544 -0
  450. package/src/ui-source/oid-transform.ts +133 -0
  451. package/src/ui-source/source-write-backend.ts +203 -0
  452. package/src/ui-source/tailwind-map.ts +174 -0
  453. package/src/ui-source/writer.ts +1175 -0
  454. package/src/widgets/index.ts +73 -0
  455. package/template/.claude/skills/editor/SKILL.md +252 -0
  456. package/template/CLAUDE.md +512 -0
  457. package/template/LICENSE +30 -0
  458. package/template/emit-schemas.ts +42 -0
  459. package/template/index.html +17 -0
  460. package/template/package.json +53 -0
  461. package/template/project.json +9 -0
  462. package/template/public/audio/ambient-arena.wav +0 -0
  463. package/template/public/audio/ambient-music.wav +0 -0
  464. package/template/public/audio/ambient-nature.wav +0 -0
  465. package/template/public/audio/ambient-wind.wav +0 -0
  466. package/template/public/inputmaps/default.inputmap.json +41 -0
  467. package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  468. package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  469. package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  470. package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  471. package/template/public/scenes/default.vscn.json +43 -0
  472. package/template/public/scenes/untitled.vscn.json +29 -0
  473. package/template/public/textures/waternormals.jpg +0 -0
  474. package/template/server/colyseus-setup.ts +85 -0
  475. package/template/server/main.ts +34 -0
  476. package/template/server/rooms/arena-room.ts +420 -0
  477. package/template/server/rooms/game-room.ts +162 -0
  478. package/template/server/rooms.ts +15 -0
  479. package/template/server/tsconfig.json +19 -0
  480. package/template/src/data/README.md +40 -0
  481. package/template/src/data/assets.ts +31 -0
  482. package/template/src/data/tuning.data.json +5 -0
  483. package/template/src/data/tuning.schema.json +21 -0
  484. package/template/src/data/tuning.schema.ts +34 -0
  485. package/template/src/data/tuning.ts +24 -0
  486. package/template/src/main.ts +157 -0
  487. package/template/src/scripts/components/data-spinner.ts +45 -0
  488. package/template/src/scripts/components/scene-camera.ts +40 -0
  489. package/template/src/scripts/main.ts +94 -0
  490. package/template/src/scripts/registry.ts +46 -0
  491. package/template/src/tools/README.md +14 -0
  492. package/template/src/tools/example.tool.tsx +91 -0
  493. package/template/src/tools/spin.tool.tsx +101 -0
  494. package/template/src/ui/Button.tsx +27 -0
  495. package/template/src/ui/DefaultHud.tsx +40 -0
  496. package/template/src/ui/KeyHint.tsx +25 -0
  497. package/template/src/ui/Panel.tsx +52 -0
  498. package/template/src/ui/RebindPanel.tsx +129 -0
  499. package/template/src/ui/Slider.tsx +28 -0
  500. package/template/src/ui/StatusDot.tsx +22 -0
  501. package/template/src/ui/Toggle.tsx +19 -0
  502. package/template/src/ui/game-state.tsx +37 -0
  503. package/template/src/ui/index.ts +7 -0
  504. package/template/src/ui/mount-default-hud.tsx +19 -0
  505. package/template/src/ui/mount-ui.ts +15 -0
  506. package/template/tsconfig.json +36 -0
  507. package/template/validate-asset-content.ts +78 -0
  508. package/template/validate-manifest.ts +55 -0
  509. package/template/validate-scenes.ts +211 -0
  510. package/template/vgai.game.json +21 -0
  511. package/template/vite.config.ts +128 -0
  512. package/vite-plugin-example-assets.ts +60 -0
  513. package/vite-plugin-game-globals.ts +46 -0
  514. package/vite-plugin-game-static.ts +71 -0
  515. package/vite-plugin-project-game-static.ts +84 -0
  516. package/vite-plugin-react-game-static.ts +98 -0
  517. package/vite-plugin-react-world-provider.ts +81 -0
  518. package/vite-plugin-react-world-runtime.ts +76 -0
  519. package/vite-plugin-ui-oid.ts +561 -0
@@ -0,0 +1,124 @@
1
+ {
2
+ "version": 1,
3
+ "surface": "world2d",
4
+ "gravity": [0, 1400],
5
+ "background": "#10101a",
6
+ "entities": [
7
+ {
8
+ "name": "floor",
9
+ "transform2d": { "position": [400, 560] },
10
+ "sprite": { "tint": "#3a3a5a", "width": 760, "height": 40 },
11
+ "physics2d": {
12
+ "bodyType": "fixed",
13
+ "collider": { "shape": "cuboid", "halfExtents": [380, 20] }
14
+ }
15
+ },
16
+ {
17
+ "name": "left-wall",
18
+ "transform2d": { "position": [30, 300] },
19
+ "sprite": { "tint": "#3a3a5a", "width": 40, "height": 560 },
20
+ "physics2d": {
21
+ "bodyType": "fixed",
22
+ "collider": { "shape": "cuboid", "halfExtents": [20, 280] }
23
+ }
24
+ },
25
+ {
26
+ "name": "right-wall",
27
+ "transform2d": { "position": [770, 300] },
28
+ "sprite": { "tint": "#3a3a5a", "width": 40, "height": 560 },
29
+ "physics2d": {
30
+ "bodyType": "fixed",
31
+ "collider": { "shape": "cuboid", "halfExtents": [20, 280] }
32
+ }
33
+ },
34
+ {
35
+ "name": "box-0",
36
+ "transform2d": { "position": [200, 80] },
37
+ "sprite": { "tint": "#ff6b6b", "width": 44, "height": 44 },
38
+ "physics2d": {
39
+ "bodyType": "dynamic",
40
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
41
+ "restitution": 0.4,
42
+ "friction": 0.6
43
+ }
44
+ },
45
+ {
46
+ "name": "box-1",
47
+ "transform2d": { "position": [270, 130] },
48
+ "sprite": { "tint": "#4ecdc4", "width": 44, "height": 44 },
49
+ "physics2d": {
50
+ "bodyType": "dynamic",
51
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
52
+ "restitution": 0.4,
53
+ "friction": 0.6
54
+ }
55
+ },
56
+ {
57
+ "name": "box-2",
58
+ "transform2d": { "position": [340, 180] },
59
+ "sprite": { "tint": "#ffd23f", "width": 44, "height": 44 },
60
+ "physics2d": {
61
+ "bodyType": "dynamic",
62
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
63
+ "restitution": 0.4,
64
+ "friction": 0.6
65
+ }
66
+ },
67
+ {
68
+ "name": "box-3",
69
+ "transform2d": { "position": [410, 80] },
70
+ "sprite": { "tint": "#a06bff", "width": 44, "height": 44 },
71
+ "physics2d": {
72
+ "bodyType": "dynamic",
73
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
74
+ "restitution": 0.4,
75
+ "friction": 0.6
76
+ }
77
+ },
78
+ {
79
+ "name": "box-4",
80
+ "transform2d": { "position": [480, 130] },
81
+ "sprite": { "tint": "#6bff95", "width": 44, "height": 44 },
82
+ "physics2d": {
83
+ "bodyType": "dynamic",
84
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
85
+ "restitution": 0.4,
86
+ "friction": 0.6
87
+ }
88
+ },
89
+ {
90
+ "name": "box-5",
91
+ "transform2d": { "position": [550, 180] },
92
+ "sprite": { "tint": "#ff9f6b", "width": 44, "height": 44 },
93
+ "physics2d": {
94
+ "bodyType": "dynamic",
95
+ "collider": { "shape": "cuboid", "halfExtents": [22, 22] },
96
+ "restitution": 0.4,
97
+ "friction": 0.6
98
+ }
99
+ },
100
+ {
101
+ "name": "player",
102
+ "transform2d": { "position": [120, 480] },
103
+ "sprite": { "tint": "#00d2ff", "width": 36, "height": 48 },
104
+ "physics2d": {
105
+ "bodyType": "dynamic",
106
+ "collider": { "shape": "cuboid", "halfExtents": [18, 24] },
107
+ "lockRotations": true,
108
+ "friction": 0.0
109
+ },
110
+ "components": { "PlayerController2D": { "speed": 260, "jump": 620 } }
111
+ },
112
+ {
113
+ "name": "coin",
114
+ "transform2d": { "position": [650, 500] },
115
+ "sprite": { "tint": "#ffd23f", "width": 26, "height": 26 },
116
+ "physics2d": {
117
+ "bodyType": "fixed",
118
+ "sensor": true,
119
+ "collider": { "shape": "ball", "radius": 16 }
120
+ },
121
+ "components": { "Coin2D": {} }
122
+ }
123
+ ]
124
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Bubbo Bubbo (real OSS game)",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "bubbo-bubbo",
11
+ "kind": "pixijs",
12
+ "description": "REAL unmodified OSS PixiJS game — pixijs/open-games Bubbo Bubbo, vendored byte-for-byte under vendor/pixi-games/bubbo-bubbo (MIT) and mounted via the iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-bubbo.sh first.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "iframe-reachable",
16
+ "bundleUrl": "/pixi-game-static/bubbo-bubbo/bubbo-bubbo.mjs",
17
+ "baseHref": "/pixi-game-static/bubbo-bubbo/",
18
+ "assetBaseUrl": "/pixi-game-static/bubbo-bubbo/assets",
19
+ "extraDeps": ["@pixi/sound", "@pixi/ui", "gsap"],
20
+ "captureTimeoutMs": 30000
21
+ }
22
+ }
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Bunnymark — the canonical PixiJS sprite-batching stress test, asset-light.
3
+ *
4
+ * UNMODIFIED-style PixiJS v8 program: owns its Application + ticker + canvas. The
5
+ * vgai world2d ingest trap captures its `stage` on the first rendered frame with
6
+ * ZERO edits to this file. Exercises: mass sprite rendering + automatic batching,
7
+ * ticker-driven animation.
8
+ *
9
+ * Moved from the retired world2d silo (`world2d-demo/games/bunnymark.ts`, T6.1
10
+ * slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
11
+ * (T3.3 discovery convention: this folder's `vgai.game.json` + this module,
12
+ * `entry: "game.ts"`). Runs TOP-LEVEL on import (not an exported `load()`) to
13
+ * match the in-tree three.js ingest fixtures' convention
14
+ * (`ingest/games/*\/game.js`) — `resolveIngest2DDescriptor`'s `load` thunk is a
15
+ * plain `() => import(modulePath)`, same as the three-side `resolveIngestDescriptor`.
16
+ */
17
+ import { Application, Container, Graphics, Sprite } from 'pixi.js';
18
+
19
+ function container(): HTMLElement {
20
+ return (
21
+ (globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
22
+ );
23
+ }
24
+
25
+ void load();
26
+
27
+ async function load(): Promise<void> {
28
+ const app = new Application();
29
+ await app.init({ width: 800, height: 600, background: '#1a1a2e', antialias: false });
30
+ container().appendChild(app.canvas);
31
+
32
+ // Build a small bunny texture from a Graphics (no external asset needed).
33
+ const g = new Graphics()
34
+ .roundRect(0, 0, 26, 32, 6)
35
+ .fill('#ffd166')
36
+ .circle(8, 10, 3)
37
+ .fill('#222')
38
+ .circle(18, 10, 3)
39
+ .fill('#222');
40
+ const tex = app.renderer.generateTexture(g);
41
+
42
+ const bunnies: Array<{ s: Sprite; vx: number; vy: number }> = [];
43
+ const layer = new Container();
44
+ app.stage.addChild(layer);
45
+
46
+ const W = 800;
47
+ const H = 600;
48
+ const gravity = 0.5;
49
+ let seed = 12345;
50
+ const rand = () => {
51
+ seed = (seed * 1103515245 + 12345) & 0x7fffffff;
52
+ return seed / 0x7fffffff;
53
+ };
54
+
55
+ function addBunny(): void {
56
+ const s = new Sprite(tex);
57
+ s.anchor.set(0.5);
58
+ s.x = W / 2;
59
+ s.y = 0;
60
+ s.tint = (rand() * 0xffffff) | 0;
61
+ layer.addChild(s);
62
+ bunnies.push({ s, vx: (rand() - 0.5) * 12, vy: rand() * 6 });
63
+ }
64
+ for (let i = 0; i < 250; i++) addBunny();
65
+
66
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game loop (this is an unmodified-style example game; the engine never edits it)
67
+ app.ticker.add(() => {
68
+ if (bunnies.length < 1500) for (let i = 0; i < 4; i++) addBunny();
69
+ for (const b of bunnies) {
70
+ b.s.x += b.vx;
71
+ b.s.y += b.vy;
72
+ b.vy += gravity;
73
+ if (b.s.x > W) {
74
+ b.s.x = W;
75
+ b.vx = -b.vx;
76
+ } else if (b.s.x < 0) {
77
+ b.s.x = 0;
78
+ b.vx = -b.vx;
79
+ }
80
+ if (b.s.y > H) {
81
+ b.s.y = H;
82
+ b.vy = -b.vy * 0.85;
83
+ }
84
+ }
85
+ });
86
+
87
+ (globalThis as { __bunnymark?: unknown }).__bunnymark = { app, count: () => bunnies.length };
88
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Bunnymark",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "bunnymark",
11
+ "kind": "pixijs",
12
+ "description": "Canonical PixiJS sprite-batching stress test — thousands of bouncing sprites.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "shared"
16
+ }
17
+ },
18
+ "entry": "game.ts"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Flappy Bird — canonical PixiJS mini-game, asset-light.
3
+ *
4
+ * UNMODIFIED-style PixiJS v8 program: owns its Application + ticker + canvas, and
5
+ * its own gravity/physics + AABB collision + scrolling + score. The vgai world2d
6
+ * ingest trap captures its `stage` with ZERO edits. Exercises: animated sprite
7
+ * (wing flap), keyboard + pointer input, custom 2D physics, AABB collision,
8
+ * scrolling parallax, score HUD, lose state.
9
+ *
10
+ * Moved from the retired world2d silo (`world2d-demo/games/flappy.ts`, T6.1
11
+ * slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
12
+ * (T3.3 discovery convention). Runs top-level on import — see bunnymark's
13
+ * game.ts doc comment for why (matches the in-tree three.js ingest fixtures'
14
+ * convention).
15
+ */
16
+ import { Application, Container, Graphics, Text } from 'pixi.js';
17
+
18
+ function container(): HTMLElement {
19
+ return (
20
+ (globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
21
+ );
22
+ }
23
+
24
+ void load();
25
+
26
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game (unmodified-style example game; the engine never edits it)
27
+ async function load(): Promise<void> {
28
+ const app = new Application();
29
+ await app.init({ width: 480, height: 640, background: '#4ec0ca', antialias: true });
30
+ container().appendChild(app.canvas);
31
+
32
+ const W = 480;
33
+ const H = 640;
34
+ const world = new Container();
35
+ app.stage.addChild(world);
36
+
37
+ // Bird (a flapping body — a rounded rect + wing whose scale animates).
38
+ const bird = new Container();
39
+ const body = new Graphics()
40
+ .roundRect(-14, -12, 28, 24, 8)
41
+ .fill('#ffd23f')
42
+ .stroke({ width: 2, color: '#c98a00' });
43
+ const wing = new Graphics().ellipse(-2, 2, 9, 6).fill('#fff3b0');
44
+ bird.addChild(body, wing);
45
+ bird.x = W * 0.3;
46
+ bird.y = H * 0.5;
47
+ world.addChild(bird);
48
+
49
+ // Pipes.
50
+ const pipes: Array<{ top: Graphics; bot: Graphics; x: number; scored: boolean }> = [];
51
+ const GAP = 170;
52
+ const PIPE_W = 64;
53
+ let seed = 7;
54
+ const rand = () => {
55
+ seed = (seed * 1103515245 + 12345) & 0x7fffffff;
56
+ return seed / 0x7fffffff;
57
+ };
58
+ function spawnPipe(x: number): void {
59
+ const gapY = 120 + rand() * (H - 240 - GAP);
60
+ const top = new Graphics()
61
+ .rect(0, 0, PIPE_W, gapY)
62
+ .fill('#5dbb46')
63
+ .stroke({ width: 3, color: '#3f8a30' });
64
+ const bot = new Graphics()
65
+ .rect(0, 0, PIPE_W, H - gapY - GAP)
66
+ .fill('#5dbb46')
67
+ .stroke({ width: 3, color: '#3f8a30' });
68
+ top.x = x;
69
+ top.y = 0;
70
+ bot.x = x;
71
+ bot.y = gapY + GAP;
72
+ world.addChild(top, bot);
73
+ pipes.push({ top, bot, x, scored: false });
74
+ }
75
+ for (let i = 0; i < 4; i++) spawnPipe(W + i * 220);
76
+
77
+ const hud = new Text({
78
+ text: 'Score: 0',
79
+ style: { fontSize: 28, fill: '#fff', fontWeight: 'bold' },
80
+ });
81
+ hud.x = 16;
82
+ hud.y = 16;
83
+ app.stage.addChild(hud);
84
+
85
+ let vy = 0;
86
+ let score = 0;
87
+ let dead = false;
88
+ let t = 0;
89
+ const GRAV = 0.5;
90
+ const FLAP = -8.5;
91
+
92
+ function flap(): void {
93
+ if (dead) {
94
+ // reset
95
+ bird.y = H * 0.5;
96
+ vy = 0;
97
+ score = 0;
98
+ dead = false;
99
+ for (let i = 0; i < pipes.length; i++) pipes[i]!.x = W + i * 220;
100
+ return;
101
+ }
102
+ vy = FLAP;
103
+ }
104
+ window.addEventListener('keydown', (e) => {
105
+ if (e.code === 'Space' || e.code === 'ArrowUp') flap();
106
+ });
107
+ app.canvas.addEventListener('pointerdown', flap);
108
+
109
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: a self-contained game loop (unmodified-style example game; the engine never edits it)
110
+ app.ticker.add((ticker) => {
111
+ const dt = ticker.deltaTime;
112
+ t += dt;
113
+ wing.scale.y = 0.6 + Math.abs(Math.sin(t * 0.3)) * 0.8; // flap animation
114
+ if (dead) return;
115
+
116
+ vy += GRAV * dt;
117
+ bird.y += vy * dt;
118
+ bird.rotation = Math.max(-0.5, Math.min(1.2, vy * 0.05));
119
+
120
+ for (const p of pipes) {
121
+ p.x -= 2.2 * dt;
122
+ p.top.x = p.x;
123
+ p.bot.x = p.x;
124
+ if (p.x + PIPE_W < 0) {
125
+ p.x += pipes.length * 220;
126
+ p.scored = false;
127
+ }
128
+ if (!p.scored && p.x + PIPE_W < bird.x) {
129
+ p.scored = true;
130
+ score++;
131
+ hud.text = `Score: ${score}`;
132
+ }
133
+ // AABB collision: bird box vs pipe rects.
134
+ const bx = bird.x - 14;
135
+ const by = bird.y - 12;
136
+ const overlapX = bx + 28 > p.x && bx < p.x + PIPE_W;
137
+ if (overlapX) {
138
+ const topH = p.top.height;
139
+ const botY = p.bot.y;
140
+ if (by < topH || by + 24 > botY) dead = true;
141
+ }
142
+ }
143
+ if (bird.y > H - 12 || bird.y < 0) dead = true;
144
+ if (dead) hud.text = `Score: ${score} — tap to retry`;
145
+ });
146
+
147
+ (globalThis as { __flappy?: unknown }).__flappy = { app, score: () => score };
148
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Flappy Bird",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "flappy",
11
+ "kind": "pixijs",
12
+ "description": "Gravity/physics, keyboard + pointer input, AABB collision, scrolling, score HUD.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "shared"
16
+ }
17
+ },
18
+ "entry": "game.ts"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Flappy Pixi (real OSS game, pixi v6)",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "flappy-pixi",
11
+ "kind": "pixijs",
12
+ "description": "REAL unmodified OSS PixiJS game — aliexme's Flappy Pixi, vendored byte-for-byte under vendor/pixi-games/flappy-pixi (MIT). Pixi v6 on the v8 host via version-skew (D-P2): pixiModuleUrl's PRESENCE swaps the trapped instance to a served standalone pixi@6.5.10 build. Assets are inlined in the bundle. Requires the gitignored bundles: run vendor/pixi-games/_host/build-flappy-pixi.sh first.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "iframe-reachable",
16
+ "bundleUrl": "/pixi-game-static/flappy-pixi/flappy-pixi.mjs",
17
+ "baseHref": "/pixi-game-static/flappy-pixi/",
18
+ "pixiModuleUrl": "/pixi-game-static/pixi6/pixi6.mjs",
19
+ "bodyHtml": "<style>html,body{margin:0;height:100%}#game-root{width:100%;height:100%}</style><div id=\"game-root\"></div>",
20
+ "captureTimeoutMs": 30000
21
+ }
22
+ }
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Puzzling Potions (real OSS game)",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "puzzling-potions",
11
+ "kind": "pixijs",
12
+ "description": "REAL unmodified OSS PixiJS game — pixijs/open-games Puzzling Potions (match-3 with Spine animations; spine-pixi-v8 pinned exactly 4.2.95 — see host-namespace-registry.ts), vendored byte-for-byte under vendor/pixi-games/puzzling-potions (MIT), iframe-reachable-multi route (Track P). Requires the gitignored externalized bundle: run vendor/pixi-games/_host/build-puzzling-potions.sh first.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "iframe-reachable",
16
+ "bundleUrl": "/pixi-game-static/puzzling-potions/puzzling-potions.mjs",
17
+ "baseHref": "/pixi-game-static/puzzling-potions/",
18
+ "assetBaseUrl": "/pixi-game-static/puzzling-potions/assets",
19
+ "extraDeps": ["@pixi/sound", "@pixi/ui", "gsap", "@esotericsoftware/spine-pixi-v8"],
20
+ "captureTimeoutMs": 30000
21
+ }
22
+ }
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Tilemap + camera-follow — canonical PixiJS tilemap demo, asset-light.
3
+ *
4
+ * UNMODIFIED-style PixiJS v8 program using the REAL `@pixi/tilemap` CompositeTilemap
5
+ * to render a large tile grid, with a keyboard-driven player and a camera that
6
+ * follows by transforming the world Container (the spec's plain-Container 2D camera;
7
+ * pixi-viewport is the alternative). The vgai world2d ingest trap captures its stage
8
+ * with ZERO edits. Exercises: tilemap rendering (batched), spritesheet-style tileset,
9
+ * keyboard input, camera follow. Fills the tilemap + camera-follow feature-matrix cells.
10
+ *
11
+ * Moved from the retired world2d silo (`world2d-demo/games/tilemap-camera.ts`,
12
+ * T6.1 slice 4, docs/MULTI-WORLD-DESIGN.md §1.H) to a per-folder ingest fixture
13
+ * (T3.3 discovery convention). Runs top-level on import — see bunnymark's
14
+ * game.ts doc comment for why.
15
+ */
16
+
17
+ import { CompositeTilemap } from '@pixi/tilemap';
18
+ import { Application, Container, Graphics, Texture } from 'pixi.js';
19
+
20
+ function gameContainer(): HTMLElement {
21
+ return (
22
+ (globalThis as { __world2dGameContainer?: HTMLElement }).__world2dGameContainer ?? document.body
23
+ );
24
+ }
25
+
26
+ /** Generate a TILE x TILE texture for a named tile kind (no external assets). */
27
+ function tileTexture(color: string, accent: string, size: number): Texture {
28
+ const canvas = document.createElement('canvas');
29
+ canvas.width = size;
30
+ canvas.height = size;
31
+ const g = canvas.getContext('2d')!;
32
+ g.fillStyle = color;
33
+ g.fillRect(0, 0, size, size);
34
+ g.fillStyle = accent;
35
+ g.fillRect(2, 2, size - 4, 3);
36
+ g.fillRect(2, size - 5, size - 4, 3);
37
+ return Texture.from(canvas);
38
+ }
39
+
40
+ void load();
41
+
42
+ async function load(): Promise<void> {
43
+ const app = new Application();
44
+ await app.init({ width: 640, height: 480, background: '#0c1a12', antialias: false });
45
+ gameContainer().appendChild(app.canvas);
46
+
47
+ const TILE = 32;
48
+ const COLS = 60;
49
+ const ROWS = 40;
50
+ const world = new Container();
51
+ app.stage.addChild(world);
52
+
53
+ const grass = tileTexture('#3a7d44', '#2f6638', TILE);
54
+ const stone = tileTexture('#6b6b7b', '#54545f', TILE);
55
+ const water = tileTexture('#2f6db0', '#255a93', TILE);
56
+
57
+ // Build the tilemap (CompositeTilemap batches the whole grid into few draw calls).
58
+ const tilemap = new CompositeTilemap();
59
+ world.addChild(tilemap);
60
+ let seed = 99;
61
+ const rand = () => {
62
+ seed = (seed * 1103515245 + 12345) & 0x7fffffff;
63
+ return seed / 0x7fffffff;
64
+ };
65
+ for (let y = 0; y < ROWS; y++) {
66
+ for (let x = 0; x < COLS; x++) {
67
+ const r = rand();
68
+ const tex = r < 0.12 ? water : r < 0.24 ? stone : grass;
69
+ tilemap.tile(tex, x * TILE, y * TILE);
70
+ }
71
+ }
72
+
73
+ // Player.
74
+ const player = new Container();
75
+ player.addChild(
76
+ new Graphics()
77
+ .roundRect(-12, -12, 24, 24, 5)
78
+ .fill('#ffd23f')
79
+ .stroke({ width: 2, color: '#c98a00' }),
80
+ );
81
+ player.x = (COLS * TILE) / 2;
82
+ player.y = (ROWS * TILE) / 2;
83
+ world.addChild(player);
84
+
85
+ const keys: Record<string, boolean> = {};
86
+ window.addEventListener('keydown', (e) => {
87
+ keys[e.code] = true;
88
+ });
89
+ window.addEventListener('keyup', (e) => {
90
+ keys[e.code] = false;
91
+ });
92
+
93
+ app.ticker.add((ticker) => {
94
+ const dt = ticker.deltaTime;
95
+ const sp = 5 * dt;
96
+ if (keys['ArrowLeft'] || keys['KeyA']) player.x -= sp;
97
+ if (keys['ArrowRight'] || keys['KeyD']) player.x += sp;
98
+ if (keys['ArrowUp'] || keys['KeyW']) player.y -= sp;
99
+ if (keys['ArrowDown'] || keys['KeyS']) player.y += sp;
100
+ player.x = Math.max(0, Math.min(COLS * TILE, player.x));
101
+ player.y = Math.max(0, Math.min(ROWS * TILE, player.y));
102
+ // Camera follow: pan the world Container so the player stays centered.
103
+ world.x = app.screen.width / 2 - player.x;
104
+ world.y = app.screen.height / 2 - player.y;
105
+ });
106
+
107
+ (globalThis as { __tilemapCamera?: unknown }).__tilemapCamera = {
108
+ app,
109
+ tiles: COLS * ROWS,
110
+ playerPos: () => ({ x: player.x, y: player.y }),
111
+ press: (code: string, down: boolean) => {
112
+ keys[code] = down;
113
+ },
114
+ };
115
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "manifestVersion": 1,
3
+ "name": "Tilemap + Camera",
4
+ "version": "0.1.0",
5
+ "engine": {
6
+ "version": "0.1.0"
7
+ },
8
+ "worlds": [
9
+ {
10
+ "id": "tilemap-camera",
11
+ "kind": "pixijs",
12
+ "description": "Real @pixi/tilemap CompositeTilemap (60x40 grid) + keyboard player + camera follow.",
13
+ "adapter": {
14
+ "ingest": {
15
+ "strategy": "shared"
16
+ }
17
+ },
18
+ "entry": "game.ts"
19
+ }
20
+ ]
21
+ }