@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,450 @@
|
|
|
1
|
+
import { DEPTH_FORMAT } from './material.js';
|
|
2
|
+
import { Texture } from './texture.js';
|
|
3
|
+
/** HDR scene targets: [0] colour, [1] emissive (feeds bloom). */
|
|
4
|
+
export const SCENE_FORMAT = 'rgba16float';
|
|
5
|
+
const sharedEmissive = new WeakMap();
|
|
6
|
+
function acquireSharedEmissive(device, w, h, label) {
|
|
7
|
+
let bySize = sharedEmissive.get(device);
|
|
8
|
+
if (!bySize) {
|
|
9
|
+
bySize = new Map();
|
|
10
|
+
sharedEmissive.set(device, bySize);
|
|
11
|
+
}
|
|
12
|
+
const key = `${w}x${h}`;
|
|
13
|
+
let e = bySize.get(key);
|
|
14
|
+
if (!e) {
|
|
15
|
+
e = {
|
|
16
|
+
tex: new Texture(device, {
|
|
17
|
+
width: w,
|
|
18
|
+
height: h,
|
|
19
|
+
format: SCENE_FORMAT,
|
|
20
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
|
|
21
|
+
label: `${label}-emissive`,
|
|
22
|
+
}),
|
|
23
|
+
refs: 0,
|
|
24
|
+
};
|
|
25
|
+
bySize.set(key, e);
|
|
26
|
+
}
|
|
27
|
+
e.refs++;
|
|
28
|
+
return e.tex;
|
|
29
|
+
}
|
|
30
|
+
function releaseSharedEmissive(device, tex) {
|
|
31
|
+
const bySize = sharedEmissive.get(device);
|
|
32
|
+
if (!bySize)
|
|
33
|
+
return;
|
|
34
|
+
const key = `${tex.width}x${tex.height}`;
|
|
35
|
+
const e = bySize.get(key);
|
|
36
|
+
if (!e || e.tex !== tex)
|
|
37
|
+
return;
|
|
38
|
+
if (--e.refs > 0)
|
|
39
|
+
return;
|
|
40
|
+
bySize.delete(key);
|
|
41
|
+
tex.destroy();
|
|
42
|
+
}
|
|
43
|
+
/** Shared external emissive textures alive on `device` (tests). */
|
|
44
|
+
export function sharedEmissiveCount(device) {
|
|
45
|
+
return sharedEmissive.get(device)?.size ?? 0;
|
|
46
|
+
}
|
|
47
|
+
/** Format of the `roughMetal` aux attachment. */
|
|
48
|
+
export const ROUGH_METAL_FORMAT = 'rg8unorm';
|
|
49
|
+
/** Format of the `velocity` aux attachment. */
|
|
50
|
+
export const VELOCITY_FORMAT = 'rg16float';
|
|
51
|
+
/** A texture owned by someone else, in the shape of `Texture` (its `destroy` does nothing). */
|
|
52
|
+
class AdoptedTexture {
|
|
53
|
+
texture;
|
|
54
|
+
view;
|
|
55
|
+
width;
|
|
56
|
+
height;
|
|
57
|
+
format;
|
|
58
|
+
/** One layer, one mip, a `'2d'` view: the adopted view is a single eye's layer. */
|
|
59
|
+
layers = 1;
|
|
60
|
+
mipLevels = 1;
|
|
61
|
+
viewDimension = '2d';
|
|
62
|
+
constructor(texture, view) {
|
|
63
|
+
this.texture = texture;
|
|
64
|
+
this.view = texture.createView(view);
|
|
65
|
+
this.width = texture.width;
|
|
66
|
+
this.height = texture.height;
|
|
67
|
+
this.format = texture.format;
|
|
68
|
+
}
|
|
69
|
+
destroy() { }
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* What `Renderer.render` draws into: the two HDR colour targets the scene pass writes
|
|
73
|
+
* (`color`, `emissive`, both `SCENE_FORMAT`) and, when a camera asks for depth, a
|
|
74
|
+
* `depth24plus` attachment made at the same size on first use. The renderer owns one at the
|
|
75
|
+
* scene resolution (`renderer.target`, what the post stack reads and the surface shows);
|
|
76
|
+
* `renderer.createSceneTarget(desc)` makes more for offscreen views (a portal, a minimap),
|
|
77
|
+
* whose `color` and `emissive` are sampleable like any `Texture`.
|
|
78
|
+
*
|
|
79
|
+
* `SceneTarget.external(desc)` adopts a colour (and depth) texture owned by someone else, an
|
|
80
|
+
* XR layer's eye textures; `adopt(desc)` re-points it at the next frame's. Its emissive
|
|
81
|
+
* attachment (every pipeline writes two targets) is one texture per device and size shared by
|
|
82
|
+
* all external targets, stored with `'discard'`: the post stack does not run on an external
|
|
83
|
+
* target, so its emissive is written and dropped, and two eyes allocate one, not two.
|
|
84
|
+
*
|
|
85
|
+
* Depth hooks (ws/render-hooks): when a view splits its scene pass for a `readsDepth` drawable
|
|
86
|
+
* the renderer copies `depth` into `depthCopy` (same format and size, `COPY_DST` +
|
|
87
|
+
* `TEXTURE_BINDING`, made on first use, recreated with `depth`) between the opaque pass
|
|
88
|
+
* (`passDesc`, label `scene`) and the blended pass (`blendPassDesc`, label `scene-blend`,
|
|
89
|
+
* which loads every attachment). An allocated depth texture carries `COPY_SRC`; an adopted one
|
|
90
|
+
* (an XR layer's) can be copied only if its owner gave it `COPY_SRC` (`canCopyDepth`).
|
|
91
|
+
*/
|
|
92
|
+
export class SceneTarget {
|
|
93
|
+
device;
|
|
94
|
+
color;
|
|
95
|
+
emissive;
|
|
96
|
+
/** The `rg8unorm` roughness/metalness attachment (`aux.roughMetal`), else null. */
|
|
97
|
+
roughMetal = null;
|
|
98
|
+
/** The `rg16float` screen-space velocity attachment (`aux.velocity`), else null. */
|
|
99
|
+
velocity = null;
|
|
100
|
+
/** Bit 0: has `roughMetal`; bit 1: has `velocity`. Keys material pipeline variants. */
|
|
101
|
+
auxKey;
|
|
102
|
+
width = 0;
|
|
103
|
+
height = 0;
|
|
104
|
+
/**
|
|
105
|
+
* For an external target, the part of `color` its views draw into (texture px), or null
|
|
106
|
+
* when the whole texture is the view; always null for an allocated target.
|
|
107
|
+
*/
|
|
108
|
+
viewport = null;
|
|
109
|
+
/** The scene pass descriptor for this target; the renderer sets its load ops per view. */
|
|
110
|
+
passDesc;
|
|
111
|
+
colorAtt;
|
|
112
|
+
emissiveAtt;
|
|
113
|
+
depthAtt = {
|
|
114
|
+
view: undefined,
|
|
115
|
+
depthClearValue: 1,
|
|
116
|
+
depthLoadOp: 'clear',
|
|
117
|
+
depthStoreOp: 'store',
|
|
118
|
+
};
|
|
119
|
+
/** The blended half of a split view: the same attachments, every load op `load`. */
|
|
120
|
+
blendPassDesc;
|
|
121
|
+
blendColorAtt;
|
|
122
|
+
blendEmissiveAtt;
|
|
123
|
+
/** Aux attachments in order (rough-metal, velocity), for the clear and the blend pass. */
|
|
124
|
+
auxAtts = [];
|
|
125
|
+
blendAuxAtts = [];
|
|
126
|
+
blendDepthAtt = {
|
|
127
|
+
view: undefined,
|
|
128
|
+
depthLoadOp: 'load',
|
|
129
|
+
depthStoreOp: 'store',
|
|
130
|
+
};
|
|
131
|
+
depthTex = null;
|
|
132
|
+
depthCopyTex = null;
|
|
133
|
+
/** `copyDepth`'s reused copy descriptors (no allocation per frame). */
|
|
134
|
+
copySrc = {
|
|
135
|
+
texture: undefined,
|
|
136
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
137
|
+
};
|
|
138
|
+
copyDst = {
|
|
139
|
+
texture: undefined,
|
|
140
|
+
};
|
|
141
|
+
copySize = { width: 0, height: 0, depthOrArrayLayers: 1 };
|
|
142
|
+
label;
|
|
143
|
+
/** The adopted colour texture of an external target; null for an allocated one. */
|
|
144
|
+
externalColor = null;
|
|
145
|
+
/** The adopted depth texture of an external target, when its layer has one. */
|
|
146
|
+
externalDepth = null;
|
|
147
|
+
adoptedLayer = 0;
|
|
148
|
+
/** `external`: internal, set by `SceneTarget.external`; the textures then come from `adopt`. */
|
|
149
|
+
constructor(device, desc, external = false) {
|
|
150
|
+
this.device = device;
|
|
151
|
+
this.label = desc.label ?? 'scene';
|
|
152
|
+
this.auxKey = (desc.aux?.roughMetal ? 1 : 0) | (desc.aux?.velocity ? 2 : 0);
|
|
153
|
+
this.colorAtt = {
|
|
154
|
+
view: undefined,
|
|
155
|
+
loadOp: 'clear',
|
|
156
|
+
storeOp: 'store',
|
|
157
|
+
clearValue: { r: 0, g: 0, b: 0, a: 1 },
|
|
158
|
+
};
|
|
159
|
+
this.emissiveAtt = {
|
|
160
|
+
view: undefined,
|
|
161
|
+
loadOp: 'clear',
|
|
162
|
+
storeOp: 'store',
|
|
163
|
+
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
164
|
+
};
|
|
165
|
+
const colorAttachments = [this.colorAtt, this.emissiveAtt];
|
|
166
|
+
const blendAttachments = [];
|
|
167
|
+
for (let k = 0; k < 2; k++) {
|
|
168
|
+
if (!(this.auxKey & (1 << k)))
|
|
169
|
+
continue;
|
|
170
|
+
const att = {
|
|
171
|
+
view: undefined,
|
|
172
|
+
loadOp: 'clear',
|
|
173
|
+
storeOp: 'store',
|
|
174
|
+
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
175
|
+
};
|
|
176
|
+
const blendAtt = {
|
|
177
|
+
view: undefined,
|
|
178
|
+
loadOp: 'load',
|
|
179
|
+
storeOp: 'store',
|
|
180
|
+
};
|
|
181
|
+
this.auxAtts.push(att);
|
|
182
|
+
this.blendAuxAtts.push(blendAtt);
|
|
183
|
+
colorAttachments.push(att);
|
|
184
|
+
blendAttachments.push(blendAtt);
|
|
185
|
+
}
|
|
186
|
+
this.passDesc = { label: 'scene', colorAttachments };
|
|
187
|
+
this.blendColorAtt = {
|
|
188
|
+
view: undefined,
|
|
189
|
+
loadOp: 'load',
|
|
190
|
+
storeOp: 'store',
|
|
191
|
+
};
|
|
192
|
+
this.blendEmissiveAtt = {
|
|
193
|
+
view: undefined,
|
|
194
|
+
loadOp: 'load',
|
|
195
|
+
storeOp: 'store',
|
|
196
|
+
};
|
|
197
|
+
this.blendPassDesc = {
|
|
198
|
+
label: 'scene-blend',
|
|
199
|
+
colorAttachments: [this.blendColorAtt, this.blendEmissiveAtt, ...blendAttachments],
|
|
200
|
+
depthStencilAttachment: this.blendDepthAtt,
|
|
201
|
+
};
|
|
202
|
+
if (external) {
|
|
203
|
+
// Written and dropped: see the shared emissive note above (ws/ergo-3d).
|
|
204
|
+
this.emissiveAtt.storeOp = 'discard';
|
|
205
|
+
this.blendEmissiveAtt.storeOp = 'discard';
|
|
206
|
+
}
|
|
207
|
+
else
|
|
208
|
+
this.resize(desc.width, desc.height);
|
|
209
|
+
}
|
|
210
|
+
/** A target over textures owned by someone else (an XR layer's); see `SceneTargetExternal`. */
|
|
211
|
+
static external(desc) {
|
|
212
|
+
const t = new SceneTarget(desc.device, { width: 0, height: 0, label: desc.label ?? 'external', aux: desc.aux }, true);
|
|
213
|
+
t.adopt(desc);
|
|
214
|
+
return t;
|
|
215
|
+
}
|
|
216
|
+
/** True for a target made by `SceneTarget.external`. */
|
|
217
|
+
get isExternal() {
|
|
218
|
+
return this.externalColor !== null;
|
|
219
|
+
}
|
|
220
|
+
/** The adopted colour texture of an external target; null for an allocated one. */
|
|
221
|
+
get adoptedColor() {
|
|
222
|
+
return this.externalColor;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* The depth texture, once a depth camera has rendered here; null before. Sampleable
|
|
226
|
+
* (`texture_depth_2d`) outside the scene pass that writes it.
|
|
227
|
+
*/
|
|
228
|
+
get depth() {
|
|
229
|
+
return this.depthTex;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The sampleable copy of `depth` a split view fills before its blended pass
|
|
233
|
+
* (`Drawable.afterOpaque`); null until the first view that split here. Same format and
|
|
234
|
+
* size as `depth`, recreated with it.
|
|
235
|
+
*/
|
|
236
|
+
get depthCopy() {
|
|
237
|
+
return this.depthCopyTex;
|
|
238
|
+
}
|
|
239
|
+
/** Whether `depth` can be the source of a copy (an adopted texture may lack `COPY_SRC`). */
|
|
240
|
+
get canCopyDepth() {
|
|
241
|
+
return this.depthTex !== null && (this.depthTex.texture.usage & GPUTextureUsage.COPY_SRC) !== 0;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Point an external target at this frame's textures (an XR layer rotates them). A no-op
|
|
245
|
+
* when `color`, `depth` and the view's array layer are the ones already adopted; otherwise
|
|
246
|
+
* new views are made and, if the size changed, the shared emissive is swapped for one of the
|
|
247
|
+
* new size and the own depth texture dropped.
|
|
248
|
+
*/
|
|
249
|
+
adopt(desc) {
|
|
250
|
+
const depth = desc.depth ?? null;
|
|
251
|
+
const layer = desc.view?.baseArrayLayer ?? 0;
|
|
252
|
+
const same = desc.color === this.externalColor &&
|
|
253
|
+
depth === this.externalDepth &&
|
|
254
|
+
layer === this.adoptedLayer;
|
|
255
|
+
this.viewport = desc.viewport ?? null;
|
|
256
|
+
if (same)
|
|
257
|
+
return;
|
|
258
|
+
this.externalColor = desc.color;
|
|
259
|
+
this.externalDepth = depth;
|
|
260
|
+
this.adoptedLayer = layer;
|
|
261
|
+
const w = desc.color.width;
|
|
262
|
+
const h = desc.color.height;
|
|
263
|
+
if (w !== this.width || h !== this.height) {
|
|
264
|
+
this.width = w;
|
|
265
|
+
this.height = h;
|
|
266
|
+
if (this.emissive)
|
|
267
|
+
releaseSharedEmissive(this.device, this.emissive);
|
|
268
|
+
this.emissive = acquireSharedEmissive(this.device, w, h, this.label);
|
|
269
|
+
this.emissiveAtt.view = this.emissive.view;
|
|
270
|
+
this.blendEmissiveAtt.view = this.emissive.view;
|
|
271
|
+
this.depthTex?.destroy();
|
|
272
|
+
this.depthTex = null;
|
|
273
|
+
this.depthCopyTex?.destroy();
|
|
274
|
+
this.depthCopyTex = null;
|
|
275
|
+
this.resizeAux(w, h);
|
|
276
|
+
}
|
|
277
|
+
this.color = new AdoptedTexture(desc.color, desc.view);
|
|
278
|
+
this.colorAtt.view = this.color.view;
|
|
279
|
+
this.blendColorAtt.view = this.color.view;
|
|
280
|
+
if (depth) {
|
|
281
|
+
this.depthTex = new AdoptedTexture(depth, desc.view);
|
|
282
|
+
this.depthAtt.view = this.depthTex.view;
|
|
283
|
+
this.blendDepthAtt.view = this.depthTex.view;
|
|
284
|
+
}
|
|
285
|
+
else if (this.depthTex && this.depthTex instanceof AdoptedTexture) {
|
|
286
|
+
this.depthTex = null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/** Recreate the textures at a new size (no-op when unchanged). Returns whether they changed. */
|
|
290
|
+
resize(width, height) {
|
|
291
|
+
if (this.externalColor)
|
|
292
|
+
throw new Error('SceneTarget.resize: an external target is sized by its textures');
|
|
293
|
+
const w = Math.max(1, Math.floor(width));
|
|
294
|
+
const h = Math.max(1, Math.floor(height));
|
|
295
|
+
if (this.color && w === this.width && h === this.height)
|
|
296
|
+
return false;
|
|
297
|
+
this.width = w;
|
|
298
|
+
this.height = h;
|
|
299
|
+
this.color?.destroy();
|
|
300
|
+
this.emissive?.destroy();
|
|
301
|
+
// The depth target (only ever made for a depth camera) is rebuilt at the new size lazily.
|
|
302
|
+
this.depthTex?.destroy();
|
|
303
|
+
this.depthTex = null;
|
|
304
|
+
this.depthCopyTex?.destroy();
|
|
305
|
+
this.depthCopyTex = null;
|
|
306
|
+
const usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING;
|
|
307
|
+
this.color = new Texture(this.device, {
|
|
308
|
+
width: w,
|
|
309
|
+
height: h,
|
|
310
|
+
format: SCENE_FORMAT,
|
|
311
|
+
usage,
|
|
312
|
+
label: `${this.label}-color`,
|
|
313
|
+
});
|
|
314
|
+
this.emissive = new Texture(this.device, {
|
|
315
|
+
width: w,
|
|
316
|
+
height: h,
|
|
317
|
+
format: SCENE_FORMAT,
|
|
318
|
+
usage,
|
|
319
|
+
label: `${this.label}-emissive`,
|
|
320
|
+
});
|
|
321
|
+
this.colorAtt.view = this.color.view;
|
|
322
|
+
this.emissiveAtt.view = this.emissive.view;
|
|
323
|
+
this.blendColorAtt.view = this.color.view;
|
|
324
|
+
this.blendEmissiveAtt.view = this.emissive.view;
|
|
325
|
+
this.resizeAux(w, h);
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
/** Load op of the aux attachments for the next scene pass (the renderer: clear on first view). */
|
|
329
|
+
setAuxLoadOp(op) {
|
|
330
|
+
for (const a of this.auxAtts)
|
|
331
|
+
a.loadOp = op;
|
|
332
|
+
}
|
|
333
|
+
/** (Re)create the aux attachments at `w × h`. */
|
|
334
|
+
resizeAux(w, h) {
|
|
335
|
+
if (this.auxKey === 0)
|
|
336
|
+
return;
|
|
337
|
+
const usage = GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING;
|
|
338
|
+
this.roughMetal?.destroy();
|
|
339
|
+
this.velocity?.destroy();
|
|
340
|
+
this.roughMetal = null;
|
|
341
|
+
this.velocity = null;
|
|
342
|
+
let i = 0;
|
|
343
|
+
if (this.auxKey & 1) {
|
|
344
|
+
this.roughMetal = new Texture(this.device, {
|
|
345
|
+
width: w,
|
|
346
|
+
height: h,
|
|
347
|
+
format: ROUGH_METAL_FORMAT,
|
|
348
|
+
usage,
|
|
349
|
+
label: `${this.label}-rough-metal`,
|
|
350
|
+
});
|
|
351
|
+
this.auxAtts[i].view = this.roughMetal.view;
|
|
352
|
+
this.blendAuxAtts[i].view = this.roughMetal.view;
|
|
353
|
+
i++;
|
|
354
|
+
}
|
|
355
|
+
if (this.auxKey & 2) {
|
|
356
|
+
this.velocity = new Texture(this.device, {
|
|
357
|
+
width: w,
|
|
358
|
+
height: h,
|
|
359
|
+
format: VELOCITY_FORMAT,
|
|
360
|
+
usage,
|
|
361
|
+
label: `${this.label}-velocity`,
|
|
362
|
+
});
|
|
363
|
+
this.auxAtts[i].view = this.velocity.view;
|
|
364
|
+
this.blendAuxAtts[i].view = this.velocity.view;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* The depth attachment, allocating the `depth24plus` texture at this size on first use (an
|
|
369
|
+
* external target with an adopted depth texture uses that instead).
|
|
370
|
+
*/
|
|
371
|
+
depthAttachment() {
|
|
372
|
+
if (!this.depthTex) {
|
|
373
|
+
this.depthTex = new Texture(this.device, {
|
|
374
|
+
width: this.width,
|
|
375
|
+
height: this.height,
|
|
376
|
+
format: DEPTH_FORMAT,
|
|
377
|
+
// TEXTURE_BINDING: world-space particles copy it for their soft fade (`depth`).
|
|
378
|
+
// COPY_SRC: a split view copies it into `depthCopy` (ws/render-hooks).
|
|
379
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT |
|
|
380
|
+
GPUTextureUsage.TEXTURE_BINDING |
|
|
381
|
+
GPUTextureUsage.COPY_SRC,
|
|
382
|
+
label: `${this.label}-depth`,
|
|
383
|
+
});
|
|
384
|
+
this.depthAtt.view = this.depthTex.view;
|
|
385
|
+
this.blendDepthAtt.view = this.depthTex.view;
|
|
386
|
+
}
|
|
387
|
+
return this.depthAtt;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* `depthCopy`, allocated at `depth`'s size and format on first use (the renderer calls this
|
|
391
|
+
* when a view splits; `depth` exists by then). Null when `depth` is not copyable.
|
|
392
|
+
*/
|
|
393
|
+
depthCopyTexture() {
|
|
394
|
+
if (!this.depthTex || !this.canCopyDepth)
|
|
395
|
+
return null;
|
|
396
|
+
const d = this.depthTex;
|
|
397
|
+
if (this.depthCopyTex &&
|
|
398
|
+
(this.depthCopyTex.width !== d.width ||
|
|
399
|
+
this.depthCopyTex.height !== d.height ||
|
|
400
|
+
this.depthCopyTex.format !== d.format)) {
|
|
401
|
+
this.depthCopyTex.destroy();
|
|
402
|
+
this.depthCopyTex = null;
|
|
403
|
+
}
|
|
404
|
+
if (!this.depthCopyTex) {
|
|
405
|
+
this.depthCopyTex = new Texture(this.device, {
|
|
406
|
+
width: d.width,
|
|
407
|
+
height: d.height,
|
|
408
|
+
format: d.format,
|
|
409
|
+
usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING,
|
|
410
|
+
label: `${this.label}-depth-copy`,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
return this.depthCopyTex;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Encode a copy of `depth` (the adopted layer of an external one) into `depthCopy`, making
|
|
417
|
+
* the copy texture first; returns it, or null when `depth` is missing or not copyable.
|
|
418
|
+
* Nothing is allocated per call once the copy texture exists.
|
|
419
|
+
*/
|
|
420
|
+
copyDepth(encoder) {
|
|
421
|
+
const copy = this.depthCopyTexture();
|
|
422
|
+
const d = this.depthTex;
|
|
423
|
+
if (!copy || !d)
|
|
424
|
+
return null;
|
|
425
|
+
this.copySrc.texture = d.texture;
|
|
426
|
+
this.copySrc.origin.z = this.externalDepth ? this.adoptedLayer : 0;
|
|
427
|
+
this.copyDst.texture = copy.texture;
|
|
428
|
+
this.copySize.width = d.width;
|
|
429
|
+
this.copySize.height = d.height;
|
|
430
|
+
encoder.copyTextureToTexture(this.copySrc, this.copyDst, this.copySize);
|
|
431
|
+
return copy;
|
|
432
|
+
}
|
|
433
|
+
destroy() {
|
|
434
|
+
this.color?.destroy();
|
|
435
|
+
this.roughMetal?.destroy();
|
|
436
|
+
this.velocity?.destroy();
|
|
437
|
+
this.roughMetal = null;
|
|
438
|
+
this.velocity = null;
|
|
439
|
+
if (this.externalColor) {
|
|
440
|
+
if (this.emissive)
|
|
441
|
+
releaseSharedEmissive(this.device, this.emissive);
|
|
442
|
+
}
|
|
443
|
+
else
|
|
444
|
+
this.emissive?.destroy();
|
|
445
|
+
this.depthTex?.destroy();
|
|
446
|
+
this.depthTex = null;
|
|
447
|
+
this.depthCopyTex?.destroy();
|
|
448
|
+
this.depthCopyTex = null;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Camera } from './camera.js';
|
|
2
|
+
import { type ShadowUniforms, type SunShadow } from './lights.js';
|
|
3
|
+
import type { VertexLayout } from './mesh.js';
|
|
4
|
+
/** Depth format of the sun's shadow map (and of the 1×1 placeholder bound without one). */
|
|
5
|
+
export declare const SHADOW_FORMAT: GPUTextureFormat;
|
|
6
|
+
/** Shadow map side in texels when `SunShadow.size` is not given. */
|
|
7
|
+
export declare const DEFAULT_SHADOW_SIZE = 2048;
|
|
8
|
+
/**
|
|
9
|
+
* The sun's shadow map: one `depth32float` texture, a comparison sampler, a 1×1 placeholder
|
|
10
|
+
* depth texture (what every view binds at `@group(0) @binding(3)` until a shadow pass has
|
|
11
|
+
* rendered) and a depth-only pipeline per vertex layout. The renderer owns one and, for each
|
|
12
|
+
* `render` whose `frame.lights.sun.shadow` is set, encodes a shadow pass through `sunCamera`
|
|
13
|
+
* (an orthographic `Camera` placed by `place`) over the view's opaque shadow-casting draws. A
|
|
14
|
+
* caster whose material has a `shadowFragmentEntry` (alpha mask, dissolve) draws through that
|
|
15
|
+
* material's `shadowPipelineFor` instead, so its holes show in the shadow.
|
|
16
|
+
* Engine-internal; games set `Lights.sun.shadow`.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ShadowMap {
|
|
19
|
+
/** Comparison sampler (`less-equal`: a receiver at or in front of the stored depth is lit). */
|
|
20
|
+
readonly sampler: GPUSampler;
|
|
21
|
+
/** 1×1 depth view bound in place of the map (and in the shadow pass itself). */
|
|
22
|
+
readonly placeholder: GPUTextureView;
|
|
23
|
+
/** The orthographic camera the shadow pass renders through; `place` sets it. */
|
|
24
|
+
readonly sunCamera: Camera;
|
|
25
|
+
/** What `Lights.writeBlock` needs for the view this map was rendered for. */
|
|
26
|
+
readonly uniforms: ShadowUniforms;
|
|
27
|
+
/** Side of the current map in texels, 0 before the first shadow pass. */
|
|
28
|
+
size: number;
|
|
29
|
+
/** Bumped every time the map texture is (re)created, so bind groups can follow it. */
|
|
30
|
+
generation: number;
|
|
31
|
+
private texture;
|
|
32
|
+
/** Maps replaced this frame (passes already encoded may still read them); see `flush`. */
|
|
33
|
+
private readonly retired;
|
|
34
|
+
private mapView;
|
|
35
|
+
private readonly placeholderTex;
|
|
36
|
+
private readonly device;
|
|
37
|
+
private readonly pipelineLayout;
|
|
38
|
+
private readonly pipelines;
|
|
39
|
+
/** Skinned layouts: one pipeline per material bind group layout (the palette is group 1). */
|
|
40
|
+
private readonly skinnedPipelines;
|
|
41
|
+
private readonly globalsLayout;
|
|
42
|
+
private readonly viewM;
|
|
43
|
+
private readonly projM;
|
|
44
|
+
private readonly eye;
|
|
45
|
+
private readonly target;
|
|
46
|
+
private readonly depthAtt;
|
|
47
|
+
/** The shadow pass descriptor; its attachment view follows `view`. */
|
|
48
|
+
readonly passDesc: GPURenderPassDescriptor;
|
|
49
|
+
constructor(device: GPUDevice, globalsLayout: GPUBindGroupLayout);
|
|
50
|
+
/** The map's view when one has been rendered, else `placeholder`. */
|
|
51
|
+
get view(): GPUTextureView;
|
|
52
|
+
/**
|
|
53
|
+
* Make sure the map is `size` texels square (creating or replacing the texture; bumps
|
|
54
|
+
* `generation` when it does). Returns whether the texture changed.
|
|
55
|
+
*/
|
|
56
|
+
ensure(size: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Point `sunCamera` along `sunDir` through an orthographic box centred on `center` (the
|
|
59
|
+
* rendering camera's position): half-width `shadow.extent`, depth `near..far` along the
|
|
60
|
+
* light measured from `center` (defaults `-extent..extent`). Fills `uniforms` for a map of
|
|
61
|
+
* `size` texels. No allocation.
|
|
62
|
+
*/
|
|
63
|
+
place(center: ArrayLike<number>, sunDir: ArrayLike<number>, shadow: SunShadow, size: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* The depth-only pipeline for meshes in `layout`: the engine prelude's `vs_main` (so the same
|
|
66
|
+
* `engine_vertex` path as the scene pass), no fragment stage, `SHADOW_FORMAT` depth with
|
|
67
|
+
* writes on. Built on first use and cached. A skinned layout with `bindingsLayout` (the
|
|
68
|
+
* material's group 1, which holds the joint palette) gets a pipeline layout of both groups.
|
|
69
|
+
*/
|
|
70
|
+
pipelineFor(layout: VertexLayout, bindingsLayout?: GPUBindGroupLayout): GPURenderPipeline;
|
|
71
|
+
/** Destroy maps replaced since the last call; the renderer calls it after each submit. */
|
|
72
|
+
flush(): void;
|
|
73
|
+
destroy(): void;
|
|
74
|
+
}
|