murow 0.0.70 → 0.0.72
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/README.md +54 -37
- package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
- package/dist/cjs/core/binary-codec/index.js +1 -0
- package/dist/cjs/core/driver/driver.js +1 -0
- package/dist/cjs/core/driver/drivers/immediate.js +1 -0
- package/dist/cjs/core/driver/drivers/index.js +1 -0
- package/dist/cjs/core/driver/drivers/raf.js +1 -0
- package/dist/cjs/core/driver/drivers/timeout.js +1 -0
- package/dist/cjs/core/driver/index.js +1 -0
- package/dist/cjs/core/events/event-system.js +1 -0
- package/dist/cjs/core/events/index.js +1 -0
- package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/cjs/core/fixed-ticker/index.js +1 -0
- package/dist/cjs/core/free-list/free-list.js +1 -0
- package/dist/cjs/core/free-list/index.js +1 -0
- package/dist/cjs/core/generate-id/generate-id.js +1 -0
- package/dist/cjs/core/generate-id/index.js +1 -0
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/input/index.js +1 -0
- package/dist/cjs/core/input/manager.js +1 -0
- package/dist/cjs/core/input/sources/browser.js +1 -0
- package/dist/cjs/core/input/sources/index.js +1 -0
- package/dist/cjs/core/input/types.js +1 -0
- package/dist/cjs/core/lerp/index.js +1 -0
- package/dist/cjs/core/lerp/lerp.js +1 -0
- package/dist/cjs/core/navmesh/index.js +1 -0
- package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
- package/dist/cjs/core/pooled-codec/index.js +1 -0
- package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/cjs/core/prediction/index.js +1 -0
- package/dist/cjs/core/prediction/prediction.js +1 -0
- package/dist/cjs/core/ray/index.js +1 -0
- package/dist/cjs/core/ray/ray-2d.js +1 -0
- package/dist/cjs/core/ray/ray-3d.js +1 -0
- package/dist/cjs/core/simple-rng/index.js +1 -0
- package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
- package/dist/cjs/core/sparse-batcher/index.js +1 -0
- package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/cjs/ecs/component-store.js +1 -0
- package/dist/cjs/ecs/component.js +1 -0
- package/dist/cjs/ecs/entity-handle.js +1 -0
- package/dist/cjs/ecs/index.js +1 -0
- package/dist/cjs/ecs/system-builder.js +1 -0
- package/dist/cjs/ecs/world-systems.js +1 -0
- package/dist/cjs/ecs/world.js +1 -0
- package/dist/cjs/game/index.js +1 -0
- package/dist/cjs/game/loop/index.js +1 -0
- package/dist/cjs/game/loop/loop.js +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/net/adapters/browser-websocket.js +1 -0
- package/dist/cjs/net/adapters/bun-websocket.js +1 -0
- package/dist/cjs/net/buffer-pool.js +1 -0
- package/dist/cjs/net/client.js +1 -0
- package/dist/cjs/net/index.js +1 -0
- package/dist/cjs/net/server.js +1 -0
- package/dist/cjs/net/types.js +1 -0
- package/dist/cjs/net/validators.js +1 -0
- package/dist/cjs/protocol/index.js +1 -0
- package/dist/cjs/protocol/intent/define-intent.js +1 -0
- package/dist/cjs/protocol/intent/index.js +1 -0
- package/dist/cjs/protocol/intent/intent-registry.js +1 -0
- package/dist/cjs/protocol/intent/intent.js +1 -0
- package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
- package/dist/cjs/protocol/rpc/index.js +1 -0
- package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
- package/dist/cjs/protocol/rpc/rpc.js +1 -0
- package/dist/cjs/protocol/snapshot/index.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
- package/dist/cjs/renderer/base/renderer-2d.js +1 -0
- package/dist/cjs/renderer/base/renderer-3d.js +1 -0
- package/dist/cjs/renderer/base/renderer.js +1 -0
- package/dist/cjs/renderer/gltf/helpers.js +1 -0
- package/dist/cjs/renderer/gltf/parser.js +1 -0
- package/dist/cjs/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/cjs/renderer/gltf/skin-parser.js +1 -0
- package/dist/cjs/renderer/index.js +1 -0
- package/dist/cjs/renderer/math.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/index.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/cjs/renderer/prefab-bucket/specs.js +1 -0
- package/dist/cjs/renderer/spritesheet/helpers.js +1 -0
- package/dist/cjs/renderer/spritesheet/parser.js +1 -0
- package/dist/cjs/renderer/types.js +1 -0
- package/dist/esm/core/binary-codec/binary-codec.js +1 -0
- package/dist/esm/core/binary-codec/index.js +1 -0
- package/dist/esm/core/driver/driver.js +1 -0
- package/dist/esm/core/driver/drivers/immediate.js +1 -0
- package/dist/esm/core/driver/drivers/index.js +1 -0
- package/dist/esm/core/driver/drivers/raf.js +1 -0
- package/dist/esm/core/driver/drivers/timeout.js +1 -0
- package/dist/esm/core/driver/index.js +1 -0
- package/dist/esm/core/events/event-system.js +1 -0
- package/dist/esm/core/events/index.js +1 -0
- package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/esm/core/fixed-ticker/index.js +1 -0
- package/dist/esm/core/free-list/free-list.js +1 -0
- package/dist/esm/core/free-list/index.js +1 -0
- package/dist/esm/core/generate-id/generate-id.js +1 -0
- package/dist/esm/core/generate-id/index.js +1 -0
- package/dist/esm/core/index.js +1 -0
- package/dist/esm/core/input/index.js +1 -0
- package/dist/esm/core/input/manager.js +1 -0
- package/dist/esm/core/input/sources/browser.js +1 -0
- package/dist/esm/core/input/sources/index.js +1 -0
- package/dist/esm/core/input/types.js +0 -0
- package/dist/esm/core/lerp/index.js +1 -0
- package/dist/esm/core/lerp/lerp.js +1 -0
- package/dist/esm/core/navmesh/index.js +1 -0
- package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/esm/core/navmesh/navmesh.js +1 -0
- package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
- package/dist/esm/core/pooled-codec/index.js +1 -0
- package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/esm/core/prediction/index.js +1 -0
- package/dist/esm/core/prediction/prediction.js +1 -0
- package/dist/esm/core/ray/index.js +1 -0
- package/dist/esm/core/ray/ray-2d.js +1 -0
- package/dist/esm/core/ray/ray-3d.js +1 -0
- package/dist/esm/core/simple-rng/index.js +1 -0
- package/dist/esm/core/simple-rng/simple-rng.js +1 -0
- package/dist/esm/core/sparse-batcher/index.js +1 -0
- package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/esm/ecs/component-store.js +1 -0
- package/dist/esm/ecs/component.js +1 -0
- package/dist/esm/ecs/entity-handle.js +1 -0
- package/dist/esm/ecs/index.js +1 -0
- package/dist/esm/ecs/system-builder.js +1 -0
- package/dist/esm/ecs/world-systems.js +1 -0
- package/dist/esm/ecs/world.js +1 -0
- package/dist/esm/game/index.js +1 -0
- package/dist/esm/game/loop/index.js +1 -0
- package/dist/esm/game/loop/loop.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/net/adapters/browser-websocket.js +1 -0
- package/dist/esm/net/adapters/bun-websocket.js +1 -0
- package/dist/esm/net/buffer-pool.js +1 -0
- package/dist/esm/net/client.js +1 -0
- package/dist/esm/net/index.js +1 -0
- package/dist/esm/net/server.js +1 -0
- package/dist/esm/net/types.js +1 -0
- package/dist/esm/net/validators.js +1 -0
- package/dist/esm/protocol/index.js +1 -0
- package/dist/esm/protocol/intent/define-intent.js +1 -0
- package/dist/esm/protocol/intent/index.js +1 -0
- package/dist/esm/protocol/intent/intent-registry.js +1 -0
- package/dist/esm/protocol/intent/intent.js +0 -0
- package/dist/esm/protocol/rpc/define-rpc.js +1 -0
- package/dist/esm/protocol/rpc/index.js +1 -0
- package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
- package/dist/esm/protocol/rpc/rpc.js +0 -0
- package/dist/esm/protocol/snapshot/index.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot.js +1 -0
- package/dist/esm/renderer/base/renderer-2d.js +1 -0
- package/dist/esm/renderer/base/renderer-3d.js +1 -0
- package/dist/esm/renderer/base/renderer.js +1 -0
- package/dist/esm/renderer/gltf/helpers.js +1 -0
- package/dist/esm/renderer/gltf/parser.js +1 -0
- package/dist/esm/renderer/gltf/skeletal-animation.js +1 -0
- package/dist/esm/renderer/gltf/skin-parser.js +1 -0
- package/dist/esm/renderer/index.js +1 -0
- package/dist/esm/renderer/math.js +1 -0
- package/dist/esm/renderer/prefab-bucket/concrete.js +1 -0
- package/dist/esm/renderer/prefab-bucket/index.js +1 -0
- package/dist/esm/renderer/prefab-bucket/parsers.js +1 -0
- package/dist/esm/renderer/prefab-bucket/specs.js +0 -0
- package/dist/esm/renderer/spritesheet/helpers.js +1 -0
- package/dist/esm/renderer/spritesheet/parser.js +1 -0
- package/dist/esm/renderer/types.js +0 -0
- package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
- package/dist/{core → types/core}/events/event-system.d.ts +14 -33
- package/dist/types/core/free-list/free-list.d.ts +31 -0
- package/dist/types/core/free-list/index.d.ts +1 -0
- package/dist/{core → types/core}/index.d.ts +5 -0
- package/dist/{core → types/core}/input/index.d.ts +1 -0
- package/dist/{core → types/core}/input/manager.d.ts +2 -0
- package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
- package/dist/types/core/ray/index.d.ts +2 -0
- package/dist/types/core/ray/ray-2d.d.ts +37 -0
- package/dist/types/core/ray/ray-3d.d.ts +42 -0
- package/dist/types/core/simple-rng/index.d.ts +1 -0
- package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
- package/dist/types/core/sparse-batcher/index.d.ts +1 -0
- package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
- package/dist/{ecs → types/ecs}/world.d.ts +11 -0
- package/dist/{game → types/game}/loop/loop.d.ts +33 -29
- package/dist/{index.d.ts → types/index.d.ts} +1 -0
- package/dist/{net → types/net}/index.d.ts +2 -2
- package/dist/types/renderer/base/renderer-2d.d.ts +13 -0
- package/dist/types/renderer/base/renderer-3d.d.ts +10 -0
- package/dist/types/renderer/base/renderer.d.ts +21 -0
- package/dist/types/renderer/gltf/helpers.d.ts +43 -0
- package/dist/types/renderer/gltf/parser.d.ts +49 -0
- package/dist/types/renderer/gltf/skeletal-animation.d.ts +96 -0
- package/dist/types/renderer/gltf/skin-parser.d.ts +107 -0
- package/dist/types/renderer/index.d.ts +15 -0
- package/dist/types/renderer/math.d.ts +37 -0
- package/dist/types/renderer/prefab-bucket/concrete.d.ts +55 -0
- package/dist/types/renderer/prefab-bucket/index.d.ts +113 -0
- package/dist/types/renderer/prefab-bucket/parsers.d.ts +8 -0
- package/dist/types/renderer/prefab-bucket/specs.d.ts +166 -0
- package/dist/types/renderer/spritesheet/helpers.d.ts +38 -0
- package/dist/types/renderer/spritesheet/parser.d.ts +21 -0
- package/dist/types/renderer/types.d.ts +89 -0
- package/dist/webgpu/cjs/index.js +5401 -0
- package/dist/webgpu/esm/index.js +5378 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +86 -0
- package/dist/webgpu/types/2d/shader.d.ts +61 -0
- package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
- package/dist/webgpu/types/3d/clip-resync-coordinator.d.ts +20 -0
- package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
- package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
- package/dist/webgpu/types/3d/renderer.d.ts +266 -0
- package/dist/webgpu/types/3d/shader.d.ts +136 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +25 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
- package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
- package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/index.d.ts +2 -0
- package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
- package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
- package/dist/webgpu/types/core/constants.d.ts +59 -0
- package/dist/webgpu/types/core/constants.test.d.ts +1 -0
- package/dist/webgpu/types/core/index.d.ts +2 -0
- package/dist/webgpu/types/core/types.d.ts +125 -0
- package/dist/webgpu/types/core/types.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
- package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
- package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/index.d.ts +2 -0
- package/dist/webgpu/types/index.d.ts +35 -0
- package/dist/webgpu/types/particle/emitter.d.ts +36 -0
- package/dist/webgpu/types/shaders/index.d.ts +2 -0
- package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
- package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
- package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
- package/dist/webgpu/types/shaders/utils.d.ts +28 -0
- package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/spritesheet.d.ts +28 -0
- package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
- package/package.json +96 -26
- package/dist/core/binary-codec/binary-codec.js +0 -354
- package/dist/core/binary-codec/index.js +0 -1
- package/dist/core/driver/driver.js +0 -47
- package/dist/core/driver/drivers/immediate.js +0 -61
- package/dist/core/driver/drivers/index.js +0 -3
- package/dist/core/driver/drivers/raf.js +0 -62
- package/dist/core/driver/drivers/timeout.js +0 -71
- package/dist/core/driver/index.js +0 -2
- package/dist/core/events/event-system.js +0 -88
- package/dist/core/events/index.js +0 -1
- package/dist/core/fixed-ticker/fixed-ticker.js +0 -105
- package/dist/core/fixed-ticker/index.js +0 -1
- package/dist/core/generate-id/generate-id.js +0 -25
- package/dist/core/generate-id/index.js +0 -1
- package/dist/core/index.js +0 -10
- package/dist/core/input/index.js +0 -2
- package/dist/core/input/manager.js +0 -211
- package/dist/core/input/sources/browser.js +0 -29
- package/dist/core/input/sources/index.js +0 -1
- package/dist/core/lerp/index.js +0 -1
- package/dist/core/lerp/lerp.js +0 -42
- package/dist/core/navmesh/index.js +0 -1
- package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
- package/dist/core/navmesh/navmesh.js +0 -799
- package/dist/core/navmesh/navmesh.worker.js +0 -79
- package/dist/core/pooled-codec/index.js +0 -1
- package/dist/core/pooled-codec/pooled-codec.js +0 -410
- package/dist/core/prediction/index.js +0 -1
- package/dist/core/prediction/prediction.js +0 -99
- package/dist/core.esm.js +0 -1
- package/dist/core.js +0 -1
- package/dist/ecs/component-store.js +0 -175
- package/dist/ecs/component.js +0 -43
- package/dist/ecs/entity-handle.js +0 -515
- package/dist/ecs/example.js +0 -125
- package/dist/ecs/index.js +0 -4
- package/dist/ecs/system-builder.js +0 -249
- package/dist/ecs/world-systems.js +0 -79
- package/dist/ecs/world.js +0 -767
- package/dist/game/index.js +0 -1
- package/dist/game/loop/index.js +0 -1
- package/dist/game/loop/loop.js +0 -108
- package/dist/index.js +0 -26
- package/dist/net/adapters/browser-websocket.js +0 -74
- package/dist/net/adapters/bun-websocket.js +0 -245
- package/dist/net/buffer-pool.js +0 -89
- package/dist/net/client.js +0 -586
- package/dist/net/index.js +0 -58
- package/dist/net/server.js +0 -974
- package/dist/net/types.js +0 -31
- package/dist/net/validators.js +0 -88
- package/dist/protocol/index.js +0 -92
- package/dist/protocol/intent/define-intent.js +0 -125
- package/dist/protocol/intent/index.js +0 -91
- package/dist/protocol/intent/intent-registry.js +0 -91
- package/dist/protocol/rpc/define-rpc.js +0 -84
- package/dist/protocol/rpc/index.js +0 -3
- package/dist/protocol/rpc/rpc-registry.js +0 -159
- package/dist/protocol/rpc/rpc.js +0 -12
- package/dist/protocol/snapshot/index.js +0 -43
- package/dist/protocol/snapshot/snapshot-codec.js +0 -67
- package/dist/protocol/snapshot/snapshot-registry.js +0 -168
- package/dist/protocol/snapshot/snapshot.js +0 -30
- package/src/core/binary-codec/README.md +0 -60
- package/src/core/binary-codec/binary-codec.test.ts +0 -300
- package/src/core/binary-codec/binary-codec.ts +0 -448
- package/src/core/binary-codec/index.ts +0 -1
- package/src/core/driver/README.md +0 -97
- package/src/core/driver/driver.test.ts +0 -414
- package/src/core/driver/driver.ts +0 -71
- package/src/core/driver/drivers/immediate.ts +0 -66
- package/src/core/driver/drivers/index.ts +0 -3
- package/src/core/driver/drivers/raf.ts +0 -67
- package/src/core/driver/drivers/timeout.ts +0 -77
- package/src/core/driver/index.ts +0 -2
- package/src/core/events/README.md +0 -47
- package/src/core/events/event-system.test.ts +0 -243
- package/src/core/events/event-system.ts +0 -140
- package/src/core/events/index.ts +0 -1
- package/src/core/fixed-ticker/README.md +0 -77
- package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
- package/src/core/fixed-ticker/fixed-ticker.ts +0 -174
- package/src/core/fixed-ticker/index.ts +0 -1
- package/src/core/generate-id/README.md +0 -18
- package/src/core/generate-id/generate-id.test.ts +0 -79
- package/src/core/generate-id/generate-id.ts +0 -37
- package/src/core/generate-id/index.ts +0 -1
- package/src/core/index.ts +0 -10
- package/src/core/input/README.md +0 -24
- package/src/core/input/index.ts +0 -2
- package/src/core/input/manager.ts +0 -259
- package/src/core/input/sources/browser.ts +0 -39
- package/src/core/input/sources/index.ts +0 -1
- package/src/core/input/types.ts +0 -40
- package/src/core/lerp/README.md +0 -79
- package/src/core/lerp/index.ts +0 -1
- package/src/core/lerp/lerp.test.ts +0 -90
- package/src/core/lerp/lerp.ts +0 -42
- package/src/core/navmesh/README.md +0 -164
- package/src/core/navmesh/index.ts +0 -1
- package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
- package/src/core/navmesh/navmesh-workers.test.ts +0 -356
- package/src/core/navmesh/navmesh.test.ts +0 -344
- package/src/core/navmesh/navmesh.ts +0 -1047
- package/src/core/navmesh/navmesh.worker.ts +0 -147
- package/src/core/pooled-codec/README.md +0 -70
- package/src/core/pooled-codec/index.ts +0 -1
- package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
- package/src/core/pooled-codec/pooled-codec.ts +0 -504
- package/src/core/prediction/README.md +0 -64
- package/src/core/prediction/index.ts +0 -1
- package/src/core/prediction/prediction.test.ts +0 -423
- package/src/core/prediction/prediction.ts +0 -112
- package/src/ecs/README.md +0 -427
- package/src/ecs/benchmark.test.ts +0 -1645
- package/src/ecs/component-store.ts +0 -198
- package/src/ecs/component.ts +0 -90
- package/src/ecs/entity-handle.test.ts +0 -393
- package/src/ecs/entity-handle.ts +0 -563
- package/src/ecs/example.ts +0 -152
- package/src/ecs/index.ts +0 -4
- package/src/ecs/system-builder.ts +0 -404
- package/src/ecs/world-systems.ts +0 -83
- package/src/ecs/world.test.ts +0 -310
- package/src/ecs/world.ts +0 -904
- package/src/game/index.ts +0 -1
- package/src/game/loop/README.md +0 -32
- package/src/game/loop/index.ts +0 -1
- package/src/game/loop/loop.ts +0 -236
- package/src/index.ts +0 -32
- package/src/net/README.md +0 -474
- package/src/net/adapters/browser-websocket.ts +0 -86
- package/src/net/adapters/bun-websocket.ts +0 -292
- package/src/net/buffer-pool.ts +0 -106
- package/src/net/client.test.ts +0 -807
- package/src/net/client.ts +0 -695
- package/src/net/index.ts +0 -60
- package/src/net/server.test.ts +0 -799
- package/src/net/server.ts +0 -1152
- package/src/net/types.ts +0 -228
- package/src/net/validators.ts +0 -104
- package/src/protocol/README.md +0 -469
- package/src/protocol/index.ts +0 -93
- package/src/protocol/intent/define-intent.test.ts +0 -397
- package/src/protocol/intent/define-intent.ts +0 -201
- package/src/protocol/intent/index.ts +0 -94
- package/src/protocol/intent/intent-registry.test.ts +0 -198
- package/src/protocol/intent/intent-registry.ts +0 -112
- package/src/protocol/intent/intent.ts +0 -12
- package/src/protocol/rpc/define-rpc.test.ts +0 -141
- package/src/protocol/rpc/define-rpc.ts +0 -113
- package/src/protocol/rpc/index.ts +0 -3
- package/src/protocol/rpc/rpc-registry.test.ts +0 -168
- package/src/protocol/rpc/rpc-registry.ts +0 -176
- package/src/protocol/rpc/rpc.ts +0 -37
- package/src/protocol/snapshot/index.ts +0 -45
- package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
- package/src/protocol/snapshot/snapshot-codec.ts +0 -87
- package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
- package/src/protocol/snapshot/snapshot-registry.ts +0 -201
- package/src/protocol/snapshot/snapshot.test.ts +0 -76
- package/src/protocol/snapshot/snapshot.ts +0 -41
- /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/driver.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/immediate.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/index.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/raf.d.ts +0 -0
- /package/dist/{core → types/core}/driver/drivers/timeout.d.ts +0 -0
- /package/dist/{core → types/core}/driver/index.d.ts +0 -0
- /package/dist/{core → types/core}/events/index.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/browser.d.ts +0 -0
- /package/dist/{core → types/core}/input/sources/index.d.ts +0 -0
- /package/dist/{core → types/core}/input/types.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/system-builder.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
- /package/dist/{game → types/game}/index.d.ts +0 -0
- /package/dist/{game → types/game}/loop/index.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
- /package/dist/{net → types/net}/client.d.ts +0 -0
- /package/dist/{net → types/net}/server.d.ts +0 -0
- /package/dist/{net → types/net}/types.d.ts +0 -0
- /package/dist/{net → types/net}/validators.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
- /package/dist/{core/input/types.js → webgpu/types/2d/animation.test.d.ts} +0 -0
- /package/dist/{protocol/intent/intent.js → webgpu/types/2d/sprite-accessor.test.d.ts} +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnimationController — frame-by-frame spritesheet animation.
|
|
3
|
+
*
|
|
4
|
+
* Manages animation clips (sequences of sprite frames with per-frame durations)
|
|
5
|
+
* and updates sprite handles to show the current frame. Zero allocations in the
|
|
6
|
+
* update loop — all clip data is pre-allocated typed arrays.
|
|
7
|
+
*
|
|
8
|
+
* ECS-independent: works with any system that can call update() per entity.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```ts
|
|
12
|
+
* const anim = new AnimationController();
|
|
13
|
+
*
|
|
14
|
+
* const runClip = anim.loadClip({
|
|
15
|
+
* name: 'run',
|
|
16
|
+
* frames: [0, 1, 2, 3],
|
|
17
|
+
* durations: [100, 100, 100, 100],
|
|
18
|
+
* loop: true,
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* const state = anim.createState(runClip);
|
|
22
|
+
* // Each tick:
|
|
23
|
+
* anim.update(state, deltaTime, spriteHandle);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export interface AnimationClip {
|
|
27
|
+
readonly id: number;
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly frames: Uint16Array;
|
|
30
|
+
readonly durations: Float32Array;
|
|
31
|
+
readonly frameCount: number;
|
|
32
|
+
readonly totalDuration: number;
|
|
33
|
+
readonly loop: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface AnimationState {
|
|
36
|
+
clipId: number;
|
|
37
|
+
frame: number;
|
|
38
|
+
time: number;
|
|
39
|
+
speed: number;
|
|
40
|
+
playing: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface AnimationClipConfig {
|
|
43
|
+
name: string;
|
|
44
|
+
frames: number[];
|
|
45
|
+
durations: number[];
|
|
46
|
+
loop: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Minimal interface for what update() needs to set on a sprite.
|
|
50
|
+
* Matches SpriteAccessor but doesn't import it — stays decoupled.
|
|
51
|
+
*/
|
|
52
|
+
export interface Animatable {
|
|
53
|
+
setSpriteId?(id: number): void;
|
|
54
|
+
}
|
|
55
|
+
export declare class AnimationController {
|
|
56
|
+
private clips;
|
|
57
|
+
private clipsByName;
|
|
58
|
+
/**
|
|
59
|
+
* Register an animation clip. Returns the clip ID.
|
|
60
|
+
*/
|
|
61
|
+
loadClip(config: AnimationClipConfig): number;
|
|
62
|
+
/**
|
|
63
|
+
* Get a clip by name.
|
|
64
|
+
*/
|
|
65
|
+
getClipId(name: string): number;
|
|
66
|
+
/**
|
|
67
|
+
* Get a clip by ID.
|
|
68
|
+
*/
|
|
69
|
+
getClip(id: number): AnimationClip;
|
|
70
|
+
/**
|
|
71
|
+
* Create a new animation state for an entity. This is the per-entity data
|
|
72
|
+
* that tracks playback progress. Store it however you like (flat array, component, etc).
|
|
73
|
+
*/
|
|
74
|
+
createState(clipId: number, speed?: number, playing?: boolean): AnimationState;
|
|
75
|
+
/**
|
|
76
|
+
* Advance an animation state by deltaTime (in seconds).
|
|
77
|
+
* Returns the current sprite frame ID, or -1 if not playing.
|
|
78
|
+
* Zero allocations.
|
|
79
|
+
*/
|
|
80
|
+
update(state: AnimationState, deltaTime: number): number;
|
|
81
|
+
/**
|
|
82
|
+
* Play a different clip on an existing state. Resets frame and time.
|
|
83
|
+
*/
|
|
84
|
+
play(state: AnimationState, clipId: number, speed?: number): void;
|
|
85
|
+
/**
|
|
86
|
+
* Stop playback.
|
|
87
|
+
*/
|
|
88
|
+
stop(state: AnimationState): void;
|
|
89
|
+
/**
|
|
90
|
+
* Resume playback.
|
|
91
|
+
*/
|
|
92
|
+
resume(state: AnimationState): void;
|
|
93
|
+
/**
|
|
94
|
+
* Number of loaded clips.
|
|
95
|
+
*/
|
|
96
|
+
get clipCount(): number;
|
|
97
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Base2DRenderer } from 'murow/renderer';
|
|
2
|
+
import type { Renderer2DOptions, SpriteHandle, SpriteOptions, SpritesheetHandle, SpritesheetSource } from 'murow/renderer';
|
|
3
|
+
import { Camera2D } from '../camera/camera-2d';
|
|
4
|
+
import { type ParsedSpritesheet } from 'murow/renderer';
|
|
5
|
+
import { GeometryBuilder, type GeometryOptions } from '../geometry/geometry-builder';
|
|
6
|
+
import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
|
|
7
|
+
import type { PrefabBucket2D, Prefab2D } from 'murow/renderer';
|
|
8
|
+
export interface WebGPU2DRendererOptions extends Renderer2DOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Pre-loaded prefab bucket. When provided, the renderer uploads each prefab
|
|
11
|
+
* to the GPU during `init()`, and `addSprite({ prefab: bucket.get('id') })`
|
|
12
|
+
* resolves to the right spritesheet handle. The bucket must have `load()`
|
|
13
|
+
* resolved before being passed in.
|
|
14
|
+
*/
|
|
15
|
+
prefabs?: PrefabBucket2D;
|
|
16
|
+
/**
|
|
17
|
+
* How many sprite instances you intend to spawn. Used to size buffers when
|
|
18
|
+
* `maxSprites` is not given explicitly. Defaults to 1024.
|
|
19
|
+
*/
|
|
20
|
+
maxInstances?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class WebGPU2DRenderer extends Base2DRenderer {
|
|
23
|
+
private root;
|
|
24
|
+
private _device;
|
|
25
|
+
private context;
|
|
26
|
+
private _format;
|
|
27
|
+
get device(): GPUDevice;
|
|
28
|
+
get format(): GPUTextureFormat;
|
|
29
|
+
private spriteLayout;
|
|
30
|
+
private textureLayout;
|
|
31
|
+
private dynamicData;
|
|
32
|
+
private staticData;
|
|
33
|
+
private freeList;
|
|
34
|
+
private batcher;
|
|
35
|
+
private staticDirty;
|
|
36
|
+
private dynamicBuffer;
|
|
37
|
+
private staticBuffer;
|
|
38
|
+
private uniformBuffer;
|
|
39
|
+
private slotIndexBuffer;
|
|
40
|
+
private slotIndexData;
|
|
41
|
+
private rawPipeline;
|
|
42
|
+
private rawSpriteBindGroup;
|
|
43
|
+
private rawTextureLayout;
|
|
44
|
+
private rawDynamicBuffer;
|
|
45
|
+
private rawStaticBuffer;
|
|
46
|
+
private rawUniformBuffer;
|
|
47
|
+
private rawSlotIndexBuffer;
|
|
48
|
+
private sheetBindGroups;
|
|
49
|
+
private sheets;
|
|
50
|
+
private nextSheetId;
|
|
51
|
+
readonly camera: Camera2D;
|
|
52
|
+
private uniformData;
|
|
53
|
+
private resizeObserver;
|
|
54
|
+
private resizeCallbacks;
|
|
55
|
+
private readonly _prefabs;
|
|
56
|
+
constructor(canvas: HTMLCanvasElement, options: WebGPU2DRendererOptions);
|
|
57
|
+
init(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Upload every prefab in the bucket to the GPU and stash the resulting
|
|
60
|
+
* SpritesheetHandle on each prefab so `bucket.get(id)` returns something
|
|
61
|
+
* usable as a sprite source.
|
|
62
|
+
*/
|
|
63
|
+
private uploadPrefabBucket;
|
|
64
|
+
private setupResizeObserver;
|
|
65
|
+
/**
|
|
66
|
+
* Register a callback that fires when the canvas resizes.
|
|
67
|
+
* Receives the new width and height in physical pixels.
|
|
68
|
+
*/
|
|
69
|
+
onResize(callback: (width: number, height: number) => void): void;
|
|
70
|
+
loadSpritesheet(source: SpritesheetSource): Promise<SpritesheetHandle>;
|
|
71
|
+
/**
|
|
72
|
+
* Upload a previously-parsed spritesheet to the GPU. Returns a SpritesheetHandle.
|
|
73
|
+
* Splitting parse (CPU) from upload (GPU) lets callers parse spritesheets in parallel
|
|
74
|
+
* before a renderer exists.
|
|
75
|
+
*/
|
|
76
|
+
uploadParsedSpritesheet(parsed: ParsedSpritesheet): SpritesheetHandle;
|
|
77
|
+
addSprite(opts: Omit<SpriteOptions, 'sheet'> & {
|
|
78
|
+
sheet: SpritesheetHandle | Prefab2D;
|
|
79
|
+
}): SpriteHandle;
|
|
80
|
+
removeSprite(sprite: SpriteHandle): void;
|
|
81
|
+
storePreviousState(): void;
|
|
82
|
+
createGeometry(name: string, options: GeometryOptions): GeometryBuilder;
|
|
83
|
+
createCompute(name: string, options: ComputeOptions): ComputeBuilder;
|
|
84
|
+
render(alpha: number): void;
|
|
85
|
+
destroy(): void;
|
|
86
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as d from 'typegpu/data';
|
|
2
|
+
export declare function createSpriteLayout(maxSprites: number): import("typegpu").TgpuBindGroupLayout<{
|
|
3
|
+
uniforms: {
|
|
4
|
+
uniform: d.WgslStruct<{
|
|
5
|
+
viewProjection: d.Mat3x3f;
|
|
6
|
+
alpha: d.F32;
|
|
7
|
+
resolution: d.Vec2f;
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
dynamicInstances: {
|
|
11
|
+
storage: d.WgslArray<d.WgslStruct<{
|
|
12
|
+
prevX: d.F32;
|
|
13
|
+
prevY: d.F32;
|
|
14
|
+
currX: d.F32;
|
|
15
|
+
currY: d.F32;
|
|
16
|
+
prevRotation: d.F32;
|
|
17
|
+
currRotation: d.F32;
|
|
18
|
+
}>>;
|
|
19
|
+
};
|
|
20
|
+
staticInstances: {
|
|
21
|
+
storage: d.WgslArray<d.WgslStruct<{
|
|
22
|
+
scaleX: d.F32;
|
|
23
|
+
scaleY: d.F32;
|
|
24
|
+
uvMinX: d.F32;
|
|
25
|
+
uvMinY: d.F32;
|
|
26
|
+
uvMaxX: d.F32;
|
|
27
|
+
uvMaxY: d.F32;
|
|
28
|
+
layer: d.F32;
|
|
29
|
+
flipX: d.F32;
|
|
30
|
+
flipY: d.F32;
|
|
31
|
+
opacity: d.F32;
|
|
32
|
+
tintR: d.F32;
|
|
33
|
+
tintG: d.F32;
|
|
34
|
+
tintB: d.F32;
|
|
35
|
+
tintA: d.F32;
|
|
36
|
+
}>>;
|
|
37
|
+
};
|
|
38
|
+
slotIndices: {
|
|
39
|
+
storage: d.WgslArray<d.U32>;
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
export declare function createTextureLayout(): import("typegpu").TgpuBindGroupLayout<{
|
|
43
|
+
spriteTex: {
|
|
44
|
+
texture: d.WgslTexture2d<d.F32>;
|
|
45
|
+
};
|
|
46
|
+
spriteSampler: {
|
|
47
|
+
sampler: "filtering";
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
export type SpriteDataLayout = ReturnType<typeof createSpriteLayout>;
|
|
51
|
+
export type SpriteTextureLayout = ReturnType<typeof createTextureLayout>;
|
|
52
|
+
export declare function createSpriteVertex(spriteLayout: SpriteDataLayout, _textureLayout: SpriteTextureLayout): import("typegpu").TgpuVertexFn<{}, {
|
|
53
|
+
vUv: d.Vec2f;
|
|
54
|
+
vTint: d.Vec4f;
|
|
55
|
+
vOpacity: d.F32;
|
|
56
|
+
}>;
|
|
57
|
+
export declare function createSpriteFragment(_spriteLayout: SpriteDataLayout, textureLayout: SpriteTextureLayout): import("typegpu").TgpuFragmentFn<{
|
|
58
|
+
vUv: d.Vec2f;
|
|
59
|
+
vTint: d.Vec4f;
|
|
60
|
+
vOpacity: d.F32;
|
|
61
|
+
}, d.Vec4f>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { SpriteHandle } from "murow/renderer";
|
|
2
|
+
export declare class SpriteAccessor implements SpriteHandle {
|
|
3
|
+
private dynamicData;
|
|
4
|
+
private staticData;
|
|
5
|
+
private dynamicBase;
|
|
6
|
+
private staticBase;
|
|
7
|
+
private _slot;
|
|
8
|
+
private _sheetId;
|
|
9
|
+
private _onStaticDirty;
|
|
10
|
+
constructor(dynamicData: Float32Array, staticData: Float32Array, slot: number, sheetId: number, onStaticDirty: () => void);
|
|
11
|
+
get slot(): number;
|
|
12
|
+
get sheetId(): number;
|
|
13
|
+
get x(): number;
|
|
14
|
+
set x(v: number);
|
|
15
|
+
get y(): number;
|
|
16
|
+
set y(v: number);
|
|
17
|
+
get prevX(): number;
|
|
18
|
+
get prevY(): number;
|
|
19
|
+
get rotation(): number;
|
|
20
|
+
set rotation(v: number);
|
|
21
|
+
get prevRotation(): number;
|
|
22
|
+
/**
|
|
23
|
+
* Store current position/rotation as previous (called before tick).
|
|
24
|
+
*/
|
|
25
|
+
storePrevious(): void;
|
|
26
|
+
get scaleX(): number;
|
|
27
|
+
set scaleX(v: number);
|
|
28
|
+
get scaleY(): number;
|
|
29
|
+
set scaleY(v: number);
|
|
30
|
+
get layer(): number;
|
|
31
|
+
set layer(v: number);
|
|
32
|
+
get flipX(): boolean;
|
|
33
|
+
set flipX(v: boolean);
|
|
34
|
+
get flipY(): boolean;
|
|
35
|
+
set flipY(v: boolean);
|
|
36
|
+
get opacity(): number;
|
|
37
|
+
set opacity(v: number);
|
|
38
|
+
get tintR(): number;
|
|
39
|
+
get tintG(): number;
|
|
40
|
+
get tintB(): number;
|
|
41
|
+
get tintA(): number;
|
|
42
|
+
setTint(r: number, g: number, b: number, a?: number): void;
|
|
43
|
+
get uvMinX(): number;
|
|
44
|
+
get uvMinY(): number;
|
|
45
|
+
get uvMaxX(): number;
|
|
46
|
+
get uvMaxY(): number;
|
|
47
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridges the bucket's `clips-changed` events to per-skin resync work in the
|
|
3
|
+
* renderer. The renderer registers `prefabId → skinIndex` at upload time;
|
|
4
|
+
* subsequent events flag affected skins in a pending set the renderer drains
|
|
5
|
+
* each frame.
|
|
6
|
+
*/
|
|
7
|
+
import type { PrefabBucket } from 'murow';
|
|
8
|
+
export declare class GltfClipResyncCoordinator {
|
|
9
|
+
private bucket;
|
|
10
|
+
private readonly skinIndexByPrefabId;
|
|
11
|
+
private readonly _pending;
|
|
12
|
+
constructor(bucket: PrefabBucket);
|
|
13
|
+
/** Map a prefab id to its index in the renderer's `skinnedModels` list. */
|
|
14
|
+
registerSkin(prefabId: string, skinIndex: number): void;
|
|
15
|
+
/** Skin indices whose clip set has changed since the last `clear()`. */
|
|
16
|
+
get pending(): ReadonlySet<number>;
|
|
17
|
+
clear(): void;
|
|
18
|
+
/** Unsubscribe from the bucket and reset its animation clip sets. */
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MorphAnimation — keyframe-based vertex animation for 3D meshes.
|
|
3
|
+
*
|
|
4
|
+
* Stores multiple vertex position snapshots (morph targets) per model.
|
|
5
|
+
* Each instance has a float `morphTime` that determines which two keyframes
|
|
6
|
+
* to blend and by how much. The blending happens CPU-side by writing
|
|
7
|
+
* interpolated positions into the model's vertex buffer.
|
|
8
|
+
*
|
|
9
|
+
* This is simpler than GPU-side blending (no shader changes needed) and
|
|
10
|
+
* works well for small-to-medium meshes with few keyframes.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* const morph = new MorphAnimation();
|
|
15
|
+
*
|
|
16
|
+
* // Load keyframes (each is a flat Float32Array of positions)
|
|
17
|
+
* const clipId = morph.loadClip({
|
|
18
|
+
* name: 'walk',
|
|
19
|
+
* keyframes: [frame0Positions, frame1Positions, frame2Positions],
|
|
20
|
+
* durations: [100, 100, 100],
|
|
21
|
+
* loop: true,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* const state = morph.createState(clipId);
|
|
25
|
+
*
|
|
26
|
+
* // Each tick: advance time, get interpolated positions
|
|
27
|
+
* morph.update(state, deltaTime, outputPositions);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export interface MorphClip {
|
|
31
|
+
readonly id: number;
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly keyframes: Float32Array[];
|
|
34
|
+
readonly durations: Float32Array;
|
|
35
|
+
readonly frameCount: number;
|
|
36
|
+
readonly totalDuration: number;
|
|
37
|
+
readonly loop: boolean;
|
|
38
|
+
readonly vertexCount: number;
|
|
39
|
+
}
|
|
40
|
+
export interface MorphState {
|
|
41
|
+
clipId: number;
|
|
42
|
+
time: number;
|
|
43
|
+
speed: number;
|
|
44
|
+
playing: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface MorphClipConfig {
|
|
47
|
+
name: string;
|
|
48
|
+
keyframes: Float32Array[];
|
|
49
|
+
durations: number[];
|
|
50
|
+
loop: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare class MorphAnimation {
|
|
53
|
+
private clips;
|
|
54
|
+
private clipsByName;
|
|
55
|
+
loadClip(config: MorphClipConfig): number;
|
|
56
|
+
getClipId(name: string): number;
|
|
57
|
+
getClip(id: number): MorphClip;
|
|
58
|
+
createState(clipId: number, speed?: number, playing?: boolean): MorphState;
|
|
59
|
+
/**
|
|
60
|
+
* Advance time and write interpolated vertex positions into `output`.
|
|
61
|
+
* Output must be a Float32Array of vertexCount * 3 floats.
|
|
62
|
+
* Zero allocations.
|
|
63
|
+
*/
|
|
64
|
+
update(state: MorphState, deltaTime: number, output: Float32Array): void;
|
|
65
|
+
play(state: MorphState, clipId: number, speed?: number): void;
|
|
66
|
+
stop(state: MorphState): void;
|
|
67
|
+
resume(state: MorphState): void;
|
|
68
|
+
get clipCount(): number;
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Base3DRenderer } from 'murow/renderer';
|
|
2
|
+
import type { Renderer3DOptions } from 'murow/renderer';
|
|
3
|
+
import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
|
|
4
|
+
import { Camera3D } from '../camera/camera-3d';
|
|
5
|
+
import { type ParsedGltf, type PrefabBucket3D, type Prefab3D, type PlayOptions } from 'murow/renderer';
|
|
6
|
+
export interface ModelData {
|
|
7
|
+
positions: Float32Array;
|
|
8
|
+
normals?: Float32Array;
|
|
9
|
+
uvs?: Float32Array;
|
|
10
|
+
indices?: Uint16Array | Uint32Array;
|
|
11
|
+
texture?: ImageBitmap;
|
|
12
|
+
}
|
|
13
|
+
export interface ModelHandle {
|
|
14
|
+
readonly id: number;
|
|
15
|
+
readonly vertexCount: number;
|
|
16
|
+
readonly indexCount: number;
|
|
17
|
+
readonly skinned: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface MeshInstanceHandle {
|
|
20
|
+
readonly slot: number;
|
|
21
|
+
readonly modelId: number;
|
|
22
|
+
readonly skinned: boolean;
|
|
23
|
+
setPosition(x: number, y: number, z: number): void;
|
|
24
|
+
setRotation(x: number, y: number, z: number): void;
|
|
25
|
+
setScale(x: number, y: number, z: number): void;
|
|
26
|
+
play?(name: string, opts?: PlayOptions): void;
|
|
27
|
+
stop?(): void;
|
|
28
|
+
}
|
|
29
|
+
/** A loaded glTF model — may contain multiple mesh parts that share a skeleton. */
|
|
30
|
+
export interface GltfModel {
|
|
31
|
+
readonly parts: ModelHandle[];
|
|
32
|
+
readonly totalVertexCount: number;
|
|
33
|
+
readonly skinned: boolean;
|
|
34
|
+
/** Animation clip names available on this model (empty if not skinned). */
|
|
35
|
+
readonly animations: string[];
|
|
36
|
+
/** Source URL this model was loaded from. */
|
|
37
|
+
readonly src: string;
|
|
38
|
+
}
|
|
39
|
+
/** Handle to a spawned instance (single primitive or multi-part glTF). */
|
|
40
|
+
export interface InstanceHandle {
|
|
41
|
+
setPosition(x: number, y: number, z: number): void;
|
|
42
|
+
setRotation(x: number, y: number, z: number): void;
|
|
43
|
+
setScale(x: number, y: number, z: number): void;
|
|
44
|
+
play?(name: string, opts?: PlayOptions): void;
|
|
45
|
+
stop?(): void;
|
|
46
|
+
readonly skinned: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface MeshInstanceOptions {
|
|
49
|
+
/**
|
|
50
|
+
* The model to instance. Either a renderer-internal handle (from `loadGltf`,
|
|
51
|
+
* `loadModel`, `createGrid`) or a prefab fetched from a `PrefabBucket3D` —
|
|
52
|
+
* `bucket.get('my-id')`.
|
|
53
|
+
*/
|
|
54
|
+
model: ModelHandle | GltfModel | Prefab3D;
|
|
55
|
+
/** World position. Defaults to `[0, 0, 0]`. */
|
|
56
|
+
position?: readonly [x: number, y: number, z: number];
|
|
57
|
+
/** Euler rotation in radians. Defaults to `[0, 0, 0]`. */
|
|
58
|
+
rotation?: readonly [x: number, y: number, z: number];
|
|
59
|
+
/** Per-axis scale. Pass a single number to scale uniformly. Defaults to `[1, 1, 1]`. */
|
|
60
|
+
scale?: number | readonly [x: number, y: number, z: number];
|
|
61
|
+
/** Tint color RGB. Defaults to `[1, 1, 1]`. */
|
|
62
|
+
color?: readonly [r: number, g: number, b: number];
|
|
63
|
+
}
|
|
64
|
+
export interface WebGPU3DRendererOptions extends Renderer3DOptions {
|
|
65
|
+
maxSkinnedInstances?: number;
|
|
66
|
+
maxBonesPerSkin?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Pre-loaded prefab bucket. When provided, the renderer self-sizes its
|
|
69
|
+
* skinned-instance + bone buffers from the bucket's prefab stats, and
|
|
70
|
+
* uploads each prefab to the GPU during `init()`. The bucket must have
|
|
71
|
+
* `load()` resolved before being passed in.
|
|
72
|
+
*
|
|
73
|
+
* `maxSkinnedInstances` defaults to `maxInstances * maxSkinnedPartsPerPrefab`.
|
|
74
|
+
* `maxBonesPerSkin` defaults to the maximum joint count across all prefabs.
|
|
75
|
+
*/
|
|
76
|
+
prefabs?: PrefabBucket3D;
|
|
77
|
+
/**
|
|
78
|
+
* How many instances you intend to spawn. Used together with `prefabs` to
|
|
79
|
+
* size the skinned-instance budget. Ignored if `maxSkinnedInstances` is set
|
|
80
|
+
* explicitly. Defaults to `maxModels` when only `prefabs` is provided.
|
|
81
|
+
*/
|
|
82
|
+
maxInstances?: number;
|
|
83
|
+
}
|
|
84
|
+
export declare class WebGPU3DRenderer extends Base3DRenderer {
|
|
85
|
+
private root;
|
|
86
|
+
private device;
|
|
87
|
+
private context;
|
|
88
|
+
private resizeObserver;
|
|
89
|
+
private resizeCallbacks;
|
|
90
|
+
private format;
|
|
91
|
+
private meshLayout;
|
|
92
|
+
private dynamicData;
|
|
93
|
+
private staticData;
|
|
94
|
+
private slotIndexData;
|
|
95
|
+
private freeList;
|
|
96
|
+
private batcher;
|
|
97
|
+
private staticDirty;
|
|
98
|
+
private instanceModelIds;
|
|
99
|
+
private dynamicBuffer;
|
|
100
|
+
private staticBuffer;
|
|
101
|
+
private uniformBuffer;
|
|
102
|
+
private slotIndexBuffer;
|
|
103
|
+
private rawPipeline;
|
|
104
|
+
private rawBindGroup;
|
|
105
|
+
private rawDynamicBuffer;
|
|
106
|
+
private rawStaticBuffer;
|
|
107
|
+
private rawUniformBuffer;
|
|
108
|
+
private rawSlotIndexBuffer;
|
|
109
|
+
private depthTexture;
|
|
110
|
+
private rawTexturedPipeline;
|
|
111
|
+
private models;
|
|
112
|
+
private nextModelId;
|
|
113
|
+
private skinnedModels;
|
|
114
|
+
private clipResync;
|
|
115
|
+
private skinnedMeshLayout;
|
|
116
|
+
private rawSkinnedPipeline;
|
|
117
|
+
private rawSkinnedTexturedPipeline;
|
|
118
|
+
private rawSkinnedBindGroup;
|
|
119
|
+
private boneMatrixData;
|
|
120
|
+
private rawBoneMatrixBuffer;
|
|
121
|
+
private boneMatrixDirty;
|
|
122
|
+
private readonly maxTotalBones;
|
|
123
|
+
private packedAnimData;
|
|
124
|
+
private animComputeKernel;
|
|
125
|
+
private animComputeNeedsRebuild;
|
|
126
|
+
private animKernelBudgets;
|
|
127
|
+
private animClipTableOffset;
|
|
128
|
+
private animChannelTableOffset;
|
|
129
|
+
private animJointLookupOffset;
|
|
130
|
+
private gpuAnimInstanceStates;
|
|
131
|
+
private gpuInstData;
|
|
132
|
+
private gpuInstDV;
|
|
133
|
+
private skinnedDynamicData;
|
|
134
|
+
private skinnedStaticData;
|
|
135
|
+
private skinnedSlotIndexData;
|
|
136
|
+
private skinnedFreeList;
|
|
137
|
+
private skinnedBatcher;
|
|
138
|
+
private skinnedStaticDirty;
|
|
139
|
+
private skinnedInstanceModelIds;
|
|
140
|
+
private skinnedInstanceBoneOffsets;
|
|
141
|
+
private skinnedAnimStates;
|
|
142
|
+
private nextBoneOffset;
|
|
143
|
+
private readonly maxSkinnedInstances;
|
|
144
|
+
private readonly maxBonesPerSkin;
|
|
145
|
+
private rawSkinnedDynamicBuffer;
|
|
146
|
+
private rawSkinnedStaticBuffer;
|
|
147
|
+
private rawSkinnedUniformBuffer;
|
|
148
|
+
private rawSkinnedSlotIndexBuffer;
|
|
149
|
+
private frustumPlanes;
|
|
150
|
+
readonly camera: Camera3D;
|
|
151
|
+
private uniformData;
|
|
152
|
+
private lastRenderTime;
|
|
153
|
+
private readonly _prefabs;
|
|
154
|
+
constructor(canvas: HTMLCanvasElement, options: WebGPU3DRendererOptions);
|
|
155
|
+
init(): Promise<void>;
|
|
156
|
+
/**
|
|
157
|
+
* Upload every prefab in the bucket to the GPU and stash the handle on
|
|
158
|
+
* each prefab so `bucket.get(id)` resolves to a usable model. Also
|
|
159
|
+
* subscribes the resync coordinator to the bucket's `clips-changed`
|
|
160
|
+
* channel for lazy load/unload.
|
|
161
|
+
*/
|
|
162
|
+
private uploadPrefabBucket;
|
|
163
|
+
private setupResizeObserver;
|
|
164
|
+
/**
|
|
165
|
+
* Register a callback that fires when the canvas resizes.
|
|
166
|
+
* Receives the new width and height in physical pixels.
|
|
167
|
+
*/
|
|
168
|
+
onResize(callback: (width: number, height: number) => void): void;
|
|
169
|
+
createCompute(name: string, options: ComputeOptions): ComputeBuilder;
|
|
170
|
+
/**
|
|
171
|
+
* Create a flat grid mesh on the XZ plane at Y=0.
|
|
172
|
+
*
|
|
173
|
+
* ```ts
|
|
174
|
+
* const grid = renderer.createGrid({ size: 20, step: 1, lineWidth: 0.005 });
|
|
175
|
+
* renderer.addInstance({ model: grid, color: [0.3, 0.3, 0.3] });
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
createGrid(opts?: {
|
|
179
|
+
size?: number;
|
|
180
|
+
step?: number;
|
|
181
|
+
lineWidth?: number;
|
|
182
|
+
}): ModelHandle;
|
|
183
|
+
/**
|
|
184
|
+
* Register a model. Returns a handle for addInstance().
|
|
185
|
+
*
|
|
186
|
+
* ```ts
|
|
187
|
+
* const hero = renderer.loadModel({
|
|
188
|
+
* positions: new Float32Array([...]),
|
|
189
|
+
* normals: new Float32Array([...]), // optional — auto-computed from faces
|
|
190
|
+
* uvs: new Float32Array([...]), // optional
|
|
191
|
+
* indices: new Uint16Array([...]), // optional
|
|
192
|
+
* texture: myImageBitmap, // optional
|
|
193
|
+
* });
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
loadModel(data: ModelData): ModelHandle;
|
|
197
|
+
/**
|
|
198
|
+
* Register a skinned model with joint/weight vertex data.
|
|
199
|
+
* Called internally by loadGltf when a skin is detected.
|
|
200
|
+
*/
|
|
201
|
+
private loadSkinnedModel;
|
|
202
|
+
/**
|
|
203
|
+
* Auto-compute flat normals from triangle faces.
|
|
204
|
+
*/
|
|
205
|
+
private computeNormals;
|
|
206
|
+
/**
|
|
207
|
+
* Load a glTF/GLB model from a URL. Returns one ModelHandle per primitive.
|
|
208
|
+
* Most models have multiple primitives (body parts, material groups, etc.).
|
|
209
|
+
*
|
|
210
|
+
* ```ts
|
|
211
|
+
* const model = await renderer.loadGltf('assets/hero.glb');
|
|
212
|
+
* const instance = renderer.addInstance({ model, x: 0, y: 0, z: 0 });
|
|
213
|
+
* instance.playAnimation?.('walk');
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
loadGltf(url: string, opts?: {
|
|
217
|
+
animations?: string[];
|
|
218
|
+
}): Promise<GltfModel>;
|
|
219
|
+
/**
|
|
220
|
+
* Upload a previously-parsed glTF to the GPU. Returns a GltfModel handle.
|
|
221
|
+
* Splitting parse (CPU) from upload (GPU) lets callers parse models in parallel
|
|
222
|
+
* before a renderer exists and inspect joint counts / vertex totals to size the
|
|
223
|
+
* renderer appropriately.
|
|
224
|
+
*/
|
|
225
|
+
uploadParsedGltf(parsed: ParsedGltf): GltfModel;
|
|
226
|
+
/**
|
|
227
|
+
* Add an instance. For skinned models, pass `linkedTo` to share bone matrices
|
|
228
|
+
* with another instance (e.g., when spawning all parts of a character).
|
|
229
|
+
*/
|
|
230
|
+
addInstance(opts: MeshInstanceOptions): InstanceHandle;
|
|
231
|
+
private addGltfInstance;
|
|
232
|
+
private addSkinnedInstance;
|
|
233
|
+
/**
|
|
234
|
+
* Drain pending resyncs from the coordinator. Per affected skin: rebuild
|
|
235
|
+
* its `SkeletalAnimation` clip list densely, remap in-flight animStates,
|
|
236
|
+
* then full-repack `packedAnimData`. Falls back to a kernel rebuild only
|
|
237
|
+
* when the new data exceeds the kernel's allocated budgets.
|
|
238
|
+
*
|
|
239
|
+
* The dense renumbering is load-bearing: the kernel reads each clip by
|
|
240
|
+
* its per-skin index, which must equal `SkeletalAnimation`'s clip id.
|
|
241
|
+
*/
|
|
242
|
+
private syncLazyAnimationChanges;
|
|
243
|
+
/** Doubling-growth budgets for kernel storage buffers, with sensible floors. */
|
|
244
|
+
private growBudgetsForPacked;
|
|
245
|
+
/** Upload `packedAnimData` to the existing kernel iff it fits the current budgets. Returns false to force a rebuild. */
|
|
246
|
+
private tryUploadInPlace;
|
|
247
|
+
/**
|
|
248
|
+
* Update skeletal animations for all skinned instances. Call once per tick.
|
|
249
|
+
*/
|
|
250
|
+
private updatedBoneOffsets;
|
|
251
|
+
private updateAnimations;
|
|
252
|
+
removeInstance(handle: MeshInstanceHandle): void;
|
|
253
|
+
storePreviousState(): void;
|
|
254
|
+
render(alpha: number): void;
|
|
255
|
+
/**
|
|
256
|
+
* Extract 6 frustum planes from a column-major VP matrix.
|
|
257
|
+
* Each plane is [a, b, c, d] where ax + by + cz + d >= 0 means inside.
|
|
258
|
+
*/
|
|
259
|
+
private extractFrustumPlanes;
|
|
260
|
+
/**
|
|
261
|
+
* Test if a bounding sphere is inside or intersects the frustum.
|
|
262
|
+
* Returns true if visible (should be drawn).
|
|
263
|
+
*/
|
|
264
|
+
private isInFrustum;
|
|
265
|
+
destroy(): void;
|
|
266
|
+
}
|