@vgpu/render 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/dist/domain/camera.d.ts +10 -0
  4. package/dist/domain/camera.d.ts.map +1 -0
  5. package/dist/domain/camera.js +2 -0
  6. package/dist/domain/camera.js.map +1 -0
  7. package/dist/domain/capsule-data.d.ts +10 -0
  8. package/dist/domain/capsule-data.d.ts.map +1 -0
  9. package/dist/domain/capsule-data.js +61 -0
  10. package/dist/domain/capsule-data.js.map +1 -0
  11. package/dist/domain/cone-data.d.ts +13 -0
  12. package/dist/domain/cone-data.d.ts.map +1 -0
  13. package/dist/domain/cone-data.js +52 -0
  14. package/dist/domain/cone-data.js.map +1 -0
  15. package/dist/domain/cylinder-data.d.ts +14 -0
  16. package/dist/domain/cylinder-data.d.ts.map +1 -0
  17. package/dist/domain/cylinder-data.js +58 -0
  18. package/dist/domain/cylinder-data.js.map +1 -0
  19. package/dist/domain/deg-to-rad.d.ts +2 -0
  20. package/dist/domain/deg-to-rad.d.ts.map +1 -0
  21. package/dist/domain/deg-to-rad.js +4 -0
  22. package/dist/domain/deg-to-rad.js.map +1 -0
  23. package/dist/domain/disk-data.d.ts +12 -0
  24. package/dist/domain/disk-data.d.ts.map +1 -0
  25. package/dist/domain/disk-data.js +21 -0
  26. package/dist/domain/disk-data.js.map +1 -0
  27. package/dist/domain/icosphere-data.d.ts +8 -0
  28. package/dist/domain/icosphere-data.d.ts.map +1 -0
  29. package/dist/domain/icosphere-data.js +58 -0
  30. package/dist/domain/icosphere-data.js.map +1 -0
  31. package/dist/domain/index.d.ts +40 -0
  32. package/dist/domain/index.d.ts.map +1 -0
  33. package/dist/domain/index.js +23 -0
  34. package/dist/domain/index.js.map +1 -0
  35. package/dist/domain/material-factory.d.ts +34 -0
  36. package/dist/domain/material-factory.d.ts.map +1 -0
  37. package/dist/domain/material-factory.js +106 -0
  38. package/dist/domain/material-factory.js.map +1 -0
  39. package/dist/domain/material-sampler.d.ts +7 -0
  40. package/dist/domain/material-sampler.d.ts.map +1 -0
  41. package/dist/domain/material-sampler.js +11 -0
  42. package/dist/domain/material-sampler.js.map +1 -0
  43. package/dist/domain/material-textures-schema.d.ts +29 -0
  44. package/dist/domain/material-textures-schema.d.ts.map +1 -0
  45. package/dist/domain/material-textures-schema.js +57 -0
  46. package/dist/domain/material-textures-schema.js.map +1 -0
  47. package/dist/domain/material-textures.d.ts +13 -0
  48. package/dist/domain/material-textures.d.ts.map +1 -0
  49. package/dist/domain/material-textures.js +91 -0
  50. package/dist/domain/material-textures.js.map +1 -0
  51. package/dist/domain/material.d.ts +27 -0
  52. package/dist/domain/material.d.ts.map +1 -0
  53. package/dist/domain/material.js +2 -0
  54. package/dist/domain/material.js.map +1 -0
  55. package/dist/domain/mesh-box.d.ts +8 -0
  56. package/dist/domain/mesh-box.d.ts.map +1 -0
  57. package/dist/domain/mesh-box.js +57 -0
  58. package/dist/domain/mesh-box.js.map +1 -0
  59. package/dist/domain/mesh-cache.d.ts +4 -0
  60. package/dist/domain/mesh-cache.d.ts.map +1 -0
  61. package/dist/domain/mesh-cache.js +14 -0
  62. package/dist/domain/mesh-cache.js.map +1 -0
  63. package/dist/domain/mesh-capsule.d.ts +14 -0
  64. package/dist/domain/mesh-capsule.d.ts.map +1 -0
  65. package/dist/domain/mesh-capsule.js +52 -0
  66. package/dist/domain/mesh-capsule.js.map +1 -0
  67. package/dist/domain/mesh-cone.d.ts +16 -0
  68. package/dist/domain/mesh-cone.d.ts.map +1 -0
  69. package/dist/domain/mesh-cone.js +54 -0
  70. package/dist/domain/mesh-cone.js.map +1 -0
  71. package/dist/domain/mesh-cylinder.d.ts +18 -0
  72. package/dist/domain/mesh-cylinder.d.ts.map +1 -0
  73. package/dist/domain/mesh-cylinder.js +67 -0
  74. package/dist/domain/mesh-cylinder.js.map +1 -0
  75. package/dist/domain/mesh-disk.d.ts +11 -0
  76. package/dist/domain/mesh-disk.d.ts.map +1 -0
  77. package/dist/domain/mesh-disk.js +45 -0
  78. package/dist/domain/mesh-disk.js.map +1 -0
  79. package/dist/domain/mesh-dodecahedron.d.ts +4 -0
  80. package/dist/domain/mesh-dodecahedron.d.ts.map +1 -0
  81. package/dist/domain/mesh-dodecahedron.js +10 -0
  82. package/dist/domain/mesh-dodecahedron.js.map +1 -0
  83. package/dist/domain/mesh-fullscreen-quad.d.ts +7 -0
  84. package/dist/domain/mesh-fullscreen-quad.d.ts.map +1 -0
  85. package/dist/domain/mesh-fullscreen-quad.js +39 -0
  86. package/dist/domain/mesh-fullscreen-quad.js.map +1 -0
  87. package/dist/domain/mesh-icosahedron.d.ts +4 -0
  88. package/dist/domain/mesh-icosahedron.d.ts.map +1 -0
  89. package/dist/domain/mesh-icosahedron.js +10 -0
  90. package/dist/domain/mesh-icosahedron.js.map +1 -0
  91. package/dist/domain/mesh-icosphere.d.ts +11 -0
  92. package/dist/domain/mesh-icosphere.d.ts.map +1 -0
  93. package/dist/domain/mesh-icosphere.js +47 -0
  94. package/dist/domain/mesh-icosphere.js.map +1 -0
  95. package/dist/domain/mesh-octahedron.d.ts +4 -0
  96. package/dist/domain/mesh-octahedron.d.ts.map +1 -0
  97. package/dist/domain/mesh-octahedron.js +10 -0
  98. package/dist/domain/mesh-octahedron.js.map +1 -0
  99. package/dist/domain/mesh-plane.d.ts +13 -0
  100. package/dist/domain/mesh-plane.d.ts.map +1 -0
  101. package/dist/domain/mesh-plane.js +51 -0
  102. package/dist/domain/mesh-plane.js.map +1 -0
  103. package/dist/domain/mesh-ring.d.ts +12 -0
  104. package/dist/domain/mesh-ring.d.ts.map +1 -0
  105. package/dist/domain/mesh-ring.js +47 -0
  106. package/dist/domain/mesh-ring.js.map +1 -0
  107. package/dist/domain/mesh-sphere.d.ts +10 -0
  108. package/dist/domain/mesh-sphere.d.ts.map +1 -0
  109. package/dist/domain/mesh-sphere.js +51 -0
  110. package/dist/domain/mesh-sphere.js.map +1 -0
  111. package/dist/domain/mesh-tetrahedron.d.ts +5 -0
  112. package/dist/domain/mesh-tetrahedron.d.ts.map +1 -0
  113. package/dist/domain/mesh-tetrahedron.js +10 -0
  114. package/dist/domain/mesh-tetrahedron.js.map +1 -0
  115. package/dist/domain/mesh-torus.d.ts +17 -0
  116. package/dist/domain/mesh-torus.d.ts.map +1 -0
  117. package/dist/domain/mesh-torus.js +56 -0
  118. package/dist/domain/mesh-torus.js.map +1 -0
  119. package/dist/domain/mesh-types.d.ts +38 -0
  120. package/dist/domain/mesh-types.d.ts.map +1 -0
  121. package/dist/domain/mesh-types.js +2 -0
  122. package/dist/domain/mesh-types.js.map +1 -0
  123. package/dist/domain/mesh.d.ts +61 -0
  124. package/dist/domain/mesh.d.ts.map +1 -0
  125. package/dist/domain/mesh.js +49 -0
  126. package/dist/domain/mesh.js.map +1 -0
  127. package/dist/domain/orthographic-camera.d.ts +14 -0
  128. package/dist/domain/orthographic-camera.d.ts.map +1 -0
  129. package/dist/domain/orthographic-camera.js +10 -0
  130. package/dist/domain/orthographic-camera.js.map +1 -0
  131. package/dist/domain/perspective-camera.d.ts +12 -0
  132. package/dist/domain/perspective-camera.d.ts.map +1 -0
  133. package/dist/domain/perspective-camera.js +10 -0
  134. package/dist/domain/perspective-camera.js.map +1 -0
  135. package/dist/domain/plane-data.d.ts +12 -0
  136. package/dist/domain/plane-data.d.ts.map +1 -0
  137. package/dist/domain/plane-data.js +25 -0
  138. package/dist/domain/plane-data.js.map +1 -0
  139. package/dist/domain/polyhedron-data.d.ts +7 -0
  140. package/dist/domain/polyhedron-data.d.ts.map +1 -0
  141. package/dist/domain/polyhedron-data.js +42 -0
  142. package/dist/domain/polyhedron-data.js.map +1 -0
  143. package/dist/domain/polyhedron-mesh.d.ts +10 -0
  144. package/dist/domain/polyhedron-mesh.d.ts.map +1 -0
  145. package/dist/domain/polyhedron-mesh.js +37 -0
  146. package/dist/domain/polyhedron-mesh.js.map +1 -0
  147. package/dist/domain/polyhedron-seeds.d.ts +6 -0
  148. package/dist/domain/polyhedron-seeds.d.ts.map +1 -0
  149. package/dist/domain/polyhedron-seeds.js +51 -0
  150. package/dist/domain/polyhedron-seeds.js.map +1 -0
  151. package/dist/domain/primitive-data-utils.d.ts +9 -0
  152. package/dist/domain/primitive-data-utils.d.ts.map +1 -0
  153. package/dist/domain/primitive-data-utils.js +36 -0
  154. package/dist/domain/primitive-data-utils.js.map +1 -0
  155. package/dist/domain/ring-data.d.ts +13 -0
  156. package/dist/domain/ring-data.d.ts.map +1 -0
  157. package/dist/domain/ring-data.js +24 -0
  158. package/dist/domain/ring-data.js.map +1 -0
  159. package/dist/domain/sphere-data.d.ts +11 -0
  160. package/dist/domain/sphere-data.d.ts.map +1 -0
  161. package/dist/domain/sphere-data.js +31 -0
  162. package/dist/domain/sphere-data.js.map +1 -0
  163. package/dist/domain/srgb.d.ts +5 -0
  164. package/dist/domain/srgb.d.ts.map +1 -0
  165. package/dist/domain/srgb.js +11 -0
  166. package/dist/domain/srgb.js.map +1 -0
  167. package/dist/domain/torus-data.d.ts +11 -0
  168. package/dist/domain/torus-data.d.ts.map +1 -0
  169. package/dist/domain/torus-data.js +38 -0
  170. package/dist/domain/torus-data.js.map +1 -0
  171. package/dist/domain/vertex-layout.d.ts +3 -0
  172. package/dist/domain/vertex-layout.d.ts.map +1 -0
  173. package/dist/domain/vertex-layout.js +14 -0
  174. package/dist/domain/vertex-layout.js.map +1 -0
  175. package/dist/domain/wgsl-alignment.d.ts +17 -0
  176. package/dist/domain/wgsl-alignment.d.ts.map +1 -0
  177. package/dist/domain/wgsl-alignment.js +39 -0
  178. package/dist/domain/wgsl-alignment.js.map +1 -0
  179. package/dist/edit/edit-source.d.ts +10 -0
  180. package/dist/edit/edit-source.d.ts.map +1 -0
  181. package/dist/edit/edit-source.js +9 -0
  182. package/dist/edit/edit-source.js.map +1 -0
  183. package/dist/edit/editable-mesh.d.ts +11 -0
  184. package/dist/edit/editable-mesh.d.ts.map +1 -0
  185. package/dist/edit/editable-mesh.js +30 -0
  186. package/dist/edit/editable-mesh.js.map +1 -0
  187. package/dist/edit/element-set.d.ts +4 -0
  188. package/dist/edit/element-set.d.ts.map +1 -0
  189. package/dist/edit/element-set.js +78 -0
  190. package/dist/edit/element-set.js.map +1 -0
  191. package/dist/edit/errors.d.ts +11 -0
  192. package/dist/edit/errors.d.ts.map +1 -0
  193. package/dist/edit/errors.js +11 -0
  194. package/dist/edit/errors.js.map +1 -0
  195. package/dist/edit/half-edge-bake.d.ts +5 -0
  196. package/dist/edit/half-edge-bake.d.ts.map +1 -0
  197. package/dist/edit/half-edge-bake.js +30 -0
  198. package/dist/edit/half-edge-bake.js.map +1 -0
  199. package/dist/edit/half-edge-build.d.ts +4 -0
  200. package/dist/edit/half-edge-build.d.ts.map +1 -0
  201. package/dist/edit/half-edge-build.js +61 -0
  202. package/dist/edit/half-edge-build.js.map +1 -0
  203. package/dist/edit/half-edge-kernel.d.ts +21 -0
  204. package/dist/edit/half-edge-kernel.d.ts.map +1 -0
  205. package/dist/edit/half-edge-kernel.js +14 -0
  206. package/dist/edit/half-edge-kernel.js.map +1 -0
  207. package/dist/edit/half-edge-views.d.ts +8 -0
  208. package/dist/edit/half-edge-views.d.ts.map +1 -0
  209. package/dist/edit/half-edge-views.js +40 -0
  210. package/dist/edit/half-edge-views.js.map +1 -0
  211. package/dist/edit/index.d.ts +38 -0
  212. package/dist/edit/index.d.ts.map +1 -0
  213. package/dist/edit/index.js +20 -0
  214. package/dist/edit/index.js.map +1 -0
  215. package/dist/edit/kernel-handle.d.ts +5 -0
  216. package/dist/edit/kernel-handle.d.ts.map +1 -0
  217. package/dist/edit/kernel-handle.js +7 -0
  218. package/dist/edit/kernel-handle.js.map +1 -0
  219. package/dist/edit/operator-utils.d.ts +33 -0
  220. package/dist/edit/operator-utils.d.ts.map +1 -0
  221. package/dist/edit/operator-utils.js +101 -0
  222. package/dist/edit/operator-utils.js.map +1 -0
  223. package/dist/edit/operators/bevel.d.ts +18 -0
  224. package/dist/edit/operators/bevel.d.ts.map +1 -0
  225. package/dist/edit/operators/bevel.js +65 -0
  226. package/dist/edit/operators/bevel.js.map +1 -0
  227. package/dist/edit/operators/bridge.d.ts +14 -0
  228. package/dist/edit/operators/bridge.d.ts.map +1 -0
  229. package/dist/edit/operators/bridge.js +55 -0
  230. package/dist/edit/operators/bridge.js.map +1 -0
  231. package/dist/edit/operators/dissolve-edges.d.ts +12 -0
  232. package/dist/edit/operators/dissolve-edges.d.ts.map +1 -0
  233. package/dist/edit/operators/dissolve-edges.js +55 -0
  234. package/dist/edit/operators/dissolve-edges.js.map +1 -0
  235. package/dist/edit/operators/dissolve-faces.d.ts +9 -0
  236. package/dist/edit/operators/dissolve-faces.d.ts.map +1 -0
  237. package/dist/edit/operators/dissolve-faces.js +98 -0
  238. package/dist/edit/operators/dissolve-faces.js.map +1 -0
  239. package/dist/edit/operators/dissolve-vertices.d.ts +13 -0
  240. package/dist/edit/operators/dissolve-vertices.d.ts.map +1 -0
  241. package/dist/edit/operators/dissolve-vertices.js +36 -0
  242. package/dist/edit/operators/dissolve-vertices.js.map +1 -0
  243. package/dist/edit/operators/extrude.d.ts +18 -0
  244. package/dist/edit/operators/extrude.d.ts.map +1 -0
  245. package/dist/edit/operators/extrude.js +33 -0
  246. package/dist/edit/operators/extrude.js.map +1 -0
  247. package/dist/edit/operators/fill-hole.d.ts +12 -0
  248. package/dist/edit/operators/fill-hole.d.ts.map +1 -0
  249. package/dist/edit/operators/fill-hole.js +29 -0
  250. package/dist/edit/operators/fill-hole.js.map +1 -0
  251. package/dist/edit/operators/grid-fill.d.ts +12 -0
  252. package/dist/edit/operators/grid-fill.d.ts.map +1 -0
  253. package/dist/edit/operators/grid-fill.js +20 -0
  254. package/dist/edit/operators/grid-fill.js.map +1 -0
  255. package/dist/edit/operators/heal-manifold.d.ts +15 -0
  256. package/dist/edit/operators/heal-manifold.d.ts.map +1 -0
  257. package/dist/edit/operators/heal-manifold.js +62 -0
  258. package/dist/edit/operators/heal-manifold.js.map +1 -0
  259. package/dist/edit/operators/inset.d.ts +16 -0
  260. package/dist/edit/operators/inset.d.ts.map +1 -0
  261. package/dist/edit/operators/inset.js +40 -0
  262. package/dist/edit/operators/inset.js.map +1 -0
  263. package/dist/edit/operators/loop-cut.d.ts +14 -0
  264. package/dist/edit/operators/loop-cut.d.ts.map +1 -0
  265. package/dist/edit/operators/loop-cut.js +120 -0
  266. package/dist/edit/operators/loop-cut.js.map +1 -0
  267. package/dist/edit/operators/merge-by-distance.d.ts +15 -0
  268. package/dist/edit/operators/merge-by-distance.d.ts.map +1 -0
  269. package/dist/edit/operators/merge-by-distance.js +78 -0
  270. package/dist/edit/operators/merge-by-distance.js.map +1 -0
  271. package/dist/edit/operators/recompute-normals.d.ts +7 -0
  272. package/dist/edit/operators/recompute-normals.d.ts.map +1 -0
  273. package/dist/edit/operators/recompute-normals.js +67 -0
  274. package/dist/edit/operators/recompute-normals.js.map +1 -0
  275. package/dist/edit/operators/subdivide-edges.d.ts +11 -0
  276. package/dist/edit/operators/subdivide-edges.d.ts.map +1 -0
  277. package/dist/edit/operators/subdivide-edges.js +106 -0
  278. package/dist/edit/operators/subdivide-edges.js.map +1 -0
  279. package/dist/edit/operators/subdivide-faces.d.ts +11 -0
  280. package/dist/edit/operators/subdivide-faces.d.ts.map +1 -0
  281. package/dist/edit/operators/subdivide-faces.js +45 -0
  282. package/dist/edit/operators/subdivide-faces.js.map +1 -0
  283. package/dist/edit/selection.d.ts +19 -0
  284. package/dist/edit/selection.d.ts.map +1 -0
  285. package/dist/edit/selection.js +21 -0
  286. package/dist/edit/selection.js.map +1 -0
  287. package/dist/edit/to-editable.d.ts +9 -0
  288. package/dist/edit/to-editable.d.ts.map +1 -0
  289. package/dist/edit/to-editable.js +19 -0
  290. package/dist/edit/to-editable.js.map +1 -0
  291. package/dist/edit/types.d.ts +111 -0
  292. package/dist/edit/types.d.ts.map +1 -0
  293. package/dist/edit/types.js +2 -0
  294. package/dist/edit/types.js.map +1 -0
  295. package/dist/edit/warnings.d.ts +14 -0
  296. package/dist/edit/warnings.d.ts.map +1 -0
  297. package/dist/edit/warnings.js +11 -0
  298. package/dist/edit/warnings.js.map +1 -0
  299. package/dist/index.d.ts +11 -0
  300. package/dist/index.d.ts.map +1 -0
  301. package/dist/index.js +6 -0
  302. package/dist/index.js.map +1 -0
  303. package/dist/inspect/index.d.ts +9 -0
  304. package/dist/inspect/index.d.ts.map +1 -0
  305. package/dist/inspect/index.js +5 -0
  306. package/dist/inspect/index.js.map +1 -0
  307. package/dist/inspect/inspect-material.d.ts +12 -0
  308. package/dist/inspect/inspect-material.d.ts.map +1 -0
  309. package/dist/inspect/inspect-material.js +2 -0
  310. package/dist/inspect/inspect-material.js.map +1 -0
  311. package/dist/inspect/mesh-to-readable.d.ts +4 -0
  312. package/dist/inspect/mesh-to-readable.d.ts.map +1 -0
  313. package/dist/inspect/mesh-to-readable.js +47 -0
  314. package/dist/inspect/mesh-to-readable.js.map +1 -0
  315. package/dist/inspect/mesh-to-wireframe.d.ts +5 -0
  316. package/dist/inspect/mesh-to-wireframe.d.ts.map +1 -0
  317. package/dist/inspect/mesh-to-wireframe.js +101 -0
  318. package/dist/inspect/mesh-to-wireframe.js.map +1 -0
  319. package/dist/inspect/normal-debug-material.d.ts +8 -0
  320. package/dist/inspect/normal-debug-material.d.ts.map +1 -0
  321. package/dist/inspect/normal-debug-material.js +42 -0
  322. package/dist/inspect/normal-debug-material.js.map +1 -0
  323. package/dist/inspect/normal-debug-shader.d.ts +2 -0
  324. package/dist/inspect/normal-debug-shader.d.ts.map +1 -0
  325. package/dist/inspect/normal-debug-shader.js +32 -0
  326. package/dist/inspect/normal-debug-shader.js.map +1 -0
  327. package/dist/inspect/wireframe-material.d.ts +9 -0
  328. package/dist/inspect/wireframe-material.d.ts.map +1 -0
  329. package/dist/inspect/wireframe-material.js +45 -0
  330. package/dist/inspect/wireframe-material.js.map +1 -0
  331. package/dist/inspect/wireframe-mesh.d.ts +9 -0
  332. package/dist/inspect/wireframe-mesh.d.ts.map +1 -0
  333. package/dist/inspect/wireframe-mesh.js +2 -0
  334. package/dist/inspect/wireframe-mesh.js.map +1 -0
  335. package/dist/inspect/wireframe-shader.d.ts +2 -0
  336. package/dist/inspect/wireframe-shader.d.ts.map +1 -0
  337. package/dist/inspect/wireframe-shader.js +24 -0
  338. package/dist/inspect/wireframe-shader.js.map +1 -0
  339. package/dist/passes/index.d.ts +6 -0
  340. package/dist/passes/index.d.ts.map +1 -0
  341. package/dist/passes/index.js +5 -0
  342. package/dist/passes/index.js.map +1 -0
  343. package/dist/passes/pass-sequence.d.ts +9 -0
  344. package/dist/passes/pass-sequence.d.ts.map +1 -0
  345. package/dist/passes/pass-sequence.js +21 -0
  346. package/dist/passes/pass-sequence.js.map +1 -0
  347. package/dist/passes/pass.d.ts +4 -0
  348. package/dist/passes/pass.d.ts.map +1 -0
  349. package/dist/passes/pass.js +99 -0
  350. package/dist/passes/pass.js.map +1 -0
  351. package/dist/pipeline.d.ts +16 -0
  352. package/dist/pipeline.d.ts.map +1 -0
  353. package/dist/pipeline.js +10 -0
  354. package/dist/pipeline.js.map +1 -0
  355. package/dist/rapid-renderer.d.ts +18 -0
  356. package/dist/rapid-renderer.d.ts.map +1 -0
  357. package/dist/rapid-renderer.js +58 -0
  358. package/dist/rapid-renderer.js.map +1 -0
  359. package/dist/render-pass.d.ts +33 -0
  360. package/dist/render-pass.d.ts.map +1 -0
  361. package/dist/render-pass.js +67 -0
  362. package/dist/render-pass.js.map +1 -0
  363. package/dist/render-target/render-target-canvas.d.ts +15 -0
  364. package/dist/render-target/render-target-canvas.d.ts.map +1 -0
  365. package/dist/render-target/render-target-canvas.js +59 -0
  366. package/dist/render-target/render-target-canvas.js.map +1 -0
  367. package/dist/render-target/render-target-multi.d.ts +4 -0
  368. package/dist/render-target/render-target-multi.d.ts.map +1 -0
  369. package/dist/render-target/render-target-multi.js +90 -0
  370. package/dist/render-target/render-target-multi.js.map +1 -0
  371. package/dist/render-target/render-target.d.ts +10 -0
  372. package/dist/render-target/render-target.d.ts.map +1 -0
  373. package/dist/render-target/render-target.js +98 -0
  374. package/dist/render-target/render-target.js.map +1 -0
  375. package/dist/render-target/types.d.ts +59 -0
  376. package/dist/render-target/types.d.ts.map +1 -0
  377. package/dist/render-target/types.js +2 -0
  378. package/dist/render-target/types.js.map +1 -0
  379. package/dist/uniform-pool-internals.d.ts +12 -0
  380. package/dist/uniform-pool-internals.d.ts.map +1 -0
  381. package/dist/uniform-pool-internals.js +24 -0
  382. package/dist/uniform-pool-internals.js.map +1 -0
  383. package/dist/uniform-pool-types.d.ts +22 -0
  384. package/dist/uniform-pool-types.d.ts.map +1 -0
  385. package/dist/uniform-pool-types.js +2 -0
  386. package/dist/uniform-pool-types.js.map +1 -0
  387. package/dist/uniform-pool.d.ts +30 -0
  388. package/dist/uniform-pool.d.ts.map +1 -0
  389. package/dist/uniform-pool.js +127 -0
  390. package/dist/uniform-pool.js.map +1 -0
  391. package/dist/utils/canvas-mouse-tracker.d.ts +11 -0
  392. package/dist/utils/canvas-mouse-tracker.d.ts.map +1 -0
  393. package/dist/utils/canvas-mouse-tracker.js +19 -0
  394. package/dist/utils/canvas-mouse-tracker.js.map +1 -0
  395. package/dist/utils/canvas-resolution.d.ts +9 -0
  396. package/dist/utils/canvas-resolution.d.ts.map +1 -0
  397. package/dist/utils/canvas-resolution.js +16 -0
  398. package/dist/utils/canvas-resolution.js.map +1 -0
  399. package/dist/utils/frame-clock.d.ts +10 -0
  400. package/dist/utils/frame-clock.d.ts.map +1 -0
  401. package/dist/utils/frame-clock.js +47 -0
  402. package/dist/utils/frame-clock.js.map +1 -0
  403. package/dist/utils/index.d.ts +7 -0
  404. package/dist/utils/index.d.ts.map +1 -0
  405. package/dist/utils/index.js +4 -0
  406. package/dist/utils/index.js.map +1 -0
  407. package/package.json +76 -0
  408. package/src/RenderPass.docs.md +41 -0
  409. package/src/createRenderPipeline.docs.md +34 -0
  410. package/src/domain/camera.docs.md +21 -0
  411. package/src/domain/deg-to-rad.docs.md +9 -0
  412. package/src/domain/material-factory.docs.md +59 -0
  413. package/src/domain/material.docs.md +12 -0
  414. package/src/domain/mesh.docs.md +28 -0
  415. package/src/domain/orthographic-camera.docs.md +22 -0
  416. package/src/domain/perspective-camera.docs.md +20 -0
  417. package/src/domain/srgb.docs.md +11 -0
  418. package/src/inspect/inspect-material.docs.md +23 -0
  419. package/src/inspect/mesh-to-wireframe.docs.md +29 -0
  420. package/src/inspect/normal-debug-material.docs.md +26 -0
  421. package/src/inspect/wireframe-material.docs.md +22 -0
  422. package/src/rapid-renderer.docs.md +18 -0
  423. package/src/uniform-pool.docs.md +60 -0
  424. package/src/utils/canvas-mouse-tracker.docs.md +13 -0
  425. package/src/utils/canvas-resolution.docs.md +13 -0
  426. package/src/utils/frame-clock.docs.md +14 -0
