@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,106 @@
1
+ import { invalidUsage, shaderVisibility } from "../uniform-pool-internals.js";
2
+ import { alignUniforms, isWgslUniformType, wgslType } from "./wgsl-alignment.js";
3
+ import { materialTextureState } from "./material-textures.js";
4
+ import { vertexBufferLayout } from "./vertex-layout.js";
5
+ const DEFAULT_TARGET_FORMAT = "bgra8unorm-srgb";
6
+ export function material(spec) {
7
+ validateSchema(spec.uniforms);
8
+ const layout = alignUniforms(spec.uniforms);
9
+ const textures = materialTextureState(spec.device, spec.textures, spec.samplers, layout.byteSize === 0 ? 0 : 1);
10
+ const code = `${header(layout.fields)}\n${spec.vertex}\n${spec.fragment}`;
11
+ const shader = createShader(spec.device, code);
12
+ const bindGroupLayout = spec.device.gpu.createBindGroupLayout({
13
+ label: "material.bgl",
14
+ entries: [...uniformLayoutEntries(layout.byteSize), ...textures.layoutEntries],
15
+ });
16
+ const uniformBuffer = spec.device.createBuffer({ label: "material.uniforms", size: Math.max(16, layout.byteSize), usage: ["uniform", "copy_dst", "copy_src"] });
17
+ let activeBindGroup = createBindGroup(spec.device, bindGroupLayout, uniformBuffer.gpu, layout.byteSize, textures.entries);
18
+ const pipeline = createPipeline(spec, shader.gpu, bindGroupLayout);
19
+ const gpu = { pipeline, uniformBuffer: uniformBuffer.gpu, defaultSampler: textures.defaultSampler, get bindGroup() { return activeBindGroup; } };
20
+ return Object.freeze({
21
+ pipeline, bindGroupLayout, get bindGroup() { return activeBindGroup; }, shader, uniformByteSize: layout.byteSize,
22
+ uniformOffsets: layout.offsets, textureBindings: textures.textureBindings, samplerBindings: textures.samplerBindings,
23
+ params: { baseColor: [0, 0, 0], metallic: 0, roughness: 0 }, gpu,
24
+ writeUniforms: (values) => writeUniforms(spec.device, uniformBuffer.gpu, layout.fields, values),
25
+ writeTextures: (values) => { activeBindGroup = createBindGroup(spec.device, bindGroupLayout, uniformBuffer.gpu, layout.byteSize, textures.writeTextures(values)); },
26
+ dispose: () => { uniformBuffer.destroy(); textures.dispose(); },
27
+ });
28
+ }
29
+ function validateSchema(schema) {
30
+ for (const [name, type] of Object.entries(schema)) {
31
+ if (name === "uniforms")
32
+ throw invalidUsage("material", "Uniform name must not be 'uniforms'.");
33
+ if (!isWgslUniformType(type))
34
+ throw invalidUsage("material", `Unsupported uniform type for '${name}'.`);
35
+ }
36
+ }
37
+ function header(fields) {
38
+ if (fields.length === 0)
39
+ return "";
40
+ const lines = fields.map((field) => ` ${field.name}: ${wgslType(field.type)},`);
41
+ return [`struct Uniforms {`, ...lines, `};`, `@group(0) @binding(0) var<uniform> uniforms: Uniforms;`].join("\n");
42
+ }
43
+ function uniformLayoutEntries(byteSize) {
44
+ return byteSize === 0 ? [] : [{ binding: 0, visibility: shaderVisibility(), buffer: { type: "uniform", minBindingSize: byteSize } }];
45
+ }
46
+ function createBindGroup(device, layout, buffer, byteSize, entries) {
47
+ return device.gpu.createBindGroup({ label: "material.bindGroup", layout, entries: [...uniformEntries(buffer, byteSize), ...entries] });
48
+ }
49
+ function uniformEntries(buffer, byteSize) {
50
+ return byteSize === 0 ? [] : [{ binding: 0, resource: { buffer, size: byteSize } }];
51
+ }
52
+ function createShader(device, code) {
53
+ try {
54
+ return device.createShader(code);
55
+ }
56
+ catch (error) {
57
+ throw invalidUsage("material", `WGSL error: ${messageOf(error)}`);
58
+ }
59
+ }
60
+ function createPipeline(spec, module, bindGroupLayout) {
61
+ try {
62
+ return spec.device.gpu.createRenderPipeline({
63
+ label: "material.pipeline", layout: spec.device.gpu.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),
64
+ vertex: { module, entryPoint: "vs_main", buffers: [vertexBufferLayout(spec.vertexLayout)] },
65
+ fragment: { module, entryPoint: "fs_main", targets: [{ format: spec.targetFormat ?? DEFAULT_TARGET_FORMAT }] },
66
+ primitive: { topology: "triangle-list", cullMode: "back", frontFace: "ccw" },
67
+ depthStencil: spec.depthFormat === null ? undefined : { format: spec.depthFormat ?? "depth24plus", depthWriteEnabled: true, depthCompare: "less" },
68
+ });
69
+ }
70
+ catch (error) {
71
+ throw invalidUsage("material", `WGSL error: ${messageOf(error)}`);
72
+ }
73
+ }
74
+ function writeUniforms(device, buffer, fields, values) {
75
+ const keys = new Set(Object.keys(values));
76
+ for (const field of fields)
77
+ if (!keys.delete(field.name))
78
+ throw invalidUsage("material.writeUniforms", `Missing uniform '${field.name}'.`);
79
+ const extra = keys.values().next().value;
80
+ if (extra)
81
+ throw invalidUsage("material.writeUniforms", `Unknown uniform '${extra}'.`);
82
+ const size = fields.length === 0 ? 0 : Math.max(...fields.map((field) => field.offset + field.size));
83
+ const bytes = new Uint8Array(Math.max(16, size));
84
+ const view = new DataView(bytes.buffer);
85
+ for (const field of fields)
86
+ writeField(view, field, values[field.name]);
87
+ device.gpu.queue.writeBuffer(buffer, 0, bytes);
88
+ }
89
+ function writeField(view, field, value) {
90
+ const data = typeof value === "number" ? [value] : Array.from(value);
91
+ const setter = field.type === "u32" || field.type.endsWith("u") ? "setUint32" : field.type === "i32" || field.type.endsWith("i") ? "setInt32" : "setFloat32";
92
+ const needed = field.type === "mat3x3f" ? 9 : field.type === "mat4x4f" ? 16 : field.size / 4;
93
+ if (data.length < needed)
94
+ throw invalidUsage("material.writeUniforms", `Uniform '${field.name}' needs ${needed} value(s).`);
95
+ if (field.type === "mat3x3f") {
96
+ for (let column = 0; column < 3; column++)
97
+ for (let row = 0; row < 3; row++)
98
+ set(view, setter, field.offset + column * 16 + row * 4, data[column * 3 + row]);
99
+ return;
100
+ }
101
+ for (let index = 0; index < needed; index++)
102
+ set(view, setter, field.offset + index * 4, data[index]);
103
+ }
104
+ function set(view, setter, offset, value) { view[setter](offset, value, true); }
105
+ function messageOf(error) { return error instanceof Error ? error.message : String(error); }
106
+ //# sourceMappingURL=material-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-factory.js","sourceRoot":"","sources":["../../src/domain/material-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAA2C,MAAM,qBAAqB,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAsCxD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEhD,MAAM,UAAU,QAAQ,CAItB,IAA2B;IAC3B,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC5D,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;KAC/E,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAChK,IAAI,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1H,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,IAAI,SAAS,KAAK,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACjJ,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,eAAe,EAAE,IAAI,SAAS,KAAK,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,QAAQ;QAChH,cAAc,EAAE,MAAM,CAAC,OAA4C,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzJ,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG;QACzE,aAAa,EAAE,CAAC,MAAqC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAsC,CAAC;QAC9J,aAAa,EAAE,CAAC,MAA6B,EAAE,EAAE,GAAG,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1L,OAAO,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,IAAI,KAAK,UAAU;YAAE,MAAM,YAAY,CAAC,UAAU,EAAE,sCAAsC,CAAC,CAAC;QAChG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAAE,MAAM,YAAY,CAAC,UAAU,EAAE,iCAAiC,IAAI,IAAI,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,MAA+B;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,OAAO,CAAC,mBAAmB,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,wDAAwD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvI,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,MAA0B,EAAE,MAAiB,EAAE,QAAgB,EAAE,OAAqC;IAC7I,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;AACzI,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB,EAAE,QAAgB;IACzD,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,IAAY;IAChD,IAAI,CAAC;QAAC,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IACzC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,YAAY,CAAC,UAAU,EAAE,eAAe,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACtF,CAAC;AAED,SAAS,cAAc,CAAC,IAA6H,EAAE,MAAuB,EAAE,eAAmC;IACjN,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC;YAC1C,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;YACjH,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE;YAC3F,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,qBAAqB,EAAE,CAAC,EAAE;YAC9G,SAAS,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;YAC5E,YAAY,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;SACnJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,YAAY,CAAC,UAAU,EAAE,eAAe,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACxF,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,MAAiB,EAAE,MAA+B,EAAE,MAAoC;IAC7H,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,YAAY,CAAC,wBAAwB,EAAE,oBAAoB,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3I,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAC;IAC/D,IAAI,KAAK;QAAE,MAAM,YAAY,CAAC,wBAAwB,EAAE,oBAAoB,KAAK,IAAI,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrG,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,IAAc,EAAE,KAAmB,EAAE,KAAmB;IAC1E,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;IAC7J,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7F,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;QAAE,MAAM,YAAY,CAAC,wBAAwB,EAAE,YAAY,KAAK,CAAC,IAAI,WAAW,MAAM,YAAY,CAAC,CAAC;IAC5H,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAAC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE;YAAE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;gBAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACxM,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC;AACzG,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,MAA+C,EAAE,MAAc,EAAE,KAAa,IAAU,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACzJ,SAAS,SAAS,CAAC,KAAc,IAAY,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Device } from "@vgpu/core";
2
+ import { type MaterialSamplerSpec } from "./material-textures-schema.ts";
3
+ export interface Sampler {
4
+ readonly gpu: GPUSampler;
5
+ }
6
+ export declare function sampler(device: Device, spec: MaterialSamplerSpec): Sampler;
7
+ //# sourceMappingURL=material-sampler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-sampler.d.ts","sourceRoot":"","sources":["../../src/domain/material-sampler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAE5F,MAAM,WAAW,OAAO;IAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;CAAE;AAEtD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAM1E"}
@@ -0,0 +1,11 @@
1
+ import { invalidUsage } from "../uniform-pool-internals.js";
2
+ import { samplerDescriptor } from "./material-textures-schema.js";
3
+ export function sampler(device, spec) {
4
+ try {
5
+ return Object.freeze({ gpu: device.gpu.createSampler(samplerDescriptor(spec)) });
6
+ }
7
+ catch (error) {
8
+ throw invalidUsage("sampler", error instanceof Error ? error.message : String(error));
9
+ }
10
+ }
11
+ //# sourceMappingURL=material-sampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-sampler.js","sourceRoot":"","sources":["../../src/domain/material-sampler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAA4B,MAAM,+BAA+B,CAAC;AAI5F,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,IAAyB;IAC/D,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ export declare const DEFAULT_MATERIAL_SAMPLER = "materialSampler";
2
+ export type TextureKind = "texture_2d_f32" | "texture_cube_f32" | "texture_2d_array_f32";
3
+ export interface TextureSpec {
4
+ readonly kind: TextureKind;
5
+ readonly sampler?: string;
6
+ }
7
+ export type MaterialTextureSpec = TextureKind | TextureSpec;
8
+ export type SamplerFilter = "linear" | "nearest";
9
+ export type SamplerAddressMode = "clamp-to-edge" | "repeat" | "mirror-repeat";
10
+ export type SamplerKind = "linear-clamp" | "linear-repeat" | "nearest-clamp" | "nearest-repeat";
11
+ export interface SamplerSpec {
12
+ readonly mag?: SamplerFilter;
13
+ readonly min?: SamplerFilter;
14
+ readonly mip?: SamplerFilter;
15
+ readonly addressU?: SamplerAddressMode;
16
+ readonly addressV?: SamplerAddressMode;
17
+ readonly addressW?: SamplerAddressMode;
18
+ readonly maxAnisotropy?: 1 | 2 | 4 | 8 | 16;
19
+ }
20
+ export type MaterialSamplerSpec = SamplerKind | SamplerSpec;
21
+ export type TextureValue = import("@vgpu/core").Texture | GPUTextureView;
22
+ export type WriteTextureValues<T> = {
23
+ readonly [K in keyof T]: TextureValue;
24
+ };
25
+ export declare function isTextureKind(value: unknown): value is TextureKind;
26
+ export declare function textureWgslType(kind: TextureKind): string;
27
+ export declare function samplerDescriptor(spec: MaterialSamplerSpec): GPUSamplerDescriptor;
28
+ export declare function normalizeSampler(spec: MaterialSamplerSpec): Required<SamplerSpec>;
29
+ //# sourceMappingURL=material-textures-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-textures-schema.d.ts","sourceRoot":"","sources":["../../src/domain/material-textures-schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAEzF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AACjD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,QAAQ,GAAG,eAAe,CAAC;AAC9E,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAEhG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;CAC7C;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,WAAW,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,EAAE,OAAO,GAAG,cAAc,CAAC;AACzE,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY;CAAE,CAAC;AAE9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAIzD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAWjF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,QAAQ,CAAC,WAAW,CAAC,CAgBjF"}
@@ -0,0 +1,57 @@
1
+ export const DEFAULT_MATERIAL_SAMPLER = "materialSampler";
2
+ export function isTextureKind(value) {
3
+ return value === "texture_2d_f32" || value === "texture_cube_f32" || value === "texture_2d_array_f32";
4
+ }
5
+ export function textureWgslType(kind) {
6
+ if (kind === "texture_cube_f32")
7
+ return "texture_cube<f32>";
8
+ if (kind === "texture_2d_array_f32")
9
+ return "texture_2d_array<f32>";
10
+ return "texture_2d<f32>";
11
+ }
12
+ export function samplerDescriptor(spec) {
13
+ const normalized = normalizeSampler(spec);
14
+ return {
15
+ magFilter: normalized.mag,
16
+ minFilter: normalized.min,
17
+ mipmapFilter: normalized.mip,
18
+ addressModeU: normalized.addressU,
19
+ addressModeV: normalized.addressV,
20
+ addressModeW: normalized.addressW,
21
+ maxAnisotropy: normalized.maxAnisotropy,
22
+ };
23
+ }
24
+ export function normalizeSampler(spec) {
25
+ if (typeof spec === "string")
26
+ return samplerKind(spec);
27
+ assertKnownKeys(spec);
28
+ const normalized = {
29
+ mag: spec.mag ?? "linear",
30
+ min: spec.min ?? "linear",
31
+ mip: spec.mip ?? "linear",
32
+ addressU: spec.addressU ?? "clamp-to-edge",
33
+ addressV: spec.addressV ?? "clamp-to-edge",
34
+ addressW: spec.addressW ?? "clamp-to-edge",
35
+ maxAnisotropy: spec.maxAnisotropy ?? 1,
36
+ };
37
+ if (!isFilter(normalized.mag) || !isFilter(normalized.min) || !isFilter(normalized.mip))
38
+ throw new Error("Invalid sampler filter.");
39
+ if (!isAddress(normalized.addressU) || !isAddress(normalized.addressV) || !isAddress(normalized.addressW))
40
+ throw new Error("Invalid sampler address mode.");
41
+ if (![1, 2, 4, 8, 16].includes(normalized.maxAnisotropy))
42
+ throw new Error("Invalid sampler maxAnisotropy.");
43
+ return normalized;
44
+ }
45
+ function samplerKind(kind) {
46
+ const linear = kind.startsWith("linear");
47
+ const repeat = kind.endsWith("repeat");
48
+ return { mag: linear ? "linear" : "nearest", min: linear ? "linear" : "nearest", mip: linear ? "linear" : "nearest", addressU: repeat ? "repeat" : "clamp-to-edge", addressV: repeat ? "repeat" : "clamp-to-edge", addressW: repeat ? "repeat" : "clamp-to-edge", maxAnisotropy: 1 };
49
+ }
50
+ function assertKnownKeys(spec) {
51
+ for (const key of Object.keys(spec))
52
+ if (!["mag", "min", "mip", "addressU", "addressV", "addressW", "maxAnisotropy"].includes(key))
53
+ throw new Error(`Unknown sampler field '${key}'.`);
54
+ }
55
+ function isFilter(value) { return value === "linear" || value === "nearest"; }
56
+ function isAddress(value) { return value === "clamp-to-edge" || value === "repeat" || value === "mirror-repeat"; }
57
+ //# sourceMappingURL=material-textures-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-textures-schema.js","sourceRoot":"","sources":["../../src/domain/material-textures-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Device } from "@vgpu/core";
2
+ import { type MaterialSamplerSpec, type MaterialTextureSpec, type WriteTextureValues } from "./material-textures-schema.ts";
3
+ export interface MaterialTextureState<T extends Record<string, MaterialTextureSpec>, S extends Record<string, MaterialSamplerSpec>> {
4
+ readonly layoutEntries: readonly GPUBindGroupLayoutEntry[];
5
+ readonly entries: readonly GPUBindGroupEntry[];
6
+ readonly textureBindings: Readonly<Record<keyof T, number>>;
7
+ readonly samplerBindings: Readonly<Record<string, number>>;
8
+ readonly defaultSampler?: GPUSampler;
9
+ readonly writeTextures: (values: WriteTextureValues<T>) => readonly GPUBindGroupEntry[];
10
+ readonly dispose: () => void;
11
+ }
12
+ export declare function materialTextureState<T extends Record<string, MaterialTextureSpec>, S extends Record<string, MaterialSamplerSpec>>(device: Device, textures: T | undefined, samplers: S | undefined, firstBinding: number): MaterialTextureState<T, S>;
13
+ //# sourceMappingURL=material-textures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-textures.d.ts","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;AAElD,OAAO,EAA+E,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAoB,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAE3N,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAChI,QAAQ,CAAC,aAAa,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC/C,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,SAAS,iBAAiB,EAAE,CAAC;IACxF,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAID,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/H,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,QAAQ,EAAE,CAAC,GAAG,SAAS,EACvB,YAAY,EAAE,MAAM,GACnB,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAe5B"}
@@ -0,0 +1,91 @@
1
+ import { invalidUsage, shaderVisibility } from "../uniform-pool-internals.js";
2
+ import { DEFAULT_MATERIAL_SAMPLER, isTextureKind, samplerDescriptor } from "./material-textures-schema.js";
3
+ export function materialTextureState(device, textures, samplers, firstBinding) {
4
+ const textureFields = textureFieldsOf(textures ?? {}, firstBinding + samplerCount(textures, samplers));
5
+ const samplerEntries = samplersOf(device, textures, samplers, firstBinding);
6
+ validateSamplerRefs(textures ?? {}, Object.keys(samplerEntries.byName));
7
+ const placeholders = textureFields.map((field) => placeholder(device, field.kind));
8
+ const entries = [...samplerEntries.entries, ...textureFields.map((field, i) => ({ binding: field.binding, resource: placeholders[i].view }))];
9
+ return {
10
+ layoutEntries: [...samplerEntries.layoutEntries, ...textureFields.map(textureLayoutEntry)],
11
+ entries,
12
+ textureBindings: Object.fromEntries(textureFields.map((field) => [field.name, field.binding])),
13
+ samplerBindings: samplerEntries.byName,
14
+ defaultSampler: samplerEntries.defaultSampler,
15
+ writeTextures: (values) => [...samplerEntries.entries, ...textureEntries(textureFields, values)],
16
+ dispose: () => placeholders.forEach((value) => value.texture.destroy()),
17
+ };
18
+ }
19
+ function samplerCount(textures, samplers) {
20
+ const explicit = Object.keys(samplers ?? {}).length;
21
+ return explicit > 0 ? explicit : Object.keys((textures ?? {})).length > 0 ? 1 : 0;
22
+ }
23
+ function samplersOf(device, textures, samplers, first) {
24
+ const raw = Object.entries(samplers ?? {});
25
+ const specs = raw.length > 0 ? raw : Object.keys((textures ?? {})).length > 0 ? [[DEFAULT_MATERIAL_SAMPLER, { mag: "linear", min: "linear", mip: "linear" }]] : [];
26
+ const byName = {};
27
+ const gpuSamplers = specs.map(([name, spec], index) => {
28
+ try {
29
+ const gpu = device.gpu.createSampler(samplerDescriptor(spec));
30
+ byName[name] = first + index;
31
+ return { name, gpu, binding: first + index };
32
+ }
33
+ catch (error) {
34
+ throw invalidUsage("material", `Invalid sampler '${name}': ${messageOf(error)}`);
35
+ }
36
+ });
37
+ return {
38
+ byName,
39
+ defaultSampler: raw.length === 0 && gpuSamplers.length > 0 ? gpuSamplers[0].gpu : undefined,
40
+ entries: gpuSamplers.map(({ binding, gpu }) => ({ binding, resource: gpu })),
41
+ layoutEntries: gpuSamplers.map(({ binding }) => ({ binding, visibility: shaderVisibility(), sampler: { type: "filtering" } })),
42
+ };
43
+ }
44
+ function textureFieldsOf(schema, first) {
45
+ return Object.entries(schema).map(([name, spec], index) => {
46
+ const kind = typeof spec === "string" ? spec : spec?.kind;
47
+ if (!isTextureKind(kind))
48
+ throw invalidUsage("material", `Unsupported texture kind for '${name}'.`);
49
+ return { name, kind, binding: first + index };
50
+ });
51
+ }
52
+ function validateSamplerRefs(textures, samplerNames) {
53
+ for (const [name, spec] of Object.entries(textures)) {
54
+ const sampler = typeof spec === "string" ? undefined : spec.sampler;
55
+ if (sampler && !samplerNames.includes(sampler))
56
+ throw invalidUsage("material", `Texture '${name}' references missing sampler '${sampler}'.`);
57
+ }
58
+ }
59
+ function textureLayoutEntry(field) {
60
+ return { binding: field.binding, visibility: shaderVisibility(), texture: { sampleType: "float", viewDimension: viewDimension(field.kind) } };
61
+ }
62
+ function textureEntries(fields, values) {
63
+ const keys = new Set(Object.keys(values));
64
+ const entries = fields.map((field) => {
65
+ const value = values[field.name];
66
+ if (!keys.delete(field.name) || value === undefined)
67
+ throw invalidUsage("material.writeTextures", `Missing texture '${field.name}'.`);
68
+ return { binding: field.binding, resource: textureView(value, field.kind) };
69
+ });
70
+ return [...entries, ...extraKey(keys)];
71
+ }
72
+ function extraKey(keys) {
73
+ const extra = keys.values().next().value;
74
+ if (extra)
75
+ throw invalidUsage("material.writeTextures", `Unknown texture '${extra}'.`);
76
+ return [];
77
+ }
78
+ function textureView(value, kind) {
79
+ if ("createView" in value)
80
+ return value.createView({ dimension: viewDimension(kind) });
81
+ return value;
82
+ }
83
+ function placeholder(device, kind) {
84
+ const texture = device.gpu.createTexture({ label: `material.placeholder.${kind}`, size: { width: 1, height: 1, depthOrArrayLayers: kind === "texture_2d_f32" ? 1 : 6 }, format: "rgba8unorm", usage: 4 });
85
+ return { texture, view: texture.createView({ dimension: viewDimension(kind) }) };
86
+ }
87
+ function viewDimension(kind) {
88
+ return kind === "texture_cube_f32" ? "cube" : kind === "texture_2d_array_f32" ? "2d-array" : "2d";
89
+ }
90
+ function messageOf(error) { return error instanceof Error ? error.message : String(error); }
91
+ //# sourceMappingURL=material-textures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-textures.js","sourceRoot":"","sources":["../../src/domain/material-textures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Shader } from "@vgpu/core";
2
+ export interface MaterialParams {
3
+ readonly baseColor: readonly [number, number, number];
4
+ readonly metallic: number;
5
+ readonly roughness: number;
6
+ }
7
+ export type MaterialUniformValue = number | readonly number[] | Float32Array | Uint32Array | Int32Array;
8
+ export type MaterialWriteUniforms<T> = {
9
+ bivarianceHack(values: T): void;
10
+ }["bivarianceHack"];
11
+ export interface MaterialGpu {
12
+ readonly pipeline: GPURenderPipeline;
13
+ readonly bindGroup?: GPUBindGroup;
14
+ readonly uniformBuffer?: GPUBuffer;
15
+ }
16
+ export interface Material {
17
+ readonly pipeline: GPURenderPipeline;
18
+ readonly bindGroupLayout: GPUBindGroupLayout;
19
+ readonly bindGroup?: GPUBindGroup;
20
+ readonly shader: Shader;
21
+ readonly uniformByteSize: number;
22
+ readonly uniformOffsets?: Readonly<Record<string, number>>;
23
+ readonly params: MaterialParams;
24
+ readonly gpu?: MaterialGpu;
25
+ readonly dispose?: () => void;
26
+ }
27
+ //# sourceMappingURL=material.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../src/domain/material.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC;AACxG,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IAAE,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC,gBAAgB,CAAC,CAAC;AAE7F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,kBAAkB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=material.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material.js","sourceRoot":"","sources":["../../src/domain/material.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { Device } from "@vgpu/core";
2
+ import type { Mesh } from "./mesh-types.ts";
3
+ export interface BoxSpec {
4
+ readonly device: Device;
5
+ readonly size?: number;
6
+ }
7
+ export declare function box(spec: BoxSpec): Mesh;
8
+ //# sourceMappingURL=mesh-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-box.d.ts","sourceRoot":"","sources":["../../src/domain/mesh-box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAuBvC"}
@@ -0,0 +1,57 @@
1
+ import { cachedMesh } from "./mesh-cache.js";
2
+ const FLOATS_PER_VERTEX = 6;
3
+ const VERTEX_COUNT = 36;
4
+ const BYTE_STRIDE = FLOATS_PER_VERTEX * Float32Array.BYTES_PER_ELEMENT;
5
+ const ATTRIBUTES = Object.freeze({
6
+ stride: BYTE_STRIDE,
7
+ position: Object.freeze({ offset: 0, format: "float32x3" }),
8
+ normal: Object.freeze({ offset: 12, format: "float32x3" }),
9
+ });
10
+ const cache = new WeakMap();
11
+ export function box(spec) {
12
+ const size = spec.size ?? 1;
13
+ return cachedMesh(cache, spec.device, size, () => {
14
+ const vertices = boxVertices(size);
15
+ const vertexBuffer = spec.device.createBuffer({
16
+ label: `mesh.box.size=${size}`,
17
+ size: vertices.byteLength,
18
+ usage: ["vertex", "copy_dst"],
19
+ });
20
+ vertexBuffer.write(vertices);
21
+ const h = size / 2;
22
+ return Object.freeze({
23
+ vertexBuffer,
24
+ vertexCount: VERTEX_COUNT,
25
+ attributes: ATTRIBUTES,
26
+ bbox: Object.freeze({
27
+ min: new Float32Array([-h, -h, -h]),
28
+ max: new Float32Array([h, h, h]),
29
+ }),
30
+ layout: "position-normal",
31
+ gpu: Object.freeze({ vertexBuffer: vertexBuffer.gpu }),
32
+ });
33
+ });
34
+ }
35
+ function boxVertices(size) {
36
+ const h = size / 2;
37
+ const data = [];
38
+ pushFace(data, [h, -h, -h], [h, h, -h], [h, h, h], [h, -h, h], [1, 0, 0]);
39
+ pushFace(data, [-h, -h, h], [-h, h, h], [-h, h, -h], [-h, -h, -h], [-1, 0, 0]);
40
+ pushFace(data, [-h, h, -h], [-h, h, h], [h, h, h], [h, h, -h], [0, 1, 0]);
41
+ pushFace(data, [-h, -h, h], [-h, -h, -h], [h, -h, -h], [h, -h, h], [0, -1, 0]);
42
+ pushFace(data, [-h, -h, h], [h, -h, h], [h, h, h], [-h, h, h], [0, 0, 1]);
43
+ pushFace(data, [h, -h, -h], [-h, -h, -h], [-h, h, -h], [h, h, -h], [0, 0, -1]);
44
+ return new Float32Array(data);
45
+ }
46
+ function pushFace(data, a, b, c, d, normal) {
47
+ pushVertex(data, a, normal);
48
+ pushVertex(data, b, normal);
49
+ pushVertex(data, c, normal);
50
+ pushVertex(data, a, normal);
51
+ pushVertex(data, c, normal);
52
+ pushVertex(data, d, normal);
53
+ }
54
+ function pushVertex(data, position, normal) {
55
+ data.push(position[0], position[1], position[2], normal[0], normal[1], normal[2]);
56
+ }
57
+ //# sourceMappingURL=mesh-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-box.js","sourceRoot":"","sources":["../../src/domain/mesh-box.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Device } from "@vgpu/core";
2
+ import type { Mesh } from "./mesh-types.ts";
3
+ export declare function cachedMesh<TKey extends string | number>(cache: WeakMap<Device, Map<TKey, Mesh>>, device: Device, key: TKey, build: () => Mesh): Mesh;
4
+ //# sourceMappingURL=mesh-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-cache.d.ts","sourceRoot":"","sources":["../../src/domain/mesh-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wBAAgB,UAAU,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EACrD,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EACvC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,IAAI,GAChB,IAAI,CAWN"}
@@ -0,0 +1,14 @@
1
+ export function cachedMesh(cache, device, key, build) {
2
+ let meshes = cache.get(device);
3
+ if (!meshes) {
4
+ meshes = new Map();
5
+ cache.set(device, meshes);
6
+ }
7
+ const cached = meshes.get(key);
8
+ if (cached)
9
+ return cached;
10
+ const mesh = build();
11
+ meshes.set(key, mesh);
12
+ return mesh;
13
+ }
14
+ //# sourceMappingURL=mesh-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-cache.js","sourceRoot":"","sources":["../../src/domain/mesh-cache.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,UAAU,CACxB,KAAuC,EACvC,MAAc,EACd,GAAS,EACT,KAAiB;IAEjB,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,GAAG,EAAc,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;IACrB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Device } from "@vgpu/core";
2
+ import type { Mesh } from "./mesh-types.ts";
3
+ export interface CapsuleSpec {
4
+ readonly device: Device;
5
+ readonly radius: number;
6
+ /** Cylinder-section length; total height is height + 2 * radius. */
7
+ readonly height: number;
8
+ readonly radialSegments?: number;
9
+ readonly heightSegments?: number;
10
+ /** Smooth by default; UV V follows meridian distance from bottom to top. */
11
+ readonly shading?: "flat" | "smooth";
12
+ }
13
+ export declare function capsule(spec: CapsuleSpec): Mesh;
14
+ //# sourceMappingURL=mesh-capsule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-capsule.d.ts","sourceRoot":"","sources":["../../src/domain/mesh-capsule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,iBAAiB,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACtC;AAUD,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CA0B/C"}
@@ -0,0 +1,52 @@
1
+ import { invalidUsage } from "../uniform-pool-internals.js";
2
+ import { capsuleData } from "./capsule-data.js";
3
+ import { cachedMesh } from "./mesh-cache.js";
4
+ const ATTRIBUTES = Object.freeze({
5
+ stride: 32,
6
+ position: Object.freeze({ offset: 0, format: "float32x3" }),
7
+ normal: Object.freeze({ offset: 12, format: "float32x3" }),
8
+ uv: Object.freeze({ offset: 24, format: "float32x2" }),
9
+ });
10
+ const cache = new WeakMap();
11
+ export function capsule(spec) {
12
+ const radialSegments = spec.radialSegments ?? 32;
13
+ const heightSegments = spec.heightSegments ?? 8;
14
+ const shading = spec.shading ?? "smooth";
15
+ validate(spec.radius, spec.height, radialSegments, heightSegments, shading);
16
+ const key = `${spec.radius}|${spec.height}|${radialSegments}|${heightSegments}|${shading}`;
17
+ return cachedMesh(cache, spec.device, key, () => {
18
+ const data = capsuleData({ radius: spec.radius, height: spec.height, radialSegments, heightSegments, shading });
19
+ const vertexBuffer = spec.device.createBuffer({ label: `mesh.capsule.vertices.${key}`, size: data.vertices.byteLength, usage: ["vertex", "copy_dst"] });
20
+ vertexBuffer.write(data.vertices);
21
+ const indexBuffer = spec.device.createBuffer({ label: `mesh.capsule.indices.${key}`, size: data.indices.byteLength, usage: ["index", "copy_dst"] });
22
+ indexBuffer.write(data.indices);
23
+ const half = spec.height / 2 + spec.radius;
24
+ return Object.freeze({
25
+ vertexBuffer,
26
+ vertexCount: data.vertexCount,
27
+ attributes: ATTRIBUTES,
28
+ bbox: Object.freeze({ min: new Float32Array([-spec.radius, -half, -spec.radius]), max: new Float32Array([spec.radius, half, spec.radius]) }),
29
+ indexBuffer,
30
+ indexCount: data.indices.length,
31
+ indexFormat: "uint16",
32
+ layout: "position-normal-uv",
33
+ gpu: Object.freeze({ vertexBuffer: vertexBuffer.gpu, indexBuffer: indexBuffer.gpu }),
34
+ });
35
+ });
36
+ }
37
+ function validate(radius, height, radialSegments, heightSegments, shading) {
38
+ if (radius <= 0)
39
+ throw invalidUsage("Mesh.capsule", "Radius must be greater than 0.");
40
+ if (height < 0)
41
+ throw invalidUsage("Mesh.capsule", "Height must be greater than or equal to 0.");
42
+ if (radialSegments < 3)
43
+ throw invalidUsage("Mesh.capsule", "Radial segments must be at least 3.");
44
+ if (heightSegments < 2)
45
+ throw invalidUsage("Mesh.capsule", "Height segments must be at least 2.");
46
+ const smoothCount = (radialSegments + 1) * (3 * heightSegments + 1);
47
+ const flatCount = radialSegments * (3 * heightSegments) * 6;
48
+ const vertexCount = shading === "flat" ? flatCount : smoothCount;
49
+ if (vertexCount > 65535)
50
+ throw invalidUsage("Mesh.capsule", `Segment counts produce ${vertexCount} vertices, exceeding the uint16 index limit of 65,535. Reduce segment counts.`);
51
+ }
52
+ //# sourceMappingURL=mesh-capsule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-capsule.js","sourceRoot":"","sources":["../../src/domain/mesh-capsule.ts"],"names":[],"mappings":"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"}