@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
package/dist/fx/trail.js
ADDED
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { VERTEX_LAYOUT_3D, VERTEX3D_FLOATS } from '../render/mesh.js';
|
|
2
|
+
import { Transform } from '../render/transform.js';
|
|
3
|
+
import { TRAIL_TEXTURED_WGSL, TRAIL_WGSL } from './trail-wgsl.js';
|
|
4
|
+
/** Point stride in the ring: x, y, z, birth time. */
|
|
5
|
+
const PF = 4;
|
|
6
|
+
const VF = VERTEX3D_FLOATS;
|
|
7
|
+
const DEFAULT_FADE = new Float32Array([1, 0]);
|
|
8
|
+
const UP = new Float32Array([0, 1, 0]);
|
|
9
|
+
const Z = new Float32Array([0, 0, 1]);
|
|
10
|
+
/** Linear sample of channel `ch` of a table of `stride`-float stops at `t` in 0..1. */
|
|
11
|
+
function sampleCurve(table, stride, ch, t) {
|
|
12
|
+
const stops = table.length / stride;
|
|
13
|
+
if (stops <= 1)
|
|
14
|
+
return table[ch] ?? 0;
|
|
15
|
+
const k = t * (stops - 1);
|
|
16
|
+
const i = Math.min(Math.floor(k), stops - 2);
|
|
17
|
+
const f = k - i;
|
|
18
|
+
return table[i * stride + ch] * (1 - f) + table[(i + 1) * stride + ch] * f;
|
|
19
|
+
}
|
|
20
|
+
function toTable(src) {
|
|
21
|
+
if (!src || src.length === 0)
|
|
22
|
+
return null;
|
|
23
|
+
const out = new Float32Array(src.length);
|
|
24
|
+
for (let i = 0; i < src.length; i++)
|
|
25
|
+
out[i] = src[i];
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
/** Index buffer for `quads` ribbon quads over vertices 0.. (two per point). */
|
|
29
|
+
function ribbonIndices(quads, vertices) {
|
|
30
|
+
const idx = vertices > 0xffff ? new Uint32Array(quads * 6) : new Uint16Array(quads * 6);
|
|
31
|
+
writeQuads(idx, 0, 0, quads);
|
|
32
|
+
return idx;
|
|
33
|
+
}
|
|
34
|
+
/** Write `quads` quads starting at vertex `base` into `idx` at `at`; returns the next index. */
|
|
35
|
+
function writeQuads(idx, at, base, quads) {
|
|
36
|
+
let o = at;
|
|
37
|
+
for (let q = 0; q < quads; q++) {
|
|
38
|
+
const a = base + q * 2;
|
|
39
|
+
idx[o++] = a;
|
|
40
|
+
idx[o++] = a + 1;
|
|
41
|
+
idx[o++] = a + 2;
|
|
42
|
+
idx[o++] = a + 1;
|
|
43
|
+
idx[o++] = a + 3;
|
|
44
|
+
idx[o++] = a + 2;
|
|
45
|
+
}
|
|
46
|
+
return o;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The points of one ribbon: a ring of stored points (x, y, z, birth time) plus the tip, the
|
|
50
|
+
* latest pushed position, which is drawn as an extra, age-0 point when it sits apart from the
|
|
51
|
+
* newest stored point. Nothing here touches the GPU.
|
|
52
|
+
*/
|
|
53
|
+
class Ring {
|
|
54
|
+
cap;
|
|
55
|
+
pts;
|
|
56
|
+
tail = 0;
|
|
57
|
+
/** Stored points. */
|
|
58
|
+
n = 0;
|
|
59
|
+
tip = new Float32Array(3);
|
|
60
|
+
hasTip = false;
|
|
61
|
+
constructor(cap) {
|
|
62
|
+
this.cap = cap;
|
|
63
|
+
this.pts = new Float32Array(cap * PF);
|
|
64
|
+
}
|
|
65
|
+
/** Store or move the tip; true when a point was stored. */
|
|
66
|
+
push(x, y, z, now, minDistance) {
|
|
67
|
+
const tip = this.tip;
|
|
68
|
+
tip[0] = x;
|
|
69
|
+
tip[1] = y;
|
|
70
|
+
tip[2] = z;
|
|
71
|
+
this.hasTip = true;
|
|
72
|
+
if (this.n > 0) {
|
|
73
|
+
const o = ((this.tail + this.n - 1) % this.cap) * PF;
|
|
74
|
+
const p = this.pts;
|
|
75
|
+
const dx = x - p[o];
|
|
76
|
+
const dy = y - p[o + 1];
|
|
77
|
+
const dz = z - p[o + 2];
|
|
78
|
+
if (dx * dx + dy * dy + dz * dz < minDistance * minDistance)
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (this.n === this.cap) {
|
|
82
|
+
this.tail = (this.tail + 1) % this.cap;
|
|
83
|
+
this.n--;
|
|
84
|
+
}
|
|
85
|
+
const o = ((this.tail + this.n) % this.cap) * PF;
|
|
86
|
+
const p = this.pts;
|
|
87
|
+
p[o] = x;
|
|
88
|
+
p[o + 1] = y;
|
|
89
|
+
p[o + 2] = z;
|
|
90
|
+
p[o + 3] = now;
|
|
91
|
+
this.n++;
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/** Drop stored points older than `lifetime`. */
|
|
95
|
+
expire(now, lifetime) {
|
|
96
|
+
const p = this.pts;
|
|
97
|
+
while (this.n > 0 && now - p[this.tail * PF + 3] > lifetime) {
|
|
98
|
+
this.tail = (this.tail + 1) % this.cap;
|
|
99
|
+
this.n--;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Does the tip sit apart from the newest stored point (so it is drawn)? */
|
|
103
|
+
tipApart() {
|
|
104
|
+
if (!this.hasTip)
|
|
105
|
+
return false;
|
|
106
|
+
if (this.n === 0)
|
|
107
|
+
return true;
|
|
108
|
+
const o = ((this.tail + this.n - 1) % this.cap) * PF;
|
|
109
|
+
const p = this.pts;
|
|
110
|
+
const t = this.tip;
|
|
111
|
+
return p[o] !== t[0] || p[o + 1] !== t[1] || p[o + 2] !== t[2];
|
|
112
|
+
}
|
|
113
|
+
/** Points drawn: stored points plus the tip when apart. */
|
|
114
|
+
count() {
|
|
115
|
+
return this.n + (this.tipApart() ? 1 : 0);
|
|
116
|
+
}
|
|
117
|
+
/** Point `i` (0 = newest, the tip when apart) into `out` (x, y, z, birth time). */
|
|
118
|
+
read(i, now, out) {
|
|
119
|
+
let k = i;
|
|
120
|
+
if (this.tipApart()) {
|
|
121
|
+
if (k === 0) {
|
|
122
|
+
out[0] = this.tip[0];
|
|
123
|
+
out[1] = this.tip[1];
|
|
124
|
+
out[2] = this.tip[2];
|
|
125
|
+
out[3] = now;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
k--;
|
|
129
|
+
}
|
|
130
|
+
const o = ((this.tail + this.n - 1 - k) % this.cap) * PF;
|
|
131
|
+
const p = this.pts;
|
|
132
|
+
out[0] = p[o];
|
|
133
|
+
out[1] = p[o + 1];
|
|
134
|
+
out[2] = p[o + 2];
|
|
135
|
+
out[3] = p[o + 3];
|
|
136
|
+
}
|
|
137
|
+
clear() {
|
|
138
|
+
this.tail = 0;
|
|
139
|
+
this.n = 0;
|
|
140
|
+
this.hasTip = false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const prev = new Float32Array(4);
|
|
144
|
+
const cur = new Float32Array(4);
|
|
145
|
+
const next = new Float32Array(4);
|
|
146
|
+
const side = new Float32Array(3);
|
|
147
|
+
const axis = new Float32Array(3);
|
|
148
|
+
/**
|
|
149
|
+
* Build the ribbon of `ring` into `verts` (3D layout, two vertices per point, oldest first)
|
|
150
|
+
* from float `at`; returns the vertices written (0 when fewer than two points). Allocates
|
|
151
|
+
* nothing. `camera` drives `facing: 'camera'`: in world space the face turns toward the eye at
|
|
152
|
+
* each point, in 2D (or without a camera) it lies in the XY plane.
|
|
153
|
+
*/
|
|
154
|
+
function writeRibbon(ring, style, now, camera, verts, at) {
|
|
155
|
+
const m = ring.count();
|
|
156
|
+
if (m < 2)
|
|
157
|
+
return 0;
|
|
158
|
+
const facing = style.facing;
|
|
159
|
+
const toEye = facing === 'camera' && style.space === 'world' && camera !== null;
|
|
160
|
+
let eye = null;
|
|
161
|
+
if (facing === 'camera') {
|
|
162
|
+
if (toEye)
|
|
163
|
+
eye = camera.position;
|
|
164
|
+
else if (camera) {
|
|
165
|
+
const v = camera.view;
|
|
166
|
+
axis[0] = v[2];
|
|
167
|
+
axis[1] = v[6];
|
|
168
|
+
axis[2] = v[10];
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
axis.set(Z);
|
|
172
|
+
}
|
|
173
|
+
else if (facing === 'up')
|
|
174
|
+
axis.set(UP);
|
|
175
|
+
else {
|
|
176
|
+
axis[0] = facing[0];
|
|
177
|
+
axis[1] = facing[1];
|
|
178
|
+
axis[2] = facing[2];
|
|
179
|
+
}
|
|
180
|
+
const lifetime = style.lifetime;
|
|
181
|
+
const inv = lifetime > 0 ? 1 / lifetime : 0;
|
|
182
|
+
const tile = style.uvMode === 'tile';
|
|
183
|
+
const tileLen = style.width > 0 ? style.width : 1;
|
|
184
|
+
const color = style.color;
|
|
185
|
+
side[0] = 1;
|
|
186
|
+
side[1] = 0;
|
|
187
|
+
side[2] = 0;
|
|
188
|
+
let dist = 0;
|
|
189
|
+
ring.read(0, now, cur);
|
|
190
|
+
for (let j = 0; j < m; j++) {
|
|
191
|
+
if (j + 1 < m)
|
|
192
|
+
ring.read(j + 1, now, next);
|
|
193
|
+
let dx;
|
|
194
|
+
let dy;
|
|
195
|
+
let dz;
|
|
196
|
+
if (j === 0) {
|
|
197
|
+
dx = cur[0] - next[0];
|
|
198
|
+
dy = cur[1] - next[1];
|
|
199
|
+
dz = cur[2] - next[2];
|
|
200
|
+
}
|
|
201
|
+
else if (j + 1 < m) {
|
|
202
|
+
dx = prev[0] - next[0];
|
|
203
|
+
dy = prev[1] - next[1];
|
|
204
|
+
dz = prev[2] - next[2];
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
dx = prev[0] - cur[0];
|
|
208
|
+
dy = prev[1] - cur[1];
|
|
209
|
+
dz = prev[2] - cur[2];
|
|
210
|
+
}
|
|
211
|
+
if (eye) {
|
|
212
|
+
axis[0] = eye[0] - cur[0];
|
|
213
|
+
axis[1] = eye[1] - cur[1];
|
|
214
|
+
axis[2] = eye[2] - cur[2];
|
|
215
|
+
}
|
|
216
|
+
// side = normalize(dir × axis); a degenerate pair keeps the previous side.
|
|
217
|
+
const sx = dy * axis[2] - dz * axis[1];
|
|
218
|
+
const sy = dz * axis[0] - dx * axis[2];
|
|
219
|
+
const sz = dx * axis[1] - dy * axis[0];
|
|
220
|
+
const sl = Math.hypot(sx, sy, sz);
|
|
221
|
+
if (sl > 1e-12) {
|
|
222
|
+
side[0] = sx / sl;
|
|
223
|
+
side[1] = sy / sl;
|
|
224
|
+
side[2] = sz / sl;
|
|
225
|
+
}
|
|
226
|
+
// normal = side × dir, the face direction (toward the eye / the axis).
|
|
227
|
+
let nx = side[1] * dz - side[2] * dy;
|
|
228
|
+
let ny = side[2] * dx - side[0] * dz;
|
|
229
|
+
let nz = side[0] * dy - side[1] * dx;
|
|
230
|
+
const nl = Math.hypot(nx, ny, nz);
|
|
231
|
+
if (nl > 1e-12) {
|
|
232
|
+
nx /= nl;
|
|
233
|
+
ny /= nl;
|
|
234
|
+
nz /= nl;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
nx = axis[0];
|
|
238
|
+
ny = axis[1];
|
|
239
|
+
nz = axis[2];
|
|
240
|
+
}
|
|
241
|
+
const t = Math.min(Math.max((now - cur[3]) * inv, 0), 1);
|
|
242
|
+
const hw = (style.widthCurve ? sampleCurve(style.widthCurve, 1, 0, t) : style.width) / 2;
|
|
243
|
+
let a = style.colorCurve ? sampleCurve(style.colorCurve, 4, 3, t) : color[3];
|
|
244
|
+
if (style.fade)
|
|
245
|
+
a *= sampleCurve(style.fade, 1, 0, t);
|
|
246
|
+
const r = style.colorCurve ? sampleCurve(style.colorCurve, 4, 0, t) : color[0];
|
|
247
|
+
const g = style.colorCurve ? sampleCurve(style.colorCurve, 4, 1, t) : color[1];
|
|
248
|
+
const b = style.colorCurve ? sampleCurve(style.colorCurve, 4, 2, t) : color[2];
|
|
249
|
+
if (j > 0)
|
|
250
|
+
dist += Math.hypot(cur[0] - prev[0], cur[1] - prev[1], cur[2] - prev[2]);
|
|
251
|
+
const u = tile ? dist / tileLen : j / (m - 1);
|
|
252
|
+
const px = cur[0];
|
|
253
|
+
const py = cur[1];
|
|
254
|
+
const pz = cur[2];
|
|
255
|
+
const ox = side[0] * hw;
|
|
256
|
+
const oy = side[1] * hw;
|
|
257
|
+
const oz = side[2] * hw;
|
|
258
|
+
// Oldest first in the buffer so the index buffer is static.
|
|
259
|
+
let o = at + (m - 1 - j) * 2 * VF;
|
|
260
|
+
verts[o++] = px + ox;
|
|
261
|
+
verts[o++] = py + oy;
|
|
262
|
+
verts[o++] = pz + oz;
|
|
263
|
+
verts[o++] = nx;
|
|
264
|
+
verts[o++] = ny;
|
|
265
|
+
verts[o++] = nz;
|
|
266
|
+
verts[o++] = u;
|
|
267
|
+
verts[o++] = 0;
|
|
268
|
+
verts[o++] = r;
|
|
269
|
+
verts[o++] = g;
|
|
270
|
+
verts[o++] = b;
|
|
271
|
+
verts[o++] = a;
|
|
272
|
+
verts[o++] = px - ox;
|
|
273
|
+
verts[o++] = py - oy;
|
|
274
|
+
verts[o++] = pz - oz;
|
|
275
|
+
verts[o++] = nx;
|
|
276
|
+
verts[o++] = ny;
|
|
277
|
+
verts[o++] = nz;
|
|
278
|
+
verts[o++] = u;
|
|
279
|
+
verts[o++] = 1;
|
|
280
|
+
verts[o++] = r;
|
|
281
|
+
verts[o++] = g;
|
|
282
|
+
verts[o++] = b;
|
|
283
|
+
verts[o++] = a;
|
|
284
|
+
prev.set(cur);
|
|
285
|
+
cur.set(next);
|
|
286
|
+
}
|
|
287
|
+
return m * 2;
|
|
288
|
+
}
|
|
289
|
+
/** Untextured trail materials, one per renderer and blend mode (textured ones are per trail). */
|
|
290
|
+
const sharedMaterials = new WeakMap();
|
|
291
|
+
function trailMaterial(renderer, opts, label) {
|
|
292
|
+
const blend = opts.blend ?? 'additive';
|
|
293
|
+
if (opts.texture) {
|
|
294
|
+
const m = renderer.createMaterial({
|
|
295
|
+
label: `${label}-textured`,
|
|
296
|
+
wgsl: TRAIL_TEXTURED_WGSL,
|
|
297
|
+
blend,
|
|
298
|
+
textures: 1,
|
|
299
|
+
sampler: opts.uvMode === 'tile' ? 'linear-repeat' : 'linear-clamp',
|
|
300
|
+
});
|
|
301
|
+
m.setTexture(0, opts.texture);
|
|
302
|
+
return m;
|
|
303
|
+
}
|
|
304
|
+
let byBlend = sharedMaterials.get(renderer);
|
|
305
|
+
if (!byBlend) {
|
|
306
|
+
byBlend = new Map();
|
|
307
|
+
sharedMaterials.set(renderer, byBlend);
|
|
308
|
+
}
|
|
309
|
+
let m = byBlend.get(blend);
|
|
310
|
+
if (!m) {
|
|
311
|
+
m = renderer.createMaterial({ label: `trail-${blend}`, wgsl: TRAIL_WGSL, blend });
|
|
312
|
+
byBlend.set(blend, m);
|
|
313
|
+
}
|
|
314
|
+
return m;
|
|
315
|
+
}
|
|
316
|
+
/** Fields `Trail` and `TrailBatch` share; `TrailStyle` plus the GPU side. */
|
|
317
|
+
class RibbonBase {
|
|
318
|
+
space;
|
|
319
|
+
/** Seconds a point lives. Mutable. */
|
|
320
|
+
lifetime;
|
|
321
|
+
/** Ribbon width (or the tile length under `widthCurve`). Mutable. */
|
|
322
|
+
width;
|
|
323
|
+
/** See `TrailOptions.minDistance`. Mutable. */
|
|
324
|
+
minDistance;
|
|
325
|
+
/** See `TrailFacing`. Mutable. */
|
|
326
|
+
facing;
|
|
327
|
+
widthCurve;
|
|
328
|
+
/** Linear RGBA; mutate in place. */
|
|
329
|
+
color;
|
|
330
|
+
colorCurve;
|
|
331
|
+
fade;
|
|
332
|
+
uvMode;
|
|
333
|
+
/** The mesh the ribbon is written into (3D vertex layout; two vertices per point). */
|
|
334
|
+
mesh;
|
|
335
|
+
/** The unlit soft-edged material (shared per renderer and blend unless textured). */
|
|
336
|
+
material;
|
|
337
|
+
/**
|
|
338
|
+
* Places the ribbon: identity by default (points are already in trail space). Parent it or
|
|
339
|
+
* move it like any `Transform`.
|
|
340
|
+
*/
|
|
341
|
+
transform = new Transform();
|
|
342
|
+
/**
|
|
343
|
+
* Per-draw instance fields (`tint`, `emissive`, `order`, `layers`, ...); `params.x` is the
|
|
344
|
+
* edge softness and is owned by the trail (`softness`).
|
|
345
|
+
*/
|
|
346
|
+
instance;
|
|
347
|
+
params = new Float32Array(4);
|
|
348
|
+
ownsMaterial;
|
|
349
|
+
time = 0;
|
|
350
|
+
/** Vertices the last `update` wrote. */
|
|
351
|
+
written = 0;
|
|
352
|
+
vertexUpdate = { vertexCount: 0, indexCount: 0 };
|
|
353
|
+
constructor(renderer, opts, vertices, indices, label) {
|
|
354
|
+
const world = opts.space === 'world';
|
|
355
|
+
this.space = world ? 'world' : '2d';
|
|
356
|
+
this.lifetime = opts.lifetime ?? 0.5;
|
|
357
|
+
this.width = opts.width ?? (world ? 0.2 : 12);
|
|
358
|
+
this.minDistance = opts.minDistance ?? (world ? 0.02 : 2);
|
|
359
|
+
this.facing = opts.facing ?? 'camera';
|
|
360
|
+
this.widthCurve = toTable(opts.widthCurve);
|
|
361
|
+
this.color = new Float32Array(4);
|
|
362
|
+
const c = opts.color;
|
|
363
|
+
this.color[0] = c ? c[0] : 1;
|
|
364
|
+
this.color[1] = c ? c[1] : 1;
|
|
365
|
+
this.color[2] = c ? c[2] : 1;
|
|
366
|
+
this.color[3] = c ? (c[3] ?? 1) : 1;
|
|
367
|
+
this.colorCurve = toTable(opts.colorCurve);
|
|
368
|
+
this.fade = opts.fade === null ? null : (toTable(opts.fade) ?? DEFAULT_FADE);
|
|
369
|
+
this.uvMode = opts.uvMode ?? 'stretch';
|
|
370
|
+
this.params[0] = opts.softness ?? 0.5;
|
|
371
|
+
this.instance = { params: this.params };
|
|
372
|
+
this.ownsMaterial = !!opts.texture;
|
|
373
|
+
this.material = trailMaterial(renderer, opts, label);
|
|
374
|
+
this.mesh = renderer.createMesh({
|
|
375
|
+
label,
|
|
376
|
+
layout: VERTEX_LAYOUT_3D,
|
|
377
|
+
capacity: { vertices, indices: indices ? indices.length : 0 },
|
|
378
|
+
indices,
|
|
379
|
+
});
|
|
380
|
+
this.mesh.update({ vertexCount: 0, indexCount: 0 });
|
|
381
|
+
}
|
|
382
|
+
/** Share of the half width that fades toward each long edge, 0..1. */
|
|
383
|
+
get softness() {
|
|
384
|
+
return this.params[0];
|
|
385
|
+
}
|
|
386
|
+
set softness(v) {
|
|
387
|
+
this.params[0] = v;
|
|
388
|
+
}
|
|
389
|
+
/** Upload `count` vertices of `verts` and set the index range (allocation-free). */
|
|
390
|
+
upload(verts, count, indexCount) {
|
|
391
|
+
const u = this.vertexUpdate;
|
|
392
|
+
u.vertices = verts;
|
|
393
|
+
u.vertexCount = count;
|
|
394
|
+
u.indexCount = indexCount;
|
|
395
|
+
this.written = count;
|
|
396
|
+
this.mesh.update(u);
|
|
397
|
+
}
|
|
398
|
+
/** Record the ribbon into `frame` (nothing when it has fewer than two points). */
|
|
399
|
+
draw(frame) {
|
|
400
|
+
if (this.written < 4)
|
|
401
|
+
return;
|
|
402
|
+
frame.mesh(this.mesh, this.material, this.transform, this.instance);
|
|
403
|
+
}
|
|
404
|
+
destroy() {
|
|
405
|
+
this.mesh.destroy();
|
|
406
|
+
if (this.ownsMaterial)
|
|
407
|
+
this.material.destroy();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* A ribbon trail: a strip that follows a moving point, with width, colour and alpha over age,
|
|
412
|
+
* camera-facing or fixed-axis, in 2D or world space.
|
|
413
|
+
*
|
|
414
|
+
* ```ts
|
|
415
|
+
* const trail = new Trail(renderer, { space: 'world', width: 0.15, lifetime: 0.4 });
|
|
416
|
+
* trail.push(tip.x, tip.y, tip.z); // every update, wherever the point is
|
|
417
|
+
* trail.update(dt, camera); // ages points and rebuilds the ribbon
|
|
418
|
+
* trail.draw(frame); // inside the scene's render
|
|
419
|
+
* ```
|
|
420
|
+
*
|
|
421
|
+
* Geometry is built on the CPU into one preallocated array (two vertices per point, the
|
|
422
|
+
* oldest first, over a static index buffer) and uploaded through `Mesh.update` each frame;
|
|
423
|
+
* nothing allocates after construction.
|
|
424
|
+
*/
|
|
425
|
+
export class Trail extends RibbonBase {
|
|
426
|
+
maxPoints;
|
|
427
|
+
ring;
|
|
428
|
+
verts;
|
|
429
|
+
constructor(renderer, opts = {}) {
|
|
430
|
+
const cap = Math.max(2, Math.floor(opts.maxPoints ?? 64));
|
|
431
|
+
const vertices = (cap + 1) * 2;
|
|
432
|
+
super(renderer, opts, vertices, ribbonIndices(cap, vertices), opts.label ?? 'trail');
|
|
433
|
+
this.maxPoints = cap;
|
|
434
|
+
this.ring = new Ring(cap);
|
|
435
|
+
this.verts = new Float32Array(vertices * VF);
|
|
436
|
+
}
|
|
437
|
+
/** Points the ribbon currently has (stored points plus the tip when it sits apart). */
|
|
438
|
+
get count() {
|
|
439
|
+
return this.ring.count();
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Point `i` (0 = newest) into `out` as `x, y, z`. Out of range leaves `out` untouched and
|
|
443
|
+
* returns false.
|
|
444
|
+
*/
|
|
445
|
+
pointAt(i, out) {
|
|
446
|
+
if (i < 0 || i >= this.ring.count())
|
|
447
|
+
return false;
|
|
448
|
+
this.ring.read(i, this.time, cur);
|
|
449
|
+
out.x = cur[0];
|
|
450
|
+
out.y = cur[1];
|
|
451
|
+
out.z = cur[2];
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Move the trail's tip to a point. A point farther than `minDistance` from the newest stored
|
|
456
|
+
* one is stored (true); a closer one only moves the tip (false). When `maxPoints` are stored
|
|
457
|
+
* the oldest drops.
|
|
458
|
+
*/
|
|
459
|
+
push(x, y, z = 0) {
|
|
460
|
+
return this.ring.push(x, y, z, this.time, this.minDistance);
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Advance time, drop points older than `lifetime` and rebuild the ribbon. `camera` turns a
|
|
464
|
+
* `facing: 'camera'` ribbon (needed in world space; in 2D the ribbon lies flat without it).
|
|
465
|
+
*/
|
|
466
|
+
update(dt, camera) {
|
|
467
|
+
this.time += dt;
|
|
468
|
+
const ring = this.ring;
|
|
469
|
+
ring.expire(this.time, this.lifetime);
|
|
470
|
+
const n = writeRibbon(ring, this, this.time, camera ?? null, this.verts, 0);
|
|
471
|
+
this.upload(this.verts, n, n >= 4 ? (n / 2 - 1) * 6 : 0);
|
|
472
|
+
}
|
|
473
|
+
/** Forget every point; the ribbon is empty until the next `push` and `update`. */
|
|
474
|
+
clear() {
|
|
475
|
+
this.ring.clear();
|
|
476
|
+
this.upload(this.verts, 0, 0);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Many ribbons of one style in one mesh and one draw (projectiles, a flock). Each ribbon is
|
|
481
|
+
* addressed by its index; `update` rebuilds the shared vertex and index arrays in place.
|
|
482
|
+
*/
|
|
483
|
+
export class TrailBatch extends RibbonBase {
|
|
484
|
+
/** Ribbons in the batch. */
|
|
485
|
+
size;
|
|
486
|
+
maxPoints;
|
|
487
|
+
rings;
|
|
488
|
+
verts;
|
|
489
|
+
indices;
|
|
490
|
+
indexUpdate;
|
|
491
|
+
constructor(renderer, size, opts = {}) {
|
|
492
|
+
const cap = Math.max(2, Math.floor(opts.maxPoints ?? 64));
|
|
493
|
+
const count = Math.max(1, Math.floor(size));
|
|
494
|
+
const vertices = (cap + 1) * 2 * count;
|
|
495
|
+
super(renderer, opts, vertices, ribbonIndices(cap * count, vertices), opts.label ?? 'trails');
|
|
496
|
+
this.size = count;
|
|
497
|
+
this.maxPoints = cap;
|
|
498
|
+
this.rings = [];
|
|
499
|
+
for (let i = 0; i < count; i++)
|
|
500
|
+
this.rings.push(new Ring(cap));
|
|
501
|
+
this.verts = new Float32Array(vertices * VF);
|
|
502
|
+
this.indices =
|
|
503
|
+
vertices > 0xffff ? new Uint32Array(cap * count * 6) : new Uint16Array(cap * count * 6);
|
|
504
|
+
this.indexUpdate = { indices: this.indices, indexCount: 0 };
|
|
505
|
+
}
|
|
506
|
+
/** Points ribbon `i` currently has. */
|
|
507
|
+
count(i) {
|
|
508
|
+
return this.rings[i]?.count() ?? 0;
|
|
509
|
+
}
|
|
510
|
+
/** `Trail.pointAt` for ribbon `i`: point `j` (0 = newest) into `out`. */
|
|
511
|
+
pointAt(i, j, out) {
|
|
512
|
+
const r = this.rings[i];
|
|
513
|
+
if (!r || j < 0 || j >= r.count())
|
|
514
|
+
return false;
|
|
515
|
+
r.read(j, this.time, cur);
|
|
516
|
+
out.x = cur[0];
|
|
517
|
+
out.y = cur[1];
|
|
518
|
+
out.z = cur[2];
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
/** `Trail.push` for ribbon `i`. */
|
|
522
|
+
push(i, x, y, z = 0) {
|
|
523
|
+
const r = this.rings[i];
|
|
524
|
+
return r ? r.push(x, y, z, this.time, this.minDistance) : false;
|
|
525
|
+
}
|
|
526
|
+
/** `Trail.update` for every ribbon, packed into one mesh. */
|
|
527
|
+
update(dt, camera) {
|
|
528
|
+
this.time += dt;
|
|
529
|
+
const cam = camera ?? null;
|
|
530
|
+
let vb = 0;
|
|
531
|
+
let ib = 0;
|
|
532
|
+
for (const ring of this.rings) {
|
|
533
|
+
ring.expire(this.time, this.lifetime);
|
|
534
|
+
const n = writeRibbon(ring, this, this.time, cam, this.verts, vb * VF);
|
|
535
|
+
if (n < 4)
|
|
536
|
+
continue;
|
|
537
|
+
ib = writeQuads(this.indices, ib, vb, n / 2 - 1);
|
|
538
|
+
vb += n;
|
|
539
|
+
}
|
|
540
|
+
const u = this.indexUpdate;
|
|
541
|
+
u.indexCount = ib;
|
|
542
|
+
this.mesh.update(u);
|
|
543
|
+
this.upload(this.verts, vb, ib);
|
|
544
|
+
}
|
|
545
|
+
/** Forget ribbon `i`'s points, or every ribbon's without an index. */
|
|
546
|
+
clear(i) {
|
|
547
|
+
if (i === undefined)
|
|
548
|
+
for (const r of this.rings)
|
|
549
|
+
r.clear();
|
|
550
|
+
else
|
|
551
|
+
this.rings[i]?.clear();
|
|
552
|
+
if (i === undefined)
|
|
553
|
+
this.upload(this.verts, 0, 0);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Wave layers the params block carries (`WaterOptions.waves` beyond this are ignored). */
|
|
2
|
+
export declare const WATER_MAX_WAVES = 4;
|
|
3
|
+
/**
|
|
4
|
+
* The water shader: a plane in the engine's 3D vertex layout, no instance, group 1 = the
|
|
5
|
+
* water's params block and its copy of the scene depth.
|
|
6
|
+
*
|
|
7
|
+
* Waves. Each layer is an analytic field with a closed-form gradient (`water_wave`):
|
|
8
|
+
* `p = (x, z) * scale + dir * (t * speed)`, `a = p.x + 0.6 sin(1.3 p.y)`,
|
|
9
|
+
* `b = 0.8 p.y + 0.5 sin(0.9 p.x)`, value `sin(a) cos(b)` in -1..1, and its derivatives by the
|
|
10
|
+
* chain rule. The height is `level + displace * Σ amplitude_i * value_i` (the vertex shader
|
|
11
|
+
* offsets y by it; `waterHeight` in `water.ts` is the same sum in TypeScript), and the normal
|
|
12
|
+
* is `normalize(-slope.x, 1, -slope.z)` with `slope = Σ amplitude_i * scale_i * grad_i`, so
|
|
13
|
+
* `amplitude` is the normal strength whether or not vertices move.
|
|
14
|
+
*
|
|
15
|
+
* Shading, all linear: the view ray's Schlick Fresnel (f0 0.02) times `fresnel` lerps the
|
|
16
|
+
* refraction colour (`shallow` → `deep` by the linear depth below the surface over
|
|
17
|
+
* `depth_fade`, from the depth copy) towards the reflection colour (a sky gradient between
|
|
18
|
+
* `lights.fog.rgb`, or a pale haze without fog, at the horizon and a bluer zenith, darkened at
|
|
19
|
+
* night like `Sky`); the sun adds a GGX lobe of `roughness` (`engine_d_ggx`,
|
|
20
|
+
* `engine_v_smith_ggx`, `engine_f_schlick` from `WGSL_PBR`), which also goes to the emissive
|
|
21
|
+
* target so bloom picks it up; foam (`foam.w` > 0) mixes `foam.rgb` in where the depth below the
|
|
22
|
+
* surface is under `foam.w`, through a two-octave noise mask; the alpha ramps up from zero at
|
|
23
|
+
* the shoreline over a quarter of `depth_fade` to `opacity`, then `engine_fog`.
|
|
24
|
+
*
|
|
25
|
+
* Depth copy. `misc.z` says whether `scene_depth` holds this frame's copy. Its texel is turned
|
|
26
|
+
* into view-space z (`view_z_of`) and compared with the fragment's own: the difference is the
|
|
27
|
+
* water depth along the ray. A texel within a sliver of the fragment's own depth is the water
|
|
28
|
+
* surface itself (the copy was taken after a frame that drew this water into the same depth
|
|
29
|
+
* buffer) and counts as no information: fully deep, no foam. Without a copy the surface is
|
|
30
|
+
* deep everywhere, foam off.
|
|
31
|
+
*/
|
|
32
|
+
export declare const WATER_WGSL: string;
|
|
33
|
+
/** Copies a depth texture into the water's own depth32float copy (one fullscreen triangle). */
|
|
34
|
+
export declare const WATER_DEPTH_COPY_WGSL = "\n@group(0) @binding(0) var src: texture_depth_2d;\n@vertex fn vs(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {\n let p = vec2f(f32((i << 1u) & 2u), f32(i & 2u));\n return vec4f(p * 2.0 - 1.0, 0.0, 1.0);\n}\n@fragment fn fs(@builtin(position) pos: vec4f) -> @builtin(frag_depth) f32 {\n return textureLoad(src, vec2i(pos.xy), 0);\n}\n";
|