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
package/dist/core.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var F=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var ie=Object.prototype.hasOwnProperty;var ae=(o,e)=>()=>(o&&(e=o(o=0)),e);var K=(o,e)=>{for(var t in e)F(o,t,{get:e[t],enumerable:!0})},le=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ne(e))!ie.call(o,r)&&r!==t&&F(o,r,{get:()=>e[r],enumerable:!(s=oe(e,r))||s.enumerable});return o};var ce=o=>le(F({},"__esModule",{value:!0}),o);var $={};K($,{NavMeshWorkerPool:()=>U});var U,G=ae(()=>{U=class{constructor(e,t,s="grid",r=[]){this.poolSize=e;this.workerPath=t;this.navType=s;this.obstacles=r;this.workers=[];this.nextWorkerIndex=0;this.requestId=0;this.pendingRequests=new Map;this.initialized=!1}async init(){if(this.initialized)return;let e=[];for(let t=0;t<this.poolSize;t++){let s=new Worker(this.workerPath,{type:"module"});s.onmessage=a=>{let n=a.data;if(n.type==="PATH_RESULT"){let i=this.pendingRequests.get(n.id);i&&(i.resolve(n.path),this.pendingRequests.delete(n.id))}else if(n.type==="ERROR")for(let[i,l]of this.pendingRequests.entries())l.reject(new Error(n.error)),this.pendingRequests.delete(i)},s.onerror=a=>{console.error("Worker error:",a);for(let[n,i]of this.pendingRequests.entries())i.reject(new Error("Worker error")),this.pendingRequests.delete(n)},this.workers.push(s);let r=new Promise(a=>{let n=i=>{i.data.type==="READY"&&(s.removeEventListener("message",n),a())};s.addEventListener("message",n)});s.postMessage({type:"INIT",navType:this.navType,obstacles:this.obstacles}),e.push(r)}await Promise.all(e),this.initialized=!0}async findPath(e,t){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let s=this.requestId++,r=this.workers[this.nextWorkerIndex];return this.nextWorkerIndex=(this.nextWorkerIndex+1)%this.workers.length,new Promise((a,n)=>{this.pendingRequests.set(s,{id:s,from:e,to:t,resolve:a,reject:n}),r.postMessage({type:"FIND_PATH",id:s,from:e,to:t})})}async addObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let t=this.workers.map(r=>new Promise(a=>{let n=i=>{i.data.type==="OBSTACLE_ADDED"&&(r.removeEventListener("message",n),a(i.data.obstacleId))};r.addEventListener("message",n),r.postMessage({type:"ADD_OBSTACLE",obstacle:e})}));return(await Promise.all(t))[0]}async removeObstacle(e){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let t=this.workers.map(s=>new Promise(r=>{let a=n=>{n.data.type==="OBSTACLE_REMOVED"&&(s.removeEventListener("message",a),r())};s.addEventListener("message",a),s.postMessage({type:"REMOVE_OBSTACLE",obstacleId:e})}));await Promise.all(t)}async moveObstacle(e,t){if(!this.initialized)throw new Error("Worker pool not initialized. Call init() first.");let s=this.workers.map(r=>new Promise(a=>{let n=i=>{i.data.type==="OBSTACLE_MOVED"&&(r.removeEventListener("message",n),a())};r.addEventListener("message",n),r.postMessage({type:"MOVE_OBSTACLE",obstacleId:e,pos:t})}));await Promise.all(s)}terminate(){for(let e of this.workers)e.terminate();this.workers=[],this.pendingRequests.clear(),this.initialized=!1}get pendingCount(){return this.pendingRequests.size}get size(){return this.workers.length}}});var ve={};K(ve,{BaseBinaryCodec:()=>E,BinaryCodec:()=>v,BinaryPrimitives:()=>m,BrowserInputSource:()=>X,EventSystem:()=>I,FixedTicker:()=>P,ImmediateDriver:()=>x,InputManager:()=>q,IntentTracker:()=>z,NavMesh:()=>L,ObjectPool:()=>g,PooledArrayDecoder:()=>W,PooledCodec:()=>_,PooledDecoder:()=>T,PooledEncoder:()=>O,RafDriver:()=>w,Reconciliator:()=>j,TimeoutDriver:()=>k,createDriver:()=>pe,generateId:()=>ue,lerp:()=>de});module.exports=ce(ve);var B=Symbol("schemaSize");function H(o){let e=o[B];if(e!==void 0)return e;let t=0;for(let s of Object.keys(o))t+=o[s].size;return o[B]=t,t}var E=class{static encodeInto(e,t){let s=H(e),r=new ArrayBuffer(s),a=new DataView(r),n=0;for(let i of Object.keys(e)){let l=e[i];l.write(a,n,t[i]),n+=l.size}return new Uint8Array(r)}static decodeInto(e,t,s){let r=H(e);if(t.byteLength<r)throw new RangeError(`Buffer too small: expected ${r} bytes, got ${t.byteLength}`);let a=new DataView(t.buffer,t.byteOffset,t.byteLength),n=0;for(let i of Object.keys(e)){let l=e[i];s[i]=l.read(a,n),n+=l.size}return s}},m=class{static{this.u8={size:1,write:(e,t,s)=>e.setUint8(t,s),read:(e,t)=>e.getUint8(t),toNil:()=>0}}static{this.u16={size:2,write:(e,t,s)=>e.setUint16(t,s,!1),read:(e,t)=>e.getUint16(t,!1),toNil:()=>0}}static{this.u32={size:4,write:(e,t,s)=>e.setUint32(t,s,!1),read:(e,t)=>e.getUint32(t,!1),toNil:()=>0}}static{this.i8={size:1,write:(e,t,s)=>e.setInt8(t,s),read:(e,t)=>e.getInt8(t),toNil:()=>0}}static{this.i16={size:2,write:(e,t,s)=>e.setInt16(t,s,!1),read:(e,t)=>e.getInt16(t,!1),toNil:()=>0}}static{this.i32={size:4,write:(e,t,s)=>e.setInt32(t,s,!1),read:(e,t)=>e.getInt32(t,!1),toNil:()=>0}}static{this.f32={size:4,write:(e,t,s)=>e.setFloat32(t,s,!1),read:(e,t)=>e.getFloat32(t,!1),toNil:()=>0}}static{this.f64={size:8,write:(e,t,s)=>e.setFloat64(t,s,!1),read:(e,t)=>e.getFloat64(t,!1),toNil:()=>0}}static{this.bool={size:1,write:(e,t,s)=>e.setUint8(t,s?1:0),read:(e,t)=>e.getUint8(t)!==0,toNil:()=>!1}}static string(e){return{size:e+2,write(t,s,r){let n=new TextEncoder().encode(r);if(n.length>e)throw new RangeError(`String too long, max ${e} bytes`);t.setUint16(s,n.length,!1);for(let i=0;i<n.length;i++)t.setUint8(s+2+i,n[i]);for(let i=n.length;i<e;i++)t.setUint8(s+2+i,0)},read(t,s){let r=t.getUint16(s,!1),a=new Uint8Array(r);for(let n=0;n<r;n++)a[n]=t.getUint8(s+2+n);return new TextDecoder().decode(a)},toNil:()=>""}}static{this.vec2={size:8,write(e,t,s){e.setFloat32(t,s.x,!1),e.setFloat32(t+4,s.y,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1)}},toNil:()=>({x:0,y:0})}}static{this.vec3={size:12,write(e,t,s){e.setFloat32(t,s.x,!1),e.setFloat32(t+4,s.y,!1),e.setFloat32(t+8,s.z,!1)},read(e,t){return{x:e.getFloat32(t,!1),y:e.getFloat32(t+4,!1),z:e.getFloat32(t+8,!1)}},toNil:()=>({x:0,y:0,z:0})}}static{this.color={size:4,write(e,t,s){e.setUint8(t,s.r),e.setUint8(t+1,s.g),e.setUint8(t+2,s.b),e.setUint8(t+3,s.a)},read(e,t){return{r:e.getUint8(t),g:e.getUint8(t+1),b:e.getUint8(t+2),a:e.getUint8(t+3)}},toNil:()=>({r:0,g:0,b:0,a:0})}}static{this.f32_le={size:4,write:(e,t,s)=>e.setFloat32(t,s,!0),read:(e,t)=>e.getFloat32(t,!0),toNil:()=>0}}static{this.f64_le={size:8,write:(e,t,s)=>e.setFloat64(t,s,!0),read:(e,t)=>e.getFloat64(t,!0),toNil:()=>0}}static{this.u16_le={size:2,write:(e,t,s)=>e.setUint16(t,s,!0),read:(e,t)=>e.getUint16(t,!0),toNil:()=>0}}static{this.u32_le={size:4,write:(e,t,s)=>e.setUint32(t,s,!0),read:(e,t)=>e.getUint32(t,!0),toNil:()=>0}}static{this.i16_le={size:2,write:(e,t,s)=>e.setInt16(t,s,!0),read:(e,t)=>e.getInt16(t,!0),toNil:()=>0}}static{this.i32_le={size:4,write:(e,t,s)=>e.setInt32(t,s,!0),read:(e,t)=>e.getInt32(t,!0),toNil:()=>0}}static{this.vec2_le={size:8,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0)],toNil:()=>[0,0]}}static{this.vec3_le={size:12,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0),e.setFloat32(t+8,s[2],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0)],toNil:()=>[0,0,0]}}static{this.vec4_le={size:16,write:(e,t,s)=>{e.setFloat32(t,s[0],!0),e.setFloat32(t+4,s[1],!0),e.setFloat32(t+8,s[2],!0),e.setFloat32(t+12,s[3],!0)},read:(e,t)=>[e.getFloat32(t,!0),e.getFloat32(t+4,!0),e.getFloat32(t+8,!0),e.getFloat32(t+12,!0)],toNil:()=>[0,0,0,0]}}},v=class extends E{static{this.u8=m.u8}static{this.u16=m.u16}static{this.u32=m.u32}static{this.i8=m.i8}static{this.i16=m.i16}static{this.i32=m.i32}static{this.f32=m.f32}static{this.bool=m.bool}static{this.string=m.string}static{this.vec2=m.vec2}static{this.vec3=m.vec3}static{this.color=m.color}static encode(e,t){return this.encodeInto(e,t)}static decode(e,t,s){return this.decodeInto(e,t,s)}};var I=class{constructor({events:e}){this.callbacks=new Map,this.events=e;for(let t of this.events)this.callbacks.set(t,new Set)}on(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);s.add(t)}once(e,t){let s=r=>{t(r),this.off(e,s)};this.on(e,s)}emit(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);for(let r of s)r(t)}off(e,t){let s=this.callbacks.get(e);if(!s)return console.warn(`Event "${e}" does not exist.`);s.delete(t)}clear(e){if(!e){this.callbacks.clear();for(let s of this.events)this.callbacks.set(s,new Set);return}let t=this.callbacks.get(e);if(!t)return console.warn(`Event "${e}" does not exist.`);t.clear()}};var P=class{constructor({rate:e,onTick:t}){this.accumulator=0;this._tickCount=0;this.rate=e,this.intervalMs=1e3/this.rate,this.onTick=t,this.maxTicksPerFrame=Math.max(1,Math.floor(e/2))}getTicks(e){this.accumulator+=e*1e3;let t=0,s=this.intervalMs*.001;for(;this.accumulator>=this.intervalMs-s&&t<this.maxTicksPerFrame;)this.accumulator-=this.intervalMs,t++;let r=Math.floor(this.accumulator/this.intervalMs);return r>0&&this.onTickSkipped&&this.onTickSkipped(r),t}tick(e){let t=this.getTicks(e);for(let s=0;s<t;s++)this.onTick(1/this.rate,this._tickCount++)}get tickCount(){return this._tickCount}resetTickCount(){this._tickCount=0,this.accumulator=0}get accumulatedTime(){return this.accumulator/1e3}get alpha(){return Math.min(this.accumulatedTime/(1/this.rate),1)}};function ue(o={}){let{prefix:e="",size:t=16}=o,s=Math.max(t-e.length,8),r=Math.ceil(s/8),n=crypto.getRandomValues(new Uint32Array(r)).reduce((i,l)=>i+l.toString(16).padStart(8,"0"),"");return n=n.slice(0,s).padStart(s,"0"),`${e}${n}`}function de(o,e,t){return o+(e-o)*t}var x=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),setImmediate(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}};var w=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.rafId=null;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),requestAnimationFrame(this.loop)}}start(){this.running=!0,this.last=performance.now(),this.rafId=requestAnimationFrame(this.loop)}stop(){this.running=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}};var he=1,k=class{constructor(e){this.update=e;this.last=performance.now();this.running=!1;this.loop=()=>{if(!this.running)return;let e=performance.now(),t=(e-this.last)/1e3;this.last=e,this.update(t),setTimeout(this.loop,he)}}start(){this.running=!0,this.last=performance.now(),this.loop()}stop(){this.running=!1}};function pe(o,e){return o==="server-immediate"?new x(e):o==="server-timeout"?new k(e):new w(e)}var fe=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}],M=o=>({x:Math.floor(o.x),y:Math.floor(o.y)}),Z=o=>({x:o.x+.5,y:o.y+.5}),me=(()=>{let o=1;return()=>o++})(),b=(o,e)=>o&65535|(e&65535)<<16,V=o=>({x:o<<16>>16,y:o>>16}),A=class{constructor(e){this.scoreFn=e;this.heap=[]}push(e){this.heap.push(e),this.bubbleUp(this.heap.length-1)}pop(){let e=this.heap[0],t=this.heap.pop();return this.heap.length>0&&t!==void 0&&(this.heap[0]=t,this.sinkDown(0)),e}get size(){return this.heap.length}bubbleUp(e){let t=this.heap[e],s=this.scoreFn(t);for(;e>0;){let r=(e+1>>1)-1,a=this.heap[r];if(s>=this.scoreFn(a))break;this.heap[r]=t,this.heap[e]=a,e=r}}sinkDown(e){let t=this.heap.length,s=this.heap[e],r=this.scoreFn(s);for(;;){let a=e+1<<1,n=a-1,i=null,l;if(n<t){let c=this.heap[n];l=this.scoreFn(c),l<r&&(i=n)}if(a<t){let c=this.heap[a];this.scoreFn(c)<(i===null?r:l)&&(i=a)}if(i===null)break;this.heap[e]=this.heap[i],this.heap[i]=s,e=i}}},R=class{constructor(e=1){this.grid=new Map;this.obstacleCells=new Map;this.cellSize=e}hash(e,t){let s=Math.floor(e/this.cellSize),r=Math.floor(t/this.cellSize);return b(s,r)}add(e,t){let s=this.getCellsForObstacle(t);for(let r of s)this.grid.has(r)||this.grid.set(r,new Set),this.grid.get(r).add(e);this.obstacleCells.set(e,s)}remove(e){let t=this.obstacleCells.get(e);if(t){for(let s of t){let r=this.grid.get(s);r&&(r.delete(e),r.size===0&&this.grid.delete(s))}this.obstacleCells.delete(e)}}query(e){let t=this.hash(e.x,e.y);return this.grid.get(t)||new Set}clear(){this.grid.clear(),this.obstacleCells.clear()}getCellsForObstacle(e){let t=new Set;if(e.type==="circle"){let s=e.radius,r=Math.floor((e.pos.x-s)/this.cellSize),a=Math.floor((e.pos.x+s)/this.cellSize),n=Math.floor((e.pos.y-s)/this.cellSize),i=Math.floor((e.pos.y+s)/this.cellSize);for(let l=r;l<=a;l++)for(let c=n;c<=i;c++)t.add(b(l,c))}else if(e.type==="rect"){let s=e.pos.x+e.size.x/2,r=e.pos.y+e.size.y/2,a=e.size.x/2,n=e.size.y/2,i=Math.sqrt(a*a+n*n),l=Math.floor((s-i)/this.cellSize),c=Math.floor((s+i)/this.cellSize),d=Math.floor((r-i)/this.cellSize),u=Math.floor((r+i)/this.cellSize);for(let h=l;h<=c;h++)for(let f=d;f<=u;f++)t.add(b(h,f))}else if(e.type==="polygon"){let s=te(e),r=Math.floor(s.minX/this.cellSize),a=Math.floor(s.maxX/this.cellSize),n=Math.floor(s.minY/this.cellSize),i=Math.floor(s.maxY/this.cellSize);for(let l=r;l<=a;l++)for(let c=n;c<=i;c++)t.add(b(l,c))}return t}};function J(o,e){let t=o.x-e.pos.x,s=o.y-e.pos.y;return t*t+s*s<=e.radius*e.radius}function Q(o,e){let t=e.pos.x+e.size.x/2,s=e.pos.y+e.size.y/2;if(e.rotation){let r=Math.cos(-e.rotation),a=Math.sin(-e.rotation),n=o.x-t,i=o.y-s,l=n*r-i*a,c=n*a+i*r;return Math.abs(l)<=e.size.x/2&&Math.abs(c)<=e.size.y/2}return o.x>=e.pos.x&&o.y>=e.pos.y&&o.x<=e.pos.x+e.size.x&&o.y<=e.pos.y+e.size.y}function ee(o,e){let t=!1,s=e.points,r=e.rotation?Math.cos(e.rotation):1,a=e.rotation?Math.sin(e.rotation):0;for(let n=0,i=s.length-1;n<s.length;i=n++){let l=s[n].x,c=s[n].y,d=s[i].x,u=s[i].y;if(e.rotation){let f=l*r-c*a,y=l*a+c*r,p=d*r-u*a,S=d*a+u*r;l=f,c=y,d=p,u=S}l+=e.pos.x,c+=e.pos.y,d+=e.pos.x,u+=e.pos.y,c>o.y!=u>o.y&&o.x<(d-l)*(o.y-c)/(u-c)+l&&(t=!t)}return t}function te(o){let e=1/0,t=1/0,s=-1/0,r=-1/0,a=o.rotation?Math.cos(o.rotation):1,n=o.rotation?Math.sin(o.rotation):0;for(let i of o.points){let l=i.x,c=i.y;if(o.rotation){let d=l*a-c*n,u=l*n+c*a;l=d,c=u}l+=o.pos.x,c+=o.pos.y,e=Math.min(e,l),t=Math.min(t,c),s=Math.max(s,l),r=Math.max(r,c)}return{minX:e,minY:t,maxX:s,maxY:r}}var N=class{constructor(){this.items=new Map;this.spatial=new R(1);this._cachedItems=[];this.dirty=!0;this.version=0}add(e){let t=me(),s={...e,id:t};return this.items.set(t,s),this.spatial.add(t,s),this.dirty=!0,this.version++,t}move(e,t){let s=this.items.get(e);if(!s)return;this.spatial.remove(e);let r={...s,pos:{...t}};this.items.set(e,r),this.spatial.add(e,r),this.dirty=!0,this.version++}remove(e){this.spatial.remove(e),this.items.delete(e),this.dirty=!0,this.version++}at(e){let t=this.spatial.query(e);for(let s of t){let r=this.items.get(s);if(!(!r||r.solid===!1)&&(r.type==="circle"&&J(e,r)||r.type==="rect"&&Q(e,r)||r.type==="polygon"&&ee(e,r)))return r}}get values(){return this.dirty?(this._cachedItems=[...this.items.values()],this.dirty=!1,this._cachedItems):this._cachedItems}},C=class{constructor(e){this.obstacles=e;this.blocked=new Set}rebuild(){this.blocked.clear();for(let e of this.obstacles.values)if(e.solid!==!1){if(e.type==="circle"){let t=Math.ceil(e.radius),s=Math.floor(e.pos.x),r=Math.floor(e.pos.y);for(let a=-t;a<=t;a++)for(let n=-t;n<=t;n++){let i=s+a,l=r+n,c={x:i+.5,y:l+.5};J(c,e)&&this.blocked.add(b(i,l))}}else if(e.type==="rect"){let t=e.pos.x+e.size.x/2,s=e.pos.y+e.size.y/2,r=e.size.x/2,a=e.size.y/2,n=Math.sqrt(r*r+a*a),i=Math.floor(t-n),l=Math.ceil(t+n),c=Math.floor(s-n),d=Math.ceil(s+n);for(let u=i;u<=l;u++)for(let h=c;h<=d;h++){let f={x:u+.5,y:h+.5};Q(f,e)&&this.blocked.add(b(u,h))}}else if(e.type==="polygon"){let t=te(e),s=Math.floor(t.minX),r=Math.ceil(t.maxX),a=Math.floor(t.minY),n=Math.ceil(t.maxY);for(let i=s;i<=r;i++)for(let l=a;l<=n;l++){let c={x:i+.5,y:l+.5};ee(c,e)&&this.blocked.add(b(i,l))}}}}findPath(e,t){return se(M(e),M(t),(s,r)=>!this.blocked.has(b(s,r))).map(Z)}},D=class{constructor(e){this.obstacles=e}rebuild(){}findPath(e,t){let s=Math.ceil(Math.hypot(t.x-e.x,t.y-e.y)*2),r=!1;for(let n=1;n<=s;n++){let i=n/s,l={x:e.x+(t.x-e.x)*i,y:e.y+(t.y-e.y)*i};if(this.obstacles.at(l)){r=!0;break}}return r?se(M(e),M(t),(n,i)=>{let l={x:n+.5,y:i+.5};return!this.obstacles.at(l)}).map(Z):[e,t]}},L=class{constructor(e,t){this.type=e;this.lastVersion=-1;this.pendingPaths=0;this.AUTO_WORKER_THRESHOLD=20;this.obstacles=new N,this.options={workers:t?.workers??!1,workerPoolSize:t?.workerPoolSize??4,workerPath:t?.workerPath??"./navmesh.worker.js"},e==="grid"&&(this.grid=new C(this.obstacles)),e==="graph"&&(this.graph=new D(this.obstacles)),this.options.workers===!0&&this.initWorkerPool()}async initWorkerPool(){if(!this.workerPool)try{let{NavMeshWorkerPool:e}=await Promise.resolve().then(()=>(G(),$));this.workerPool=new e(this.options.workerPoolSize,this.options.workerPath,this.type,this.obstacles.values),await this.workerPool.init()}catch(e){console.warn("Failed to initialize worker pool, falling back to sync:",e),this.options.workers=!1}}shouldUseWorkers(){return this.options.workers===!1?!1:this.options.workers===!0?!0:this.pendingPaths>=this.AUTO_WORKER_THRESHOLD}addObstacle(e){return this.obstacles.add(e)}moveObstacle(e,t){this.obstacles.move(e,t)}removeObstacle(e){this.obstacles.remove(e)}getObstacles(){return this.obstacles.values}findPath({from:e,to:t}){return this.shouldUseWorkers()&&this.workerPool?(this.pendingPaths++,this.findPathAsync(e,t).finally(()=>{this.pendingPaths--})):(this.rebuild(),this.type==="grid"?this.grid.findPath(e,t):this.graph.findPath(e,t))}async findPathAsync(e,t){return this.options.workers==="auto"&&!this.workerPool&&await this.initWorkerPool(),this.workerPool?this.workerPool.findPath(e,t):(this.rebuild(),this.type==="grid"?this.grid.findPath(e,t):this.graph.findPath(e,t))}rebuild(){this.lastVersion!==this.obstacles.version&&(this.grid?.rebuild(),this.graph?.rebuild(),this.lastVersion=this.obstacles.version)}dispose(){this.workerPool&&(this.workerPool.terminate(),this.workerPool=void 0)}getWorkerStatus(){return{workersEnabled:this.options.workers,workerPoolActive:!!this.workerPool,pendingPaths:this.pendingPaths,usingWorkersNow:this.shouldUseWorkers()}}};function se(o,e,t){let s=new Map,r=new Map,a=new Set,n=new Set,i=u=>b(u.x,u.y),l=(u,h)=>Math.abs(u.x-h.x)+Math.abs(u.y-h.y),c=new A(u=>{let h=V(u);return r.get(u)+l(h,e)}),d=i(o);for(r.set(d,0),c.push(d),n.add(d);c.size>0;){let u=c.pop();n.delete(u);let h=V(u);if(h.x===e.x&&h.y===e.y)return ye(s,h);a.add(u);for(let f of fe){let y={x:h.x+f.x,y:h.y+f.y};if(!t(y.x,y.y))continue;let p=i(y);if(a.has(p))continue;let S=r.get(u)+1;S<(r.get(p)??1/0)&&(r.set(p,S),s.set(p,u),n.has(p)||(c.push(p),n.add(p)))}}return[]}function ye(o,e){let t=[e],s=b(e.x,e.y);for(;o.has(s);)s=o.get(s),t.push(V(s));return t.reverse()}var g=class{constructor(e){this.factory=e;this.pool=[]}acquire(){return this.pool.pop()??this.factory()}release(e){this.pool.push(e)}releaseAll(e){this.pool.push(...e)}},T=class{constructor(e){this.schema=e;this.pool=new g(()=>this.createNil())}createNil(){let e={};for(let t of Object.keys(this.schema)){let s=this.schema[t];e[t]="toNil"in s?s.toNil():void 0}return e}decode(e){let t=this.pool.acquire();return this.decodeInto(e,t),t}decodeInto(e,t){let s=0;for(let r of Object.keys(this.schema)){let a=this.schema[r];if("decodeAll"in a){let n=a.decodeAll(e.subarray(s));t[r]=n.value,s+=n.bytesRead}else if("decodeField"in a){let n=a.decodeField(e.subarray(s));t[r]=n.value,s+=n.bytesRead}else if("decode"in a){let n=a.decode(e.subarray(s));t[r]=n.value,s+=n.bytesRead}else{let n=a.size||0,i=e.subarray(s,s+n);v.decodeInto({[r]:a},i,t),s+=n}}}release(e){this.pool.release(e)}},W=class{constructor(e){this.pooledDecoder=new T(e)}decodeAll(e){return e.map(t=>this.pooledDecoder.decode(t))}releaseAll(e){e.forEach(t=>this.pooledDecoder.release(t))}},O=class{constructor(e,t=1024){this.schema=e;this.bufferSize=t;this.pool=new g(()=>new Uint8Array(t))}encode(e){let t=this.pool.acquire(),s=0;for(let r of Object.keys(this.schema)){let a=this.schema[r];if("encode"in a){let n=a.encode(e[r]);t.set(n,s),s+=n.length}else if("encodeAll"in a){let n=a.encodeAll(e[r]),i=0;for(let l of n)t.set(l,s+i),i+=l.length;s+=i}else{let n=v.encode({[r]:a},{[r]:e[r]});t.set(n,s),s+=n.length}}return t.subarray(0,s)}release(e){this.pool.release(e)}},_=class{constructor(e){this.schema=e;this.encoder=new O(e),this.decoder=new T(e)}calculateSize(e){let t=0;for(let s of Object.keys(this.schema)){let r=this.schema[s];"size"in r?t+=r.size:"calculateSize"in r&&(t+=r.calculateSize(e[s]))}return t}encodeInto(e,t,s){let r=new DataView(t.buffer,t.byteOffset),a=s;for(let n of Object.keys(this.schema)){let i=this.schema[n];if("write"in i)i.write(r,a,e[n]),a+=i.size;else if("encodeInto"in i){let l=i.encodeInto(e[n],t,a);a+=l}else if("encode"in i){let l=i.encode(e[n]);t.set(l,a),a+=l.length}}return a-s}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}release(e){this.decoder.release(e)}static array(e){let t=0;for(let l of Object.keys(e)){let c=e[l];t+=c.size||0}let s=new g(()=>new Uint8Array(16384)),r=new g(()=>{let l={};for(let c of Object.keys(e)){let d=e[c];l[c]="toNil"in d?d.toNil():void 0}return l}),a=new g(()=>[]),n=null,i=null;return{__arrayType:void 0,calculateSize(l){return 2+l.length*t},encodeInto(l,c,d){let u=new DataView(c.buffer,c.byteOffset);u.setUint16(d,l.length,!1);let h=d+2;for(let f of l)for(let y of Object.keys(e)){let p=e[y];p.write(u,h,f[y]),h+=p.size}return h-d},encode(l){let c=2+l.length*t,d=s.acquire();d.length<c&&(s.release(d),d=new Uint8Array(Math.max(c,d.length*2))),(!n||n.buffer!==d.buffer)&&(n=new DataView(d.buffer,d.byteOffset)),n.setUint16(0,l.length,!1);let u=2;for(let f of l)for(let y of Object.keys(e)){let p=e[y];p.write(n,u,f[y]),u+=p.size}let h=new Uint8Array(u);return h.set(d.subarray(0,u)),s.release(d),h},decodeField(l){let c=l[0]<<8|l[1],d=a.acquire();d.length=c,(!i||i.buffer!==l.buffer||i.byteOffset!==l.byteOffset)&&(i=new DataView(l.buffer,l.byteOffset));let u=2;for(let h=0;h<c;h++){let f=r.acquire();for(let y of Object.keys(e)){let p=e[y];f[y]=p.read(i,u),u+=p.size}d[h]=f}return{value:d,bytesRead:u}},decode(l){return this.decodeField(l).value},toNil(){return[]}}}};var z=class{constructor(){this.tracker=new Map}get size(){return this.tracker.size}track(e,t){return this.tracker.has(e)||this.tracker.set(e,[]),this.tracker.get(e).push(t),t}dropUpTo(e){let t=[];for(let[s,r]of this.tracker)s<=e?this.tracker.delete(s):t.push([s,r]);return t.sort(([s],[r])=>s-r),t.map(([s,r])=>r).flat()}values(){return Array.from(this.tracker.entries()).sort(([e],[t])=>e-t).map(([e,t])=>t).flat()}},j=class{constructor(e){this.options=e;this.tracker=new z}trackIntent(e,t){this.tracker.track(e,t)}onSnapshot(e){this.options.onLoadState(e.state);let t=this.tracker.dropUpTo(e.tick);t.length>0&&this.options.onReplay(t)}replay(e){this.options.onReplay(e)}};var q=class{constructor(){this.keys=Object.create(null);this.prevKeys=Object.create(null);this.mouse={x:0,y:0,dx:0,dy:0,left:!1,right:!1,middle:!1,scrollX:0,scrollY:0};this.prevMouse={left:!1,right:!1,middle:!1};this.snapshotFlip=!1;this.handlers={keydown:e=>this.onKeyDown(e),keyup:e=>this.onKeyUp(e),mousemove:e=>this.onMouseMove(e),mousedown:e=>this.onMouseDown(e),mouseup:e=>this.onMouseUp(e),wheel:e=>this.onMouseWheel(e),swipe:e=>this.onSwipe(e),pinch:e=>this.onPinch(e)};this.snapshotA=re(),this.snapshotB=re()}peek(){let e=this.snapshotFlip?this.snapshotA:this.snapshotB;return be(e,this.keys,this.mouse),e}snapshot(){let e=this.snapshotFlip?this.snapshotA:this.snapshotB;return this.snapshotFlip=!this.snapshotFlip,ge(e,this.keys,this.prevKeys,this.mouse,this.prevMouse),this.mouse.dx=0,this.mouse.dy=0,this.mouse.scrollX=0,this.mouse.scrollY=0,this.prevMouse.left=this.mouse.left,this.prevMouse.right=this.mouse.right,this.prevMouse.middle=this.mouse.middle,e}listen(e){this.inputSource&&this.inputSource.detach(),this.inputSource=e,e.attach(this.handlers)}unlisten(){this.inputSource&&this.inputSource.detach()}onKeyDown(e){let t=this.keys[e.code]??={down:!1,hit:!1,released:!1};t.down=!0}onKeyUp(e){let t=this.keys[e.code]??={down:!1,hit:!1,released:!1};t.down=!1}onMouseMove(e){let t=e.target.getBoundingClientRect(),s=e.clientX-t.left,r=e.clientY-t.top;this.mouse.dx+=s-this.mouse.x,this.mouse.dy+=r-this.mouse.y,this.mouse.x=s,this.mouse.y=r}onMouseDown(e){e.button===0&&(this.mouse.left=!0),e.button===1&&(this.mouse.middle=!0),e.button===2&&(this.mouse.right=!0)}onMouseUp(e){e.button===0&&(this.mouse.left=!1),e.button===1&&(this.mouse.middle=!1),e.button===2&&(this.mouse.right=!1)}onMouseWheel(e){this.mouse.scrollX+=e.deltaX,this.mouse.scrollY+=e.deltaY}onSwipe(e){}onPinch(e){}};function re(){return{mouse:{position:{x:0,y:0},delta:{position:{x:0,y:0},scroll:{x:0,y:0}},left:{down:!1,hit:!1,released:!1},right:{down:!1,hit:!1,released:!1},middle:{down:!1,hit:!1,released:!1}},keys:Object.create(null)}}function be(o,e,t){for(let s in e){let r=o.keys[s]??={down:!1,hit:!1,released:!1};r.down=e[s].down,r.hit=!1,r.released=!1}o.mouse.position.x=t.x,o.mouse.position.y=t.y,o.mouse.delta.position.x=t.dx,o.mouse.delta.position.y=t.dy,o.mouse.delta.scroll.x=t.scrollX,o.mouse.delta.scroll.y=t.scrollY,o.mouse.left.down=t.left,o.mouse.right.down=t.right,o.mouse.middle.down=t.middle,o.mouse.left.hit=o.mouse.left.released=!1,o.mouse.right.hit=o.mouse.right.released=!1,o.mouse.middle.hit=o.mouse.middle.released=!1}function ge(o,e,t,s,r){for(let a in e){let n=e[a].down,i=t[a]??!1,l=o.keys[a]??={down:!1,hit:!1,released:!1};l.down=n,l.hit=n&&!i,l.released=!n&&i,t[a]=n}o.mouse.position.x=s.x,o.mouse.position.y=s.y,o.mouse.delta.position.x=s.dx,o.mouse.delta.position.y=s.dy,o.mouse.delta.scroll.x=s.scrollX,o.mouse.delta.scroll.y=s.scrollY,Y(o.mouse.left,s.left,r.left),Y(o.mouse.right,s.right,r.right),Y(o.mouse.middle,s.middle,r.middle)}function Y(o,e,t){o.down=e,o.hit=e&&!t,o.released=!e&&t}var X=class{constructor(e,t){this.keyboardTarget=e;this.mouseTarget=t}attach(e){this.handlers&&this.detach(),this.handlers=e,this.keyboardTarget.addEventListener("keydown",e.keydown),this.keyboardTarget.addEventListener("keyup",e.keyup),this.mouseTarget.addEventListener("mousemove",e.mousemove),this.mouseTarget.addEventListener("mousedown",e.mousedown),this.mouseTarget.addEventListener("mouseup",e.mouseup),this.mouseTarget.addEventListener("wheel",e.wheel)}detach(){let e=this.handlers;e&&(this.keyboardTarget.removeEventListener("keydown",e.keydown),this.keyboardTarget.removeEventListener("keyup",e.keyup),this.mouseTarget.removeEventListener("mousemove",e.mousemove),this.mouseTarget.removeEventListener("mousedown",e.mousedown),this.mouseTarget.removeEventListener("mouseup",e.mouseup),this.mouseTarget.removeEventListener("wheel",e.wheel))}};
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stores component data using separate TypedArrays per field (SoA - Structure of Arrays).
|
|
3
|
-
* Alternative to DataView-based storage for comparison.
|
|
4
|
-
*
|
|
5
|
-
* Tradeoffs:
|
|
6
|
-
* + Faster individual field access (native typed array operations)
|
|
7
|
-
* + Better for column-major access patterns
|
|
8
|
-
* + SIMD-friendly (can vectorize single-field operations)
|
|
9
|
-
* - Worse cache locality for row-major access (whole component reads)
|
|
10
|
-
* - More memory fragmentation (separate arrays)
|
|
11
|
-
* - Slightly higher memory overhead (each TypedArray has its own header)
|
|
12
|
-
*/
|
|
13
|
-
export class ComponentStore {
|
|
14
|
-
constructor(component, maxEntities) {
|
|
15
|
-
this.component = component;
|
|
16
|
-
this.maxEntities = maxEntities;
|
|
17
|
-
this.stride = component.size;
|
|
18
|
-
// Pre-compute field metadata
|
|
19
|
-
this.fieldKeys = component.fieldNames;
|
|
20
|
-
this.fields = [];
|
|
21
|
-
this.fieldIndexMap = {};
|
|
22
|
-
this.arrays = [];
|
|
23
|
-
// Create separate typed array for each field
|
|
24
|
-
for (let i = 0; i < this.fieldKeys.length; i++) {
|
|
25
|
-
const key = this.fieldKeys[i];
|
|
26
|
-
const field = component.schema[key];
|
|
27
|
-
this.fields.push(field);
|
|
28
|
-
this.fieldIndexMap[key] = i;
|
|
29
|
-
// Allocate appropriate typed array based on field type
|
|
30
|
-
switch (field.size) {
|
|
31
|
-
case 4:
|
|
32
|
-
// Could be f32, i32, or u32 - check field type
|
|
33
|
-
if (field.read.toString().includes("getFloat32")) {
|
|
34
|
-
this.arrays.push(new Float32Array(maxEntities));
|
|
35
|
-
}
|
|
36
|
-
else if (field.read.toString().includes("getInt32")) {
|
|
37
|
-
this.arrays.push(new Int32Array(maxEntities));
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
this.arrays.push(new Uint32Array(maxEntities));
|
|
41
|
-
}
|
|
42
|
-
break;
|
|
43
|
-
case 2:
|
|
44
|
-
this.arrays.push(new Uint16Array(maxEntities));
|
|
45
|
-
break;
|
|
46
|
-
case 1:
|
|
47
|
-
this.arrays.push(new Uint8Array(maxEntities));
|
|
48
|
-
break;
|
|
49
|
-
default:
|
|
50
|
-
// Fallback to Uint8Array with multiple elements
|
|
51
|
-
this.arrays.push(new Uint8Array(maxEntities * field.size));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Create single reusable object
|
|
55
|
-
this.reusableObject = {};
|
|
56
|
-
for (let i = 0; i < this.fieldKeys.length; i++) {
|
|
57
|
-
this.reusableObject[this.fieldKeys[i]] = this.fields[i].toNil();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Get component data for an entity.
|
|
62
|
-
*
|
|
63
|
-
* ⚠️ IMPORTANT: Returns a REUSED object that is overwritten on the next get() call.
|
|
64
|
-
*/
|
|
65
|
-
get(entityId) {
|
|
66
|
-
const length = this.fields.length;
|
|
67
|
-
// Unrolled loop for common cases
|
|
68
|
-
if (length === 2) {
|
|
69
|
-
this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId];
|
|
70
|
-
this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId];
|
|
71
|
-
}
|
|
72
|
-
else if (length === 3) {
|
|
73
|
-
this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId];
|
|
74
|
-
this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId];
|
|
75
|
-
this.reusableObject[this.fieldKeys[2]] = this.arrays[2][entityId];
|
|
76
|
-
}
|
|
77
|
-
else if (length === 4) {
|
|
78
|
-
this.reusableObject[this.fieldKeys[0]] = this.arrays[0][entityId];
|
|
79
|
-
this.reusableObject[this.fieldKeys[1]] = this.arrays[1][entityId];
|
|
80
|
-
this.reusableObject[this.fieldKeys[2]] = this.arrays[2][entityId];
|
|
81
|
-
this.reusableObject[this.fieldKeys[3]] = this.arrays[3][entityId];
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
// Generic loop for other sizes
|
|
85
|
-
for (let i = 0; i < length; i++) {
|
|
86
|
-
this.reusableObject[this.fieldKeys[i]] = this.arrays[i][entityId];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return this.reusableObject;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Get a mutable copy of component data.
|
|
93
|
-
*/
|
|
94
|
-
getMutable(entityId) {
|
|
95
|
-
const copy = {};
|
|
96
|
-
this.copyTo(entityId, copy);
|
|
97
|
-
return copy;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Copy component data into a provided object.
|
|
101
|
-
*/
|
|
102
|
-
copyTo(entityId, target) {
|
|
103
|
-
for (let i = 0; i < this.fields.length; i++) {
|
|
104
|
-
target[this.fieldKeys[i]] = this.arrays[i][entityId];
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Set component data for an entity.
|
|
109
|
-
*/
|
|
110
|
-
set(entityId, data) {
|
|
111
|
-
const length = this.fields.length;
|
|
112
|
-
// Unrolled loop for common cases
|
|
113
|
-
if (length === 2) {
|
|
114
|
-
this.arrays[0][entityId] = data[this.fieldKeys[0]];
|
|
115
|
-
this.arrays[1][entityId] = data[this.fieldKeys[1]];
|
|
116
|
-
}
|
|
117
|
-
else if (length === 3) {
|
|
118
|
-
this.arrays[0][entityId] = data[this.fieldKeys[0]];
|
|
119
|
-
this.arrays[1][entityId] = data[this.fieldKeys[1]];
|
|
120
|
-
this.arrays[2][entityId] = data[this.fieldKeys[2]];
|
|
121
|
-
}
|
|
122
|
-
else if (length === 4) {
|
|
123
|
-
this.arrays[0][entityId] = data[this.fieldKeys[0]];
|
|
124
|
-
this.arrays[1][entityId] = data[this.fieldKeys[1]];
|
|
125
|
-
this.arrays[2][entityId] = data[this.fieldKeys[2]];
|
|
126
|
-
this.arrays[3][entityId] = data[this.fieldKeys[3]];
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
// Generic loop for other sizes
|
|
130
|
-
for (let i = 0; i < length; i++) {
|
|
131
|
-
this.arrays[i][entityId] = data[this.fieldKeys[i]];
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Update specific fields of a component.
|
|
137
|
-
* Optimized to avoid Object.keys() allocation in hot path.
|
|
138
|
-
*/
|
|
139
|
-
update(entityId, partial) {
|
|
140
|
-
// Direct iteration
|
|
141
|
-
for (const key in partial) {
|
|
142
|
-
const i = this.fieldIndexMap[key];
|
|
143
|
-
this.arrays[i][entityId] = partial[key];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Clear component data for an entity (set to default values)
|
|
148
|
-
*/
|
|
149
|
-
clear(entityId) {
|
|
150
|
-
for (let i = 0; i < this.fields.length; i++) {
|
|
151
|
-
this.arrays[i][entityId] = this.fields[i].toNil();
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get direct access to the underlying arrays.
|
|
156
|
-
* Advanced use only - for SIMD operations, batch processing, etc.
|
|
157
|
-
*/
|
|
158
|
-
getRawArrays() {
|
|
159
|
-
return this.arrays;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Get a specific field's array directly.
|
|
163
|
-
* Useful for vectorized operations on a single field across all entities.
|
|
164
|
-
*/
|
|
165
|
-
getFieldArray(fieldName) {
|
|
166
|
-
const index = this.fieldIndexMap[fieldName];
|
|
167
|
-
return this.arrays[index];
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Get the stride in bytes (for compatibility with DataView version).
|
|
171
|
-
*/
|
|
172
|
-
getStride() {
|
|
173
|
-
return this.stride;
|
|
174
|
-
}
|
|
175
|
-
}
|
package/dist/ecs/component.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { PooledCodec } from "../core/pooled-codec";
|
|
2
|
-
/**
|
|
3
|
-
* Calculate the byte size of a schema
|
|
4
|
-
*/
|
|
5
|
-
function calculateSchemaSize(schema) {
|
|
6
|
-
let size = 0;
|
|
7
|
-
for (const key of Object.keys(schema)) {
|
|
8
|
-
size += schema[key].size;
|
|
9
|
-
}
|
|
10
|
-
return size;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Define a component type with its binary schema.
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* const Transform = defineComponent('Transform', {
|
|
18
|
-
* x: BinaryCodec.f32,
|
|
19
|
-
* y: BinaryCodec.f32,
|
|
20
|
-
* rotation: BinaryCodec.f32,
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* const Health = defineComponent('Health', {
|
|
24
|
-
* current: BinaryCodec.u16,
|
|
25
|
-
* max: BinaryCodec.u16,
|
|
26
|
-
* });
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
export function defineComponent(name, schema) {
|
|
30
|
-
const size = calculateSchemaSize(schema);
|
|
31
|
-
const fieldNames = Object.keys(schema);
|
|
32
|
-
const fieldCount = fieldNames.length;
|
|
33
|
-
// Create PooledCodec for array serialization
|
|
34
|
-
const arrayCodec = PooledCodec.array(schema);
|
|
35
|
-
return {
|
|
36
|
-
name,
|
|
37
|
-
schema,
|
|
38
|
-
size,
|
|
39
|
-
fieldCount,
|
|
40
|
-
fieldNames,
|
|
41
|
-
arrayCodec,
|
|
42
|
-
};
|
|
43
|
-
}
|