@downdraft/engine 0.0.0 → 0.1.1

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 (908) hide show
  1. package/README.md +33 -0
  2. package/app/src/index.ts +10 -0
  3. package/app/src/renderer/bootstrap.ts +271 -0
  4. package/app/src/renderer/downdraft-base.css +93 -0
  5. package/app/src/renderer/feature-log.ts +200 -0
  6. package/app/src/renderer/game-module.ts +923 -0
  7. package/app/src/renderer/hooks.ts +88 -0
  8. package/app/src/renderer/hot-reload.ts +178 -0
  9. package/app/src/renderer/import-cache.ts +88 -0
  10. package/app/src/renderer/index.ts +206 -0
  11. package/app/src/renderer/mcp-harness.ts +144 -0
  12. package/app/src/renderer/save-store-factory.ts +239 -0
  13. package/app/src/renderer/sim-bridge.ts +183 -0
  14. package/app/src/renderer/standard-automation-tools.ts +771 -0
  15. package/app/src/shared/feature-log.ts +71 -0
  16. package/app/src/shared/gpu-info.ts +82 -0
  17. package/app/src/shared/import-cache-store.ts +142 -0
  18. package/app/src/shared/index.ts +6 -0
  19. package/app/src/shared/mcp-discovery.ts +47 -0
  20. package/app/src/shared/mcp-proxy.ts +82 -0
  21. package/app/src/shared/types.ts +324 -0
  22. package/asset-bake/src/bake-audio.ts +119 -0
  23. package/asset-bake/src/bake-gltf.ts +172 -0
  24. package/asset-bake/src/bake.ts +78 -0
  25. package/asset-bake/src/cache.ts +188 -0
  26. package/asset-bake/src/config.ts +186 -0
  27. package/asset-bake/src/index.ts +36 -0
  28. package/core/src/animation/animation-event.ts +41 -0
  29. package/core/src/animation/bone-mask.ts +122 -0
  30. package/core/src/animation/clip.ts +252 -0
  31. package/core/src/animation/index.ts +22 -0
  32. package/core/src/animation/mixamo.ts +113 -0
  33. package/core/src/animation/morph-target.ts +69 -0
  34. package/core/src/animation/player.ts +697 -0
  35. package/core/src/animation/retarget.ts +158 -0
  36. package/core/src/animation/skeleton-animator.ts +1399 -0
  37. package/core/src/animation/skeleton.ts +214 -0
  38. package/core/src/animation/state-machine.ts +280 -0
  39. package/core/src/assets/blob-store.ts +66 -0
  40. package/core/src/assets/cache.ts +186 -0
  41. package/core/src/assets/cubemap-converter.ts +155 -0
  42. package/core/src/assets/environment-manager.ts +121 -0
  43. package/core/src/assets/import-cache.ts +65 -0
  44. package/core/src/assets/import-settings.ts +72 -0
  45. package/core/src/assets/importer.ts +108 -0
  46. package/core/src/assets/index.ts +74 -0
  47. package/core/src/assets/irradiance-generator.ts +198 -0
  48. package/core/src/assets/loader-audio.ts +86 -0
  49. package/core/src/assets/loader-cubemap.ts +211 -0
  50. package/core/src/assets/loader-dds.ts +236 -0
  51. package/core/src/assets/loader-hdr.ts +474 -0
  52. package/core/src/assets/loader-mesh.ts +143 -0
  53. package/core/src/assets/loader-shader.ts +73 -0
  54. package/core/src/assets/loader-texture.ts +349 -0
  55. package/core/src/assets/lod.ts +198 -0
  56. package/core/src/assets/manager.ts +480 -0
  57. package/core/src/assets/manifest.ts +81 -0
  58. package/core/src/assets/material-bridge.ts +186 -0
  59. package/core/src/assets/model-importer.ts +72 -0
  60. package/core/src/assets/model-normalizer.ts +248 -0
  61. package/core/src/assets/model-to-gpu.ts +70 -0
  62. package/core/src/assets/model-to-mesh.ts +237 -0
  63. package/core/src/assets/prefilter-generator.ts +250 -0
  64. package/core/src/audio/engine.ts +177 -0
  65. package/core/src/audio/interface.ts +130 -0
  66. package/core/src/audio/listener.ts +32 -0
  67. package/core/src/audio/mixer.ts +141 -0
  68. package/core/src/audio/registry.ts +52 -0
  69. package/core/src/audio/sab.ts +87 -0
  70. package/core/src/audio/source.ts +89 -0
  71. package/core/src/change-detection/atomics.ts +1 -0
  72. package/core/src/change-detection/tracker.ts +47 -0
  73. package/core/src/debug-draw/lines.ts +64 -0
  74. package/core/src/debug-draw/points.ts +17 -0
  75. package/core/src/debug-draw/queue.ts +124 -0
  76. package/core/src/debug-draw/text.ts +25 -0
  77. package/core/src/ecs/archetype.ts +323 -0
  78. package/core/src/ecs/component.ts +188 -0
  79. package/core/src/ecs/entity.ts +25 -0
  80. package/core/src/ecs/events.ts +93 -0
  81. package/core/src/ecs/hierarchy.ts +124 -0
  82. package/core/src/ecs/hmr-swap-registry.ts +22 -0
  83. package/core/src/ecs/index.ts +25 -0
  84. package/core/src/ecs/query.ts +141 -0
  85. package/core/src/ecs/resource.ts +8 -0
  86. package/core/src/ecs/schedule.ts +181 -0
  87. package/core/src/ecs/system-params.ts +99 -0
  88. package/core/src/ecs/system.ts +42 -0
  89. package/core/src/ecs/world.ts +348 -0
  90. package/core/src/index.ts +352 -0
  91. package/core/src/input/context.ts +73 -0
  92. package/core/src/input/dom-handler.ts +380 -0
  93. package/core/src/input/local-player-manager.ts +218 -0
  94. package/core/src/input/mapping.ts +40 -0
  95. package/core/src/input/multi-sab-bridge.ts +276 -0
  96. package/core/src/input/multi-state.ts +54 -0
  97. package/core/src/input/sab-bridge.ts +71 -0
  98. package/core/src/input/state.ts +132 -0
  99. package/core/src/input/ui-router.ts +87 -0
  100. package/core/src/library/host.ts +317 -0
  101. package/core/src/library/index.ts +16 -0
  102. package/core/src/library/library.ts +292 -0
  103. package/core/src/material/compiler.ts +80 -0
  104. package/core/src/material/graph-bridge.ts +172 -0
  105. package/core/src/material/index.ts +9 -0
  106. package/core/src/material/library.ts +442 -0
  107. package/core/src/material/material.ts +156 -0
  108. package/core/src/material/variants.ts +61 -0
  109. package/core/src/math/mat4.ts +202 -0
  110. package/core/src/math/perlin-noise-2d.ts +77 -0
  111. package/core/src/math/perlin-noise-3d.ts +110 -0
  112. package/core/src/math/quat.ts +33 -0
  113. package/core/src/math/rng.ts +29 -0
  114. package/core/src/math/trig.ts +47 -0
  115. package/core/src/math/value-noise.ts +67 -0
  116. package/core/src/mesh/builder.ts +177 -0
  117. package/core/src/mesh/csg.ts +312 -0
  118. package/core/src/mesh/greased-line.ts +145 -0
  119. package/core/src/mesh/mesh.ts +17 -0
  120. package/core/src/mesh/parametric.ts +501 -0
  121. package/core/src/mesh/skinning.ts +67 -0
  122. package/core/src/mesh/vertex-layout.ts +91 -0
  123. package/core/src/module/cross-thread.ts +163 -0
  124. package/core/src/module/diagnostics.ts +123 -0
  125. package/core/src/module/host.ts +451 -0
  126. package/core/src/module/index.ts +22 -0
  127. package/core/src/module/module.ts +109 -0
  128. package/core/src/module/registry.ts +94 -0
  129. package/core/src/module/renderer-module.ts +247 -0
  130. package/core/src/module/ts-loader.ts +26 -0
  131. package/core/src/particles/compute-pass.ts +378 -0
  132. package/core/src/particles/emitter.ts +156 -0
  133. package/core/src/particles/index.ts +11 -0
  134. package/core/src/particles/particle-data.ts +47 -0
  135. package/core/src/particles/render-pass.ts +365 -0
  136. package/core/src/particles/simulator.ts +264 -0
  137. package/core/src/particles/system.ts +193 -0
  138. package/core/src/physics/body.ts +59 -0
  139. package/core/src/physics/ccd-heuristic.ts +55 -0
  140. package/core/src/physics/character.ts +282 -0
  141. package/core/src/physics/collider.ts +55 -0
  142. package/core/src/physics/collision-system.ts +91 -0
  143. package/core/src/physics/events.ts +133 -0
  144. package/core/src/physics/index.ts +34 -0
  145. package/core/src/physics/interface.ts +473 -0
  146. package/core/src/physics/interpolation-buffer.ts +192 -0
  147. package/core/src/physics/lifecycle.ts +87 -0
  148. package/core/src/physics/load-shedder.ts +164 -0
  149. package/core/src/physics/physics-accumulator.ts +101 -0
  150. package/core/src/physics/physics-system.ts +240 -0
  151. package/core/src/physics/ragdoll-presets.ts +272 -0
  152. package/core/src/physics/ragdoll-system.ts +220 -0
  153. package/core/src/physics/ragdoll.ts +182 -0
  154. package/core/src/physics/raycast.ts +143 -0
  155. package/core/src/physics/realm-manager.ts +499 -0
  156. package/core/src/physics/realm-worker-pool.ts +191 -0
  157. package/core/src/physics/realm-worker.ts +102 -0
  158. package/core/src/physics/realm.ts +189 -0
  159. package/core/src/physics/registry.ts +52 -0
  160. package/core/src/physics/safety.ts +247 -0
  161. package/core/src/physics/snapshot-manager.ts +141 -0
  162. package/core/src/physics/worker-protocol.ts +30 -0
  163. package/core/src/platform/bun-preload.ts +169 -0
  164. package/core/src/platform/css-stub.ts +4 -0
  165. package/core/src/platform/glob-polyfill.ts +124 -0
  166. package/core/src/platform/hidpi.ts +57 -0
  167. package/core/src/platform/render-surface.ts +77 -0
  168. package/core/src/platform/rpc.ts +98 -0
  169. package/core/src/platform/runtime.ts +132 -0
  170. package/core/src/plugin/context.ts +364 -0
  171. package/core/src/plugin/diagnostics.ts +61 -0
  172. package/core/src/plugin/discovery.ts +186 -0
  173. package/core/src/plugin/extension-loaders.ts +172 -0
  174. package/core/src/plugin/host.ts +659 -0
  175. package/core/src/plugin/index.ts +106 -0
  176. package/core/src/plugin/loader-asset.ts +124 -0
  177. package/core/src/plugin/loader-quickjs.ts +84 -0
  178. package/core/src/plugin/loader-wasm.ts +411 -0
  179. package/core/src/plugin/loader-worker.ts +261 -0
  180. package/core/src/plugin/manifest.ts +653 -0
  181. package/core/src/plugin/material-registry.ts +65 -0
  182. package/core/src/plugin/mcp-tools.ts +165 -0
  183. package/core/src/plugin/permissions.ts +175 -0
  184. package/core/src/plugin/quickjs-bridge.ts +294 -0
  185. package/core/src/plugin/registry.ts +107 -0
  186. package/core/src/plugin/sandbox-shim.ts +86 -0
  187. package/core/src/plugin/sandbox-worker.ts +215 -0
  188. package/core/src/plugin/wasm-abi.ts +152 -0
  189. package/core/src/plugin/wasm-worker.ts +229 -0
  190. package/core/src/plugin/workshop.ts +169 -0
  191. package/core/src/profiling/event-loop.ts +180 -0
  192. package/core/src/profiling/index.ts +69 -0
  193. package/core/src/profiling/iops/idb-patch.ts +242 -0
  194. package/core/src/profiling/iops/opfs-patch.ts +276 -0
  195. package/core/src/profiling/profiling-sab.ts +839 -0
  196. package/core/src/profiling/task-latency.ts +134 -0
  197. package/core/src/profiling/thread-metrics.ts +126 -0
  198. package/core/src/profiling/trace-event-writer.ts +205 -0
  199. package/core/src/profiling/warnings.ts +423 -0
  200. package/core/src/profiling/worker-prelude.ts +376 -0
  201. package/core/src/render/bind-group.ts +38 -0
  202. package/core/src/render/bindless/bindless-struct.ts +42 -0
  203. package/core/src/render/bindless/bindless.wgsl.ts +167 -0
  204. package/core/src/render/bindless/frame-bindings.ts +176 -0
  205. package/core/src/render/bindless/index.ts +10 -0
  206. package/core/src/render/bindless/material-manager.ts +257 -0
  207. package/core/src/render/bindless/texture-registry.ts +609 -0
  208. package/core/src/render/buffer.ts +82 -0
  209. package/core/src/render/camera-2d.ts +217 -0
  210. package/core/src/render/camera-controller.ts +440 -0
  211. package/core/src/render/camera.ts +409 -0
  212. package/core/src/render/canvas-resize-watcher.ts +46 -0
  213. package/core/src/render/compute-kernel.ts +172 -0
  214. package/core/src/render/constants.ts +2 -0
  215. package/core/src/render/device.ts +111 -0
  216. package/core/src/render/frame-graph.ts +768 -0
  217. package/core/src/render/frustum.ts +185 -0
  218. package/core/src/render/fullscreen-vs.ts +25 -0
  219. package/core/src/render/g-buffer.ts +186 -0
  220. package/core/src/render/game-renderer.ts +1452 -0
  221. package/core/src/render/gpu-driven/cull-pass.ts +394 -0
  222. package/core/src/render/gpu-driven/hzb.ts +215 -0
  223. package/core/src/render/gpu-driven/index.ts +7 -0
  224. package/core/src/render/gpu-driven/indirect-draw-pass.ts +324 -0
  225. package/core/src/render/gpu-driven/instance-buffer.ts +178 -0
  226. package/core/src/render/gpu-driven/mesh-table.ts +175 -0
  227. package/core/src/render/gpu-driven/passes/hzb-build-pass.ts +47 -0
  228. package/core/src/render/gpu-utils.ts +96 -0
  229. package/core/src/render/hdr.ts +88 -0
  230. package/core/src/render/hot-reload.ts +295 -0
  231. package/core/src/render/ibl-bind-group.ts +266 -0
  232. package/core/src/render/ibl.ts +180 -0
  233. package/core/src/render/index.ts +163 -0
  234. package/core/src/render/input-manager.ts +259 -0
  235. package/core/src/render/lighting/area-light.ts +196 -0
  236. package/core/src/render/lighting/cluster-grid.ts +288 -0
  237. package/core/src/render/lighting/cluster-types.ts +193 -0
  238. package/core/src/render/lighting/ies-parser.ts +162 -0
  239. package/core/src/render/lighting.ts +454 -0
  240. package/core/src/render/material-types/depth.wgsl +44 -0
  241. package/core/src/render/material-types/line.wgsl +50 -0
  242. package/core/src/render/material-types/matcap.wgsl +51 -0
  243. package/core/src/render/material-types/normal.wgsl +41 -0
  244. package/core/src/render/material-types/physical.wgsl +152 -0
  245. package/core/src/render/material-types/sprite.wgsl +46 -0
  246. package/core/src/render/material-types/sss.wgsl +79 -0
  247. package/core/src/render/material-types/toon.wgsl +79 -0
  248. package/core/src/render/passes/README.md +121 -0
  249. package/core/src/render/passes/atmosphere.ts +152 -0
  250. package/core/src/render/passes/cluster-lighting-pass.ts +476 -0
  251. package/core/src/render/passes/csm.ts +408 -0
  252. package/core/src/render/passes/cubemap-capture.ts +114 -0
  253. package/core/src/render/passes/debug-viz.ts +278 -0
  254. package/core/src/render/passes/debug.ts +538 -0
  255. package/core/src/render/passes/decal-mesh.ts +111 -0
  256. package/core/src/render/passes/decal-pass.ts +377 -0
  257. package/core/src/render/passes/deferred-lighting.ts +434 -0
  258. package/core/src/render/passes/depth-prepass.ts +163 -0
  259. package/core/src/render/passes/dome-360.ts +83 -0
  260. package/core/src/render/passes/fluid-render.ts +137 -0
  261. package/core/src/render/passes/gi-types.ts +118 -0
  262. package/core/src/render/passes/graph-compute.ts +300 -0
  263. package/core/src/render/passes/greased-line-pass.ts +232 -0
  264. package/core/src/render/passes/morph-target.ts +40 -0
  265. package/core/src/render/passes/opaque.ts +1028 -0
  266. package/core/src/render/passes/point-light-shadow.ts +266 -0
  267. package/core/src/render/passes/procedural-texture.ts +185 -0
  268. package/core/src/render/passes/reflection-probe.ts +140 -0
  269. package/core/src/render/passes/rsm-pass.ts +248 -0
  270. package/core/src/render/passes/sdf-text.ts +155 -0
  271. package/core/src/render/passes/shadow-map.ts +163 -0
  272. package/core/src/render/passes/shadow.ts +220 -0
  273. package/core/src/render/passes/skinning-vs.ts +121 -0
  274. package/core/src/render/passes/skinning.ts +326 -0
  275. package/core/src/render/passes/sky-dome.ts +404 -0
  276. package/core/src/render/passes/skybox.ts +162 -0
  277. package/core/src/render/passes/spot-light-shadow.ts +273 -0
  278. package/core/src/render/passes/terrain.ts +326 -0
  279. package/core/src/render/passes/transparent.ts +353 -0
  280. package/core/src/render/passes/underwater-fog.ts +185 -0
  281. package/core/src/render/passes/video-texture.ts +79 -0
  282. package/core/src/render/passes/volumetric-pass.ts +312 -0
  283. package/core/src/render/passes/volumetric-types.ts +171 -0
  284. package/core/src/render/passes/water.ts +753 -0
  285. package/core/src/render/pbr.ts +296 -0
  286. package/core/src/render/pipeline.ts +52 -0
  287. package/core/src/render/render-pass.ts +30 -0
  288. package/core/src/render/renderer-input-bus.ts +220 -0
  289. package/core/src/render/renderer-module-host.ts +623 -0
  290. package/core/src/render/resource-tracker.ts +67 -0
  291. package/core/src/render/sab-canvas-overlay.ts +122 -0
  292. package/core/src/render/shader-validator.ts +200 -0
  293. package/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  294. package/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  295. package/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  296. package/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  297. package/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  298. package/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  299. package/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  300. package/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  301. package/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  302. package/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  303. package/core/src/render/shaders/shadow-chunks.ts +135 -0
  304. package/core/src/render/skybox.ts +146 -0
  305. package/core/src/render/splitscreen.ts +85 -0
  306. package/core/src/render/surface.ts +78 -0
  307. package/core/src/render/tonemap.ts +180 -0
  308. package/core/src/render/tracked-render-pass.ts +158 -0
  309. package/core/src/render/viewport.ts +109 -0
  310. package/core/src/render/wgsl-hmr.ts +70 -0
  311. package/core/src/sab/core-input-channel.ts +23 -0
  312. package/core/src/sab/define.ts +239 -0
  313. package/core/src/sab/errors.ts +76 -0
  314. package/core/src/sab/game-input.ts +343 -0
  315. package/core/src/sab/gamepad-devices.ts +259 -0
  316. package/core/src/sab/grid-buffer.ts +117 -0
  317. package/core/src/sab/input.ts +55 -0
  318. package/core/src/sab/layout.ts +219 -0
  319. package/core/src/sab/multi-input-channel.ts +50 -0
  320. package/core/src/sab/record-buffer.ts +155 -0
  321. package/core/src/sab/sab-polyfill.ts +56 -0
  322. package/core/src/sab/sim-channel.ts +453 -0
  323. package/core/src/sab/slot-buffer.ts +190 -0
  324. package/core/src/sab/types.ts +158 -0
  325. package/core/src/safety/bounds.ts +76 -0
  326. package/core/src/safety/json.ts +80 -0
  327. package/core/src/safety/path.ts +167 -0
  328. package/core/src/save/binary-format.ts +117 -0
  329. package/core/src/save/game-save-system.ts +161 -0
  330. package/core/src/save/grid-save-system.ts +158 -0
  331. package/core/src/save/migrate.ts +44 -0
  332. package/core/src/save/migration-registry.ts +94 -0
  333. package/core/src/save/persist-types.ts +208 -0
  334. package/core/src/save/schema.ts +46 -0
  335. package/core/src/save/serializer.ts +180 -0
  336. package/core/src/scene/builder.ts +65 -0
  337. package/core/src/scene/camera.ts +142 -0
  338. package/core/src/scene/checkpoint.ts +109 -0
  339. package/core/src/scene/game-loop.ts +198 -0
  340. package/core/src/scene/index.ts +24 -0
  341. package/core/src/scene/layer.ts +6 -0
  342. package/core/src/scene/prefab.ts +145 -0
  343. package/core/src/scene/scene-manager.ts +157 -0
  344. package/core/src/scene/scene.ts +192 -0
  345. package/core/src/scene/sky.ts +256 -0
  346. package/core/src/scene/spatial-grid.ts +176 -0
  347. package/core/src/scene/streaming.ts +304 -0
  348. package/core/src/scene/vegetation.ts +163 -0
  349. package/core/src/scene/world.ts +89 -0
  350. package/core/src/scripting/binding.ts +129 -0
  351. package/core/src/scripting/hot-reload.ts +144 -0
  352. package/core/src/scripting/script.ts +99 -0
  353. package/core/src/sim/hot-reload-pipeline.ts +49 -0
  354. package/core/src/sim/sim-state-helper.ts +47 -0
  355. package/core/src/sim/transient-state-registry.ts +77 -0
  356. package/core/src/sim/types.ts +113 -0
  357. package/core/src/sim/worker-loop.ts +222 -0
  358. package/core/src/stores/game-store.ts +158 -0
  359. package/core/src/stores/hot-reload-store.ts +44 -0
  360. package/core/src/telemetry/collector.ts +410 -0
  361. package/core/src/telemetry/gc-controller.ts +453 -0
  362. package/core/src/telemetry/gc-profiler.ts +126 -0
  363. package/core/src/telemetry/gc-tracker.ts +69 -0
  364. package/core/src/telemetry/gpu-profiler.ts +703 -0
  365. package/core/src/telemetry/gpu-resource-tracker.ts +285 -0
  366. package/core/src/telemetry/gpu-timer-pool.ts +234 -0
  367. package/core/src/telemetry/gpu-timer.ts +123 -0
  368. package/core/src/telemetry/gpu-timestamp-gate.ts +21 -0
  369. package/core/src/telemetry/reporter.ts +62 -0
  370. package/core/src/types/engine-types.ts +129 -0
  371. package/core/src/ui-font-scale.ts +112 -0
  372. package/core/src/util/broad-phase-grid.ts +82 -0
  373. package/core/src/util/feature-log.ts +220 -0
  374. package/core/src/util/index.ts +17 -0
  375. package/core/src/util/logger.ts +604 -0
  376. package/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  377. package/core/src/worker/base-worker-host.ts +183 -0
  378. package/core/src/worker/buffer-sync.ts +550 -0
  379. package/core/src/worker/crash-recovery.ts +201 -0
  380. package/core/src/worker/entity-sim-worker-host.ts +190 -0
  381. package/core/src/worker/instrumented-worker-host.ts +171 -0
  382. package/core/src/worker/rpc.ts +253 -0
  383. package/core/src/worker/sim-worker-base.ts +913 -0
  384. package/core/src/worker/sim-worker-host.ts +358 -0
  385. package/core/src/worker/task-pool.ts +256 -0
  386. package/core/src/worker/task-worker.ts +83 -0
  387. package/libraries/asset-browser/src/index.ts +11 -0
  388. package/libraries/asset-browser/src/software-thumbnails.ts +949 -0
  389. package/libraries/audio-kira/README.md +17 -0
  390. package/libraries/audio-kira/native/Cargo.toml +14 -0
  391. package/libraries/audio-kira/native/src/engine.rs +27 -0
  392. package/libraries/audio-kira/native/src/lib.rs +185 -0
  393. package/libraries/audio-kira/native/src/mixer.rs +11 -0
  394. package/libraries/audio-kira/native/src/source.rs +80 -0
  395. package/libraries/audio-kira/src/backend.ts +469 -0
  396. package/libraries/audio-kira/src/index.ts +8 -0
  397. package/libraries/audio-kira/src/library.ts +82 -0
  398. package/libraries/blitz-ui/native/Cargo.toml +33 -0
  399. package/libraries/blitz-ui/native/assets/DejaVuSans.woff2 +0 -0
  400. package/libraries/blitz-ui/native/src/bridge.rs +100 -0
  401. package/libraries/blitz-ui/native/src/fonts.rs +20 -0
  402. package/libraries/blitz-ui/native/src/input.rs +80 -0
  403. package/libraries/blitz-ui/native/src/lib.rs +96 -0
  404. package/libraries/blitz-ui/native/src/shell.rs +301 -0
  405. package/libraries/blitz-ui/native-osr/Cargo.toml +24 -0
  406. package/libraries/blitz-ui/native-osr/src/events.rs +237 -0
  407. package/libraries/blitz-ui/native-osr/src/lib.rs +846 -0
  408. package/libraries/blitz-ui/native-osr/src/mutate.rs +385 -0
  409. package/libraries/blitz-ui/native-osr/src/resources.rs +45 -0
  410. package/libraries/blitz-ui/native-osr-spike.ts +70 -0
  411. package/libraries/blitz-ui/src/index.ts +15 -0
  412. package/libraries/blitz-ui/src/native-module.ts +221 -0
  413. package/libraries/blitz-ui/src/native-osr-ffi.ts +423 -0
  414. package/libraries/blitz-ui/src/router.ts +101 -0
  415. package/libraries/blitz-ui/src/shaders/ui-blit.wgsl.ts +35 -0
  416. package/libraries/blitz-ui/src/ui-blit-pass.ts +116 -0
  417. package/libraries/character/README.md +25 -0
  418. package/libraries/character/src/character-animator.ts +374 -0
  419. package/libraries/character/src/index.ts +24 -0
  420. package/libraries/character/src/loader.ts +375 -0
  421. package/libraries/character/src/locomotion.ts +124 -0
  422. package/libraries/character/src/preview.ts +287 -0
  423. package/libraries/devtools/README.md +51 -0
  424. package/libraries/devtools/native/Cargo.toml +12 -0
  425. package/libraries/devtools/native/src/lib.rs +1646 -0
  426. package/libraries/devtools/native/src/panels/console.rs +338 -0
  427. package/libraries/devtools/native/src/panels/dom_tree.rs +47 -0
  428. package/libraries/devtools/native/src/panels/generic.rs +317 -0
  429. package/libraries/devtools/native/src/panels/gpu.rs +107 -0
  430. package/libraries/devtools/native/src/panels/input.rs +88 -0
  431. package/libraries/devtools/native/src/panels/mod.rs +154 -0
  432. package/libraries/devtools/native/src/panels/perf_metrics.rs +91 -0
  433. package/libraries/devtools/native/src/panels/perf_recorder.rs +158 -0
  434. package/libraries/devtools/native/src/panels/scene.rs +72 -0
  435. package/libraries/devtools/native/src/state.rs +394 -0
  436. package/libraries/devtools/src/cdp-bridge.ts +349 -0
  437. package/libraries/devtools/src/collectors.ts +346 -0
  438. package/libraries/devtools/src/egui-ffi.ts +804 -0
  439. package/libraries/devtools/src/egui-renderer.ts +407 -0
  440. package/libraries/devtools/src/host.ts +363 -0
  441. package/libraries/devtools/src/index.ts +40 -0
  442. package/libraries/devtools/src/mirror.ts +794 -0
  443. package/libraries/devtools/src/native-providers.ts +744 -0
  444. package/libraries/devtools/src/verify.ts +167 -0
  445. package/libraries/devtools/src/web/browser.ts +102 -0
  446. package/libraries/devtools/src/web/host.ts +212 -0
  447. package/libraries/devtools/src/web/mirror.ts +430 -0
  448. package/libraries/devtools/src/web/server.ts +198 -0
  449. package/libraries/entities/README.md +17 -0
  450. package/libraries/entities/src/index.ts +4 -0
  451. package/libraries/entities/src/library.ts +64 -0
  452. package/libraries/entities/src/model-renderer.ts +1345 -0
  453. package/libraries/entities/src/shaders/model.wgsl +375 -0
  454. package/libraries/gamepad/src/feed-input.ts +83 -0
  455. package/libraries/gamepad/src/filters.ts +49 -0
  456. package/libraries/gamepad/src/glyphs.ts +93 -0
  457. package/libraries/gamepad/src/hub.ts +206 -0
  458. package/libraries/gamepad/src/index.ts +22 -0
  459. package/libraries/gamepad/src/library.ts +68 -0
  460. package/libraries/gamepad/src/source-sab.ts +70 -0
  461. package/libraries/gamepad/src/sysfs-enrich.ts +138 -0
  462. package/libraries/gaussian-splats/README.md +25 -0
  463. package/libraries/gaussian-splats/src/gpu-sort.ts +595 -0
  464. package/libraries/gaussian-splats/src/index.ts +31 -0
  465. package/libraries/gaussian-splats/src/library.ts +60 -0
  466. package/libraries/gaussian-splats/src/parser.ts +382 -0
  467. package/libraries/gaussian-splats/src/renderer.ts +427 -0
  468. package/libraries/gaussian-splats/src/sh-eval.ts +211 -0
  469. package/libraries/gaussian-splats/src/sorter.ts +110 -0
  470. package/libraries/gaussian-splats/src/tile-raster.ts +473 -0
  471. package/libraries/gpu-kernels/README.md +154 -0
  472. package/libraries/gpu-kernels/src/index.ts +11 -0
  473. package/libraries/gpu-kernels/src/kernel.ts +696 -0
  474. package/libraries/gpu-kernels/src/transpile.ts +958 -0
  475. package/libraries/html-ui-kit/src/behaviors.ts +250 -0
  476. package/libraries/html-ui-kit/src/components.ts +309 -0
  477. package/libraries/html-ui-kit/src/index.ts +30 -0
  478. package/libraries/html-ui-kit/src/nav/nav-controller.ts +238 -0
  479. package/libraries/html-ui-kit/src/nav/nav-input.ts +145 -0
  480. package/libraries/html-ui-kit/src/nav/osk.ts +153 -0
  481. package/libraries/html-ui-kit/src/nav/router.ts +167 -0
  482. package/libraries/html-ui-kit/src/nav/vcursor.ts +203 -0
  483. package/libraries/html-ui-kit/src/ten-foot.ts +182 -0
  484. package/libraries/html-ui-kit/src/theme.ts +238 -0
  485. package/libraries/lighting/README.md +20 -0
  486. package/libraries/lighting/src/index.ts +5 -0
  487. package/libraries/lighting/src/library.ts +66 -0
  488. package/libraries/lighting/src/light-system.ts +452 -0
  489. package/libraries/lighting/src/lighting-system.ts +68 -0
  490. package/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  491. package/libraries/marching-cubes/README.md +25 -0
  492. package/libraries/marching-cubes/src/chunked-field.ts +177 -0
  493. package/libraries/marching-cubes/src/deformation.ts +63 -0
  494. package/libraries/marching-cubes/src/generator.ts +407 -0
  495. package/libraries/marching-cubes/src/index.ts +32 -0
  496. package/libraries/marching-cubes/src/library.ts +80 -0
  497. package/libraries/marching-cubes/src/lod.ts +122 -0
  498. package/libraries/marching-cubes/src/marching-tetrahedra.ts +252 -0
  499. package/libraries/marching-cubes/src/sab.ts +45 -0
  500. package/libraries/marching-cubes/src/streaming-config.ts +48 -0
  501. package/libraries/marching-cubes/src/streaming-manager.ts +686 -0
  502. package/libraries/marching-cubes/src/tables.ts +323 -0
  503. package/libraries/marching-cubes/src/types.ts +18 -0
  504. package/libraries/models/README.md +25 -0
  505. package/libraries/models/src/bake-node-transforms.ts +171 -0
  506. package/libraries/models/src/codecs/basisu-codec.ts +180 -0
  507. package/libraries/models/src/codecs/draco-codec.ts +372 -0
  508. package/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  509. package/libraries/models/src/codecs/index.ts +22 -0
  510. package/libraries/models/src/codecs/meshopt-codec.ts +91 -0
  511. package/libraries/models/src/codecs/registry.ts +221 -0
  512. package/libraries/models/src/dae.ts +753 -0
  513. package/libraries/models/src/default-part-selection.ts +56 -0
  514. package/libraries/models/src/dxf.ts +200 -0
  515. package/libraries/models/src/fbx/index.ts +457 -0
  516. package/libraries/models/src/fbx/interpreter/animation.ts +431 -0
  517. package/libraries/models/src/fbx/interpreter/blend-shapes.ts +323 -0
  518. package/libraries/models/src/fbx/interpreter/connections.ts +166 -0
  519. package/libraries/models/src/fbx/interpreter/diagnostics.ts +65 -0
  520. package/libraries/models/src/fbx/interpreter/geometry.ts +535 -0
  521. package/libraries/models/src/fbx/interpreter/global-settings.ts +92 -0
  522. package/libraries/models/src/fbx/interpreter/materials.ts +265 -0
  523. package/libraries/models/src/fbx/interpreter/nodes.ts +197 -0
  524. package/libraries/models/src/fbx/interpreter/skeleton.ts +476 -0
  525. package/libraries/models/src/fbx/parsers/binary-parser.ts +244 -0
  526. package/libraries/models/src/fbx/types.ts +119 -0
  527. package/libraries/models/src/gltf-extensions.ts +196 -0
  528. package/libraries/models/src/gltf.ts +935 -0
  529. package/libraries/models/src/index.ts +87 -0
  530. package/libraries/models/src/library.ts +75 -0
  531. package/libraries/models/src/loader.ts +265 -0
  532. package/libraries/models/src/material-adapter.ts +108 -0
  533. package/libraries/models/src/mini-xml.ts +174 -0
  534. package/libraries/models/src/normalize.ts +216 -0
  535. package/libraries/models/src/obj.ts +264 -0
  536. package/libraries/models/src/off.ts +95 -0
  537. package/libraries/models/src/ply.ts +348 -0
  538. package/libraries/models/src/pose-sampler.ts +219 -0
  539. package/libraries/models/src/sidecar/blender-extras.ts +37 -0
  540. package/libraries/models/src/sidecar/ddmeta.ts +114 -0
  541. package/libraries/models/src/sidecar/godot-import.ts +86 -0
  542. package/libraries/models/src/sidecar/resolver.ts +145 -0
  543. package/libraries/models/src/sidecar/types.ts +11 -0
  544. package/libraries/models/src/sidecar/unity-meta.ts +61 -0
  545. package/libraries/models/src/skeleton-synthesis.ts +132 -0
  546. package/libraries/models/src/stl.ts +149 -0
  547. package/libraries/models/src/threeds.ts +363 -0
  548. package/libraries/models/src/threemf.ts +201 -0
  549. package/libraries/models/src/types.ts +188 -0
  550. package/libraries/models/src/vtk.ts +218 -0
  551. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +24 -0
  552. package/libraries/models/test-fixtures/fbx/README.md +46 -0
  553. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  554. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  555. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  556. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  557. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  558. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  559. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  560. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  561. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  562. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  563. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  564. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  565. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  566. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  567. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  568. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  569. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  570. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  571. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  572. package/libraries/navmesh/README.md +23 -0
  573. package/libraries/navmesh/src/crowd-system.ts +240 -0
  574. package/libraries/navmesh/src/debug-viz.ts +74 -0
  575. package/libraries/navmesh/src/index.ts +15 -0
  576. package/libraries/navmesh/src/library.ts +64 -0
  577. package/libraries/navmesh/src/navmesh-generator.ts +407 -0
  578. package/libraries/navmesh/src/navmesh.ts +159 -0
  579. package/libraries/navmesh/src/pathfinder.ts +252 -0
  580. package/libraries/navmesh/src/types.ts +63 -0
  581. package/libraries/networking/README.md +25 -0
  582. package/libraries/networking/src/authority.ts +121 -0
  583. package/libraries/networking/src/connection.ts +139 -0
  584. package/libraries/networking/src/discovery.ts +373 -0
  585. package/libraries/networking/src/enhanced-replication.ts +355 -0
  586. package/libraries/networking/src/epic-adapter.ts +129 -0
  587. package/libraries/networking/src/index.ts +45 -0
  588. package/libraries/networking/src/library.ts +69 -0
  589. package/libraries/networking/src/lobby.ts +108 -0
  590. package/libraries/networking/src/platform-adapter.ts +163 -0
  591. package/libraries/networking/src/rcs-adapter.ts +127 -0
  592. package/libraries/networking/src/remote-input.ts +188 -0
  593. package/libraries/networking/src/replication.ts +327 -0
  594. package/libraries/networking/src/rpc.ts +188 -0
  595. package/libraries/networking/src/session.ts +173 -0
  596. package/libraries/networking/src/transport.ts +201 -0
  597. package/libraries/networking/src/webrtc.ts +323 -0
  598. package/libraries/pathfinding-2d/README.md +15 -0
  599. package/libraries/pathfinding-2d/src/astar-grid.ts +312 -0
  600. package/libraries/pathfinding-2d/src/index.ts +11 -0
  601. package/libraries/persistence/README.md +25 -0
  602. package/libraries/persistence/src/autosave-manager.ts +112 -0
  603. package/libraries/persistence/src/binary-record-store.ts +244 -0
  604. package/libraries/persistence/src/browser.ts +51 -0
  605. package/libraries/persistence/src/file-save-store.ts +553 -0
  606. package/libraries/persistence/src/hash-utils.ts +59 -0
  607. package/libraries/persistence/src/index.ts +57 -0
  608. package/libraries/persistence/src/library.ts +74 -0
  609. package/libraries/persistence/src/mock-opfs.ts +141 -0
  610. package/libraries/persistence/src/node-fs-directory-handle.ts +161 -0
  611. package/libraries/persistence/src/opfs-save-store.ts +745 -0
  612. package/libraries/persistence/src/save-worker-proxy.ts +127 -0
  613. package/libraries/persistence/src/save-worker.ts +99 -0
  614. package/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  615. package/libraries/physics-native/README.md +21 -0
  616. package/libraries/physics-native/native/Cargo.toml +11 -0
  617. package/libraries/physics-native/native/src/body.rs +403 -0
  618. package/libraries/physics-native/native/src/character.rs +226 -0
  619. package/libraries/physics-native/native/src/collider.rs +299 -0
  620. package/libraries/physics-native/native/src/joint.rs +81 -0
  621. package/libraries/physics-native/native/src/lib.rs +830 -0
  622. package/libraries/physics-native/native/src/query.rs +261 -0
  623. package/libraries/physics-native/native/src/realm.rs +33 -0
  624. package/libraries/physics-native/native/src/step.rs +54 -0
  625. package/libraries/physics-native/native/src/world.rs +148 -0
  626. package/libraries/physics-native/src/backend.ts +1046 -0
  627. package/libraries/physics-native/src/broadphase.ts +101 -0
  628. package/libraries/physics-native/src/ffi-spike-worker.ts +71 -0
  629. package/libraries/physics-native/src/index.ts +11 -0
  630. package/libraries/physics-native/src/library.ts +79 -0
  631. package/libraries/physics-native/src/narrowphase-shapes.ts +420 -0
  632. package/libraries/physics-native/src/narrowphase.ts +123 -0
  633. package/libraries/physics-native/src/solver.ts +141 -0
  634. package/libraries/physics-native/src/types.ts +76 -0
  635. package/libraries/physics-rapier/README.md +21 -0
  636. package/libraries/physics-rapier/bench/ffi-bench.ts +79 -0
  637. package/libraries/physics-rapier/bench/wasm-baseline.ts +90 -0
  638. package/libraries/physics-rapier/src/api.ts +452 -0
  639. package/libraries/physics-rapier/src/auto-backend.ts +59 -0
  640. package/libraries/physics-rapier/src/backend.ts +1207 -0
  641. package/libraries/physics-rapier/src/bulk-ops.ts +68 -0
  642. package/libraries/physics-rapier/src/ffi-backend.ts +21 -0
  643. package/libraries/physics-rapier/src/ffi-lib.ts +597 -0
  644. package/libraries/physics-rapier/src/index.ts +12 -0
  645. package/libraries/physics-rapier/src/library.ts +107 -0
  646. package/libraries/physics-rapier/src/rapier-backend.ts +1052 -0
  647. package/libraries/physics-rapier/src/realm-worker-script.ts +237 -0
  648. package/libraries/postfx/README.md +17 -0
  649. package/libraries/postfx/src/index.ts +19 -0
  650. package/libraries/postfx/src/library.ts +337 -0
  651. package/libraries/postfx/src/post-process-stack.ts +1752 -0
  652. package/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  653. package/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  654. package/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  655. package/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  656. package/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  657. package/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  658. package/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  659. package/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  660. package/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  661. package/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  662. package/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  663. package/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  664. package/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  665. package/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  666. package/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  667. package/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  668. package/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  669. package/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  670. package/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  671. package/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  672. package/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  673. package/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  674. package/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  675. package/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  676. package/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  677. package/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  678. package/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  679. package/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  680. package/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  681. package/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  682. package/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  683. package/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  684. package/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  685. package/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  686. package/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  687. package/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  688. package/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  689. package/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  690. package/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  691. package/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  692. package/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  693. package/libraries/recast/README.md +21 -0
  694. package/libraries/recast/src/backend.ts +150 -0
  695. package/libraries/recast/src/crowd-system.ts +352 -0
  696. package/libraries/recast/src/index.ts +12 -0
  697. package/libraries/recast/src/library.ts +91 -0
  698. package/libraries/recast/src/types.ts +86 -0
  699. package/libraries/sand/README.md +25 -0
  700. package/libraries/sand/src/cell.ts +43 -0
  701. package/libraries/sand/src/fields.ts +29 -0
  702. package/libraries/sand/src/fluid-grid.ts +261 -0
  703. package/libraries/sand/src/grid-dims.ts +74 -0
  704. package/libraries/sand/src/grid-sim-buffer.ts +271 -0
  705. package/libraries/sand/src/index.ts +81 -0
  706. package/libraries/sand/src/library.ts +92 -0
  707. package/libraries/sand/src/materials.ts +492 -0
  708. package/libraries/sand/src/palette.ts +93 -0
  709. package/libraries/sand/src/particles.ts +185 -0
  710. package/libraries/sand/src/render/sand-grid-pass.ts +430 -0
  711. package/libraries/sand/src/rng.ts +51 -0
  712. package/libraries/sand/src/rules/builtin-rules.ts +132 -0
  713. package/libraries/sand/src/rules/rule-compiler.ts +162 -0
  714. package/libraries/sand/src/rules/rule-engine.ts +231 -0
  715. package/libraries/sand/src/rules/rule-types.ts +87 -0
  716. package/libraries/sand/src/sand-step-pool.ts +484 -0
  717. package/libraries/sand/src/sand-step-worker.ts +97 -0
  718. package/libraries/sand/src/sand-world.ts +3227 -0
  719. package/libraries/stickman/README.md +25 -0
  720. package/libraries/stickman/src/index.ts +25 -0
  721. package/libraries/stickman/src/library.ts +61 -0
  722. package/libraries/stickman/src/proportions.ts +45 -0
  723. package/libraries/stickman/src/shader.ts +117 -0
  724. package/libraries/stickman/src/skeleton.ts +197 -0
  725. package/libraries/stickman/src/stickman-pass.ts +255 -0
  726. package/libraries/stickman/src/thick-line.ts +123 -0
  727. package/libraries/surface-nets/README.md +25 -0
  728. package/libraries/surface-nets/src/chunked-field.ts +14 -0
  729. package/libraries/surface-nets/src/deformation.ts +45 -0
  730. package/libraries/surface-nets/src/index.ts +36 -0
  731. package/libraries/surface-nets/src/library.ts +59 -0
  732. package/libraries/surface-nets/src/lod.ts +7 -0
  733. package/libraries/surface-nets/src/sab.ts +4 -0
  734. package/libraries/surface-nets/src/streaming-config.ts +5 -0
  735. package/libraries/surface-nets/src/streaming-manager.ts +15 -0
  736. package/libraries/surface-nets/src/surface-nets.ts +334 -0
  737. package/libraries/surface-nets/src/types.ts +23 -0
  738. package/libraries/water/README.md +25 -0
  739. package/libraries/water/src/buoyancy.ts +103 -0
  740. package/libraries/water/src/index.ts +43 -0
  741. package/libraries/water/src/library.ts +85 -0
  742. package/libraries/water/src/shore-damping.ts +93 -0
  743. package/libraries/water/src/water-buffer.ts +89 -0
  744. package/libraries/water/src/water-chunks.ts +13 -0
  745. package/libraries/water/src/water-physics.ts +376 -0
  746. package/libraries/water/src/water-renderer.ts +809 -0
  747. package/libraries/water/src/water-sab.ts +161 -0
  748. package/libraries/water/src/wave-sources.ts +84 -0
  749. package/libraries/weather/README.md +20 -0
  750. package/libraries/weather/src/index.ts +9 -0
  751. package/libraries/weather/src/library.ts +72 -0
  752. package/libraries/weather/src/types.ts +64 -0
  753. package/libraries/weather/src/weather-blend.ts +112 -0
  754. package/libraries/weather/src/weather-system.ts +271 -0
  755. package/libraries/weatherfx/README.md +24 -0
  756. package/libraries/weatherfx/src/cloud-provider.ts +31 -0
  757. package/libraries/weatherfx/src/cloud-system.ts +372 -0
  758. package/libraries/weatherfx/src/index.ts +9 -0
  759. package/libraries/weatherfx/src/library.ts +58 -0
  760. package/libraries/weatherfx/src/particle-system.ts +434 -0
  761. package/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  762. package/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  763. package/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  764. package/lint-plugin.mjs +41 -0
  765. package/mcp/src/client.ts +703 -0
  766. package/mcp/src/engine-context.ts +186 -0
  767. package/mcp/src/http-transport.ts +471 -0
  768. package/mcp/src/index.ts +13 -0
  769. package/mcp/src/prompts/add-entity.ts +42 -0
  770. package/mcp/src/prompts/create-scene.ts +44 -0
  771. package/mcp/src/prompts/debug-frame.ts +39 -0
  772. package/mcp/src/prompts/index.ts +12 -0
  773. package/mcp/src/resources/asset-list.ts +32 -0
  774. package/mcp/src/resources/checkpoint-list.ts +33 -0
  775. package/mcp/src/resources/entity-state.ts +55 -0
  776. package/mcp/src/resources/gpu-info.ts +103 -0
  777. package/mcp/src/resources/index.ts +57 -0
  778. package/mcp/src/resources/performance.ts +37 -0
  779. package/mcp/src/resources/scene-tree.ts +43 -0
  780. package/mcp/src/server.ts +375 -0
  781. package/mcp/src/tools/animation.ts +118 -0
  782. package/mcp/src/tools/asset.ts +161 -0
  783. package/mcp/src/tools/audio.ts +96 -0
  784. package/mcp/src/tools/build.ts +143 -0
  785. package/mcp/src/tools/camera.ts +167 -0
  786. package/mcp/src/tools/checkpoint.ts +100 -0
  787. package/mcp/src/tools/component.ts +199 -0
  788. package/mcp/src/tools/debug.ts +300 -0
  789. package/mcp/src/tools/entity.ts +361 -0
  790. package/mcp/src/tools/inspect.ts +210 -0
  791. package/mcp/src/tools/lighting.ts +263 -0
  792. package/mcp/src/tools/material.ts +243 -0
  793. package/mcp/src/tools/mesh.ts +239 -0
  794. package/mcp/src/tools/physics.ts +266 -0
  795. package/mcp/src/tools/scene.ts +153 -0
  796. package/mcp/src/tools/script.ts +122 -0
  797. package/mcp/src/types.ts +92 -0
  798. package/mcp/src/undo-redo.ts +77 -0
  799. package/modules/camera-controls/README.md +20 -0
  800. package/modules/camera-controls/src/index.ts +161 -0
  801. package/modules/controller-ui/src/index.ts +164 -0
  802. package/modules/devtools/README.md +25 -0
  803. package/modules/devtools/src/api.ts +461 -0
  804. package/modules/devtools/src/asset-utils.ts +105 -0
  805. package/modules/devtools/src/bind-debug-store.ts +48 -0
  806. package/modules/devtools/src/data-bridge.ts +286 -0
  807. package/modules/devtools/src/debug-overlay.ts +238 -0
  808. package/modules/devtools/src/debug-raycast.ts +328 -0
  809. package/modules/devtools/src/debug-store.ts +92 -0
  810. package/modules/devtools/src/debug-view-descriptors.ts +59 -0
  811. package/modules/devtools/src/doctor-panel.ts +182 -0
  812. package/modules/devtools/src/gizmo-module.ts +136 -0
  813. package/modules/devtools/src/graph-model.ts +509 -0
  814. package/modules/devtools/src/grid-renderer.ts +157 -0
  815. package/modules/devtools/src/height-ruler-renderer.ts +216 -0
  816. package/modules/devtools/src/index.ts +81 -0
  817. package/modules/devtools/src/init.ts +261 -0
  818. package/modules/devtools/src/label-overlay.ts +154 -0
  819. package/modules/devtools/src/material-stats-panel.ts +188 -0
  820. package/modules/devtools/src/profiling-bridge.ts +377 -0
  821. package/modules/devtools/src/profiling-hooks.ts +98 -0
  822. package/modules/devtools/src/renderer-adapter.ts +76 -0
  823. package/modules/devtools/src/scene-inspector.ts +637 -0
  824. package/modules/devtools/src/scene-store.ts +320 -0
  825. package/modules/devtools/src/scene-sync.ts +116 -0
  826. package/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  827. package/modules/devtools/src/sim-stats-panel.ts +272 -0
  828. package/modules/devtools/src/sim-stats-provider.ts +105 -0
  829. package/modules/devtools/src/skeleton-renderer.ts +351 -0
  830. package/modules/devtools/src/transform-gizmo.ts +928 -0
  831. package/modules/devtools/src/types.ts +290 -0
  832. package/modules/devtools/src/worker-expose.ts +67 -0
  833. package/modules/devtools/src/worker-sync.ts +137 -0
  834. package/modules/editor/src/commands/component.ts +156 -0
  835. package/modules/editor/src/commands/entity.ts +287 -0
  836. package/modules/editor/src/commands/hierarchy.ts +83 -0
  837. package/modules/editor/src/commands/index.ts +61 -0
  838. package/modules/editor/src/commands/prefab.ts +163 -0
  839. package/modules/editor/src/commands/registry.ts +331 -0
  840. package/modules/editor/src/commands/scene-io.ts +211 -0
  841. package/modules/editor/src/commands/selection.ts +73 -0
  842. package/modules/editor/src/commands/transform.ts +91 -0
  843. package/modules/editor/src/ddscene.ts +267 -0
  844. package/modules/editor/src/document.ts +123 -0
  845. package/modules/editor/src/editor-context.ts +172 -0
  846. package/modules/editor/src/index.ts +41 -0
  847. package/modules/editor/src/mcp.ts +103 -0
  848. package/modules/editor/src/module.ts +148 -0
  849. package/modules/editor/src/selection.ts +70 -0
  850. package/modules/editor/src/shell.ts +456 -0
  851. package/modules/editor/src/viewport.ts +199 -0
  852. package/modules/html-ui/src/composite.ts +135 -0
  853. package/modules/html-ui/src/create-html-ui.ts +188 -0
  854. package/modules/html-ui/src/doc-backend.ts +343 -0
  855. package/modules/html-ui/src/host.ts +646 -0
  856. package/modules/html-ui/src/index.ts +13 -0
  857. package/modules/html-ui/src/jsx-dev-runtime.ts +12 -0
  858. package/modules/html-ui/src/jsx-runtime.ts +126 -0
  859. package/modules/html-ui/src/protocol.ts +88 -0
  860. package/modules/html-ui/src/ui-worker.ts +16 -0
  861. package/modules/mcp/README.md +18 -0
  862. package/modules/mcp/src/index.ts +27 -0
  863. package/modules/movement-2d/README.md +19 -0
  864. package/modules/movement-2d/src/grid-character.ts +455 -0
  865. package/modules/movement-2d/src/index.ts +45 -0
  866. package/modules/movement-3d/README.md +21 -0
  867. package/modules/movement-3d/src/character-motor.ts +230 -0
  868. package/modules/movement-3d/src/index.ts +46 -0
  869. package/modules/native-osr/src/index.ts +22 -0
  870. package/modules/native-osr/src/input-router.ts +401 -0
  871. package/modules/native-osr/src/native-osr-manager.ts +247 -0
  872. package/modules/native-osr/src/native-texture-source.ts +86 -0
  873. package/modules/native-osr/src/types.ts +112 -0
  874. package/modules/native-osr/src/world-space-ui-pass.ts +351 -0
  875. package/modules/sailing/README.md +18 -0
  876. package/modules/sailing/src/index.ts +51 -0
  877. package/modules/terrain/README.md +18 -0
  878. package/modules/terrain/src/index.ts +78 -0
  879. package/modules/vitals/README.md +17 -0
  880. package/modules/vitals/src/index.ts +43 -0
  881. package/modules/vitals/src/vitals.ts +265 -0
  882. package/modules/xr/README.md +25 -0
  883. package/modules/xr/src/camera-rig.ts +146 -0
  884. package/modules/xr/src/debug.ts +59 -0
  885. package/modules/xr/src/frame-loop.ts +197 -0
  886. package/modules/xr/src/index.ts +16 -0
  887. package/modules/xr/src/input.ts +208 -0
  888. package/modules/xr/src/layer.ts +140 -0
  889. package/modules/xr/src/session.ts +156 -0
  890. package/modules/xr/src/sim-module.ts +23 -0
  891. package/modules/xr/src/types.ts +32 -0
  892. package/modules/xr/src/webxr.d.ts +182 -0
  893. package/modules/xr/src/xr-module.ts +179 -0
  894. package/package.json +232 -3
  895. package/shader-graph/src/chunks.ts +349 -0
  896. package/shader-graph/src/compiler.ts +732 -0
  897. package/shader-graph/src/compute-compiler.ts +453 -0
  898. package/shader-graph/src/compute-graph.ts +112 -0
  899. package/shader-graph/src/compute-profiles.ts +54 -0
  900. package/shader-graph/src/graph.ts +52 -0
  901. package/shader-graph/src/index.ts +53 -0
  902. package/shader-graph/src/profiles.ts +407 -0
  903. package/shader-graph/src/validator.ts +48 -0
  904. package/shader-graph/src/wgsl-binding-validator.ts +143 -0
  905. package/shader-graph/src/wgsl-struct-validator.ts +245 -0
  906. package/shader-graph/src/wgsl-struct.ts +397 -0
  907. package/test/src/index.ts +7 -0
  908. package/test/src/vision-test.ts +369 -0
