@adobe/data-gpu 0.9.69

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 (584) hide show
  1. package/CLAUDE.md +98 -0
  2. package/LICENSE +21 -0
  3. package/dist/core/core-plugin.d.ts +44 -0
  4. package/dist/core/core-plugin.js +90 -0
  5. package/dist/core/core-plugin.js.map +1 -0
  6. package/dist/core/frame-time/frame-time-plugin.d.ts +25 -0
  7. package/dist/core/frame-time/frame-time-plugin.js +41 -0
  8. package/dist/core/frame-time/frame-time-plugin.js.map +1 -0
  9. package/dist/core/frame-time/frame-time.d.ts +18 -0
  10. package/dist/core/frame-time/frame-time.js +3 -0
  11. package/dist/core/frame-time/frame-time.js.map +1 -0
  12. package/dist/core/frame-time/public.d.ts +1 -0
  13. package/dist/core/frame-time/public.js +3 -0
  14. package/dist/core/frame-time/public.js.map +1 -0
  15. package/dist/graphics/animation/animation-data-plugin.d.ts +216 -0
  16. package/dist/graphics/animation/animation-data-plugin.js +110 -0
  17. package/dist/graphics/animation/animation-data-plugin.js.map +1 -0
  18. package/dist/graphics/animation/animation-plugin.d.ts +214 -0
  19. package/dist/graphics/animation/animation-plugin.js +26 -0
  20. package/dist/graphics/animation/animation-plugin.js.map +1 -0
  21. package/dist/graphics/animation/animation-plugin.test.d.ts +1 -0
  22. package/dist/graphics/animation/animation-plugin.test.js +142 -0
  23. package/dist/graphics/animation/animation-plugin.test.js.map +1 -0
  24. package/dist/graphics/animation/animation-track/animation-track.d.ts +13 -0
  25. package/dist/graphics/animation/animation-track/animation-track.js +3 -0
  26. package/dist/graphics/animation/animation-track/animation-track.js.map +1 -0
  27. package/dist/graphics/animation/animation-track/componentwise-lerp.d.ts +7 -0
  28. package/dist/graphics/animation/animation-track/componentwise-lerp.js +22 -0
  29. package/dist/graphics/animation/animation-track/componentwise-lerp.js.map +1 -0
  30. package/dist/graphics/animation/animation-track/interpolate.d.ts +8 -0
  31. package/dist/graphics/animation/animation-track/interpolate.js +18 -0
  32. package/dist/graphics/animation/animation-track/interpolate.js.map +1 -0
  33. package/dist/graphics/animation/animation-track/public.d.ts +1 -0
  34. package/dist/graphics/animation/animation-track/public.js +3 -0
  35. package/dist/graphics/animation/animation-track/public.js.map +1 -0
  36. package/dist/graphics/animation/animation-track/sample.d.ts +7 -0
  37. package/dist/graphics/animation/animation-track/sample.js +44 -0
  38. package/dist/graphics/animation/animation-track/sample.js.map +1 -0
  39. package/dist/graphics/animation/interpolation-mode/interpolation-mode.d.ts +4 -0
  40. package/dist/graphics/animation/interpolation-mode/interpolation-mode.js +3 -0
  41. package/dist/graphics/animation/interpolation-mode/interpolation-mode.js.map +1 -0
  42. package/dist/graphics/animation/interpolation-mode/public.d.ts +1 -0
  43. package/dist/graphics/animation/interpolation-mode/public.js +3 -0
  44. package/dist/graphics/animation/interpolation-mode/public.js.map +1 -0
  45. package/dist/graphics/animation/interpolation-mode/schema.d.ts +4 -0
  46. package/dist/graphics/animation/interpolation-mode/schema.js +3 -0
  47. package/dist/graphics/animation/interpolation-mode/schema.js.map +1 -0
  48. package/dist/graphics/camera/camera-plugin.d.ts +112 -0
  49. package/dist/graphics/camera/camera-plugin.js +36 -0
  50. package/dist/graphics/camera/camera-plugin.js.map +1 -0
  51. package/dist/graphics/camera/camera.d.ts +4 -0
  52. package/dist/graphics/camera/camera.js +3 -0
  53. package/dist/graphics/camera/camera.js.map +1 -0
  54. package/dist/graphics/camera/orbit/attach-orbit-drag.d.ts +31 -0
  55. package/dist/graphics/camera/orbit/attach-orbit-drag.js +44 -0
  56. package/dist/graphics/camera/orbit/attach-orbit-drag.js.map +1 -0
  57. package/dist/graphics/camera/orbit/orbit-data-plugin.d.ts +290 -0
  58. package/dist/graphics/camera/orbit/orbit-data-plugin.js +42 -0
  59. package/dist/graphics/camera/orbit/orbit-data-plugin.js.map +1 -0
  60. package/dist/graphics/camera/orbit/orbit-plugin.d.ts +281 -0
  61. package/dist/graphics/camera/orbit/orbit-plugin.js +12 -0
  62. package/dist/graphics/camera/orbit/orbit-plugin.js.map +1 -0
  63. package/dist/graphics/camera/orbit/orbit-system-plugin.d.ts +292 -0
  64. package/dist/graphics/camera/orbit/orbit-system-plugin.js +71 -0
  65. package/dist/graphics/camera/orbit/orbit-system-plugin.js.map +1 -0
  66. package/dist/graphics/camera/orbit/orbit.d.ts +32 -0
  67. package/dist/graphics/camera/orbit/orbit.js +3 -0
  68. package/dist/graphics/camera/orbit/orbit.js.map +1 -0
  69. package/dist/graphics/camera/orbit/public.d.ts +5 -0
  70. package/dist/graphics/camera/orbit/public.js +6 -0
  71. package/dist/graphics/camera/orbit/public.js.map +1 -0
  72. package/dist/graphics/camera/public.d.ts +4 -0
  73. package/dist/graphics/camera/public.js +6 -0
  74. package/dist/graphics/camera/public.js.map +1 -0
  75. package/dist/graphics/camera/schema.d.ts +65 -0
  76. package/dist/graphics/camera/schema.js +19 -0
  77. package/dist/graphics/camera/schema.js.map +1 -0
  78. package/dist/graphics/camera/screen-to-world-ray.d.ts +10 -0
  79. package/dist/graphics/camera/screen-to-world-ray.js +31 -0
  80. package/dist/graphics/camera/screen-to-world-ray.js.map +1 -0
  81. package/dist/graphics/camera/to-view-projection.d.ts +3 -0
  82. package/dist/graphics/camera/to-view-projection.js +23 -0
  83. package/dist/graphics/camera/to-view-projection.js.map +1 -0
  84. package/dist/graphics/graphics-plugin.d.ts +121 -0
  85. package/dist/graphics/graphics-plugin.js +106 -0
  86. package/dist/graphics/graphics-plugin.js.map +1 -0
  87. package/dist/graphics/picking/pick-hit.d.ts +10 -0
  88. package/dist/graphics/picking/pick-hit.js +3 -0
  89. package/dist/graphics/picking/pick-hit.js.map +1 -0
  90. package/dist/graphics/picking/picking-plugin.d.ts +3819 -0
  91. package/dist/graphics/picking/picking-plugin.js +88 -0
  92. package/dist/graphics/picking/picking-plugin.js.map +1 -0
  93. package/dist/graphics/rendering/bone-collider-plugin.d.ts +1619 -0
  94. package/dist/graphics/rendering/bone-collider-plugin.js +207 -0
  95. package/dist/graphics/rendering/bone-collider-plugin.js.map +1 -0
  96. package/dist/graphics/rendering/display-transform-plugin.d.ts +52 -0
  97. package/dist/graphics/rendering/display-transform-plugin.js +25 -0
  98. package/dist/graphics/rendering/display-transform-plugin.js.map +1 -0
  99. package/dist/graphics/rendering/ibl-render/brdf.wgsl.d.ts +2 -0
  100. package/dist/graphics/rendering/ibl-render/brdf.wgsl.js +42 -0
  101. package/dist/graphics/rendering/ibl-render/brdf.wgsl.js.map +1 -0
  102. package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.d.ts +1 -0
  103. package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.js +91 -0
  104. package/dist/graphics/rendering/ibl-render/ibl/brdf-lut.js.map +1 -0
  105. package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.d.ts +24 -0
  106. package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.js +34 -0
  107. package/dist/graphics/rendering/ibl-render/ibl/build-ibl-resources.js.map +1 -0
  108. package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.d.ts +1 -0
  109. package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.js +12 -0
  110. package/dist/graphics/rendering/ibl-render/ibl/create-cubemap.js.map +1 -0
  111. package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.d.ts +1 -0
  112. package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.js +11 -0
  113. package/dist/graphics/rendering/ibl-render/ibl/cube-face-view.js.map +1 -0
  114. package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.d.ts +1 -0
  115. package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.js +9 -0
  116. package/dist/graphics/rendering/ibl-render/ibl/cubemap-sample-view.js.map +1 -0
  117. package/dist/graphics/rendering/ibl-render/ibl/environment.d.ts +8 -0
  118. package/dist/graphics/rendering/ibl-render/ibl/environment.js +170 -0
  119. package/dist/graphics/rendering/ibl-render/ibl/environment.js.map +1 -0
  120. package/dist/graphics/rendering/ibl-render/ibl/float-to-half.d.ts +2 -0
  121. package/dist/graphics/rendering/ibl-render/ibl/float-to-half.js +32 -0
  122. package/dist/graphics/rendering/ibl-render/ibl/float-to-half.js.map +1 -0
  123. package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.d.ts +2 -0
  124. package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.js +59 -0
  125. package/dist/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.js.map +1 -0
  126. package/dist/graphics/rendering/ibl-render/ibl/irradiance.d.ts +1 -0
  127. package/dist/graphics/rendering/ibl-render/ibl/irradiance.js +94 -0
  128. package/dist/graphics/rendering/ibl-render/ibl/irradiance.js.map +1 -0
  129. package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.d.ts +6 -0
  130. package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.js +106 -0
  131. package/dist/graphics/rendering/ibl-render/ibl/parse-hdr.js.map +1 -0
  132. package/dist/graphics/rendering/ibl-render/ibl/prefilter.d.ts +5 -0
  133. package/dist/graphics/rendering/ibl-render/ibl/prefilter.js +103 -0
  134. package/dist/graphics/rendering/ibl-render/ibl/prefilter.js.map +1 -0
  135. package/dist/graphics/rendering/ibl-render/ibl/render-helpers.d.ts +4 -0
  136. package/dist/graphics/rendering/ibl-render/ibl/render-helpers.js +16 -0
  137. package/dist/graphics/rendering/ibl-render/ibl/render-helpers.js.map +1 -0
  138. package/dist/graphics/rendering/ibl-render/ibl-render-plugin.d.ts +1028 -0
  139. package/dist/graphics/rendering/ibl-render/ibl-render-plugin.js +409 -0
  140. package/dist/graphics/rendering/ibl-render/ibl-render-plugin.js.map +1 -0
  141. package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.d.ts +8 -0
  142. package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.js +173 -0
  143. package/dist/graphics/rendering/ibl-render/ibl-shader.wgsl.js.map +1 -0
  144. package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.d.ts +2 -0
  145. package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.js +50 -0
  146. package/dist/graphics/rendering/ibl-render/skybox-shader.wgsl.js.map +1 -0
  147. package/dist/graphics/rendering/interpolation-plugin.d.ts +485 -0
  148. package/dist/graphics/rendering/interpolation-plugin.js +98 -0
  149. package/dist/graphics/rendering/interpolation-plugin.js.map +1 -0
  150. package/dist/graphics/rendering/interpolation.test.d.ts +1 -0
  151. package/dist/graphics/rendering/interpolation.test.js +38 -0
  152. package/dist/graphics/rendering/interpolation.test.js.map +1 -0
  153. package/dist/graphics/rendering/jolt-ragdoll-plugin.d.ts +1628 -0
  154. package/dist/graphics/rendering/jolt-ragdoll-plugin.js +218 -0
  155. package/dist/graphics/rendering/jolt-ragdoll-plugin.js.map +1 -0
  156. package/dist/graphics/rendering/material-gpu/material-arrays.d.ts +47 -0
  157. package/dist/graphics/rendering/material-gpu/material-arrays.js +83 -0
  158. package/dist/graphics/rendering/material-gpu/material-arrays.js.map +1 -0
  159. package/dist/graphics/rendering/material-gpu/material-bind-group.d.ts +9 -0
  160. package/dist/graphics/rendering/material-gpu/material-bind-group.js +52 -0
  161. package/dist/graphics/rendering/material-gpu/material-bind-group.js.map +1 -0
  162. package/dist/graphics/rendering/material-gpu/material-gpu-plugin.d.ts +259 -0
  163. package/dist/graphics/rendering/material-gpu/material-gpu-plugin.js +90 -0
  164. package/dist/graphics/rendering/material-gpu/material-gpu-plugin.js.map +1 -0
  165. package/dist/graphics/rendering/model-collider-plugin.d.ts +1232 -0
  166. package/dist/graphics/rendering/model-collider-plugin.js +81 -0
  167. package/dist/graphics/rendering/model-collider-plugin.js.map +1 -0
  168. package/dist/graphics/rendering/pbr-core-plugin.d.ts +75 -0
  169. package/dist/graphics/rendering/pbr-core-plugin.js +39 -0
  170. package/dist/graphics/rendering/pbr-core-plugin.js.map +1 -0
  171. package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.d.ts +10 -0
  172. package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.js +145 -0
  173. package/dist/graphics/rendering/pbr-render/pbr-array-shader.wgsl.js.map +1 -0
  174. package/dist/graphics/rendering/pbr-render/pbr-render-plugin.d.ts +1266 -0
  175. package/dist/graphics/rendering/pbr-render/pbr-render-plugin.js +254 -0
  176. package/dist/graphics/rendering/pbr-render/pbr-render-plugin.js.map +1 -0
  177. package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.d.ts +1004 -0
  178. package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.js +116 -0
  179. package/dist/graphics/rendering/pbr-render/physics-bridge-plugin.js.map +1 -0
  180. package/dist/graphics/rendering/ragdoll-trigger-plugin.d.ts +31 -0
  181. package/dist/graphics/rendering/ragdoll-trigger-plugin.js +20 -0
  182. package/dist/graphics/rendering/ragdoll-trigger-plugin.js.map +1 -0
  183. package/dist/graphics/rendering/rendering-plugin.d.ts +1 -0
  184. package/dist/graphics/rendering/rendering-plugin.js +3 -0
  185. package/dist/graphics/rendering/rendering-plugin.js.map +1 -0
  186. package/dist/graphics/rendering/skinning/skinning-attributes/layout.d.ts +2 -0
  187. package/dist/graphics/rendering/skinning/skinning-attributes/layout.js +18 -0
  188. package/dist/graphics/rendering/skinning/skinning-attributes/layout.js.map +1 -0
  189. package/dist/graphics/rendering/skinning/skinning-attributes/public.d.ts +1 -0
  190. package/dist/graphics/rendering/skinning/skinning-attributes/public.js +3 -0
  191. package/dist/graphics/rendering/skinning/skinning-attributes/public.js.map +1 -0
  192. package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.d.ts +1 -0
  193. package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.js +3 -0
  194. package/dist/graphics/rendering/skinning/skinning-attributes/skinning-attributes.js.map +1 -0
  195. package/dist/graphics/rendering/skinning/skinning-plugin.d.ts +1212 -0
  196. package/dist/graphics/rendering/skinning/skinning-plugin.js +207 -0
  197. package/dist/graphics/rendering/skinning/skinning-plugin.js.map +1 -0
  198. package/dist/graphics/rendering/standard-vertex/layout.d.ts +2 -0
  199. package/dist/graphics/rendering/standard-vertex/layout.js +16 -0
  200. package/dist/graphics/rendering/standard-vertex/layout.js.map +1 -0
  201. package/dist/graphics/rendering/standard-vertex/public.d.ts +2 -0
  202. package/dist/graphics/rendering/standard-vertex/public.js +4 -0
  203. package/dist/graphics/rendering/standard-vertex/public.js.map +1 -0
  204. package/dist/graphics/rendering/standard-vertex/schema.d.ts +52 -0
  205. package/dist/graphics/rendering/standard-vertex/schema.js +15 -0
  206. package/dist/graphics/rendering/standard-vertex/schema.js.map +1 -0
  207. package/dist/graphics/rendering/standard-vertex/standard-vertex.d.ts +4 -0
  208. package/dist/graphics/rendering/standard-vertex/standard-vertex.js +3 -0
  209. package/dist/graphics/rendering/standard-vertex/standard-vertex.js.map +1 -0
  210. package/dist/graphics/rendering/visible-material/color-material-options.d.ts +7 -0
  211. package/dist/graphics/rendering/visible-material/color-material-options.js +3 -0
  212. package/dist/graphics/rendering/visible-material/color-material-options.js.map +1 -0
  213. package/dist/graphics/rendering/visible-material/create-bind-group-layout.d.ts +8 -0
  214. package/dist/graphics/rendering/visible-material/create-bind-group-layout.js +35 -0
  215. package/dist/graphics/rendering/visible-material/create-bind-group-layout.js.map +1 -0
  216. package/dist/graphics/rendering/visible-material/create-color-bind-group.d.ts +10 -0
  217. package/dist/graphics/rendering/visible-material/create-color-bind-group.js +26 -0
  218. package/dist/graphics/rendering/visible-material/create-color-bind-group.js.map +1 -0
  219. package/dist/graphics/rendering/visible-material/public.d.ts +4 -0
  220. package/dist/graphics/rendering/visible-material/public.js +5 -0
  221. package/dist/graphics/rendering/visible-material/public.js.map +1 -0
  222. package/dist/graphics/rendering/visible-material/schema.d.ts +49 -0
  223. package/dist/graphics/rendering/visible-material/schema.js +23 -0
  224. package/dist/graphics/rendering/visible-material/schema.js.map +1 -0
  225. package/dist/graphics/rendering/visible-material/visible-material.d.ts +4 -0
  226. package/dist/graphics/rendering/visible-material/visible-material.js +3 -0
  227. package/dist/graphics/rendering/visible-material/visible-material.js.map +1 -0
  228. package/dist/graphics/scene/light/light-plugin.d.ts +30 -0
  229. package/dist/graphics/scene/light/light-plugin.js +35 -0
  230. package/dist/graphics/scene/light/light-plugin.js.map +1 -0
  231. package/dist/graphics/scene/light/light.d.ts +14 -0
  232. package/dist/graphics/scene/light/light.js +3 -0
  233. package/dist/graphics/scene/light/light.js.map +1 -0
  234. package/dist/graphics/scene/light/public.d.ts +1 -0
  235. package/dist/graphics/scene/light/public.js +2 -0
  236. package/dist/graphics/scene/light/public.js.map +1 -0
  237. package/dist/graphics/scene/model/geometry/geometry.d.ts +9 -0
  238. package/dist/graphics/scene/model/geometry/geometry.js +3 -0
  239. package/dist/graphics/scene/model/geometry/geometry.js.map +1 -0
  240. package/dist/graphics/scene/model/geometry/public.d.ts +1 -0
  241. package/dist/graphics/scene/model/geometry/public.js +3 -0
  242. package/dist/graphics/scene/model/geometry/public.js.map +1 -0
  243. package/dist/graphics/scene/model/gltf/accessor-view.d.ts +9 -0
  244. package/dist/graphics/scene/model/gltf/accessor-view.js +44 -0
  245. package/dist/graphics/scene/model/gltf/accessor-view.js.map +1 -0
  246. package/dist/graphics/scene/model/gltf/build-material-bind-group.d.ts +22 -0
  247. package/dist/graphics/scene/model/gltf/build-material-bind-group.js +75 -0
  248. package/dist/graphics/scene/model/gltf/build-material-bind-group.js.map +1 -0
  249. package/dist/graphics/scene/model/gltf/compute-world-matrices.d.ts +7 -0
  250. package/dist/graphics/scene/model/gltf/compute-world-matrices.js +38 -0
  251. package/dist/graphics/scene/model/gltf/compute-world-matrices.js.map +1 -0
  252. package/dist/graphics/scene/model/gltf/create-color-material.d.ts +3 -0
  253. package/dist/graphics/scene/model/gltf/create-color-material.js +34 -0
  254. package/dist/graphics/scene/model/gltf/create-color-material.js.map +1 -0
  255. package/dist/graphics/scene/model/gltf/decode-images.d.ts +12 -0
  256. package/dist/graphics/scene/model/gltf/decode-images.js +68 -0
  257. package/dist/graphics/scene/model/gltf/decode-images.js.map +1 -0
  258. package/dist/graphics/scene/model/gltf/gltf-schema.d.ts +152 -0
  259. package/dist/graphics/scene/model/gltf/gltf-schema.js +20 -0
  260. package/dist/graphics/scene/model/gltf/gltf-schema.js.map +1 -0
  261. package/dist/graphics/scene/model/gltf/load-gltf-model.d.ts +42 -0
  262. package/dist/graphics/scene/model/gltf/load-gltf-model.js +175 -0
  263. package/dist/graphics/scene/model/gltf/load-gltf-model.js.map +1 -0
  264. package/dist/graphics/scene/model/gltf/pack-vertex-buffer.d.ts +21 -0
  265. package/dist/graphics/scene/model/gltf/pack-vertex-buffer.js +106 -0
  266. package/dist/graphics/scene/model/gltf/pack-vertex-buffer.js.map +1 -0
  267. package/dist/graphics/scene/model/gltf/parse-animations.d.ts +18 -0
  268. package/dist/graphics/scene/model/gltf/parse-animations.js +51 -0
  269. package/dist/graphics/scene/model/gltf/parse-animations.js.map +1 -0
  270. package/dist/graphics/scene/model/gltf/parse-glb.d.ts +6 -0
  271. package/dist/graphics/scene/model/gltf/parse-glb.js +40 -0
  272. package/dist/graphics/scene/model/gltf/parse-glb.js.map +1 -0
  273. package/dist/graphics/scene/model/gltf/parse-skin.d.ts +19 -0
  274. package/dist/graphics/scene/model/gltf/parse-skin.js +43 -0
  275. package/dist/graphics/scene/model/gltf/parse-skin.js.map +1 -0
  276. package/dist/graphics/scene/model/model-loader-plugin.d.ts +922 -0
  277. package/dist/graphics/scene/model/model-loader-plugin.js +120 -0
  278. package/dist/graphics/scene/model/model-loader-plugin.js.map +1 -0
  279. package/dist/graphics/scene/model/model-plugin.d.ts +352 -0
  280. package/dist/graphics/scene/model/model-plugin.js +39 -0
  281. package/dist/graphics/scene/model/model-plugin.js.map +1 -0
  282. package/dist/graphics/scene/model/model.d.ts +11 -0
  283. package/dist/graphics/scene/model/model.js +3 -0
  284. package/dist/graphics/scene/model/model.js.map +1 -0
  285. package/dist/graphics/scene/model/public.d.ts +1 -0
  286. package/dist/graphics/scene/model/public.js +2 -0
  287. package/dist/graphics/scene/model/public.js.map +1 -0
  288. package/dist/graphics/scene/model/shape/convex-hull.d.ts +36 -0
  289. package/dist/graphics/scene/model/shape/convex-hull.js +152 -0
  290. package/dist/graphics/scene/model/shape/convex-hull.js.map +1 -0
  291. package/dist/graphics/scene/model/shape/convex-hull.test.d.ts +1 -0
  292. package/dist/graphics/scene/model/shape/convex-hull.test.js +78 -0
  293. package/dist/graphics/scene/model/shape/convex-hull.test.js.map +1 -0
  294. package/dist/graphics/scene/model/shape/shape-geometry-plugin.d.ts +631 -0
  295. package/dist/graphics/scene/model/shape/shape-geometry-plugin.js +61 -0
  296. package/dist/graphics/scene/model/shape/shape-geometry-plugin.js.map +1 -0
  297. package/dist/graphics/scene/model/shape/shape-mesh.d.ts +34 -0
  298. package/dist/graphics/scene/model/shape/shape-mesh.js +142 -0
  299. package/dist/graphics/scene/model/shape/shape-mesh.js.map +1 -0
  300. package/dist/graphics/scene/model/shape/upload-shape-mesh.d.ts +9 -0
  301. package/dist/graphics/scene/model/shape/upload-shape-mesh.js +12 -0
  302. package/dist/graphics/scene/model/shape/upload-shape-mesh.js.map +1 -0
  303. package/dist/graphics/scene/model/world-bounds-plugin.d.ts +909 -0
  304. package/dist/graphics/scene/model/world-bounds-plugin.js +93 -0
  305. package/dist/graphics/scene/model/world-bounds-plugin.js.map +1 -0
  306. package/dist/graphics/scene/node/node-data-plugin.d.ts +113 -0
  307. package/dist/graphics/scene/node/node-data-plugin.js +27 -0
  308. package/dist/graphics/scene/node/node-data-plugin.js.map +1 -0
  309. package/dist/graphics/scene/node/node-plugin.d.ts +102 -0
  310. package/dist/graphics/scene/node/node-plugin.js +12 -0
  311. package/dist/graphics/scene/node/node-plugin.js.map +1 -0
  312. package/dist/graphics/scene/node/node.d.ts +19 -0
  313. package/dist/graphics/scene/node/node.js +3 -0
  314. package/dist/graphics/scene/node/node.js.map +1 -0
  315. package/dist/graphics/scene/node/public.d.ts +1 -0
  316. package/dist/graphics/scene/node/public.js +2 -0
  317. package/dist/graphics/scene/node/public.js.map +1 -0
  318. package/dist/graphics/scene/node/transform-plugin.d.ts +123 -0
  319. package/dist/graphics/scene/node/transform-plugin.js +65 -0
  320. package/dist/graphics/scene/node/transform-plugin.js.map +1 -0
  321. package/dist/graphics/scene/scene-plugin.d.ts +461 -0
  322. package/dist/graphics/scene/scene-plugin.js +19 -0
  323. package/dist/graphics/scene/scene-plugin.js.map +1 -0
  324. package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.d.ts +7 -0
  325. package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.js +19 -0
  326. package/dist/graphics/scene/scene-uniforms/create-bind-group-layout.js.map +1 -0
  327. package/dist/graphics/scene/scene-uniforms/public.d.ts +3 -0
  328. package/dist/graphics/scene/scene-uniforms/public.js +5 -0
  329. package/dist/graphics/scene/scene-uniforms/public.js.map +1 -0
  330. package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.d.ts +137 -0
  331. package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.js +59 -0
  332. package/dist/graphics/scene/scene-uniforms/scene-uniforms-plugin.js.map +1 -0
  333. package/dist/graphics/scene/scene-uniforms/scene-uniforms.d.ts +11 -0
  334. package/dist/graphics/scene/scene-uniforms/scene-uniforms.js +3 -0
  335. package/dist/graphics/scene/scene-uniforms/scene-uniforms.js.map +1 -0
  336. package/dist/graphics/scene/scene-uniforms/schema.d.ts +56 -0
  337. package/dist/graphics/scene/scene-uniforms/schema.js +15 -0
  338. package/dist/graphics/scene/scene-uniforms/schema.js.map +1 -0
  339. package/dist/index.d.ts +53 -0
  340. package/dist/index.js +56 -0
  341. package/dist/index.js.map +1 -0
  342. package/dist/material/material-plugin.d.ts +221 -0
  343. package/dist/material/material-plugin.js +60 -0
  344. package/dist/material/material-plugin.js.map +1 -0
  345. package/dist/material/material.d.ts +31 -0
  346. package/dist/material/material.js +3 -0
  347. package/dist/material/material.js.map +1 -0
  348. package/dist/material/public.d.ts +2 -0
  349. package/dist/material/public.js +4 -0
  350. package/dist/material/public.js.map +1 -0
  351. package/dist/material/standard-materials.d.ts +3 -0
  352. package/dist/material/standard-materials.js +35 -0
  353. package/dist/material/standard-materials.js.map +1 -0
  354. package/dist/physics/body/body-type/body-type.d.ts +10 -0
  355. package/dist/physics/body/body-type/body-type.js +3 -0
  356. package/dist/physics/body/body-type/body-type.js.map +1 -0
  357. package/dist/physics/body/body-type/is-dynamic.d.ts +3 -0
  358. package/dist/physics/body/body-type/is-dynamic.js +6 -0
  359. package/dist/physics/body/body-type/is-dynamic.js.map +1 -0
  360. package/dist/physics/body/body-type/public.d.ts +2 -0
  361. package/dist/physics/body/body-type/public.js +4 -0
  362. package/dist/physics/body/body-type/public.js.map +1 -0
  363. package/dist/physics/body/body-type/schema.d.ts +4 -0
  364. package/dist/physics/body/body-type/schema.js +3 -0
  365. package/dist/physics/body/body-type/schema.js.map +1 -0
  366. package/dist/physics/body/collider-mesh.d.ts +11 -0
  367. package/dist/physics/body/collider-mesh.js +3 -0
  368. package/dist/physics/body/collider-mesh.js.map +1 -0
  369. package/dist/physics/body/collider-shape/collider-shape.d.ts +15 -0
  370. package/dist/physics/body/collider-shape/collider-shape.js +3 -0
  371. package/dist/physics/body/collider-shape/collider-shape.js.map +1 -0
  372. package/dist/physics/body/collider-shape/list.d.ts +3 -0
  373. package/dist/physics/body/collider-shape/list.js +5 -0
  374. package/dist/physics/body/collider-shape/list.js.map +1 -0
  375. package/dist/physics/body/collider-shape/mass-properties.d.ts +10 -0
  376. package/dist/physics/body/collider-shape/mass-properties.js +48 -0
  377. package/dist/physics/body/collider-shape/mass-properties.js.map +1 -0
  378. package/dist/physics/body/collider-shape/public.d.ts +4 -0
  379. package/dist/physics/body/collider-shape/public.js +6 -0
  380. package/dist/physics/body/collider-shape/public.js.map +1 -0
  381. package/dist/physics/body/collider-shape/schema.d.ts +4 -0
  382. package/dist/physics/body/collider-shape/schema.js +3 -0
  383. package/dist/physics/body/collider-shape/schema.js.map +1 -0
  384. package/dist/physics/body/collider-shape/to-index.d.ts +3 -0
  385. package/dist/physics/body/collider-shape/to-index.js +6 -0
  386. package/dist/physics/body/collider-shape/to-index.js.map +1 -0
  387. package/dist/physics/body/rigid-body.d.ts +23 -0
  388. package/dist/physics/body/rigid-body.js +3 -0
  389. package/dist/physics/body/rigid-body.js.map +1 -0
  390. package/dist/physics/body/static-collider.d.ts +25 -0
  391. package/dist/physics/body/static-collider.js +3 -0
  392. package/dist/physics/body/static-collider.js.map +1 -0
  393. package/dist/physics/joint/joint-plugin.d.ts +88 -0
  394. package/dist/physics/joint/joint-plugin.js +32 -0
  395. package/dist/physics/joint/joint-plugin.js.map +1 -0
  396. package/dist/physics/joint/joint-type/joint-type.d.ts +15 -0
  397. package/dist/physics/joint/joint-type/joint-type.js +3 -0
  398. package/dist/physics/joint/joint-type/joint-type.js.map +1 -0
  399. package/dist/physics/joint/joint-type/public.d.ts +1 -0
  400. package/dist/physics/joint/joint-type/public.js +3 -0
  401. package/dist/physics/joint/joint-type/public.js.map +1 -0
  402. package/dist/physics/joint/joint-type/schema.d.ts +4 -0
  403. package/dist/physics/joint/joint-type/schema.js +3 -0
  404. package/dist/physics/joint/joint-type/schema.js.map +1 -0
  405. package/dist/physics/joint/joint.d.ts +24 -0
  406. package/dist/physics/joint/joint.js +3 -0
  407. package/dist/physics/joint/joint.js.map +1 -0
  408. package/dist/physics/physics-clock-plugin.d.ts +86 -0
  409. package/dist/physics/physics-clock-plugin.js +37 -0
  410. package/dist/physics/physics-clock-plugin.js.map +1 -0
  411. package/dist/physics/physics-clock.test.d.ts +1 -0
  412. package/dist/physics/physics-clock.test.js +45 -0
  413. package/dist/physics/physics-clock.test.js.map +1 -0
  414. package/dist/physics/physics-data-plugin.d.ts +348 -0
  415. package/dist/physics/physics-data-plugin.js +71 -0
  416. package/dist/physics/physics-data-plugin.js.map +1 -0
  417. package/dist/physics/ragdoll/fit-bone-capsules.d.ts +39 -0
  418. package/dist/physics/ragdoll/fit-bone-capsules.js +87 -0
  419. package/dist/physics/ragdoll/fit-bone-capsules.js.map +1 -0
  420. package/dist/physics/ragdoll/fit-bone-capsules.test.d.ts +1 -0
  421. package/dist/physics/ragdoll/fit-bone-capsules.test.js +67 -0
  422. package/dist/physics/ragdoll/fit-bone-capsules.test.js.map +1 -0
  423. package/dist/physics/solvers/jolt-solver-plugin.d.ts +465 -0
  424. package/dist/physics/solvers/jolt-solver-plugin.js +440 -0
  425. package/dist/physics/solvers/jolt-solver-plugin.js.map +1 -0
  426. package/dist/physics/solvers/rapier-jolt.benchmark.test.d.ts +1 -0
  427. package/dist/physics/solvers/rapier-jolt.benchmark.test.js +35 -0
  428. package/dist/physics/solvers/rapier-jolt.benchmark.test.js.map +1 -0
  429. package/dist/physics/solvers/rapier-solver-plugin.d.ts +444 -0
  430. package/dist/physics/solvers/rapier-solver-plugin.js +284 -0
  431. package/dist/physics/solvers/rapier-solver-plugin.js.map +1 -0
  432. package/dist/physics/solvers/solver-benchmark.d.ts +45 -0
  433. package/dist/physics/solvers/solver-benchmark.js +115 -0
  434. package/dist/physics/solvers/solver-benchmark.js.map +1 -0
  435. package/package.json +34 -0
  436. package/src/core/core-plugin.ts +92 -0
  437. package/src/core/frame-time/frame-time-plugin.ts +44 -0
  438. package/src/core/frame-time/frame-time.ts +21 -0
  439. package/src/core/frame-time/public.ts +3 -0
  440. package/src/graphics/animation/animation-data-plugin.ts +119 -0
  441. package/src/graphics/animation/animation-plugin.test.ts +161 -0
  442. package/src/graphics/animation/animation-plugin.ts +26 -0
  443. package/src/graphics/animation/animation-track/animation-track.ts +17 -0
  444. package/src/graphics/animation/animation-track/componentwise-lerp.ts +24 -0
  445. package/src/graphics/animation/animation-track/interpolate.ts +24 -0
  446. package/src/graphics/animation/animation-track/public.ts +3 -0
  447. package/src/graphics/animation/animation-track/sample.ts +48 -0
  448. package/src/graphics/animation/interpolation-mode/interpolation-mode.ts +8 -0
  449. package/src/graphics/animation/interpolation-mode/public.ts +3 -0
  450. package/src/graphics/animation/interpolation-mode/schema.ts +5 -0
  451. package/src/graphics/camera/camera-plugin.ts +37 -0
  452. package/src/graphics/camera/camera.ts +8 -0
  453. package/src/graphics/camera/orbit/attach-orbit-drag.ts +62 -0
  454. package/src/graphics/camera/orbit/orbit-data-plugin.ts +44 -0
  455. package/src/graphics/camera/orbit/orbit-plugin.ts +13 -0
  456. package/src/graphics/camera/orbit/orbit-system-plugin.ts +74 -0
  457. package/src/graphics/camera/orbit/orbit.ts +36 -0
  458. package/src/graphics/camera/orbit/public.ts +7 -0
  459. package/src/graphics/camera/public.ts +6 -0
  460. package/src/graphics/camera/schema.ts +21 -0
  461. package/src/graphics/camera/screen-to-world-ray.ts +47 -0
  462. package/src/graphics/camera/to-view-projection.ts +29 -0
  463. package/src/graphics/graphics-plugin.ts +108 -0
  464. package/src/graphics/picking/pick-hit.ts +13 -0
  465. package/src/graphics/picking/picking-plugin.ts +101 -0
  466. package/src/graphics/plugins.md +120 -0
  467. package/src/graphics/rendering/bone-collider-plugin.ts +182 -0
  468. package/src/graphics/rendering/display-transform-plugin.ts +26 -0
  469. package/src/graphics/rendering/ibl-render/brdf.wgsl.ts +43 -0
  470. package/src/graphics/rendering/ibl-render/ibl/brdf-lut.ts +101 -0
  471. package/src/graphics/rendering/ibl-render/ibl/build-ibl-resources.ts +57 -0
  472. package/src/graphics/rendering/ibl-render/ibl/create-cubemap.ts +17 -0
  473. package/src/graphics/rendering/ibl-render/ibl/cube-face-view.ts +11 -0
  474. package/src/graphics/rendering/ibl-render/ibl/cubemap-sample-view.ts +9 -0
  475. package/src/graphics/rendering/ibl-render/ibl/environment.ts +190 -0
  476. package/src/graphics/rendering/ibl-render/ibl/float-to-half.ts +35 -0
  477. package/src/graphics/rendering/ibl-render/ibl/ibl-math.wgsl.ts +60 -0
  478. package/src/graphics/rendering/ibl-render/ibl/irradiance.ts +105 -0
  479. package/src/graphics/rendering/ibl-render/ibl/parse-hdr.ts +108 -0
  480. package/src/graphics/rendering/ibl-render/ibl/prefilter.ts +121 -0
  481. package/src/graphics/rendering/ibl-render/ibl/render-helpers.ts +17 -0
  482. package/src/graphics/rendering/ibl-render/ibl-render-plugin.ts +415 -0
  483. package/src/graphics/rendering/ibl-render/ibl-shader.wgsl.ts +185 -0
  484. package/src/graphics/rendering/ibl-render/skybox-shader.wgsl.ts +51 -0
  485. package/src/graphics/rendering/interpolation-plugin.ts +97 -0
  486. package/src/graphics/rendering/interpolation.test.ts +52 -0
  487. package/src/graphics/rendering/jolt-ragdoll-plugin.ts +174 -0
  488. package/src/graphics/rendering/material-gpu/material-arrays.ts +113 -0
  489. package/src/graphics/rendering/material-gpu/material-bind-group.ts +61 -0
  490. package/src/graphics/rendering/material-gpu/material-gpu-plugin.ts +95 -0
  491. package/src/graphics/rendering/model-collider-plugin.ts +77 -0
  492. package/src/graphics/rendering/pbr-core-plugin.ts +40 -0
  493. package/src/graphics/rendering/pbr-render/pbr-array-shader.wgsl.ts +146 -0
  494. package/src/graphics/rendering/pbr-render/pbr-render-plugin.ts +247 -0
  495. package/src/graphics/rendering/pbr-render/physics-bridge-plugin.ts +106 -0
  496. package/src/graphics/rendering/ragdoll-trigger-plugin.ts +21 -0
  497. package/src/graphics/rendering/rendering-plugin.ts +3 -0
  498. package/src/graphics/rendering/skinning/skinning-attributes/layout.ts +20 -0
  499. package/src/graphics/rendering/skinning/skinning-attributes/public.ts +3 -0
  500. package/src/graphics/rendering/skinning/skinning-attributes/skinning-attributes.ts +3 -0
  501. package/src/graphics/rendering/skinning/skinning-plugin.ts +213 -0
  502. package/src/graphics/rendering/standard-vertex/layout.ts +19 -0
  503. package/src/graphics/rendering/standard-vertex/public.ts +4 -0
  504. package/src/graphics/rendering/standard-vertex/schema.ts +17 -0
  505. package/src/graphics/rendering/standard-vertex/standard-vertex.ts +8 -0
  506. package/src/graphics/rendering/visible-material/color-material-options.ts +10 -0
  507. package/src/graphics/rendering/visible-material/create-bind-group-layout.ts +35 -0
  508. package/src/graphics/rendering/visible-material/create-color-bind-group.ts +40 -0
  509. package/src/graphics/rendering/visible-material/public.ts +6 -0
  510. package/src/graphics/rendering/visible-material/schema.ts +25 -0
  511. package/src/graphics/rendering/visible-material/visible-material.ts +8 -0
  512. package/src/graphics/scene/light/light-plugin.ts +37 -0
  513. package/src/graphics/scene/light/light.ts +18 -0
  514. package/src/graphics/scene/light/public.ts +1 -0
  515. package/src/graphics/scene/model/geometry/geometry.ts +12 -0
  516. package/src/graphics/scene/model/geometry/public.ts +4 -0
  517. package/src/graphics/scene/model/gltf/accessor-view.ts +53 -0
  518. package/src/graphics/scene/model/gltf/build-material-bind-group.ts +110 -0
  519. package/src/graphics/scene/model/gltf/compute-world-matrices.ts +43 -0
  520. package/src/graphics/scene/model/gltf/create-color-material.ts +47 -0
  521. package/src/graphics/scene/model/gltf/decode-images.ts +93 -0
  522. package/src/graphics/scene/model/gltf/gltf-schema.ts +161 -0
  523. package/src/graphics/scene/model/gltf/load-gltf-model.ts +220 -0
  524. package/src/graphics/scene/model/gltf/pack-vertex-buffer.ts +116 -0
  525. package/src/graphics/scene/model/gltf/parse-animations.ts +66 -0
  526. package/src/graphics/scene/model/gltf/parse-glb.ts +51 -0
  527. package/src/graphics/scene/model/gltf/parse-skin.ts +67 -0
  528. package/src/graphics/scene/model/model-loader-plugin.ts +131 -0
  529. package/src/graphics/scene/model/model-plugin.ts +46 -0
  530. package/src/graphics/scene/model/model.ts +15 -0
  531. package/src/graphics/scene/model/public.ts +1 -0
  532. package/src/graphics/scene/model/shape/convex-hull.test.ts +72 -0
  533. package/src/graphics/scene/model/shape/convex-hull.ts +141 -0
  534. package/src/graphics/scene/model/shape/shape-geometry-plugin.ts +61 -0
  535. package/src/graphics/scene/model/shape/shape-mesh.ts +150 -0
  536. package/src/graphics/scene/model/shape/upload-shape-mesh.ts +14 -0
  537. package/src/graphics/scene/model/world-bounds-plugin.ts +88 -0
  538. package/src/graphics/scene/node/node-data-plugin.ts +28 -0
  539. package/src/graphics/scene/node/node-plugin.ts +13 -0
  540. package/src/graphics/scene/node/node.ts +23 -0
  541. package/src/graphics/scene/node/public.ts +1 -0
  542. package/src/graphics/scene/node/transform-plugin.ts +72 -0
  543. package/src/graphics/scene/scene-plugin.ts +20 -0
  544. package/src/graphics/scene/scene-uniforms/create-bind-group-layout.ts +19 -0
  545. package/src/graphics/scene/scene-uniforms/public.ts +5 -0
  546. package/src/graphics/scene/scene-uniforms/scene-uniforms-plugin.ts +64 -0
  547. package/src/graphics/scene/scene-uniforms/scene-uniforms.ts +15 -0
  548. package/src/graphics/scene/scene-uniforms/schema.ts +17 -0
  549. package/src/index.ts +72 -0
  550. package/src/material/material-plugin.ts +61 -0
  551. package/src/material/material.ts +38 -0
  552. package/src/material/public.ts +4 -0
  553. package/src/material/standard-materials.ts +43 -0
  554. package/src/physics/README.md +71 -0
  555. package/src/physics/body/body-type/body-type.ts +14 -0
  556. package/src/physics/body/body-type/is-dynamic.ts +8 -0
  557. package/src/physics/body/body-type/public.ts +4 -0
  558. package/src/physics/body/body-type/schema.ts +5 -0
  559. package/src/physics/body/collider-mesh.ts +13 -0
  560. package/src/physics/body/collider-shape/collider-shape.ts +19 -0
  561. package/src/physics/body/collider-shape/list.ts +7 -0
  562. package/src/physics/body/collider-shape/mass-properties.ts +47 -0
  563. package/src/physics/body/collider-shape/public.ts +6 -0
  564. package/src/physics/body/collider-shape/schema.ts +5 -0
  565. package/src/physics/body/collider-shape/to-index.ts +8 -0
  566. package/src/physics/body/rigid-body.ts +26 -0
  567. package/src/physics/body/static-collider.ts +28 -0
  568. package/src/physics/joint/joint-plugin.ts +33 -0
  569. package/src/physics/joint/joint-type/joint-type.ts +19 -0
  570. package/src/physics/joint/joint-type/public.ts +3 -0
  571. package/src/physics/joint/joint-type/schema.ts +5 -0
  572. package/src/physics/joint/joint.ts +27 -0
  573. package/src/physics/physics-clock-plugin.ts +61 -0
  574. package/src/physics/physics-clock.test.ts +55 -0
  575. package/src/physics/physics-data-plugin.ts +73 -0
  576. package/src/physics/ragdoll/fit-bone-capsules.test.ts +66 -0
  577. package/src/physics/ragdoll/fit-bone-capsules.ts +106 -0
  578. package/src/physics/solvers/README.md +63 -0
  579. package/src/physics/solvers/jolt-solver-plugin.ts +382 -0
  580. package/src/physics/solvers/rapier-jolt.benchmark.test.ts +39 -0
  581. package/src/physics/solvers/rapier-solver-plugin.ts +251 -0
  582. package/src/physics/solvers/solver-benchmark.ts +172 -0
  583. package/tsconfig.json +25 -0
  584. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,251 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import RAPIER from "@dimforge/rapier3d-compat";
