@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,158 @@
|
|
|
1
|
+
import { WGSL_MOTION } from '../render/scene-pipelines.js';
|
|
2
|
+
import { WGSL_GLOBALS } from '../render/wgsl.js';
|
|
3
|
+
/** Floats per billboard instance in the storage buffer (`BILLBOARD_BYTES` / 4). */
|
|
4
|
+
export const BILLBOARD_FLOATS = 20;
|
|
5
|
+
export const BILLBOARD_BYTES = BILLBOARD_FLOATS * 4;
|
|
6
|
+
/** Instance flag bits, in `pos.w` as a float. */
|
|
7
|
+
export const BB_FLAG_PX = 1;
|
|
8
|
+
export const BB_FLAG_YAW = 2;
|
|
9
|
+
export const BB_FLAG_TEXTURED = 4;
|
|
10
|
+
export const BB_FLAG_BAR = 8;
|
|
11
|
+
/**
|
|
12
|
+
* The billboard batch's shader: six vertices per instance, read from a storage buffer.
|
|
13
|
+
*
|
|
14
|
+
* - `pos.xyz` is the world anchor (position plus offset); `pos.w` carries the flags above.
|
|
15
|
+
* - `size.xy` is the quad size: world units, or logical px with `BB_FLAG_PX` (then the quad is
|
|
16
|
+
* screen-aligned and sized from `globals.logicalSize`, `globals.targetSize` and the view's
|
|
17
|
+
* `camera.viewport`, so it keeps its px size at any distance). `size.z` is the bar fraction.
|
|
18
|
+
* - World-unit quads face the camera (`camera.view` rows 0 and 1), or turn only about y with
|
|
19
|
+
* `BB_FLAG_YAW` (right = the view's right flattened onto xz, up = +y).
|
|
20
|
+
* - `color` multiplies the atlas sample (`BB_FLAG_TEXTURED`) or stands alone; with `BB_FLAG_BAR`
|
|
21
|
+
* the fragment is `color` where `uv.x < size.z` and `color2` beyond.
|
|
22
|
+
*/
|
|
23
|
+
export const BILLBOARD_WGSL = /* wgsl */ `
|
|
24
|
+
${WGSL_GLOBALS}
|
|
25
|
+
struct Billboard {
|
|
26
|
+
pos: vec4f,
|
|
27
|
+
size: vec4f,
|
|
28
|
+
uv: vec4f,
|
|
29
|
+
color: vec4f,
|
|
30
|
+
color2: vec4f,
|
|
31
|
+
};
|
|
32
|
+
@group(1) @binding(0) var<storage, read> billboards: array<Billboard>;
|
|
33
|
+
@group(1) @binding(1) var atlas_sampler: sampler;
|
|
34
|
+
@group(1) @binding(2) var atlas: texture_2d<f32>;
|
|
35
|
+
|
|
36
|
+
struct VSOut {
|
|
37
|
+
@builtin(position) clip: vec4f,
|
|
38
|
+
@location(0) uv: vec2f,
|
|
39
|
+
@location(1) q: vec2f,
|
|
40
|
+
@location(2) color: vec4f,
|
|
41
|
+
@location(3) color2: vec4f,
|
|
42
|
+
@location(4) @interpolate(flat) flags: u32,
|
|
43
|
+
@location(5) fraction: f32,
|
|
44
|
+
};
|
|
45
|
+
struct FragOut {
|
|
46
|
+
@location(0) color: vec4f,
|
|
47
|
+
@location(1) emissive: vec4f,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
fn view_row(r: u32) -> vec3f {
|
|
51
|
+
return vec3f(camera.view[0][r], camera.view[1][r], camera.view[2][r]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@vertex fn vs(@builtin(vertex_index) vi: u32, @builtin(instance_index) ii: u32) -> VSOut {
|
|
55
|
+
var o: VSOut;
|
|
56
|
+
let b = billboards[ii];
|
|
57
|
+
var corners = array<vec2f, 6>(
|
|
58
|
+
vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0),
|
|
59
|
+
vec2f(-1.0, -1.0), vec2f(1.0, 1.0), vec2f(-1.0, 1.0)
|
|
60
|
+
);
|
|
61
|
+
let q = corners[vi];
|
|
62
|
+
let flags = u32(b.pos.w + 0.5);
|
|
63
|
+
let half = b.size.xy * 0.5;
|
|
64
|
+
if ((flags & ${BB_FLAG_PX}u) != 0u) {
|
|
65
|
+
var clip = camera.view_proj * vec4f(b.pos.xyz, 1.0);
|
|
66
|
+
// Logical px → target px → NDC, scaled by w so the division leaves the px size intact.
|
|
67
|
+
let px_per_logical = globals.targetSize / globals.logicalSize;
|
|
68
|
+
let ndc = (q * half * px_per_logical) / max(camera.viewport.zw, vec2f(1.0)) * 2.0;
|
|
69
|
+
clip = vec4f(clip.xy + ndc * clip.w, clip.zw);
|
|
70
|
+
o.clip = clip;
|
|
71
|
+
} else {
|
|
72
|
+
var right = view_row(0u);
|
|
73
|
+
var up = view_row(1u);
|
|
74
|
+
if ((flags & ${BB_FLAG_YAW}u) != 0u) {
|
|
75
|
+
let flat = vec3f(right.x, 0.0, right.z);
|
|
76
|
+
let len = length(flat);
|
|
77
|
+
right = select(vec3f(1.0, 0.0, 0.0), flat / max(len, 1e-6), len > 1e-6);
|
|
78
|
+
up = vec3f(0.0, 1.0, 0.0);
|
|
79
|
+
}
|
|
80
|
+
let world = b.pos.xyz + right * (q.x * half.x) + up * (q.y * half.y);
|
|
81
|
+
o.clip = camera.view_proj * vec4f(world, 1.0);
|
|
82
|
+
}
|
|
83
|
+
// Canvas uv: v grows downward, so the top of the quad (q.y = 1) samples v0.
|
|
84
|
+
let t = q * 0.5 + 0.5;
|
|
85
|
+
o.uv = vec2f(mix(b.uv.x, b.uv.z, t.x), mix(b.uv.w, b.uv.y, t.y));
|
|
86
|
+
o.q = t;
|
|
87
|
+
o.color = b.color;
|
|
88
|
+
o.color2 = b.color2;
|
|
89
|
+
o.flags = flags;
|
|
90
|
+
o.fraction = b.size.z;
|
|
91
|
+
return o;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@fragment fn fs(in: VSOut) -> FragOut {
|
|
95
|
+
var c = in.color;
|
|
96
|
+
if ((in.flags & ${BB_FLAG_BAR}u) != 0u) {
|
|
97
|
+
c = select(in.color2, in.color, in.q.x < in.fraction);
|
|
98
|
+
}
|
|
99
|
+
// Sampled unconditionally: textureSample needs uniform control flow.
|
|
100
|
+
let s = textureSample(atlas, atlas_sampler, in.uv);
|
|
101
|
+
c *= select(vec4f(1.0), s, (in.flags & ${BB_FLAG_TEXTURED}u) != 0u);
|
|
102
|
+
var o: FragOut;
|
|
103
|
+
o.color = c;
|
|
104
|
+
o.emissive = vec4f(0.0, 0.0, 0.0, c.a);
|
|
105
|
+
return o;
|
|
106
|
+
}
|
|
107
|
+
`;
|
|
108
|
+
/** Insert `add` after the one occurrence of `at` in `src` (throws unless there is exactly one). */
|
|
109
|
+
function after(src, at, add) {
|
|
110
|
+
const i = src.indexOf(at);
|
|
111
|
+
if (i < 0 || src.indexOf(at, i + 1) >= 0)
|
|
112
|
+
throw new Error(`billboardWgsl: anchor ${at}`);
|
|
113
|
+
return src.slice(0, i + at.length) + add + src.slice(i + at.length);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* `BILLBOARD_WGSL`, or with `velocity` (the velocity attachment's fragment location, 2 or 3)
|
|
117
|
+
* the build that writes its own motion (ws/render-11): binding 3 holds each sorted instance's
|
|
118
|
+
* previous anchor (`xyz`, `w` = 1 when known), the vertex stage projects the same corner of
|
|
119
|
+
* last frame's quad through `camera.prev_view_proj` / `prev_view`, and the fragment writes
|
|
120
|
+
* `vec4f(engine_motion(..), 0, alpha)` there. Internal; `0` is the exported string itself.
|
|
121
|
+
*/
|
|
122
|
+
export function billboardWgsl(velocity) {
|
|
123
|
+
if (velocity <= 0)
|
|
124
|
+
return BILLBOARD_WGSL;
|
|
125
|
+
let s = after(BILLBOARD_WGSL, WGSL_GLOBALS, WGSL_MOTION);
|
|
126
|
+
s = after(s, '@group(1) @binding(2) var atlas: texture_2d<f32>;', '\n@group(1) @binding(3) var<storage, read> billboard_prev: array<vec4f>;');
|
|
127
|
+
s = after(s, ' @location(5) fraction: f32,', '\n @location(6) prev_clip: vec4f,');
|
|
128
|
+
s = after(s, ' @location(1) emissive: vec4f,', `\n @location(${velocity}) velocity: vec4f,`);
|
|
129
|
+
s = after(s, `fn view_row(r: u32) -> vec3f {
|
|
130
|
+
return vec3f(camera.view[0][r], camera.view[1][r], camera.view[2][r]);
|
|
131
|
+
}
|
|
132
|
+
`, `
|
|
133
|
+
fn prev_view_row(r: u32) -> vec3f {
|
|
134
|
+
return vec3f(camera.prev_view[0][r], camera.prev_view[1][r], camera.prev_view[2][r]);
|
|
135
|
+
}
|
|
136
|
+
fn yaw_right(r: vec3f) -> vec3f {
|
|
137
|
+
let flat = vec3f(r.x, 0.0, r.z);
|
|
138
|
+
let len = length(flat);
|
|
139
|
+
return select(vec3f(1.0, 0.0, 0.0), flat / max(len, 1e-6), len > 1e-6);
|
|
140
|
+
}
|
|
141
|
+
`);
|
|
142
|
+
s = after(s, ' let half = b.size.xy * 0.5;', `
|
|
143
|
+
let pv = billboard_prev[ii];
|
|
144
|
+
let pa = select(b.pos.xyz, pv.xyz, pv.w > 0.5);`);
|
|
145
|
+
s = after(s, ' o.clip = clip;', `
|
|
146
|
+
let pc = camera.prev_view_proj * vec4f(pa, 1.0);
|
|
147
|
+
o.prev_clip = vec4f(pc.xy + ndc * pc.w, pc.zw);`);
|
|
148
|
+
s = after(s, ' o.clip = camera.view_proj * vec4f(world, 1.0);', `
|
|
149
|
+
var pr = prev_view_row(0u);
|
|
150
|
+
var pu = prev_view_row(1u);
|
|
151
|
+
if ((flags & ${BB_FLAG_YAW}u) != 0u) {
|
|
152
|
+
pr = yaw_right(pr);
|
|
153
|
+
pu = vec3f(0.0, 1.0, 0.0);
|
|
154
|
+
}
|
|
155
|
+
let prev_world = pa + pr * (q.x * half.x) + pu * (q.y * half.y);
|
|
156
|
+
o.prev_clip = camera.prev_view_proj * vec4f(prev_world, 1.0);`);
|
|
157
|
+
return after(s, ' o.emissive = vec4f(0.0, 0.0, 0.0, c.a);', '\n o.velocity = vec4f(engine_motion(in.clip, in.prev_clip), 0.0, c.a);');
|
|
158
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import type { Camera } from '../render/camera.js';
|
|
2
|
+
import type { Drawable, Frame } from '../render/frame.js';
|
|
3
|
+
import type { Renderer } from '../render/renderer.js';
|
|
4
|
+
import type { Texture } from '../render/texture.js';
|
|
5
|
+
import { type AtlasRegion, TextAtlas, type TextAtlasOptions, type TextStyle } from './text-atlas.js';
|
|
6
|
+
/** `'camera'`: the quad faces the eye. `'cameraY'`: it turns about y only (stays upright). */
|
|
7
|
+
export type BillboardFacing = 'camera' | 'cameraY';
|
|
8
|
+
/** `'test'`: hidden behind scene geometry (no depth write). `'always'`: drawn over everything. */
|
|
9
|
+
export type BillboardDepth = 'test' | 'always';
|
|
10
|
+
/** `[w, h]` in world units, or `{ px: [w, h] }` in logical px, the same size at any distance. */
|
|
11
|
+
export type BillboardSize = readonly [number, number] | {
|
|
12
|
+
readonly px: readonly [number, number];
|
|
13
|
+
};
|
|
14
|
+
export interface BillboardDesc {
|
|
15
|
+
/**
|
|
16
|
+
* World anchor. A `Float32Array` (x, y, z at 0..2) is followed live, so a plate tracks the
|
|
17
|
+
* thing it is over without being told; a tuple is copied.
|
|
18
|
+
*/
|
|
19
|
+
position: Float32Array | readonly [number, number, number];
|
|
20
|
+
/** World-space offset from `position` (a head height). Default none. */
|
|
21
|
+
offset?: readonly [number, number, number];
|
|
22
|
+
size: BillboardSize;
|
|
23
|
+
/** An atlas region to show (`billboards.text(...)`), or `null`/unset for a solid colour. */
|
|
24
|
+
region?: AtlasRegion | null;
|
|
25
|
+
/**
|
|
26
|
+
* A text plate (ws/fx-4): `text` in its own atlas cell (`TextAtlas.cell`), changed later with
|
|
27
|
+
* `handle.setText`. Overrides `region`. Size the quad to the text with `billboards.measure`.
|
|
28
|
+
*/
|
|
29
|
+
text?: string;
|
|
30
|
+
/** The plate's style (with `text`). */
|
|
31
|
+
textStyle?: TextStyle;
|
|
32
|
+
/** Linear RGBA multiplier (straight alpha). Default white. */
|
|
33
|
+
color?: ArrayLike<number>;
|
|
34
|
+
/** Default `'camera'`. `{ px }` sizes are always screen-aligned. */
|
|
35
|
+
facing?: BillboardFacing;
|
|
36
|
+
/** Default `'test'`. */
|
|
37
|
+
depth?: BillboardDepth;
|
|
38
|
+
/**
|
|
39
|
+
* Seconds to live: the quad holds for the first half, fades over the second and removes
|
|
40
|
+
* itself at the end. Default none (lives until `remove`).
|
|
41
|
+
*/
|
|
42
|
+
life?: number;
|
|
43
|
+
/** World units per second added to the anchor (damage numbers drift up). Default none. */
|
|
44
|
+
velocity?: readonly [number, number, number];
|
|
45
|
+
/**
|
|
46
|
+
* A health bar in one quad: `color` fills `fraction` of the width from the left, `bg` the
|
|
47
|
+
* rest. `billboards.bar(...)` builds this. Default none.
|
|
48
|
+
*/
|
|
49
|
+
bar?: {
|
|
50
|
+
fraction: number;
|
|
51
|
+
bg: ArrayLike<number>;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export interface BillboardsOptions {
|
|
55
|
+
/** Billboards the buffers start with (they grow when full). Default 1024. */
|
|
56
|
+
capacity?: number;
|
|
57
|
+
/** The text atlas: canvas `size` (default 1024) and default `font`. */
|
|
58
|
+
atlas?: TextAtlasOptions;
|
|
59
|
+
label?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* World units a span of `px` logical px covers at `viewDistance` from a camera whose projection
|
|
63
|
+
* is `projection` (column-major; `projection[5]` is the vertical scale) on a viewport
|
|
64
|
+
* `viewportPx` logical px tall. The shader applies the same ratio in clip space for `{ px }`
|
|
65
|
+
* sizes; use this on the CPU to size something in world units to match a px plate.
|
|
66
|
+
*/
|
|
67
|
+
export declare function pxToWorld(px: number, viewDistance: number, projection: ArrayLike<number>, viewportPx: number): number;
|
|
68
|
+
/**
|
|
69
|
+
* One billboard, returned by `Billboards.add`. Setters change it in place; it is `alive` until
|
|
70
|
+
* `remove` or its `life` runs out, after which the setters do nothing.
|
|
71
|
+
*/
|
|
72
|
+
export declare class BillboardHandle {
|
|
73
|
+
private readonly owner;
|
|
74
|
+
/** @internal slot in the owner's arrays, -1 when dead. */
|
|
75
|
+
slot: number;
|
|
76
|
+
constructor(owner: Billboards);
|
|
77
|
+
get alive(): boolean;
|
|
78
|
+
set position(p: Float32Array | readonly [number, number, number]);
|
|
79
|
+
set offset(o: readonly [number, number, number]);
|
|
80
|
+
set color(c: ArrayLike<number>);
|
|
81
|
+
set size(s: BillboardSize);
|
|
82
|
+
set region(r: AtlasRegion | null);
|
|
83
|
+
/** The text plate's text (`desc.text`, `setText`); null when not a plate. */
|
|
84
|
+
get text(): string | null;
|
|
85
|
+
/**
|
|
86
|
+
* Change a text plate's text (ws/fx-4). Re-rasterised into the plate's own atlas cell when it
|
|
87
|
+
* fits (no new region, no new texture), else into a wider cell: the quad's height stays and
|
|
88
|
+
* its width grows with the cell, so the glyphs keep their scale. A handle that is not a plate
|
|
89
|
+
* becomes one, in the default style, at its current size.
|
|
90
|
+
*/
|
|
91
|
+
setText(text: string): void;
|
|
92
|
+
/** The filled share of a bar quad, 0..1. */
|
|
93
|
+
set fraction(f: number);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* World-anchored, camera-facing quads in one batch: name plates, damage numbers, health bars,
|
|
97
|
+
* markers. Each shows a region of the shared text atlas or a solid colour, is sized in world
|
|
98
|
+
* units or in screen px, optionally fades out over `life` and drifts by `velocity`. Alpha
|
|
99
|
+
* blended, depth tested without writing (or drawn over everything with `depth: 'always'`),
|
|
100
|
+
* sorted back to front each `update`. Draw with `frame.drawable(billboards)`.
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* const bb = createBillboards(renderer);
|
|
104
|
+
* const plate = bb.add({ position: hero.position, offset: [0, 2, 0], size: { px: [160, 40] },
|
|
105
|
+
* region: bb.text('Hero', { size: 28, stroke: '#000', strokeWidth: 4 }) });
|
|
106
|
+
* bb.add({ position: hero.position, offset: [0, 2.3, 0], size: [1, 0.12], life: 0.9,
|
|
107
|
+
* velocity: [0, 1.2, 0], region: bb.text('-37', { color: '#f44' }) });
|
|
108
|
+
* bb.update(dt, camera); // ages, drifts, sorts
|
|
109
|
+
* frame.drawable(bb); // inside the scene's render
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* Nothing allocates per frame once the buffers are big enough; `add` past `capacity` doubles
|
|
113
|
+
* them.
|
|
114
|
+
*/
|
|
115
|
+
export declare class Billboards implements Drawable {
|
|
116
|
+
/** The atlas canvas as a texture, uploaded when the atlas changed (once per frame at most). */
|
|
117
|
+
readonly atlasTexture: Texture;
|
|
118
|
+
/** The text atlas behind `text()`. */
|
|
119
|
+
readonly atlas: TextAtlas;
|
|
120
|
+
/** Draw calls the last `draw` issued (0, 1 or 2: one per depth mode in use). */
|
|
121
|
+
draws: number;
|
|
122
|
+
private readonly renderer;
|
|
123
|
+
private readonly device;
|
|
124
|
+
private readonly label;
|
|
125
|
+
private capacity;
|
|
126
|
+
private n;
|
|
127
|
+
private anchor;
|
|
128
|
+
private tracked;
|
|
129
|
+
private offset;
|
|
130
|
+
private velocity;
|
|
131
|
+
/** age, life (life <= 0: immortal). */
|
|
132
|
+
private life;
|
|
133
|
+
private rgba;
|
|
134
|
+
private mode;
|
|
135
|
+
private regions;
|
|
136
|
+
/** A text plate's text (its region an owned atlas cell); null when not a plate. */
|
|
137
|
+
private plates;
|
|
138
|
+
private handles;
|
|
139
|
+
/** Instance data per slot, in `BILLBOARD_WGSL`'s layout. */
|
|
140
|
+
private inst;
|
|
141
|
+
private order;
|
|
142
|
+
private keys;
|
|
143
|
+
private upload;
|
|
144
|
+
/**
|
|
145
|
+
* Motion (ws/render-11): per slot the anchor its quad was last drawn at (`xyz`, `w` = 1 once
|
|
146
|
+
* drawn), and the previous anchors in sorted order for `prevBuffer` (binding 3), which the
|
|
147
|
+
* velocity build of the shader reads. Kept only once a view with a velocity attachment drew
|
|
148
|
+
* the batch (`motion`); until then the buffer holds zeros, read as "unknown" (no motion).
|
|
149
|
+
*/
|
|
150
|
+
private drawn;
|
|
151
|
+
private prevUpload;
|
|
152
|
+
private prevBuffer;
|
|
153
|
+
private motion;
|
|
154
|
+
/** The velocity builds of the shader, by fragment location (2 or 3), made on first use. */
|
|
155
|
+
private readonly motionModules;
|
|
156
|
+
private testCount;
|
|
157
|
+
private alwaysCount;
|
|
158
|
+
private uploadDirty;
|
|
159
|
+
private buffer;
|
|
160
|
+
private group;
|
|
161
|
+
private readonly groupLayout;
|
|
162
|
+
private readonly pipelineDesc;
|
|
163
|
+
/**
|
|
164
|
+
* Pipelines per depth format (null: none) × the view target's aux key, made on first use
|
|
165
|
+
* from `renderer.sceneTargets` (ws/render-10): `testPipelines` depth-test (and hold the
|
|
166
|
+
* depthless one), `alwaysPipelines` ignore depth.
|
|
167
|
+
*/
|
|
168
|
+
private readonly testPipelines;
|
|
169
|
+
private readonly alwaysPipelines;
|
|
170
|
+
constructor(renderer: Renderer, opts?: BillboardsOptions);
|
|
171
|
+
/** Live billboards. */
|
|
172
|
+
get count(): number;
|
|
173
|
+
/** Share of the atlas canvas in use, 0..1. */
|
|
174
|
+
get atlasUsed(): number;
|
|
175
|
+
private makeBuffer;
|
|
176
|
+
private makePrevBuffer;
|
|
177
|
+
private makeGroup;
|
|
178
|
+
/** Double every array and the GPU buffer (only when `add` finds the batch full). */
|
|
179
|
+
private grow;
|
|
180
|
+
/** Add a billboard; the handle changes or removes it later. */
|
|
181
|
+
add(desc: BillboardDesc): BillboardHandle;
|
|
182
|
+
/** Remove a billboard now (a no-op for one already gone). */
|
|
183
|
+
remove(handle: BillboardHandle): void;
|
|
184
|
+
/** Remove every billboard. Atlas text stays cached; text plates give their cells back. */
|
|
185
|
+
clear(): void;
|
|
186
|
+
/** Swap-remove slot `i`: the last slot moves into it. */
|
|
187
|
+
private removeAt;
|
|
188
|
+
/**
|
|
189
|
+
* The atlas region for `text` in `style`, rasterised on first use and cached (text + style).
|
|
190
|
+
* Throws when the string is larger than the whole atlas canvas.
|
|
191
|
+
*/
|
|
192
|
+
text(text: string, style?: TextStyle): AtlasRegion;
|
|
193
|
+
/**
|
|
194
|
+
* A health bar in one quad, `fraction` (0..1) of its width in `fg` and the rest in `bg`:
|
|
195
|
+
* spread it into `add` with a `position`, then set `handle.fraction`.
|
|
196
|
+
*/
|
|
197
|
+
bar(fraction: number, size: BillboardSize, fg: ArrayLike<number>, bg: ArrayLike<number>): Omit<BillboardDesc, 'position'>;
|
|
198
|
+
/** @internal */
|
|
199
|
+
setPosition(i: number, p: Float32Array | readonly [number, number, number]): void;
|
|
200
|
+
/** @internal */
|
|
201
|
+
setOffset(i: number, o: readonly [number, number, number]): void;
|
|
202
|
+
/** @internal */
|
|
203
|
+
setColor(i: number, c: ArrayLike<number>): void;
|
|
204
|
+
/** @internal */
|
|
205
|
+
setSize(i: number, s: BillboardSize): void;
|
|
206
|
+
/**
|
|
207
|
+
* The width and height, in atlas px, a text plate of `text` in `style` gets (its cell): size
|
|
208
|
+
* a plate's quad to this aspect.
|
|
209
|
+
*/
|
|
210
|
+
measure(text: string, style?: TextStyle): {
|
|
211
|
+
width: number;
|
|
212
|
+
height: number;
|
|
213
|
+
};
|
|
214
|
+
/** @internal */
|
|
215
|
+
plateText(i: number): string | null;
|
|
216
|
+
/** @internal */
|
|
217
|
+
setText(i: number, text: string): void;
|
|
218
|
+
private makePlate;
|
|
219
|
+
private releasePlate;
|
|
220
|
+
/** @internal */
|
|
221
|
+
setRegion(i: number, r: AtlasRegion | null): void;
|
|
222
|
+
private writeRegion;
|
|
223
|
+
/** @internal */
|
|
224
|
+
setFraction(i: number, f: number): void;
|
|
225
|
+
/**
|
|
226
|
+
* Age and drift every billboard, remove the ones past their `life`, resolve anchors and fades
|
|
227
|
+
* into the instance data and sort back to front for `camera` (without one, submission order).
|
|
228
|
+
* Call once per update or frame; allocation-free.
|
|
229
|
+
*/
|
|
230
|
+
update(dt: number, camera?: Camera | null): void;
|
|
231
|
+
/**
|
|
232
|
+
* Upload the instance data, last frame's drawn anchors when the view has velocity and, when
|
|
233
|
+
* the atlas changed, its canvas. Runs before the pass.
|
|
234
|
+
*/
|
|
235
|
+
prepare(_encoder: GPUCommandEncoder, _frame?: Frame): void;
|
|
236
|
+
/**
|
|
237
|
+
* Once per frame with `motion` on: each drawn quad's previous anchor (where it was drawn last
|
|
238
|
+
* frame, or its current one the first time) into `prevBuffer` in draw order, then remember
|
|
239
|
+
* the current anchors. Without an `update` since, current equals previous (no motion).
|
|
240
|
+
*/
|
|
241
|
+
private writePrevious;
|
|
242
|
+
/** Draw inside the scene pass: the `'test'` quads, then the `'always'` ones. */
|
|
243
|
+
draw(pass: GPURenderPassEncoder, frame?: Frame): void;
|
|
244
|
+
private pipelineFor;
|
|
245
|
+
private motionModule;
|
|
246
|
+
destroy(): void;
|
|
247
|
+
}
|
|
248
|
+
/** `new Billboards(renderer, opts)`. */
|
|
249
|
+
export declare function createBillboards(renderer: Renderer, opts?: BillboardsOptions): Billboards;
|