@@ -0,0 +1,201 @@
1
+ // ============================================================================
2
+ // threemf.ts — 3D Manufacturing Format (.3mf) parser
3
+ //
4
+ // 3MF is an OPC zip container: 3D/3dmodel.model holds XML with <object>
5
+ // resources (mesh vertices + triangles), <basematerials> colors, and a
6
+ // <build> list of items with optional 4×3 transforms. This parses the core
7
+ // mesh spec — slices, beam lattices, and production-extension items are
8
+ // skipped with warnings.
9
+ // ============================================================================
10
+
11
+ import { strFromU8, unzipSync } from "fflate";
12
+ import { assertCount, MAX_FACE_COUNT, MAX_VERTEX_COUNT } from "@downdraft/engine";
13
+ import type { MaterialData, MeshData, ModelData } from "./types";
14
+
15
+ function parseTransform(s: string): number[] | null {
16
+ // 4×3 row-major: m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32
17
+ const v = s.trim().split(/\s+/).map(Number);
18
+ if (v.length !== 12 || v.some((x) => !Number.isFinite(x))) return null;
19
+ return v;
20
+ }
21
+
22
+ function applyTransform(p: [number, number, number], t: number[]): [number, number, number] {
23
+ const [x, y, z] = p;
24
+ return [
25
+ x * t[0] + y * t[3] + z * t[6] + t[9],
26
+ x * t[1] + y * t[4] + z * t[7] + t[10],
27
+ x * t[2] + y * t[5] + z * t[8] + t[11],
28
+ ];
29
+ }
30
+
31
+ function parseColor(s: string): [number, number, number, number] {
32
+ const h = s.replace("#", "");
33
+ const n = parseInt(h.length === 6 ? h + "FF" : h, 16);
34
+ return [((n >>> 24) & 255) / 255, ((n >>> 16) & 255) / 255, ((n >>> 8) & 255) / 255, (n & 255) / 255];
35
+ }
36
+
37
+ export function parse3MF(data: ArrayBuffer, name: string): ModelData {
38
+ let files: Record<string, Uint8Array>;
39
+ try {
40
+ files = unzipSync(new Uint8Array(data));
41
+ } catch {
42
+ throw new Error("3MF: not a valid zip container");
43
+ }
44
+ const modelPath = Object.keys(files).find((k) => /(^|\/)3d\/[^/]*\.model$/i.test(k))
45
+ ?? Object.keys(files).find((k) => /\.model$/i.test(k));
46
+ if (!modelPath) throw new Error("3MF: no 3D/*.model part found");
47
+ const xml = strFromU8(files[modelPath]);
48
+ const warnings: string[] = [];
49
+
50
+ // ── basematerials: <basematerials id="N"><base name=".." displaycolor="#RRGGBBAA"/></basematerials>
51
+ const materials: MaterialData[] = [];
52
+ const baseMatGroups = new Map<number, number[]>(); // basematerials id → material indices
53
+ const bmRe = /<basematerials\s+id="(\d+)"[^>]*>([\s\S]*?)<\/basematerials>/gi;
54
+ let bm: RegExpExecArray | null;
55
+ while ((bm = bmRe.exec(xml))) {
56
+ const gid = parseInt(bm[1], 10);
57
+ const idxs: number[] = [];
58
+ const baseRe = /<base\s+[^>]*displaycolor="([^"]+)"[^>]*\/>/gi;
59
+ let b: RegExpExecArray | null;
60
+ while ((b = baseRe.exec(bm[2]))) {
61
+ idxs.push(materials.length);
62
+ const nameM = /name="([^"]*)"/.exec(b[0]);
63
+ materials.push({
64
+ name: nameM?.[1] || `mat${materials.length}`,
65
+ baseColor: parseColor(b[1]),
66
+ metallic: 0,
67
+ roughness: 0.9,
68
+ });
69
+ }
70
+ baseMatGroups.set(gid, idxs);
71
+ }
72
+
73
+ // ── objects: <object id="N" ...><mesh><vertices>..</vertices><triangles>..</triangles></mesh></object>
74
+ interface Obj { verts: number[][]; tris: { v: [number, number, number]; pid?: number; p1?: number; p2?: number; p3?: number }[]; pid?: number; pindex?: number }
75
+ const objects = new Map<number, Obj>();
76
+ const objRe = /<object\s+([^>]*)>([\s\S]*?)<\/object>/gi;
77
+ let om: RegExpExecArray | null;
78
+ while ((om = objRe.exec(xml))) {
79
+ const attrs = om[1];
80
+ const id = parseInt(/id="(\d+)"/.exec(attrs)?.[1] ?? "-1", 10);
81
+ if (id < 0) continue;
82
+ const type = /type="([^"]+)"/.exec(attrs)?.[1] ?? "model";
83
+ if (type !== "model") { warnings.push(`object ${id} type "${type}" skipped`); continue; }
84
+ const pid = /pid="(\d+)"/.exec(attrs)?.[1];
85
+ const pindex = /pindex="(\d+)"/.exec(attrs)?.[1];
86
+ const obj: Obj = { verts: [], tris: [], pid: pid ? parseInt(pid, 10) : undefined, pindex: pindex ? parseInt(pindex, 10) : undefined };
87
+
88
+ const body = om[2];
89
+ const vRe = /<vertex\s+([^>]*)\/>/gi;
90
+ let vm: RegExpExecArray | null;
91
+ while ((vm = vRe.exec(body))) {
92
+ const a = vm[1];
93
+ obj.verts.push([
94
+ parseFloat(/x="([^"]+)"/.exec(a)?.[1] ?? "0"),
95
+ parseFloat(/y="([^"]+)"/.exec(a)?.[1] ?? "0"),
96
+ parseFloat(/z="([^"]+)"/.exec(a)?.[1] ?? "0"),
97
+ ]);
98
+ }
99
+ const tRe = /<triangle\s+([^>]*)\/>/gi;
100
+ let tm: RegExpExecArray | null;
101
+ while ((tm = tRe.exec(body))) {
102
+ const a = tm[1];
103
+ const num = (k: string) => { const m2 = new RegExp(`${k}="(\\d+)"`).exec(a); return m2 ? parseInt(m2[1], 10) : undefined; };
104
+ obj.tris.push({
105
+ v: [num("v1") ?? 0, num("v2") ?? 0, num("v3") ?? 0],
106
+ pid: num("pid"), p1: num("p1"), p2: num("p2"), p3: num("p3"),
107
+ });
108
+ }
109
+ objects.set(id, obj);
110
+ }
111
+
112
+ if (objects.size === 0) throw new Error("3MF: no model objects found");
113
+
114
+ // ── build items (transforms); fall back to all objects when <build> is absent
115
+ const items: { id: number; t: number[] | null }[] = [];
116
+ const buildRe = /<item\s+([^>]*)\/>/gi;
117
+ let im: RegExpExecArray | null;
118
+ while ((im = buildRe.exec(xml))) {
119
+ const a = im[1];
120
+ const oid = parseInt(/objectid="(\d+)"/.exec(a)?.[1] ?? "-1", 10);
121
+ const t = /transform="([^"]+)"/.exec(a)?.[1];
122
+ if (oid >= 0 && objects.has(oid)) items.push({ id: oid, t: t ? parseTransform(t) : null });
123
+ }
124
+ if (items.length === 0) for (const id of objects.keys()) items.push({ id, t: null });
125
+
126
+ // ── emit: one mesh per (item × material-group) — a triangle's pid picks the
127
+ // basematerials group; per-vertex p1/p2/p3 index into it. We bake the common
128
+ // case (uniform material per triangle) into materialIndex.
129
+ const meshes: MeshData[] = [];
130
+ const positions: number[] = [];
131
+
132
+ items.forEach((item) => {
133
+ const obj = objects.get(item.id)!;
134
+ // Group triangles by resolved material index (-1 = none).
135
+ const byMat = new Map<number, number[]>();
136
+ const triMat = (t: Obj["tris"][number]): number => {
137
+ const gid = t.pid ?? obj.pid;
138
+ if (gid === undefined) return -1;
139
+ const group = baseMatGroups.get(gid);
140
+ if (!group || group.length === 0) return -1;
141
+ const p = t.p1 ?? obj.pindex ?? 0;
142
+ return group[Math.min(p, group.length - 1)] ?? -1;
143
+ };
144
+ obj.tris.forEach((t) => {
145
+ const mi = triMat(t);
146
+ let arr = byMat.get(mi);
147
+ if (!arr) { arr = []; byMat.set(mi, arr); }
148
+ arr.push(t.v[0], t.v[1], t.v[2]);
149
+ });
150
+
151
+ for (const [mi, triIdx] of byMat.entries()) {
152
+ // Remap: local vertex list per material mesh.
153
+ const local = new Map<number, number>();
154
+ const indexArr: number[] = [];
155
+ const startPos = positions.length / 3;
156
+ triIdx.forEach((gv) => {
157
+ let li = local.get(gv);
158
+ if (li === undefined) {
159
+ li = positions.length / 3 - startPos;
160
+ const p = obj.verts[gv] ?? [0, 0, 0];
161
+ const w = item.t ? applyTransform(p as [number, number, number], item.t) : p;
162
+ positions.push(w[0], w[1], w[2]);
163
+ local.set(gv, li);
164
+ }
165
+ indexArr.push(li);
166
+ });
167
+ const vCount = positions.length / 3 - startPos;
168
+ if (vCount === 0 || indexArr.length === 0) continue;
169
+ const verts = new Float32Array(vCount * 6);
170
+ for (let v = 0; v < vCount; v++) {
171
+ verts[v * 6] = positions[(startPos + v) * 3];
172
+ verts[v * 6 + 1] = positions[(startPos + v) * 3 + 1];
173
+ verts[v * 6 + 2] = positions[(startPos + v) * 3 + 2];
174
+ }
175
+ const mesh: MeshData = {
176
+ vertices: verts,
177
+ indices: indexArr.length > 65535 ? new Uint32Array(indexArr) : new Uint16Array(indexArr),
178
+ vertexCount: vCount,
179
+ indexCount: indexArr.length,
180
+ uvs: null,
181
+ colors: null,
182
+ };
183
+ if (mi >= 0) mesh.materialIndex = mi;
184
+ meshes.push(mesh);
185
+ }
186
+ });
187
+
188
+ if (meshes.length === 0) throw new Error("3MF: objects contain no triangles");
189
+ const totalVerts = meshes.reduce((s, m) => s + m.vertexCount, 0);
190
+ assertCount("3mf vertices", totalVerts, MAX_VERTEX_COUNT);
191
+ assertCount("3mf triangles", meshes.reduce((s, m) => s + m.indexCount / 3, 0), MAX_FACE_COUNT);
192
+
193
+ const model: ModelData = {
194
+ meshes,
195
+ name,
196
+ format: "3mf",
197
+ materials: materials.length > 0 ? materials : undefined,
198
+ };
199
+ if (warnings.length > 0) model.warnings = warnings;
200
+ return model;
201
+ }
@@ -0,0 +1,188 @@
1
+ export interface MorphTargetData {
2
+ name: string;
3
+ deltaPositions: Float32Array;
4
+ deltaNormals?: Float32Array;
5
+ }
6
+
7
+ export interface MeshData {
8
+ vertices: Float32Array;
9
+ indices: Uint16Array | Uint32Array;
10
+ vertexCount: number;
11
+ indexCount: number;
12
+ uvs: Float32Array | null;
13
+ colors: Float32Array | null;
14
+ materialIndex?: number;
15
+ joints?: Uint8Array | Uint16Array | Uint32Array; // 4 bone indices per vertex
16
+ weights?: Float32Array; // 4 bone weights per vertex (normalized)
17
+ morphTargets?: MorphTargetData[];
18
+ morphTargetNames?: string[];
19
+ /** KHR_materials_variants: per-primitive variant → material mappings. */
20
+ variantMappings?: { variant: number; material: number }[];
21
+ }
22
+
23
+ export interface TextureTransform {
24
+ offset: [number, number];
25
+ rotation: number;
26
+ scale: [number, number];
27
+ texCoord?: number;
28
+ }
29
+
30
+ export interface MaterialData {
31
+ name: string;
32
+ baseColor: [number, number, number, number];
33
+ metallic: number;
34
+ roughness: number;
35
+ textureUri?: string;
36
+ textureData?: ArrayBuffer | null;
37
+ normalTextureUri?: string;
38
+ /** Embedded normal texture data (from bufferView). */
39
+ normalTextureData?: ArrayBuffer | null;
40
+ emissiveColor?: [number, number, number];
41
+ /** KHR_texture_transform applied to the baseColor texture (UV transform). */
42
+ textureTransform?: TextureTransform;
43
+ /** KHR_texture_transform for the normal texture, if present. */
44
+ normalTextureTransform?: TextureTransform;
45
+ /** KHR_texture_transform for the emissive texture, if present. */
46
+ emissiveTextureTransform?: TextureTransform;
47
+ }
48
+
49
+ export interface AnimationChannel {
50
+ targetNode: string;
51
+ path: "translation" | "rotation" | "scale" | "weights";
52
+ keyframeTimes: Float32Array;
53
+ keyframeValues: Float32Array;
54
+ interpolation: "LINEAR" | "STEP" | "CUBICSPLINE";
55
+ }
56
+
57
+ export interface AnimationEvent {
58
+ time: number;
59
+ type: string;
60
+ payload?: Record<string, unknown>;
61
+ }
62
+
63
+ export interface AnimationData {
64
+ name: string;
65
+ duration: number;
66
+ channels: AnimationChannel[];
67
+ sourceRestRotations?: Map<string, [number, number, number, number]>;
68
+ sourcePreRotations?: Map<string, [number, number, number, number]>;
69
+ /** Source-node rest translations (Lcl Translation) keyed by node name —
70
+ * used by retargeting to compute rest bone directions. */
71
+ sourceRestTranslations?: Map<string, [number, number, number]>;
72
+ }
73
+
74
+ export interface ModelNode {
75
+ name: string;
76
+ children?: number[];
77
+ /** Index of the primary mesh for this node (first material split). */
78
+ mesh?: number;
79
+ /** All mesh indices owned by this node, including multi-material splits.
80
+ * For single-material nodes this is `[mesh]`. For multi-material FBX
81
+ * geometries (split into one MeshData per material), this contains every
82
+ * split so renderers can draw the full geometry. Undefined when the node
83
+ * has no mesh. */
84
+ meshes?: number[];
85
+ translation?: [number, number, number];
86
+ rotation?: [number, number, number, number];
87
+ scale?: [number, number, number];
88
+ nodeIndex?: number;
89
+ /** KHR_lights_punctual: index into ModelData.lights. */
90
+ lightIndex?: number;
91
+ }
92
+
93
+ export interface BoneData {
94
+ name: string;
95
+ nodeIndex: number;
96
+ parentIndex: number;
97
+ inverseBindMatrix: Float32Array; // 16 floats (mat4, column-major)
98
+ restTranslation: [number, number, number];
99
+ restRotation: [number, number, number, number];
100
+ restScale: [number, number, number];
101
+ /** For root bones (parentIndex < 0) with non-bone ancestors in the FBX
102
+ * hierarchy, this is the composed world transform of those ancestors.
103
+ * Applied in computeSkinMatrices so the root bone's world matrix matches
104
+ * the TransformLink. Undefined when no non-bone ancestors exist. */
105
+ rootAncestorMatrix?: Float32Array;
106
+ }
107
+
108
+ export interface SkinData {
109
+ bones: BoneData[];
110
+ boneNameToIndex: Map<string, number>;
111
+ /**
112
+ * The 4×4 normalization transform (column-major) that was applied to mesh
113
+ * vertices during normalization. The animator must conjugate skin matrices
114
+ * with this (T * skinMatrix * T^-1) so that skinned vertices, which were
115
+ * transformed by T, are mapped to the correct normalized world positions.
116
+ * Identity (or undefined) when no normalization was applied or the model
117
+ * has no skin.
118
+ */
119
+ normalizationMatrix?: Float32Array;
120
+ /** Native up-axis of the skeleton's bone space (the space rest transforms
121
+ * and animation tracks live in, before normalizationMatrix conjugation).
122
+ * Retargeting must convert source-space deltas into this space. Defaults
123
+ * to "z" when absent for backward compatibility with rigs authored before
124
+ * this field existed. */
125
+ skeletonUpAxis?: "y" | "z";
126
+ }
127
+
128
+ export interface PunctualLightData {
129
+ type: "directional" | "point" | "spot";
130
+ color?: [number, number, number];
131
+ intensity?: number;
132
+ range?: number;
133
+ spot?: {
134
+ innerConeAngle: number;
135
+ outerConeAngle: number;
136
+ };
137
+ }
138
+
139
+ export interface ModelData {
140
+ meshes: MeshData[];
141
+ name: string;
142
+ format: ModelFormat;
143
+ materials?: MaterialData[];
144
+ animations?: AnimationData[];
145
+ nodes?: ModelNode[];
146
+ skin?: SkinData;
147
+ morphTargetNames?: string[];
148
+ /** KHR_materials_variants: variant names indexed by variant id. */
149
+ materialVariants?: string[];
150
+ /** KHR_lights_punctual: lights referenced by nodes via lightIndex. */
151
+ lights?: PunctualLightData[];
152
+ /** Non-fatal warnings collected during parsing (e.g. skipped primitives). */
153
+ warnings?: string[];
154
+ /** Source asset's up-axis as detected by the parser. "y" or "z". Engine is Y-up. */
155
+ sourceUpAxis?: "y" | "z";
156
+ /** Source asset's unit system as detected by the parser. Engine uses meters. */
157
+ sourceUnits?: "meters" | "centimeters" | "inches" | "millimeters" | "units";
158
+ /** FBX raw UnitScaleFactor (units per centimeter). Used for precise unit conversion. */
159
+ sourceUnitScaleFactor?: number;
160
+ /** Computed axis-aligned bounding box of all meshes (min/max corners). */
161
+ bounds?: { min: [number, number, number]; max: [number, number, number] };
162
+ /** Normalization warnings (e.g. auto-fit triggered, extreme scale detected). */
163
+ normalizationWarnings?: string[];
164
+ }
165
+
166
+ export function getMaterialVariant(model: ModelData, name: string): number {
167
+ if (!model.materialVariants) return -1;
168
+ return model.materialVariants.indexOf(name);
169
+ }
170
+
171
+ export type ModelFormat = "obj" | "gltf" | "glb" | "fbx" | "dae" | "stl" | "ply" | "3ds" | "off" | "vtk" | "dxf" | "3mf";
172
+
173
+ export function detectFormat(filename: string): ModelFormat | null {
174
+ const lower = filename.toLowerCase();
175
+ if (lower.endsWith(".obj")) return "obj";
176
+ if (lower.endsWith(".gltf")) return "gltf";
177
+ if (lower.endsWith(".glb")) return "glb";
178
+ if (lower.endsWith(".fbx")) return "fbx";
179
+ if (lower.endsWith(".dae")) return "dae";
180
+ if (lower.endsWith(".stl")) return "stl";
181
+ if (lower.endsWith(".ply")) return "ply";
182
+ if (lower.endsWith(".3ds")) return "3ds";
183
+ if (lower.endsWith(".off")) return "off";
184
+ if (lower.endsWith(".vtk")) return "vtk";
185
+ if (lower.endsWith(".dxf")) return "dxf";
186
+ if (lower.endsWith(".3mf")) return "3mf";
187
+ return null;
188
+ }
@@ -0,0 +1,218 @@
1
+ // ============================================================================
2
+ // vtk.ts — VTK legacy format (.vtk) parser, ASCII POLYDATA
3
+ //
4
+ // Supports the classic serial format: POINTS, POLYGONS/LINES/VERTICES plus
5
+ // POINT_DATA attributes (NORMALS, TEXTURE_COORDINATES, COLOR_SCALARS,
6
+ // SCALARS+LOOKUP_TABLE). Binary legacy files and STRUCTURED/UNSTRUCTURED/
7
+ // FIELD datasets are reported as warnings — the modern XML VTK family
8
+ // (.vtp/.vtu/.vti) is a different container entirely.
9
+ // ============================================================================
10
+
11
+ import { assertCount, MAX_FACE_COUNT, MAX_VERTEX_COUNT } from "@downdraft/engine";
12
+ import type { MeshData, ModelData } from "./types";
13
+
14
+ export function parseVTK(data: ArrayBuffer, name: string): ModelData {
15
+ const text = new TextDecoder().decode(data);
16
+ const lines = text.split("\n");
17
+ const warnings: string[] = [];
18
+
19
+ if (!lines[0]?.startsWith("# vtk DataFile")) {
20
+ throw new Error("VTK: not a legacy vtk file");
21
+ }
22
+ const encoding = (lines[2] ?? "").trim().toUpperCase();
23
+ if (encoding === "BINARY") {
24
+ throw new Error("VTK: binary legacy files are not supported (ASCII only)");
25
+ }
26
+ const datasetLine = (lines[3] ?? "").trim().toUpperCase();
27
+ const dataset = datasetLine.replace(/^DATASET\s+/, "");
28
+ if (dataset !== "POLYDATA") {
29
+ warnings.push(`VTK dataset ${dataset} — only POLYDATA geometry is loaded`);
30
+ if (dataset !== "UNSTRUCTURED_GRID") {
31
+ throw new Error(`VTK: unsupported dataset ${dataset}`);
32
+ }
33
+ }
34
+
35
+ // Tokenize the body after the DATASET line — VTK ASCII is whitespace-
36
+ // separated with keywords interleaved.
37
+ const body = lines.slice(4).join("\n");
38
+ const tokens = body.split(/\s+/).filter((t) => t.length > 0);
39
+ let ti = 0;
40
+
41
+ const positions: number[] = [];
42
+ const indices: number[] = [];
43
+ const normals: number[] = [];
44
+ const uvs: number[] = [];
45
+ const colors: number[] = [];
46
+ let pointDataCount = 0;
47
+ let colorComps = 0;
48
+ let scalarLookup: { name: string; table: Float32Array; scalarName: string; values: Float32Array } | null = null;
49
+ let pendingScalars: { name: string; values: Float32Array } | null = null;
50
+ const pendingCells: number[][] = [];
51
+
52
+ // VTK cell type → surface triangles (vertex order per the VTK spec).
53
+ const tri = (c: number[], ...ts: number[]) => {
54
+ for (let i = 0; i + 2 < ts.length; i += 3) indices.push(c[ts[i]], c[ts[i + 1]], c[ts[i + 2]]);
55
+ };
56
+ function emitCell(type: number, c: number[]): void {
57
+ switch (type) {
58
+ case 5: tri(c, 0, 1, 2); break; // TRIANGLE
59
+ case 9: tri(c, 0, 1, 2, 0, 2, 3); break; // QUAD
60
+ case 10: tri(c, 0, 1, 2, 0, 1, 3, 0, 2, 3, 1, 2, 3); break; // TETRA
61
+ case 12: // HEXAHEDRON
62
+ tri(c, 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 0, 4, 5, 0, 5, 1,
63
+ 1, 5, 6, 1, 6, 2, 2, 6, 7, 2, 7, 3, 3, 7, 4, 3, 4, 0);
64
+ break;
65
+ case 13: // WEDGE
66
+ tri(c, 0, 1, 2, 3, 5, 4, 0, 3, 4, 0, 4, 1, 1, 4, 5, 1, 5, 2, 2, 5, 3, 2, 3, 0);
67
+ break;
68
+ case 14: // PYRAMID
69
+ tri(c, 0, 1, 2, 0, 2, 3, 0, 1, 4, 1, 2, 4, 2, 3, 4, 3, 0, 4);
70
+ break;
71
+ default: break; // vertex/line/unknown cells aren't meshes
72
+ }
73
+ }
74
+
75
+ while (ti < tokens.length) {
76
+ const kw = tokens[ti++].toUpperCase();
77
+ if (kw === "POINTS") {
78
+ const n = parseInt(tokens[ti++], 10);
79
+ ti++; // datatype token
80
+ assertCount("vtk points", n, MAX_VERTEX_COUNT);
81
+ for (let i = 0; i < n * 3; i++) positions.push(parseFloat(tokens[ti++]));
82
+ } else if (kw === "POLYGONS" || kw === "TRIANGLE_STRIPS") {
83
+ const n = parseInt(tokens[ti++], 10);
84
+ ti++; // total index count
85
+ assertCount("vtk polygons", n, MAX_FACE_COUNT);
86
+ if (kw === "POLYGONS") {
87
+ for (let i = 0; i < n; i++) {
88
+ const k = parseInt(tokens[ti++], 10);
89
+ const face: number[] = [];
90
+ for (let j = 0; j < k; j++) face.push(parseInt(tokens[ti++], 10));
91
+ for (let j = 1; j < k - 1; j++) {
92
+ indices.push(face[0], face[j], face[j + 1]);
93
+ }
94
+ }
95
+ } else {
96
+ // Triangle strips → triangle list.
97
+ for (let i = 0; i < n; i++) {
98
+ const k = parseInt(tokens[ti++], 10);
99
+ const strip: number[] = [];
100
+ for (let j = 0; j < k; j++) strip.push(parseInt(tokens[ti++], 10));
101
+ for (let j = 0; j + 2 < k; j++) {
102
+ if (j % 2 === 0) indices.push(strip[j], strip[j + 1], strip[j + 2]);
103
+ else indices.push(strip[j + 1], strip[j], strip[j + 2]);
104
+ }
105
+ }
106
+ }
107
+ } else if (kw === "VERTICES" || kw === "LINES") {
108
+ // Point/line cells — not renderable as triangles; skip.
109
+ const n = parseInt(tokens[ti++], 10);
110
+ const total = parseInt(tokens[ti++], 10);
111
+ ti += total;
112
+ if (n > 0) warnings.push(`VTK ${kw.toLowerCase()} skipped (points/lines aren't meshes)`);
113
+ } else if (kw === "CELLS") {
114
+ // UNSTRUCTURED_GRID cell connectivity — collect raw index lists;
115
+ // CELL_TYPES (next section) decides how each becomes triangles.
116
+ const n = parseInt(tokens[ti++], 10);
117
+ ti++; // total index count
118
+ assertCount("vtk cells", n, MAX_FACE_COUNT);
119
+ for (let i = 0; i < n; i++) {
120
+ const k = parseInt(tokens[ti++], 10);
121
+ const cell: number[] = [];
122
+ for (let j = 0; j < k; j++) cell.push(parseInt(tokens[ti++], 10));
123
+ pendingCells.push(cell);
124
+ }
125
+ } else if (kw === "CELL_TYPES") {
126
+ const n = parseInt(tokens[ti++], 10);
127
+ for (let i = 0; i < n; i++) {
128
+ const type = parseInt(tokens[ti++], 10);
129
+ const cell = pendingCells[i] ?? [];
130
+ emitCell(type, cell);
131
+ }
132
+ pendingCells.length = 0;
133
+ } else if (kw === "POINT_DATA" || kw === "CELL_DATA") {
134
+ pointDataCount = parseInt(tokens[ti++], 10);
135
+ if (kw === "CELL_DATA") break; // cell attributes don't map to vertices
136
+ } else if (kw === "NORMALS") {
137
+ ti++; // name
138
+ ti++; // datatype
139
+ for (let i = 0; i < pointDataCount * 3; i++) normals.push(parseFloat(tokens[ti++]));
140
+ } else if (kw === "TEXTURE_COORDINATES") {
141
+ ti++; // name
142
+ const dim = parseInt(tokens[ti++], 10);
143
+ ti++; // datatype
144
+ for (let i = 0; i < pointDataCount; i++) {
145
+ uvs.push(parseFloat(tokens[ti++]));
146
+ uvs.push(dim >= 2 ? parseFloat(tokens[ti++]) : 0);
147
+ if (dim >= 3) ti++;
148
+ }
149
+ } else if (kw === "COLOR_SCALARS") {
150
+ ti++; // name
151
+ colorComps = parseInt(tokens[ti++], 10);
152
+ for (let i = 0; i < pointDataCount; i++) {
153
+ const c = [0, 0, 0, 1];
154
+ for (let j = 0; j < colorComps; j++) c[j] = parseFloat(tokens[ti++]);
155
+ colors.push(c[0], c[1], c[2], c[3]);
156
+ }
157
+ } else if (kw === "SCALARS") {
158
+ const scalarName = tokens[ti++];
159
+ ti++; // datatype
160
+ if (tokens[ti] === "1") ti++; // optional numComp
161
+ // Next keyword is usually LOOKUP_TABLE
162
+ if (tokens[ti]?.toUpperCase() === "LOOKUP_TABLE") {
163
+ ti++;
164
+ const tableName = tokens[ti++];
165
+ pendingScalars = { name: scalarName, values: new Float32Array(pointDataCount) };
166
+ for (let i = 0; i < pointDataCount; i++) pendingScalars.values[i] = parseFloat(tokens[ti++]);
167
+ scalarLookup = { name: tableName, table: new Float32Array(0), scalarName, values: pendingScalars.values };
168
+ } else {
169
+ for (let i = 0; i < pointDataCount; i++) ti++;
170
+ }
171
+ } else if (kw === "LOOKUP_TABLE") {
172
+ ti++; // name
173
+ const n = parseInt(tokens[ti++], 10);
174
+ const table = new Float32Array(n * 4);
175
+ for (let i = 0; i < n * 4; i++) table[i] = parseFloat(tokens[ti++]);
176
+ if (scalarLookup && pendingScalars) {
177
+ scalarLookup.table = table;
178
+ // Apply table: scalar value [0,1] → rgba
179
+ for (let i = 0; i < pointDataCount; i++) {
180
+ const t = Math.max(0, Math.min(1, pendingScalars.values[i]));
181
+ const idx = Math.min(n - 1, Math.floor(t * (n - 1) + 0.5)) * 4;
182
+ colors.push(table[idx], table[idx + 1], table[idx + 2], table[idx + 3]);
183
+ }
184
+ }
185
+ } else {
186
+ // Unknown keyword — stop scanning; trailing sections (VECTORS,
187
+ // TENSORS, FIELD) are skipped to avoid misreading counts.
188
+ break;
189
+ }
190
+ }
191
+
192
+ const vertexCount = positions.length / 3;
193
+ if (vertexCount === 0) throw new Error("VTK: no POINTS section");
194
+
195
+ const hasNormals = normals.length === vertexCount * 3;
196
+ const vertices = new Float32Array(vertexCount * 6);
197
+ for (let i = 0; i < vertexCount; i++) {
198
+ vertices[i * 6] = positions[i * 3];
199
+ vertices[i * 6 + 1] = positions[i * 3 + 1];
200
+ vertices[i * 6 + 2] = positions[i * 3 + 2];
201
+ vertices[i * 6 + 3] = hasNormals ? normals[i * 3] : 0;
202
+ vertices[i * 6 + 4] = hasNormals ? normals[i * 3 + 1] : 0;
203
+ vertices[i * 6 + 5] = hasNormals ? normals[i * 3 + 2] : 0;
204
+ }
205
+
206
+ const mesh: MeshData = {
207
+ vertices,
208
+ indices: indices.length > 65535 ? new Uint32Array(indices) : new Uint16Array(indices),
209
+ vertexCount,
210
+ indexCount: indices.length,
211
+ uvs: uvs.length === vertexCount * 2 ? new Float32Array(uvs) : null,
212
+ colors: colors.length === vertexCount * 4 ? new Float32Array(colors) : null,
213
+ };
214
+
215
+ const model: ModelData = { meshes: [mesh], name, format: "vtk" };
216
+ if (warnings.length > 0) model.warnings = warnings;
217
+ return model;
218
+ }
@@ -0,0 +1,24 @@
1
+ FBX test fixtures (m01-m16) are from the BabylonJS/Assets repository:
2
+ https://github.com/BabylonJS/Assets/tree/master/meshes/fbx/loaderTests
3
+
4
+ License: MIT (https://github.com/BabylonJS/Assets/blob/master/LICENSE.md)
5
+
6
+ Copyright (c) 2014-2024 Babylon.js contributors
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
@@ -0,0 +1,46 @@
1
+ # FBX loader visual-test models
2
+
3
+ A deterministic suite of small FBX files exercising the Babylon.js FBX loader's feature surface.
4
+ Each file is authored programmatically (binary FBX, v7500) and validated against the real Autodesk
5
+ FBX SDK, so it opens correctly in Maya as well as the Babylon loader.
6
+
7
+ Generator (not in this repo): `babylon-fbx/tools/fbx-test-generator`.
8
+
9
+ `fbxVisualTests.js` is the scene-creation script for the Babylon.js visual-regression suite: it loads
10
+ each model here, frames it with the validated per-model camera + a neutral light rig, renders
11
+ single-sided, and pins animations to a deterministic frame. The Babylon.js FBX loader PR references
12
+ its functions via the visualization `config.json` (`scriptToRun` + `functionToCall`). NOTE: fbx2gltf
13
+ drops FBX skeletal animation, so the SDK/Maya-proxy render of `m12_skeletal_anim` shows the rest pose
14
+ (straight); the Babylon loader (and real Maya, when scrubbed) shows the bend.
15
+
16
+ ## Conventions / expectations
17
+ - **Single-sided**: meshes are wound so the outward face is front-facing. Render with backface
18
+ culling on; a regression that flips winding/normals will show backfaces (inside-out).
19
+ - **Axis**: M16 includes genuinely Z-up and Y-up authorings. The Babylon loader converts both to the
20
+ engine's Y-up space, so all three M16 files load identically. (Maya does NOT convert on import, so
21
+ the Z-up file looks rotated there — that is the proof it is genuinely Z-up.)
22
+ - **Cameras/lights** (M15): FBX cameras look down local +X, lights down local -Z; both are aimed at
23
+ the subject. View M15 through its own perspective camera.
24
+
25
+ ## Models
26
+ | File | Exercises | Expected |
27
+ | --- | --- | --- |
28
+ | m01_cube_phong | basic mesh, Phong material, per-face normals/UVs | lit cube |
29
+ | m02_geo_ngons | n-gon triangulation (tri/quad/hex/concave arrow), vertex colors | flat panel of colored polygons (enable vertex-color display in Maya) |
30
+ | m03_normals | smooth vs flat (hard-edged) shading on two spheres | left smooth, right faceted; no pole holes |
31
+ | m04_material_properties | Lambert/Phong, specular, emissive, ambient, opacity | row of spheres with distinct shading |
32
+ | m05_textures | texture slots: diffuse, normal (debossed F), emissive, opacity (holes), external sidecar | row of textured quads (needs `m05_external_diffuse.png`) |
33
+ | m06_uv_transform | per-texture UV translation + scaling | tiled/offset checker on a plane |
34
+ | m07_multimaterial | per-polygon material indices → submesh splitting | cube with 3 colored face-pairs (red/green/blue) |
35
+ | m08_transforms | TRS chain, pre/post-rotation, pivots/offsets, geometric transform | scattered colored cubes |
36
+ | m09_skinning | skeleton + clusters + weights + bind pose (static bent rest) | smoothly bent cylinder |
37
+ | m10_morph | morph targets + in-between shapes (static deform) | flat plane with a raised central hill |
38
+ | m11_node_anim | node animation (const/linear/cubic keys) | three posed cubes at the sampled frame |
39
+ | m12_skeletal_anim | skeletal animation over time | cylinder bent at the sampled frame |
40
+ | m13_morph_anim | DeformPercent animation | plane hill at the sampled frame |
41
+ | m14_multiclip | multiple AnimationStacks → two clips ("Spin", "Bounce") | one cube; two animation groups |
42
+ | m15_camera_lights | point/spot/directional lights + perspective/orthographic cameras, all aimed at the subject | lit sphere + ground, green spot pool, viewed through the FBX camera |
43
+ | m16_axis_yup / m16_axis_zup / m16_units_254 | GlobalSettings axis conversion + unit scale | all three load identically (RGB gizmo, green up) |
44
+
45
+ `.fbm` folders are texture-extraction artifacts created by SDK tools (Maya/fbx2gltf) when loading
46
+ embedded-texture files; they are gitignored.