@@ -0,0 +1,22 @@
1
+ import type { UniformPool } from "./uniform-pool.ts";
2
+ export interface UniformPoolOptions {
3
+ readonly capacityBytes?: number;
4
+ }
5
+ export interface UniformLayout<T> {
6
+ readonly size: number;
7
+ readonly bindings?: readonly GPUBindGroupLayoutEntry[];
8
+ /** Optional layout to share with the pipeline that will consume this slot. */
9
+ readonly bindGroupLayout?: GPUBindGroupLayout;
10
+ encode(value: T, dst: ArrayBuffer, byteOffset: number): void;
11
+ }
12
+ export interface UniformSlot<T> {
13
+ readonly pool: UniformPool;
14
+ readonly layout: UniformLayout<T>;
15
+ readonly bindGroup: GPUBindGroup;
16
+ readonly bindGroupLayout: GPUBindGroupLayout;
17
+ readonly gpu: GPUBuffer;
18
+ readonly stride: number;
19
+ push(value: T): number;
20
+ pushBytes(bytes: ArrayBufferView<ArrayBuffer>): number;
21
+ }
22
+ //# sourceMappingURL=uniform-pool-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-pool-types.d.ts","sourceRoot":"","sources":["../src/uniform-pool-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACvD,8EAA8E;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;CACxD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=uniform-pool-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-pool-types.js","sourceRoot":"","sources":["../src/uniform-pool-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { type Device } from "@vgpu/core";
2
+ import type { UniformLayout, UniformPoolOptions, UniformSlot } from "./uniform-pool-types.ts";
3
+ export declare class UniformPool {
4
+ readonly device: Device;
5
+ readonly minOffsetAlignment: number;
6
+ readonly capacityBytes: number;
7
+ readonly maxUniformBindingSize: number;
8
+ readonly cpuMirror: ArrayBuffer;
9
+ readonly gpu: GPUBuffer;
10
+ private readonly bytes;
11
+ private head;
12
+ private hasUnflushedPushes;
13
+ private isDisposed;
14
+ constructor(device: Device, opts?: UniformPoolOptions);
15
+ get usedBytes(): number;
16
+ get disposed(): boolean;
17
+ alloc<T>(layout: UniformLayout<T>): UniformSlot<T>;
18
+ push<T>(slot: UniformSlot<T>, value: T): number;
19
+ pushBytes(slot: UniformSlot<unknown>, bytes: ArrayBufferView<ArrayBuffer>): number;
20
+ beginFrame(_frameIndex: number): void;
21
+ endFrame(): void;
22
+ assertReadyForSubmit(where: string): void;
23
+ dispose(): void;
24
+ private assertOwnsSlot;
25
+ private write;
26
+ private assertCanPush;
27
+ private assertLayoutFits;
28
+ private assertUsable;
29
+ }
30
+ //# sourceMappingURL=uniform-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-pool.d.ts","sourceRoot":"","sources":["../src/uniform-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAapD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE9F,qBAAa,WAAW;IAWV,QAAQ,CAAC,MAAM,EAAE,MAAM;IAVnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEN,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB;IASlE,IAAI,SAAS,IAAI,MAAM,CAAsB;IAC7C,IAAI,QAAQ,IAAI,OAAO,CAA4B;IAEnD,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAMlD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAK/C,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,GAAG,MAAM;IAQlF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMrC,QAAQ,IAAI,IAAI;IAMhB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,YAAY;CAIrB"}
@@ -0,0 +1,127 @@
1
+ import { VGPUError } from "@vgpu/core";
2
+ import { copyDstUsage, defaultCapacityBytes, defaultMaxUniformBindingSize, defaultMinOffsetAlignment, deviceLimit, invalidUsage, roundUp, shaderVisibility, uniformUsage, viewBytes, } from "./uniform-pool-internals.js";
3
+ export class UniformPool {
4
+ device;
5
+ minOffsetAlignment;
6
+ capacityBytes;
7
+ maxUniformBindingSize;
8
+ cpuMirror;
9
+ gpu;
10
+ bytes;
11
+ head = 0;
12
+ hasUnflushedPushes = false;
13
+ isDisposed = false;
14
+ constructor(device, opts = {}) {
15
+ this.device = device;
16
+ this.capacityBytes = opts.capacityBytes ?? defaultCapacityBytes;
17
+ this.minOffsetAlignment = deviceLimit(device, "minUniformBufferOffsetAlignment", defaultMinOffsetAlignment);
18
+ this.maxUniformBindingSize = deviceLimit(device, "maxUniformBufferBindingSize", defaultMaxUniformBindingSize);
19
+ this.cpuMirror = new ArrayBuffer(this.capacityBytes);
20
+ this.bytes = new Uint8Array(this.cpuMirror);
21
+ this.gpu = device.gpu.createBuffer({ label: "vgpu UniformPool", size: this.capacityBytes, usage: uniformUsage | copyDstUsage });
22
+ }
23
+ get usedBytes() { return this.head; }
24
+ get disposed() { return this.isDisposed; }
25
+ alloc(layout) {
26
+ this.assertUsable("UniformPool.alloc");
27
+ this.assertLayoutFits(layout);
28
+ return new PoolSlot(this, layout, roundUp(layout.size, this.minOffsetAlignment));
29
+ }
30
+ push(slot, value) {
31
+ this.assertOwnsSlot(slot, "UniformPool.push");
32
+ return this.write(slot.layout.size, slot.stride, (offset) => slot.layout.encode(value, this.cpuMirror, offset));
33
+ }
34
+ pushBytes(slot, bytes) {
35
+ this.assertOwnsSlot(slot, "UniformPool.pushBytes");
36
+ if (bytes.byteLength !== slot.layout.size) {
37
+ throw invalidUsage("UniformSlot.pushBytes", `Uniform bytes must match layout size ${slot.layout.size}.`);
38
+ }
39
+ return this.write(slot.layout.size, slot.stride, (offset) => this.bytes.set(viewBytes(bytes), offset));
40
+ }
41
+ beginFrame(_frameIndex) {
42
+ this.assertUsable("UniformPool.beginFrame");
43
+ this.head = 0;
44
+ this.hasUnflushedPushes = false;
45
+ }
46
+ endFrame() {
47
+ this.assertUsable("UniformPool.endFrame");
48
+ if (this.hasUnflushedPushes)
49
+ this.device.gpu.queue.writeBuffer(this.gpu, 0, this.cpuMirror, 0, this.head);
50
+ this.hasUnflushedPushes = false;
51
+ }
52
+ assertReadyForSubmit(where) {
53
+ this.assertUsable(where);
54
+ if (!this.hasUnflushedPushes)
55
+ return;
56
+ throw invalidUsage(where, "UniformPool has unflushed pushes; call endFrame() before submitting.");
57
+ }
58
+ dispose() {
59
+ if (this.isDisposed)
60
+ return;
61
+ this.isDisposed = true;
62
+ this.gpu.destroy();
63
+ }
64
+ assertOwnsSlot(slot, where) {
65
+ if (slot.pool === this)
66
+ return;
67
+ throw invalidUsage(where, "UniformSlot was allocated by a different UniformPool.");
68
+ }
69
+ write(layoutSize, stride, encode) {
70
+ this.assertUsable("UniformSlot.push");
71
+ this.assertCanPush(layoutSize, stride);
72
+ const offset = this.head;
73
+ encode(offset);
74
+ this.head += stride;
75
+ this.hasUnflushedPushes = true;
76
+ return offset;
77
+ }
78
+ assertCanPush(layoutSize, stride) {
79
+ if (this.head + stride <= this.capacityBytes)
80
+ return;
81
+ throw new VGPUError({
82
+ code: "VGPU-UNIFORM-POOL-OVERFLOW",
83
+ message: `UniformPool capacity ${this.capacityBytes} bytes is exceeded by a ${layoutSize}-byte layout.`,
84
+ where: "UniformSlot.push",
85
+ });
86
+ }
87
+ assertLayoutFits(layout) {
88
+ if (layout.size <= this.capacityBytes && layout.size <= this.maxUniformBindingSize)
89
+ return;
90
+ throw new VGPUError({
91
+ code: "VGPU-UNIFORM-LAYOUT-OVERSIZED",
92
+ message: `Uniform layout size ${layout.size} bytes is too large for this pool.`,
93
+ where: "UniformPool.alloc",
94
+ });
95
+ }
96
+ assertUsable(where) {
97
+ if (!this.isDisposed)
98
+ return;
99
+ throw invalidUsage(where, "UniformPool has been disposed.");
100
+ }
101
+ }
102
+ class PoolSlot {
103
+ pool;
104
+ layout;
105
+ stride;
106
+ bindGroup;
107
+ bindGroupLayout;
108
+ gpu;
109
+ constructor(pool, layout, stride) {
110
+ this.pool = pool;
111
+ this.layout = layout;
112
+ this.stride = stride;
113
+ this.gpu = pool.gpu;
114
+ this.bindGroupLayout = layout.bindGroupLayout ?? pool.device.gpu.createBindGroupLayout({
115
+ label: "UniformPool.slot.bgl",
116
+ entries: layout.bindings ?? [{ binding: 0, visibility: shaderVisibility(), buffer: { type: "uniform", hasDynamicOffset: true, minBindingSize: layout.size } }],
117
+ });
118
+ this.bindGroup = pool.device.gpu.createBindGroup({
119
+ label: "UniformPool.slot.bg",
120
+ layout: this.bindGroupLayout,
121
+ entries: [{ binding: 0, resource: { buffer: this.gpu, offset: 0, size: stride } }],
122
+ });
123
+ }
124
+ push(value) { return this.pool.push(this, value); }
125
+ pushBytes(bytes) { return this.pool.pushBytes(this, bytes); }
126
+ }
127
+ //# sourceMappingURL=uniform-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniform-pool.js","sourceRoot":"","sources":["../src/uniform-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CanvasMouseTrackerSpec {
2
+ readonly canvas: HTMLCanvasElement;
3
+ readonly normalize?: boolean;
4
+ readonly flipY?: boolean;
5
+ }
6
+ export interface CanvasMouseTracker {
7
+ readonly position: readonly [number, number];
8
+ dispose(): void;
9
+ }
10
+ export declare function canvasMouseTracker(spec: CanvasMouseTrackerSpec): CanvasMouseTracker;
11
+ //# sourceMappingURL=canvas-mouse-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-mouse-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/canvas-mouse-tracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAiBnF"}
@@ -0,0 +1,19 @@
1
+ export function canvasMouseTracker(spec) {
2
+ let position = Object.freeze([0, 0]);
3
+ const handler = (event) => {
4
+ const rect = spec.canvas.getBoundingClientRect();
5
+ const rawX = Number.isFinite(event.offsetX) ? event.offsetX : event.clientX - rect.left;
6
+ const rawY = Number.isFinite(event.offsetY) ? event.offsetY : event.clientY - rect.top;
7
+ const width = spec.canvas.width || rect.width || 1;
8
+ const height = spec.canvas.height || rect.height || 1;
9
+ const x = spec.normalize === true ? rawX / width : rawX;
10
+ const y = spec.normalize === true ? rawY / height : rawY;
11
+ position = Object.freeze([x, spec.flipY === true ? (spec.normalize === true ? 1 - y : height - y) : y]);
12
+ };
13
+ spec.canvas.addEventListener("pointermove", handler);
14
+ return Object.freeze({
15
+ get position() { return position; },
16
+ dispose: () => spec.canvas.removeEventListener("pointermove", handler),
17
+ });
18
+ }
19
+ //# sourceMappingURL=canvas-mouse-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-mouse-tracker.js","sourceRoot":"","sources":["../../src/utils/canvas-mouse-tracker.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,IAAI,QAAQ,GAA8B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QACxF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;QACvF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAU,CAAC,CAAC;IACnH,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,QAAQ,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC;QACnC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC;KACvE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface CanvasResolution {
2
+ readonly width: number;
3
+ readonly height: number;
4
+ dispose(): void;
5
+ }
6
+ export declare function canvasResolution(canvas: HTMLCanvasElement, opts?: {
7
+ readonly observe?: boolean;
8
+ }): CanvasResolution;
9
+ //# sourceMappingURL=canvas-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-resolution.d.ts","sourceRoot":"","sources":["../../src/utils/canvas-resolution.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,gBAAgB,CAcnH"}
@@ -0,0 +1,16 @@
1
+ export function canvasResolution(canvas, opts) {
2
+ let width = canvas.width;
3
+ let height = canvas.height;
4
+ const update = () => {
5
+ width = canvas.width;
6
+ height = canvas.height;
7
+ };
8
+ const observer = opts?.observe === true ? new ResizeObserver(update) : undefined;
9
+ observer?.observe(canvas);
10
+ return Object.freeze({
11
+ get width() { return width; },
12
+ get height() { return height; },
13
+ dispose: () => observer?.disconnect(),
14
+ });
15
+ }
16
+ //# sourceMappingURL=canvas-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-resolution.js","sourceRoot":"","sources":["../../src/utils/canvas-resolution.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,gBAAgB,CAAC,MAAyB,EAAE,IAAqC;IAC/F,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,KAAK,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE;KACtC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface FrameClock {
2
+ now(): number;
3
+ delta(): number;
4
+ reset(): void;
5
+ pause(): void;
6
+ resume(): void;
7
+ readonly isPaused: boolean;
8
+ }
9
+ export declare function frameClock(): FrameClock;
10
+ //# sourceMappingURL=frame-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-clock.d.ts","sourceRoot":"","sources":["../../src/utils/frame-clock.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,MAAM,CAAC;IACd,KAAK,IAAI,MAAM,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,UAAU,IAAI,UAAU,CA4CvC"}
@@ -0,0 +1,47 @@
1
+ export function frameClock() {
2
+ let startTime = performance.now();
3
+ let lastDeltaTime = startTime;
4
+ let pausedAt = 0;
5
+ let accumulatedPause = 0;
6
+ let paused = false;
7
+ const activeNow = () => {
8
+ const current = performance.now();
9
+ const pendingPause = paused ? current - pausedAt : 0;
10
+ return current - startTime - accumulatedPause - pendingPause;
11
+ };
12
+ return Object.freeze({
13
+ now: () => activeNow() / 1000,
14
+ delta: () => {
15
+ if (paused)
16
+ return 0;
17
+ const current = performance.now();
18
+ const value = (current - lastDeltaTime) / 1000;
19
+ lastDeltaTime = current;
20
+ return value;
21
+ },
22
+ reset: () => {
23
+ startTime = performance.now();
24
+ lastDeltaTime = startTime;
25
+ pausedAt = 0;
26
+ accumulatedPause = 0;
27
+ paused = false;
28
+ },
29
+ pause: () => {
30
+ if (paused)
31
+ return;
32
+ pausedAt = performance.now();
33
+ paused = true;
34
+ },
35
+ resume: () => {
36
+ if (!paused)
37
+ return;
38
+ const current = performance.now();
39
+ accumulatedPause += current - pausedAt;
40
+ lastDeltaTime += current - pausedAt;
41
+ pausedAt = 0;
42
+ paused = false;
43
+ },
44
+ get isPaused() { return paused; },
45
+ });
46
+ }
47
+ //# sourceMappingURL=frame-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-clock.js","sourceRoot":"","sources":["../../src/utils/frame-clock.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,UAAU;IACxB,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,aAAa,GAAG,SAAS,CAAC;IAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,SAAS,GAAG,GAAW,EAAE;QAC7B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,OAAO,GAAG,SAAS,GAAG,gBAAgB,GAAG,YAAY,CAAC;IAC/D,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,IAAI;QAC7B,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,MAAM;gBAAE,OAAO,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC;YAC/C,aAAa,GAAG,OAAO,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC9B,aAAa,GAAG,SAAS,CAAC;YAC1B,QAAQ,GAAG,CAAC,CAAC;YACb,gBAAgB,GAAG,CAAC,CAAC;YACrB,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,MAAM;gBAAE,OAAO;YACnB,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAClC,gBAAgB,IAAI,OAAO,GAAG,QAAQ,CAAC;YACvC,aAAa,IAAI,OAAO,GAAG,QAAQ,CAAC;YACpC,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { canvasMouseTracker } from "./canvas-mouse-tracker.ts";
2
+ export type { CanvasMouseTrackerSpec, CanvasMouseTracker } from "./canvas-mouse-tracker.ts";
3
+ export { frameClock } from "./frame-clock.ts";
4
+ export type { FrameClock } from "./frame-clock.ts";
5
+ export { canvasResolution } from "./canvas-resolution.ts";
6
+ export type { CanvasResolution } from "./canvas-resolution.ts";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { canvasMouseTracker } from "./canvas-mouse-tracker.js";
2
+ export { frameClock } from "./frame-clock.js";
3
+ export { canvasResolution } from "./canvas-resolution.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@vgpu/render",
3
+ "version": "0.0.1",
4
+ "description": "Render pipeline + render pass abstractions for vgpu.",
5
+ "keywords": [
6
+ "webgpu",
7
+ "graphics",
8
+ "rendering",
9
+ "render",
10
+ "pipeline",
11
+ "render-pass"
12
+ ],
13
+ "homepage": "https://github.com/vercel-labs/vgpu#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/vercel-labs/vgpu/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/vercel-labs/vgpu.git",
20
+ "directory": "packages/render"
21
+ },
22
+ "license": "MIT",
23
+ "author": "Matias Gonzalez <matiasngf@hotmail.com>",
24
+ "private": false,
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "sideEffects": false,
29
+ "type": "module",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js"
34
+ },
35
+ "./inspect": {
36
+ "types": "./dist/inspect/index.d.ts",
37
+ "import": "./dist/inspect/index.js"
38
+ },
39
+ "./utils": {
40
+ "types": "./dist/utils/index.d.ts",
41
+ "import": "./dist/utils/index.js"
42
+ },
43
+ "./edit": {
44
+ "types": "./dist/edit/index.d.ts",
45
+ "import": "./dist/edit/index.js"
46
+ },
47
+ "./passes": {
48
+ "types": "./dist/passes/index.d.ts",
49
+ "import": "./dist/passes/index.js"
50
+ }
51
+ },
52
+ "files": [
53
+ "dist",
54
+ "!dist/tsconfig.tsbuildinfo",
55
+ "src/**/*.docs.md",
56
+ "README.md",
57
+ "LICENSE"
58
+ ],
59
+ "dependencies": {
60
+ "wgpu-matrix": "^3.4.2",
61
+ "@vgpu/core": "0.0.1"
62
+ },
63
+ "vgpuExportBundleBudgetsGzipBytes": {
64
+ ".": 49152,
65
+ "./inspect": 4096,
66
+ "./utils": 2048,
67
+ "./edit": 25600,
68
+ "./passes": 3584
69
+ },
70
+ "scripts": {
71
+ "build": "tsc -b",
72
+ "typecheck": "tsc -b",
73
+ "lint": "tsc -b --pretty false",
74
+ "test": "cd ../.. && vitest run packages/render"
75
+ }
76
+ }
@@ -0,0 +1,41 @@
1
+ # RenderPass
2
+
3
+ `RenderPass` is a command-encoding wrapper for drawing into color
4
+ attachments. Construct it with a core `Device` and `RenderPassOptions`, encode
5
+ render commands, then call `end()` to finish the pass and submit the command
6
+ buffer through `Device.queue`.
7
+
8
+ `RenderPassOptions` contains `colorAttachments` and an optional `label`.
9
+ `ColorAttachment.view` accepts either a core `Texture` or a raw
10
+ `GPUTextureView`; `loadOp`, `storeOp`, and `clearValue` are forwarded to WebGPU.
11
+
12
+ Commands mirror the WebGPU render pass encoder:
13
+
14
+ - `setPipeline(pipeline)` binds a raw `GPURenderPipeline`.
15
+ - `setBindGroup(index, group, dynamicOffsets?)` binds a raw `GPUBindGroup`.
16
+ - `setVertexBuffer(slot, buffer, offset?, size?)` binds a core `Buffer` or raw
17
+ `GPUBuffer` for vertex input.
18
+ - `draw({ vertexCount, instanceCount?, firstVertex?, firstInstance? })` issues a
19
+ non-indexed draw. The numeric WebGPU-style `draw(vertexCount, ...)` call is
20
+ also accepted.
21
+
22
+ Use `gpu` when you need direct `GPURenderPassEncoder` access for commands that
23
+ are not wrapped yet.
24
+
25
+ Invariants: a pass is single-use. After `end()`, the underlying
26
+ `GPURenderPassEncoder` is invalid, so `RenderPass.gpu` throws `VGPUError` with
27
+ code `VGPU-RENDER-PASS-ENDED`. Calling `end()` more than once is safe and is a
28
+ no-op after the first submission.
29
+
30
+ Example:
31
+
32
+ ```ts
33
+ const pass = new RenderPass(device, {
34
+ colorAttachments: [{ view: target, loadOp: "clear", storeOp: "store", clearValue: [0, 0, 0, 1] }],
35
+ });
36
+ pass.setPipeline(pipeline);
37
+ pass.setBindGroup(0, uniforms);
38
+ pass.setVertexBuffer(0, vertices);
39
+ pass.draw({ vertexCount: 3 });
40
+ pass.end();
41
+ ```
@@ -0,0 +1,34 @@
1
+ # createRenderPipeline
2
+
3
+ Creates a GPU render pipeline from a vgpu `Shader` plus vertex and fragment
4
+ entry points. Returns a raw `GPURenderPipeline` with no wrapper.
5
+
6
+ ## Signature
7
+
8
+ `createRenderPipeline(device: Device, opts: RenderPipelineOptions): GPURenderPipeline`
9
+
10
+ ## Options
11
+
12
+ - `shader`: the `Shader` whose compiled GPU module will back both stages.
13
+ - `vertex.entry`: the vertex shader entry-point name.
14
+ - `fragment.entry`: the fragment shader entry-point name.
15
+ - `fragment.targets`: the color target formats and blend/write settings.
16
+ - `primitive`: optional WebGPU primitive state such as topology or culling.
17
+ - `layout`: optional pipeline layout, or `"auto"` to let WebGPU derive one.
18
+ - `label`: optional debug label forwarded to WebGPU.
19
+
20
+ ## Example
21
+
22
+ ```ts
23
+ const pipeline = createRenderPipeline(device, {
24
+ shader,
25
+ vertex: { entry: "vs_main" },
26
+ fragment: { entry: "fs_main", targets: [{ format: "rgba8unorm" }] },
27
+ primitive: { topology: "triangle-list" },
28
+ });
29
+ ```
30
+
31
+ ## Notes
32
+
33
+ The returned `GPURenderPipeline` can be used directly with WebGPU APIs or
34
+ passed to `RenderPass.setPipeline`.
@@ -0,0 +1,21 @@
1
+ # Camera
2
+
3
+ A `Camera` is a plain value that contains the data shaders need to draw from a viewpoint.
4
+
5
+ It has a `viewProjectionMatrix`, a 16-element column-major `Float32Array`, and a `position`, a 3-element vector in world space. Camera factories compute the matrix once when you create the camera.
6
+
7
+ The returned camera object is frozen, so its fields cannot be replaced. The typed-array buffers are not frozen; mutating them after creation is undefined behavior. Copy a matrix or position first if you need your own editable snapshot.
8
+
9
+ ```ts
10
+ import { perspectiveCamera, degToRad } from "@vgpu/render";
11
+
12
+ const camera = perspectiveCamera({
13
+ fovYRadians: degToRad(45),
14
+ aspect: 1,
15
+ near: 0.1,
16
+ far: 100,
17
+ position: [2, 2, 3],
18
+ target: [0, 0, 0],
19
+ });
20
+ // camera.viewProjectionMatrix is a 16-element column-major Float32Array.
21
+ ```
@@ -0,0 +1,9 @@
1
+ # degToRad
2
+
3
+ Converts degrees to radians for numeric inputs such as camera field-of-view values.
4
+
5
+ Use it when a design, note, or UI control gives an angle in degrees but the render API expects radians:
6
+
7
+ ```ts
8
+ const fovYRadians = degToRad(50);
9
+ ```
@@ -0,0 +1,59 @@
1
+ # `material()` factory
2
+
3
+ `material()` builds a render `Material` from WGSL vertex and fragment source. It injects a uniform struct when the schema has fields, creates the shader module, creates a render pipeline, allocates one uniform buffer, and returns a material with `writeUniforms()` plus raw GPU objects under `.gpu` for advanced use.
4
+
5
+ ## Uniform schema
6
+
7
+ Pass `uniforms` as an object where each key is the field name used by the shader and each value is a supported WGSL type. The supported types are `f32`, `u32`, `i32`, `vec2f`, `vec3f`, `vec4f`, `vec2u`, `vec3u`, `vec4u`, `vec2i`, `vec3i`, `vec4i`, `mat3x3f`, and `mat4x4f`.
8
+
9
+ The name `uniforms` is reserved because the factory creates a variable with that name. An empty schema is allowed. With an empty schema the factory does not inject the `Uniforms` struct or binding, and `uniformByteSize` is `0`.
10
+
11
+ Uniform byte layout follows WGSL alignment rules. Scalars align to 4 bytes, `vec2` values align to 8 bytes, `vec3` and `vec4` values align to 16 bytes, `mat3x3f` occupies 48 bytes, and `mat4x4f` occupies 64 bytes. The final struct size is rounded up to at least 16-byte alignment so `{ time: 'f32' }` has `uniformByteSize === 16`.
12
+
13
+ ## Vertex layouts
14
+
15
+ Choose one `vertexLayout` value:
16
+
17
+ - `position-only`: location 0 is `vec3<f32>`, stride 12 bytes.
18
+ - `position-normal`: location 0 is position and location 1 is normal, stride 24 bytes.
19
+ - `position-normal-uv`: location 0 is position, location 1 is normal, and location 2 is uv, stride 32 bytes.
20
+ - `position-uv`: location 0 is position and location 1 is uv, stride 20 bytes.
21
+
22
+ ## WGSL conventions
23
+
24
+ When the schema is not empty, the factory injects this binding before your shader source:
25
+
26
+ ```wgsl
27
+ struct Uniforms {
28
+ fieldName: f32,
29
+ };
30
+ @group(0) @binding(0) var<uniform> uniforms: Uniforms;
31
+ ```
32
+
33
+ Your shader reads fields as `uniforms.fieldName`. Provide `vs_main` and `fs_main` entry points.
34
+
35
+ ## Example
36
+
37
+ ```ts
38
+ const mat = material({
39
+ device,
40
+ vertexLayout: 'position-only',
41
+ uniforms: { time: 'f32' },
42
+ vertex: `
43
+ struct VertexIn { @location(0) position: vec3<f32> };
44
+ @vertex fn vs_main(in: VertexIn) -> @builtin(position) vec4<f32> {
45
+ return vec4<f32>(in.position, 1.0);
46
+ }`,
47
+ fragment: `
48
+ @fragment fn fs_main() -> @location(0) vec4<f32> {
49
+ let pulse = 0.5 + 0.5 * sin(uniforms.time);
50
+ return vec4<f32>(pulse, 0.2, 1.0 - pulse, 1.0);
51
+ }`,
52
+ });
53
+
54
+ mat.writeUniforms?.({ time: performance.now() / 1000 });
55
+ ```
56
+
57
+ ## `writeUniforms()`
58
+
59
+ `writeUniforms()` is strict. Pass every uniform on every call, and make the keys match the schema exactly. A missing key or an extra key throws `VGPU-CORE-INVALID-USAGE`. Values can be numbers, arrays, or typed arrays. Matrix values are passed in column-major order.
@@ -0,0 +1,12 @@
1
+ # Material
2
+
3
+ A `Material` is the GPU state needed to draw a mesh with a shader. It contains:
4
+
5
+ - `pipeline`: the ready-to-bind `GPURenderPipeline`.
6
+ - `bindGroupLayout`: the layout for per-draw uniforms at group 0.
7
+ - `shader`: the compiled vgpu shader object.
8
+ - `uniformByteSize`: the number of bytes each uniform record must provide.
9
+
10
+ Use the `material()` factory to build custom materials from WGSL vertex and fragment entry points.
11
+
12
+ `MaterialUniformValue` is the value shape accepted by generic material uniform writers: a number, readonly number array, or typed numeric array.