@thunderclap-engine/engine 0.0.0-stage → 1.1.0
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/CHANGELOG.md +390 -0
- package/LICENSE +21 -0
- package/README.md +333 -2
- package/dist/analytics/analytics.d.ts +80 -0
- package/dist/analytics/analytics.js +129 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.js +1 -0
- package/dist/anim/aim.d.ts +43 -0
- package/dist/anim/aim.js +157 -0
- package/dist/anim/clip.d.ts +98 -0
- package/dist/anim/clip.js +282 -0
- package/dist/anim/compress.d.ts +65 -0
- package/dist/anim/compress.js +339 -0
- package/dist/anim/foot-ik.d.ts +74 -0
- package/dist/anim/foot-ik.js +241 -0
- package/dist/anim/graph.d.ts +153 -0
- package/dist/anim/graph.js +532 -0
- package/dist/anim/ik.d.ts +105 -0
- package/dist/anim/ik.js +435 -0
- package/dist/anim/index.d.ts +36 -0
- package/dist/anim/index.js +21 -0
- package/dist/anim/match.d.ts +66 -0
- package/dist/anim/match.js +153 -0
- package/dist/anim/mixer.d.ts +113 -0
- package/dist/anim/mixer.js +314 -0
- package/dist/anim/morph.d.ts +41 -0
- package/dist/anim/morph.js +94 -0
- package/dist/anim/pose.d.ts +74 -0
- package/dist/anim/pose.js +254 -0
- package/dist/anim/quat.d.ts +44 -0
- package/dist/anim/quat.js +187 -0
- package/dist/anim/retarget.d.ts +97 -0
- package/dist/anim/retarget.js +366 -0
- package/dist/anim/root-motion.d.ts +44 -0
- package/dist/anim/root-motion.js +224 -0
- package/dist/anim/skin-pose.d.ts +39 -0
- package/dist/anim/skin-pose.js +53 -0
- package/dist/anim/socket.d.ts +47 -0
- package/dist/anim/socket.js +84 -0
- package/dist/anim/spring-chain.d.ts +73 -0
- package/dist/anim/spring-chain.js +294 -0
- package/dist/assets/atlas.d.ts +90 -0
- package/dist/assets/atlas.js +212 -0
- package/dist/assets/baked.d.ts +33 -0
- package/dist/assets/baked.js +38 -0
- package/dist/assets/bundle.d.ts +88 -0
- package/dist/assets/bundle.js +464 -0
- package/dist/assets/cache.d.ts +56 -0
- package/dist/assets/cache.js +123 -0
- package/dist/assets/gltf-load.d.ts +252 -0
- package/dist/assets/gltf-load.js +661 -0
- package/dist/assets/gltf-skin.d.ts +36 -0
- package/dist/assets/gltf-skin.js +109 -0
- package/dist/assets/gltf.d.ts +706 -0
- package/dist/assets/gltf.js +1376 -0
- package/dist/assets/index.d.ts +20 -0
- package/dist/assets/index.js +10 -0
- package/dist/assets/ktx2.d.ts +71 -0
- package/dist/assets/ktx2.js +213 -0
- package/dist/assets/manifest.d.ts +79 -0
- package/dist/assets/manifest.js +7 -0
- package/dist/assets/meshopt.d.ts +23 -0
- package/dist/assets/meshopt.js +403 -0
- package/dist/audio/audio.d.ts +733 -0
- package/dist/audio/audio.js +2013 -0
- package/dist/audio/dsp.d.ts +61 -0
- package/dist/audio/dsp.js +159 -0
- package/dist/audio/duck.d.ts +44 -0
- package/dist/audio/duck.js +101 -0
- package/dist/audio/envelope.d.ts +53 -0
- package/dist/audio/envelope.js +106 -0
- package/dist/audio/index.d.ts +13 -0
- package/dist/audio/index.js +14 -0
- package/dist/audio/music.d.ts +113 -0
- package/dist/audio/music.js +548 -0
- package/dist/audio/occlusion.d.ts +55 -0
- package/dist/audio/occlusion.js +61 -0
- package/dist/audio/persist.d.ts +23 -0
- package/dist/audio/persist.js +27 -0
- package/dist/audio/recipes.d.ts +55 -0
- package/dist/audio/recipes.js +227 -0
- package/dist/audio/send.d.ts +41 -0
- package/dist/audio/send.js +118 -0
- package/dist/audio/sprites.d.ts +59 -0
- package/dist/audio/sprites.js +43 -0
- package/dist/audio/synth.d.ts +103 -0
- package/dist/audio/synth.js +197 -0
- package/dist/audio/variations.d.ts +25 -0
- package/dist/audio/variations.js +55 -0
- package/dist/audio/zones.d.ts +100 -0
- package/dist/audio/zones.js +167 -0
- package/dist/core/detached-surface.d.ts +44 -0
- package/dist/core/detached-surface.js +104 -0
- package/dist/core/events.d.ts +24 -0
- package/dist/core/events.js +43 -0
- package/dist/core/game.d.ts +409 -0
- package/dist/core/game.js +530 -0
- package/dist/core/hash.d.ts +24 -0
- package/dist/core/hash.js +49 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.js +9 -0
- package/dist/core/loop.d.ts +113 -0
- package/dist/core/loop.js +185 -0
- package/dist/core/math.d.ts +58 -0
- package/dist/core/math.js +210 -0
- package/dist/core/noise.d.ts +40 -0
- package/dist/core/noise.js +247 -0
- package/dist/core/pool.d.ts +42 -0
- package/dist/core/pool.js +85 -0
- package/dist/core/random.d.ts +61 -0
- package/dist/core/random.js +199 -0
- package/dist/core/scene.d.ts +79 -0
- package/dist/core/scene.js +195 -0
- package/dist/core/timer.d.ts +66 -0
- package/dist/core/timer.js +286 -0
- package/dist/fx/billboard-wgsl.d.ts +29 -0
- package/dist/fx/billboard-wgsl.js +158 -0
- package/dist/fx/billboard.d.ts +249 -0
- package/dist/fx/billboard.js +702 -0
- package/dist/fx/debug-draw.d.ts +127 -0
- package/dist/fx/debug-draw.js +523 -0
- package/dist/fx/debug-wgsl.d.ts +7 -0
- package/dist/fx/debug-wgsl.js +32 -0
- package/dist/fx/decals-wgsl.d.ts +15 -0
- package/dist/fx/decals-wgsl.js +173 -0
- package/dist/fx/decals.d.ts +216 -0
- package/dist/fx/decals.js +607 -0
- package/dist/fx/effect.d.ts +129 -0
- package/dist/fx/effect.js +349 -0
- package/dist/fx/effects/hit-spark.json +48 -0
- package/dist/fx/effects/index.d.ts +8 -0
- package/dist/fx/effects/index.js +9 -0
- package/dist/fx/effects/magic-aura.json +47 -0
- package/dist/fx/effects/smoke-puff.json +34 -0
- package/dist/fx/emit-surface.d.ts +40 -0
- package/dist/fx/emit-surface.js +124 -0
- package/dist/fx/flicker.d.ts +30 -0
- package/dist/fx/flicker.js +42 -0
- package/dist/fx/index.d.ts +31 -0
- package/dist/fx/index.js +20 -0
- package/dist/fx/particles-wgsl.d.ts +57 -0
- package/dist/fx/particles-wgsl.js +828 -0
- package/dist/fx/particles.d.ts +566 -0
- package/dist/fx/particles.js +1533 -0
- package/dist/fx/random.d.ts +15 -0
- package/dist/fx/random.js +20 -0
- package/dist/fx/sky-wgsl.d.ts +23 -0
- package/dist/fx/sky-wgsl.js +127 -0
- package/dist/fx/sky.d.ts +96 -0
- package/dist/fx/sky.js +175 -0
- package/dist/fx/text-atlas.d.ts +143 -0
- package/dist/fx/text-atlas.js +327 -0
- package/dist/fx/trail-wgsl.d.ts +11 -0
- package/dist/fx/trail-wgsl.js +42 -0
- package/dist/fx/trail.d.ts +194 -0
- package/dist/fx/trail.js +555 -0
- package/dist/fx/water-wgsl.d.ts +34 -0
- package/dist/fx/water-wgsl.js +197 -0
- package/dist/fx/water.d.ts +176 -0
- package/dist/fx/water.js +371 -0
- package/dist/geom/collide/bvh.d.ts +151 -0
- package/dist/geom/collide/bvh.js +493 -0
- package/dist/geom/collide/debug.d.ts +14 -0
- package/dist/geom/collide/debug.js +74 -0
- package/dist/geom/collide/grid.d.ts +26 -0
- package/dist/geom/collide/grid.js +91 -0
- package/dist/geom/collide/index.d.ts +8 -0
- package/dist/geom/collide/index.js +8 -0
- package/dist/geom/collide/queries.d.ts +70 -0
- package/dist/geom/collide/queries.js +583 -0
- package/dist/geom/collide/serialize.d.ts +14 -0
- package/dist/geom/collide/serialize.js +145 -0
- package/dist/geom/collide/shapes.d.ts +161 -0
- package/dist/geom/collide/shapes.js +686 -0
- package/dist/geom/collide/slide.d.ts +66 -0
- package/dist/geom/collide/slide.js +375 -0
- package/dist/geom/collide/tile-slide.d.ts +88 -0
- package/dist/geom/collide/tile-slide.js +255 -0
- package/dist/geom/geometry.d.ts +95 -0
- package/dist/geom/geometry.js +322 -0
- package/dist/geom/heightfield.d.ts +72 -0
- package/dist/geom/heightfield.js +295 -0
- package/dist/geom/hull.d.ts +27 -0
- package/dist/geom/hull.js +279 -0
- package/dist/geom/index.d.ts +35 -0
- package/dist/geom/index.js +23 -0
- package/dist/geom/iso.d.ts +74 -0
- package/dist/geom/iso.js +89 -0
- package/dist/geom/lod.d.ts +29 -0
- package/dist/geom/lod.js +27 -0
- package/dist/geom/ops.d.ts +47 -0
- package/dist/geom/ops.js +285 -0
- package/dist/geom/primitives.d.ts +97 -0
- package/dist/geom/primitives.js +359 -0
- package/dist/geom/shapes.d.ts +43 -0
- package/dist/geom/shapes.js +88 -0
- package/dist/geom/simplify.d.ts +38 -0
- package/dist/geom/simplify.js +519 -0
- package/dist/geom/split.d.ts +37 -0
- package/dist/geom/split.js +413 -0
- package/dist/geom/sweep.d.ts +83 -0
- package/dist/geom/sweep.js +534 -0
- package/dist/geom/tangents.d.ts +16 -0
- package/dist/geom/tangents.js +124 -0
- package/dist/geom/triangulate.d.ts +19 -0
- package/dist/geom/triangulate.js +147 -0
- package/dist/host/default.d.ts +10 -0
- package/dist/host/default.js +10 -0
- package/dist/host/index.d.ts +4 -0
- package/dist/host/index.js +3 -0
- package/dist/host/types.d.ts +144 -0
- package/dist/host/types.js +1 -0
- package/dist/host/web-links.d.ts +38 -0
- package/dist/host/web-links.js +110 -0
- package/dist/host/web.d.ts +30 -0
- package/dist/host/web.js +216 -0
- package/dist/host/xr.d.ts +24 -0
- package/dist/host/xr.js +59 -0
- package/dist/i18n/i18n.d.ts +59 -0
- package/dist/i18n/i18n.js +241 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/message.d.ts +72 -0
- package/dist/i18n/message.js +369 -0
- package/dist/i18n/negotiate.d.ts +17 -0
- package/dist/i18n/negotiate.js +58 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +1 -0
- package/dist/input/bindings.d.ts +31 -0
- package/dist/input/bindings.js +141 -0
- package/dist/input/clock.d.ts +44 -0
- package/dist/input/clock.js +49 -0
- package/dist/input/follow.d.ts +133 -0
- package/dist/input/follow.js +218 -0
- package/dist/input/gestures.d.ts +281 -0
- package/dist/input/gestures.js +662 -0
- package/dist/input/glyphs.d.ts +35 -0
- package/dist/input/glyphs.js +216 -0
- package/dist/input/gyro.d.ts +85 -0
- package/dist/input/gyro.js +140 -0
- package/dist/input/index.d.ts +19 -0
- package/dist/input/index.js +16 -0
- package/dist/input/input.d.ts +543 -0
- package/dist/input/input.js +1492 -0
- package/dist/input/look.d.ts +327 -0
- package/dist/input/look.js +681 -0
- package/dist/input/magnify.d.ts +177 -0
- package/dist/input/magnify.js +131 -0
- package/dist/input/pointer-dispatch.d.ts +138 -0
- package/dist/input/pointer-dispatch.js +180 -0
- package/dist/input/pointer-router.d.ts +204 -0
- package/dist/input/pointer-router.js +533 -0
- package/dist/input/pointer-sources.d.ts +164 -0
- package/dist/input/pointer-sources.js +306 -0
- package/dist/input/rays.d.ts +138 -0
- package/dist/input/rays.js +615 -0
- package/dist/input/record.d.ts +209 -0
- package/dist/input/record.js +601 -0
- package/dist/input/touch-zones.d.ts +147 -0
- package/dist/input/touch-zones.js +300 -0
- package/dist/input/types.d.ts +158 -0
- package/dist/input/types.js +1 -0
- package/dist/input/xr-source.d.ts +53 -0
- package/dist/input/xr-source.js +164 -0
- package/dist/nav/astar.d.ts +45 -0
- package/dist/nav/astar.js +182 -0
- package/dist/nav/corridor.d.ts +40 -0
- package/dist/nav/corridor.js +95 -0
- package/dist/nav/crowd.d.ts +94 -0
- package/dist/nav/crowd.js +624 -0
- package/dist/nav/flow.d.ts +61 -0
- package/dist/nav/flow.js +193 -0
- package/dist/nav/grid.d.ts +108 -0
- package/dist/nav/grid.js +210 -0
- package/dist/nav/heap.d.ts +22 -0
- package/dist/nav/heap.js +92 -0
- package/dist/nav/index.d.ts +37 -0
- package/dist/nav/index.js +19 -0
- package/dist/nav/mesh/areas.d.ts +44 -0
- package/dist/nav/mesh/areas.js +98 -0
- package/dist/nav/mesh/bake-options.d.ts +33 -0
- package/dist/nav/mesh/bake-options.js +76 -0
- package/dist/nav/mesh/contour.d.ts +22 -0
- package/dist/nav/mesh/contour.js +323 -0
- package/dist/nav/mesh/flow3.d.ts +35 -0
- package/dist/nav/mesh/flow3.js +229 -0
- package/dist/nav/mesh/links.d.ts +38 -0
- package/dist/nav/mesh/links.js +72 -0
- package/dist/nav/mesh/mesh-path.d.ts +152 -0
- package/dist/nav/mesh/mesh-path.js +643 -0
- package/dist/nav/mesh/mesh-reach.d.ts +78 -0
- package/dist/nav/mesh/mesh-reach.js +450 -0
- package/dist/nav/mesh/navmesh.d.ts +117 -0
- package/dist/nav/mesh/navmesh.js +647 -0
- package/dist/nav/mesh/polymesh.d.ts +24 -0
- package/dist/nav/mesh/polymesh.js +384 -0
- package/dist/nav/mesh/regions.d.ts +12 -0
- package/dist/nav/mesh/regions.js +367 -0
- package/dist/nav/mesh/serialize.d.ts +13 -0
- package/dist/nav/mesh/serialize.js +197 -0
- package/dist/nav/mesh/voxelize.d.ts +111 -0
- package/dist/nav/mesh/voxelize.js +552 -0
- package/dist/nav/obstacles.d.ts +75 -0
- package/dist/nav/obstacles.js +294 -0
- package/dist/nav/path.d.ts +59 -0
- package/dist/nav/path.js +177 -0
- package/dist/nav/query-queue.d.ts +46 -0
- package/dist/nav/query-queue.js +308 -0
- package/dist/nav/reach.d.ts +53 -0
- package/dist/nav/reach.js +148 -0
- package/dist/nav/steer.d.ts +36 -0
- package/dist/nav/steer.js +78 -0
- package/dist/platform/boot.d.ts +28 -0
- package/dist/platform/boot.js +43 -0
- package/dist/platform/device-mode.d.ts +40 -0
- package/dist/platform/device-mode.js +104 -0
- package/dist/platform/device.d.ts +31 -0
- package/dist/platform/device.js +91 -0
- package/dist/platform/environment.d.ts +42 -0
- package/dist/platform/environment.js +82 -0
- package/dist/platform/gpu.d.ts +40 -0
- package/dist/platform/gpu.js +57 -0
- package/dist/platform/index.d.ts +18 -0
- package/dist/platform/index.js +10 -0
- package/dist/platform/letterbox.d.ts +43 -0
- package/dist/platform/letterbox.js +57 -0
- package/dist/platform/links.d.ts +20 -0
- package/dist/platform/links.js +43 -0
- package/dist/platform/screens.d.ts +36 -0
- package/dist/platform/screens.js +138 -0
- package/dist/platform/surface.d.ts +72 -0
- package/dist/platform/surface.js +157 -0
- package/dist/platform/xr-fake.d.ts +168 -0
- package/dist/platform/xr-fake.js +434 -0
- package/dist/platform/xr-surface.d.ts +120 -0
- package/dist/platform/xr-surface.js +214 -0
- package/dist/platform/xr-types.d.ts +262 -0
- package/dist/post/ao.d.ts +12 -0
- package/dist/post/ao.js +136 -0
- package/dist/post/blend.d.ts +27 -0
- package/dist/post/blend.js +129 -0
- package/dist/post/depth-pass.d.ts +43 -0
- package/dist/post/depth-pass.js +118 -0
- package/dist/post/dof.d.ts +1 -0
- package/dist/post/dof.js +66 -0
- package/dist/post/exposure.d.ts +80 -0
- package/dist/post/exposure.js +322 -0
- package/dist/post/index.d.ts +12 -0
- package/dist/post/index.js +11 -0
- package/dist/post/lens-dirt.d.ts +13 -0
- package/dist/post/lens-dirt.js +91 -0
- package/dist/post/lut.d.ts +19 -0
- package/dist/post/lut.js +50 -0
- package/dist/post/motion-blur.d.ts +9 -0
- package/dist/post/motion-blur.js +78 -0
- package/dist/post/post-stack.d.ts +302 -0
- package/dist/post/post-stack.js +1137 -0
- package/dist/post/settings.d.ts +485 -0
- package/dist/post/settings.js +416 -0
- package/dist/post/shaders.d.ts +25 -0
- package/dist/post/shaders.js +410 -0
- package/dist/post/ssr.d.ts +16 -0
- package/dist/post/ssr.js +155 -0
- package/dist/post/taa.d.ts +74 -0
- package/dist/post/taa.js +235 -0
- package/dist/post/white-balance.d.ts +25 -0
- package/dist/post/white-balance.js +98 -0
- package/dist/render/bindings.d.ts +98 -0
- package/dist/render/bindings.js +281 -0
- package/dist/render/blend.d.ts +13 -0
- package/dist/render/blend.js +26 -0
- package/dist/render/camera-2d.d.ts +72 -0
- package/dist/render/camera-2d.js +92 -0
- package/dist/render/camera.d.ts +302 -0
- package/dist/render/camera.js +671 -0
- package/dist/render/color.d.ts +16 -0
- package/dist/render/color.js +41 -0
- package/dist/render/compressed.d.ts +104 -0
- package/dist/render/compressed.js +248 -0
- package/dist/render/diagnostics.d.ts +15 -0
- package/dist/render/diagnostics.js +43 -0
- package/dist/render/dynamic-resolution.d.ts +70 -0
- package/dist/render/dynamic-resolution.js +126 -0
- package/dist/render/fake-gpu.d.ts +204 -0
- package/dist/render/fake-gpu.js +426 -0
- package/dist/render/flipbook.d.ts +56 -0
- package/dist/render/flipbook.js +87 -0
- package/dist/render/frame.d.ts +278 -0
- package/dist/render/frame.js +174 -0
- package/dist/render/fullscreen.d.ts +54 -0
- package/dist/render/fullscreen.js +91 -0
- package/dist/render/gpu-timer.d.ts +73 -0
- package/dist/render/gpu-timer.js +186 -0
- package/dist/render/index.d.ts +53 -0
- package/dist/render/index.js +29 -0
- package/dist/render/instance-list.d.ts +185 -0
- package/dist/render/instance-list.js +547 -0
- package/dist/render/lights.d.ts +181 -0
- package/dist/render/lights.js +233 -0
- package/dist/render/lod.d.ts +54 -0
- package/dist/render/lod.js +52 -0
- package/dist/render/material.d.ts +165 -0
- package/dist/render/material.js +292 -0
- package/dist/render/mesh.d.ts +284 -0
- package/dist/render/mesh.js +472 -0
- package/dist/render/mipmap.d.ts +16 -0
- package/dist/render/mipmap.js +121 -0
- package/dist/render/parallax.d.ts +50 -0
- package/dist/render/parallax.js +47 -0
- package/dist/render/pbr-wgsl.d.ts +31 -0
- package/dist/render/pbr-wgsl.js +119 -0
- package/dist/render/ping-pong.d.ts +42 -0
- package/dist/render/ping-pong.js +74 -0
- package/dist/render/renderer.d.ts +741 -0
- package/dist/render/renderer.js +2486 -0
- package/dist/render/scene-pipelines.d.ts +44 -0
- package/dist/render/scene-pipelines.js +92 -0
- package/dist/render/scene-target.d.ts +170 -0
- package/dist/render/scene-target.js +450 -0
- package/dist/render/shadow.d.ts +74 -0
- package/dist/render/shadow.js +208 -0
- package/dist/render/skin.d.ts +112 -0
- package/dist/render/skin.js +240 -0
- package/dist/render/snapshot.d.ts +36 -0
- package/dist/render/snapshot.js +34 -0
- package/dist/render/standard.d.ts +162 -0
- package/dist/render/standard.js +263 -0
- package/dist/render/texture.d.ts +142 -0
- package/dist/render/texture.js +228 -0
- package/dist/render/tile-layer.d.ts +110 -0
- package/dist/render/tile-layer.js +304 -0
- package/dist/render/transform.d.ts +115 -0
- package/dist/render/transform.js +318 -0
- package/dist/render/wgsl.d.ts +131 -0
- package/dist/render/wgsl.js +528 -0
- package/dist/save/codec.d.ts +49 -0
- package/dist/save/codec.js +169 -0
- package/dist/save/index.d.ts +8 -0
- package/dist/save/index.js +8 -0
- package/dist/save/journal.d.ts +24 -0
- package/dist/save/journal.js +102 -0
- package/dist/save/migrate.d.ts +15 -0
- package/dist/save/migrate.js +37 -0
- package/dist/save/schema.d.ts +72 -0
- package/dist/save/schema.js +154 -0
- package/dist/save/settings.d.ts +28 -0
- package/dist/save/settings.js +59 -0
- package/dist/save/slots.d.ts +56 -0
- package/dist/save/slots.js +200 -0
- package/dist/save/storage.d.ts +35 -0
- package/dist/save/storage.js +62 -0
- package/dist/save/store.d.ts +114 -0
- package/dist/save/store.js +269 -0
- package/dist/testing/fake-host.d.ts +103 -0
- package/dist/testing/fake-host.js +163 -0
- package/dist/testing/fixed-clock.d.ts +25 -0
- package/dist/testing/fixed-clock.js +30 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/test-game.d.ts +76 -0
- package/dist/testing/test-game.js +92 -0
- package/dist/tween/ease.d.ts +77 -0
- package/dist/tween/ease.js +192 -0
- package/dist/tween/index.d.ts +8 -0
- package/dist/tween/index.js +7 -0
- package/dist/tween/timeline.d.ts +78 -0
- package/dist/tween/timeline.js +269 -0
- package/dist/tween/tween.d.ts +168 -0
- package/dist/tween/tween.js +320 -0
- package/dist/ui/anchor.d.ts +206 -0
- package/dist/ui/anchor.js +307 -0
- package/dist/ui/caption.d.ts +122 -0
- package/dist/ui/caption.js +286 -0
- package/dist/ui/cursor.d.ts +105 -0
- package/dist/ui/cursor.js +261 -0
- package/dist/ui/dom.d.ts +30 -0
- package/dist/ui/dom.js +92 -0
- package/dist/ui/floats.d.ts +86 -0
- package/dist/ui/floats.js +260 -0
- package/dist/ui/hud.d.ts +198 -0
- package/dist/ui/hud.js +431 -0
- package/dist/ui/index.d.ts +37 -0
- package/dist/ui/index.js +34 -0
- package/dist/ui/inventory-card.d.ts +52 -0
- package/dist/ui/inventory-card.js +173 -0
- package/dist/ui/inventory-context.d.ts +29 -0
- package/dist/ui/inventory-context.js +125 -0
- package/dist/ui/inventory-drag.d.ts +63 -0
- package/dist/ui/inventory-drag.js +394 -0
- package/dist/ui/inventory-grid.d.ts +66 -0
- package/dist/ui/inventory-grid.js +625 -0
- package/dist/ui/inventory-radial.d.ts +39 -0
- package/dist/ui/inventory-radial.js +168 -0
- package/dist/ui/inventory.d.ts +128 -0
- package/dist/ui/inventory.js +154 -0
- package/dist/ui/layout.d.ts +356 -0
- package/dist/ui/layout.js +856 -0
- package/dist/ui/link.d.ts +64 -0
- package/dist/ui/link.js +155 -0
- package/dist/ui/loading.d.ts +40 -0
- package/dist/ui/loading.js +157 -0
- package/dist/ui/loupe.d.ts +74 -0
- package/dist/ui/loupe.js +164 -0
- package/dist/ui/menu-nav.d.ts +33 -0
- package/dist/ui/menu-nav.js +28 -0
- package/dist/ui/minimap-canvas.d.ts +145 -0
- package/dist/ui/minimap-canvas.js +460 -0
- package/dist/ui/notify.d.ts +40 -0
- package/dist/ui/notify.js +141 -0
- package/dist/ui/orb.d.ts +53 -0
- package/dist/ui/orb.js +304 -0
- package/dist/ui/overlay.d.ts +213 -0
- package/dist/ui/overlay.js +394 -0
- package/dist/ui/padnav.d.ts +53 -0
- package/dist/ui/padnav.js +146 -0
- package/dist/ui/perf.d.ts +130 -0
- package/dist/ui/perf.js +329 -0
- package/dist/ui/rotate-card.d.ts +54 -0
- package/dist/ui/rotate-card.js +97 -0
- package/dist/ui/stack.d.ts +128 -0
- package/dist/ui/stack.js +312 -0
- package/dist/ui/styles.d.ts +13 -0
- package/dist/ui/styles.js +200 -0
- package/dist/ui/text-scale.d.ts +67 -0
- package/dist/ui/text-scale.js +102 -0
- package/dist/ui/theme.d.ts +70 -0
- package/dist/ui/theme.js +98 -0
- package/dist/ui/toast.d.ts +23 -0
- package/dist/ui/toast.js +46 -0
- package/dist/ui/tooltip.d.ts +89 -0
- package/dist/ui/tooltip.js +333 -0
- package/dist/ui/widgets-2.d.ts +134 -0
- package/dist/ui/widgets-2.js +399 -0
- package/dist/ui/widgets-3.d.ts +91 -0
- package/dist/ui/widgets-3.js +212 -0
- package/dist/ui/widgets.d.ts +34 -0
- package/dist/ui/widgets.js +50 -0
- package/dist/ui/world-panel/index.d.ts +5 -0
- package/dist/ui/world-panel/index.js +5 -0
- package/dist/ui/world-panel/layout.d.ts +38 -0
- package/dist/ui/world-panel/layout.js +68 -0
- package/dist/ui/world-panel/paint.d.ts +96 -0
- package/dist/ui/world-panel/paint.js +136 -0
- package/dist/ui/world-panel/panel.d.ts +235 -0
- package/dist/ui/world-panel/panel.js +762 -0
- package/dist/ui/world-panel/wgsl.d.ts +10 -0
- package/dist/ui/world-panel/wgsl.js +52 -0
- package/dist/ui/world-panel/widgets.d.ts +207 -0
- package/dist/ui/world-panel/widgets.js +569 -0
- package/dist/voxel/chunks.d.ts +77 -0
- package/dist/voxel/chunks.js +149 -0
- package/dist/voxel/grid.d.ts +84 -0
- package/dist/voxel/grid.js +223 -0
- package/dist/voxel/index.d.ts +22 -0
- package/dist/voxel/index.js +7 -0
- package/dist/voxel/mesher-worker.d.ts +14 -0
- package/dist/voxel/mesher-worker.js +47 -0
- package/dist/voxel/mesher.d.ts +73 -0
- package/dist/voxel/mesher.js +306 -0
- package/dist/voxel/ray.d.ts +32 -0
- package/dist/voxel/ray.js +73 -0
- package/dist/voxel/wgsl.d.ts +16 -0
- package/dist/voxel/wgsl.js +28 -0
- package/dist/voxel/worker-client.d.ts +79 -0
- package/dist/voxel/worker-client.js +122 -0
- package/package.json +177 -3
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { FrameSource } from '../host/types.js';
|
|
2
|
+
export interface FixedStepperOptions {
|
|
3
|
+
/** Simulation step in seconds. Default 1/60. */
|
|
4
|
+
step?: number;
|
|
5
|
+
/** Real frame delta is clamped to this before accumulating (tab switches, breakpoints). */
|
|
6
|
+
maxFrameDt?: number;
|
|
7
|
+
/** Hard cap on steps per frame (spiral-of-death guard). Extra time is dropped. */
|
|
8
|
+
maxSteps?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class FixedStepper {
|
|
11
|
+
readonly step: number;
|
|
12
|
+
readonly maxFrameDt: number;
|
|
13
|
+
readonly maxSteps: number;
|
|
14
|
+
accumulator: number;
|
|
15
|
+
constructor(opts?: FixedStepperOptions);
|
|
16
|
+
/** Feed a real frame delta (seconds). Returns how many fixed steps to run now. */
|
|
17
|
+
advance(frameDt: number): number;
|
|
18
|
+
/** Interpolation factor in [0,1) between the last and next simulation state. */
|
|
19
|
+
get alpha(): number;
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
/** Read-only time info shared with systems. Mutated in place by the loop. */
|
|
23
|
+
export interface Time {
|
|
24
|
+
/** Fixed step (seconds). */
|
|
25
|
+
readonly step: number;
|
|
26
|
+
/** Total simulated time (seconds); advances only while running and not paused. */
|
|
27
|
+
simTime: number;
|
|
28
|
+
/** Total real time since start (seconds), excluding hidden/paused gaps. */
|
|
29
|
+
realTime: number;
|
|
30
|
+
/** Last real frame delta (clamped, seconds). */
|
|
31
|
+
frameDt: number;
|
|
32
|
+
/** Rendered frame counter. */
|
|
33
|
+
frame: number;
|
|
34
|
+
/** Simulation step counter. */
|
|
35
|
+
tick: number;
|
|
36
|
+
}
|
|
37
|
+
export interface LoopCallbacks {
|
|
38
|
+
/**
|
|
39
|
+
* Fixed-step update: `dt` is always `time.step`. With `fixed: false`, once per rendered frame
|
|
40
|
+
* before render, `dt` the real frame delta (`time.frameDt`).
|
|
41
|
+
*/
|
|
42
|
+
update(dt: number, time: Time): void;
|
|
43
|
+
/**
|
|
44
|
+
* Variable-rate render. `alpha` is the interpolation factor between sim states (always 1 with
|
|
45
|
+
* `fixed: false`, 0 while paused).
|
|
46
|
+
*/
|
|
47
|
+
render(alpha: number, time: Time): void;
|
|
48
|
+
}
|
|
49
|
+
export interface GameLoopOptions extends FixedStepperOptions {
|
|
50
|
+
/**
|
|
51
|
+
* Default true: update runs in fixed steps of `step`. False: once per rendered frame with the
|
|
52
|
+
* real frame delta (render-rate only, no accumulator); `time.tick` then counts those updates.
|
|
53
|
+
*/
|
|
54
|
+
fixed?: boolean;
|
|
55
|
+
/** Clock for frame deltas (ms). Default `performance.now`. */
|
|
56
|
+
now?: () => number;
|
|
57
|
+
/**
|
|
58
|
+
* Where frames come from: the game's `Host` (`createGame` passes its own), or a stub a test
|
|
59
|
+
* steps by hand. Default: `defaultHost()`, read when the loop first starts.
|
|
60
|
+
*/
|
|
61
|
+
frames?: FrameSource;
|
|
62
|
+
}
|
|
63
|
+
export declare class GameLoop {
|
|
64
|
+
readonly time: Time;
|
|
65
|
+
private readonly stepper;
|
|
66
|
+
private readonly cb;
|
|
67
|
+
private readonly fixed;
|
|
68
|
+
private readonly now;
|
|
69
|
+
private source;
|
|
70
|
+
private frameId;
|
|
71
|
+
private last;
|
|
72
|
+
private running;
|
|
73
|
+
private _paused;
|
|
74
|
+
private _halted;
|
|
75
|
+
private minFrameMs;
|
|
76
|
+
/** True while `frame` runs its callbacks (so `setFrames` leaves rescheduling to it). */
|
|
77
|
+
private inFrame;
|
|
78
|
+
constructor(cb: LoopCallbacks, opts?: GameLoopOptions);
|
|
79
|
+
get isRunning(): boolean;
|
|
80
|
+
/** While paused, update is skipped but render keeps running (so menus/overlays still draw). */
|
|
81
|
+
get paused(): boolean;
|
|
82
|
+
set paused(v: boolean);
|
|
83
|
+
/**
|
|
84
|
+
* Cap the render rate (null = every display frame). With 30 on a 60 Hz display the loop runs
|
|
85
|
+
* on every other vsync: a steady 30 fps instead of a GPU-bound jitter between 30 and 60.
|
|
86
|
+
* Frames are skipped whole (no update, no render), so the fixed step still keeps time.
|
|
87
|
+
*/
|
|
88
|
+
get maxFps(): number | null;
|
|
89
|
+
set maxFps(fps: number | null);
|
|
90
|
+
/** True after `halt()`: the loop is stopped for good. */
|
|
91
|
+
get halted(): boolean;
|
|
92
|
+
start(): void;
|
|
93
|
+
/** Stop scheduling frames entirely (e.g. tab hidden, device lost). */
|
|
94
|
+
stop(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Swap the frame source while the loop runs (or before): a pending frame on the old source
|
|
97
|
+
* is cancelled and the next is requested from `src`. Called from inside a frame callback
|
|
98
|
+
* (an action handler), the current frame finishes and reschedules through `src`. Entering and
|
|
99
|
+
* leaving an XR session swaps between the XR host and the page's host this way (ws/xr).
|
|
100
|
+
*/
|
|
101
|
+
setFrames(src: FrameSource): void;
|
|
102
|
+
/** The frame source, resolved on first use so a loop that is only ticked by hand needs none. */
|
|
103
|
+
private get frames();
|
|
104
|
+
/**
|
|
105
|
+
* Stop for good (e.g. the GPU device is lost): later `start()` calls, such as a
|
|
106
|
+
* tab-visible handler, are ignored, and `tickOnce` does nothing.
|
|
107
|
+
*/
|
|
108
|
+
halt(): void;
|
|
109
|
+
/** Run one frame manually with an explicit delta (tests, frame stepping). */
|
|
110
|
+
tickOnce(frameDt: number): void;
|
|
111
|
+
private readonly frame;
|
|
112
|
+
private runFrame;
|
|
113
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed-step simulation + variable-rate render.
|
|
3
|
+
*
|
|
4
|
+
* `FixedStepper` is the pure accumulator (unit-tested); `GameLoop` drives it from the host's
|
|
5
|
+
* frames (`Host.requestFrame`: the browser's requestAnimationFrame, a test's manual stepping).
|
|
6
|
+
* With `fixed: false` the loop has no fixed step: update runs once per rendered frame with the
|
|
7
|
+
* real (clamped) delta, for a client that applies another's state.
|
|
8
|
+
*/
|
|
9
|
+
import { defaultHost } from '../host/default.js';
|
|
10
|
+
export class FixedStepper {
|
|
11
|
+
step;
|
|
12
|
+
maxFrameDt;
|
|
13
|
+
maxSteps;
|
|
14
|
+
accumulator = 0;
|
|
15
|
+
constructor(opts = {}) {
|
|
16
|
+
this.step = opts.step ?? 1 / 60;
|
|
17
|
+
this.maxFrameDt = opts.maxFrameDt ?? 0.25;
|
|
18
|
+
this.maxSteps = opts.maxSteps ?? 8;
|
|
19
|
+
}
|
|
20
|
+
/** Feed a real frame delta (seconds). Returns how many fixed steps to run now. */
|
|
21
|
+
advance(frameDt) {
|
|
22
|
+
const dt = Math.min(Math.max(frameDt, 0), this.maxFrameDt);
|
|
23
|
+
this.accumulator += dt;
|
|
24
|
+
let steps = Math.floor(this.accumulator / this.step + 1e-9);
|
|
25
|
+
if (steps > this.maxSteps) {
|
|
26
|
+
steps = this.maxSteps;
|
|
27
|
+
this.accumulator = 0;
|
|
28
|
+
return steps;
|
|
29
|
+
}
|
|
30
|
+
this.accumulator -= steps * this.step;
|
|
31
|
+
if (this.accumulator < 0)
|
|
32
|
+
this.accumulator = 0;
|
|
33
|
+
return steps;
|
|
34
|
+
}
|
|
35
|
+
/** Interpolation factor in [0,1) between the last and next simulation state. */
|
|
36
|
+
get alpha() {
|
|
37
|
+
return this.accumulator / this.step;
|
|
38
|
+
}
|
|
39
|
+
reset() {
|
|
40
|
+
this.accumulator = 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Early-frame tolerance for `GameLoop.maxFps`, ms. */
|
|
44
|
+
const FRAME_CAP_SLACK_MS = 3;
|
|
45
|
+
export class GameLoop {
|
|
46
|
+
time;
|
|
47
|
+
stepper;
|
|
48
|
+
cb;
|
|
49
|
+
fixed;
|
|
50
|
+
now;
|
|
51
|
+
source;
|
|
52
|
+
frameId = 0;
|
|
53
|
+
last = 0;
|
|
54
|
+
running = false;
|
|
55
|
+
_paused = false;
|
|
56
|
+
_halted = false;
|
|
57
|
+
minFrameMs = 0;
|
|
58
|
+
/** True while `frame` runs its callbacks (so `setFrames` leaves rescheduling to it). */
|
|
59
|
+
inFrame = false;
|
|
60
|
+
constructor(cb, opts = {}) {
|
|
61
|
+
this.cb = cb;
|
|
62
|
+
this.stepper = new FixedStepper(opts);
|
|
63
|
+
this.fixed = opts.fixed !== false;
|
|
64
|
+
this.now = opts.now ?? (() => performance.now());
|
|
65
|
+
this.source = opts.frames ?? null;
|
|
66
|
+
this.time = { step: this.stepper.step, simTime: 0, realTime: 0, frameDt: 0, frame: 0, tick: 0 };
|
|
67
|
+
}
|
|
68
|
+
get isRunning() {
|
|
69
|
+
return this.running;
|
|
70
|
+
}
|
|
71
|
+
/** While paused, update is skipped but render keeps running (so menus/overlays still draw). */
|
|
72
|
+
get paused() {
|
|
73
|
+
return this._paused;
|
|
74
|
+
}
|
|
75
|
+
set paused(v) {
|
|
76
|
+
this._paused = v;
|
|
77
|
+
if (v)
|
|
78
|
+
this.stepper.reset();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Cap the render rate (null = every display frame). With 30 on a 60 Hz display the loop runs
|
|
82
|
+
* on every other vsync: a steady 30 fps instead of a GPU-bound jitter between 30 and 60.
|
|
83
|
+
* Frames are skipped whole (no update, no render), so the fixed step still keeps time.
|
|
84
|
+
*/
|
|
85
|
+
get maxFps() {
|
|
86
|
+
return this.minFrameMs > 0 ? 1000 / this.minFrameMs : null;
|
|
87
|
+
}
|
|
88
|
+
set maxFps(fps) {
|
|
89
|
+
this.minFrameMs = fps && fps > 0 ? 1000 / fps : 0;
|
|
90
|
+
}
|
|
91
|
+
/** True after `halt()`: the loop is stopped for good. */
|
|
92
|
+
get halted() {
|
|
93
|
+
return this._halted;
|
|
94
|
+
}
|
|
95
|
+
start() {
|
|
96
|
+
if (this.running || this._halted)
|
|
97
|
+
return;
|
|
98
|
+
this.running = true;
|
|
99
|
+
this.last = this.now();
|
|
100
|
+
this.stepper.reset();
|
|
101
|
+
this.frameId = this.frames.requestFrame(this.frame);
|
|
102
|
+
}
|
|
103
|
+
/** Stop scheduling frames entirely (e.g. tab hidden, device lost). */
|
|
104
|
+
stop() {
|
|
105
|
+
this.running = false;
|
|
106
|
+
this.source?.cancelFrame(this.frameId);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Swap the frame source while the loop runs (or before): a pending frame on the old source
|
|
110
|
+
* is cancelled and the next is requested from `src`. Called from inside a frame callback
|
|
111
|
+
* (an action handler), the current frame finishes and reschedules through `src`. Entering and
|
|
112
|
+
* leaving an XR session swaps between the XR host and the page's host this way (ws/xr).
|
|
113
|
+
*/
|
|
114
|
+
setFrames(src) {
|
|
115
|
+
if (src === this.source)
|
|
116
|
+
return;
|
|
117
|
+
const prev = this.source;
|
|
118
|
+
this.source = src;
|
|
119
|
+
if (!this.running || this.inFrame)
|
|
120
|
+
return;
|
|
121
|
+
prev?.cancelFrame(this.frameId);
|
|
122
|
+
this.frameId = src.requestFrame(this.frame);
|
|
123
|
+
}
|
|
124
|
+
/** The frame source, resolved on first use so a loop that is only ticked by hand needs none. */
|
|
125
|
+
get frames() {
|
|
126
|
+
this.source ??= defaultHost();
|
|
127
|
+
return this.source;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Stop for good (e.g. the GPU device is lost): later `start()` calls, such as a
|
|
131
|
+
* tab-visible handler, are ignored, and `tickOnce` does nothing.
|
|
132
|
+
*/
|
|
133
|
+
halt() {
|
|
134
|
+
this._halted = true;
|
|
135
|
+
this.stop();
|
|
136
|
+
}
|
|
137
|
+
/** Run one frame manually with an explicit delta (tests, frame stepping). */
|
|
138
|
+
tickOnce(frameDt) {
|
|
139
|
+
if (this._halted)
|
|
140
|
+
return;
|
|
141
|
+
this.runFrame(frameDt);
|
|
142
|
+
}
|
|
143
|
+
frame = () => {
|
|
144
|
+
if (!this.running)
|
|
145
|
+
return;
|
|
146
|
+
const t = this.now();
|
|
147
|
+
// A few ms of slack: vsync timestamps jitter, and a 33.3 ms target must not miss 33.2.
|
|
148
|
+
if (this.minFrameMs > 0 && t - this.last < this.minFrameMs - FRAME_CAP_SLACK_MS) {
|
|
149
|
+
this.frameId = this.frames.requestFrame(this.frame);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const dt = (t - this.last) / 1000;
|
|
153
|
+
this.last = t;
|
|
154
|
+
this.inFrame = true;
|
|
155
|
+
try {
|
|
156
|
+
this.runFrame(dt);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
this.inFrame = false;
|
|
160
|
+
}
|
|
161
|
+
if (this.running)
|
|
162
|
+
this.frameId = this.frames.requestFrame(this.frame);
|
|
163
|
+
};
|
|
164
|
+
runFrame(rawDt) {
|
|
165
|
+
const time = this.time;
|
|
166
|
+
const dt = Math.min(Math.max(rawDt, 0), this.stepper.maxFrameDt);
|
|
167
|
+
time.frameDt = dt;
|
|
168
|
+
time.realTime += dt;
|
|
169
|
+
if (!this._paused && !this.fixed) {
|
|
170
|
+
time.simTime += dt;
|
|
171
|
+
time.tick++;
|
|
172
|
+
this.cb.update(dt, time);
|
|
173
|
+
}
|
|
174
|
+
else if (!this._paused) {
|
|
175
|
+
const steps = this.stepper.advance(dt);
|
|
176
|
+
for (let i = 0; i < steps; i++) {
|
|
177
|
+
time.simTime += this.stepper.step;
|
|
178
|
+
time.tick++;
|
|
179
|
+
this.cb.update(this.stepper.step, time);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
time.frame++;
|
|
183
|
+
this.cb.render(this._paused ? 0 : this.fixed ? this.stepper.alpha : 1, time);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small 4×4 matrix module. Matrices are column-major `Float32Array(16)` (the layout WGSL's
|
|
3
|
+
* `mat4x4f` expects): element (row r, column c) is `m[c * 4 + r]`, and the translation sits in
|
|
4
|
+
* `m[12..14]`.
|
|
5
|
+
*
|
|
6
|
+
* Every function writes into `out` and returns it, so a caller that keeps its matrices
|
|
7
|
+
* allocates nothing per frame. `out` may alias an input.
|
|
8
|
+
*
|
|
9
|
+
* Conventions: right-handed view space looking down -z; clip depth is WebGPU's 0..1.
|
|
10
|
+
*/
|
|
11
|
+
export type Mat4 = Float32Array;
|
|
12
|
+
/** A new identity matrix (allocates; keep it). */
|
|
13
|
+
declare function create(): Mat4;
|
|
14
|
+
declare function identity(out: Mat4): Mat4;
|
|
15
|
+
declare function copy(out: Mat4, a: ArrayLike<number>): Mat4;
|
|
16
|
+
/** `out = a × b` (apply `b` first, then `a`). */
|
|
17
|
+
declare function multiply(out: Mat4, a: ArrayLike<number>, b: ArrayLike<number>): Mat4;
|
|
18
|
+
/**
|
|
19
|
+
* Orthographic projection: x in `left..right` and y in `bottom..top` map to clip -1..1; view
|
|
20
|
+
* depth `-near..-far` maps to 0..1. Pass `bottom > top` for a y-down space.
|
|
21
|
+
*/
|
|
22
|
+
declare function ortho(out: Mat4, left: number, right: number, bottom: number, top: number, near: number, far: number): Mat4;
|
|
23
|
+
/**
|
|
24
|
+
* Perspective projection, vertical field of view `fovY` (radians). View depth `-near` maps to
|
|
25
|
+
* 0 and `-far` to 1; `far = Infinity` gives an infinite far plane.
|
|
26
|
+
*/
|
|
27
|
+
declare function perspective(out: Mat4, fovY: number, aspect: number, near: number, far: number): Mat4;
|
|
28
|
+
/** View matrix for an eye at `eye` looking at `target`, with `up` roughly up. */
|
|
29
|
+
declare function lookAt(out: Mat4, eye: ArrayLike<number>, target: ArrayLike<number>, up: ArrayLike<number>): Mat4;
|
|
30
|
+
/**
|
|
31
|
+
* 2D view over a `width × height` space (y down): the world point `(width/2 + x, height/2 + y)`
|
|
32
|
+
* lands on the space's centre, scaled by `zoom` about it. `rotation` (radians) turns the view
|
|
33
|
+
* clockwise on screen, so the world appears to turn counter-clockwise. With `x = y = rotation = 0` and `zoom = 1` it is the identity.
|
|
34
|
+
*/
|
|
35
|
+
declare function view2d(out: Mat4, x: number, y: number, zoom: number, rotation: number, width: number, height: number): Mat4;
|
|
36
|
+
/** `out = a⁻¹`. Returns null (and leaves `out` untouched) when `a` is singular. */
|
|
37
|
+
declare function invert(out: Mat4, a: ArrayLike<number>): Mat4 | null;
|
|
38
|
+
/**
|
|
39
|
+
* Transform the point `(x, y, z, 1)` by `m` and divide by w: `out[0..2]` get the result.
|
|
40
|
+
* Returns w (before the divide), which is ≤ 0 for a point behind a perspective camera.
|
|
41
|
+
*/
|
|
42
|
+
declare function transformPoint(out: {
|
|
43
|
+
[i: number]: number;
|
|
44
|
+
}, m: ArrayLike<number>, x: number, y: number, z?: number): number;
|
|
45
|
+
/** Column-major 4×4 matrix helpers. See the module comment for conventions. */
|
|
46
|
+
export declare const mat4: {
|
|
47
|
+
readonly create: typeof create;
|
|
48
|
+
readonly identity: typeof identity;
|
|
49
|
+
readonly copy: typeof copy;
|
|
50
|
+
readonly multiply: typeof multiply;
|
|
51
|
+
readonly ortho: typeof ortho;
|
|
52
|
+
readonly perspective: typeof perspective;
|
|
53
|
+
readonly lookAt: typeof lookAt;
|
|
54
|
+
readonly view2d: typeof view2d;
|
|
55
|
+
readonly invert: typeof invert;
|
|
56
|
+
readonly transformPoint: typeof transformPoint;
|
|
57
|
+
};
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small 4×4 matrix module. Matrices are column-major `Float32Array(16)` (the layout WGSL's
|
|
3
|
+
* `mat4x4f` expects): element (row r, column c) is `m[c * 4 + r]`, and the translation sits in
|
|
4
|
+
* `m[12..14]`.
|
|
5
|
+
*
|
|
6
|
+
* Every function writes into `out` and returns it, so a caller that keeps its matrices
|
|
7
|
+
* allocates nothing per frame. `out` may alias an input.
|
|
8
|
+
*
|
|
9
|
+
* Conventions: right-handed view space looking down -z; clip depth is WebGPU's 0..1.
|
|
10
|
+
*/
|
|
11
|
+
/** A new identity matrix (allocates; keep it). */
|
|
12
|
+
function create() {
|
|
13
|
+
return identity(new Float32Array(16));
|
|
14
|
+
}
|
|
15
|
+
function identity(out) {
|
|
16
|
+
out.fill(0);
|
|
17
|
+
out[0] = 1;
|
|
18
|
+
out[5] = 1;
|
|
19
|
+
out[10] = 1;
|
|
20
|
+
out[15] = 1;
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
function copy(out, a) {
|
|
24
|
+
for (let i = 0; i < 16; i++)
|
|
25
|
+
out[i] = a[i];
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
/** `out = a × b` (apply `b` first, then `a`). */
|
|
29
|
+
function multiply(out, a, b) {
|
|
30
|
+
const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
31
|
+
const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
32
|
+
const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
33
|
+
const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
34
|
+
for (let c = 0; c < 4; c++) {
|
|
35
|
+
const b0 = b[c * 4], b1 = b[c * 4 + 1], b2 = b[c * 4 + 2], b3 = b[c * 4 + 3];
|
|
36
|
+
out[c * 4] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
|
|
37
|
+
out[c * 4 + 1] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
|
|
38
|
+
out[c * 4 + 2] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
|
|
39
|
+
out[c * 4 + 3] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Orthographic projection: x in `left..right` and y in `bottom..top` map to clip -1..1; view
|
|
45
|
+
* depth `-near..-far` maps to 0..1. Pass `bottom > top` for a y-down space.
|
|
46
|
+
*/
|
|
47
|
+
function ortho(out, left, right, bottom, top, near, far) {
|
|
48
|
+
out.fill(0);
|
|
49
|
+
out[0] = 2 / (right - left);
|
|
50
|
+
out[5] = 2 / (top - bottom);
|
|
51
|
+
out[10] = -1 / (far - near);
|
|
52
|
+
out[12] = -(right + left) / (right - left);
|
|
53
|
+
out[13] = -(top + bottom) / (top - bottom);
|
|
54
|
+
out[14] = -near / (far - near);
|
|
55
|
+
out[15] = 1;
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Perspective projection, vertical field of view `fovY` (radians). View depth `-near` maps to
|
|
60
|
+
* 0 and `-far` to 1; `far = Infinity` gives an infinite far plane.
|
|
61
|
+
*/
|
|
62
|
+
function perspective(out, fovY, aspect, near, far) {
|
|
63
|
+
const f = 1 / Math.tan(fovY / 2);
|
|
64
|
+
out.fill(0);
|
|
65
|
+
out[0] = f / aspect;
|
|
66
|
+
out[5] = f;
|
|
67
|
+
out[11] = -1;
|
|
68
|
+
if (Number.isFinite(far)) {
|
|
69
|
+
out[10] = far / (near - far);
|
|
70
|
+
out[14] = (near * far) / (near - far);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
out[10] = -1;
|
|
74
|
+
out[14] = -near;
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/** View matrix for an eye at `eye` looking at `target`, with `up` roughly up. */
|
|
79
|
+
function lookAt(out, eye, target, up) {
|
|
80
|
+
const ex = eye[0], ey = eye[1], ez = eye[2];
|
|
81
|
+
// z axis: from target to eye.
|
|
82
|
+
let zx = ex - target[0], zy = ey - target[1], zz = ez - target[2];
|
|
83
|
+
let len = Math.hypot(zx, zy, zz);
|
|
84
|
+
if (len === 0)
|
|
85
|
+
return identity(out);
|
|
86
|
+
zx /= len;
|
|
87
|
+
zy /= len;
|
|
88
|
+
zz /= len;
|
|
89
|
+
// x axis: up × z.
|
|
90
|
+
let xx = up[1] * zz - up[2] * zy, xy = up[2] * zx - up[0] * zz, xz = up[0] * zy - up[1] * zx;
|
|
91
|
+
len = Math.hypot(xx, xy, xz);
|
|
92
|
+
if (len === 0) {
|
|
93
|
+
xx = 0;
|
|
94
|
+
xy = 0;
|
|
95
|
+
xz = 0;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
xx /= len;
|
|
99
|
+
xy /= len;
|
|
100
|
+
xz /= len;
|
|
101
|
+
}
|
|
102
|
+
// y axis: z × x.
|
|
103
|
+
const yx = zy * xz - zz * xy, yy = zz * xx - zx * xz, yz = zx * xy - zy * xx;
|
|
104
|
+
out[0] = xx;
|
|
105
|
+
out[1] = yx;
|
|
106
|
+
out[2] = zx;
|
|
107
|
+
out[3] = 0;
|
|
108
|
+
out[4] = xy;
|
|
109
|
+
out[5] = yy;
|
|
110
|
+
out[6] = zy;
|
|
111
|
+
out[7] = 0;
|
|
112
|
+
out[8] = xz;
|
|
113
|
+
out[9] = yz;
|
|
114
|
+
out[10] = zz;
|
|
115
|
+
out[11] = 0;
|
|
116
|
+
out[12] = -(xx * ex + xy * ey + xz * ez);
|
|
117
|
+
out[13] = -(yx * ex + yy * ey + yz * ez);
|
|
118
|
+
out[14] = -(zx * ex + zy * ey + zz * ez);
|
|
119
|
+
out[15] = 1;
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 2D view over a `width × height` space (y down): the world point `(width/2 + x, height/2 + y)`
|
|
124
|
+
* lands on the space's centre, scaled by `zoom` about it. `rotation` (radians) turns the view
|
|
125
|
+
* clockwise on screen, so the world appears to turn counter-clockwise. With `x = y = rotation = 0` and `zoom = 1` it is the identity.
|
|
126
|
+
*/
|
|
127
|
+
function view2d(out, x, y, zoom, rotation, width, height) {
|
|
128
|
+
const c = Math.cos(-rotation) * zoom;
|
|
129
|
+
const s = Math.sin(-rotation) * zoom;
|
|
130
|
+
const cx = width / 2 + x;
|
|
131
|
+
const cy = height / 2 + y;
|
|
132
|
+
out.fill(0);
|
|
133
|
+
out[0] = c;
|
|
134
|
+
out[1] = s;
|
|
135
|
+
out[4] = -s;
|
|
136
|
+
out[5] = c;
|
|
137
|
+
out[10] = 1;
|
|
138
|
+
out[12] = width / 2 - c * cx + s * cy;
|
|
139
|
+
out[13] = height / 2 - s * cx - c * cy;
|
|
140
|
+
out[15] = 1;
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
/** `out = a⁻¹`. Returns null (and leaves `out` untouched) when `a` is singular. */
|
|
144
|
+
function invert(out, a) {
|
|
145
|
+
const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
146
|
+
const a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
147
|
+
const a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
148
|
+
const a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
149
|
+
const b00 = a00 * a11 - a01 * a10;
|
|
150
|
+
const b01 = a00 * a12 - a02 * a10;
|
|
151
|
+
const b02 = a00 * a13 - a03 * a10;
|
|
152
|
+
const b03 = a01 * a12 - a02 * a11;
|
|
153
|
+
const b04 = a01 * a13 - a03 * a11;
|
|
154
|
+
const b05 = a02 * a13 - a03 * a12;
|
|
155
|
+
const b06 = a20 * a31 - a21 * a30;
|
|
156
|
+
const b07 = a20 * a32 - a22 * a30;
|
|
157
|
+
const b08 = a20 * a33 - a23 * a30;
|
|
158
|
+
const b09 = a21 * a32 - a22 * a31;
|
|
159
|
+
const b10 = a21 * a33 - a23 * a31;
|
|
160
|
+
const b11 = a22 * a33 - a23 * a32;
|
|
161
|
+
const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
|
162
|
+
if (!det || !Number.isFinite(det))
|
|
163
|
+
return null;
|
|
164
|
+
const d = 1 / det;
|
|
165
|
+
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * d;
|
|
166
|
+
out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * d;
|
|
167
|
+
out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * d;
|
|
168
|
+
out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * d;
|
|
169
|
+
out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * d;
|
|
170
|
+
out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * d;
|
|
171
|
+
out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * d;
|
|
172
|
+
out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * d;
|
|
173
|
+
out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * d;
|
|
174
|
+
out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * d;
|
|
175
|
+
out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * d;
|
|
176
|
+
out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * d;
|
|
177
|
+
out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * d;
|
|
178
|
+
out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * d;
|
|
179
|
+
out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * d;
|
|
180
|
+
out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * d;
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Transform the point `(x, y, z, 1)` by `m` and divide by w: `out[0..2]` get the result.
|
|
185
|
+
* Returns w (before the divide), which is ≤ 0 for a point behind a perspective camera.
|
|
186
|
+
*/
|
|
187
|
+
function transformPoint(out, m, x, y, z = 0) {
|
|
188
|
+
const w = m[3] * x + m[7] * y + m[11] * z + m[15];
|
|
189
|
+
const k = w !== 0 ? 1 / w : 1;
|
|
190
|
+
const ox = (m[0] * x + m[4] * y + m[8] * z + m[12]) * k;
|
|
191
|
+
const oy = (m[1] * x + m[5] * y + m[9] * z + m[13]) * k;
|
|
192
|
+
const oz = (m[2] * x + m[6] * y + m[10] * z + m[14]) * k;
|
|
193
|
+
out[0] = ox;
|
|
194
|
+
out[1] = oy;
|
|
195
|
+
out[2] = oz;
|
|
196
|
+
return w;
|
|
197
|
+
}
|
|
198
|
+
/** Column-major 4×4 matrix helpers. See the module comment for conventions. */
|
|
199
|
+
export const mat4 = {
|
|
200
|
+
create,
|
|
201
|
+
identity,
|
|
202
|
+
copy,
|
|
203
|
+
multiply,
|
|
204
|
+
ortho,
|
|
205
|
+
perspective,
|
|
206
|
+
lookAt,
|
|
207
|
+
view2d,
|
|
208
|
+
invert,
|
|
209
|
+
transformPoint,
|
|
210
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeded coherent noise (ws/core-2): value, Perlin (gradient) and simplex noise in 2D and 3D,
|
|
3
|
+
* plus fractal Brownian motion over any of them.
|
|
4
|
+
*
|
|
5
|
+
* `createNoise(seed)` shuffles a 256-entry permutation table with `createRandom(seed)` (the same
|
|
6
|
+
* seed hash as `Random`) and fills a 256-entry lattice value table in [-1, 1]. Every function
|
|
7
|
+
* returns a value in [-1, 1] (gradient and simplex noise are scaled to that span and clamped),
|
|
8
|
+
* is continuous in its inputs, and allocates nothing. The functions are plain closures, so
|
|
9
|
+
* `noise.perlin2` can be passed around unbound (`fbm(noise.perlin2, x, y)`).
|
|
10
|
+
*/
|
|
11
|
+
import { type Seed } from './random.js';
|
|
12
|
+
/** A noise function; 2D ones ignore `z`. */
|
|
13
|
+
export type NoiseFn = (x: number, y: number, z: number) => number;
|
|
14
|
+
export interface FbmOptions {
|
|
15
|
+
/** Layers summed. Default 4. */
|
|
16
|
+
octaves?: number;
|
|
17
|
+
/** Frequency multiplier per octave. Default 2. */
|
|
18
|
+
lacunarity?: number;
|
|
19
|
+
/** Amplitude multiplier per octave. Default 0.5. */
|
|
20
|
+
gain?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface Noise {
|
|
23
|
+
/** Lattice values smoothly interpolated (quintic fade). */
|
|
24
|
+
value2(x: number, y: number): number;
|
|
25
|
+
value3(x: number, y: number, z: number): number;
|
|
26
|
+
/** Improved Perlin gradient noise; 0 on every integer lattice point. */
|
|
27
|
+
perlin2(x: number, y: number): number;
|
|
28
|
+
perlin3(x: number, y: number, z: number): number;
|
|
29
|
+
/** Simplex noise (Gustavson's formulation). */
|
|
30
|
+
simplex2(x: number, y: number): number;
|
|
31
|
+
simplex3(x: number, y: number, z: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* `octaves` layers of `fn`, each at `lacunarity` times the frequency and `gain` times the
|
|
34
|
+
* amplitude of the last, divided by the summed amplitude so the result stays in [-1, 1]. One
|
|
35
|
+
* octave is exactly `fn(x, y, z)`. Hoist the options object: a literal per call allocates.
|
|
36
|
+
*/
|
|
37
|
+
fbm(fn: NoiseFn, x: number, y: number, z?: number, opts?: FbmOptions): number;
|
|
38
|
+
}
|
|
39
|
+
/** Seeded noise; see the module comment. Builds two small tables (allocates once). */
|
|
40
|
+
export declare function createNoise(seed: Seed): Noise;
|