aigpu 0.3.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 +22 -0
- package/README.md +85 -0
- package/bin/aigpu.js +15 -0
- package/client.d.ts +15 -0
- package/dist/agent-tools.d.ts +61 -0
- package/dist/agent-tools.d.ts.map +1 -0
- package/dist/agent-tools.js +107 -0
- package/dist/agent-tools.js.map +1 -0
- package/dist/agent.d.ts +56 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +243 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-types.d.ts +56 -0
- package/dist/api-types.d.ts.map +1 -0
- package/dist/api-types.js +2 -0
- package/dist/api-types.js.map +1 -0
- package/dist/bind-cache.d.ts +19 -0
- package/dist/bind-cache.d.ts.map +1 -0
- package/dist/bind-cache.js +43 -0
- package/dist/bind-cache.js.map +1 -0
- package/dist/bundle.d.ts +30 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +127 -0
- package/dist/bundle.js.map +1 -0
- package/dist/claim-validation-encode.d.ts +14 -0
- package/dist/claim-validation-encode.d.ts.map +1 -0
- package/dist/claim-validation-encode.js +28 -0
- package/dist/claim-validation-encode.js.map +1 -0
- package/dist/claim-validation.d.ts +73 -0
- package/dist/claim-validation.d.ts.map +1 -0
- package/dist/claim-validation.js +135 -0
- package/dist/claim-validation.js.map +1 -0
- package/dist/cli/bin/aigpu.js +101 -0
- package/dist/cli/lib/check/run.js +153 -0
- package/dist/cli/lib/docs/commands/cat.js +12 -0
- package/dist/cli/lib/docs/commands/find.js +180 -0
- package/dist/cli/lib/docs/commands/grep.js +49 -0
- package/dist/cli/lib/docs/commands/ls.js +41 -0
- package/dist/cli/lib/docs/commands/path.js +12 -0
- package/dist/cli/lib/docs/commands/resolve.js +41 -0
- package/dist/cli/lib/docs/commands/shared.js +13 -0
- package/dist/cli/lib/docs/commands/symbols.js +25 -0
- package/dist/cli/lib/docs/errors.js +8 -0
- package/dist/cli/lib/docs/generate/check-drift.js +61 -0
- package/dist/cli/lib/docs/generate/cli.js +12 -0
- package/dist/cli/lib/docs/generate/generate.js +113 -0
- package/dist/cli/lib/docs/generate/manifest.js +218 -0
- package/dist/cli/lib/docs/generate/skill.js +150 -0
- package/dist/cli/lib/docs/help.js +21 -0
- package/dist/cli/lib/docs/index.js +62 -0
- package/dist/cli/lib/docs/model.js +7 -0
- package/dist/cli/lib/docs/run.js +24 -0
- package/dist/cli/lib/docs/service.js +119 -0
- package/dist/cli/lib/doctor/run.js +236 -0
- package/dist/cli/lib/examples/errors.js +13 -0
- package/dist/cli/lib/examples/hashing.js +9 -0
- package/dist/cli/lib/examples/help.js +13 -0
- package/dist/cli/lib/examples/local-source.js +142 -0
- package/dist/cli/lib/examples/paths.js +12 -0
- package/dist/cli/lib/examples/pull.js +58 -0
- package/dist/cli/lib/examples/run.js +71 -0
- package/dist/cli/lib/examples/search.js +6 -0
- package/dist/cli/lib/examples/service.js +118 -0
- package/dist/cli/lib/generated/docs-manifest.generated.js +4758 -0
- package/dist/cli/lib/install-dawn/run.js +24 -0
- package/dist/cli/lib/install-software-renderer/run.js +17 -0
- package/dist/cli/lib/mcp/http.js +93 -0
- package/dist/cli/lib/mcp/server.js +258 -0
- package/dist/cli/lib/mcp/stdio.js +34 -0
- package/dist/cli/lib/snapshot/png.js +62 -0
- package/dist/cli/lib/snapshot/render.js +22 -0
- package/dist/cli/lib/snapshot/run.js +79 -0
- package/dist/cli/lib/snapshot/shaders.js +11 -0
- package/dist/cli/package.json +4 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/clock.d.ts +26 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +50 -0
- package/dist/clock.js.map +1 -0
- package/dist/compute.d.ts +41 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +132 -0
- package/dist/compute.js.map +1 -0
- package/dist/core/render-bundle.d.ts +30 -0
- package/dist/core/render-bundle.d.ts.map +1 -0
- package/dist/core/render-bundle.js +39 -0
- package/dist/core/render-bundle.js.map +1 -0
- package/dist/core/storage-buffer.d.ts +81 -0
- package/dist/core/storage-buffer.d.ts.map +1 -0
- package/dist/core/storage-buffer.js +91 -0
- package/dist/core/storage-buffer.js.map +1 -0
- package/dist/core/structured-uniform.d.ts +33 -0
- package/dist/core/structured-uniform.d.ts.map +1 -0
- package/dist/core/structured-uniform.js +110 -0
- package/dist/core/structured-uniform.js.map +1 -0
- package/dist/core/uniform-pool-internals.d.ts +12 -0
- package/dist/core/uniform-pool-internals.d.ts.map +1 -0
- package/dist/core/uniform-pool-internals.js +24 -0
- package/dist/core/uniform-pool-internals.js.map +1 -0
- package/dist/core/uniform-pool-types.d.ts +22 -0
- package/dist/core/uniform-pool-types.d.ts.map +1 -0
- package/dist/core/uniform-pool-types.js +2 -0
- package/dist/core/uniform-pool-types.js.map +1 -0
- package/dist/core/uniform-pool.d.ts +22 -0
- package/dist/core/uniform-pool.d.ts.map +1 -0
- package/dist/core/uniform-pool.js +128 -0
- package/dist/core/uniform-pool.js.map +1 -0
- package/dist/core/uniform.d.ts +55 -0
- package/dist/core/uniform.d.ts.map +1 -0
- package/dist/core/uniform.js +64 -0
- package/dist/core/uniform.js.map +1 -0
- package/dist/core/wgsl-alignment.d.ts +24 -0
- package/dist/core/wgsl-alignment.d.ts.map +1 -0
- package/dist/core/wgsl-alignment.js +81 -0
- package/dist/core/wgsl-alignment.js.map +1 -0
- package/dist/core.d.ts +13 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +7 -0
- package/dist/core.js.map +1 -0
- package/dist/dom.d.ts +37 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +81 -0
- package/dist/dom.js.map +1 -0
- package/dist/draw-protocols.d.ts +36 -0
- package/dist/draw-protocols.d.ts.map +1 -0
- package/dist/draw-protocols.js +10 -0
- package/dist/draw-protocols.js.map +1 -0
- package/dist/draw.d.ts +248 -0
- package/dist/draw.d.ts.map +1 -0
- package/dist/draw.js +890 -0
- package/dist/draw.js.map +1 -0
- package/dist/effect.d.ts +53 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +75 -0
- package/dist/effect.js.map +1 -0
- package/dist/entry-metadata.d.ts +16 -0
- package/dist/entry-metadata.d.ts.map +1 -0
- package/dist/entry-metadata.js +27 -0
- package/dist/entry-metadata.js.map +1 -0
- package/dist/errors.d.ts +96 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +616 -0
- package/dist/errors.js.map +1 -0
- package/dist/frame-protocols.d.ts +107 -0
- package/dist/frame-protocols.d.ts.map +1 -0
- package/dist/frame-protocols.js +20 -0
- package/dist/frame-protocols.js.map +1 -0
- package/dist/frame-state.d.ts +32 -0
- package/dist/frame-state.d.ts.map +1 -0
- package/dist/frame-state.js +62 -0
- package/dist/frame-state.js.map +1 -0
- package/dist/frame.d.ts +127 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +645 -0
- package/dist/frame.js.map +1 -0
- package/dist/group-claim.d.ts +9 -0
- package/dist/group-claim.d.ts.map +1 -0
- package/dist/group-claim.js +7 -0
- package/dist/group-claim.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/indirect.d.ts +39 -0
- package/dist/indirect.d.ts.map +1 -0
- package/dist/indirect.js +61 -0
- package/dist/indirect.js.map +1 -0
- package/dist/init-from-device.d.ts +11 -0
- package/dist/init-from-device.d.ts.map +1 -0
- package/dist/init-from-device.js +56 -0
- package/dist/init-from-device.js.map +1 -0
- package/dist/init.d.ts +12 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +7 -0
- package/dist/init.js.map +1 -0
- package/dist/kernel.d.ts +104 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +151 -0
- package/dist/kernel.js.map +1 -0
- package/dist/lifecycle.d.ts +10 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +21 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/live-kernel.d.ts +48 -0
- package/dist/live-kernel.d.ts.map +1 -0
- package/dist/live-kernel.js +67 -0
- package/dist/live-kernel.js.map +1 -0
- package/dist/mock.d.ts +42 -0
- package/dist/mock.d.ts.map +1 -0
- package/dist/mock.js +29 -0
- package/dist/mock.js.map +1 -0
- package/dist/node.d.ts +48 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +36 -0
- package/dist/node.js.map +1 -0
- package/dist/ping-pong.d.ts +19 -0
- package/dist/ping-pong.d.ts.map +1 -0
- package/dist/ping-pong.js +67 -0
- package/dist/ping-pong.js.map +1 -0
- package/dist/pipeline-store.d.ts +89 -0
- package/dist/pipeline-store.d.ts.map +1 -0
- package/dist/pipeline-store.js +366 -0
- package/dist/pipeline-store.js.map +1 -0
- package/dist/query-ring.d.ts +91 -0
- package/dist/query-ring.d.ts.map +1 -0
- package/dist/query-ring.js +178 -0
- package/dist/query-ring.js.map +1 -0
- package/dist/render-service.d.ts +23 -0
- package/dist/render-service.d.ts.map +1 -0
- package/dist/render-service.js +37 -0
- package/dist/render-service.js.map +1 -0
- package/dist/sampler.d.ts +19 -0
- package/dist/sampler.d.ts.map +1 -0
- package/dist/sampler.js +46 -0
- package/dist/sampler.js.map +1 -0
- package/dist/scene/camera.d.ts +91 -0
- package/dist/scene/camera.d.ts.map +1 -0
- package/dist/scene/camera.js +221 -0
- package/dist/scene/camera.js.map +1 -0
- package/dist/scene/geometries.d.ts +26 -0
- package/dist/scene/geometries.d.ts.map +1 -0
- package/dist/scene/geometries.js +26 -0
- package/dist/scene/geometries.js.map +1 -0
- package/dist/scene/geometry-descriptor.d.ts +120 -0
- package/dist/scene/geometry-descriptor.d.ts.map +1 -0
- package/dist/scene/geometry-descriptor.js +378 -0
- package/dist/scene/geometry-descriptor.js.map +1 -0
- package/dist/scene/geometry-recipe.d.ts +41 -0
- package/dist/scene/geometry-recipe.d.ts.map +1 -0
- package/dist/scene/geometry-recipe.js +40 -0
- package/dist/scene/geometry-recipe.js.map +1 -0
- package/dist/scene/geometry-src/camera-math.d.ts +6 -0
- package/dist/scene/geometry-src/camera-math.d.ts.map +1 -0
- package/dist/scene/geometry-src/camera-math.js +47 -0
- package/dist/scene/geometry-src/camera-math.js.map +1 -0
- package/dist/scene/geometry-src/camera.d.ts +10 -0
- package/dist/scene/geometry-src/camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/camera.js +2 -0
- package/dist/scene/geometry-src/camera.js.map +1 -0
- package/dist/scene/geometry-src/capsule-data.d.ts +10 -0
- package/dist/scene/geometry-src/capsule-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/capsule-data.js +61 -0
- package/dist/scene/geometry-src/capsule-data.js.map +1 -0
- package/dist/scene/geometry-src/cone-data.d.ts +13 -0
- package/dist/scene/geometry-src/cone-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/cone-data.js +52 -0
- package/dist/scene/geometry-src/cone-data.js.map +1 -0
- package/dist/scene/geometry-src/cylinder-data.d.ts +14 -0
- package/dist/scene/geometry-src/cylinder-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/cylinder-data.js +58 -0
- package/dist/scene/geometry-src/cylinder-data.js.map +1 -0
- package/dist/scene/geometry-src/deg-to-rad.d.ts +2 -0
- package/dist/scene/geometry-src/deg-to-rad.d.ts.map +1 -0
- package/dist/scene/geometry-src/deg-to-rad.js +4 -0
- package/dist/scene/geometry-src/deg-to-rad.js.map +1 -0
- package/dist/scene/geometry-src/disk-data.d.ts +12 -0
- package/dist/scene/geometry-src/disk-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/disk-data.js +21 -0
- package/dist/scene/geometry-src/disk-data.js.map +1 -0
- package/dist/scene/geometry-src/errors.d.ts +3 -0
- package/dist/scene/geometry-src/errors.d.ts.map +1 -0
- package/dist/scene/geometry-src/errors.js +5 -0
- package/dist/scene/geometry-src/errors.js.map +1 -0
- package/dist/scene/geometry-src/icosphere-data.d.ts +8 -0
- package/dist/scene/geometry-src/icosphere-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/icosphere-data.js +58 -0
- package/dist/scene/geometry-src/icosphere-data.js.map +1 -0
- package/dist/scene/geometry-src/index.d.ts +36 -0
- package/dist/scene/geometry-src/index.d.ts.map +1 -0
- package/dist/scene/geometry-src/index.js +21 -0
- package/dist/scene/geometry-src/index.js.map +1 -0
- package/dist/scene/geometry-src/mesh-box.d.ts +8 -0
- package/dist/scene/geometry-src/mesh-box.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-box.js +57 -0
- package/dist/scene/geometry-src/mesh-box.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cache.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-cache.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cache.js +14 -0
- package/dist/scene/geometry-src/mesh-cache.js.map +1 -0
- package/dist/scene/geometry-src/mesh-capsule.d.ts +14 -0
- package/dist/scene/geometry-src/mesh-capsule.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-capsule.js +52 -0
- package/dist/scene/geometry-src/mesh-capsule.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cone.d.ts +16 -0
- package/dist/scene/geometry-src/mesh-cone.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cone.js +54 -0
- package/dist/scene/geometry-src/mesh-cone.js.map +1 -0
- package/dist/scene/geometry-src/mesh-cylinder.d.ts +18 -0
- package/dist/scene/geometry-src/mesh-cylinder.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-cylinder.js +67 -0
- package/dist/scene/geometry-src/mesh-cylinder.js.map +1 -0
- package/dist/scene/geometry-src/mesh-disk.d.ts +11 -0
- package/dist/scene/geometry-src/mesh-disk.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-disk.js +45 -0
- package/dist/scene/geometry-src/mesh-disk.js.map +1 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-dodecahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts +7 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.js +39 -0
- package/dist/scene/geometry-src/mesh-fullscreen-quad.js.map +1 -0
- package/dist/scene/geometry-src/mesh-icosahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-icosahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-icosahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-icosahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-icosphere.d.ts +11 -0
- package/dist/scene/geometry-src/mesh-icosphere.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-icosphere.js +47 -0
- package/dist/scene/geometry-src/mesh-icosphere.js.map +1 -0
- package/dist/scene/geometry-src/mesh-octahedron.d.ts +4 -0
- package/dist/scene/geometry-src/mesh-octahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-octahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-octahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-plane.d.ts +13 -0
- package/dist/scene/geometry-src/mesh-plane.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-plane.js +51 -0
- package/dist/scene/geometry-src/mesh-plane.js.map +1 -0
- package/dist/scene/geometry-src/mesh-ring.d.ts +12 -0
- package/dist/scene/geometry-src/mesh-ring.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-ring.js +47 -0
- package/dist/scene/geometry-src/mesh-ring.js.map +1 -0
- package/dist/scene/geometry-src/mesh-sphere.d.ts +10 -0
- package/dist/scene/geometry-src/mesh-sphere.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-sphere.js +51 -0
- package/dist/scene/geometry-src/mesh-sphere.js.map +1 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.d.ts +5 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.js +10 -0
- package/dist/scene/geometry-src/mesh-tetrahedron.js.map +1 -0
- package/dist/scene/geometry-src/mesh-torus.d.ts +17 -0
- package/dist/scene/geometry-src/mesh-torus.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-torus.js +56 -0
- package/dist/scene/geometry-src/mesh-torus.js.map +1 -0
- package/dist/scene/geometry-src/mesh-types.d.ts +38 -0
- package/dist/scene/geometry-src/mesh-types.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh-types.js +2 -0
- package/dist/scene/geometry-src/mesh-types.js.map +1 -0
- package/dist/scene/geometry-src/mesh.d.ts +61 -0
- package/dist/scene/geometry-src/mesh.d.ts.map +1 -0
- package/dist/scene/geometry-src/mesh.js +49 -0
- package/dist/scene/geometry-src/mesh.js.map +1 -0
- package/dist/scene/geometry-src/orthographic-camera.d.ts +14 -0
- package/dist/scene/geometry-src/orthographic-camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/orthographic-camera.js +9 -0
- package/dist/scene/geometry-src/orthographic-camera.js.map +1 -0
- package/dist/scene/geometry-src/perspective-camera.d.ts +12 -0
- package/dist/scene/geometry-src/perspective-camera.d.ts.map +1 -0
- package/dist/scene/geometry-src/perspective-camera.js +9 -0
- package/dist/scene/geometry-src/perspective-camera.js.map +1 -0
- package/dist/scene/geometry-src/plane-data.d.ts +12 -0
- package/dist/scene/geometry-src/plane-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/plane-data.js +25 -0
- package/dist/scene/geometry-src/plane-data.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-data.d.ts +7 -0
- package/dist/scene/geometry-src/polyhedron-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-data.js +42 -0
- package/dist/scene/geometry-src/polyhedron-data.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-mesh.d.ts +10 -0
- package/dist/scene/geometry-src/polyhedron-mesh.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-mesh.js +37 -0
- package/dist/scene/geometry-src/polyhedron-mesh.js.map +1 -0
- package/dist/scene/geometry-src/polyhedron-seeds.d.ts +6 -0
- package/dist/scene/geometry-src/polyhedron-seeds.d.ts.map +1 -0
- package/dist/scene/geometry-src/polyhedron-seeds.js +51 -0
- package/dist/scene/geometry-src/polyhedron-seeds.js.map +1 -0
- package/dist/scene/geometry-src/primitive-data-utils.d.ts +9 -0
- package/dist/scene/geometry-src/primitive-data-utils.d.ts.map +1 -0
- package/dist/scene/geometry-src/primitive-data-utils.js +36 -0
- package/dist/scene/geometry-src/primitive-data-utils.js.map +1 -0
- package/dist/scene/geometry-src/ring-data.d.ts +13 -0
- package/dist/scene/geometry-src/ring-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/ring-data.js +24 -0
- package/dist/scene/geometry-src/ring-data.js.map +1 -0
- package/dist/scene/geometry-src/sphere-data.d.ts +11 -0
- package/dist/scene/geometry-src/sphere-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/sphere-data.js +31 -0
- package/dist/scene/geometry-src/sphere-data.js.map +1 -0
- package/dist/scene/geometry-src/srgb.d.ts +5 -0
- package/dist/scene/geometry-src/srgb.d.ts.map +1 -0
- package/dist/scene/geometry-src/srgb.js +23 -0
- package/dist/scene/geometry-src/srgb.js.map +1 -0
- package/dist/scene/geometry-src/torus-data.d.ts +11 -0
- package/dist/scene/geometry-src/torus-data.d.ts.map +1 -0
- package/dist/scene/geometry-src/torus-data.js +38 -0
- package/dist/scene/geometry-src/torus-data.js.map +1 -0
- package/dist/scene/geometry-src/vertex-layout.d.ts +2 -0
- package/dist/scene/geometry-src/vertex-layout.d.ts.map +1 -0
- package/dist/scene/geometry-src/vertex-layout.js +2 -0
- package/dist/scene/geometry-src/vertex-layout.js.map +1 -0
- package/dist/scene/geometry.d.ts +70 -0
- package/dist/scene/geometry.d.ts.map +1 -0
- package/dist/scene/geometry.js +71 -0
- package/dist/scene/geometry.js.map +1 -0
- package/dist/scene/orbit.d.ts +9 -0
- package/dist/scene/orbit.d.ts.map +1 -0
- package/dist/scene/orbit.js +15 -0
- package/dist/scene/orbit.js.map +1 -0
- package/dist/scene/tree/errors.d.ts +4 -0
- package/dist/scene/tree/errors.d.ts.map +1 -0
- package/dist/scene/tree/errors.js +19 -0
- package/dist/scene/tree/errors.js.map +1 -0
- package/dist/scene/tree/light.d.ts +42 -0
- package/dist/scene/tree/light.d.ts.map +1 -0
- package/dist/scene/tree/light.js +102 -0
- package/dist/scene/tree/light.js.map +1 -0
- package/dist/scene/tree/material.d.ts +79 -0
- package/dist/scene/tree/material.d.ts.map +1 -0
- package/dist/scene/tree/material.js +117 -0
- package/dist/scene/tree/material.js.map +1 -0
- package/dist/scene/tree/math.d.ts +26 -0
- package/dist/scene/tree/math.d.ts.map +1 -0
- package/dist/scene/tree/math.js +217 -0
- package/dist/scene/tree/math.js.map +1 -0
- package/dist/scene/tree/mesh-node.d.ts +17 -0
- package/dist/scene/tree/mesh-node.d.ts.map +1 -0
- package/dist/scene/tree/mesh-node.js +24 -0
- package/dist/scene/tree/mesh-node.js.map +1 -0
- package/dist/scene/tree/node.d.ts +70 -0
- package/dist/scene/tree/node.d.ts.map +1 -0
- package/dist/scene/tree/node.js +220 -0
- package/dist/scene/tree/node.js.map +1 -0
- package/dist/scene/tree/orbit-controls.d.ts +69 -0
- package/dist/scene/tree/orbit-controls.d.ts.map +1 -0
- package/dist/scene/tree/orbit-controls.js +226 -0
- package/dist/scene/tree/orbit-controls.js.map +1 -0
- package/dist/scene.d.ts +21 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +11 -0
- package/dist/scene.js.map +1 -0
- package/dist/set-core.d.ts +50 -0
- package/dist/set-core.d.ts.map +1 -0
- package/dist/set-core.js +268 -0
- package/dist/set-core.js.map +1 -0
- package/dist/set-layouts.d.ts +20 -0
- package/dist/set-layouts.d.ts.map +1 -0
- package/dist/set-layouts.js +103 -0
- package/dist/set-layouts.js.map +1 -0
- package/dist/set-packing.d.ts +4 -0
- package/dist/set-packing.d.ts.map +1 -0
- package/dist/set-packing.js +82 -0
- package/dist/set-packing.js.map +1 -0
- package/dist/set-resources.d.ts +20 -0
- package/dist/set-resources.d.ts.map +1 -0
- package/dist/set-resources.js +140 -0
- package/dist/set-resources.js.map +1 -0
- package/dist/shader-source.d.ts +4 -0
- package/dist/shader-source.d.ts.map +1 -0
- package/dist/shader-source.js +21 -0
- package/dist/shader-source.js.map +1 -0
- package/dist/storage.d.ts +38 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +76 -0
- package/dist/storage.js.map +1 -0
- package/dist/surface.d.ts +89 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +243 -0
- package/dist/surface.js.map +1 -0
- package/dist/target-offscreen.d.ts +41 -0
- package/dist/target-offscreen.d.ts.map +1 -0
- package/dist/target-offscreen.js +115 -0
- package/dist/target-offscreen.js.map +1 -0
- package/dist/target-utils.d.ts +37 -0
- package/dist/target-utils.d.ts.map +1 -0
- package/dist/target-utils.js +103 -0
- package/dist/target-utils.js.map +1 -0
- package/dist/target.d.ts +65 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +2 -0
- package/dist/target.js.map +1 -0
- package/dist/timer.d.ts +78 -0
- package/dist/timer.d.ts.map +1 -0
- package/dist/timer.js +261 -0
- package/dist/timer.js.map +1 -0
- package/dist/uniforms-layout.d.ts +8 -0
- package/dist/uniforms-layout.d.ts.map +1 -0
- package/dist/uniforms-layout.js +84 -0
- package/dist/uniforms-layout.js.map +1 -0
- package/dist/uniforms.d.ts +43 -0
- package/dist/uniforms.d.ts.map +1 -0
- package/dist/uniforms.js +176 -0
- package/dist/uniforms.js.map +1 -0
- package/dist/visibility.d.ts +118 -0
- package/dist/visibility.d.ts.map +1 -0
- package/dist/visibility.js +290 -0
- package/dist/visibility.js.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { queryReadbackError } from "./errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Bytes each resolved query occupies: WebGPU resolveQuerySet writes each result
|
|
4
|
+
* "into a GPUBuffer ... as a 64-bit unsigned integer" (8 bytes per query).
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export const QUERY_RESULT_BYTES = 8;
|
|
9
|
+
/** GPUMapMode.READ; numeric fallback covers headless/mock runtimes without the global. */
|
|
10
|
+
const MAP_READ = (globalThis.GPUMapMode?.READ ?? 1);
|
|
11
|
+
/** @internal */
|
|
12
|
+
export function createQueryRing(device, options) {
|
|
13
|
+
return new InternalQueryRing(device, options);
|
|
14
|
+
}
|
|
15
|
+
class InternalQueryRing {
|
|
16
|
+
querySet;
|
|
17
|
+
capacity;
|
|
18
|
+
#label;
|
|
19
|
+
#resolve;
|
|
20
|
+
#stagings;
|
|
21
|
+
#trackSettled;
|
|
22
|
+
#errorSink;
|
|
23
|
+
#cursor = 0;
|
|
24
|
+
#nextSeq = 0;
|
|
25
|
+
#appliedSeq = -1;
|
|
26
|
+
#pendingEncode;
|
|
27
|
+
#inFlight = 0;
|
|
28
|
+
/** Frames that bound querySet into a pass descriptor and have not been submitted/abandoned yet. */
|
|
29
|
+
#retained = 0;
|
|
30
|
+
#disposed = false;
|
|
31
|
+
#destroyed = false;
|
|
32
|
+
constructor(device, options) {
|
|
33
|
+
this.capacity = options.capacity;
|
|
34
|
+
const label = options.label ?? "aigpu.query-ring";
|
|
35
|
+
this.#label = label;
|
|
36
|
+
const byteSize = options.capacity * QUERY_RESULT_BYTES;
|
|
37
|
+
this.querySet = device.gpu.createQuerySet({ type: options.type, count: options.capacity, label });
|
|
38
|
+
// Mirrors WebGPU resolveQuerySet requirements: "destination.usage contains QUERY_RESOLVE" and
|
|
39
|
+
// "destinationOffset + 8 × queryCount ≤ destination.size" (we always resolve at offset 0, a multiple of 256).
|
|
40
|
+
this.#resolve = device.createBuffer({ size: byteSize, usage: ["query_resolve", "copy_src"], label: `${label}.resolve` });
|
|
41
|
+
this.#stagings = Array.from({ length: options.depth ?? 3 }, (_, index) => ({
|
|
42
|
+
buffer: device.createBuffer({ size: byteSize, usage: ["map_read", "copy_dst"], label: `${label}.staging${index}` }),
|
|
43
|
+
mapPending: false,
|
|
44
|
+
retired: false,
|
|
45
|
+
}));
|
|
46
|
+
this.#trackSettled = options.trackSettled;
|
|
47
|
+
this.#errorSink = options.errorSink;
|
|
48
|
+
}
|
|
49
|
+
encodeResolve(encoder, usedCount) {
|
|
50
|
+
this.#pendingEncode = undefined;
|
|
51
|
+
if (this.#disposed || usedCount <= 0)
|
|
52
|
+
return false;
|
|
53
|
+
const staging = this.#claimStaging();
|
|
54
|
+
// Drop, never block: when readbacks lag frames-in-flight past the ring depth, skip this frame's resolve entirely.
|
|
55
|
+
if (!staging)
|
|
56
|
+
return false;
|
|
57
|
+
const count = Math.min(usedCount, this.capacity);
|
|
58
|
+
encoder.resolveQuerySet(this.querySet, 0, count, this.#resolve.gpu, 0);
|
|
59
|
+
encoder.copyBufferToBuffer(this.#resolve.gpu, 0, staging.buffer.gpu, 0, count * QUERY_RESULT_BYTES);
|
|
60
|
+
this.#pendingEncode = { staging, usedCount: count, seq: this.#nextSeq };
|
|
61
|
+
this.#nextSeq += 1;
|
|
62
|
+
this.#cursor += 1;
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
onSubmitted(apply) {
|
|
66
|
+
const pending = this.#pendingEncode;
|
|
67
|
+
this.#pendingEncode = undefined;
|
|
68
|
+
if (!pending)
|
|
69
|
+
return;
|
|
70
|
+
pending.staging.mapPending = true;
|
|
71
|
+
this.#inFlight += 1;
|
|
72
|
+
const readback = pending.staging.buffer.gpu.mapAsync(MAP_READ)
|
|
73
|
+
.then(() => {
|
|
74
|
+
// The buffer is mapped from here on: it must be unmapped before the slot rotates back into
|
|
75
|
+
// use, even if decoding throws — resolving into a mapped buffer is a validation error.
|
|
76
|
+
const values = this.#decodeMapped(pending);
|
|
77
|
+
// Ordered application: a stale readback that lands after a newer one already applied is discarded.
|
|
78
|
+
if (pending.seq <= this.#appliedSeq)
|
|
79
|
+
return;
|
|
80
|
+
this.#appliedSeq = pending.seq;
|
|
81
|
+
apply(values);
|
|
82
|
+
})
|
|
83
|
+
// Non-throwing by contract, but never silent: a dropped readback is reported on gpu.onError.
|
|
84
|
+
.catch((cause) => { this.#reportDroppedReadback(cause); })
|
|
85
|
+
.finally(() => {
|
|
86
|
+
pending.staging.mapPending = false;
|
|
87
|
+
this.#inFlight -= 1;
|
|
88
|
+
this.#destroyWhenIdle();
|
|
89
|
+
});
|
|
90
|
+
this.#trackSettled?.(readback);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Next staging buffer in rotation, skipping retired slots. Undefined means "drop this resolve":
|
|
94
|
+
* the slot is still map-pending (readbacks lag the ring depth) or every slot is retired.
|
|
95
|
+
*/
|
|
96
|
+
#claimStaging() {
|
|
97
|
+
for (let checked = 0; checked < this.#stagings.length; checked += 1) {
|
|
98
|
+
const slot = this.#stagings[this.#cursor % this.#stagings.length];
|
|
99
|
+
if (!slot.retired)
|
|
100
|
+
return slot.mapPending ? undefined : slot;
|
|
101
|
+
// Permanently unusable: rotate past it so the remaining buffers keep serving readbacks.
|
|
102
|
+
this.#cursor += 1;
|
|
103
|
+
}
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Copies the mapped range out and unmaps, keeping the slot reusable. A failure here (a lost device
|
|
108
|
+
* mid-map) still unmaps best-effort; if that fails too the buffer may stay mapped forever, so the
|
|
109
|
+
* slot is retired instead of being handed back to encodeResolve. Throws so the readback is dropped
|
|
110
|
+
* and reported like any other failure.
|
|
111
|
+
*/
|
|
112
|
+
#decodeMapped(pending) {
|
|
113
|
+
let values;
|
|
114
|
+
try {
|
|
115
|
+
values = new BigUint64Array(pending.staging.buffer.gpu.getMappedRange().slice(0, pending.usedCount * QUERY_RESULT_BYTES));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
this.#unmapOrRetire(pending.staging);
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
pending.staging.buffer.gpu.unmap();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
pending.staging.retired = true;
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
return values;
|
|
129
|
+
}
|
|
130
|
+
#unmapOrRetire(staging) {
|
|
131
|
+
try {
|
|
132
|
+
staging.buffer.gpu.unmap();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
staging.retired = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
retain() {
|
|
139
|
+
this.#retained += 1;
|
|
140
|
+
}
|
|
141
|
+
release() {
|
|
142
|
+
if (this.#retained > 0)
|
|
143
|
+
this.#retained -= 1;
|
|
144
|
+
this.#destroyWhenIdle();
|
|
145
|
+
}
|
|
146
|
+
dispose() {
|
|
147
|
+
if (this.#disposed)
|
|
148
|
+
return;
|
|
149
|
+
this.#disposed = true;
|
|
150
|
+
this.#pendingEncode = undefined;
|
|
151
|
+
this.#destroyWhenIdle();
|
|
152
|
+
}
|
|
153
|
+
/** Destroys once disposed and idle: no in-flight map and no frame still referencing the query set. */
|
|
154
|
+
#destroyWhenIdle() {
|
|
155
|
+
if (!this.#disposed || this.#destroyed || this.#inFlight > 0 || this.#retained > 0)
|
|
156
|
+
return;
|
|
157
|
+
this.#destroyed = true;
|
|
158
|
+
this.querySet.destroy();
|
|
159
|
+
this.#resolve.dispose();
|
|
160
|
+
for (const staging of this.#stagings)
|
|
161
|
+
staging.buffer.dispose();
|
|
162
|
+
}
|
|
163
|
+
#reportDroppedReadback(cause) {
|
|
164
|
+
const error = queryReadbackError(this.#label, cause);
|
|
165
|
+
const sink = this.#errorSink;
|
|
166
|
+
if (!sink) {
|
|
167
|
+
console.error(error);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
void Promise.resolve(sink(error)).catch((sinkError) => { console.error(sinkError); });
|
|
172
|
+
}
|
|
173
|
+
catch (sinkError) {
|
|
174
|
+
console.error(sinkError);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=query-ring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-ring.js","sourceRoot":"","sources":["../src/query-ring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single lazy render service of a `Gpu`: bind groups, pipelines, shader modules,
|
|
3
|
+
* pipeline layouts and samplers.
|
|
4
|
+
*
|
|
5
|
+
* Every render-family free function (draw, effect, and later scene views) resolves it through
|
|
6
|
+
* the same token, so they share one cache set and one identity — no duplicated pipeline stores.
|
|
7
|
+
* It is created on first render use and torn down in the kernel's `service` phase, after
|
|
8
|
+
* schedulers and resources, before the device.
|
|
9
|
+
*/
|
|
10
|
+
import { type BindGroupCache } from "./bind-cache.ts";
|
|
11
|
+
import { type PipelineLayoutCache, type PipelineStore, type ShaderModuleCache } from "./pipeline-store.ts";
|
|
12
|
+
import { type Kernel } from "./kernel.ts";
|
|
13
|
+
export interface RenderService {
|
|
14
|
+
readonly binds: BindGroupCache;
|
|
15
|
+
readonly pipelines: PipelineStore;
|
|
16
|
+
readonly shaderModules: ShaderModuleCache;
|
|
17
|
+
readonly pipelineLayouts: PipelineLayoutCache;
|
|
18
|
+
sampler(desc?: GPUSamplerDescriptor): GPUSampler;
|
|
19
|
+
}
|
|
20
|
+
export declare const renderServiceToken: import("./kernel.ts").ServiceToken<RenderService>;
|
|
21
|
+
/** Lazily creates the render service of this kernel; repeated calls return the same instance. */
|
|
22
|
+
export declare function renderService(kernel: Kernel): RenderService;
|
|
23
|
+
//# sourceMappingURL=render-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-service.d.ts","sourceRoot":"","sources":["../src/render-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAA2E,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACpL,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAAC;CAClD;AAED,eAAO,MAAM,kBAAkB,mDAAgD,CAAC;AAEhF,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAE3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single lazy render service of a `Gpu`: bind groups, pipelines, shader modules,
|
|
3
|
+
* pipeline layouts and samplers.
|
|
4
|
+
*
|
|
5
|
+
* Every render-family free function (draw, effect, and later scene views) resolves it through
|
|
6
|
+
* the same token, so they share one cache set and one identity — no duplicated pipeline stores.
|
|
7
|
+
* It is created on first render use and torn down in the kernel's `service` phase, after
|
|
8
|
+
* schedulers and resources, before the device.
|
|
9
|
+
*/
|
|
10
|
+
import { createBindGroupCache } from "./bind-cache.js";
|
|
11
|
+
import { createSamplerCache } from "./sampler.js";
|
|
12
|
+
import { createPipelineLayoutCache, createPipelineStore, createShaderModuleCache } from "./pipeline-store.js";
|
|
13
|
+
import { serviceToken } from "./kernel.js";
|
|
14
|
+
export const renderServiceToken = serviceToken("render-service");
|
|
15
|
+
/** Lazily creates the render service of this kernel; repeated calls return the same instance. */
|
|
16
|
+
export function renderService(kernel) {
|
|
17
|
+
return kernel.service(renderServiceToken, createRenderService);
|
|
18
|
+
}
|
|
19
|
+
function createRenderService(kernel) {
|
|
20
|
+
const device = kernel.device;
|
|
21
|
+
const binds = createBindGroupCache();
|
|
22
|
+
const pipelines = createPipelineStore(device, {
|
|
23
|
+
errorSink: (error) => kernel.reportError(error),
|
|
24
|
+
registerSettledSource: (source) => kernel.registerSettledSource(source),
|
|
25
|
+
});
|
|
26
|
+
const shaderModules = createShaderModuleCache(device);
|
|
27
|
+
const pipelineLayouts = createPipelineLayoutCache(device);
|
|
28
|
+
const samplers = createSamplerCache(device);
|
|
29
|
+
kernel.own("service", () => {
|
|
30
|
+
pipelines.dispose();
|
|
31
|
+
shaderModules.dispose();
|
|
32
|
+
pipelineLayouts.dispose();
|
|
33
|
+
binds.dispose();
|
|
34
|
+
});
|
|
35
|
+
return { binds, pipelines, shaderModules, pipelineLayouts, sampler: (desc) => samplers.sampler(desc) };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=render-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-service.js","sourceRoot":"","sources":["../src/render-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,uBAAuB,EAAwE,MAAM,qBAAqB,CAAC;AACpL,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAUxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAgB,gBAAgB,CAAC,CAAC;AAEhF,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE;QAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;QAC/C,qBAAqB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC;KACxE,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,SAAS,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,OAAO,EAAE,CAAC;QACxB,eAAe,CAAC,OAAO,EAAE,CAAC;QAC1B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Device } from "@aigpu/core";
|
|
2
|
+
import type { Gpu } from "./kernel.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Cached `GPUSampler` for this gpu: identical descriptors return the identical sampler, so bind
|
|
5
|
+
* groups keyed on resource identity stay stable across frames.
|
|
6
|
+
*
|
|
7
|
+
* The cache lives in the gpu's render service — the same one `draw()` and `effect()` use — and is
|
|
8
|
+
* created on first use, not at `init()`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sampler(gpu: Gpu, desc?: GPUSamplerDescriptor): GPUSampler;
|
|
11
|
+
export interface SamplerCache {
|
|
12
|
+
sampler(desc?: GPUSamplerDescriptor): GPUSampler;
|
|
13
|
+
identity(sampler: GPUSampler): {
|
|
14
|
+
readonly kind: "sampler";
|
|
15
|
+
readonly id: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function createSamplerCache(device: Device): SamplerCache;
|
|
19
|
+
//# sourceMappingURL=sampler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.d.ts","sourceRoot":"","sources":["../src/sampler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAEzE;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAClF;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAuB/D"}
|
package/dist/sampler.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { liveKernel } from "./live-kernel.js";
|
|
2
|
+
import { renderService } from "./render-service.js";
|
|
3
|
+
/**
|
|
4
|
+
* Cached `GPUSampler` for this gpu: identical descriptors return the identical sampler, so bind
|
|
5
|
+
* groups keyed on resource identity stay stable across frames.
|
|
6
|
+
*
|
|
7
|
+
* The cache lives in the gpu's render service — the same one `draw()` and `effect()` use — and is
|
|
8
|
+
* created on first use, not at `init()`.
|
|
9
|
+
*/
|
|
10
|
+
export function sampler(gpu, desc) {
|
|
11
|
+
return renderService(liveKernel(gpu, "sampler")).sampler(desc);
|
|
12
|
+
}
|
|
13
|
+
let nextSamplerId = 1;
|
|
14
|
+
export function createSamplerCache(device) {
|
|
15
|
+
const byKey = new Map();
|
|
16
|
+
const ids = new WeakMap();
|
|
17
|
+
return {
|
|
18
|
+
sampler(desc = {}) {
|
|
19
|
+
const key = stableKey(desc);
|
|
20
|
+
let sampler = byKey.get(key);
|
|
21
|
+
if (!sampler) {
|
|
22
|
+
sampler = device.gpu.createSampler(desc);
|
|
23
|
+
byKey.set(key, sampler);
|
|
24
|
+
ids.set(sampler, { kind: "sampler", id: nextSamplerId++ });
|
|
25
|
+
}
|
|
26
|
+
return sampler;
|
|
27
|
+
},
|
|
28
|
+
identity(sampler) {
|
|
29
|
+
let id = ids.get(sampler);
|
|
30
|
+
if (!id) {
|
|
31
|
+
id = { kind: "sampler", id: nextSamplerId++ };
|
|
32
|
+
ids.set(sampler, id);
|
|
33
|
+
}
|
|
34
|
+
return id;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function stableKey(value) {
|
|
39
|
+
if (value === null || typeof value !== "object")
|
|
40
|
+
return JSON.stringify(value);
|
|
41
|
+
if (Array.isArray(value))
|
|
42
|
+
return `[${value.map(stableKey).join(",")}]`;
|
|
43
|
+
const record = value;
|
|
44
|
+
return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stableKey(record[key])}`).join(",")}}`;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sampler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.js","sourceRoot":"","sources":["../src/sampler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,GAAQ,EAAE,IAA2B;IAC3D,OAAO,aAAa,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAOD,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,OAAO,EAAiE,CAAC;IACzF,OAAO;QACL,OAAO,CAAC,OAA6B,EAAE;YACrC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,QAAQ,CAAC,OAAO;YACd,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC;gBAC9C,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACtH,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type Mat4 } from "./tree/math.ts";
|
|
2
|
+
import { SceneNode, type NodeOptions, type NodeTransformValues } from "./tree/node.ts";
|
|
3
|
+
export type CameraVec3 = readonly [number, number, number] | Float32Array;
|
|
4
|
+
/**
|
|
5
|
+
* Common contract of scene cameras. Matrices are stable `Float32Array` identities updated
|
|
6
|
+
* in place, so a binding set once stays fresh across frames.
|
|
7
|
+
*/
|
|
8
|
+
export interface SceneCamera {
|
|
9
|
+
/** Column-major projection × view matrix. Bind this to your WGSL uniforms. */
|
|
10
|
+
readonly viewProjection: Float32Array;
|
|
11
|
+
/** Alias of `viewProjection`, kept for naming continuity. */
|
|
12
|
+
readonly viewProjectionMatrix: Float32Array;
|
|
13
|
+
/** Local position (world position for unparented cameras). Mutate via `set()`. */
|
|
14
|
+
readonly position: Float32Array;
|
|
15
|
+
readonly view: Float32Array;
|
|
16
|
+
readonly projection: Float32Array;
|
|
17
|
+
readonly worldPosition: Float32Array;
|
|
18
|
+
}
|
|
19
|
+
export type Camera = SceneCamera;
|
|
20
|
+
interface CameraSharedOptions extends NodeOptions {
|
|
21
|
+
readonly near?: number;
|
|
22
|
+
readonly far?: number;
|
|
23
|
+
/** World-space point the camera looks at initially. Reorient later with `lookAt()`. */
|
|
24
|
+
readonly target?: CameraVec3;
|
|
25
|
+
readonly up?: CameraVec3;
|
|
26
|
+
}
|
|
27
|
+
export interface PerspectiveCameraOptions extends CameraSharedOptions {
|
|
28
|
+
/** Vertical field of view in degrees. */
|
|
29
|
+
readonly fov: number;
|
|
30
|
+
readonly aspect?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface OrthographicCameraOptions extends CameraSharedOptions {
|
|
33
|
+
readonly left: number;
|
|
34
|
+
readonly right: number;
|
|
35
|
+
readonly bottom: number;
|
|
36
|
+
readonly top: number;
|
|
37
|
+
}
|
|
38
|
+
export interface PerspectiveCameraValues extends NodeTransformValues {
|
|
39
|
+
readonly fov?: number;
|
|
40
|
+
readonly aspect?: number;
|
|
41
|
+
readonly near?: number;
|
|
42
|
+
readonly far?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface OrthographicCameraValues extends NodeTransformValues {
|
|
45
|
+
readonly left?: number;
|
|
46
|
+
readonly right?: number;
|
|
47
|
+
readonly bottom?: number;
|
|
48
|
+
readonly top?: number;
|
|
49
|
+
readonly near?: number;
|
|
50
|
+
readonly far?: number;
|
|
51
|
+
}
|
|
52
|
+
declare abstract class CameraNode extends SceneNode implements SceneCamera {
|
|
53
|
+
#private;
|
|
54
|
+
protected _projectionDirty: boolean;
|
|
55
|
+
get projection(): Mat4;
|
|
56
|
+
get view(): Mat4;
|
|
57
|
+
get viewProjection(): Mat4;
|
|
58
|
+
get viewProjectionMatrix(): Mat4;
|
|
59
|
+
protected abstract _updateProjection(out: Mat4): void;
|
|
60
|
+
}
|
|
61
|
+
/** Perspective projection camera node. `fov` is in degrees for the public scene API. */
|
|
62
|
+
export declare class PerspectiveCamera extends CameraNode {
|
|
63
|
+
#private;
|
|
64
|
+
constructor(options: PerspectiveCameraOptions);
|
|
65
|
+
set(values: PerspectiveCameraValues): this;
|
|
66
|
+
get fov(): number;
|
|
67
|
+
/** Resolved aspect ratio; defaults to 1 until set explicitly. */
|
|
68
|
+
get aspect(): number;
|
|
69
|
+
get near(): number;
|
|
70
|
+
get far(): number;
|
|
71
|
+
protected _updateProjection(out: Mat4): void;
|
|
72
|
+
}
|
|
73
|
+
/** Orthographic projection camera node. */
|
|
74
|
+
export declare class OrthographicCamera extends CameraNode {
|
|
75
|
+
#private;
|
|
76
|
+
constructor(options: OrthographicCameraOptions);
|
|
77
|
+
set(values: OrthographicCameraValues): this;
|
|
78
|
+
get left(): number;
|
|
79
|
+
get right(): number;
|
|
80
|
+
get bottom(): number;
|
|
81
|
+
get top(): number;
|
|
82
|
+
get near(): number;
|
|
83
|
+
get far(): number;
|
|
84
|
+
protected _updateProjection(out: Mat4): void;
|
|
85
|
+
}
|
|
86
|
+
/** Creates a stateful perspective camera node using degrees for the public scene API. */
|
|
87
|
+
export declare function perspectiveCamera(options: PerspectiveCameraOptions): PerspectiveCamera;
|
|
88
|
+
/** Creates a stateful orthographic camera node for shaders expecting `viewProjection`. */
|
|
89
|
+
export declare function orthographicCamera(options: OrthographicCameraOptions): OrthographicCamera;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=camera.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../src/scene/camera.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { orthographic, perspective } from "./geometry-src/camera-math.js";
|
|
2
|
+
import { degToRad } from "./geometry-src/index.js";
|
|
3
|
+
import { sceneValueError } from "./tree/errors.js";
|
|
4
|
+
import { identityMat4, invertAffineMat4, multiplyMat4 } from "./tree/math.js";
|
|
5
|
+
import { SceneNode } from "./tree/node.js";
|
|
6
|
+
class CameraNode extends SceneNode {
|
|
7
|
+
#projection = identityMat4(new Float32Array(16));
|
|
8
|
+
#view = identityMat4(new Float32Array(16));
|
|
9
|
+
#viewProjection = identityMat4(new Float32Array(16));
|
|
10
|
+
_projectionDirty = true;
|
|
11
|
+
#viewWorldVersion = -1;
|
|
12
|
+
#viewProjectionStale = true;
|
|
13
|
+
get projection() {
|
|
14
|
+
if (this._projectionDirty) {
|
|
15
|
+
this._updateProjection(this.#projection);
|
|
16
|
+
this._projectionDirty = false;
|
|
17
|
+
this.#viewProjectionStale = true;
|
|
18
|
+
}
|
|
19
|
+
return this.#projection;
|
|
20
|
+
}
|
|
21
|
+
get view() {
|
|
22
|
+
this.#syncView();
|
|
23
|
+
return this.#view;
|
|
24
|
+
}
|
|
25
|
+
get viewProjection() {
|
|
26
|
+
const projection = this.projection;
|
|
27
|
+
this.#syncView();
|
|
28
|
+
if (this.#viewProjectionStale) {
|
|
29
|
+
multiplyMat4(this.#viewProjection, projection, this.#view);
|
|
30
|
+
this.#viewProjectionStale = false;
|
|
31
|
+
}
|
|
32
|
+
return this.#viewProjection;
|
|
33
|
+
}
|
|
34
|
+
get viewProjectionMatrix() {
|
|
35
|
+
return this.viewProjection;
|
|
36
|
+
}
|
|
37
|
+
#syncView() {
|
|
38
|
+
const world = this.worldMatrix;
|
|
39
|
+
if (this.#viewWorldVersion !== this._worldVersion) {
|
|
40
|
+
invertAffineMat4(this.#view, world);
|
|
41
|
+
this.#viewWorldVersion = this._worldVersion;
|
|
42
|
+
this.#viewProjectionStale = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Perspective projection camera node. `fov` is in degrees for the public scene API. */
|
|
47
|
+
export class PerspectiveCamera extends CameraNode {
|
|
48
|
+
#fov;
|
|
49
|
+
#aspect;
|
|
50
|
+
#near;
|
|
51
|
+
#far;
|
|
52
|
+
constructor(options) {
|
|
53
|
+
// Validate before super(): SceneNode's constructor reparents `options.children`, so a
|
|
54
|
+
// throw after it would strand them on a camera nobody can reach.
|
|
55
|
+
validateFov("perspectiveCamera", options.fov);
|
|
56
|
+
if (options.aspect !== undefined)
|
|
57
|
+
validateAspect("perspectiveCamera", options.aspect);
|
|
58
|
+
validateRange("perspectiveCamera", options.near ?? 0.1, options.far ?? 100);
|
|
59
|
+
validateInitialLookAt("perspectiveCamera", options.target, options.up);
|
|
60
|
+
super("perspective-camera", options);
|
|
61
|
+
this.#fov = options.fov;
|
|
62
|
+
this.#aspect = options.aspect;
|
|
63
|
+
this.#near = options.near ?? 0.1;
|
|
64
|
+
this.#far = options.far ?? 100;
|
|
65
|
+
if (options.target)
|
|
66
|
+
this.lookAt(options.target, options.up);
|
|
67
|
+
}
|
|
68
|
+
set(values) {
|
|
69
|
+
super.set(values);
|
|
70
|
+
const where = `${this.label ?? this.kind}.set`;
|
|
71
|
+
if (values.fov !== undefined) {
|
|
72
|
+
validateFov(where, values.fov);
|
|
73
|
+
this.#fov = values.fov;
|
|
74
|
+
this._projectionDirty = true;
|
|
75
|
+
}
|
|
76
|
+
if (values.aspect !== undefined) {
|
|
77
|
+
validateAspect(where, values.aspect);
|
|
78
|
+
this.#aspect = values.aspect;
|
|
79
|
+
this._projectionDirty = true;
|
|
80
|
+
}
|
|
81
|
+
if (values.near !== undefined || values.far !== undefined) {
|
|
82
|
+
const near = values.near ?? this.#near;
|
|
83
|
+
const far = values.far ?? this.#far;
|
|
84
|
+
validateRange(where, near, far);
|
|
85
|
+
this.#near = near;
|
|
86
|
+
this.#far = far;
|
|
87
|
+
this._projectionDirty = true;
|
|
88
|
+
}
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
get fov() {
|
|
92
|
+
return this.#fov;
|
|
93
|
+
}
|
|
94
|
+
/** Resolved aspect ratio; defaults to 1 until set explicitly. */
|
|
95
|
+
get aspect() {
|
|
96
|
+
return this.#aspect ?? 1;
|
|
97
|
+
}
|
|
98
|
+
get near() {
|
|
99
|
+
return this.#near;
|
|
100
|
+
}
|
|
101
|
+
get far() {
|
|
102
|
+
return this.#far;
|
|
103
|
+
}
|
|
104
|
+
_updateProjection(out) {
|
|
105
|
+
out.set(perspective(degToRad(this.#fov), this.#aspect ?? 1, this.#near, this.#far));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Orthographic projection camera node. */
|
|
109
|
+
export class OrthographicCamera extends CameraNode {
|
|
110
|
+
#left;
|
|
111
|
+
#right;
|
|
112
|
+
#bottom;
|
|
113
|
+
#top;
|
|
114
|
+
#near;
|
|
115
|
+
#far;
|
|
116
|
+
constructor(options) {
|
|
117
|
+
// Validate before super() so a rejected option bag cannot strand `options.children`.
|
|
118
|
+
validateExtent("orthographicCamera", "left", options.left, "right", options.right);
|
|
119
|
+
validateExtent("orthographicCamera", "bottom", options.bottom, "top", options.top);
|
|
120
|
+
validateRange("orthographicCamera", options.near ?? 0.1, options.far ?? 100);
|
|
121
|
+
validateInitialLookAt("orthographicCamera", options.target, options.up);
|
|
122
|
+
super("orthographic-camera", options);
|
|
123
|
+
this.#left = options.left;
|
|
124
|
+
this.#right = options.right;
|
|
125
|
+
this.#bottom = options.bottom;
|
|
126
|
+
this.#top = options.top;
|
|
127
|
+
this.#near = options.near ?? 0.1;
|
|
128
|
+
this.#far = options.far ?? 100;
|
|
129
|
+
if (options.target)
|
|
130
|
+
this.lookAt(options.target, options.up);
|
|
131
|
+
}
|
|
132
|
+
set(values) {
|
|
133
|
+
super.set(values);
|
|
134
|
+
const where = `${this.label ?? this.kind}.set`;
|
|
135
|
+
let projectionTouched = false;
|
|
136
|
+
if (values.left !== undefined || values.right !== undefined) {
|
|
137
|
+
validateExtent(where, "left", values.left ?? this.#left, "right", values.right ?? this.#right);
|
|
138
|
+
}
|
|
139
|
+
if (values.bottom !== undefined || values.top !== undefined) {
|
|
140
|
+
validateExtent(where, "bottom", values.bottom ?? this.#bottom, "top", values.top ?? this.#top);
|
|
141
|
+
}
|
|
142
|
+
if (values.left !== undefined) {
|
|
143
|
+
this.#left = values.left;
|
|
144
|
+
projectionTouched = true;
|
|
145
|
+
}
|
|
146
|
+
if (values.right !== undefined) {
|
|
147
|
+
this.#right = values.right;
|
|
148
|
+
projectionTouched = true;
|
|
149
|
+
}
|
|
150
|
+
if (values.bottom !== undefined) {
|
|
151
|
+
this.#bottom = values.bottom;
|
|
152
|
+
projectionTouched = true;
|
|
153
|
+
}
|
|
154
|
+
if (values.top !== undefined) {
|
|
155
|
+
this.#top = values.top;
|
|
156
|
+
projectionTouched = true;
|
|
157
|
+
}
|
|
158
|
+
if (values.near !== undefined || values.far !== undefined) {
|
|
159
|
+
const near = values.near ?? this.#near;
|
|
160
|
+
const far = values.far ?? this.#far;
|
|
161
|
+
validateRange(where, near, far);
|
|
162
|
+
this.#near = near;
|
|
163
|
+
this.#far = far;
|
|
164
|
+
projectionTouched = true;
|
|
165
|
+
}
|
|
166
|
+
if (projectionTouched)
|
|
167
|
+
this._projectionDirty = true;
|
|
168
|
+
return this;
|
|
169
|
+
}
|
|
170
|
+
get left() { return this.#left; }
|
|
171
|
+
get right() { return this.#right; }
|
|
172
|
+
get bottom() { return this.#bottom; }
|
|
173
|
+
get top() { return this.#top; }
|
|
174
|
+
get near() { return this.#near; }
|
|
175
|
+
get far() { return this.#far; }
|
|
176
|
+
_updateProjection(out) {
|
|
177
|
+
out.set(orthographic(this.#left, this.#right, this.#bottom, this.#top, this.#near, this.#far));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Creates a stateful perspective camera node using degrees for the public scene API. */
|
|
181
|
+
export function perspectiveCamera(options) {
|
|
182
|
+
return new PerspectiveCamera(options);
|
|
183
|
+
}
|
|
184
|
+
/** Creates a stateful orthographic camera node for shaders expecting `viewProjection`. */
|
|
185
|
+
export function orthographicCamera(options) {
|
|
186
|
+
return new OrthographicCamera(options);
|
|
187
|
+
}
|
|
188
|
+
function validateInitialLookAt(where, target, up) {
|
|
189
|
+
if (target === undefined)
|
|
190
|
+
return;
|
|
191
|
+
if (target.length !== 3)
|
|
192
|
+
throw sceneValueError(where, "target", "an array of 3 numbers");
|
|
193
|
+
if (up !== undefined && up.length !== 3)
|
|
194
|
+
throw sceneValueError(where, "up", "an array of 3 numbers");
|
|
195
|
+
}
|
|
196
|
+
function validateFov(where, fov) {
|
|
197
|
+
if (!(fov > 0 && fov < 180))
|
|
198
|
+
throw sceneValueError(where, "fov", "a field of view in degrees between 0 and 180 (exclusive)");
|
|
199
|
+
}
|
|
200
|
+
function validateRange(where, near, far) {
|
|
201
|
+
if (!(near > 0))
|
|
202
|
+
throw sceneValueError(where, "near", "a positive near plane distance");
|
|
203
|
+
if (!(far > near))
|
|
204
|
+
throw sceneValueError(where, "far", "a far plane distance greater than `near`");
|
|
205
|
+
}
|
|
206
|
+
/** `canvas.width / canvas.height` is 0 or NaN during layout; that must not reach the matrix. */
|
|
207
|
+
function validateAspect(where, aspect) {
|
|
208
|
+
if (!(aspect > 0) || !Number.isFinite(aspect)) {
|
|
209
|
+
throw sceneValueError(where, "aspect", "a positive, finite width/height ratio");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function validateExtent(where, minName, min, maxName, max) {
|
|
213
|
+
if (!Number.isFinite(min))
|
|
214
|
+
throw sceneValueError(where, minName, "a finite number");
|
|
215
|
+
if (!Number.isFinite(max))
|
|
216
|
+
throw sceneValueError(where, maxName, "a finite number");
|
|
217
|
+
// Flipped ranges stay legal (a Y-flip is a real use case); empty ones divide by zero.
|
|
218
|
+
if (min === max)
|
|
219
|
+
throw sceneValueError(where, maxName, `a value different from \`${minName}\``);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=camera.js.map
|