murow 0.0.70 → 0.0.71
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 +52 -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-2d-renderer.js +1 -0
- package/dist/cjs/renderer/base-3d-renderer.js +1 -0
- package/dist/cjs/renderer/base-renderer.js +1 -0
- package/dist/cjs/renderer/index.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-2d-renderer.js +1 -0
- package/dist/esm/renderer/base-3d-renderer.js +1 -0
- package/dist/esm/renderer/base-renderer.js +1 -0
- package/dist/esm/renderer/index.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-2d-renderer.d.ts +13 -0
- package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
- package/dist/types/renderer/base-renderer.d.ts +21 -0
- package/dist/types/renderer/index.d.ts +4 -0
- package/dist/types/renderer/types.d.ts +79 -0
- package/dist/webgpu/cjs/index.js +6004 -0
- package/dist/webgpu/esm/index.js +5972 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +55 -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/gltf-skin-parser.d.ts +101 -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 +216 -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 +8 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -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/math.d.ts +37 -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 +32 -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 +57 -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,55 @@
|
|
|
1
|
+
import { Base2DRenderer } from 'murow/renderer/base-2d-renderer';
|
|
2
|
+
import type { Renderer2DOptions, SpriteHandle, SpriteOptions, SpritesheetHandle, SpritesheetSource } from 'murow/renderer';
|
|
3
|
+
import { Camera2D } from '../camera/camera-2d';
|
|
4
|
+
import { GeometryBuilder, type GeometryOptions } from '../geometry/geometry-builder';
|
|
5
|
+
import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
|
|
6
|
+
export declare class WebGPU2DRenderer extends Base2DRenderer {
|
|
7
|
+
private root;
|
|
8
|
+
private _device;
|
|
9
|
+
private context;
|
|
10
|
+
private _format;
|
|
11
|
+
get device(): GPUDevice;
|
|
12
|
+
get format(): GPUTextureFormat;
|
|
13
|
+
private spriteLayout;
|
|
14
|
+
private textureLayout;
|
|
15
|
+
private dynamicData;
|
|
16
|
+
private staticData;
|
|
17
|
+
private freeList;
|
|
18
|
+
private batcher;
|
|
19
|
+
private staticDirty;
|
|
20
|
+
private dynamicBuffer;
|
|
21
|
+
private staticBuffer;
|
|
22
|
+
private uniformBuffer;
|
|
23
|
+
private slotIndexBuffer;
|
|
24
|
+
private slotIndexData;
|
|
25
|
+
private rawPipeline;
|
|
26
|
+
private rawSpriteBindGroup;
|
|
27
|
+
private rawTextureLayout;
|
|
28
|
+
private rawDynamicBuffer;
|
|
29
|
+
private rawStaticBuffer;
|
|
30
|
+
private rawUniformBuffer;
|
|
31
|
+
private rawSlotIndexBuffer;
|
|
32
|
+
private sheetBindGroups;
|
|
33
|
+
private sheets;
|
|
34
|
+
private nextSheetId;
|
|
35
|
+
readonly camera: Camera2D;
|
|
36
|
+
private uniformData;
|
|
37
|
+
private resizeObserver;
|
|
38
|
+
private resizeCallbacks;
|
|
39
|
+
constructor(canvas: HTMLCanvasElement, options: Renderer2DOptions);
|
|
40
|
+
init(): Promise<void>;
|
|
41
|
+
private setupResizeObserver;
|
|
42
|
+
/**
|
|
43
|
+
* Register a callback that fires when the canvas resizes.
|
|
44
|
+
* Receives the new width and height in physical pixels.
|
|
45
|
+
*/
|
|
46
|
+
onResize(callback: (width: number, height: number) => void): void;
|
|
47
|
+
loadSpritesheet(source: SpritesheetSource): Promise<SpritesheetHandle>;
|
|
48
|
+
addSprite(opts: SpriteOptions): SpriteHandle;
|
|
49
|
+
removeSprite(sprite: SpriteHandle): void;
|
|
50
|
+
storePreviousState(): void;
|
|
51
|
+
createGeometry(name: string, options: GeometryOptions): GeometryBuilder;
|
|
52
|
+
createCompute(name: string, options: ComputeOptions): ComputeBuilder;
|
|
53
|
+
render(alpha: number): void;
|
|
54
|
+
destroy(): void;
|
|
55
|
+
}
|
|
@@ -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/types";
|
|
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,101 @@
|
|
|
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
|
+
}
|
|
12
|
+
export interface AnimationChannel {
|
|
13
|
+
/** Index into the skin's joint list (not node index). */
|
|
14
|
+
jointIndex: number;
|
|
15
|
+
path: 'translation' | 'rotation' | 'scale';
|
|
16
|
+
timestamps: Float32Array;
|
|
17
|
+
/** vec3 for translation/scale, vec4 (quaternion xyzw) for rotation. */
|
|
18
|
+
values: Float32Array;
|
|
19
|
+
interpolation: 'LINEAR' | 'STEP';
|
|
20
|
+
}
|
|
21
|
+
export interface AnimationClipData {
|
|
22
|
+
name: string;
|
|
23
|
+
duration: number;
|
|
24
|
+
channels: AnimationChannel[];
|
|
25
|
+
}
|
|
26
|
+
export interface PrimitiveSkinAttributes {
|
|
27
|
+
/** Joint indices — vertexCount * 4. */
|
|
28
|
+
joints: Uint16Array;
|
|
29
|
+
/** Joint weights — vertexCount * 4. */
|
|
30
|
+
weights: Float32Array;
|
|
31
|
+
}
|
|
32
|
+
export type AccessorReader = (accessorIndex: number) => {
|
|
33
|
+
data: Float32Array | Uint16Array | Uint32Array | Uint8Array;
|
|
34
|
+
count: number;
|
|
35
|
+
elementSize: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Parse skin data from a glTF skin definition.
|
|
39
|
+
*/
|
|
40
|
+
export declare function parseSkin(gltf: any, skinIndex: number, getAccessorData: AccessorReader): SkinData;
|
|
41
|
+
/**
|
|
42
|
+
* Parse animation clips that target joints in a skin.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseAnimations(gltf: any, skinData: SkinData, getAccessorData: AccessorReader): AnimationClipData[];
|
|
45
|
+
/**
|
|
46
|
+
* Extract JOINTS_0 and WEIGHTS_0 from a glTF primitive.
|
|
47
|
+
* Returns null if the primitive has no skinning attributes.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parsePrimitiveSkinAttributes(primitive: any, getAccessorData: AccessorReader): PrimitiveSkinAttributes | null;
|
|
50
|
+
/**
|
|
51
|
+
* Get a node's local TRS as [tx, ty, tz, qx, qy, qz, qw, sx, sy, sz].
|
|
52
|
+
*/
|
|
53
|
+
export declare function getNodeTRS(node: any): Float32Array;
|
|
54
|
+
/** Packed GPU-ready animation data for all skins/clips loaded so far. */
|
|
55
|
+
export interface PackedAnimationData {
|
|
56
|
+
/** Flat channel descriptors: [jointIndex, pathAndInterp, keyframeCount, dataOffset] per channel */
|
|
57
|
+
channels: {
|
|
58
|
+
jointIndex: number;
|
|
59
|
+
pathAndInterp: number;
|
|
60
|
+
keyframeCount: number;
|
|
61
|
+
dataOffset: number;
|
|
62
|
+
}[];
|
|
63
|
+
/** Flat keyframe data: timestamps then values for each channel */
|
|
64
|
+
keyframeData: number[];
|
|
65
|
+
/** Clip descriptors: [channelStart, channelCount, duration, loop] */
|
|
66
|
+
clips: {
|
|
67
|
+
channelStart: number;
|
|
68
|
+
channelCount: number;
|
|
69
|
+
duration: number;
|
|
70
|
+
looping: number;
|
|
71
|
+
}[];
|
|
72
|
+
/** Per-skin entries */
|
|
73
|
+
skins: {
|
|
74
|
+
jointCount: number;
|
|
75
|
+
parentOffset: number;
|
|
76
|
+
topoOffset: number;
|
|
77
|
+
ibmOffset: number;
|
|
78
|
+
restTRSOffset: number;
|
|
79
|
+
skelRootMatIndex: number;
|
|
80
|
+
clipOffset: number;
|
|
81
|
+
jointLookupStart: number;
|
|
82
|
+
}[];
|
|
83
|
+
/** Flat parent joint indices (i32), all skins concatenated */
|
|
84
|
+
parentIndices: number[];
|
|
85
|
+
/** Flat topological order (u32), all skins concatenated */
|
|
86
|
+
topoOrder: number[];
|
|
87
|
+
/** Flat inverse bind matrices (mat4x4, 16 floats each), all skins concatenated */
|
|
88
|
+
ibmData: number[];
|
|
89
|
+
/** Flat rest pose TRS (10 floats per joint), all skins concatenated */
|
|
90
|
+
restTRS: number[];
|
|
91
|
+
/** Skeleton root matrices (16 floats each), one per skin */
|
|
92
|
+
skelRootMats: number[];
|
|
93
|
+
/** Per-joint channel lookup: [clipIdx * maxJoints * 2 + joint * 2] = (channelStart, channelCount) */
|
|
94
|
+
jointChannelLookup: number[];
|
|
95
|
+
}
|
|
96
|
+
export declare function createPackedAnimationData(): PackedAnimationData;
|
|
97
|
+
/**
|
|
98
|
+
* Pack a skin + its animations into the flat GPU buffers.
|
|
99
|
+
* Returns the skin index within the packed data.
|
|
100
|
+
*/
|
|
101
|
+
export declare function packSkinAndAnimations(packed: PackedAnimationData, skinData: SkinData, clips: AnimationClipData[], gltfNodes: any[]): number;
|
|
@@ -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,216 @@
|
|
|
1
|
+
import { Base3DRenderer } from 'murow/renderer/base-3d-renderer';
|
|
2
|
+
import type { Renderer3DOptions } from 'murow/renderer/types';
|
|
3
|
+
import { ComputeBuilder, type ComputeOptions } from '../compute/compute-builder';
|
|
4
|
+
import { Camera3D } from '../camera/camera-3d';
|
|
5
|
+
import { type PlayOptions } from './skeletal-animation';
|
|
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
|
+
model: ModelHandle | GltfModel;
|
|
50
|
+
x?: number;
|
|
51
|
+
y?: number;
|
|
52
|
+
z?: number;
|
|
53
|
+
rotX?: number;
|
|
54
|
+
rotY?: number;
|
|
55
|
+
rotZ?: number;
|
|
56
|
+
scaleX?: number;
|
|
57
|
+
scaleY?: number;
|
|
58
|
+
scaleZ?: number;
|
|
59
|
+
color?: [number, number, number];
|
|
60
|
+
}
|
|
61
|
+
export interface WebGPU3DRendererOptions extends Renderer3DOptions {
|
|
62
|
+
maxSkinnedInstances?: number;
|
|
63
|
+
maxBonesPerSkin?: number;
|
|
64
|
+
}
|
|
65
|
+
export declare class WebGPU3DRenderer extends Base3DRenderer {
|
|
66
|
+
private root;
|
|
67
|
+
private device;
|
|
68
|
+
private context;
|
|
69
|
+
private resizeObserver;
|
|
70
|
+
private resizeCallbacks;
|
|
71
|
+
private format;
|
|
72
|
+
private meshLayout;
|
|
73
|
+
private dynamicData;
|
|
74
|
+
private staticData;
|
|
75
|
+
private slotIndexData;
|
|
76
|
+
private freeList;
|
|
77
|
+
private batcher;
|
|
78
|
+
private staticDirty;
|
|
79
|
+
private instanceModelIds;
|
|
80
|
+
private dynamicBuffer;
|
|
81
|
+
private staticBuffer;
|
|
82
|
+
private uniformBuffer;
|
|
83
|
+
private slotIndexBuffer;
|
|
84
|
+
private rawPipeline;
|
|
85
|
+
private rawBindGroup;
|
|
86
|
+
private rawDynamicBuffer;
|
|
87
|
+
private rawStaticBuffer;
|
|
88
|
+
private rawUniformBuffer;
|
|
89
|
+
private rawSlotIndexBuffer;
|
|
90
|
+
private depthTexture;
|
|
91
|
+
private rawTexturedPipeline;
|
|
92
|
+
private models;
|
|
93
|
+
private nextModelId;
|
|
94
|
+
private skinnedModels;
|
|
95
|
+
private skinnedMeshLayout;
|
|
96
|
+
private rawSkinnedPipeline;
|
|
97
|
+
private rawSkinnedTexturedPipeline;
|
|
98
|
+
private rawSkinnedBindGroup;
|
|
99
|
+
private boneMatrixData;
|
|
100
|
+
private rawBoneMatrixBuffer;
|
|
101
|
+
private boneMatrixDirty;
|
|
102
|
+
private readonly maxTotalBones;
|
|
103
|
+
private packedAnimData;
|
|
104
|
+
private animComputeKernel;
|
|
105
|
+
private animComputeNeedsRebuild;
|
|
106
|
+
private animClipTableOffset;
|
|
107
|
+
private animChannelTableOffset;
|
|
108
|
+
private animJointLookupOffset;
|
|
109
|
+
private gpuAnimInstanceStates;
|
|
110
|
+
private gpuInstData;
|
|
111
|
+
private gpuInstDV;
|
|
112
|
+
private skinnedDynamicData;
|
|
113
|
+
private skinnedStaticData;
|
|
114
|
+
private skinnedSlotIndexData;
|
|
115
|
+
private skinnedFreeList;
|
|
116
|
+
private skinnedBatcher;
|
|
117
|
+
private skinnedStaticDirty;
|
|
118
|
+
private skinnedInstanceModelIds;
|
|
119
|
+
private skinnedInstanceBoneOffsets;
|
|
120
|
+
private skinnedAnimStates;
|
|
121
|
+
private nextBoneOffset;
|
|
122
|
+
private readonly maxSkinnedInstances;
|
|
123
|
+
private readonly maxBonesPerSkin;
|
|
124
|
+
private rawSkinnedDynamicBuffer;
|
|
125
|
+
private rawSkinnedStaticBuffer;
|
|
126
|
+
private rawSkinnedUniformBuffer;
|
|
127
|
+
private rawSkinnedSlotIndexBuffer;
|
|
128
|
+
private frustumPlanes;
|
|
129
|
+
readonly camera: Camera3D;
|
|
130
|
+
private uniformData;
|
|
131
|
+
private lastRenderTime;
|
|
132
|
+
constructor(canvas: HTMLCanvasElement, options: WebGPU3DRendererOptions);
|
|
133
|
+
init(): Promise<void>;
|
|
134
|
+
private setupResizeObserver;
|
|
135
|
+
/**
|
|
136
|
+
* Register a callback that fires when the canvas resizes.
|
|
137
|
+
* Receives the new width and height in physical pixels.
|
|
138
|
+
*/
|
|
139
|
+
onResize(callback: (width: number, height: number) => void): void;
|
|
140
|
+
createCompute(name: string, options: ComputeOptions): ComputeBuilder;
|
|
141
|
+
/**
|
|
142
|
+
* Create a flat grid mesh on the XZ plane at Y=0.
|
|
143
|
+
*
|
|
144
|
+
* ```ts
|
|
145
|
+
* const grid = renderer.createGrid({ size: 20, step: 1, lineWidth: 0.005 });
|
|
146
|
+
* renderer.addInstance({ model: grid, color: [0.3, 0.3, 0.3] });
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
createGrid(opts?: {
|
|
150
|
+
size?: number;
|
|
151
|
+
step?: number;
|
|
152
|
+
lineWidth?: number;
|
|
153
|
+
}): ModelHandle;
|
|
154
|
+
/**
|
|
155
|
+
* Register a model. Returns a handle for addInstance().
|
|
156
|
+
*
|
|
157
|
+
* ```ts
|
|
158
|
+
* const hero = renderer.loadModel({
|
|
159
|
+
* positions: new Float32Array([...]),
|
|
160
|
+
* normals: new Float32Array([...]), // optional — auto-computed from faces
|
|
161
|
+
* uvs: new Float32Array([...]), // optional
|
|
162
|
+
* indices: new Uint16Array([...]), // optional
|
|
163
|
+
* texture: myImageBitmap, // optional
|
|
164
|
+
* });
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
loadModel(data: ModelData): ModelHandle;
|
|
168
|
+
/**
|
|
169
|
+
* Register a skinned model with joint/weight vertex data.
|
|
170
|
+
* Called internally by loadGltf when a skin is detected.
|
|
171
|
+
*/
|
|
172
|
+
private loadSkinnedModel;
|
|
173
|
+
/**
|
|
174
|
+
* Auto-compute flat normals from triangle faces.
|
|
175
|
+
*/
|
|
176
|
+
private computeNormals;
|
|
177
|
+
/**
|
|
178
|
+
* Load a glTF/GLB model from a URL. Returns one ModelHandle per primitive.
|
|
179
|
+
* Most models have multiple primitives (body parts, material groups, etc.).
|
|
180
|
+
*
|
|
181
|
+
* ```ts
|
|
182
|
+
* const model = await renderer.loadGltf('assets/hero.glb');
|
|
183
|
+
* const instance = renderer.addInstance({ model, x: 0, y: 0, z: 0 });
|
|
184
|
+
* instance.playAnimation?.('walk');
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
loadGltf(url: string, opts?: {
|
|
188
|
+
animations?: string[];
|
|
189
|
+
}): Promise<GltfModel>;
|
|
190
|
+
/**
|
|
191
|
+
* Add an instance. For skinned models, pass `linkedTo` to share bone matrices
|
|
192
|
+
* with another instance (e.g., when spawning all parts of a character).
|
|
193
|
+
*/
|
|
194
|
+
addInstance(opts: MeshInstanceOptions): InstanceHandle;
|
|
195
|
+
private addGltfInstance;
|
|
196
|
+
private addSkinnedInstance;
|
|
197
|
+
/**
|
|
198
|
+
* Update skeletal animations for all skinned instances. Call once per tick.
|
|
199
|
+
*/
|
|
200
|
+
private updatedBoneOffsets;
|
|
201
|
+
private updateAnimations;
|
|
202
|
+
removeInstance(handle: MeshInstanceHandle): void;
|
|
203
|
+
storePreviousState(): void;
|
|
204
|
+
render(alpha: number): void;
|
|
205
|
+
/**
|
|
206
|
+
* Extract 6 frustum planes from a column-major VP matrix.
|
|
207
|
+
* Each plane is [a, b, c, d] where ax + by + cz + d >= 0 means inside.
|
|
208
|
+
*/
|
|
209
|
+
private extractFrustumPlanes;
|
|
210
|
+
/**
|
|
211
|
+
* Test if a bounding sphere is inside or intersects the frustum.
|
|
212
|
+
* Returns true if visible (should be drawn).
|
|
213
|
+
*/
|
|
214
|
+
private isInFrustum;
|
|
215
|
+
destroy(): void;
|
|
216
|
+
}
|