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
|
@@ -4,12 +4,12 @@ import { InputManager } from "../../core/input";
|
|
|
4
4
|
* GameLoop class that manages the main game loop with tick events and optional rendering.
|
|
5
5
|
* It supports both client and server types, emitting appropriate events for both.
|
|
6
6
|
*/
|
|
7
|
-
export declare class GameLoop<T extends
|
|
8
|
-
options: GameLoopOptions
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
-
private _driver;
|
|
7
|
+
export declare class GameLoop<T extends GameLoopType = DriverType> {
|
|
8
|
+
options: GameLoopOptions<T>;
|
|
9
|
+
private _driver?;
|
|
12
10
|
private _input;
|
|
11
|
+
private readonly _isClient;
|
|
12
|
+
private readonly _isManual;
|
|
13
13
|
/**
|
|
14
14
|
* FixedTicker instance that handles tick timing and updates.
|
|
15
15
|
*/
|
|
@@ -17,7 +17,7 @@ export declare class GameLoop<T extends DriverType = DriverType> {
|
|
|
17
17
|
/**
|
|
18
18
|
* Event emitter system for the game loop, emitting various lifecycle events.
|
|
19
19
|
*/
|
|
20
|
-
events:
|
|
20
|
+
events: EventSystem<BaseEvents> & T extends ClientLike ? EventSystem<ClientEvents> : EventSystem<ServerEvents>;
|
|
21
21
|
/**
|
|
22
22
|
* Current frames per second (FPS) measurement.
|
|
23
23
|
*/
|
|
@@ -25,10 +25,12 @@ export declare class GameLoop<T extends DriverType = DriverType> {
|
|
|
25
25
|
/**
|
|
26
26
|
* Current status of the game loop: 'running', 'paused', or 'stopped'.
|
|
27
27
|
*/
|
|
28
|
-
status:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
status: "running" | "paused" | "stopped";
|
|
29
|
+
private _tickData;
|
|
30
|
+
private _skipData;
|
|
31
|
+
private _renderData;
|
|
32
|
+
constructor(options: GameLoopOptions<T>);
|
|
33
|
+
step(deltaTime: number): void;
|
|
32
34
|
/**
|
|
33
35
|
* Pauses the game ticker and emits a 'toggle-pause' event.
|
|
34
36
|
*/
|
|
@@ -46,15 +48,15 @@ export declare class GameLoop<T extends DriverType = DriverType> {
|
|
|
46
48
|
*/
|
|
47
49
|
stop(): void;
|
|
48
50
|
}
|
|
49
|
-
interface GameLoopOptions {
|
|
51
|
+
interface GameLoopOptions<T extends GameLoopType> {
|
|
50
52
|
tickRate: number;
|
|
51
|
-
type:
|
|
52
|
-
onTick?: (dt: number, tick: number, input: ReturnType<InputManager[
|
|
53
|
-
onRender?: (dt: number, alpha: number, input: ReturnType<InputManager[
|
|
53
|
+
type: T;
|
|
54
|
+
onTick?: (dt: number, tick: number, input: ReturnType<InputManager["snapshot"]>) => void;
|
|
55
|
+
onRender?: (dt: number, alpha: number, input: ReturnType<InputManager["peek"]>) => void;
|
|
54
56
|
}
|
|
55
57
|
type BaseEvents = [
|
|
56
58
|
[
|
|
57
|
-
|
|
59
|
+
"start",
|
|
58
60
|
{
|
|
59
61
|
/**
|
|
60
62
|
* Timestamp when the loop was started.
|
|
@@ -63,7 +65,7 @@ type BaseEvents = [
|
|
|
63
65
|
}
|
|
64
66
|
],
|
|
65
67
|
[
|
|
66
|
-
|
|
68
|
+
"pre-tick",
|
|
67
69
|
{
|
|
68
70
|
/**
|
|
69
71
|
* Current tick number.
|
|
@@ -78,11 +80,11 @@ type BaseEvents = [
|
|
|
78
80
|
*
|
|
79
81
|
* **Only available in client loops.**
|
|
80
82
|
*/
|
|
81
|
-
input: ReturnType<InputManager[
|
|
83
|
+
input: ReturnType<InputManager["snapshot"]>;
|
|
82
84
|
}
|
|
83
85
|
],
|
|
84
86
|
[
|
|
85
|
-
|
|
87
|
+
"tick",
|
|
86
88
|
{
|
|
87
89
|
/**
|
|
88
90
|
* Current tick number.
|
|
@@ -97,15 +99,15 @@ type BaseEvents = [
|
|
|
97
99
|
*
|
|
98
100
|
* **Only available in client loops.**
|
|
99
101
|
*/
|
|
100
|
-
input: ReturnType<InputManager[
|
|
102
|
+
input: ReturnType<InputManager["snapshot"]>;
|
|
101
103
|
}
|
|
102
104
|
],
|
|
103
105
|
[
|
|
104
|
-
|
|
106
|
+
"post-tick",
|
|
105
107
|
{
|
|
106
108
|
/**
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
* Current tick number.
|
|
110
|
+
*/
|
|
109
111
|
tick: number;
|
|
110
112
|
/**
|
|
111
113
|
* Delta time since the last tick.
|
|
@@ -116,11 +118,11 @@ type BaseEvents = [
|
|
|
116
118
|
*
|
|
117
119
|
* **Only available in client loops.**
|
|
118
120
|
*/
|
|
119
|
-
input: ReturnType<InputManager[
|
|
121
|
+
input: ReturnType<InputManager["snapshot"]>;
|
|
120
122
|
}
|
|
121
123
|
],
|
|
122
124
|
[
|
|
123
|
-
|
|
125
|
+
"skip",
|
|
124
126
|
{
|
|
125
127
|
/**
|
|
126
128
|
* Number of ticks that were skipped.
|
|
@@ -129,7 +131,7 @@ type BaseEvents = [
|
|
|
129
131
|
}
|
|
130
132
|
],
|
|
131
133
|
[
|
|
132
|
-
|
|
134
|
+
"stop",
|
|
133
135
|
{
|
|
134
136
|
/**
|
|
135
137
|
* Timestamp when the loop was stopped.
|
|
@@ -138,7 +140,7 @@ type BaseEvents = [
|
|
|
138
140
|
}
|
|
139
141
|
],
|
|
140
142
|
[
|
|
141
|
-
|
|
143
|
+
"toggle-pause",
|
|
142
144
|
{
|
|
143
145
|
/**
|
|
144
146
|
* Current paused state of the loop.
|
|
@@ -158,14 +160,16 @@ type BaseEvents = [
|
|
|
158
160
|
type ClientEvents = [
|
|
159
161
|
...BaseEvents,
|
|
160
162
|
[
|
|
161
|
-
|
|
163
|
+
"render",
|
|
162
164
|
{
|
|
163
165
|
deltaTime: number;
|
|
164
166
|
alpha: number;
|
|
165
|
-
input: ReturnType<InputManager[
|
|
167
|
+
input: ReturnType<InputManager["peek"]>;
|
|
166
168
|
}
|
|
167
169
|
]
|
|
168
170
|
];
|
|
169
171
|
type ServerEvents = BaseEvents;
|
|
170
|
-
type
|
|
172
|
+
type Manual = "manual-client" | "manual-server";
|
|
173
|
+
type ClientLike = "client" | "manual-client";
|
|
174
|
+
export type GameLoopType = DriverType | Manual;
|
|
171
175
|
export {};
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
|
-
* import { ServerNetwork, ClientNetwork } from '
|
|
18
|
-
* import { BunWebSocketServerTransport } from '
|
|
17
|
+
* import { ServerNetwork, ClientNetwork } from 'murow/net';
|
|
18
|
+
* import { BunWebSocketServerTransport } from 'murow/net/transports/bun-websocket';
|
|
19
19
|
* import { IntentRegistry, SnapshotRegistry } from '@mococa/protocol';
|
|
20
20
|
*
|
|
21
21
|
* // Server setup
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for 2D renderers. Defines the sprite-based rendering API.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseRenderer } from "./renderer";
|
|
5
|
+
import type { Camera2DState, Renderer2DOptions, SpriteHandle, SpriteOptions, SpritesheetHandle, SpritesheetSource } from "../types";
|
|
6
|
+
export declare abstract class Base2DRenderer extends BaseRenderer<Renderer2DOptions> {
|
|
7
|
+
readonly maxSprites: number;
|
|
8
|
+
abstract readonly camera: Camera2DState;
|
|
9
|
+
constructor(canvas: HTMLCanvasElement, options: Renderer2DOptions);
|
|
10
|
+
abstract loadSpritesheet(source: SpritesheetSource): Promise<SpritesheetHandle>;
|
|
11
|
+
abstract addSprite(options: SpriteOptions): SpriteHandle;
|
|
12
|
+
abstract removeSprite(sprite: SpriteHandle): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for 3D renderers. Defines the model/instance-based rendering API.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseRenderer } from "./renderer";
|
|
5
|
+
import type { Camera3DState, Renderer3DOptions } from "../types";
|
|
6
|
+
export declare abstract class Base3DRenderer extends BaseRenderer<Renderer3DOptions> {
|
|
7
|
+
readonly maxModels: number;
|
|
8
|
+
abstract readonly camera: Camera3DState;
|
|
9
|
+
constructor(canvas: HTMLCanvasElement, options: Renderer3DOptions);
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for all renderers. Provides lifecycle and canvas management.
|
|
3
|
+
*/
|
|
4
|
+
import type { ClearColor, RendererOptions } from "../types";
|
|
5
|
+
export declare abstract class BaseRenderer<TOptions extends RendererOptions = RendererOptions> {
|
|
6
|
+
readonly canvas: HTMLCanvasElement;
|
|
7
|
+
protected readonly options: TOptions;
|
|
8
|
+
protected _clearColor: ClearColor;
|
|
9
|
+
protected _width: number;
|
|
10
|
+
protected _height: number;
|
|
11
|
+
protected _initialized: boolean;
|
|
12
|
+
constructor(canvas: HTMLCanvasElement, options: TOptions);
|
|
13
|
+
get clearColor(): ClearColor;
|
|
14
|
+
set clearColor(value: ClearColor);
|
|
15
|
+
get width(): number;
|
|
16
|
+
get height(): number;
|
|
17
|
+
get initialized(): boolean;
|
|
18
|
+
abstract init(): Promise<void>;
|
|
19
|
+
abstract render(alpha: number): void;
|
|
20
|
+
abstract destroy(): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure glTF parsing helpers — container decoding, primitive extraction, and
|
|
3
|
+
* transform baking. No fetch, no GPU, no closure state.
|
|
4
|
+
*/
|
|
5
|
+
import type { SkinData, AccessorReader } from './skin-parser';
|
|
6
|
+
/**
|
|
7
|
+
* Decode a fetched glTF payload — either a JSON .gltf or a binary .glb container —
|
|
8
|
+
* into the parsed JSON object and (for .glb) the embedded binary chunk.
|
|
9
|
+
*/
|
|
10
|
+
export declare function decodeGltfContainer(arrayBuffer: ArrayBuffer, url: string): {
|
|
11
|
+
gltf: any;
|
|
12
|
+
glbBinaryChunk: ArrayBuffer | null;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Validate that every skin referenced by a mesh node is equivalent to the
|
|
16
|
+
* canonical skin (same joint nodes in any order, same IBMs) and build a joint
|
|
17
|
+
* remap from each non-canonical skin's index space into canonical's.
|
|
18
|
+
*
|
|
19
|
+
* Throws if any skin is structurally incompatible — truly independent skeletons
|
|
20
|
+
* in one file are not supported yet.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateAndBuildSkinRemaps(gltf: any, canonicalSkinIndex: number, skinData: SkinData, skinJointRemaps: Map<number, Uint16Array>, getAccessorData: AccessorReader): void;
|
|
23
|
+
/** Remap a primitive's joint indices into canonical joint space, if needed. */
|
|
24
|
+
export declare function remapSkinAttributes(attrs: {
|
|
25
|
+
joints: Uint16Array;
|
|
26
|
+
weights: Float32Array;
|
|
27
|
+
}, meshSkinIndex: number | undefined, canonicalSkinIndex: number | undefined, skinJointRemaps: Map<number, Uint16Array>): {
|
|
28
|
+
joints: Uint16Array;
|
|
29
|
+
weights: Float32Array;
|
|
30
|
+
};
|
|
31
|
+
/** Extract per-primitive vertex attributes (positions, normals, UVs, indices) from glTF accessors. */
|
|
32
|
+
export declare function extractPrimitiveAttributes(primitive: any, getAccessorData: AccessorReader): {
|
|
33
|
+
positions: Float32Array;
|
|
34
|
+
normals: Float32Array | undefined;
|
|
35
|
+
uvs: Float32Array | undefined;
|
|
36
|
+
indices: Uint16Array | Uint32Array | undefined;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Bake a column-major mat4 into positions (in place) and re-orient + renormalize
|
|
40
|
+
* normals. Used to fold a non-skinned mesh node's transform into its vertices
|
|
41
|
+
* so the renderer doesn't need to know about per-mesh node transforms.
|
|
42
|
+
*/
|
|
43
|
+
export declare function bakeTransformIntoVertices(positions: Float32Array, normals: Float32Array | undefined, mm: Float32Array): void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SkinData, type AnimationClipData, type PrimitiveSkinAttributes } from './skin-parser';
|
|
2
|
+
/** Per-primitive CPU data ready for upload. */
|
|
3
|
+
export interface ParsedGltfPrimitive {
|
|
4
|
+
positions: Float32Array;
|
|
5
|
+
normals?: Float32Array;
|
|
6
|
+
uvs?: Float32Array;
|
|
7
|
+
indices?: Uint16Array | Uint32Array;
|
|
8
|
+
texture?: ImageBitmap;
|
|
9
|
+
/** Present iff the primitive belongs to a skinned mesh. */
|
|
10
|
+
skinAttrs?: PrimitiveSkinAttributes;
|
|
11
|
+
/** True iff this primitive should be loaded as a skinned model. */
|
|
12
|
+
skinned: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Retained parser state for decoding more clips after the initial `parseGltf`.
|
|
16
|
+
* Null when the spec opted out via `freezeAnimations: true`.
|
|
17
|
+
*/
|
|
18
|
+
export interface ParsedGltfSource {
|
|
19
|
+
readonly availableAnimations: readonly string[];
|
|
20
|
+
/** Returns null if the clip has no channels targeting joints in this skin. Throws on unknown name. */
|
|
21
|
+
decodeAnimation(name: string): AnimationClipData | null;
|
|
22
|
+
}
|
|
23
|
+
/** Skin + filtered animation clips. Mutated by lazy `loadAnimations` / `unloadAnimations`. */
|
|
24
|
+
export interface ParsedGltfSkin {
|
|
25
|
+
data: SkinData;
|
|
26
|
+
animClips: AnimationClipData[];
|
|
27
|
+
}
|
|
28
|
+
/** CPU-side result of parsing a glTF / glb URL. */
|
|
29
|
+
export interface ParsedGltf {
|
|
30
|
+
/** Source URL the model was loaded from. */
|
|
31
|
+
src: string;
|
|
32
|
+
/** One entry per primitive that should become a model part. */
|
|
33
|
+
primitives: ParsedGltfPrimitive[];
|
|
34
|
+
/** Skin + filtered animation clips, or null if the model has no skin. */
|
|
35
|
+
skin: ParsedGltfSkin | null;
|
|
36
|
+
/** Retained parser state for lazy clip decoding. Null when the spec passed `freezeAnimations: true`. */
|
|
37
|
+
source: ParsedGltfSource | null;
|
|
38
|
+
}
|
|
39
|
+
export interface ParseGltfOptions {
|
|
40
|
+
/** Whitelist of clip names to keep. */
|
|
41
|
+
animations?: string[];
|
|
42
|
+
/** Release the source JSON + accessor reader after parse. Disables lazy load. */
|
|
43
|
+
freezeAnimations?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse a glTF / .glb file from a URL into CPU-side data.
|
|
47
|
+
* Does no GPU work. Safe to call in parallel; safe to call before a renderer exists.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseGltf(url: string, opts?: ParseGltfOptions): Promise<ParsedGltf>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SkeletalAnimation — CPU-side bone matrix evaluation for skinned meshes.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates animation clips by sampling keyframes, computing joint local transforms,
|
|
5
|
+
* walking the hierarchy, and writing final bone matrices into a pre-allocated buffer.
|
|
6
|
+
* Zero per-frame allocations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```ts
|
|
10
|
+
* const anim = new SkeletalAnimation(skinData, clips);
|
|
11
|
+
* const state = anim.createState('walk');
|
|
12
|
+
*
|
|
13
|
+
* // Each tick:
|
|
14
|
+
* anim.update(state, deltaTime, outputMatrices);
|
|
15
|
+
*
|
|
16
|
+
* // outputMatrices is a Float32Array view into the bone matrix buffer
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import type { SkinData, AnimationClipData, AnimationChannel } from './skin-parser';
|
|
20
|
+
export interface SkeletalClip {
|
|
21
|
+
readonly id: number;
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly duration: number;
|
|
24
|
+
readonly channels: AnimationChannel[];
|
|
25
|
+
readonly loop: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface PlayOptions {
|
|
28
|
+
speed?: number;
|
|
29
|
+
/** Crossfade duration in seconds. 0 = instant switch (default). */
|
|
30
|
+
crossfade?: number;
|
|
31
|
+
/** Whether the animation should loop. Default: true. */
|
|
32
|
+
loop?: boolean;
|
|
33
|
+
/** Called when the animation clip ends (reaches duration). Fires each loop for looping clips. */
|
|
34
|
+
onEnd?: () => void;
|
|
35
|
+
}
|
|
36
|
+
export interface SkeletalAnimState {
|
|
37
|
+
clipId: number;
|
|
38
|
+
time: number;
|
|
39
|
+
speed: number;
|
|
40
|
+
playing: boolean;
|
|
41
|
+
loop: boolean;
|
|
42
|
+
prevClipId: number;
|
|
43
|
+
prevTime: number;
|
|
44
|
+
prevSpeed: number;
|
|
45
|
+
blendWeight: number;
|
|
46
|
+
blendDuration: number;
|
|
47
|
+
onEnd: () => void;
|
|
48
|
+
}
|
|
49
|
+
export declare class SkeletalAnimation {
|
|
50
|
+
private clips;
|
|
51
|
+
private clipsByName;
|
|
52
|
+
readonly skinData: SkinData;
|
|
53
|
+
private readonly localMatrices;
|
|
54
|
+
private readonly worldMatrices;
|
|
55
|
+
private readonly blendScratch;
|
|
56
|
+
private readonly originalRestPoseTRS;
|
|
57
|
+
private readonly currentTRS;
|
|
58
|
+
private readonly topoOrder;
|
|
59
|
+
private readonly skelRootMat;
|
|
60
|
+
constructor(skinData: SkinData, clips: AnimationClipData[]);
|
|
61
|
+
loadClip(clip: AnimationClipData, loop?: boolean): number;
|
|
62
|
+
/**
|
|
63
|
+
* Replace the clip list wholesale. Returns an old-id → new-id remap so
|
|
64
|
+
* callers can fix in-flight `SkeletalAnimState.clipId` / `prevClipId`
|
|
65
|
+
* references. Removed clips map to -1.
|
|
66
|
+
*/
|
|
67
|
+
replaceClips(clips: AnimationClipData[], loop?: boolean): Int32Array;
|
|
68
|
+
getClipId(name: string): number;
|
|
69
|
+
getClipNames(): string[];
|
|
70
|
+
getClip(id: number): SkeletalClip | null;
|
|
71
|
+
get clipCount(): number;
|
|
72
|
+
createState(clipIdOrName: number | string, speed?: number, playing?: boolean): SkeletalAnimState;
|
|
73
|
+
play(state: SkeletalAnimState, clipIdOrName: number | string, opts?: PlayOptions): void;
|
|
74
|
+
stop(state: SkeletalAnimState): void;
|
|
75
|
+
resume(state: SkeletalAnimState): void;
|
|
76
|
+
/**
|
|
77
|
+
* Advance time and compute bone matrices.
|
|
78
|
+
* Writes jointCount mat4s into `output` starting at float index `outputOffset`.
|
|
79
|
+
* Handles crossfade blending automatically.
|
|
80
|
+
*/
|
|
81
|
+
update(state: SkeletalAnimState, deltaTime: number, output: Float32Array, outputOffset?: number): void;
|
|
82
|
+
/** Advance clip time with looping/clamping. */
|
|
83
|
+
private advanceTime;
|
|
84
|
+
/** Evaluate a clip at a specific time and write bone matrices. */
|
|
85
|
+
private evaluateClip;
|
|
86
|
+
/**
|
|
87
|
+
* Compute bone matrices for the rest/bind pose (no animation).
|
|
88
|
+
*/
|
|
89
|
+
computeRestPose(output: Float32Array, outputOffset?: number): void;
|
|
90
|
+
/** Sample an animation channel at time t. Returns 3 or 4 floats. */
|
|
91
|
+
private sampleChannel;
|
|
92
|
+
private readonly _scratchVec3;
|
|
93
|
+
private readonly _scratchQuat;
|
|
94
|
+
/** Normalized lerp for quaternions (nlerp). */
|
|
95
|
+
private nlerpQuat;
|
|
96
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export interface SkinData {
|
|
2
|
+
jointCount: number;
|
|
3
|
+
/** Node indices for each joint (into the glTF node array). */
|
|
4
|
+
jointNodeIndices: Uint16Array;
|
|
5
|
+
/** Inverse bind matrices — jointCount * 16 floats (column-major mat4). */
|
|
6
|
+
inverseBindMatrices: Float32Array;
|
|
7
|
+
/** Parent joint index for each joint (-1 for roots). Index into *this* joint list, not the node array. */
|
|
8
|
+
parentJointIndices: Int16Array;
|
|
9
|
+
/** World matrix of the skeleton root (non-joint ancestors of root joints). Column-major mat4, 16 floats. Null if identity. */
|
|
10
|
+
skeletonRootMatrix: Float32Array | null;
|
|
11
|
+
/** Rest-pose TRS for each joint, packed as [tx, ty, tz, qx, qy, qz, qw, sx, sy, sz]. jointCount * 10 floats. */
|
|
12
|
+
restPoseTRS: Float32Array;
|
|
13
|
+
}
|
|
14
|
+
export interface AnimationChannel {
|
|
15
|
+
/** Index into the skin's joint list (not node index). */
|
|
16
|
+
jointIndex: number;
|
|
17
|
+
path: 'translation' | 'rotation' | 'scale';
|
|
18
|
+
timestamps: Float32Array;
|
|
19
|
+
/** vec3 for translation/scale, vec4 (quaternion xyzw) for rotation. */
|
|
20
|
+
values: Float32Array;
|
|
21
|
+
interpolation: 'LINEAR' | 'STEP';
|
|
22
|
+
}
|
|
23
|
+
export interface AnimationClipData {
|
|
24
|
+
name: string;
|
|
25
|
+
duration: number;
|
|
26
|
+
channels: AnimationChannel[];
|
|
27
|
+
}
|
|
28
|
+
export interface PrimitiveSkinAttributes {
|
|
29
|
+
/** Joint indices — vertexCount * 4. */
|
|
30
|
+
joints: Uint16Array;
|
|
31
|
+
/** Joint weights — vertexCount * 4. */
|
|
32
|
+
weights: Float32Array;
|
|
33
|
+
}
|
|
34
|
+
export type AccessorReader = (accessorIndex: number) => {
|
|
35
|
+
data: Float32Array | Uint16Array | Uint32Array | Uint8Array;
|
|
36
|
+
count: number;
|
|
37
|
+
elementSize: number;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Parse skin data from a glTF skin definition.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseSkin(gltf: any, skinIndex: number, getAccessorData: AccessorReader): SkinData;
|
|
43
|
+
/**
|
|
44
|
+
* Decode one glTF animation entry into an `AnimationClipData`.
|
|
45
|
+
* Returns null if no channels target joints in this skin, or all channels use
|
|
46
|
+
* an unsupported interpolation mode.
|
|
47
|
+
*/
|
|
48
|
+
export declare function decodeAnimationClip(anim: any, nameFallback: string, nodeToJoint: ReadonlyMap<number, number>, getAccessorData: AccessorReader): AnimationClipData | null;
|
|
49
|
+
/** Node→joint index map for a parsed skin. Build once and reuse when decoding clips lazily. */
|
|
50
|
+
export declare function buildNodeToJointMap(skinData: SkinData): Map<number, number>;
|
|
51
|
+
/**
|
|
52
|
+
* Parse animation clips that target joints in a skin.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseAnimations(gltf: any, skinData: SkinData, getAccessorData: AccessorReader): AnimationClipData[];
|
|
55
|
+
export declare function parsePrimitiveSkinAttributes(primitive: any, getAccessorData: AccessorReader): PrimitiveSkinAttributes | null;
|
|
56
|
+
/**
|
|
57
|
+
* Get a node's local TRS as [tx, ty, tz, qx, qy, qz, qw, sx, sy, sz].
|
|
58
|
+
*/
|
|
59
|
+
export declare function getNodeTRS(node: any): Float32Array;
|
|
60
|
+
/** Packed GPU-ready animation data for all skins/clips loaded so far. */
|
|
61
|
+
export interface PackedAnimationData {
|
|
62
|
+
/** Flat channel descriptors: [jointIndex, pathAndInterp, keyframeCount, dataOffset] per channel */
|
|
63
|
+
channels: {
|
|
64
|
+
jointIndex: number;
|
|
65
|
+
pathAndInterp: number;
|
|
66
|
+
keyframeCount: number;
|
|
67
|
+
dataOffset: number;
|
|
68
|
+
}[];
|
|
69
|
+
/** Flat keyframe data: timestamps then values for each channel */
|
|
70
|
+
keyframeData: number[];
|
|
71
|
+
/** Clip descriptors: [channelStart, channelCount, duration, loop] */
|
|
72
|
+
clips: {
|
|
73
|
+
channelStart: number;
|
|
74
|
+
channelCount: number;
|
|
75
|
+
duration: number;
|
|
76
|
+
looping: number;
|
|
77
|
+
}[];
|
|
78
|
+
/** Per-skin entries */
|
|
79
|
+
skins: {
|
|
80
|
+
jointCount: number;
|
|
81
|
+
parentOffset: number;
|
|
82
|
+
topoOffset: number;
|
|
83
|
+
ibmOffset: number;
|
|
84
|
+
restTRSOffset: number;
|
|
85
|
+
skelRootMatIndex: number;
|
|
86
|
+
clipOffset: number;
|
|
87
|
+
jointLookupStart: number;
|
|
88
|
+
}[];
|
|
89
|
+
/** Flat parent joint indices (i32), all skins concatenated */
|
|
90
|
+
parentIndices: number[];
|
|
91
|
+
/** Flat topological order (u32), all skins concatenated */
|
|
92
|
+
topoOrder: number[];
|
|
93
|
+
/** Flat inverse bind matrices (mat4x4, 16 floats each), all skins concatenated */
|
|
94
|
+
ibmData: number[];
|
|
95
|
+
/** Flat rest pose TRS (10 floats per joint), all skins concatenated */
|
|
96
|
+
restTRS: number[];
|
|
97
|
+
/** Skeleton root matrices (16 floats each), one per skin */
|
|
98
|
+
skelRootMats: number[];
|
|
99
|
+
/** Per-joint channel lookup: [clipIdx * maxJoints * 2 + joint * 2] = (channelStart, channelCount) */
|
|
100
|
+
jointChannelLookup: number[];
|
|
101
|
+
}
|
|
102
|
+
export declare function createPackedAnimationData(): PackedAnimationData;
|
|
103
|
+
/**
|
|
104
|
+
* Pack a skin + its animations into the flat GPU buffers.
|
|
105
|
+
* Returns the skin index within the packed data.
|
|
106
|
+
*/
|
|
107
|
+
export declare function packSkinAndAnimations(packed: PackedAnimationData, skinData: SkinData, clips: AnimationClipData[]): number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./base/renderer";
|
|
3
|
+
export * from "./base/renderer-2d";
|
|
4
|
+
export * from "./base/renderer-3d";
|
|
5
|
+
export * from "./math";
|
|
6
|
+
export * from "./gltf/skin-parser";
|
|
7
|
+
export * from "./gltf/parser";
|
|
8
|
+
export { SkeletalAnimation } from "./gltf/skeletal-animation";
|
|
9
|
+
export type { SkeletalClip, SkeletalAnimState, PlayOptions } from "./gltf/skeletal-animation";
|
|
10
|
+
export * from "./spritesheet/helpers";
|
|
11
|
+
export * from "./spritesheet/parser";
|
|
12
|
+
export * from "./prefab-bucket";
|
|
13
|
+
export * from "./prefab-bucket/specs";
|
|
14
|
+
export { PrefabBucket } from "./prefab-bucket/concrete";
|
|
15
|
+
export type { PrefabBucket2D, PrefabBucket3D } from "./prefab-bucket/concrete";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared 3D math utilities for the WebGPU renderer.
|
|
3
|
+
* All functions operate on Float32Arrays with explicit offsets — zero allocations in hot paths.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Write a 4x4 identity matrix into `dst` at `offset`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function mat4Identity(dst: Float32Array, offset: number): void;
|
|
9
|
+
/**
|
|
10
|
+
* Create a new 4x4 identity matrix.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mat4IdentityNew(): Float32Array;
|
|
13
|
+
/**
|
|
14
|
+
* Write a column-major 4x4 matrix from TRS (translation, quaternion rotation, scale)
|
|
15
|
+
* into `dst` at `offset`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function trsToMat4(tx: number, ty: number, tz: number, qx: number, qy: number, qz: number, qw: number, sx: number, sy: number, sz: number, dst: Float32Array, offset: number): void;
|
|
18
|
+
/**
|
|
19
|
+
* Build a column-major 4x4 matrix from a glTF node's TRS or matrix property.
|
|
20
|
+
* Allocates and returns a new Float32Array(16).
|
|
21
|
+
*/
|
|
22
|
+
export declare function nodeToMat4(node: {
|
|
23
|
+
translation?: number[];
|
|
24
|
+
rotation?: number[];
|
|
25
|
+
scale?: number[];
|
|
26
|
+
matrix?: number[];
|
|
27
|
+
}): Float32Array;
|
|
28
|
+
/**
|
|
29
|
+
* 4x4 matrix multiply: dst[dO..+16] = a[aO..+16] * b[bO..+16]. Column-major.
|
|
30
|
+
* Safe when a, b, dst overlap (uses internal temp buffer).
|
|
31
|
+
*/
|
|
32
|
+
export declare function mat4Mul(a: Float32Array, aO: number, b: Float32Array, bO: number, dst: Float32Array, dO: number): void;
|
|
33
|
+
/**
|
|
34
|
+
* 4x4 matrix multiply that allocates and returns a new Float32Array(16).
|
|
35
|
+
* Use for load-time operations, not per-frame hot paths.
|
|
36
|
+
*/
|
|
37
|
+
export declare function mat4MulNew(a: Float32Array, b: Float32Array): Float32Array;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrefabBucket — typed registry of reusable spawn templates.
|
|
3
|
+
*
|
|
4
|
+
* Pass `'2d'` or `'3d'` to the constructor to pick the spec/prefab universe.
|
|
5
|
+
* Parsers are wired implicitly; user code only sees `add`, `addAll`, `load`, `get`.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* const bucket = new PrefabBucket('3d')
|
|
9
|
+
* .add({ type: 'gltf', id: 'minion', url: '/minion.glb' })
|
|
10
|
+
* .add({ type: 'grid', id: 'floor', size: 20, step: 0.33, lineWidth: 0.001 });
|
|
11
|
+
*
|
|
12
|
+
* await bucket.load();
|
|
13
|
+
*
|
|
14
|
+
* bucket.get('minion'); // typed as GltfPrefab — `.animations`, `.jointCount`, …
|
|
15
|
+
* bucket.get('floor'); // typed as GridPrefab — `.size`, `.step`, `.lineWidth`
|
|
16
|
+
* bucket.get('typo'); // ❌ TS error: '"typo"' not in '"minion" | "floor"'
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { BasePrefabBucket, type StringOr } from './index';
|
|
20
|
+
import type { Prefab2D, Prefab2DSpec, Prefab3D, Prefab3DSpec, PrefabFor } from './specs';
|
|
21
|
+
type SpecForMode<M> = M extends '3d' ? Prefab3DSpec : Prefab2DSpec;
|
|
22
|
+
type PrefabUnionForMode<M> = M extends '3d' ? Prefab3D : Prefab2D;
|
|
23
|
+
/**
|
|
24
|
+
* Registry of prefab specs and their parsed variants. The bucket tracks the mapping of
|
|
25
|
+
* spec `id` strings to their parsed prefab types, so `get` narrows to the correct
|
|
26
|
+
* prefab type based on the provided id. The bucket is mutable; call `add`/`addAll`
|
|
27
|
+
* to register new specs and their prefab types. Call `load` to parse all registered
|
|
28
|
+
* specs and populate the bucket's internal prefab registry.
|
|
29
|
+
*/
|
|
30
|
+
export declare class PrefabBucket<M extends '2d' | '3d' = '3d', Specs extends Record<string, SpecForMode<M>> = {}> extends BasePrefabBucket<M, SpecForMode<M>, PrefabUnionForMode<M>, Specs> {
|
|
31
|
+
constructor(mode: M);
|
|
32
|
+
/**
|
|
33
|
+
* Add a spec. Chains return the subclass type so the bucket variable's
|
|
34
|
+
* static type accumulates id→spec mappings, enabling `get` to narrow.
|
|
35
|
+
*/
|
|
36
|
+
add<const S extends SpecForMode<M>>(spec: S): PrefabBucket<M, Specs & {
|
|
37
|
+
[K in S['id']]: S;
|
|
38
|
+
}>;
|
|
39
|
+
addAll<const Ss extends readonly SpecForMode<M>[]>(specs: Ss): PrefabBucket<M, Specs & {
|
|
40
|
+
[K in Ss[number]['id']]: Extract<Ss[number], {
|
|
41
|
+
id: K;
|
|
42
|
+
}>;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Return the parsed prefab variant for this id. Narrow type — `get('minion')`
|
|
46
|
+
* returns `GltfPrefab` (with `.animations`, `.jointCount`), not the union.
|
|
47
|
+
*
|
|
48
|
+
* Accepts any string at runtime but autocompletes known ids.
|
|
49
|
+
*/
|
|
50
|
+
get<K extends keyof Specs & string, R = PrefabFor<Specs[K]>>(id: StringOr<K>): R;
|
|
51
|
+
}
|
|
52
|
+
/** Convenience aliases for explicit mode typing (e.g. function params). */
|
|
53
|
+
export type PrefabBucket2D<Specs extends Record<string, Prefab2DSpec> = {}> = PrefabBucket<'2d', Specs>;
|
|
54
|
+
export type PrefabBucket3D<Specs extends Record<string, Prefab3DSpec> = {}> = PrefabBucket<'3d', Specs>;
|
|
55
|
+
export type { GltfPrefab, GltfSpec, GridPrefab, GridSpec, Prefab2D, Prefab2DSpec, Prefab3D, Prefab3DSpec, PrefabFor, SpritesheetPrefab, SpritesheetSpec, } from './specs';
|