4
+ import { Database, type Entity } from "@adobe/data/ecs";
5
+ import { True } from "@adobe/data/schema";
6
+ import { physicsClock } from "../physics-clock-plugin.js";
7
+ import { physicsData } from "../physics-data-plugin.js";
8
+ import { jointData } from "../joint/joint-plugin.js";
9
+ import { BodyType } from "../body/body-type/body-type.js";
10
+ import { ColliderShape } from "../body/collider-shape/collider-shape.js";
11
+
12
+ /**
13
+ * A second rigid-body solver behind the same `physicsData` seam — the
14
+ * battle-tested Rapier engine (dimforge, Rust→WASM). It reads the identical
15
+ * authored components (`RigidBody` + `StaticCollider`) and writes back
16
+ * `position`/`rotation`/velocity for dynamic bodies, exactly like `joltSolver`,
17
+ * so the same scene runs unchanged on either solver.
18
+ *
19
+ * Rapier's WASM must be initialised before use; per the repo's no-top-level-await
20
+ * rule, the init promise lives in the system closure and is awaited lazily — the
21
+ * system no-ops until the world exists, then runs every frame.
22
+ */
23
+
24
+ const GRAVITY = 18; // matches joltSolver so the two solvers are directly comparable
25
+
26
+ const RIGID = ["bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"] as const;
27
+ const STATIC = ["colliderShape", "halfExtents", "material", "position", "rotation"] as const;
28
+ // Dynamic bodies carry the derived prev-pose snapshot (added on first sync) used
29
+ // for render interpolation; this query reads/writes it alongside the live pose.
30
+ const SNAPSHOT = ["bodyType", "position", "rotation", "_prevPosition", "_prevRotation"] as const;
31
+ // Sync only over bodies not yet mirrored into Rapier: a private `_rapierBody`
32
+ // tag is added once a body is created, and excluded here, so steady state
33
+ // iterates zero rows (archetype-level) instead of re-scanning every body each
34
+ // frame — the win for the "many static, few dynamic" target.
35
+ const NEW_RIGID = { exclude: ["_rapierBody"] } as const;
36
+ const NEW_STATIC = { exclude: ["linearVelocity", "_rapierBody"] } as const;
37
+ // Kinematic bodies, by archetype shape (no per-row value test): they have
38
+ // `bodyType` (so not a StaticCollider) and are mirrored (`_rapierBody`) but never
39
+ // gained `_prevPosition` (only dynamics do) — so excluding it isolates kinematics.
40
+ const KINEMATIC = ["bodyType", "position", "rotation", "_rapierBody"] as const;
41
+ const KINEMATIC_ONLY = { exclude: ["_prevPosition"] } as const;
42
+ const JOINT = ["jointType", "jointBodyA", "jointBodyB", "jointAnchorA", "jointAnchorB", "jointAxis", "jointMinLimit", "jointMaxLimit", "jointSwingLimit"] as const;
43
+ const NEW_JOINT = { exclude: ["_rapierJoint"] } as const;
44
+
45
+ interface MatProps { density: number; restitution: number; friction: number }
46
+
47
+ export const rapierSolver = Database.Plugin.create({
48
+ extends: Database.Plugin.combine(physicsData, jointData, physicsClock),
49
+ components: {
50
+ _rapierBody: True.schema, // tag: this body has been mirrored into the Rapier world
51
+ _rapierJoint: True.schema, // tag: this joint has been mirrored into the Rapier world
52
+ },
53
+ systems: {
54
+ rapierStep: {
55
+ schedule: { during: ["physics"], after: ["advancePhysicsClock"] },
56
+ create: db => {
57
+ let world: RAPIER.World | null = null;
58
+ let initStarted = false;
59
+ const bodies = new Map<Entity, RAPIER.RigidBody>(); // entity → Rapier body
60
+
61
+ const matPropsOf = (id: Entity): MatProps => {
62
+ // Material entities carry density/restitution/friction (read once at body creation).
63
+ const m = db.store.read(id) as { density?: number; restitution?: number; friction?: number } | null;
64
+ return { density: m?.density ?? 1, restitution: m?.restitution ?? 0.2, friction: m?.friction ?? 0.5 };
65
+ };
66
+
67
+ // hull/mesh colliders may be auto-generated from a model that's still
68
+ // loading — defer mirroring such a body until its collision data exists.
69
+ const colliderReady = (id: Entity, shape: ColliderShape): boolean => {
70
+ if (shape !== "hull" && shape !== "mesh") return true;
71
+ const r = db.store.read(id) as { convexPoints?: unknown; colliderMesh?: unknown } | null;
72
+ return !!(r?.convexPoints || r?.colliderMesh);
73
+ };
74
+
75
+ const ensureBody = (id: Entity, motion: BodyType, shape: ColliderShape, hx: number, hy: number, hz: number, mat: Entity, px: number, py: number, pz: number, q: ArrayLike<number>, vx: number, vy: number, vz: number, wx: number, wy: number, wz: number): void => {
76
+ if (!world || bodies.has(id)) return;
77
+ const m = matPropsOf(mat);
78
+ // dynamic = simulated; kinematic = position-driven (pushes dynamics,
79
+ // isn't pushed back); fixed = immovable collider.
80
+ const desc = motion === "dynamic" ? RAPIER.RigidBodyDesc.dynamic()
81
+ : motion === "kinematic" ? RAPIER.RigidBodyDesc.kinematicPositionBased()
82
+ : RAPIER.RigidBodyDesc.fixed();
83
+ desc.setTranslation(px, py, pz).setRotation({ x: q[0], y: q[1], z: q[2], w: q[3] });
84
+ if (motion === "dynamic") { desc.setLinvel(vx, vy, vz); desc.setAngvel({ x: wx, y: wy, z: wz }); }
85
+ const body = world.createRigidBody(desc);
86
+ // capsule: Y-aligned, halfHeight = cylinder half (hy), radius = hx.
87
+ // hull: convex hull of the authored point cloud (read once here).
88
+ let col: RAPIER.ColliderDesc | null;
89
+ if (shape === "sphere") col = RAPIER.ColliderDesc.ball(hx);
90
+ else if (shape === "capsule") col = RAPIER.ColliderDesc.capsule(hy, hx);
91
+ else if (shape === "hull") {
92
+ const pts = (db.store.read(id) as { convexPoints?: Float32Array | null }).convexPoints;
93
+ col = pts ? RAPIER.ColliderDesc.convexHull(pts) : null;
94
+ if (!col) col = RAPIER.ColliderDesc.ball(Math.max(hx, 0.1)); // degenerate cloud fallback
95
+ } else if (shape === "mesh") {
96
+ const cm = (db.store.read(id) as { colliderMesh?: { positions: Float32Array; indices: Uint32Array } | null }).colliderMesh;
97
+ col = cm ? RAPIER.ColliderDesc.trimesh(cm.positions, cm.indices) : RAPIER.ColliderDesc.cuboid(0.1, 0.1, 0.1);
98
+ } else col = RAPIER.ColliderDesc.cuboid(hx, hy, hz);
99
+ col.setRestitution(m.restitution).setFriction(m.friction).setDensity(m.density);
100
+ // collisionGroup g (>0): membership bit g, collide with everything
101
+ // except bit g — so same-group bodies (e.g. a ragdoll's bones) skip
102
+ // each other but still hit the world (group 0).
103
+ const g = (db.store.read(id) as { collisionGroup?: number } | null)?.collisionGroup ?? 0;
104
+ if (g > 0) { const bit = 1 << (g & 15); col.setCollisionGroups(((bit << 16) | (0xffff & ~bit)) >>> 0); }
105
+ world.createCollider(col, body);
106
+ bodies.set(id, body);
107
+ };
108
+
109
+ return () => {
110
+ if (!world) {
111
+ if (!initStarted) {
112
+ initStarted = true;
113
+ RAPIER.init().then(() => { world = new RAPIER.World({ x: 0, y: -GRAVITY, z: 0 }); });
114
+ }
115
+ return; // WASM not ready yet
116
+ }
117
+
118
+ // sync: mirror only bodies not yet in Rapier (excluded by tag),
119
+ // then tag them. Iterate tail→head since every row migrates out
120
+ // on tagging. Reads use column accessors (robust to the migration;
121
+ // this loop only touches genuinely-new bodies, so it's cold).
122
+ for (const arch of db.store.queryArchetypes(RIGID, NEW_RIGID)) {
123
+ const ids = arch.columns.id, bt = arch.columns.bodyType, cs = arch.columns.colliderShape, mat = arch.columns.material;
124
+ const he = arch.columns.halfExtents, pos = arch.columns.position, ori = arch.columns.rotation, lv = arch.columns.linearVelocity, av = arch.columns.angularVelocity;
125
+ for (let r = arch.rowCount - 1; r >= 0; r--) {
126
+ const id = ids.get(r), bodyType = bt.get(r), shape = cs.get(r), h = he.get(r), p = pos.get(r), o = ori.get(r), v = lv.get(r), w = av.get(r);
127
+ if (!colliderReady(id, shape)) continue; // auto-collider not generated yet
128
+ ensureBody(id, bodyType, shape, h[0], h[1], h[2], mat.get(r), p[0], p[1], p[2], o, v[0], v[1], v[2], w[0], w[1], w[2]);
129
+ // Tag as mirrored. Dynamics also migrate onto the derived prev-pose
130
+ // snapshot (the interpolator reads it); kinematic bodies are authored
131
+ // each frame, so they render at the live pose with no snapshot — the
132
+ // _prevPosition absence is exactly what the kinematic-drive query keys on.
133
+ db.store.update(id, BodyType.isDynamic(bodyType) ? { _rapierBody: true, _prevPosition: p, _prevRotation: o } : { _rapierBody: true });
134
+ }
135
+ }
136
+ for (const arch of db.store.queryArchetypes(STATIC, NEW_STATIC)) {
137
+ const ids = arch.columns.id, cs = arch.columns.colliderShape, mat = arch.columns.material;
138
+ const he = arch.columns.halfExtents, pos = arch.columns.position, ori = arch.columns.rotation;
139
+ for (let r = arch.rowCount - 1; r >= 0; r--) {
140
+ const id = ids.get(r), shape = cs.get(r), h = he.get(r), p = pos.get(r);
141
+ if (!colliderReady(id, shape)) continue; // auto-collider not generated yet
142
+ ensureBody(id, "static", shape, h[0], h[1], h[2], mat.get(r), p[0], p[1], p[2], ori.get(r), 0, 0, 0, 0, 0, 0);
143
+ db.store.update(id, { _rapierBody: true });
144
+ }
145
+ }
146
+
147
+ // Mirror new joints once both their bodies exist (tag + exclude;
148
+ // tail→head since tagging migrates the row). Anchors are body-local.
149
+ for (const arch of db.store.queryArchetypes(JOINT, NEW_JOINT)) {
150
+ const ids = arch.columns.id, jt = arch.columns.jointType;
151
+ const ba = arch.columns.jointBodyA, bb = arch.columns.jointBodyB;
152
+ const aa = arch.columns.jointAnchorA, ab = arch.columns.jointAnchorB, axc = arch.columns.jointAxis;
153
+ const lo = arch.columns.jointMinLimit, hi = arch.columns.jointMaxLimit;
154
+ for (let r = arch.rowCount - 1; r >= 0; r--) {
155
+ const a = bodies.get(ba.get(r)), b = bodies.get(bb.get(r));
156
+ if (!a || !b) continue; // a body isn't mirrored yet — retry next frame
157
+ const type = jt.get(r), pa = aa.get(r), pb = ab.get(r), ax = axc.get(r), min = lo.get(r), max = hi.get(r);
158
+ const A = { x: pa[0], y: pa[1], z: pa[2] }, B = { x: pb[0], y: pb[1], z: pb[2] };
159
+ let jd: RAPIER.JointData;
160
+ if (type === "fixed") jd = RAPIER.JointData.fixed(A, { x: 0, y: 0, z: 0, w: 1 }, B, { x: 0, y: 0, z: 0, w: 1 });
161
+ else if (type === "hinge") { jd = RAPIER.JointData.revolute(A, B, { x: ax[0], y: ax[1], z: ax[2] }); if (min < max) { jd.limitsEnabled = true; jd.limits = [min, max]; } }
162
+ // point — and cone: the rapier3d-compat binding has no cone/swing-twist
163
+ // limit, so a `cone` joint is approximated as a free spherical (use joltSolver
164
+ // for anatomical ragdoll limits; see physics/README.md).
165
+ else jd = RAPIER.JointData.spherical(A, B);
166
+ world.createImpulseJoint(jd, a, b, true);
167
+ db.store.update(ids.get(r), { _rapierJoint: true });
168
+ }
169
+ }
170
+
171
+ // Step on the fixed clock: 0..N steps of `fixedDt` this frame
172
+ // (decoupled from the render rate). On a stepping frame, snapshot
173
+ // the pose entering the final step into `_prevPosition`/`_prevRotation`
174
+ // first, so the pre-render interpolator can blend prev→current.
175
+ const clock = db.store.resources.physicsClock;
176
+ const steps = clock.steps;
177
+ if (steps === 0) return; // no sim time accrued — leave pose + snapshot intact
178
+
179
+ // Drive kinematic bodies to their authored pose: Rapier moves a
180
+ // position-based kinematic toward the target over the step, deriving
181
+ // the velocity that pushes dynamics. (Author the pose however you like —
182
+ // a system, animation, input — the solver just follows it.)
183
+ const toFlip: Entity[] = []; // kinematic bodies whose bodyType became "dynamic" (ragdoll)
184
+ for (const arch of db.store.queryArchetypes(KINEMATIC, KINEMATIC_ONLY)) {
185
+ const ids = arch.columns.id, bt = arch.columns.bodyType;
186
+ const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
187
+ for (let r = 0; r < arch.rowCount; r++) {
188
+ const body = bodies.get(ids.get(r));
189
+ if (!body) continue;
190
+ if (bt.get(r) === "dynamic") { toFlip.push(ids.get(r)); continue; }
191
+ const r3 = r * 3, r4 = r * 4;
192
+ body.setNextKinematicTranslation({ x: pos[r3], y: pos[r3 + 1], z: pos[r3 + 2] });
193
+ body.setNextKinematicRotation({ x: ori[r4], y: ori[r4 + 1], z: ori[r4 + 2], w: ori[r4 + 3] });
194
+ }
195
+ }
196
+ // Flip kinematic→dynamic (after the loop, since migrating the row moves the
197
+ // typed arrays): the engine body becomes dynamic and it gains the prev-pose
198
+ // snapshot, so from now on it's simulated + written back like any dynamic body.
199
+ for (const id of toFlip) {
200
+ const body = bodies.get(id);
201
+ if (!body) continue;
202
+ body.setBodyType(RAPIER.RigidBodyType.Dynamic, true);
203
+ const rec = db.store.read(id) as { position: ArrayLike<number>; rotation: ArrayLike<number> };
204
+ db.store.update(id, {
205
+ _prevPosition: [rec.position[0], rec.position[1], rec.position[2]],
206
+ _prevRotation: [rec.rotation[0], rec.rotation[1], rec.rotation[2], rec.rotation[3]],
207
+ });
208
+ }
209
+ for (const arch of db.store.queryArchetypes(SNAPSHOT)) {
210
+ const bt = arch.columns.bodyType;
211
+ const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
212
+ const pp = arch.columns._prevPosition.getTypedArray(), pr = arch.columns._prevRotation.getTypedArray();
213
+ for (let r = 0; r < arch.rowCount; r++) {
214
+ if (!BodyType.isDynamic(bt.get(r))) continue;
215
+ const r3 = r * 3, r4 = r * 4;
216
+ pp[r3] = pos[r3]; pp[r3 + 1] = pos[r3 + 1]; pp[r3 + 2] = pos[r3 + 2];
217
+ pr[r4] = ori[r4]; pr[r4 + 1] = ori[r4 + 1]; pr[r4 + 2] = ori[r4 + 2]; pr[r4 + 3] = ori[r4 + 3];
218
+ }
219
+ }
220
+ world.timestep = clock.fixedDt;
221
+ for (let s = 0; s < steps; s++) world.step();
222
+
223
+ // write the dynamic bodies' new pose + velocity back onto the canonical columns
224
+ for (const arch of db.store.queryArchetypes(RIGID)) {
225
+ const ids = arch.columns.id, bt = arch.columns.bodyType;
226
+ const pos = arch.columns.position.getTypedArray(), ori = arch.columns.rotation.getTypedArray();
227
+ const lv = arch.columns.linearVelocity.getTypedArray(), av = arch.columns.angularVelocity.getTypedArray();
228
+ for (let r = 0; r < arch.rowCount; r++) {
229
+ if (!BodyType.isDynamic(bt.get(r))) continue;
230
+ const body = bodies.get(ids.get(r));
231
+ if (!body) continue;
232
+ // PERF residual: rapier3d-compat returns a fresh {x,y,z}/{x,y,z,w}
233
+ // object from each of these getters → ~4 small allocations per
234
+ // dynamic body per frame (GC pressure). It scales with the *dynamic*
235
+ // count only (small for our target), and the compat binding offers
236
+ // no out-param read, so it's left as-is. If dynamic counts ever get
237
+ // large, drop to rapier's raw bindings (rawBodies / a flat buffer)
238
+ // to read straight into our typed arrays with zero allocation.
239
+ const t = body.translation(), rot = body.rotation(), v = body.linvel(), w = body.angvel();
240
+ const r3 = r * 3, r4 = r * 4;
241
+ pos[r3] = t.x; pos[r3 + 1] = t.y; pos[r3 + 2] = t.z;
242
+ ori[r4] = rot.x; ori[r4 + 1] = rot.y; ori[r4 + 2] = rot.z; ori[r4 + 3] = rot.w;
243
+ lv[r3] = v.x; lv[r3 + 1] = v.y; lv[r3 + 2] = v.z;
244
+ av[r3] = w.x; av[r3 + 1] = w.y; av[r3 + 2] = w.z;
245
+ }
246
+ }
247
+ };
248
+ },
249
+ },
250
+ },
251
+ });
@@ -0,0 +1,172 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database } from "@adobe/data/ecs";
4
+
5
+ /**
6
+ * Headless benchmark harness for a physics **solver plugin** (anything built on
7
+ * the `physicsData` seam — `rapierSolver`, `joltSolver`, …). It builds a fixed,
8
+ * deterministic scene (a floor + a grid of bodies dropped to pile up), then
9
+ * advances the simulation at a fixed timestep as fast as the CPU allows and
10
+ * reports the wall-clock cost per frame. No rendering, no rAF, no GPU — so the
11
+ * numbers reflect solver compute only and are directly comparable across plugins.
12
+ *
13
+ * Async because some solvers (Rapier) initialise WASM lazily; the warm-up phase
14
+ * yields to the event loop so that init + scene settling complete before timing.
15
+ */
16
+
17
+ export interface SolverBenchmarkOptions {
18
+ /** Dynamic bodies dropped into the scene (≈ workload size). Default 256. */
19
+ bodies?: number;
20
+ /** Timed frames. Default 300. */
21
+ frames?: number;
22
+ /** Warm-up frames before timing (lets async init finish + the pile settle). Default 90. */
23
+ warmupFrames?: number;
24
+ /** Fixed timestep per frame (seconds). Default 1/60. */
25
+ dt?: number;
26
+ /** Fraction of `bodies` that are spheres (rest are boxes). Default 0.5. */
27
+ sphereFraction?: number;
28
+ /** Extra *static* collider boxes laid out as resting scenery. They barely
29
+ * cost the engine (nothing moves) but they ARE mirrored once and then scanned
30
+ * by a naive per-frame sync — so this isolates the gather/sync overhead, which
31
+ * is the realistic "many static, few dynamic" target workload. Default 0. */
32
+ staticBodies?: number;
33
+ }
34
+
35
+ export interface SolverBenchmarkResult {
36
+ bodies: number;
37
+ frames: number;
38
+ /** Total wall-clock time of the timed frames (ms). */
39
+ totalMs: number;
40
+ /** Mean cost of one frame (ms) — the headline number. */
41
+ msPerFrame: number;
42
+ /** Simulation frames per real second (1000 / msPerFrame). */
43
+ simFps: number;
44
+ /** Slowest single frame (ms) — surfaces hitches. */
45
+ maxFrameMs: number;
46
+ // --- coarse end-state, for cross-solver parity / sanity (not perf) ---
47
+ avgY: number; // mean height of dynamic bodies (piled ≈ low, exploded ≈ wild)
48
+ maxSpeed: number; // fastest dynamic body (a stable pile is near 0)
49
+ belowFloor: number; // dynamic bodies that sank below the floor top (should be 0)
50
+ }
51
+
52
+ interface LooseStore {
53
+ archetypes: Record<string, { insert(v: unknown): number }>;
54
+ queryArchetypes(include: readonly string[], opts?: { exclude?: readonly string[] }): Iterable<{
55
+ rowCount: number;
56
+ columns: Record<string, { getTypedArray(): { [i: number]: number } }>;
57
+ }>;
58
+ resources: Record<string, unknown>;
59
+ }
60
+ interface LooseDb { store: LooseStore; system: { functions: Record<string, () => unknown>; order?: string[][] }; }
61
+
62
+ const yieldToEventLoop = () => new Promise<void>(r => setTimeout(r, 0));
63
+
64
+ export async function runSolverBenchmark(solver: Database.Plugin, opts: SolverBenchmarkOptions = {}): Promise<SolverBenchmarkResult> {
65
+ const bodies = opts.bodies ?? 256;
66
+ const frames = opts.frames ?? 300;
67
+ const warmupFrames = opts.warmupFrames ?? 90;
68
+ const dt = opts.dt ?? 1 / 60;
69
+ const sphereFraction = opts.sphereFraction ?? 0.5;
70
+ const staticBodies = opts.staticBodies ?? 0;
71
+
72
+ // The solver plugin extends `physicsData`, so the RigidBody / StaticCollider
73
+ // archetypes and the `frameTime` resource exist on the created database. The
74
+ // benchmark drives the sim dynamically, so the store is used through a loose
75
+ // shape (runtime invariant: these members exist on any physicsData solver).
76
+ const db = Database.create(solver) as unknown as LooseDb;
77
+
78
+ buildScene(db, bodies, sphereFraction, staticBodies);
79
+
80
+ // Drive one frame: set a fixed dt, then run every system except the rAF/clock
81
+ // ones (we supply dt ourselves so timing is deterministic and high-rate).
82
+ const order = db.system.order;
83
+ const names = order ? order.flat() : Object.keys(db.system.functions);
84
+ const runNames = names.filter(n => n !== "_frameTime" && n !== "schedulerSystem");
85
+ const tick = (f: number): void => {
86
+ db.store.resources.frameTime = { now: f * dt * 1000, dt, elapsed: f * dt };
87
+ for (const n of runNames) { const fn = db.system.functions[n]; if (fn) fn(); }
88
+ };
89
+
90
+ // Warm-up: yield to the event loop so lazy WASM init (Rapier) completes and
91
+ // the pile settles into a steady-state contact count before we measure.
92
+ for (let f = 0; f < warmupFrames; f++) { tick(f); await yieldToEventLoop(); }
93
+
94
+ // Timed run: tight synchronous loop — pure solver compute.
95
+ let maxFrameMs = 0;
96
+ const t0 = performance.now();
97
+ for (let f = 0; f < frames; f++) {
98
+ const a = performance.now();
99
+ tick(warmupFrames + f);
100
+ const ms = performance.now() - a;
101
+ if (ms > maxFrameMs) maxFrameMs = ms;
102
+ }
103
+ const totalMs = performance.now() - t0;
104
+
105
+ const { avgY, maxSpeed, belowFloor } = sampleState(db);
106
+ return {
107
+ bodies, frames,
108
+ totalMs, msPerFrame: totalMs / frames, simFps: 1000 / (totalMs / frames), maxFrameMs,
109
+ avgY, maxSpeed, belowFloor,
110
+ };
111
+ }
112
+
113
+ /** A thick static floor + `bodies` dynamic bodies in a compact cube grid that
114
+ * drops a short distance and piles up — a steady-state contact workload. The
115
+ * floor is deliberately thick (a finite box has a far side) and the drop is
116
+ * short, so a correct solver never tunnels: end-state avgY/maxV then cleanly
117
+ * separate a stable solver from an exploding one. Optional `staticBodies` adds
118
+ * resting static scenery to exercise the sync/gather path at scale. */
119
+ function buildScene(db: LooseDb, bodies: number, sphereFraction: number, staticBodies: number): void {
120
+ db.store.archetypes.StaticCollider.insert({
121
+ colliderShape: "box", halfExtents: [12, 2, 12], material: 0,
122
+ position: [0, -2, 0], rotation: [0, 0, 0, 1], // top face at y = 0
123
+ });
124
+ // resting static scenery far from the action (negligible engine cost, but it
125
+ // is mirrored once and then scanned every frame by a naive per-frame sync)
126
+ if (staticBodies > 0) {
127
+ const side = Math.ceil(Math.cbrt(staticBodies));
128
+ let n = 0;
129
+ for (let x = 0; x < side && n < staticBodies; x++)
130
+ for (let y = 0; y < side && n < staticBodies; y++)
131
+ for (let z = 0; z < side && n < staticBodies; z++, n++)
132
+ db.store.archetypes.StaticCollider.insert({
133
+ colliderShape: "box", halfExtents: [0.4, 0.4, 0.4], material: 0,
134
+ position: [100 + x, y, z], rotation: [0, 0, 0, 1],
135
+ });
136
+ }
137
+ const side = Math.ceil(Math.cbrt(bodies));
138
+ const gap = 1.5, base = -((side - 1) / 2) * gap; // spaced so the initial drop is non-overlapping
139
+ let n = 0;
140
+ for (let y = 0; y < side && n < bodies; y++) {
141
+ for (let x = 0; x < side && n < bodies; x++) {
142
+ for (let z = 0; z < side && n < bodies; z++, n++) {
143
+ const sphere = ((n * 0x9e3779b1) >>> 0) / 4294967296 < sphereFraction;
144
+ db.store.archetypes.RigidBody.insert({
145
+ bodyType: "dynamic",
146
+ colliderShape: sphere ? "sphere" : "box",
147
+ halfExtents: sphere ? [0.45, 0, 0] : [0.45, 0.45, 0.45],
148
+ material: 0,
149
+ position: [base + x * gap, 0.6 + y * gap, base + z * gap],
150
+ rotation: [0, 0, 0, 1],
151
+ linearVelocity: [0, 0, 0],
152
+ angularVelocity: [0, 0, 0],
153
+ });
154
+ }
155
+ }
156
+ }
157
+ }
158
+
159
+ function sampleState(db: LooseDb): { avgY: number; maxSpeed: number; belowFloor: number } {
160
+ let count = 0, sumY = 0, maxSpeed = 0, belowFloor = 0;
161
+ for (const arch of db.store.queryArchetypes(["linearVelocity", "position"])) {
162
+ const pos = arch.columns.position.getTypedArray(), lv = arch.columns.linearVelocity.getTypedArray();
163
+ for (let r = 0; r < arch.rowCount; r++, count++) {
164
+ const r3 = r * 3, y = pos[r3 + 1];
165
+ sumY += y;
166
+ if (y < -0.5) belowFloor++; // floor top is y = 0; a resting body sits above it
167
+ const sp = Math.hypot(lv[r3], lv[r3 + 1], lv[r3 + 2]);
168
+ if (sp > maxSpeed) maxSpeed = sp;
169
+ }
170
+ }
171
+ return { avgY: count ? sumY / count : 0, maxSpeed, belowFloor };
172
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "target": "ESNext",
5
+ "module": "NodeNext",
6
+ "moduleResolution": "NodeNext",
7
+ "lib": ["ES5", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "ES2021", "ES2022", "ES2023", "ESNext", "DOM", "DOM.Iterable"],
8
+ "types": ["@webgpu/types"],
9
+ "experimentalDecorators": true,
10
+ "useDefineForClassFields": false,
11
+ "skipLibCheck": true,
12
+ "rootDir": "src",
13
+ "outDir": "dist",
14
+ "declaration": true,
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "strict": true,
18
+ "noFallthroughCasesInSwitch": true,
19
+ "stripInternal": true,
20
+ "sourceMap": true
21
+ },
22
+ "include": ["src/**/*"],
23
+ "exclude": ["node_modules", "dist"],
24
+ "references": []
25
+ }