@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.
- package/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/domain/camera.d.ts +10 -0
- package/dist/domain/camera.d.ts.map +1 -0
- package/dist/domain/camera.js +2 -0
- package/dist/domain/camera.js.map +1 -0
- package/dist/domain/capsule-data.d.ts +10 -0
- package/dist/domain/capsule-data.d.ts.map +1 -0
- package/dist/domain/capsule-data.js +61 -0
- package/dist/domain/capsule-data.js.map +1 -0
- package/dist/domain/cone-data.d.ts +13 -0
- package/dist/domain/cone-data.d.ts.map +1 -0
- package/dist/domain/cone-data.js +52 -0
- package/dist/domain/cone-data.js.map +1 -0
- package/dist/domain/cylinder-data.d.ts +14 -0
- package/dist/domain/cylinder-data.d.ts.map +1 -0
- package/dist/domain/cylinder-data.js +58 -0
- package/dist/domain/cylinder-data.js.map +1 -0
- package/dist/domain/deg-to-rad.d.ts +2 -0
- package/dist/domain/deg-to-rad.d.ts.map +1 -0
- package/dist/domain/deg-to-rad.js +4 -0
- package/dist/domain/deg-to-rad.js.map +1 -0
- package/dist/domain/disk-data.d.ts +12 -0
- package/dist/domain/disk-data.d.ts.map +1 -0
- package/dist/domain/disk-data.js +21 -0
- package/dist/domain/disk-data.js.map +1 -0
- package/dist/domain/icosphere-data.d.ts +8 -0
- package/dist/domain/icosphere-data.d.ts.map +1 -0
- package/dist/domain/icosphere-data.js +58 -0
- package/dist/domain/icosphere-data.js.map +1 -0
- package/dist/domain/index.d.ts +40 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +23 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/material-factory.d.ts +34 -0
- package/dist/domain/material-factory.d.ts.map +1 -0
- package/dist/domain/material-factory.js +106 -0
- package/dist/domain/material-factory.js.map +1 -0
- package/dist/domain/material-sampler.d.ts +7 -0
- package/dist/domain/material-sampler.d.ts.map +1 -0
- package/dist/domain/material-sampler.js +11 -0
- package/dist/domain/material-sampler.js.map +1 -0
- package/dist/domain/material-textures-schema.d.ts +29 -0
- package/dist/domain/material-textures-schema.d.ts.map +1 -0
- package/dist/domain/material-textures-schema.js +57 -0
- package/dist/domain/material-textures-schema.js.map +1 -0
- package/dist/domain/material-textures.d.ts +13 -0
- package/dist/domain/material-textures.d.ts.map +1 -0
- package/dist/domain/material-textures.js +91 -0
- package/dist/domain/material-textures.js.map +1 -0
- package/dist/domain/material.d.ts +27 -0
- package/dist/domain/material.d.ts.map +1 -0
- package/dist/domain/material.js +2 -0
- package/dist/domain/material.js.map +1 -0
- package/dist/domain/mesh-box.d.ts +8 -0
- package/dist/domain/mesh-box.d.ts.map +1 -0
- package/dist/domain/mesh-box.js +57 -0
- package/dist/domain/mesh-box.js.map +1 -0
- package/dist/domain/mesh-cache.d.ts +4 -0
- package/dist/domain/mesh-cache.d.ts.map +1 -0
- package/dist/domain/mesh-cache.js +14 -0
- package/dist/domain/mesh-cache.js.map +1 -0
- package/dist/domain/mesh-capsule.d.ts +14 -0
- package/dist/domain/mesh-capsule.d.ts.map +1 -0
- package/dist/domain/mesh-capsule.js +52 -0
- package/dist/domain/mesh-capsule.js.map +1 -0
- package/dist/domain/mesh-cone.d.ts +16 -0
- package/dist/domain/mesh-cone.d.ts.map +1 -0
- package/dist/domain/mesh-cone.js +54 -0
- package/dist/domain/mesh-cone.js.map +1 -0
- package/dist/domain/mesh-cylinder.d.ts +18 -0
- package/dist/domain/mesh-cylinder.d.ts.map +1 -0
- package/dist/domain/mesh-cylinder.js +67 -0
- package/dist/domain/mesh-cylinder.js.map +1 -0
- package/dist/domain/mesh-disk.d.ts +11 -0
- package/dist/domain/mesh-disk.d.ts.map +1 -0
- package/dist/domain/mesh-disk.js +45 -0
- package/dist/domain/mesh-disk.js.map +1 -0
- package/dist/domain/mesh-dodecahedron.d.ts +4 -0
- package/dist/domain/mesh-dodecahedron.d.ts.map +1 -0
- package/dist/domain/mesh-dodecahedron.js +10 -0
- package/dist/domain/mesh-dodecahedron.js.map +1 -0
- package/dist/domain/mesh-fullscreen-quad.d.ts +7 -0
- package/dist/domain/mesh-fullscreen-quad.d.ts.map +1 -0
- package/dist/domain/mesh-fullscreen-quad.js +39 -0
- package/dist/domain/mesh-fullscreen-quad.js.map +1 -0
- package/dist/domain/mesh-icosahedron.d.ts +4 -0
- package/dist/domain/mesh-icosahedron.d.ts.map +1 -0
- package/dist/domain/mesh-icosahedron.js +10 -0
- package/dist/domain/mesh-icosahedron.js.map +1 -0
- package/dist/domain/mesh-icosphere.d.ts +11 -0
- package/dist/domain/mesh-icosphere.d.ts.map +1 -0
- package/dist/domain/mesh-icosphere.js +47 -0
- package/dist/domain/mesh-icosphere.js.map +1 -0
- package/dist/domain/mesh-octahedron.d.ts +4 -0
- package/dist/domain/mesh-octahedron.d.ts.map +1 -0
- package/dist/domain/mesh-octahedron.js +10 -0
- package/dist/domain/mesh-octahedron.js.map +1 -0
- package/dist/domain/mesh-plane.d.ts +13 -0
- package/dist/domain/mesh-plane.d.ts.map +1 -0
- package/dist/domain/mesh-plane.js +51 -0
- package/dist/domain/mesh-plane.js.map +1 -0
- package/dist/domain/mesh-ring.d.ts +12 -0
- package/dist/domain/mesh-ring.d.ts.map +1 -0
- package/dist/domain/mesh-ring.js +47 -0
- package/dist/domain/mesh-ring.js.map +1 -0
- package/dist/domain/mesh-sphere.d.ts +10 -0
- package/dist/domain/mesh-sphere.d.ts.map +1 -0
- package/dist/domain/mesh-sphere.js +51 -0
- package/dist/domain/mesh-sphere.js.map +1 -0
- package/dist/domain/mesh-tetrahedron.d.ts +5 -0
- package/dist/domain/mesh-tetrahedron.d.ts.map +1 -0
- package/dist/domain/mesh-tetrahedron.js +10 -0
- package/dist/domain/mesh-tetrahedron.js.map +1 -0
- package/dist/domain/mesh-torus.d.ts +17 -0
- package/dist/domain/mesh-torus.d.ts.map +1 -0
- package/dist/domain/mesh-torus.js +56 -0
- package/dist/domain/mesh-torus.js.map +1 -0
- package/dist/domain/mesh-types.d.ts +38 -0
- package/dist/domain/mesh-types.d.ts.map +1 -0
- package/dist/domain/mesh-types.js +2 -0
- package/dist/domain/mesh-types.js.map +1 -0
- package/dist/domain/mesh.d.ts +61 -0
- package/dist/domain/mesh.d.ts.map +1 -0
- package/dist/domain/mesh.js +49 -0
- package/dist/domain/mesh.js.map +1 -0
- package/dist/domain/orthographic-camera.d.ts +14 -0
- package/dist/domain/orthographic-camera.d.ts.map +1 -0
- package/dist/domain/orthographic-camera.js +10 -0
- package/dist/domain/orthographic-camera.js.map +1 -0
- package/dist/domain/perspective-camera.d.ts +12 -0
- package/dist/domain/perspective-camera.d.ts.map +1 -0
- package/dist/domain/perspective-camera.js +10 -0
- package/dist/domain/perspective-camera.js.map +1 -0
- package/dist/domain/plane-data.d.ts +12 -0
- package/dist/domain/plane-data.d.ts.map +1 -0
- package/dist/domain/plane-data.js +25 -0
- package/dist/domain/plane-data.js.map +1 -0
- package/dist/domain/polyhedron-data.d.ts +7 -0
- package/dist/domain/polyhedron-data.d.ts.map +1 -0
- package/dist/domain/polyhedron-data.js +42 -0
- package/dist/domain/polyhedron-data.js.map +1 -0
- package/dist/domain/polyhedron-mesh.d.ts +10 -0
- package/dist/domain/polyhedron-mesh.d.ts.map +1 -0
- package/dist/domain/polyhedron-mesh.js +37 -0
- package/dist/domain/polyhedron-mesh.js.map +1 -0
- package/dist/domain/polyhedron-seeds.d.ts +6 -0
- package/dist/domain/polyhedron-seeds.d.ts.map +1 -0
- package/dist/domain/polyhedron-seeds.js +51 -0
- package/dist/domain/polyhedron-seeds.js.map +1 -0
- package/dist/domain/primitive-data-utils.d.ts +9 -0
- package/dist/domain/primitive-data-utils.d.ts.map +1 -0
- package/dist/domain/primitive-data-utils.js +36 -0
- package/dist/domain/primitive-data-utils.js.map +1 -0
- package/dist/domain/ring-data.d.ts +13 -0
- package/dist/domain/ring-data.d.ts.map +1 -0
- package/dist/domain/ring-data.js +24 -0
- package/dist/domain/ring-data.js.map +1 -0
- package/dist/domain/sphere-data.d.ts +11 -0
- package/dist/domain/sphere-data.d.ts.map +1 -0
- package/dist/domain/sphere-data.js +31 -0
- package/dist/domain/sphere-data.js.map +1 -0
- package/dist/domain/srgb.d.ts +5 -0
- package/dist/domain/srgb.d.ts.map +1 -0
- package/dist/domain/srgb.js +11 -0
- package/dist/domain/srgb.js.map +1 -0
- package/dist/domain/torus-data.d.ts +11 -0
- package/dist/domain/torus-data.d.ts.map +1 -0
- package/dist/domain/torus-data.js +38 -0
- package/dist/domain/torus-data.js.map +1 -0
- package/dist/domain/vertex-layout.d.ts +3 -0
- package/dist/domain/vertex-layout.d.ts.map +1 -0
- package/dist/domain/vertex-layout.js +14 -0
- package/dist/domain/vertex-layout.js.map +1 -0
- package/dist/domain/wgsl-alignment.d.ts +17 -0
- package/dist/domain/wgsl-alignment.d.ts.map +1 -0
- package/dist/domain/wgsl-alignment.js +39 -0
- package/dist/domain/wgsl-alignment.js.map +1 -0
- package/dist/edit/edit-source.d.ts +10 -0
- package/dist/edit/edit-source.d.ts.map +1 -0
- package/dist/edit/edit-source.js +9 -0
- package/dist/edit/edit-source.js.map +1 -0
- package/dist/edit/editable-mesh.d.ts +11 -0
- package/dist/edit/editable-mesh.d.ts.map +1 -0
- package/dist/edit/editable-mesh.js +30 -0
- package/dist/edit/editable-mesh.js.map +1 -0
- package/dist/edit/element-set.d.ts +4 -0
- package/dist/edit/element-set.d.ts.map +1 -0
- package/dist/edit/element-set.js +78 -0
- package/dist/edit/element-set.js.map +1 -0
- package/dist/edit/errors.d.ts +11 -0
- package/dist/edit/errors.d.ts.map +1 -0
- package/dist/edit/errors.js +11 -0
- package/dist/edit/errors.js.map +1 -0
- package/dist/edit/half-edge-bake.d.ts +5 -0
- package/dist/edit/half-edge-bake.d.ts.map +1 -0
- package/dist/edit/half-edge-bake.js +30 -0
- package/dist/edit/half-edge-bake.js.map +1 -0
- package/dist/edit/half-edge-build.d.ts +4 -0
- package/dist/edit/half-edge-build.d.ts.map +1 -0
- package/dist/edit/half-edge-build.js +61 -0
- package/dist/edit/half-edge-build.js.map +1 -0
- package/dist/edit/half-edge-kernel.d.ts +21 -0
- package/dist/edit/half-edge-kernel.d.ts.map +1 -0
- package/dist/edit/half-edge-kernel.js +14 -0
- package/dist/edit/half-edge-kernel.js.map +1 -0
- package/dist/edit/half-edge-views.d.ts +8 -0
- package/dist/edit/half-edge-views.d.ts.map +1 -0
- package/dist/edit/half-edge-views.js +40 -0
- package/dist/edit/half-edge-views.js.map +1 -0
- package/dist/edit/index.d.ts +38 -0
- package/dist/edit/index.d.ts.map +1 -0
- package/dist/edit/index.js +20 -0
- package/dist/edit/index.js.map +1 -0
- package/dist/edit/kernel-handle.d.ts +5 -0
- package/dist/edit/kernel-handle.d.ts.map +1 -0
- package/dist/edit/kernel-handle.js +7 -0
- package/dist/edit/kernel-handle.js.map +1 -0
- package/dist/edit/operator-utils.d.ts +33 -0
- package/dist/edit/operator-utils.d.ts.map +1 -0
- package/dist/edit/operator-utils.js +101 -0
- package/dist/edit/operator-utils.js.map +1 -0
- package/dist/edit/operators/bevel.d.ts +18 -0
- package/dist/edit/operators/bevel.d.ts.map +1 -0
- package/dist/edit/operators/bevel.js +65 -0
- package/dist/edit/operators/bevel.js.map +1 -0
- package/dist/edit/operators/bridge.d.ts +14 -0
- package/dist/edit/operators/bridge.d.ts.map +1 -0
- package/dist/edit/operators/bridge.js +55 -0
- package/dist/edit/operators/bridge.js.map +1 -0
- package/dist/edit/operators/dissolve-edges.d.ts +12 -0
- package/dist/edit/operators/dissolve-edges.d.ts.map +1 -0
- package/dist/edit/operators/dissolve-edges.js +55 -0
- package/dist/edit/operators/dissolve-edges.js.map +1 -0
- package/dist/edit/operators/dissolve-faces.d.ts +9 -0
- package/dist/edit/operators/dissolve-faces.d.ts.map +1 -0
- package/dist/edit/operators/dissolve-faces.js +98 -0
- package/dist/edit/operators/dissolve-faces.js.map +1 -0
- package/dist/edit/operators/dissolve-vertices.d.ts +13 -0
- package/dist/edit/operators/dissolve-vertices.d.ts.map +1 -0
- package/dist/edit/operators/dissolve-vertices.js +36 -0
- package/dist/edit/operators/dissolve-vertices.js.map +1 -0
- package/dist/edit/operators/extrude.d.ts +18 -0
- package/dist/edit/operators/extrude.d.ts.map +1 -0
- package/dist/edit/operators/extrude.js +33 -0
- package/dist/edit/operators/extrude.js.map +1 -0
- package/dist/edit/operators/fill-hole.d.ts +12 -0
- package/dist/edit/operators/fill-hole.d.ts.map +1 -0
- package/dist/edit/operators/fill-hole.js +29 -0
- package/dist/edit/operators/fill-hole.js.map +1 -0
- package/dist/edit/operators/grid-fill.d.ts +12 -0
- package/dist/edit/operators/grid-fill.d.ts.map +1 -0
- package/dist/edit/operators/grid-fill.js +20 -0
- package/dist/edit/operators/grid-fill.js.map +1 -0
- package/dist/edit/operators/heal-manifold.d.ts +15 -0
- package/dist/edit/operators/heal-manifold.d.ts.map +1 -0
- package/dist/edit/operators/heal-manifold.js +62 -0
- package/dist/edit/operators/heal-manifold.js.map +1 -0
- package/dist/edit/operators/inset.d.ts +16 -0
- package/dist/edit/operators/inset.d.ts.map +1 -0
- package/dist/edit/operators/inset.js +40 -0
- package/dist/edit/operators/inset.js.map +1 -0
- package/dist/edit/operators/loop-cut.d.ts +14 -0
- package/dist/edit/operators/loop-cut.d.ts.map +1 -0
- package/dist/edit/operators/loop-cut.js +120 -0
- package/dist/edit/operators/loop-cut.js.map +1 -0
- package/dist/edit/operators/merge-by-distance.d.ts +15 -0
- package/dist/edit/operators/merge-by-distance.d.ts.map +1 -0
- package/dist/edit/operators/merge-by-distance.js +78 -0
- package/dist/edit/operators/merge-by-distance.js.map +1 -0
- package/dist/edit/operators/recompute-normals.d.ts +7 -0
- package/dist/edit/operators/recompute-normals.d.ts.map +1 -0
- package/dist/edit/operators/recompute-normals.js +67 -0
- package/dist/edit/operators/recompute-normals.js.map +1 -0
- package/dist/edit/operators/subdivide-edges.d.ts +11 -0
- package/dist/edit/operators/subdivide-edges.d.ts.map +1 -0
- package/dist/edit/operators/subdivide-edges.js +106 -0
- package/dist/edit/operators/subdivide-edges.js.map +1 -0
- package/dist/edit/operators/subdivide-faces.d.ts +11 -0
- package/dist/edit/operators/subdivide-faces.d.ts.map +1 -0
- package/dist/edit/operators/subdivide-faces.js +45 -0
- package/dist/edit/operators/subdivide-faces.js.map +1 -0
- package/dist/edit/selection.d.ts +19 -0
- package/dist/edit/selection.d.ts.map +1 -0
- package/dist/edit/selection.js +21 -0
- package/dist/edit/selection.js.map +1 -0
- package/dist/edit/to-editable.d.ts +9 -0
- package/dist/edit/to-editable.d.ts.map +1 -0
- package/dist/edit/to-editable.js +19 -0
- package/dist/edit/to-editable.js.map +1 -0
- package/dist/edit/types.d.ts +111 -0
- package/dist/edit/types.d.ts.map +1 -0
- package/dist/edit/types.js +2 -0
- package/dist/edit/types.js.map +1 -0
- package/dist/edit/warnings.d.ts +14 -0
- package/dist/edit/warnings.d.ts.map +1 -0
- package/dist/edit/warnings.js +11 -0
- package/dist/edit/warnings.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect/index.d.ts +9 -0
- package/dist/inspect/index.d.ts.map +1 -0
- package/dist/inspect/index.js +5 -0
- package/dist/inspect/index.js.map +1 -0
- package/dist/inspect/inspect-material.d.ts +12 -0
- package/dist/inspect/inspect-material.d.ts.map +1 -0
- package/dist/inspect/inspect-material.js +2 -0
- package/dist/inspect/inspect-material.js.map +1 -0
- package/dist/inspect/mesh-to-readable.d.ts +4 -0
- package/dist/inspect/mesh-to-readable.d.ts.map +1 -0
- package/dist/inspect/mesh-to-readable.js +47 -0
- package/dist/inspect/mesh-to-readable.js.map +1 -0
- package/dist/inspect/mesh-to-wireframe.d.ts +5 -0
- package/dist/inspect/mesh-to-wireframe.d.ts.map +1 -0
- package/dist/inspect/mesh-to-wireframe.js +101 -0
- package/dist/inspect/mesh-to-wireframe.js.map +1 -0
- package/dist/inspect/normal-debug-material.d.ts +8 -0
- package/dist/inspect/normal-debug-material.d.ts.map +1 -0
- package/dist/inspect/normal-debug-material.js +42 -0
- package/dist/inspect/normal-debug-material.js.map +1 -0
- package/dist/inspect/normal-debug-shader.d.ts +2 -0
- package/dist/inspect/normal-debug-shader.d.ts.map +1 -0
- package/dist/inspect/normal-debug-shader.js +32 -0
- package/dist/inspect/normal-debug-shader.js.map +1 -0
- package/dist/inspect/wireframe-material.d.ts +9 -0
- package/dist/inspect/wireframe-material.d.ts.map +1 -0
- package/dist/inspect/wireframe-material.js +45 -0
- package/dist/inspect/wireframe-material.js.map +1 -0
- package/dist/inspect/wireframe-mesh.d.ts +9 -0
- package/dist/inspect/wireframe-mesh.d.ts.map +1 -0
- package/dist/inspect/wireframe-mesh.js +2 -0
- package/dist/inspect/wireframe-mesh.js.map +1 -0
- package/dist/inspect/wireframe-shader.d.ts +2 -0
- package/dist/inspect/wireframe-shader.d.ts.map +1 -0
- package/dist/inspect/wireframe-shader.js +24 -0
- package/dist/inspect/wireframe-shader.js.map +1 -0
- package/dist/passes/index.d.ts +6 -0
- package/dist/passes/index.d.ts.map +1 -0
- package/dist/passes/index.js +5 -0
- package/dist/passes/index.js.map +1 -0
- package/dist/passes/pass-sequence.d.ts +9 -0
- package/dist/passes/pass-sequence.d.ts.map +1 -0
- package/dist/passes/pass-sequence.js +21 -0
- package/dist/passes/pass-sequence.js.map +1 -0
- package/dist/passes/pass.d.ts +4 -0
- package/dist/passes/pass.d.ts.map +1 -0
- package/dist/passes/pass.js +99 -0
- package/dist/passes/pass.js.map +1 -0
- package/dist/pipeline.d.ts +16 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +10 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/rapid-renderer.d.ts +18 -0
- package/dist/rapid-renderer.d.ts.map +1 -0
- package/dist/rapid-renderer.js +58 -0
- package/dist/rapid-renderer.js.map +1 -0
- package/dist/render-pass.d.ts +33 -0
- package/dist/render-pass.d.ts.map +1 -0
- package/dist/render-pass.js +67 -0
- package/dist/render-pass.js.map +1 -0
- package/dist/render-target/render-target-canvas.d.ts +15 -0
- package/dist/render-target/render-target-canvas.d.ts.map +1 -0
- package/dist/render-target/render-target-canvas.js +59 -0
- package/dist/render-target/render-target-canvas.js.map +1 -0
- package/dist/render-target/render-target-multi.d.ts +4 -0
- package/dist/render-target/render-target-multi.d.ts.map +1 -0
- package/dist/render-target/render-target-multi.js +90 -0
- package/dist/render-target/render-target-multi.js.map +1 -0
- package/dist/render-target/render-target.d.ts +10 -0
- package/dist/render-target/render-target.d.ts.map +1 -0
- package/dist/render-target/render-target.js +98 -0
- package/dist/render-target/render-target.js.map +1 -0
- package/dist/render-target/types.d.ts +59 -0
- package/dist/render-target/types.d.ts.map +1 -0
- package/dist/render-target/types.js +2 -0
- package/dist/render-target/types.js.map +1 -0
- package/dist/uniform-pool-internals.d.ts +12 -0
- package/dist/uniform-pool-internals.d.ts.map +1 -0
- package/dist/uniform-pool-internals.js +24 -0
- package/dist/uniform-pool-internals.js.map +1 -0
- package/dist/uniform-pool-types.d.ts +22 -0
- package/dist/uniform-pool-types.d.ts.map +1 -0
- package/dist/uniform-pool-types.js +2 -0
- package/dist/uniform-pool-types.js.map +1 -0
- package/dist/uniform-pool.d.ts +30 -0
- package/dist/uniform-pool.d.ts.map +1 -0
- package/dist/uniform-pool.js +127 -0
- package/dist/uniform-pool.js.map +1 -0
- package/dist/utils/canvas-mouse-tracker.d.ts +11 -0
- package/dist/utils/canvas-mouse-tracker.d.ts.map +1 -0
- package/dist/utils/canvas-mouse-tracker.js +19 -0
- package/dist/utils/canvas-mouse-tracker.js.map +1 -0
- package/dist/utils/canvas-resolution.d.ts +9 -0
- package/dist/utils/canvas-resolution.d.ts.map +1 -0
- package/dist/utils/canvas-resolution.js +16 -0
- package/dist/utils/canvas-resolution.js.map +1 -0
- package/dist/utils/frame-clock.d.ts +10 -0
- package/dist/utils/frame-clock.d.ts.map +1 -0
- package/dist/utils/frame-clock.js +47 -0
- package/dist/utils/frame-clock.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +76 -0
- package/src/RenderPass.docs.md +41 -0
- package/src/createRenderPipeline.docs.md +34 -0
- package/src/domain/camera.docs.md +21 -0
- package/src/domain/deg-to-rad.docs.md +9 -0
- package/src/domain/material-factory.docs.md +59 -0
- package/src/domain/material.docs.md +12 -0
- package/src/domain/mesh.docs.md +28 -0
- package/src/domain/orthographic-camera.docs.md +22 -0
- package/src/domain/perspective-camera.docs.md +20 -0
- package/src/domain/srgb.docs.md +11 -0
- package/src/inspect/inspect-material.docs.md +23 -0
- package/src/inspect/mesh-to-wireframe.docs.md +29 -0
- package/src/inspect/normal-debug-material.docs.md +26 -0
- package/src/inspect/wireframe-material.docs.md +22 -0
- package/src/rapid-renderer.docs.md +18 -0
- package/src/uniform-pool.docs.md +60 -0
- package/src/utils/canvas-mouse-tracker.docs.md +13 -0
- package/src/utils/canvas-resolution.docs.md +13 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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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"}
|