@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,77 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database, Entity } from "@adobe/data/ecs";
4
+ import { physicsData } from "../../physics/physics-data-plugin.js";
5
+ import type { ColliderMesh } from "../../physics/body/collider-mesh.js";
6
+ import { modelLoader } from "../scene/model/model-loader-plugin.js";
7
+ import { hullVertices } from "../scene/model/shape/convex-hull.js";
8
+
9
+ /**
10
+ * modelCollider — lets a rendered model double as a physics body whose collider is
11
+ * **auto-generated from its mesh**. A `ModelBody` (or `StaticModelCollider`) carries
12
+ * a `geometry` + a `colliderShape` of `"hull"` or `"mesh"` but *no* collision data;
13
+ * this fills it once the mesh has loaded:
14
+ *
15
+ * hull → `convexPoints` = the simplified hull vertices of the mesh (the engine
16
+ * rebuilds the hull) — a coarse, convex stand-in for a detailed model.
17
+ * mesh → `colliderMesh` = the mesh triangles verbatim (static trimesh).
18
+ *
19
+ * The source defaults to the body's own `geometry` but can be overridden with
20
+ * `collisionGeometry` (point it at a low-poly mesh for a cheaper collider). The
21
+ * model's `scale` is baked into the collision geometry so it matches the render.
22
+ * Generated data is cached per (source geometry, shape, scale), so many instances
23
+ * of one model share it. Authoring the collider by hand (supplying `convexPoints`
24
+ * / `colliderMesh` directly, as `ConvexBody` / `MeshCollider` do) still works and
25
+ * simply skips generation.
26
+ *
27
+ * Because the body already has a `geometry`, the physics render bridge leaves it
28
+ * alone — it renders as the detailed model and collides as the generated shape.
29
+ */
30
+ export const modelCollider = Database.Plugin.create({
31
+ extends: Database.Plugin.combine(physicsData, modelLoader),
32
+ components: {
33
+ collisionGeometry: Entity.schema, // optional override: generate the collider from this Geometry instead of `geometry`
34
+ },
35
+ archetypes: {
36
+ // A model that is also a dynamic/kinematic body; collider auto-generated.
37
+ ModelBody: ["geometry", "scale", "visible", "parent", "bodyType", "colliderShape", "halfExtents", "material", "position", "rotation", "linearVelocity", "angularVelocity"],
38
+ // A static model collider (immovable level geometry that renders as a model).
39
+ StaticModelCollider: ["geometry", "scale", "visible", "parent", "colliderShape", "halfExtents", "material", "position", "rotation"],
40
+ },
41
+ systems: {
42
+ generateModelColliders: {
43
+ schedule: { during: ["postUpdate"] },
44
+ create: db => {
45
+ // generated collider data, shared across instances of the same (source mesh, shape, scale)
46
+ const cache = new Map<string, { convexPoints: Float32Array } | { colliderMesh: ColliderMesh }>();
47
+ return () => {
48
+ // model-bodies (geometry + scale) whose collider data isn't generated yet
49
+ for (const arch of db.store.queryArchetypes(["colliderShape", "geometry", "scale"], { exclude: ["convexPoints", "colliderMesh"] })) {
50
+ const ids = arch.columns.id, css = arch.columns.colliderShape, scl = arch.columns.scale;
51
+ // tail→head: filling the data migrates the row out of this archetype
52
+ for (let i = arch.rowCount - 1; i >= 0; i--) {
53
+ const shape = css.get(i);
54
+ if (shape !== "hull" && shape !== "mesh") continue; // primitive-shaped model-bodies need no generation
55
+ const id = ids.get(i);
56
+ const src = (db.store.read(id) as { collisionGeometry?: Entity }).collisionGeometry || arch.columns.geometry.get(i);
57
+ const mesh = db.store.read(src) as { _cpuPositions?: Float32Array | null; _cpuIndices?: Uint32Array | null } | null;
58
+ const positions = mesh?._cpuPositions;
59
+ if (!positions) continue; // source mesh not loaded yet — retry next frame
60
+ const s = scl.get(i), key = `${src}:${shape}:${s[0]}:${s[1]}:${s[2]}`;
61
+ let data = cache.get(key);
62
+ if (!data) {
63
+ const scaled = new Float32Array(positions.length);
64
+ for (let k = 0; k < positions.length; k += 3) { scaled[k] = positions[k] * s[0]; scaled[k + 1] = positions[k + 1] * s[1]; scaled[k + 2] = positions[k + 2] * s[2]; }
65
+ data = shape === "hull"
66
+ ? { convexPoints: hullVertices(scaled) }
67
+ : { colliderMesh: { positions: scaled, indices: mesh!._cpuIndices ?? new Uint32Array(0) } };
68
+ cache.set(key, data);
69
+ }
70
+ db.store.update(id, data);
71
+ }
72
+ }
73
+ };
74
+ },
75
+ },
76
+ },
77
+ });
@@ -0,0 +1,40 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database, Entity } from "@adobe/data/ecs";
4
+ import { Mat4x4 } from "@adobe/data/math";
5
+ import { U32 } from "@adobe/data/math";
6
+
7
+ /**
8
+ * Shape declarations shared between asset producers (model loader, shape
9
+ * generators) and consumers (renderers). Every component and archetype is
10
+ * ephemeral — not part of the user's data model. Pair with an asset
11
+ * producer plus a renderer aggregator (`pbrIblRender`)
12
+ * to get drawable scenes.
13
+ */
14
+ export const pbrCore = Database.Plugin.create({
15
+ components: {
16
+ _vertexBuffer: { default: null as GPUBuffer | null },
17
+ /** Secondary VBO with skinning attributes (joints u32×4, weights f32×4),
18
+ * null for static primitives. Drives skinned-pipeline dispatch. */
19
+ _skinVertexBuffer: { default: null as GPUBuffer | null },
20
+ _indexBuffer: { default: null as GPUBuffer | null },
21
+ _indexCount: U32.schema,
22
+ _indexFormat: { default: "uint16" as GPUIndexFormat },
23
+ _materialBindGroup: { default: null as GPUBindGroup | null },
24
+ /** Back-reference from a _PbrPrimitive / _VisibleMaterial to the
25
+ * authored Geometry that owns it. */
26
+ _geometry: Entity.schema,
27
+ _material: Entity.schema,
28
+ /** Node-local-to-model-root matrix baked at load time. The renderer
29
+ * pre-multiplies it with the per-instance model-root world matrix. */
30
+ _nodeLocalMatrix: Mat4x4.schema,
31
+ /** Skeleton-side back-references the renderer reads when dispatching
32
+ * the skinned pipeline. Populated by `pbrSkinning`. */
33
+ _skeletonModelRef: Entity.schema,
34
+ _skeletonJointMatrixBindGroup: { default: null as GPUBindGroup | null },
35
+ },
36
+ archetypes: {
37
+ _VisibleMaterial: ["ephemeral", "_materialBindGroup", "_geometry"],
38
+ _PbrPrimitive: ["ephemeral", "_vertexBuffer", "_skinVertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_material", "_geometry", "_nodeLocalMatrix"],
39
+ },
40
+ });
@@ -0,0 +1,146 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { wgslStructFields } from "@adobe/data/typed-buffer";
4
+ import { schema as sceneUniformsSchema } from "../../scene/scene-uniforms/schema.js";
5
+ import brdf from "../ibl-render/brdf.wgsl.js";
6
+
7
+ /**
8
+ * Unified PBR shader for instanced primitives (and, after convergence, glTF).
9
+ * Materials come from the shared `materialGpu` set — five `texture_2d_array`s +
10
+ * a palette of per-layer factors (group 1) — selected by a per-instance layer
11
+ * index (group 3, binding 1). Shading is identical Cook-Torrance + split-sum
12
+ * IBL to the per-material `ibl-shader`; only the material *source* differs.
13
+ */
14
+ export function buildPbrArrayShader(options: { prefilteredMipCount: number }): string {
15
+ return /* wgsl */ `
16
+ struct SceneUniforms {
17
+ ${wgslStructFields(sceneUniformsSchema)}
18
+ }
19
+
20
+ struct MaterialFactors {
21
+ baseColorFactor: vec4f,
22
+ emissiveMetallic: vec4f, // emissive.rgb, metallicFactor
23
+ roughNormalOcc: vec4f, // roughnessFactor, normalScale, occlusionStrength, _
24
+ }
25
+
26
+ @group(0) @binding(0) var<uniform> scene: SceneUniforms;
27
+
28
+ @group(1) @binding(0) var<storage, read> palette: array<MaterialFactors>;
29
+ @group(1) @binding(1) var baseColorArray: texture_2d_array<f32>;
30
+ @group(1) @binding(2) var metallicRoughnessArray: texture_2d_array<f32>;
31
+ @group(1) @binding(3) var normalArray: texture_2d_array<f32>;
32
+ @group(1) @binding(4) var occlusionArray: texture_2d_array<f32>;
33
+ @group(1) @binding(5) var emissiveArray: texture_2d_array<f32>;
34
+ @group(1) @binding(6) var matSampler: sampler;
35
+
36
+ @group(2) @binding(0) var iblIrradiance: texture_cube<f32>;
37
+ @group(2) @binding(1) var iblPrefiltered: texture_cube<f32>;
38
+ @group(2) @binding(2) var iblBrdfLut: texture_2d<f32>;
39
+ @group(2) @binding(3) var iblSampler: sampler;
40
+
41
+ @group(3) @binding(0) var<storage, read> instances: array<mat4x4<f32>>;
42
+ @group(3) @binding(1) var<storage, read> layers: array<u32>;
43
+
44
+ const PREFILTERED_MIP_COUNT: f32 = ${options.prefilteredMipCount.toFixed(1)};
45
+
46
+ struct VertexInput {
47
+ @location(0) position: vec3f,
48
+ @location(1) normal: vec3f,
49
+ @location(2) tangent: vec4f,
50
+ @location(3) uv: vec2f,
51
+ }
52
+
53
+ struct VertexOutput {
54
+ @builtin(position) clipPosition: vec4f,
55
+ @location(0) worldPosition: vec3f,
56
+ @location(1) normal: vec3f,
57
+ @location(2) tangent: vec3f,
58
+ @location(3) bitangent: vec3f,
59
+ @location(4) uv: vec2f,
60
+ @location(5) @interpolate(flat) layer: u32,
61
+ }
62
+
63
+ @vertex
64
+ fn vs_main(@builtin(instance_index) instanceIndex: u32, in: VertexInput) -> VertexOutput {
65
+ let m = instances[instanceIndex];
66
+ let m3 = mat3x3<f32>(m[0].xyz, m[1].xyz, m[2].xyz);
67
+ let normalMat = mat3x3<f32>(
68
+ cross(m3[1], m3[2]),
69
+ cross(m3[2], m3[0]),
70
+ cross(m3[0], m3[1]),
71
+ );
72
+ let worldPos = m * vec4f(in.position, 1.0);
73
+ var out: VertexOutput;
74
+ out.clipPosition = scene.viewProjectionMatrix * worldPos;
75
+ out.worldPosition = worldPos.xyz;
76
+ out.normal = normalize(normalMat * in.normal);
77
+ out.tangent = normalize(m3 * in.tangent.xyz);
78
+ out.bitangent = normalize(cross(out.normal, out.tangent) * in.tangent.w);
79
+ out.uv = in.uv;
80
+ out.layer = layers[instanceIndex];
81
+ return out;
82
+ }
83
+
84
+ ${brdf}
85
+
86
+ @fragment
87
+ fn fs_main(in: VertexOutput) -> @location(0) vec4f {
88
+ let f = palette[in.layer];
89
+ let li = i32(in.layer);
90
+
91
+ let baseColor = textureSample(baseColorArray, matSampler, in.uv, li) * f.baseColorFactor;
92
+
93
+ let mr = textureSample(metallicRoughnessArray, matSampler, in.uv, li);
94
+ let metallic = mr.b * f.emissiveMetallic.w;
95
+ var roughness = mr.g * f.roughNormalOcc.x;
96
+ roughness = max(roughness, MIN_ROUGHNESS);
97
+ let alpha = roughness * roughness;
98
+
99
+ let occlusion = textureSample(occlusionArray, matSampler, in.uv, li).r;
100
+ let emissive = textureSample(emissiveArray, matSampler, in.uv, li).rgb * f.emissiveMetallic.xyz;
101
+
102
+ let nSampled = textureSample(normalArray, matSampler, in.uv, li).rgb * 2.0 - vec3f(1.0);
103
+ let nScaled = vec3f(nSampled.xy * f.roughNormalOcc.y, nSampled.z);
104
+ let tbn = mat3x3<f32>(in.tangent, in.bitangent, in.normal);
105
+ let N = normalize(tbn * nScaled);
106
+
107
+ let V = normalize(scene.cameraPosition - in.worldPosition);
108
+ let nDotV = max(dot(N, V), 0.001);
109
+ let R = reflect(-V, N);
110
+
111
+ let f0 = mix(vec3f(0.04), baseColor.rgb, metallic);
112
+
113
+ // --- IBL contribution (split-sum) ---
114
+ let F_ibl = f_schlick_roughness(nDotV, f0, roughness);
115
+ let kD_ibl = (vec3f(1.0) - F_ibl) * (1.0 - metallic);
116
+
117
+ let irradiance = textureSampleLevel(iblIrradiance, iblSampler, N, 0.0).rgb;
118
+ let diffuseIbl = kD_ibl * irradiance * baseColor.rgb;
119
+
120
+ let mipLevel = roughness * (PREFILTERED_MIP_COUNT - 1.0);
121
+ let prefiltered = textureSampleLevel(iblPrefiltered, iblSampler, R, mipLevel).rgb;
122
+ let envBrdf = textureSampleLevel(iblBrdfLut, iblSampler, vec2f(nDotV, roughness), 0.0).rg;
123
+ let specularIbl = prefiltered * (F_ibl * envBrdf.x + envBrdf.y);
124
+
125
+ let ambient = (diffuseIbl + specularIbl) * mix(1.0, occlusion, f.roughNormalOcc.z);
126
+
127
+ // --- Direct light (parity with the single scene light) ---
128
+ let L = normalize(-scene.lightDirection);
129
+ let H = normalize(V + L);
130
+ let nDotL = max(dot(N, L), 0.0);
131
+ let nDotH = max(dot(N, H), 0.0);
132
+ let vDotH = max(dot(V, H), 0.0);
133
+ let D_d = d_ggx(nDotH, alpha);
134
+ let G_d = g_smith(nDotV, nDotL, alpha);
135
+ let F_d = f_schlick(vDotH, f0);
136
+ let spec_d = (D_d * G_d * F_d) / (4.0 * nDotV * nDotL + 0.0001);
137
+ let kD_d = (vec3f(1.0) - F_d) * (1.0 - metallic);
138
+ let direct = (kD_d * baseColor.rgb / PI + spec_d) * scene.lightColor * nDotL;
139
+
140
+ let color = direct + ambient + emissive;
141
+ let mapped = tone_map_aces(color);
142
+ let gamma = pow(mapped, vec3f(1.0 / 2.2));
143
+ return vec4f(gamma, baseColor.a);
144
+ }
145
+ `;
146
+ }
@@ -0,0 +1,247 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database, type Entity } from "@adobe/data/ecs";
4
+ import { pbrIblRender } from "../ibl-render/ibl-render-plugin.js";
5
+ import { materialGpu } from "../material-gpu/material-gpu-plugin.js";
6
+ import { displayTransform } from "../display-transform-plugin.js";
7
+ import { SceneUniforms } from "../../scene/scene-uniforms/scene-uniforms.js";
8
+ import { StandardVertex } from "../standard-vertex/standard-vertex.js";
9
+ import { createMaterialBindGroupLayout } from "../material-gpu/material-bind-group.js";
10
+ import { buildPbrArrayShader } from "./pbr-array-shader.wgsl.js";
11
+
12
+ // Must match pbrIblRender's bake so the array shader's prefiltered-mip math agrees.
13
+ const PREFILTERED_MIP_COUNT = 7;
14
+
15
+ /** Drawable: any visible entity with a geometry ref, a transform, and a material. */
16
+ const DRAWABLE = ["geometry", "visible", "position", "rotation", "scale", "material"] as const;
17
+ // Bodies carrying a derived display pose (interpolation-plugin) draw at it instead
18
+ // of the canonical pose; everything else (statics, props, non-physics instances)
19
+ // draws straight from position/rotation. Splitting the gather by archetype shape
20
+ // avoids a per-row "has display pose?" branch.
21
+ const DRAWABLE_INTERP = [...DRAWABLE, "_renderPosition", "_renderRotation"] as const;
22
+ const DRAWABLE_DIRECT = { exclude: ["_renderPosition"] } as const;
23
+ const PRIMITIVE = ["_vertexBuffer", "_indexBuffer", "_indexCount", "_indexFormat", "_geometry", "_nodeLocalMatrix"] as const;
24
+
25
+ /** Minimal column shape the gather reads — satisfied by either query's columns. */
26
+ interface Col<T> { get(i: number): T }
27
+
28
+ function createIblBindGroupLayout(device: GPUDevice): GPUBindGroupLayout {
29
+ return device.createBindGroupLayout({
30
+ entries: [
31
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } },
32
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } },
33
+ { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } },
34
+ { binding: 3, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } },
35
+ ],
36
+ });
37
+ }
38
+
39
+ /**
40
+ * Compose a column-major TRS matrix directly into `out[o..o+15]` — no
41
+ * allocation, reading position/rotation/scale straight from their column typed
42
+ * arrays. Matches `translation · Quat.toMat4 · scaling`. Runs once per visible
43
+ * drawable per frame, so the array churn of the math-helper form matters.
44
+ */
45
+ function composeTrs(
46
+ out: Float32Array, o: number,
47
+ p: ArrayLike<number>, pi: number, q: ArrayLike<number>, qi: number, s: ArrayLike<number>, si: number,
48
+ ): void {
49
+ const qx = q[qi], qy = q[qi + 1], qz = q[qi + 2], qw = q[qi + 3];
50
+ const sx = s[si], sy = s[si + 1], sz = s[si + 2];
51
+ const xx = qx * qx, yy = qy * qy, zz = qz * qz;
52
+ const xy = qx * qy, xz = qx * qz, yz = qy * qz;
53
+ const wx = qw * qx, wy = qw * qy, wz = qw * qz;
54
+ out[o] = (1 - 2 * (yy + zz)) * sx; out[o + 1] = (2 * (xy + wz)) * sx; out[o + 2] = (2 * (xz - wy)) * sx; out[o + 3] = 0;
55
+ out[o + 4] = (2 * (xy - wz)) * sy; out[o + 5] = (1 - 2 * (xx + zz)) * sy; out[o + 6] = (2 * (yz + wx)) * sy; out[o + 7] = 0;
56
+ out[o + 8] = (2 * (xz + wy)) * sz; out[o + 9] = (2 * (yz - wx)) * sz; out[o + 10] = (1 - 2 * (xx + yy)) * sz; out[o + 11] = 0;
57
+ out[o + 12] = p[pi]; out[o + 13] = p[pi + 1]; out[o + 14] = p[pi + 2]; out[o + 15] = 1;
58
+ }
59
+
60
+ /**
61
+ * pbrRender — the single PBR + IBL renderer. It extends `pbrIblRender`, reusing
62
+ * its IBL bake, skybox, scene/material bind groups and glTF draw path verbatim,
63
+ * and adds one extra draw query for **instanced primitives** whose material
64
+ * comes from the shared `materialGpu` arrays (selected per instance by the
65
+ * material entity's `_layerIndex`). Two efficient queries, one render plugin:
66
+ *
67
+ * - glTF models → per-material bind group, native-resolution textures (pbrIblRender)
68
+ * - primitives → shared texture_2d_array + per-instance layer (this system)
69
+ *
70
+ * The primitive system runs after `pbrIblRenderSystem` so the skybox is drawn
71
+ * first. World matrices are computed directly from `position`/`rotation`/`scale`
72
+ * (primitives are flat — no hierarchy), so it's independent of `transform`.
73
+ */
74
+ export const pbrRender = Database.Plugin.create({
75
+ extends: Database.Plugin.combine(pbrIblRender, materialGpu, displayTransform),
76
+ systems: {
77
+ pbrPrimitiveRenderSystem: {
78
+ schedule: { during: ["render"], after: ["beginRenderPass", "pbrIblRenderSystem"], before: ["endRenderPass"] },
79
+ create: db => {
80
+ let pipeline: GPURenderPipeline | null = null;
81
+ let sceneLayout: GPUBindGroupLayout | null = null;
82
+ let iblLayout: GPUBindGroupLayout | null = null;
83
+ let instanceLayout: GPUBindGroupLayout | null = null;
84
+ let iblSampler: GPUSampler | null = null;
85
+ let sceneBindGroup: GPUBindGroup | null = null;
86
+ let iblBindGroup: GPUBindGroup | null = null;
87
+ let cachedSceneBuffer: GPUBuffer | null = null;
88
+ let cachedIrradiance: GPUTexture | null = null;
89
+
90
+ let matLayer = new Map<Entity, number>();
91
+ let matCount = -1;
92
+
93
+ interface Inst { buffer: GPUBuffer; layerBuffer: GPUBuffer; bindGroup: GPUBindGroup; capacity: number }
94
+ const instCache = new Map<Entity, Inst>();
95
+ let matScratch = new Float32Array(16);
96
+ let layerScratch = new Uint32Array(1);
97
+ // Per-frame matrix arena (composed TRS, one mat4 per drawable) + per-geometry
98
+ // draw lists (matrix offset + layer). All pooled and reused across frames —
99
+ // the gather runs over every visible body each frame, so zero allocation here.
100
+ let mats = new Float32Array(64 * 16);
101
+ const batches = new Map<Entity, { off: number[]; layer: number[] }>();
102
+
103
+ return () => {
104
+ const {
105
+ device, renderPassEncoder, canvasFormat, depthFormat, _sceneUniformsBuffer,
106
+ _materialBindGroup, _iblIrradiance, _iblPrefiltered, _iblBrdfLut,
107
+ } = db.store.resources;
108
+ if (!device || !renderPassEncoder || !_sceneUniformsBuffer || !_materialBindGroup) return;
109
+ if (!_iblIrradiance || !_iblPrefiltered || !_iblBrdfLut) return;
110
+
111
+ if (!sceneLayout) sceneLayout = SceneUniforms.createBindGroupLayout(device);
112
+ if (!iblLayout) iblLayout = createIblBindGroupLayout(device);
113
+ if (!instanceLayout) instanceLayout = device.createBindGroupLayout({
114
+ entries: [
115
+ { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: "read-only-storage" } },
116
+ { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: "read-only-storage" } },
117
+ ],
118
+ });
119
+ if (!iblSampler) iblSampler = device.createSampler({
120
+ magFilter: "linear", minFilter: "linear", mipmapFilter: "linear",
121
+ addressModeU: "clamp-to-edge", addressModeV: "clamp-to-edge", addressModeW: "clamp-to-edge",
122
+ });
123
+ if (!pipeline) {
124
+ const module = device.createShaderModule({ code: buildPbrArrayShader({ prefilteredMipCount: PREFILTERED_MIP_COUNT }) });
125
+ pipeline = device.createRenderPipeline({
126
+ layout: device.createPipelineLayout({ bindGroupLayouts: [sceneLayout, createMaterialBindGroupLayout(device), iblLayout, instanceLayout] }),
127
+ vertex: { module, entryPoint: "vs_main", buffers: [StandardVertex.layout] },
128
+ fragment: { module, entryPoint: "fs_main", targets: [{ format: canvasFormat }] },
129
+ primitive: { topology: "triangle-list", cullMode: "back" },
130
+ depthStencil: { format: depthFormat, depthWriteEnabled: true, depthCompare: "less" },
131
+ });
132
+ }
133
+
134
+ if (_sceneUniformsBuffer !== cachedSceneBuffer || !sceneBindGroup) {
135
+ sceneBindGroup = device.createBindGroup({ layout: sceneLayout, entries: [{ binding: 0, resource: { buffer: _sceneUniformsBuffer } }] });
136
+ cachedSceneBuffer = _sceneUniformsBuffer;
137
+ }
138
+ if (_iblIrradiance !== cachedIrradiance || !iblBindGroup) {
139
+ iblBindGroup = device.createBindGroup({
140
+ layout: iblLayout,
141
+ entries: [
142
+ { binding: 0, resource: _iblIrradiance.createView({ dimension: "cube" }) },
143
+ { binding: 1, resource: _iblPrefiltered.createView({ dimension: "cube" }) },
144
+ { binding: 2, resource: _iblBrdfLut.createView() },
145
+ { binding: 3, resource: iblSampler },
146
+ ],
147
+ });
148
+ cachedIrradiance = _iblIrradiance;
149
+ }
150
+
151
+ // material → layer, refreshed only when the material set grows
152
+ let mc = 0;
153
+ for (const arch of db.store.queryArchetypes(["_layerIndex"])) mc += arch.rowCount;
154
+ if (mc !== matCount) {
155
+ matLayer = new Map();
156
+ for (const arch of db.store.queryArchetypes(["_layerIndex"])) {
157
+ const id = arch.columns.id, li = arch.columns._layerIndex;
158
+ for (let i = 0; i < arch.rowCount; i++) matLayer.set(id.get(i), li.get(i));
159
+ }
160
+ matCount = mc;
161
+ }
162
+
163
+ // Gather visible primitive drawables grouped by geometry. Compose each
164
+ // world matrix straight from the chosen pose/scale column typed arrays
165
+ // into the pooled `mats` arena — no per-row array allocation. Two passes:
166
+ // bodies with a display pose use it; everything else uses position/rotation.
167
+ for (const b of batches.values()) { b.off.length = 0; b.layer.length = 0; }
168
+ let drawCount = 0;
169
+ const gather = (
170
+ rowCount: number, vis: Col<boolean>, geo: Col<Entity>, mat: Col<Entity>,
171
+ posArr: ArrayLike<number>, rotArr: ArrayLike<number>, sclArr: ArrayLike<number>,
172
+ ): void => {
173
+ for (let i = 0; i < rowCount; i++) {
174
+ if (!vis.get(i)) continue;
175
+ const layer = matLayer.get(mat.get(i));
176
+ if (layer === undefined) continue;
177
+ if ((drawCount + 1) * 16 > mats.length) { const grown = new Float32Array(mats.length * 2); grown.set(mats); mats = grown; }
178
+ composeTrs(mats, drawCount * 16, posArr, i * 3, rotArr, i * 4, sclArr, i * 3);
179
+ const g = geo.get(i);
180
+ let b = batches.get(g);
181
+ if (!b) { b = { off: [], layer: [] }; batches.set(g, b); }
182
+ b.off.push(drawCount); b.layer.push(layer);
183
+ drawCount++;
184
+ }
185
+ };
186
+ for (const arch of db.store.queryArchetypes(DRAWABLE_INTERP)) {
187
+ gather(arch.rowCount, arch.columns.visible, arch.columns.geometry, arch.columns.material,
188
+ arch.columns._renderPosition.getTypedArray(), arch.columns._renderRotation.getTypedArray(), arch.columns.scale.getTypedArray());
189
+ }
190
+ for (const arch of db.store.queryArchetypes(DRAWABLE, DRAWABLE_DIRECT)) {
191
+ gather(arch.rowCount, arch.columns.visible, arch.columns.geometry, arch.columns.material,
192
+ arch.columns.position.getTypedArray(), arch.columns.rotation.getTypedArray(), arch.columns.scale.getTypedArray());
193
+ }
194
+ if (drawCount === 0) return;
195
+
196
+ renderPassEncoder.setPipeline(pipeline);
197
+ renderPassEncoder.setBindGroup(0, sceneBindGroup);
198
+ renderPassEncoder.setBindGroup(1, _materialBindGroup);
199
+ renderPassEncoder.setBindGroup(2, iblBindGroup);
200
+
201
+ for (const arch of db.store.queryArchetypes(PRIMITIVE)) {
202
+ const vbs = arch.columns._vertexBuffer, ibs = arch.columns._indexBuffer;
203
+ const counts = arch.columns._indexCount, formats = arch.columns._indexFormat;
204
+ const geoRefs = arch.columns._geometry, primIds = arch.columns.id;
205
+ for (let i = 0; i < arch.rowCount; i++) {
206
+ const b = batches.get(geoRefs.get(i));
207
+ if (!b || b.off.length === 0) continue;
208
+ const n = b.off.length;
209
+ const primId = primIds.get(i);
210
+
211
+ let entry = instCache.get(primId);
212
+ if (!entry || entry.capacity < n) {
213
+ entry?.buffer.destroy();
214
+ entry?.layerBuffer.destroy();
215
+ const buffer = device.createBuffer({ size: Math.max(n * 64, 64), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });
216
+ const layerBuffer = device.createBuffer({ size: Math.max(n * 4, 4), usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST });
217
+ const bindGroup = device.createBindGroup({
218
+ layout: instanceLayout,
219
+ entries: [{ binding: 0, resource: { buffer } }, { binding: 1, resource: { buffer: layerBuffer } }],
220
+ });
221
+ entry = { buffer, layerBuffer, bindGroup, capacity: n };
222
+ instCache.set(primId, entry);
223
+ }
224
+ if (matScratch.length < n * 16) matScratch = new Float32Array(n * 16);
225
+ if (layerScratch.length < n) layerScratch = new Uint32Array(n);
226
+ // Copy this geometry's matrices out of the arena into a contiguous
227
+ // upload buffer. Primitive node matrices are identity (flat shapes;
228
+ // glTF hierarchy goes through pbrIblRender), so no extra multiply.
229
+ for (let j = 0; j < n; j++) {
230
+ const src = b.off[j] * 16, dst = j * 16;
231
+ for (let k = 0; k < 16; k++) matScratch[dst + k] = mats[src + k];
232
+ layerScratch[j] = b.layer[j];
233
+ }
234
+ device.queue.writeBuffer(entry.buffer, 0, matScratch, 0, n * 16);
235
+ device.queue.writeBuffer(entry.layerBuffer, 0, layerScratch, 0, n);
236
+
237
+ renderPassEncoder.setBindGroup(3, entry.bindGroup);
238
+ renderPassEncoder.setVertexBuffer(0, vbs.get(i)!); // _PbrPrimitive guarantees non-null
239
+ renderPassEncoder.setIndexBuffer(ibs.get(i)!, formats.get(i)); // _PbrPrimitive guarantees non-null
240
+ renderPassEncoder.drawIndexed(counts.get(i), n);
241
+ }
242
+ }
243
+ };
244
+ },
245
+ },
246
+ },
247
+ });
@@ -0,0 +1,106 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database, type Entity } from "@adobe/data/ecs";
4
+ import { physicsData } from "../../../physics/physics-data-plugin.js";
5
+ import { model } from "../../scene/model/model-plugin.js";
6
+ import { shapeGeometry } from "../../scene/model/shape/shape-geometry-plugin.js";
7
+ import { capsuleMesh, flatShadedMesh } from "../../scene/model/shape/shape-mesh.js";
8
+ import { convexHullMesh } from "../../scene/model/shape/convex-hull.js";
9
+ import { uploadShapeMesh } from "../../scene/model/shape/upload-shape-mesh.js";
10
+ import type { ColliderMesh } from "../../../physics/body/collider-mesh.js";
11
+ import { interpolation } from "../interpolation-plugin.js";
12
+
13
+ /**
14
+ * physicsRenderBridge — makes colliders renderable by `pbrRender`. Once the
15
+ * shape geometries exist, every body with a collider shape (dynamic RigidBody
16
+ * or immovable StaticCollider alike) gains a `geometry` ref (sphere / cube by
17
+ * collider shape), a `scale` (its half-extents — the unit shapes are size-1),
18
+ * and `visible`. Because physics `rotation`/`position` are the same components
19
+ * the renderer reads, there is no per-frame sync: this only migrates new bodies.
20
+ *
21
+ * It also folds in `interpolation`, so dynamic bodies render at the smooth,
22
+ * render-rate display pose for free (the solver steps on a fixed clock that need
23
+ * not match the render rate) — bridging physics to the renderer is exactly when
24
+ * you want that. Use `interpolation` directly only with a custom (non-bridge) path.
25
+ *
26
+ * Also declares `Prop` — a render-only placed geometry with a material that is
27
+ * not a physics body at all (decorative scenery with no collider).
28
+ */
29
+ export const physicsRenderBridge = Database.Plugin.create({
30
+ extends: Database.Plugin.combine(physicsData, model, shapeGeometry, interpolation),
31
+ archetypes: {
32
+ Prop: ["geometry", "position", "rotation", "scale", "visible", "material"],
33
+ },
34
+ systems: {
35
+ physicsBridge: {
36
+ schedule: { during: ["postUpdate"] },
37
+ create: db => {
38
+ // Sphere/cube are unit meshes scaled by half-extents. A capsule can't
39
+ // be non-uniformly scaled (its caps would distort), so it's built at its
40
+ // real size and drawn at unit scale — one mesh per distinct (radius,
41
+ // half-height), cached here (scenes use very few capsule sizes).
42
+ const capsuleGeometry = new Map<string, Entity>();
43
+ const ensureCapsule = (device: GPUDevice, r: number, hy: number): Entity => {
44
+ const key = `${r}:${hy}`;
45
+ let geo = capsuleGeometry.get(key);
46
+ if (geo === undefined) {
47
+ const m = uploadShapeMesh(device, capsuleMesh(r, hy));
48
+ geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count });
49
+ capsuleGeometry.set(key, geo);
50
+ }
51
+ return geo;
52
+ };
53
+ // Hull render mesh = triangulated convex hull of the point cloud, cached
54
+ // by the point-array reference (bodies sharing a cloud share one mesh + draw).
55
+ const hullGeometry = new Map<Float32Array, Entity>();
56
+ const ensureHull = (device: GPUDevice, points: Float32Array): Entity => {
57
+ let geo = hullGeometry.get(points);
58
+ if (geo === undefined) {
59
+ const m = uploadShapeMesh(device, convexHullMesh(points));
60
+ geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count });
61
+ hullGeometry.set(points, geo);
62
+ }
63
+ return geo;
64
+ };
65
+ // Static-mesh render = flat-shaded triangle soup, cached by the colliderMesh ref.
66
+ const meshGeometry = new Map<ColliderMesh, Entity>();
67
+ const ensureMesh = (device: GPUDevice, cm: ColliderMesh): Entity => {
68
+ let geo = meshGeometry.get(cm);
69
+ if (geo === undefined) {
70
+ const m = uploadShapeMesh(device, flatShadedMesh(cm.positions, cm.indices));
71
+ geo = db.transactions.insertShapePrimitive({ vertexBuffer: m.vb, indexBuffer: m.ib, indexCount: m.count });
72
+ meshGeometry.set(cm, geo);
73
+ }
74
+ return geo;
75
+ };
76
+ return () => {
77
+ const shapes = db.store.resources._shapeGeometry;
78
+ const device = db.store.resources.device;
79
+ if (!shapes || !device) return;
80
+ for (const arch of db.store.queryArchetypes(["colliderShape", "halfExtents"], { exclude: ["geometry"] })) {
81
+ const ids = arch.columns.id, css = arch.columns.colliderShape, hes = arch.columns.halfExtents;
82
+ // Tail→head: every visited body migrates out (gains geometry).
83
+ for (let i = arch.rowCount - 1; i >= 0; i--) {
84
+ const id = ids.get(i), shape = css.get(i), he = hes.get(i);
85
+ // capsule + hull render at unit scale (their meshes are real-size);
86
+ // sphere/cube are unit meshes scaled by half-extents.
87
+ let geometry: Entity, scale: [number, number, number];
88
+ if (shape === "box") { geometry = shapes.cube; scale = [he[0], he[1], he[2]]; }
89
+ else if (shape === "capsule") { geometry = ensureCapsule(device, he[0], he[1]); scale = [1, 1, 1]; }
90
+ else if (shape === "hull") {
91
+ const pts = (db.store.read(id) as { convexPoints?: Float32Array | null }).convexPoints;
92
+ geometry = pts ? ensureHull(device, pts) : shapes.sphere;
93
+ scale = [1, 1, 1];
94
+ } else if (shape === "mesh") {
95
+ const cm = (db.store.read(id) as { colliderMesh?: ColliderMesh | null }).colliderMesh;
96
+ geometry = cm ? ensureMesh(device, cm) : shapes.cube;
97
+ scale = [1, 1, 1];
98
+ } else { geometry = shapes.sphere; scale = [he[0], he[0], he[0]]; }
99
+ db.store.update(id, { geometry, scale, visible: true });
100
+ }
101
+ }
102
+ };
103
+ },
104
+ },
105
+ },
106
+ });
@@ -0,0 +1,21 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ import { Database } from "@adobe/data/ecs";
4
+
5
+ /**
6
+ * ragdollTrigger — the backend-agnostic "go limp" signal. A scene calls
7
+ * `triggerRagdoll()`; whichever ragdoll backend is combined in (our generic
8
+ * `boneColliders`, or the Jolt-native `joltRagdoll`) consumes `_ragdollTrigger`
9
+ * once and switches its bones to dynamic. Sharing the flag lets the same scene
10
+ * drive either backend, so a sample can run our ragdoll on one solver and Jolt's
11
+ * on another, side by side.
12
+ */
13
+ export const ragdollTrigger = Database.Plugin.create({
14
+ resources: {
15
+ _ragdollTrigger: { default: false as boolean, transient: true },
16
+ },
17
+ transactions: {
18
+ /** Go limp: the active ragdoll backend flips its bones to dynamic. */
19
+ triggerRagdoll(t) { t.resources._ragdollTrigger = true; },
20
+ },
21
+ });
@@ -0,0 +1,3 @@
1
+ // © 2026 Adobe. MIT License. See /LICENSE for details.
2
+
3
+ export { pbrIblRender as rendering } from "./ibl-render/ibl-render-plugin.js";