@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,165 @@
|
|
|
1
|
+
import { type BindingDesc, BindingSet } from './bindings.js';
|
|
2
|
+
import { type RenderBlendMode } from './blend.js';
|
|
3
|
+
import { type VertexLayout } from './mesh.js';
|
|
4
|
+
import type { SceneTarget } from './scene-target.js';
|
|
5
|
+
import type { SamplerKind, TextureLike } from './texture.js';
|
|
6
|
+
/**
|
|
7
|
+
* Per-instance data, shared by sprites and meshes: 7 × vec4f = 28 floats = 112 bytes.
|
|
8
|
+
*
|
|
9
|
+
* | floats | WGSL (`VertexIn`) | content |
|
|
10
|
+
* | --- | --- | --- |
|
|
11
|
+
* | 0..3 | `m0` @location(3) | world matrix row 0 (3×4 row-major) |
|
|
12
|
+
* | 4..7 | `m1` @location(4) | world matrix row 1 |
|
|
13
|
+
* | 8..11 | `m2` @location(5) | world matrix row 2 |
|
|
14
|
+
* | 12..15 | `uvRect` @location(6) | u0, v0, u1, v1 |
|
|
15
|
+
* | 16..19 | `tint` @location(7) | linear RGBA |
|
|
16
|
+
* | 20..23 | `params` @location(8) | free vec4 (`params.w` is the skin palette slot of a skinned draw, `SKIN_PARAM`) |
|
|
17
|
+
* | 24..27 | `misc` @location(9) | emissive, flags (bit 0 = no shadow, bits 1..23 = layers), size.x, size.y |
|
|
18
|
+
*
|
|
19
|
+
* `size` is `w, h` for `DrawParams` draws and `scale.x, scale.y` for `Transform` draws
|
|
20
|
+
* (`VSOut.size`).
|
|
21
|
+
*/
|
|
22
|
+
export declare const INSTANCE_FLOATS = 28;
|
|
23
|
+
export declare const INSTANCE_STRIDE: number;
|
|
24
|
+
/**
|
|
25
|
+
* Colour target states of a pipeline drawing into the scene pass of a target with aux key
|
|
26
|
+
* `aux` (`SceneTarget.auxKey`, ws/render-10): `formats` (colour, emissive) with `blend`, then
|
|
27
|
+
* the aux attachments in pass order (rough-metal, velocity), unblended and masked off
|
|
28
|
+
* (`writeMask: 0`) unless `writesAux`. The one place the list is built: materials and
|
|
29
|
+
* `renderer.sceneTargets` both call it, so a pipeline's count always matches the pass's.
|
|
30
|
+
*/
|
|
31
|
+
export declare function sceneColorTargets(formats: readonly GPUTextureFormat[], aux: number, blend: GPUBlendState | undefined, writesAux: boolean): GPUColorTargetState[];
|
|
32
|
+
/** Float offsets of each field inside one instance (see `INSTANCE_FLOATS`). */
|
|
33
|
+
export declare const INSTANCE_OFFSET: {
|
|
34
|
+
readonly matrix: 0;
|
|
35
|
+
readonly uvRect: 12;
|
|
36
|
+
readonly tint: 16;
|
|
37
|
+
readonly params: 20;
|
|
38
|
+
readonly emissive: 24;
|
|
39
|
+
readonly flags: 25;
|
|
40
|
+
readonly size: 26;
|
|
41
|
+
};
|
|
42
|
+
export declare const INSTANCE_BUFFER_LAYOUT: GPUVertexBufferLayout;
|
|
43
|
+
/** Depth attachment format of the scene pass when the camera asks for depth. */
|
|
44
|
+
export declare const DEPTH_FORMAT: GPUTextureFormat;
|
|
45
|
+
/**
|
|
46
|
+
* Depth state a pipeline is built for: 0 = no depth attachment (the 2D path), 1 = depth test
|
|
47
|
+
* without writes (blended draws), 2 = depth test and write (opaque draws).
|
|
48
|
+
*/
|
|
49
|
+
export type DepthMode = 0 | 1 | 2;
|
|
50
|
+
export interface MaterialDesc extends BindingDesc {
|
|
51
|
+
/** Pipeline / bind group label. Default: `name`, else `'material'`. */
|
|
52
|
+
label?: string;
|
|
53
|
+
/** A name for the material (a file's material name); `Material.name`. Default: `label`. */
|
|
54
|
+
name?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Depth-test the draws (default true). False draws over whatever the scene holds at its
|
|
57
|
+
* `order`, never writing depth: a world-space panel or marker inside geometry. Only the depth
|
|
58
|
+
* compare changes; the draw still sorts with its order and group.
|
|
59
|
+
*/
|
|
60
|
+
depthTest?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The material writes the aux outputs of a target that has them (`SceneTargetDesc.aux`)
|
|
63
|
+
* through `engine_write_aux` (the standard material does). Default false: the aux
|
|
64
|
+
* attachments are masked off for this material's draws and its shader text never changes.
|
|
65
|
+
*/
|
|
66
|
+
aux?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* WGSL appended after the material prelude. Must define
|
|
69
|
+
* `@fragment fn fs_main(in: VSOut) -> FragOut` (or the entry named by `fragmentEntry`).
|
|
70
|
+
* May declare `@group(1)` bindings following the convention in `bindings.ts`, and may define
|
|
71
|
+
* its own vertex entry (set `vertexEntry`), typically wrapping `engine_vertex(v)`.
|
|
72
|
+
*/
|
|
73
|
+
wgsl: string;
|
|
74
|
+
blend?: RenderBlendMode;
|
|
75
|
+
vertexEntry?: string;
|
|
76
|
+
fragmentEntry?: string;
|
|
77
|
+
/**
|
|
78
|
+
* A fragment entry for the sun's shadow pass (ws/render-5): `@fragment fn name(in: VSOut)`,
|
|
79
|
+
* no outputs, that `discard`s what the material's own fragment discards (a dissolve, an
|
|
80
|
+
* alpha cutout), so the shadow has the same holes. The shadow pipeline is then built from
|
|
81
|
+
* this material's module with its group 1 bound. Default: none (the shadow pass is
|
|
82
|
+
* depth-only, every caster casts a full shadow).
|
|
83
|
+
*/
|
|
84
|
+
shadowFragmentEntry?: string;
|
|
85
|
+
sampler?: SamplerKind;
|
|
86
|
+
/**
|
|
87
|
+
* Allow a separate uniform block per draw: pass `DrawParams.uniforms` to `frame.sprite` /
|
|
88
|
+
* `frame.mesh` and that draw reads its own copy of `@group(1) @binding(0)`. Draws without
|
|
89
|
+
* `uniforms` read the shared block from `setUniforms`. Needs `uniformBytes`. Draws with
|
|
90
|
+
* their own uniforms don't merge into one instanced call. WGSL is unchanged.
|
|
91
|
+
*/
|
|
92
|
+
perDrawUniforms?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A material = WGSL module + pipeline + its own bind group (group 1). Created through
|
|
96
|
+
* `renderer.createMaterial()`. Pipelines are built lazily, on first use per (vertex layout,
|
|
97
|
+
* depth mode, target aux set, previous-matrix lane) and cached.
|
|
98
|
+
*/
|
|
99
|
+
export declare class Material {
|
|
100
|
+
readonly label: string;
|
|
101
|
+
/** `MaterialDesc.name` (a file's material name), else the label. */
|
|
102
|
+
readonly name: string;
|
|
103
|
+
/** `MaterialDesc.depthTest`: false draws over the scene on its layer. */
|
|
104
|
+
readonly depthTest: boolean;
|
|
105
|
+
readonly blend: RenderBlendMode;
|
|
106
|
+
readonly bindings: BindingSet | null;
|
|
107
|
+
/** True when the material has a `shadowFragmentEntry` (its own shadow pipelines). */
|
|
108
|
+
readonly shadowFragment: boolean;
|
|
109
|
+
/** `MaterialDesc.aux`: the material writes a target's aux outputs (velocity among them). */
|
|
110
|
+
readonly aux: boolean;
|
|
111
|
+
private readonly device;
|
|
112
|
+
private readonly desc;
|
|
113
|
+
private readonly pipelineLayout;
|
|
114
|
+
private readonly targetFormats;
|
|
115
|
+
private readonly blendState;
|
|
116
|
+
/** Colour target states per aux key (0 none, 1 rough-metal, 2 velocity, 3 both). */
|
|
117
|
+
private readonly targetsByAux;
|
|
118
|
+
/** Shader modules per vertex layout and prelude variant (`moduleFor`: aux key + 4 × lane). */
|
|
119
|
+
private readonly modules;
|
|
120
|
+
/** Pipelines per vertex layout, indexed by variant (see `VARIANTS`). */
|
|
121
|
+
private readonly pipelines;
|
|
122
|
+
/** Shadow pipelines per vertex layout (`shadowFragmentEntry`). */
|
|
123
|
+
private readonly shadowPipelines;
|
|
124
|
+
private readonly scratchVariant;
|
|
125
|
+
constructor(device: GPUDevice, desc: MaterialDesc, globalsLayout: GPUBindGroupLayout, targetFormats: readonly GPUTextureFormat[], sampler: GPUSampler, defaultView: GPUTextureView);
|
|
126
|
+
/**
|
|
127
|
+
* The 2D pipeline (`VERTEX_LAYOUT_2D`, no depth), built on the first 2D draw (ws/render-4:
|
|
128
|
+
* a material only ever drawn on 3D meshes compiles no 2D module).
|
|
129
|
+
*/
|
|
130
|
+
get pipeline(): GPURenderPipeline;
|
|
131
|
+
/**
|
|
132
|
+
* The pipeline for meshes in `layout` under depth mode `depth` into `target` (its aux
|
|
133
|
+
* attachments, `SceneTargetDesc.aux`; none without one), with `prevLane` a third vertex
|
|
134
|
+
* buffer of previous instance matrices (an `InstanceList` with `velocity`). Keyed by
|
|
135
|
+
* material, layout, depth state, aux set and lane; built on first use and cached; the 2D,
|
|
136
|
+
* no-depth one is `pipeline`. No allocation once built.
|
|
137
|
+
*/
|
|
138
|
+
pipelineFor(layout: VertexLayout, depth: DepthMode, target?: SceneTarget | null, prevLane?: boolean): GPURenderPipeline;
|
|
139
|
+
/**
|
|
140
|
+
* The shader module for `layout` and a target with aux key `aux` (`lane`: the previous-matrix
|
|
141
|
+
* lane), built on first use: a material that does not write aux outputs compiles the plain
|
|
142
|
+
* module for every target.
|
|
143
|
+
*/
|
|
144
|
+
private moduleFor;
|
|
145
|
+
/**
|
|
146
|
+
* The sun's shadow pipeline for meshes in `layout` (`shadowFragmentEntry` set; throws
|
|
147
|
+
* otherwise): the plain module's vertex entry and the shadow fragment entry, no colour
|
|
148
|
+
* targets, depth write into `format` (the renderer's shadow map) with `less`, this material's
|
|
149
|
+
* pipeline layout (group 1 bound by the shadow pass). Built on first use and cached.
|
|
150
|
+
*/
|
|
151
|
+
shadowPipelineFor(layout: VertexLayout, format: GPUTextureFormat): GPURenderPipeline;
|
|
152
|
+
/**
|
|
153
|
+
* Colour target states for a target with aux key `aux`: the scene formats with this
|
|
154
|
+
* material's blend, then the aux attachments (`rg8unorm` rough-metal, `rg16float`
|
|
155
|
+
* velocity), unblended, masked off unless the material declares `aux`.
|
|
156
|
+
*/
|
|
157
|
+
private targetsFor;
|
|
158
|
+
/** Write the material's uniform block (`@group(1) @binding(0)`). */
|
|
159
|
+
setUniforms(data: BufferSource, byteOffset?: number): void;
|
|
160
|
+
/** Bind a texture to slot `i` (`@group(1) @binding(2 + i)`). Rebuilds the bind group lazily. */
|
|
161
|
+
setTexture(slot: number, tex: TextureLike | GPUTextureView): void;
|
|
162
|
+
destroy(): void;
|
|
163
|
+
}
|
|
164
|
+
/** Built-in textured sprite: `texture * vertexColor * tint`; emissive = colour × emissive. */
|
|
165
|
+
export declare const SPRITE_WGSL = "\n@group(1) @binding(1) var spriteSampler: sampler;\n@group(1) @binding(2) var spriteTex: texture_2d<f32>;\n\n@fragment fn fs_main(in: VSOut) -> FragOut {\n let c = textureSample(spriteTex, spriteSampler, in.uv) * in.color;\n var o: FragOut;\n o.color = c;\n o.emissive = vec4f(c.rgb * in.emissive, c.a);\n return o;\n}\n";
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { BindingSet, hasBindings } from './bindings.js';
|
|
2
|
+
import { blendState } from './blend.js';
|
|
3
|
+
import { VERTEX_LAYOUT_2D } from './mesh.js';
|
|
4
|
+
import { createShaderModule, materialPrelude, PLAIN_VARIANT, prevLaneBufferLayout, } from './wgsl.js';
|
|
5
|
+
/**
|
|
6
|
+
* Per-instance data, shared by sprites and meshes: 7 × vec4f = 28 floats = 112 bytes.
|
|
7
|
+
*
|
|
8
|
+
* | floats | WGSL (`VertexIn`) | content |
|
|
9
|
+
* | --- | --- | --- |
|
|
10
|
+
* | 0..3 | `m0` @location(3) | world matrix row 0 (3×4 row-major) |
|
|
11
|
+
* | 4..7 | `m1` @location(4) | world matrix row 1 |
|
|
12
|
+
* | 8..11 | `m2` @location(5) | world matrix row 2 |
|
|
13
|
+
* | 12..15 | `uvRect` @location(6) | u0, v0, u1, v1 |
|
|
14
|
+
* | 16..19 | `tint` @location(7) | linear RGBA |
|
|
15
|
+
* | 20..23 | `params` @location(8) | free vec4 (`params.w` is the skin palette slot of a skinned draw, `SKIN_PARAM`) |
|
|
16
|
+
* | 24..27 | `misc` @location(9) | emissive, flags (bit 0 = no shadow, bits 1..23 = layers), size.x, size.y |
|
|
17
|
+
*
|
|
18
|
+
* `size` is `w, h` for `DrawParams` draws and `scale.x, scale.y` for `Transform` draws
|
|
19
|
+
* (`VSOut.size`).
|
|
20
|
+
*/
|
|
21
|
+
export const INSTANCE_FLOATS = 28;
|
|
22
|
+
export const INSTANCE_STRIDE = INSTANCE_FLOATS * 4;
|
|
23
|
+
/**
|
|
24
|
+
* Colour target states of a pipeline drawing into the scene pass of a target with aux key
|
|
25
|
+
* `aux` (`SceneTarget.auxKey`, ws/render-10): `formats` (colour, emissive) with `blend`, then
|
|
26
|
+
* the aux attachments in pass order (rough-metal, velocity), unblended and masked off
|
|
27
|
+
* (`writeMask: 0`) unless `writesAux`. The one place the list is built: materials and
|
|
28
|
+
* `renderer.sceneTargets` both call it, so a pipeline's count always matches the pass's.
|
|
29
|
+
*/
|
|
30
|
+
export function sceneColorTargets(formats, aux, blend, writesAux) {
|
|
31
|
+
const targets = formats.map((format) => ({ format, blend }));
|
|
32
|
+
const writeMask = writesAux ? 0xf : 0;
|
|
33
|
+
if (aux & 1)
|
|
34
|
+
targets.push({ format: 'rg8unorm', writeMask });
|
|
35
|
+
if (aux & 2)
|
|
36
|
+
targets.push({ format: 'rg16float', writeMask });
|
|
37
|
+
return targets;
|
|
38
|
+
}
|
|
39
|
+
/** Float offsets of each field inside one instance (see `INSTANCE_FLOATS`). */
|
|
40
|
+
export const INSTANCE_OFFSET = {
|
|
41
|
+
matrix: 0,
|
|
42
|
+
uvRect: 12,
|
|
43
|
+
tint: 16,
|
|
44
|
+
params: 20,
|
|
45
|
+
emissive: 24,
|
|
46
|
+
flags: 25,
|
|
47
|
+
size: 26,
|
|
48
|
+
};
|
|
49
|
+
export const INSTANCE_BUFFER_LAYOUT = {
|
|
50
|
+
arrayStride: INSTANCE_STRIDE,
|
|
51
|
+
stepMode: 'instance',
|
|
52
|
+
attributes: [
|
|
53
|
+
{ shaderLocation: 3, offset: 0, format: 'float32x4' }, // m0
|
|
54
|
+
{ shaderLocation: 4, offset: 16, format: 'float32x4' }, // m1
|
|
55
|
+
{ shaderLocation: 5, offset: 32, format: 'float32x4' }, // m2
|
|
56
|
+
{ shaderLocation: 6, offset: 48, format: 'float32x4' }, // uvRect
|
|
57
|
+
{ shaderLocation: 7, offset: 64, format: 'float32x4' }, // tint
|
|
58
|
+
{ shaderLocation: 8, offset: 80, format: 'float32x4' }, // params
|
|
59
|
+
{ shaderLocation: 9, offset: 96, format: 'float32x4' }, // misc: emissive, flags, size.xy
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
/** Depth attachment format of the scene pass when the camera asks for depth. */
|
|
63
|
+
export const DEPTH_FORMAT = 'depth24plus';
|
|
64
|
+
/** Index of a pipeline variant: depth mode × aux key × previous-matrix lane. */
|
|
65
|
+
const VARIANTS = 3 * 4 * 2;
|
|
66
|
+
/**
|
|
67
|
+
* A material = WGSL module + pipeline + its own bind group (group 1). Created through
|
|
68
|
+
* `renderer.createMaterial()`. Pipelines are built lazily, on first use per (vertex layout,
|
|
69
|
+
* depth mode, target aux set, previous-matrix lane) and cached.
|
|
70
|
+
*/
|
|
71
|
+
export class Material {
|
|
72
|
+
label;
|
|
73
|
+
/** `MaterialDesc.name` (a file's material name), else the label. */
|
|
74
|
+
name;
|
|
75
|
+
/** `MaterialDesc.depthTest`: false draws over the scene on its layer. */
|
|
76
|
+
depthTest;
|
|
77
|
+
blend;
|
|
78
|
+
bindings;
|
|
79
|
+
/** True when the material has a `shadowFragmentEntry` (its own shadow pipelines). */
|
|
80
|
+
shadowFragment;
|
|
81
|
+
/** `MaterialDesc.aux`: the material writes a target's aux outputs (velocity among them). */
|
|
82
|
+
aux;
|
|
83
|
+
device;
|
|
84
|
+
desc;
|
|
85
|
+
pipelineLayout;
|
|
86
|
+
targetFormats;
|
|
87
|
+
blendState;
|
|
88
|
+
/** Colour target states per aux key (0 none, 1 rough-metal, 2 velocity, 3 both). */
|
|
89
|
+
targetsByAux = [
|
|
90
|
+
undefined,
|
|
91
|
+
undefined,
|
|
92
|
+
undefined,
|
|
93
|
+
undefined,
|
|
94
|
+
];
|
|
95
|
+
/** Shader modules per vertex layout and prelude variant (`moduleFor`: aux key + 4 × lane). */
|
|
96
|
+
modules = new Map();
|
|
97
|
+
/** Pipelines per vertex layout, indexed by variant (see `VARIANTS`). */
|
|
98
|
+
pipelines = new Map();
|
|
99
|
+
/** Shadow pipelines per vertex layout (`shadowFragmentEntry`). */
|
|
100
|
+
shadowPipelines = new Map();
|
|
101
|
+
scratchVariant = {
|
|
102
|
+
roughMetal: false,
|
|
103
|
+
velocity: false,
|
|
104
|
+
prevLane: false,
|
|
105
|
+
};
|
|
106
|
+
constructor(device, desc, globalsLayout, targetFormats, sampler, defaultView) {
|
|
107
|
+
this.device = device;
|
|
108
|
+
this.desc = desc;
|
|
109
|
+
this.label = desc.label ?? desc.name ?? 'material';
|
|
110
|
+
this.name = desc.name ?? this.label;
|
|
111
|
+
this.depthTest = desc.depthTest !== false;
|
|
112
|
+
this.blend = desc.blend ?? 'alpha';
|
|
113
|
+
this.shadowFragment = desc.shadowFragmentEntry !== undefined;
|
|
114
|
+
this.aux = desc.aux === true;
|
|
115
|
+
this.bindings = hasBindings(desc)
|
|
116
|
+
? new BindingSet(device, desc, sampler, defaultView, `material:${this.label}`, {
|
|
117
|
+
perDraw: desc.perDrawUniforms,
|
|
118
|
+
})
|
|
119
|
+
: null;
|
|
120
|
+
if (desc.perDrawUniforms && !this.bindings) {
|
|
121
|
+
throw new Error(`material ${this.label}: perDrawUniforms needs uniformBytes`);
|
|
122
|
+
}
|
|
123
|
+
const layouts = this.bindings ? [globalsLayout, this.bindings.layout] : [globalsLayout];
|
|
124
|
+
this.pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: layouts });
|
|
125
|
+
this.blendState = blendState(this.blend);
|
|
126
|
+
this.targetFormats = targetFormats;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The 2D pipeline (`VERTEX_LAYOUT_2D`, no depth), built on the first 2D draw (ws/render-4:
|
|
130
|
+
* a material only ever drawn on 3D meshes compiles no 2D module).
|
|
131
|
+
*/
|
|
132
|
+
get pipeline() {
|
|
133
|
+
return this.pipelineFor(VERTEX_LAYOUT_2D, 0);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The pipeline for meshes in `layout` under depth mode `depth` into `target` (its aux
|
|
137
|
+
* attachments, `SceneTargetDesc.aux`; none without one), with `prevLane` a third vertex
|
|
138
|
+
* buffer of previous instance matrices (an `InstanceList` with `velocity`). Keyed by
|
|
139
|
+
* material, layout, depth state, aux set and lane; built on first use and cached; the 2D,
|
|
140
|
+
* no-depth one is `pipeline`. No allocation once built.
|
|
141
|
+
*/
|
|
142
|
+
pipelineFor(layout, depth, target, prevLane = false) {
|
|
143
|
+
const aux = target ? target.auxKey : 0;
|
|
144
|
+
const lane = prevLane && aux >= 2 && this.desc.aux === true;
|
|
145
|
+
const key = depth + 3 * aux + 12 * (lane ? 1 : 0);
|
|
146
|
+
let byKey = this.pipelines.get(layout);
|
|
147
|
+
const hit = byKey?.[key];
|
|
148
|
+
if (hit)
|
|
149
|
+
return hit;
|
|
150
|
+
if (!byKey) {
|
|
151
|
+
byKey = new Array(VARIANTS).fill(undefined);
|
|
152
|
+
this.pipelines.set(layout, byKey);
|
|
153
|
+
}
|
|
154
|
+
const desc = this.desc;
|
|
155
|
+
const module = this.moduleFor(layout, aux, lane);
|
|
156
|
+
const is2d = layout === VERTEX_LAYOUT_2D && depth === 0 && aux === 0;
|
|
157
|
+
const buffers = lane
|
|
158
|
+
? [layout.buffer, INSTANCE_BUFFER_LAYOUT, prevLaneBufferLayout(layout)]
|
|
159
|
+
: [layout.buffer, INSTANCE_BUFFER_LAYOUT];
|
|
160
|
+
const pipeline = this.device.createRenderPipeline({
|
|
161
|
+
label: is2d
|
|
162
|
+
? `material:${this.label}`
|
|
163
|
+
: `material:${this.label}:${layout.name}:d${depth}${aux ? `:aux${aux}` : ''}${lane ? ':p' : ''}`,
|
|
164
|
+
layout: this.pipelineLayout,
|
|
165
|
+
vertex: {
|
|
166
|
+
module,
|
|
167
|
+
entryPoint: desc.vertexEntry ?? 'vs_main',
|
|
168
|
+
buffers,
|
|
169
|
+
},
|
|
170
|
+
fragment: {
|
|
171
|
+
module,
|
|
172
|
+
entryPoint: desc.fragmentEntry ?? 'fs_main',
|
|
173
|
+
targets: this.targetsFor(aux),
|
|
174
|
+
},
|
|
175
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
176
|
+
...(depth === 0
|
|
177
|
+
? {}
|
|
178
|
+
: {
|
|
179
|
+
depthStencil: {
|
|
180
|
+
format: DEPTH_FORMAT,
|
|
181
|
+
depthWriteEnabled: depth === 2 && this.depthTest,
|
|
182
|
+
depthCompare: (this.depthTest ? 'less-equal' : 'always'),
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
});
|
|
186
|
+
byKey[key] = pipeline;
|
|
187
|
+
return pipeline;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The shader module for `layout` and a target with aux key `aux` (`lane`: the previous-matrix
|
|
191
|
+
* lane), built on first use: a material that does not write aux outputs compiles the plain
|
|
192
|
+
* module for every target.
|
|
193
|
+
*/
|
|
194
|
+
moduleFor(layout, aux, lane) {
|
|
195
|
+
const desc = this.desc;
|
|
196
|
+
const moduleKey = desc.aux ? aux + 4 * (lane ? 1 : 0) : 0;
|
|
197
|
+
let modules = this.modules.get(layout);
|
|
198
|
+
if (!modules) {
|
|
199
|
+
modules = new Array(8).fill(undefined);
|
|
200
|
+
this.modules.set(layout, modules);
|
|
201
|
+
}
|
|
202
|
+
let module = modules[moduleKey];
|
|
203
|
+
if (!module) {
|
|
204
|
+
let variant = PLAIN_VARIANT;
|
|
205
|
+
if (moduleKey !== 0) {
|
|
206
|
+
const v = this.scratchVariant;
|
|
207
|
+
v.roughMetal = (aux & 1) !== 0;
|
|
208
|
+
v.velocity = (aux & 2) !== 0;
|
|
209
|
+
v.prevLane = lane;
|
|
210
|
+
variant = v;
|
|
211
|
+
}
|
|
212
|
+
const code = `${materialPrelude(layout, variant)}\n// ---- material: ${this.label} ----\n${desc.wgsl}`;
|
|
213
|
+
const suffix = (layout === VERTEX_LAYOUT_2D ? '' : `:${layout.name}`) +
|
|
214
|
+
(moduleKey === 0 ? '' : `:aux${aux}${lane ? 'p' : ''}`);
|
|
215
|
+
module = createShaderModule(this.device, code, `material:${this.label}${suffix}`);
|
|
216
|
+
modules[moduleKey] = module;
|
|
217
|
+
}
|
|
218
|
+
return module;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* The sun's shadow pipeline for meshes in `layout` (`shadowFragmentEntry` set; throws
|
|
222
|
+
* otherwise): the plain module's vertex entry and the shadow fragment entry, no colour
|
|
223
|
+
* targets, depth write into `format` (the renderer's shadow map) with `less`, this material's
|
|
224
|
+
* pipeline layout (group 1 bound by the shadow pass). Built on first use and cached.
|
|
225
|
+
*/
|
|
226
|
+
shadowPipelineFor(layout, format) {
|
|
227
|
+
const hit = this.shadowPipelines.get(layout);
|
|
228
|
+
if (hit)
|
|
229
|
+
return hit;
|
|
230
|
+
const desc = this.desc;
|
|
231
|
+
const entry = desc.shadowFragmentEntry;
|
|
232
|
+
if (entry === undefined) {
|
|
233
|
+
throw new Error(`material ${this.label}: no shadowFragmentEntry`);
|
|
234
|
+
}
|
|
235
|
+
const module = this.moduleFor(layout, 0, false);
|
|
236
|
+
const pipeline = this.device.createRenderPipeline({
|
|
237
|
+
label: `material-shadow:${this.label}:${layout.name}`,
|
|
238
|
+
layout: this.pipelineLayout,
|
|
239
|
+
vertex: {
|
|
240
|
+
module,
|
|
241
|
+
entryPoint: desc.vertexEntry ?? 'vs_main',
|
|
242
|
+
buffers: [layout.buffer, INSTANCE_BUFFER_LAYOUT],
|
|
243
|
+
},
|
|
244
|
+
fragment: { module, entryPoint: entry, targets: [] },
|
|
245
|
+
primitive: { topology: 'triangle-list', cullMode: 'none' },
|
|
246
|
+
depthStencil: { format, depthWriteEnabled: true, depthCompare: 'less' },
|
|
247
|
+
});
|
|
248
|
+
this.shadowPipelines.set(layout, pipeline);
|
|
249
|
+
return pipeline;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Colour target states for a target with aux key `aux`: the scene formats with this
|
|
253
|
+
* material's blend, then the aux attachments (`rg8unorm` rough-metal, `rg16float`
|
|
254
|
+
* velocity), unblended, masked off unless the material declares `aux`.
|
|
255
|
+
*/
|
|
256
|
+
targetsFor(aux) {
|
|
257
|
+
const hit = this.targetsByAux[aux];
|
|
258
|
+
if (hit)
|
|
259
|
+
return hit;
|
|
260
|
+
const targets = sceneColorTargets(this.targetFormats, aux, this.blendState, this.desc.aux === true);
|
|
261
|
+
this.targetsByAux[aux] = targets;
|
|
262
|
+
return targets;
|
|
263
|
+
}
|
|
264
|
+
/** Write the material's uniform block (`@group(1) @binding(0)`). */
|
|
265
|
+
setUniforms(data, byteOffset = 0) {
|
|
266
|
+
if (!this.bindings)
|
|
267
|
+
throw new Error(`material ${this.label}: no uniforms declared`);
|
|
268
|
+
this.bindings.setUniforms(data, byteOffset);
|
|
269
|
+
}
|
|
270
|
+
/** Bind a texture to slot `i` (`@group(1) @binding(2 + i)`). Rebuilds the bind group lazily. */
|
|
271
|
+
setTexture(slot, tex) {
|
|
272
|
+
if (!this.bindings)
|
|
273
|
+
throw new Error(`material ${this.label}: no textures declared`);
|
|
274
|
+
this.bindings.setTexture(slot, tex);
|
|
275
|
+
}
|
|
276
|
+
destroy() {
|
|
277
|
+
this.bindings?.destroy();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** Built-in textured sprite: `texture * vertexColor * tint`; emissive = colour × emissive. */
|
|
281
|
+
export const SPRITE_WGSL = /* wgsl */ `
|
|
282
|
+
@group(1) @binding(1) var spriteSampler: sampler;
|
|
283
|
+
@group(1) @binding(2) var spriteTex: texture_2d<f32>;
|
|
284
|
+
|
|
285
|
+
@fragment fn fs_main(in: VSOut) -> FragOut {
|
|
286
|
+
let c = textureSample(spriteTex, spriteSampler, in.uv) * in.color;
|
|
287
|
+
var o: FragOut;
|
|
288
|
+
o.color = c;
|
|
289
|
+
o.emissive = vec4f(c.rgb * in.emissive, c.a);
|
|
290
|
+
return o;
|
|
291
|
+
}
|
|
292
|
+
`;
|