@oasys/oecs 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1399 -276
- package/README.md +327 -169
- package/dist/core/ecs/access_check.d.cts +31 -31
- package/dist/core/ecs/access_check.d.ts +31 -31
- package/dist/core/ecs/access_check.d.ts.map +1 -1
- package/dist/core/ecs/archetype.d.cts +273 -205
- package/dist/core/ecs/archetype.d.ts +273 -205
- package/dist/core/ecs/archetype.d.ts.map +1 -1
- package/dist/core/ecs/archetype_closure.d.cts +23 -0
- package/dist/core/ecs/archetype_closure.d.ts +23 -0
- package/dist/core/ecs/archetype_closure.d.ts.map +1 -0
- package/dist/core/ecs/archetype_graph.d.cts +34 -34
- package/dist/core/ecs/archetype_graph.d.ts +34 -34
- package/dist/core/ecs/archetype_graph.d.ts.map +1 -1
- package/dist/core/ecs/archetype_types.d.cts +55 -0
- package/dist/core/ecs/archetype_types.d.ts +55 -0
- package/dist/core/ecs/archetype_types.d.ts.map +1 -0
- package/dist/core/ecs/change_feed.d.cts +53 -0
- package/dist/core/ecs/change_feed.d.ts +53 -0
- package/dist/core/ecs/change_feed.d.ts.map +1 -0
- package/dist/core/ecs/changed_query.d.cts +36 -0
- package/dist/core/ecs/changed_query.d.ts +36 -0
- package/dist/core/ecs/changed_query.d.ts.map +1 -0
- package/dist/core/ecs/chunk_columns.d.cts +49 -0
- package/dist/core/ecs/chunk_columns.d.ts +49 -0
- package/dist/core/ecs/chunk_columns.d.ts.map +1 -0
- package/dist/core/ecs/command_log.d.cts +30 -30
- package/dist/core/ecs/command_log.d.ts +30 -30
- package/dist/core/ecs/command_log.d.ts.map +1 -1
- package/dist/core/ecs/component.d.cts +45 -44
- package/dist/core/ecs/component.d.ts +45 -44
- package/dist/core/ecs/component.d.ts.map +1 -1
- package/dist/core/ecs/component_registry.d.cts +53 -0
- package/dist/core/ecs/component_registry.d.ts +53 -0
- package/dist/core/ecs/component_registry.d.ts.map +1 -0
- package/dist/core/ecs/compute_backend.d.cts +18 -7
- package/dist/core/ecs/compute_backend.d.ts +18 -7
- package/dist/core/ecs/compute_backend.d.ts.map +1 -1
- package/dist/core/ecs/deferred_commands.d.cts +15 -14
- package/dist/core/ecs/deferred_commands.d.ts +15 -14
- package/dist/core/ecs/deferred_commands.d.ts.map +1 -1
- package/dist/core/ecs/dispatch_trace.d.cts +32 -31
- package/dist/core/ecs/dispatch_trace.d.ts +32 -31
- package/dist/core/ecs/dispatch_trace.d.ts.map +1 -1
- package/dist/core/ecs/ecs.d.cts +337 -276
- package/dist/core/ecs/ecs.d.ts +337 -276
- package/dist/core/ecs/ecs.d.ts.map +1 -1
- package/dist/core/ecs/ecs_memory.d.cts +134 -136
- package/dist/core/ecs/ecs_memory.d.ts +134 -136
- package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
- package/dist/core/ecs/ecs_options.d.cts +89 -0
- package/dist/core/ecs/ecs_options.d.ts +89 -0
- package/dist/core/ecs/ecs_options.d.ts.map +1 -0
- package/dist/core/ecs/entity.d.cts +4 -4
- package/dist/core/ecs/entity.d.ts +4 -4
- package/dist/core/ecs/entity_allocator.d.cts +24 -22
- package/dist/core/ecs/entity_allocator.d.ts +24 -22
- package/dist/core/ecs/entity_allocator.d.ts.map +1 -1
- package/dist/core/ecs/event.d.cts +37 -23
- package/dist/core/ecs/event.d.ts +37 -23
- package/dist/core/ecs/event.d.ts.map +1 -1
- package/dist/core/ecs/facades.d.cts +12 -126
- package/dist/core/ecs/facades.d.ts +12 -126
- package/dist/core/ecs/facades.d.ts.map +1 -1
- package/dist/core/ecs/frame_stepper.d.cts +12 -12
- package/dist/core/ecs/frame_stepper.d.ts +12 -12
- package/dist/core/ecs/frame_stepper.d.ts.map +1 -1
- package/dist/core/ecs/frame_trace.d.cts +34 -34
- package/dist/core/ecs/frame_trace.d.ts +34 -34
- package/dist/core/ecs/frame_trace.d.ts.map +1 -1
- package/dist/core/ecs/host_commands.d.cts +107 -89
- package/dist/core/ecs/host_commands.d.ts +107 -89
- package/dist/core/ecs/host_commands.d.ts.map +1 -1
- package/dist/core/ecs/index.d.cts +22 -12
- package/dist/core/ecs/index.d.ts +22 -12
- package/dist/core/ecs/index.d.ts.map +1 -1
- package/dist/core/ecs/observer.d.cts +41 -122
- package/dist/core/ecs/observer.d.ts +41 -122
- package/dist/core/ecs/observer.d.ts.map +1 -1
- package/dist/core/ecs/phase.d.cts +79 -0
- package/dist/core/ecs/phase.d.ts +79 -0
- package/dist/core/ecs/phase.d.ts.map +1 -0
- package/dist/core/ecs/plugin.d.cts +125 -0
- package/dist/core/ecs/plugin.d.ts +125 -0
- package/dist/core/ecs/plugin.d.ts.map +1 -0
- package/dist/core/ecs/plugin_slots.d.cts +26 -0
- package/dist/core/ecs/plugin_slots.d.ts +26 -0
- package/dist/core/ecs/plugin_slots.d.ts.map +1 -0
- package/dist/core/ecs/query.d.cts +219 -568
- package/dist/core/ecs/query.d.ts +219 -568
- package/dist/core/ecs/query.d.ts.map +1 -1
- package/dist/core/ecs/query_cache.d.cts +130 -0
- package/dist/core/ecs/query_cache.d.ts +130 -0
- package/dist/core/ecs/query_cache.d.ts.map +1 -0
- package/dist/core/ecs/query_registry.d.cts +47 -0
- package/dist/core/ecs/query_registry.d.ts +47 -0
- package/dist/core/ecs/query_registry.d.ts.map +1 -0
- package/dist/core/ecs/query_terms.d.cts +126 -0
- package/dist/core/ecs/query_terms.d.ts +126 -0
- package/dist/core/ecs/query_terms.d.ts.map +1 -0
- package/dist/core/ecs/ref.d.cts +129 -16
- package/dist/core/ecs/ref.d.ts +129 -16
- package/dist/core/ecs/ref.d.ts.map +1 -1
- package/dist/core/ecs/relation.d.cts +105 -186
- package/dist/core/ecs/relation.d.ts +105 -186
- package/dist/core/ecs/relation.d.ts.map +1 -1
- package/dist/core/ecs/resource.d.cts +14 -14
- package/dist/core/ecs/resource.d.ts +14 -14
- package/dist/core/ecs/resource_registry.d.cts +6 -6
- package/dist/core/ecs/resource_registry.d.ts +6 -6
- package/dist/core/ecs/resource_registry.d.ts.map +1 -1
- package/dist/core/ecs/row_kinds.d.cts +24 -0
- package/dist/core/ecs/row_kinds.d.ts +24 -0
- package/dist/core/ecs/row_kinds.d.ts.map +1 -0
- package/dist/core/ecs/run_condition.d.cts +23 -23
- package/dist/core/ecs/run_condition.d.ts +23 -23
- package/dist/core/ecs/run_condition.d.ts.map +1 -1
- package/dist/core/ecs/schedule.d.cts +98 -114
- package/dist/core/ecs/schedule.d.ts +98 -114
- package/dist/core/ecs/schedule.d.ts.map +1 -1
- package/dist/core/ecs/schedule_plan.d.cts +33 -0
- package/dist/core/ecs/schedule_plan.d.ts +33 -0
- package/dist/core/ecs/schedule_plan.d.ts.map +1 -0
- package/dist/core/ecs/snapshot.d.cts +77 -0
- package/dist/core/ecs/snapshot.d.ts +77 -0
- package/dist/core/ecs/snapshot.d.ts.map +1 -0
- package/dist/core/ecs/snapshot_mount.d.cts +42 -0
- package/dist/core/ecs/snapshot_mount.d.ts +42 -0
- package/dist/core/ecs/snapshot_mount.d.ts.map +1 -0
- package/dist/core/ecs/sparse_store.d.cts +110 -53
- package/dist/core/ecs/sparse_store.d.ts +110 -53
- package/dist/core/ecs/sparse_store.d.ts.map +1 -1
- package/dist/core/ecs/store.d.cts +644 -511
- package/dist/core/ecs/store.d.ts +644 -511
- package/dist/core/ecs/store.d.ts.map +1 -1
- package/dist/core/ecs/store_layout_listener.d.cts +8 -8
- package/dist/core/ecs/store_layout_listener.d.ts +8 -8
- package/dist/core/ecs/store_types.d.cts +122 -0
- package/dist/core/ecs/store_types.d.ts +122 -0
- package/dist/core/ecs/store_types.d.ts.map +1 -0
- package/dist/core/ecs/system.d.cts +151 -66
- package/dist/core/ecs/system.d.ts +151 -66
- package/dist/core/ecs/system.d.ts.map +1 -1
- package/dist/core/ecs/system_context.d.cts +296 -0
- package/dist/core/ecs/system_context.d.ts +296 -0
- package/dist/core/ecs/system_context.d.ts.map +1 -0
- package/dist/core/ecs/system_set.d.cts +48 -0
- package/dist/core/ecs/system_set.d.ts +48 -0
- package/dist/core/ecs/system_set.d.ts.map +1 -0
- package/dist/core/ecs/utils/arrays.d.cts +15 -1
- package/dist/core/ecs/utils/arrays.d.ts +15 -1
- package/dist/core/ecs/utils/arrays.d.ts.map +1 -1
- package/dist/core/ecs/utils/error.d.cts +87 -4
- package/dist/core/ecs/utils/error.d.ts +87 -4
- package/dist/core/ecs/utils/error.d.ts.map +1 -1
- package/dist/core/ecs/utils/plugin_error.d.cts +10 -0
- package/dist/core/ecs/utils/plugin_error.d.ts +10 -0
- package/dist/core/ecs/utils/plugin_error.d.ts.map +1 -0
- package/dist/core/restore_errors.d.cts +30 -0
- package/dist/core/restore_errors.d.ts +30 -0
- package/dist/core/restore_errors.d.ts.map +1 -0
- package/dist/core/store/action_ring.d.cts +48 -49
- package/dist/core/store/action_ring.d.ts +48 -49
- package/dist/core/store/action_ring.d.ts.map +1 -1
- package/dist/core/store/allocator.d.cts +166 -114
- package/dist/core/store/allocator.d.ts +166 -114
- package/dist/core/store/allocator.d.ts.map +1 -1
- package/dist/core/store/buffer_backed_column.d.cts +21 -22
- package/dist/core/store/buffer_backed_column.d.ts +21 -22
- package/dist/core/store/buffer_backed_column.d.ts.map +1 -1
- package/dist/core/store/column_store.d.cts +138 -100
- package/dist/core/store/column_store.d.ts +138 -100
- package/dist/core/store/column_store.d.ts.map +1 -1
- package/dist/core/store/command_dispatch.d.cts +14 -15
- package/dist/core/store/command_dispatch.d.ts +14 -15
- package/dist/core/store/command_dispatch.d.ts.map +1 -1
- package/dist/core/store/command_ring.d.cts +41 -45
- package/dist/core/store/command_ring.d.ts +41 -45
- package/dist/core/store/command_ring.d.ts.map +1 -1
- package/dist/core/store/descriptor.d.cts +35 -18
- package/dist/core/store/descriptor.d.ts +35 -18
- package/dist/core/store/descriptor.d.ts.map +1 -1
- package/dist/core/store/entity_index.d.cts +34 -35
- package/dist/core/store/entity_index.d.ts +34 -35
- package/dist/core/store/entity_index.d.ts.map +1 -1
- package/dist/core/store/event_ring.d.cts +40 -42
- package/dist/core/store/event_ring.d.ts +40 -42
- package/dist/core/store/event_ring.d.ts.map +1 -1
- package/dist/core/store/extend.d.cts +15 -9
- package/dist/core/store/extend.d.ts +15 -9
- package/dist/core/store/extend.d.ts.map +1 -1
- package/dist/core/store/grow.d.cts +3 -3
- package/dist/core/store/grow.d.ts +3 -3
- package/dist/core/store/grow.d.ts.map +1 -1
- package/dist/core/store/header.d.cts +37 -33
- package/dist/core/store/header.d.ts +37 -33
- package/dist/core/store/header.d.ts.map +1 -1
- package/dist/core/store/index.d.cts +10 -10
- package/dist/core/store/index.d.ts +10 -10
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/layout_ops.d.cts +72 -63
- package/dist/core/store/layout_ops.d.ts +72 -63
- package/dist/core/store/layout_ops.d.ts.map +1 -1
- package/dist/core/store/region_table.d.cts +28 -21
- package/dist/core/store/region_table.d.ts +28 -21
- package/dist/core/store/region_table.d.ts.map +1 -1
- package/dist/core/store/snapshot.d.cts +31 -16
- package/dist/core/store/snapshot.d.ts +31 -16
- package/dist/core/store/snapshot.d.ts.map +1 -1
- package/dist/core/store/state_hash.d.cts +14 -14
- package/dist/core/store/state_hash.d.ts +14 -14
- package/dist/core/store/state_hash.d.ts.map +1 -1
- package/dist/core/store/store_regions.d.cts +10 -10
- package/dist/core/store/store_regions.d.ts +10 -10
- package/dist/core/store/store_regions.d.ts.map +1 -1
- package/dist/core/store/vendored_abi/abi.d.cts +27 -2
- package/dist/core/store/vendored_abi/abi.d.ts +27 -2
- package/dist/core/store/vendored_abi/abi.d.ts.map +1 -1
- package/dist/host_commands-B2KMx8O2.cjs +1 -0
- package/dist/host_commands-ClVPvhSa.cjs +2 -0
- package/dist/host_commands-CwxVQS1z.js +1524 -0
- package/dist/host_commands-nJvTy88E.js +1667 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +16 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.development.cjs +1 -1
- package/dist/index.development.js +6709 -5729
- package/dist/index.js +5664 -4743
- package/dist/internal.cjs +2 -2
- package/dist/internal.d.cts +5 -2
- package/dist/internal.d.ts +5 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.development.cjs +1 -1
- package/dist/internal.development.js +70 -20
- package/dist/internal.js +138 -83
- package/dist/plugins/abi-D3V-QUSf.cjs +1 -0
- package/dist/plugins/abi-NP8pNxpd.js +42 -0
- package/dist/plugins/arrays-Dr_1hCjL.js +28 -0
- package/dist/plugins/arrays-Dt-Joc4i.cjs +1 -0
- package/dist/plugins/assertions-gtDVfbnQ.js +6 -0
- package/dist/plugins/assertions-z5GQd_bB.cjs +1 -0
- package/dist/{extensions → plugins}/editor/editor.d.cts +56 -56
- package/dist/{extensions → plugins}/editor/editor.d.ts +56 -56
- package/dist/plugins/editor/editor.d.ts.map +1 -0
- package/dist/{extensions → plugins}/editor/field_handle.d.cts +13 -13
- package/dist/{extensions → plugins}/editor/field_handle.d.ts +13 -13
- package/dist/plugins/editor/field_handle.d.ts.map +1 -0
- package/dist/plugins/editor/index.d.cts +22 -0
- package/dist/plugins/editor/index.d.ts +22 -0
- package/dist/plugins/editor/index.d.ts.map +1 -0
- package/dist/plugins/editor.cjs +1 -0
- package/dist/plugins/editor.d.cts +1 -0
- package/dist/plugins/editor.d.ts +1 -0
- package/dist/plugins/editor.development.cjs +1 -0
- package/dist/{extensions/editor/index.development.js → plugins/editor.development.js} +83 -66
- package/dist/{extensions/editor/index.js → plugins/editor.js} +83 -66
- package/dist/plugins/events/event_channel.d.cts +13 -0
- package/dist/plugins/events/event_channel.d.ts +13 -0
- package/dist/plugins/events/event_channel.d.ts.map +1 -0
- package/dist/plugins/events/event_registry.d.cts +22 -0
- package/dist/plugins/events/event_registry.d.ts +22 -0
- package/dist/plugins/events/event_registry.d.ts.map +1 -0
- package/dist/plugins/events/facade.d.cts +26 -0
- package/dist/plugins/events/facade.d.ts +26 -0
- package/dist/plugins/events/facade.d.ts.map +1 -0
- package/dist/plugins/events/index.d.cts +10 -0
- package/dist/plugins/events/index.d.ts +10 -0
- package/dist/plugins/events/index.d.ts.map +1 -0
- package/dist/plugins/events.cjs +1 -0
- package/dist/plugins/events.d.cts +1 -0
- package/dist/plugins/events.d.ts +1 -0
- package/dist/plugins/events.development.cjs +1 -0
- package/dist/plugins/events.development.js +174 -0
- package/dist/plugins/events.js +159 -0
- package/dist/plugins/observers/index.d.cts +23 -0
- package/dist/plugins/observers/index.d.ts +23 -0
- package/dist/plugins/observers/index.d.ts.map +1 -0
- package/dist/plugins/observers/observer_registry.d.cts +101 -0
- package/dist/plugins/observers/observer_registry.d.ts +101 -0
- package/dist/plugins/observers/observer_registry.d.ts.map +1 -0
- package/dist/plugins/observers.cjs +1 -0
- package/dist/plugins/observers.d.cts +1 -0
- package/dist/plugins/observers.d.ts +1 -0
- package/dist/plugins/observers.development.cjs +1 -0
- package/dist/plugins/observers.development.js +431 -0
- package/dist/plugins/observers.js +403 -0
- package/dist/plugins/relation_store-BsoegrZh.js +313 -0
- package/dist/plugins/relation_store-DQKSnxsm.cjs +1 -0
- package/dist/plugins/relation_store-RBhpcE28.cjs +1 -0
- package/dist/plugins/relation_store-RqW5Snx6.js +328 -0
- package/dist/plugins/relations/builtin_relations.d.cts +48 -0
- package/dist/plugins/relations/builtin_relations.d.ts +48 -0
- package/dist/plugins/relations/builtin_relations.d.ts.map +1 -0
- package/dist/plugins/relations/facade.d.cts +73 -0
- package/dist/plugins/relations/facade.d.ts +73 -0
- package/dist/plugins/relations/facade.d.ts.map +1 -0
- package/dist/plugins/relations/index.d.cts +11 -0
- package/dist/plugins/relations/index.d.ts +11 -0
- package/dist/plugins/relations/index.d.ts.map +1 -0
- package/dist/{core/ecs → plugins/relations}/relation_service.d.cts +93 -105
- package/dist/{core/ecs → plugins/relations}/relation_service.d.ts +93 -105
- package/dist/plugins/relations/relation_service.d.ts.map +1 -0
- package/dist/plugins/relations/relation_store.d.cts +177 -0
- package/dist/plugins/relations/relation_store.d.ts +177 -0
- package/dist/plugins/relations/relation_store.d.ts.map +1 -0
- package/dist/plugins/relations.cjs +1 -0
- package/dist/plugins/relations.d.cts +1 -0
- package/dist/plugins/relations.d.ts +1 -0
- package/dist/plugins/relations.development.cjs +1 -0
- package/dist/plugins/relations.development.js +603 -0
- package/dist/plugins/relations.js +553 -0
- package/dist/plugins/snapshots/index.d.cts +33 -0
- package/dist/plugins/snapshots/index.d.ts +33 -0
- package/dist/plugins/snapshots/index.d.ts.map +1 -0
- package/dist/plugins/snapshots/resume.d.cts +57 -0
- package/dist/plugins/snapshots/resume.d.ts +57 -0
- package/dist/plugins/snapshots/resume.d.ts.map +1 -0
- package/dist/plugins/snapshots/snapshot_service.d.cts +59 -0
- package/dist/plugins/snapshots/snapshot_service.d.ts +59 -0
- package/dist/plugins/snapshots/snapshot_service.d.ts.map +1 -0
- package/dist/plugins/snapshots.cjs +1 -0
- package/dist/plugins/snapshots.d.cts +1 -0
- package/dist/plugins/snapshots.d.ts +1 -0
- package/dist/plugins/snapshots.development.cjs +1 -0
- package/dist/plugins/snapshots.development.js +737 -0
- package/dist/plugins/snapshots.js +737 -0
- package/dist/plugins/solid/index.d.cts +8 -0
- package/dist/plugins/solid/index.d.ts +8 -0
- package/dist/plugins/solid/index.d.ts.map +1 -0
- package/dist/plugins/solid/solid.d.cts +97 -0
- package/dist/plugins/solid/solid.d.ts +97 -0
- package/dist/plugins/solid/solid.d.ts.map +1 -0
- package/dist/plugins/solid.cjs +1 -0
- package/dist/plugins/solid.d.cts +1 -0
- package/dist/plugins/solid.d.ts +1 -0
- package/dist/plugins/solid.development.cjs +1 -0
- package/dist/plugins/solid.development.js +319 -0
- package/dist/plugins/solid.js +319 -0
- package/dist/plugins/workers/index.d.cts +75 -0
- package/dist/plugins/workers/index.d.ts +75 -0
- package/dist/plugins/workers/index.d.ts.map +1 -0
- package/dist/plugins/workers/node_threads.d.cts +25 -0
- package/dist/plugins/workers/node_threads.d.ts +25 -0
- package/dist/plugins/workers/node_threads.d.ts.map +1 -0
- package/dist/plugins/workers/plan.d.cts +61 -0
- package/dist/plugins/workers/plan.d.ts +61 -0
- package/dist/plugins/workers/plan.d.ts.map +1 -0
- package/dist/plugins/workers/pool.d.cts +144 -0
- package/dist/plugins/workers/pool.d.ts +144 -0
- package/dist/plugins/workers/pool.d.ts.map +1 -0
- package/dist/plugins/workers/protocol.d.cts +112 -0
- package/dist/plugins/workers/protocol.d.ts +112 -0
- package/dist/plugins/workers/protocol.d.ts.map +1 -0
- package/dist/plugins/workers/worker_bind.d.cts +64 -0
- package/dist/plugins/workers/worker_bind.d.ts +64 -0
- package/dist/plugins/workers/worker_bind.d.ts.map +1 -0
- package/dist/plugins/workers/worker_loop.d.cts +14 -0
- package/dist/plugins/workers/worker_loop.d.ts +14 -0
- package/dist/plugins/workers/worker_loop.d.ts.map +1 -0
- package/dist/plugins/workers.cjs +1 -0
- package/dist/plugins/workers.d.cts +1 -0
- package/dist/plugins/workers.d.ts +1 -0
- package/dist/plugins/workers.development.cjs +1 -0
- package/dist/plugins/workers.development.js +596 -0
- package/dist/plugins/workers.js +474 -0
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.d.cts +4 -4
- package/dist/primitives.d.ts +4 -4
- package/dist/primitives.development.cjs +1 -1
- package/dist/primitives.development.js +66 -22
- package/dist/primitives.js +66 -22
- package/dist/shared-BKl12xF1.js +132 -0
- package/dist/shared-Dk-pACZT.cjs +1 -0
- package/dist/shared.cjs +1 -1
- package/dist/shared.d.cts +7 -7
- package/dist/shared.d.ts +7 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.development.cjs +1 -1
- package/dist/shared.development.js +4 -3
- package/dist/shared.js +4 -3
- package/dist/topological_sort-Cc_yXqPT.js +346 -0
- package/dist/topological_sort-vp1imU6D.cjs +1 -0
- package/dist/type_primitives/assertions.d.cts +12 -16
- package/dist/type_primitives/assertions.d.ts +12 -16
- package/dist/type_primitives/assertions.d.ts.map +1 -1
- package/dist/type_primitives/binary_heap/binary_heap.d.cts +2 -6
- package/dist/type_primitives/binary_heap/binary_heap.d.ts +2 -6
- package/dist/type_primitives/binary_heap/binary_heap.d.ts.map +1 -1
- package/dist/type_primitives/bitset/bitset.d.cts +7 -11
- package/dist/type_primitives/bitset/bitset.d.ts +7 -11
- package/dist/type_primitives/bitset/bitset.d.ts.map +1 -1
- package/dist/type_primitives/brand.d.cts +2 -7
- package/dist/type_primitives/brand.d.ts +2 -7
- package/dist/type_primitives/brand.d.ts.map +1 -1
- package/dist/type_primitives/error.d.cts +1 -2
- package/dist/type_primitives/error.d.ts +1 -2
- package/dist/type_primitives/error.d.ts.map +1 -1
- package/dist/type_primitives/index.d.cts +1 -1
- package/dist/type_primitives/index.d.ts +1 -1
- package/dist/type_primitives/sparse_map/sparse_map.d.cts +3 -7
- package/dist/type_primitives/sparse_map/sparse_map.d.ts +3 -7
- package/dist/type_primitives/sparse_map/sparse_map.d.ts.map +1 -1
- package/dist/type_primitives/sparse_set/sparse_set.d.cts +2 -6
- package/dist/type_primitives/sparse_set/sparse_set.d.ts +2 -6
- package/dist/type_primitives/sparse_set/sparse_set.d.ts.map +1 -1
- package/dist/type_primitives/topological_sort/topological_sort.d.cts +1 -5
- package/dist/type_primitives/topological_sort/topological_sort.d.ts +1 -5
- package/dist/type_primitives/topological_sort/topological_sort.d.ts.map +1 -1
- package/dist/type_primitives/typed_arrays/typed_arrays.d.cts +18 -17
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts +18 -17
- package/dist/type_primitives/typed_arrays/typed_arrays.d.ts.map +1 -1
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/version.d.cts +4 -4
- package/dist/version.d.ts +4 -4
- package/dist/worker.cjs +1 -0
- package/dist/worker.d.cts +17 -0
- package/dist/worker.d.ts +17 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.development.cjs +1 -0
- package/dist/worker.development.js +253 -0
- package/dist/worker.js +253 -0
- package/package.json +363 -191
- package/dist/core/ecs/builtin_relations.d.cts +0 -43
- package/dist/core/ecs/builtin_relations.d.ts +0 -43
- package/dist/core/ecs/builtin_relations.d.ts.map +0 -1
- package/dist/core/ecs/event_registry.d.cts +0 -22
- package/dist/core/ecs/event_registry.d.ts +0 -22
- package/dist/core/ecs/event_registry.d.ts.map +0 -1
- package/dist/core/ecs/relation_service.d.ts.map +0 -1
- package/dist/core/ecs/resume.d.cts +0 -85
- package/dist/core/ecs/resume.d.ts +0 -85
- package/dist/core/ecs/resume.d.ts.map +0 -1
- package/dist/core/ecs/snapshot_service.d.cts +0 -94
- package/dist/core/ecs/snapshot_service.d.ts +0 -94
- package/dist/core/ecs/snapshot_service.d.ts.map +0 -1
- package/dist/extensions/editor/editor.d.ts.map +0 -1
- package/dist/extensions/editor/field_handle.d.ts.map +0 -1
- package/dist/extensions/editor/index.cjs +0 -1
- package/dist/extensions/editor/index.d.cts +0 -21
- package/dist/extensions/editor/index.d.ts +0 -21
- package/dist/extensions/editor/index.d.ts.map +0 -1
- package/dist/extensions/editor/index.development.cjs +0 -1
- package/dist/extensions/reactive/ecs_sync.d.cts +0 -214
- package/dist/extensions/reactive/ecs_sync.d.ts +0 -214
- package/dist/extensions/reactive/ecs_sync.d.ts.map +0 -1
- package/dist/extensions/reactive/index.cjs +0 -1
- package/dist/extensions/reactive/index.d.cts +0 -23
- package/dist/extensions/reactive/index.d.ts +0 -23
- package/dist/extensions/reactive/index.d.ts.map +0 -1
- package/dist/extensions/reactive/index.development.cjs +0 -1
- package/dist/extensions/reactive/index.development.js +0 -215
- package/dist/extensions/reactive/index.js +0 -215
- package/dist/extensions/solid/index.cjs +0 -1
- package/dist/extensions/solid/index.d.cts +0 -6
- package/dist/extensions/solid/index.d.ts +0 -6
- package/dist/extensions/solid/index.d.ts.map +0 -1
- package/dist/extensions/solid/index.development.cjs +0 -1
- package/dist/extensions/solid/index.development.js +0 -40
- package/dist/extensions/solid/index.js +0 -36
- package/dist/extensions/solid/kernel_solid.d.cts +0 -45
- package/dist/extensions/solid/kernel_solid.d.ts +0 -45
- package/dist/extensions/solid/kernel_solid.d.ts.map +0 -1
- package/dist/host_commands-3jyFfWNg.js +0 -2326
- package/dist/host_commands-DNf0f6ko.cjs +0 -1
- package/dist/internal-C9jjL90H.js +0 -2485
- package/dist/internal-RZN14uMw.cjs +0 -2
- package/dist/interop-CT-REx0W.cjs +0 -1
- package/dist/interop-CcY6ASQc.js +0 -18
- package/dist/interop-DqxleBo7.js +0 -18
- package/dist/interop-T1HZ-Dpa.cjs +0 -1
- package/dist/kernel-Cz2Kxlwl.js +0 -240
- package/dist/kernel-DgyrLFjW.js +0 -227
- package/dist/kernel-sw7ScKWu.cjs +0 -1
- package/dist/kernel-yWV3XnAb.cjs +0 -1
- package/dist/reactive/array.d.cts +0 -24
- package/dist/reactive/array.d.ts +0 -24
- package/dist/reactive/array.d.ts.map +0 -1
- package/dist/reactive/index.cjs +0 -1
- package/dist/reactive/index.d.cts +0 -11
- package/dist/reactive/index.d.ts +0 -11
- package/dist/reactive/index.d.ts.map +0 -1
- package/dist/reactive/index.development.cjs +0 -1
- package/dist/reactive/index.development.js +0 -18
- package/dist/reactive/index.js +0 -18
- package/dist/reactive/interop.d.cts +0 -19
- package/dist/reactive/interop.d.ts +0 -19
- package/dist/reactive/interop.d.ts.map +0 -1
- package/dist/reactive/kernel.d.cts +0 -73
- package/dist/reactive/kernel.d.ts +0 -73
- package/dist/reactive/kernel.d.ts.map +0 -1
- package/dist/reactive/map.d.cts +0 -16
- package/dist/reactive/map.d.ts +0 -16
- package/dist/reactive/map.d.ts.map +0 -1
- package/dist/reactive/shallow.d.cts +0 -11
- package/dist/reactive/shallow.d.ts +0 -11
- package/dist/reactive/shallow.d.ts.map +0 -1
- package/dist/reactive/struct.d.cts +0 -10
- package/dist/reactive/struct.d.ts +0 -10
- package/dist/reactive/struct.d.ts.map +0 -1
- package/dist/shallow-9S1pY_Iw.js +0 -159
- package/dist/shallow-C5YmTbtb.cjs +0 -1
- package/dist/shallow-DQ8aG51_.cjs +0 -1
- package/dist/shallow-DfnAm9vG.js +0 -150
- package/dist/shared-BMXh9hxm.cjs +0 -1
- package/dist/shared-DQKK0i-E.js +0 -109
- package/dist/topological_sort-BDvEyb9W.cjs +0 -1
- package/dist/topological_sort-DK6EjpWa.js +0 -135
- package/dist/typed_arrays-BcXcnzB4.js +0 -258
- package/dist/typed_arrays-D3NmwtCG.cjs +0 -1
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { D as M, R as k, a as L, e as w, g, c as N, U as m } from "./relation_store-RqW5Snx6.js";
|
|
2
|
+
import { r as b } from "./arrays-Dr_1hCjL.js";
|
|
3
|
+
import { ECSError as O, ECS_ERROR as p } from "../index.development.js";
|
|
4
|
+
import { u as x } from "./assertions-gtDVfbnQ.js";
|
|
5
|
+
class H {
|
|
6
|
+
constructor(e) {
|
|
7
|
+
this._host = e;
|
|
8
|
+
}
|
|
9
|
+
// Parallel array indexed by RelationID. Each entry owns a backing sparse
|
|
10
|
+
// component (membership + the target field when exclusive) plus the reverse
|
|
11
|
+
// index and multi-target forward sets. Layered on the sparse storage class,
|
|
12
|
+
// so add, remove and re-target of a pair cause no archetype transition.
|
|
13
|
+
_relations = [];
|
|
14
|
+
// True once any relation registers a non-`orphan` `onDeleteTarget` policy.
|
|
15
|
+
// Gates the target-role cleanup branch in both of the Store's
|
|
16
|
+
// destroy paths so the common case (no cleanup policies) leaves the destroy
|
|
17
|
+
// hot path untouched, mirrors the Store's `count > 0` and sparse-store gates.
|
|
18
|
+
_hasTargetCleanup = !1;
|
|
19
|
+
// Reused radix scratch for the hierarchy depth-ordering driver.
|
|
20
|
+
// The motivating use case, transform propagation, is a per-tick depth-ordered
|
|
21
|
+
// pass, so `forEachHierarchyMatch` allocating two 1024-entry histograms and
|
|
22
|
+
// an `out` array per call would be per-tick GC churn. `radixSortByIndex` fully
|
|
23
|
+
// consumes these three before any `cb` fires, so unlike
|
|
24
|
+
// the call-local `matched`, `buckets`, `depthMemo` and `visiting` (which stay
|
|
25
|
+
// live across the emit loop and would corrupt under a re-entrant callback) they
|
|
26
|
+
// are safe to share as instance state. The observers plugin keeps the same
|
|
27
|
+
// scratch privately, so this one cannot be shared with it.
|
|
28
|
+
_hierarchyRadixOut = new Uint32Array(1024);
|
|
29
|
+
_hierarchyRadixC0 = new Int32Array(1024);
|
|
30
|
+
_hierarchyRadixC1 = new Int32Array(1024);
|
|
31
|
+
/** The registry, indexed by RelationID, the read-only view the Store's
|
|
32
|
+
* `stateHash`, snapshot and restore paths iterate. */
|
|
33
|
+
get stores() {
|
|
34
|
+
return this._relations;
|
|
35
|
+
}
|
|
36
|
+
/** Number of registered relations. */
|
|
37
|
+
get count() {
|
|
38
|
+
return this._relations.length;
|
|
39
|
+
}
|
|
40
|
+
/** Whether any relation registered a non-`orphan` `onDeleteTarget` policy,
|
|
41
|
+
* the destroy paths' gate for `cleanupTarget`. */
|
|
42
|
+
get hasTargetCleanup() {
|
|
43
|
+
return this._hasTargetCleanup;
|
|
44
|
+
}
|
|
45
|
+
/** Register a relation kind. `exclusive` (the default) → one target per
|
|
46
|
+
* source, stored in a backing `{ target: f64 }` sparse component, so the
|
|
47
|
+
* forward index rides the sparse store and inherits query membership,
|
|
48
|
+
* `stateHash` + snapshot and restore for free. `multi` → a set of
|
|
49
|
+
* targets per source, backed by a sparse tag for membership plus a side
|
|
50
|
+
* forward index the relation owns. The two cardinalities are mutually
|
|
51
|
+
* exclusive. `onDeleteTarget` selects the cleanup policy run when a target
|
|
52
|
+
* is destroyed, `delete` (cascade-destroy sources), `clear` (drop the link,
|
|
53
|
+
* sources survive), or `orphan` (default: leave it dangling). See
|
|
54
|
+
* `relation_store.ts`.
|
|
55
|
+
*
|
|
56
|
+
* The backing sparse store is resolved and handed to the relation so it can
|
|
57
|
+
* drive forward and membership rows directly, the cardinality-specific
|
|
58
|
+
* interaction belongs to `ExclusiveRelationStore` and `MultiRelationStore`, not to a
|
|
59
|
+
* branch here. */
|
|
60
|
+
registerRelation(e) {
|
|
61
|
+
const t = e?.multi === !0, s = e?.exclusive === !0;
|
|
62
|
+
if (t && s)
|
|
63
|
+
throw new O(
|
|
64
|
+
p.RELATION_MODE_INVALID,
|
|
65
|
+
"relations.register: a relation cannot be both exclusive and multi-target"
|
|
66
|
+
);
|
|
67
|
+
const r = !t, i = e?.onDeleteTarget ?? M, n = r ? this._host.pushSparseStore([k], ["f64"]) : this._host.pushSparseStore([], []), o = this._relations.length;
|
|
68
|
+
return this._relations.push(
|
|
69
|
+
L(r, n, this._host.sparseStoreOf(n), i)
|
|
70
|
+
), i !== "orphan" && (this._hasTargetCleanup = !0), x(o);
|
|
71
|
+
}
|
|
72
|
+
_relationOf(e) {
|
|
73
|
+
const t = e, s = this._relations[t];
|
|
74
|
+
if (s === void 0)
|
|
75
|
+
throw new O(p.RELATION_NOT_REGISTERED, `relation ${t} is not registered`);
|
|
76
|
+
return s;
|
|
77
|
+
}
|
|
78
|
+
/** Add a `(R, tgt)` pair to `src`. No archetype transition. Exclusive:
|
|
79
|
+
* replaces any existing target (engine-enforced one-per-source), a no-op if
|
|
80
|
+
* `tgt` is already the target. Multi: adds `tgt` to the set, a no-op if
|
|
81
|
+
* already present. A dead `src` *or* `tgt` is caller error: it throws in
|
|
82
|
+
* `DEV` and is a no-op in production, symmetric, so a production build
|
|
83
|
+
* never links a reverse-index entry keyed by a destroyed handle. */
|
|
84
|
+
addRelation(e, t, s) {
|
|
85
|
+
const r = this._relationOf(t);
|
|
86
|
+
if (!this._host.isAlive(e))
|
|
87
|
+
throw w("addRelation", e, "source");
|
|
88
|
+
if (!this._host.isAlive(s))
|
|
89
|
+
throw w("addRelation", s, "target");
|
|
90
|
+
r.link(e, s);
|
|
91
|
+
}
|
|
92
|
+
/** Remove a `(R, tgt)` pair from `src`. No archetype transition. Exclusive:
|
|
93
|
+
* `tgt` is optional and the removal is a no-op when it names a target other
|
|
94
|
+
* than the current one. Multi: omitting `tgt` removes *all* of `src`'s
|
|
95
|
+
* targets. Passing one removes only that pair (dropping membership when the
|
|
96
|
+
* set empties). */
|
|
97
|
+
removeRelation(e, t, s) {
|
|
98
|
+
const r = this._relationOf(t);
|
|
99
|
+
if (!this._host.isAlive(e))
|
|
100
|
+
throw w("removeRelation", e, "source");
|
|
101
|
+
r.unlink(e, s);
|
|
102
|
+
}
|
|
103
|
+
/** The single target of `src` under an exclusive relation, or `undefined`.
|
|
104
|
+
* Throws in `DEV` on a multi-target relation (use `targetsOf`). */
|
|
105
|
+
targetOf(e, t) {
|
|
106
|
+
const s = this._relationOf(t);
|
|
107
|
+
{
|
|
108
|
+
if (!s.exclusive)
|
|
109
|
+
throw new O(
|
|
110
|
+
p.RELATION_MODE_MISMATCH,
|
|
111
|
+
"targetOf: relation is multi-target, use targetsOf"
|
|
112
|
+
);
|
|
113
|
+
if (!this._host.isAlive(e)) throw w("targetOf", e);
|
|
114
|
+
}
|
|
115
|
+
return s.singleTargetAt(g(e));
|
|
116
|
+
}
|
|
117
|
+
/** All targets of `src` under `R`, one or zero for exclusive, the full set
|
|
118
|
+
* for multi, ascending by id. */
|
|
119
|
+
targetsOf(e, t) {
|
|
120
|
+
const s = this._relationOf(t);
|
|
121
|
+
if (!this._host.isAlive(e)) throw w("targetsOf", e);
|
|
122
|
+
return s.targetsAt(g(e));
|
|
123
|
+
}
|
|
124
|
+
/** Sources that point at `tgt` under `R` (the reverse index), ascending by
|
|
125
|
+
* id. Empty when none. */
|
|
126
|
+
sourcesOf(e, t) {
|
|
127
|
+
return this._relationOf(t).sourcesOf(e);
|
|
128
|
+
}
|
|
129
|
+
/** Whether `src` holds any pair under `R`. */
|
|
130
|
+
hasRelation(e, t) {
|
|
131
|
+
return this._host.hasSparse(e, this._relationOf(t).sparse);
|
|
132
|
+
}
|
|
133
|
+
/** All `(source, target)` pairs of relation `R`, the `(R, *)` wildcard.
|
|
134
|
+
* Sources are emitted in **canonical entity-index order** (the
|
|
135
|
+
* determinism convention): exclusive relations ride the backing sparse
|
|
136
|
+
* store's `canonicalIndices`, multi relations ride the same
|
|
137
|
+
* `forEachCanonicalTargetSet` traversal that `stateHash` and
|
|
138
|
+
* `snapshotRelations` use. A multi source's targets follow ascending by id.
|
|
139
|
+
* Empty when the relation holds no pairs. Cold path, it allocates the result
|
|
140
|
+
* array, and for multi it sorts each source's target set. Not for per-tick
|
|
141
|
+
* use. The point-query forms are `targetOf` and `targetsOf`. */
|
|
142
|
+
pairsOf(e) {
|
|
143
|
+
const t = this._relationOf(e), s = [], r = this._host.generations();
|
|
144
|
+
return t.forEachCanonicalPair(
|
|
145
|
+
(i) => N(i, r[i]),
|
|
146
|
+
(i, n) => s.push([i, n])
|
|
147
|
+
), s;
|
|
148
|
+
}
|
|
149
|
+
/** Every `(relation, source)` pointing at `tgt`, across **all** registered
|
|
150
|
+
* relation kinds, the `(*, T)` wildcard. Walks the relation registry
|
|
151
|
+
* in id order (each relation's reverse index already returns sources
|
|
152
|
+
* ascending by id), so the result is ordered by relation id then source id.
|
|
153
|
+
* Empty when nothing targets `tgt`. The single-relation form is
|
|
154
|
+
* `sourcesOf(tgt, def)`. */
|
|
155
|
+
sourcesOfAny(e) {
|
|
156
|
+
const t = [], s = this._relations;
|
|
157
|
+
for (let r = 0; r < s.length; r++) {
|
|
158
|
+
const i = x(r), n = s[r].sourcesOf(e);
|
|
159
|
+
for (let o = 0; o < n.length; o++) t.push([i, n[o]]);
|
|
160
|
+
}
|
|
161
|
+
return t;
|
|
162
|
+
}
|
|
163
|
+
// --- Wildcard query terms ---
|
|
164
|
+
// `(R, *)` and `(*, T)` as composable query terms (vs the cold materializing
|
|
165
|
+
// helpers `pairsOf` and `sourcesOfAny` above). Membership semantics: each
|
|
166
|
+
// matching source is yielded once. Fetch its targets on demand with
|
|
167
|
+
// `targetsOf`. Insertion order, consistent with the `andSparse` path
|
|
168
|
+
// (deterministic by construction across lockstep peers, canonical sorting is
|
|
169
|
+
// reserved for `stateHash` and for snapshot). Canonical ordering costs far
|
|
170
|
+
// more for each iteration and buys no determinism here.
|
|
171
|
+
/** The backing sparse component id of relation `R`, the membership store a
|
|
172
|
+
* `(R, *)` wildcard term (`Query.andRelation`) drives through the shared
|
|
173
|
+
* sparse-match path. Exclusive relations back a `{ target: f64 }` sparse
|
|
174
|
+
* component, multi a tag. Both carry per-source membership, so "has any
|
|
175
|
+
* `(R, *)` pair" is exactly membership in this store (including an
|
|
176
|
+
* orphan-dangling source, whose membership row persists, consistent with
|
|
177
|
+
* `pairsOf`). The def is engine-owned and never handed to callers. This hands
|
|
178
|
+
* the query builder only its erased id for the `sparseIncludes` list. */
|
|
179
|
+
relationBackingSparseId(e) {
|
|
180
|
+
return this._relationOf(e).sparse;
|
|
181
|
+
}
|
|
182
|
+
/** Drive a `(*, T)` wildcard query (`Query.forEachRelatedTo`): every source
|
|
183
|
+
* related to `target` under **any** relation, intersected with the query's
|
|
184
|
+
* dense mask, its sparse require and exclude terms, and the default
|
|
185
|
+
* enabled-row filter,
|
|
186
|
+
* each source yielded once. Unions `sourcesOf(target, R)` across every
|
|
187
|
+
* relation into a `Set` (dedup by full `EntityID`, a source related to `T`
|
|
188
|
+
* via two relations is yielded once), then sorts ascending: the cross-relation
|
|
189
|
+
* union has no inherent order, so one cold sort gives a deterministic,
|
|
190
|
+
* canonical `(*, T)` order matching `sourcesOf` and `sourcesOfAny` (which sort
|
|
191
|
+
* the same way). Cold and structural, not a per-tick hot loop over many targets.
|
|
192
|
+
* `sparseIncludes` and `sparseExcludes` carry both raw sparse terms and the backing
|
|
193
|
+
* stores of any composed `(R, *)` terms, so it intersects with them uniformly. */
|
|
194
|
+
forEachTargetMatch(e, t, s, r, i, n) {
|
|
195
|
+
const { sparseIncludes: o, sparseExcludes: l, includesDisabled: a } = i, h = this._relations;
|
|
196
|
+
if (h.length === 0) return;
|
|
197
|
+
const f = /* @__PURE__ */ new Set();
|
|
198
|
+
for (let c = 0; c < h.length; c++) {
|
|
199
|
+
const u = h[c].sourcesOf(e);
|
|
200
|
+
for (let R = 0; R < u.length; R++) f.add(u[R]);
|
|
201
|
+
}
|
|
202
|
+
if (f.size === 0) return;
|
|
203
|
+
const E = Array.from(f).sort((c, u) => c - u), y = this._host.sparseStores(), T = this._host.entityArchetypes(), _ = this._host.entityRows(), v = this._host.archetypes();
|
|
204
|
+
for (let c = 0; c < E.length; c++) {
|
|
205
|
+
const u = x(E[c]), R = g(u), C = T[R];
|
|
206
|
+
if (C === m) continue;
|
|
207
|
+
const D = v[C], S = D.mask;
|
|
208
|
+
if (!S.contains(t) || s !== null && S.overlaps(s) || r !== null && !S.overlaps(r)) continue;
|
|
209
|
+
let I = !0;
|
|
210
|
+
for (let d = 0; d < o.length; d++)
|
|
211
|
+
if (!y[o[d]].has(R)) {
|
|
212
|
+
I = !1;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
if (I) {
|
|
216
|
+
for (let d = 0; d < l.length; d++)
|
|
217
|
+
if (y[l[d]].has(R)) {
|
|
218
|
+
I = !1;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
if (I) {
|
|
222
|
+
if (!a) {
|
|
223
|
+
const d = _[R];
|
|
224
|
+
if (d !== m && d >= D.enabledCount) continue;
|
|
225
|
+
}
|
|
226
|
+
n(u);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** Reclaim reverse-index memory: drop every relation's reverse entries whose
|
|
232
|
+
* **target** has been destroyed, returning the total dropped across all
|
|
233
|
+
* relations. Under the default `orphan` policy a destroyed target
|
|
234
|
+
* leaves its reverse entry intact until each source re-targets or dies, so a
|
|
235
|
+
* long-lived source that orphan-points at a churn of short-lived targets and
|
|
236
|
+
* never re-targets accumulates dead-target keys without bound. This cold-path
|
|
237
|
+
* hook drops them on demand, call it at scene or snapshot boundaries.
|
|
238
|
+
*
|
|
239
|
+
* Purely a memory reclaim with no observable state change: forward links stay
|
|
240
|
+
* dangling (so `orphan`'s `targetOf`-returns-the-dead-handle contract is
|
|
241
|
+
* unchanged), `stateHash` is unaffected (the reverse index is derived, never
|
|
242
|
+
* folded), and the dropped entries are faithfully rebuilt by snapshot and restore
|
|
243
|
+
* from the surviving forward links (the snapshot plugin's
|
|
244
|
+
* `_rebuildRelationIndices`). The only
|
|
245
|
+
* difference a caller can see is `sourcesOf(deadHandle, R)` going from the
|
|
246
|
+
* dangling sources to `[]`, both meaningless once the target is gone.
|
|
247
|
+
* No-op (returns 0) when no relations are registered. */
|
|
248
|
+
compactRelations() {
|
|
249
|
+
const e = this._relations;
|
|
250
|
+
if (e.length === 0) return 0;
|
|
251
|
+
const t = (r) => this._host.isAlive(r);
|
|
252
|
+
let s = 0;
|
|
253
|
+
for (let r = 0; r < e.length; r++) s += e[r].pruneDeadReverse(t);
|
|
254
|
+
return s;
|
|
255
|
+
}
|
|
256
|
+
// --- Traversal (parent and IsA chains over an exclusive relation) ---
|
|
257
|
+
// Traversal is **exclusive-only**: an exclusive relation gives each source at
|
|
258
|
+
// most one target ("parent"), so the forward direction is a chain and the
|
|
259
|
+
// reverse index (`sourcesOf`) gives children, together a proper tree. A
|
|
260
|
+
// multi relation is a dag with no single parent chain, so these throw
|
|
261
|
+
// `RELATION_MODE_MISMATCH` in `DEV` (mirroring `targetOf`). Acyclicity
|
|
262
|
+
// is assumed. Every walk carries a visited set so a malformed (cyclic) chain
|
|
263
|
+
// is a loud `RELATION_CYCLE` in `DEV` and a safe early-out (never a hang)
|
|
264
|
+
// in production. Cold path, allocates the result array. Not for per-tick use.
|
|
265
|
+
/** Walk exclusive relation `R` from `src` toward the root, returning the
|
|
266
|
+
* **up**-chain `[src, parent, grandparent, …, root]` (nearest-ancestor-first,
|
|
267
|
+
* inclusive of both endpoints). A source with no target returns `[src]`. The
|
|
268
|
+
* root is the first entity in the chain with no `R`-target, **or** a dangling
|
|
269
|
+
* dead target handle (see below). Throws `RELATION_MODE_MISMATCH` on a multi
|
|
270
|
+
* relation and `RELATION_CYCLE` on a cycle (both `DEV`-only, in production
|
|
271
|
+
* a cycle stops at the repeated node).
|
|
272
|
+
*
|
|
273
|
+
* **Dangling links terminate the chain.** Under the `orphan` policy a source
|
|
274
|
+
* keeps pointing at a destroyed target (a dead handle). The walk must *not*
|
|
275
|
+
* advance through such a handle: the backing store is keyed by entity
|
|
276
|
+
* **index**, so reading the dead handle's index would return whatever now
|
|
277
|
+
* occupies that recycled slot, splicing the chain onto an unrelated entity
|
|
278
|
+
* (the ABA the `EntityID`-keyed reverse index avoids for `cascadeOf`). So a
|
|
279
|
+
* dead next-hop is appended as the chain's (dangling) terminus and the walk
|
|
280
|
+
* stops. The caller can detect it with `isAlive`, exactly as `targetOf`
|
|
281
|
+
* returns a dead handle. */
|
|
282
|
+
ancestorsOf(e, t) {
|
|
283
|
+
const s = this._relationOf(t);
|
|
284
|
+
{
|
|
285
|
+
if (!s.exclusive)
|
|
286
|
+
throw new O(
|
|
287
|
+
p.RELATION_MODE_MISMATCH,
|
|
288
|
+
"ancestorsOf: relation is multi-target, traversal needs an exclusive (parent) chain"
|
|
289
|
+
);
|
|
290
|
+
if (!this._host.isAlive(e)) throw w("ancestorsOf", e);
|
|
291
|
+
}
|
|
292
|
+
const r = this._host.sparseStoreOf(s.sparse), i = [e], n = /* @__PURE__ */ new Set([g(e)]);
|
|
293
|
+
let o = e;
|
|
294
|
+
for (; ; ) {
|
|
295
|
+
const l = r.getField(g(o), 0);
|
|
296
|
+
if (l === void 0) break;
|
|
297
|
+
const a = x(l);
|
|
298
|
+
if (!this._host.isAlive(a)) {
|
|
299
|
+
i.push(a);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
const h = g(a);
|
|
303
|
+
if (n.has(h))
|
|
304
|
+
throw new O(
|
|
305
|
+
p.RELATION_CYCLE,
|
|
306
|
+
`ancestorsOf: cycle in relation chain at entity index ${h}`
|
|
307
|
+
);
|
|
308
|
+
n.add(h), o = a, i.push(o);
|
|
309
|
+
}
|
|
310
|
+
return i;
|
|
311
|
+
}
|
|
312
|
+
/** The root of `src`'s exclusive-relation chain, the last entity of
|
|
313
|
+
* `ancestorsOf` (the one with no `R`-target). `src` itself when it has no
|
|
314
|
+
* target. If the chain ends in a dangling dead target handle (orphan policy),
|
|
315
|
+
* that handle is the root, `isAlive`-check the result if dangling links are
|
|
316
|
+
* possible. Same `DEV` guards as `ancestorsOf`. */
|
|
317
|
+
rootOf(e, t) {
|
|
318
|
+
const s = this.ancestorsOf(e, t);
|
|
319
|
+
return s[s.length - 1];
|
|
320
|
+
}
|
|
321
|
+
/** Walk exclusive relation `R` **down** from `root` over the reverse index,
|
|
322
|
+
* returning the subtree (including `root`) breadth-first, **parents before
|
|
323
|
+
* children** (the `cascade` order). Children of each node come from
|
|
324
|
+
* `sourcesOf` (ascending by id), so the traversal is deterministic. Throws
|
|
325
|
+
* `RELATION_MODE_MISMATCH` on a multi relation and `RELATION_CYCLE` on a cycle
|
|
326
|
+
* (both `DEV`-only, in production an already-visited node is skipped, so
|
|
327
|
+
* it never hangs). */
|
|
328
|
+
cascadeOf(e, t) {
|
|
329
|
+
const s = this._relationOf(t);
|
|
330
|
+
{
|
|
331
|
+
if (!s.exclusive)
|
|
332
|
+
throw new O(
|
|
333
|
+
p.RELATION_MODE_MISMATCH,
|
|
334
|
+
"cascadeOf: relation is multi-target, traversal needs an exclusive (parent) chain"
|
|
335
|
+
);
|
|
336
|
+
if (!this._host.isAlive(e)) throw w("cascadeOf", e);
|
|
337
|
+
}
|
|
338
|
+
const r = [e], i = /* @__PURE__ */ new Set([g(e)]);
|
|
339
|
+
for (let n = 0; n < r.length; n++) {
|
|
340
|
+
const o = s.sourcesOf(r[n]);
|
|
341
|
+
for (let l = 0; l < o.length; l++) {
|
|
342
|
+
const a = o[l], h = g(a);
|
|
343
|
+
if (i.has(h))
|
|
344
|
+
throw new O(
|
|
345
|
+
p.RELATION_CYCLE,
|
|
346
|
+
`cascadeOf: cycle in relation chain at entity index ${h}`
|
|
347
|
+
);
|
|
348
|
+
i.add(h), r.push(a);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return r;
|
|
352
|
+
}
|
|
353
|
+
/** Purge a destroyed entity from the relation indices, its **source** role
|
|
354
|
+
* only: drop its forward target(s) and unlink it from every target's reverse
|
|
355
|
+
* set. The backing sparse membership row is dropped separately by the Store's
|
|
356
|
+
* `_purgeSparse`, so this must run *before* it (it reads the sparse target
|
|
357
|
+
* field for exclusive relations). The entity's **target** role is left
|
|
358
|
+
* intact: the reverse index is keyed by full `EntityID`, so a recycled slot
|
|
359
|
+
* never aliases the dead target's sources. The destroyed entity's **target**
|
|
360
|
+
* role is handled separately by `cleanupTarget` per each relation's
|
|
361
|
+
* `OnDeleteTarget` policy. Gated by the caller on `count > 0`. */
|
|
362
|
+
purgeSource(e) {
|
|
363
|
+
const t = this._relations;
|
|
364
|
+
for (let s = 0; s < t.length; s++) t[s].purgeSource(e);
|
|
365
|
+
}
|
|
366
|
+
/** Apply each relation's `OnDeleteTarget` policy for a destroyed **target**
|
|
367
|
+
* `targetId`. Walks the registry. For every relation whose reverse
|
|
368
|
+
* index has sources pointing at the dead target:
|
|
369
|
+
*
|
|
370
|
+
* - **`delete`**, append each source to `cascade`. The caller destroys them
|
|
371
|
+
* through the same path, so chains and trees cascade recursively. The sources'
|
|
372
|
+
* own source-role purge (`purgeSource`) drops their forward link and
|
|
373
|
+
* unlinks them from `targetId`'s reverse set, so no reverse entry leaks.
|
|
374
|
+
* - **`clear`**, drop each source's link to the dead target in place via
|
|
375
|
+
* `rs.unlink(src, targetId)` (exclusive drops the row, multi removes the
|
|
376
|
+
* target from the set, dropping membership when it empties). Sources
|
|
377
|
+
* survive, the cardinality bookkeeping is the relation's, not branched here.
|
|
378
|
+
* - **`orphan`**, skipped (the link is left dangling, safe because the
|
|
379
|
+
* reverse key carries the generation).
|
|
380
|
+
*
|
|
381
|
+
* `sourcesOf` returns a fresh snapshot, so mutating the reverse index while
|
|
382
|
+
* iterating is safe. Gated by the caller on `hasTargetCleanup`, so the
|
|
383
|
+
* whole walk is skipped when no relation opts into a non-`orphan` policy. */
|
|
384
|
+
cleanupTarget(e, t) {
|
|
385
|
+
const s = this._relations;
|
|
386
|
+
for (let r = 0; r < s.length; r++) {
|
|
387
|
+
const i = s[r];
|
|
388
|
+
if (i.onDeleteTarget === "orphan") continue;
|
|
389
|
+
const n = i.sourcesOf(e);
|
|
390
|
+
if (n.length !== 0) {
|
|
391
|
+
if (i.onDeleteTarget === "delete") {
|
|
392
|
+
for (let o = 0; o < n.length; o++) t.push(n[o]);
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
for (let o = 0; o < n.length; o++) i.unlink(n[o], e);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/** A query-match path: yield the matched entities, the exact
|
|
400
|
+
* sparse-match intersection (dense mask, sparse require and exclude, and the
|
|
401
|
+
* default enabled-row filter), in canonical **hierarchy depth order** over
|
|
402
|
+
* exclusive relation `R`: depth ascending (parents before children), **entity
|
|
403
|
+
* index ascending within each depth band**. Entities deeper than `maxDepth`
|
|
404
|
+
* are skipped (`Infinity` = unbounded). Only reached via `Query.forEachEntity`
|
|
405
|
+
* on a query carrying a `.hierarchy(R)` term.
|
|
406
|
+
*
|
|
407
|
+
* `.hierarchy(R)` does not narrow the matched set. It reorders it, so an
|
|
408
|
+
* entity with no `R`-parent is a root (depth 0) and is yielded first. Depth is a
|
|
409
|
+
* structural property of the *full* tree (an ancestor outside the matched set
|
|
410
|
+
* still counts toward depth), computed by a memoised upward walk shared across
|
|
411
|
+
* the whole batch, so a shared or deep chain costs O(nodes), not O(nodes²).
|
|
412
|
+
*
|
|
413
|
+
* The canonical order is produced without a comparator sort, which is far
|
|
414
|
+
* slower: (1) collect the matched ids via
|
|
415
|
+
* the host's `forEachSparseMatch`, (2) `radixSortByIndex` → entity-index
|
|
416
|
+
* ascending, and (3) stable-bucket by depth, since the input is index-ascending
|
|
417
|
+
* and the bucket append is stable, each depth band stays index-ascending.
|
|
418
|
+
* Tuned for the motivating per-tick case (transform propagation): the radix
|
|
419
|
+
* scratch is reused instance state (`_hierarchyRadix*`), so a per-tick pass
|
|
420
|
+
* churns no histograms. The working set (`matched`, `buckets`, `depthMemo`
|
|
421
|
+
* and `visiting`) is still allocated per call, as it must stay call-local for
|
|
422
|
+
* re-entrancy.
|
|
423
|
+
*
|
|
424
|
+
* Exclusive-only, a multi relation throws `RELATION_MODE_MISMATCH` in `DEV`
|
|
425
|
+
* (mirrors `cascadeOf` and `ancestorsOf`). A cycle is a loud `RELATION_CYCLE`
|
|
426
|
+
* in `DEV` and a safe break in production. */
|
|
427
|
+
forEachHierarchyMatch(e, t, s, r, i, n, o, l) {
|
|
428
|
+
const a = this._relationOf(n);
|
|
429
|
+
if (!a.exclusive)
|
|
430
|
+
throw new O(
|
|
431
|
+
p.RELATION_MODE_MISMATCH,
|
|
432
|
+
"hierarchy(): relation is multi-target, depth ordering needs an exclusive (parent) chain"
|
|
433
|
+
);
|
|
434
|
+
const h = [];
|
|
435
|
+
if (this._host.forEachSparseMatch(
|
|
436
|
+
e,
|
|
437
|
+
t,
|
|
438
|
+
s,
|
|
439
|
+
r,
|
|
440
|
+
i,
|
|
441
|
+
(_) => h.push(_)
|
|
442
|
+
), h.length === 0) return;
|
|
443
|
+
this._hierarchyRadixOut = b(
|
|
444
|
+
h,
|
|
445
|
+
this._hierarchyRadixOut,
|
|
446
|
+
this._hierarchyRadixC0,
|
|
447
|
+
this._hierarchyRadixC1
|
|
448
|
+
);
|
|
449
|
+
const f = this._host.sparseStoreOf(a.sparse), E = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Set(), T = [];
|
|
450
|
+
for (let _ = 0; _ < h.length; _++) {
|
|
451
|
+
const v = h[_], c = this._hierarchyDepthOf(g(v), f, E, y);
|
|
452
|
+
if (c > o) continue;
|
|
453
|
+
let u = T[c];
|
|
454
|
+
u === void 0 && (u = [], T[c] = u), u.push(v);
|
|
455
|
+
}
|
|
456
|
+
for (let _ = 0; _ < T.length; _++) {
|
|
457
|
+
const v = T[_];
|
|
458
|
+
if (v !== void 0)
|
|
459
|
+
for (let c = 0; c < v.length; c++) l(v[c]);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/** Depth of entity index `idx` in the exclusive-relation tree backing `store`
|
|
463
|
+
* (root = 0), for `forEachHierarchyMatch`. Memoised across the batch (`memo`),
|
|
464
|
+
* so a shared ancestor chain is walked once. Walks upward via the backing store's
|
|
465
|
+
* target field 0 (mirroring `ancestorsOf`), stopping at: a root (no target), an
|
|
466
|
+
* already-memoised node, or a dangling or dead parent (the child is then treated as
|
|
467
|
+
* a root, never advance through a recycled slot, the ABA `ancestorsOf` guards).
|
|
468
|
+
* `visiting` flags the nodes on the current upward path to catch a cycle,
|
|
469
|
+
* `RELATION_CYCLE` in `DEV`, treated as a root in production, and is emptied
|
|
470
|
+
* on the way back down so it can be reused for the next entity. */
|
|
471
|
+
_hierarchyDepthOf(e, t, s, r) {
|
|
472
|
+
const i = [];
|
|
473
|
+
let n = e, o = 0;
|
|
474
|
+
for (; ; ) {
|
|
475
|
+
const a = s.get(n);
|
|
476
|
+
if (a !== void 0) {
|
|
477
|
+
o = a;
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
const h = t.getField(n, 0);
|
|
481
|
+
let f = -1;
|
|
482
|
+
if (h !== void 0) {
|
|
483
|
+
const E = x(h);
|
|
484
|
+
this._host.isAlive(E) && (f = g(E));
|
|
485
|
+
}
|
|
486
|
+
if (f === -1) {
|
|
487
|
+
s.set(n, 0), o = 0;
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
if (r.has(f))
|
|
491
|
+
throw new O(
|
|
492
|
+
p.RELATION_CYCLE,
|
|
493
|
+
`hierarchy(): cycle in relation chain at entity index ${f}`
|
|
494
|
+
);
|
|
495
|
+
i.push(n), r.add(n), n = f;
|
|
496
|
+
}
|
|
497
|
+
let l = o;
|
|
498
|
+
for (let a = i.length - 1; a >= 0; a--)
|
|
499
|
+
l += 1, s.set(i[a], l), r.delete(i[a]);
|
|
500
|
+
return s.get(e);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
class F {
|
|
504
|
+
_service;
|
|
505
|
+
/** @internal constructed by the relations plugin. */
|
|
506
|
+
constructor(e) {
|
|
507
|
+
this._service = e;
|
|
508
|
+
}
|
|
509
|
+
register(e) {
|
|
510
|
+
return this._service.registerRelation(e);
|
|
511
|
+
}
|
|
512
|
+
/** Count of registered relations. */
|
|
513
|
+
get count() {
|
|
514
|
+
return this._service.count;
|
|
515
|
+
}
|
|
516
|
+
/** Add a `(R, tgt)` pair to `src`. Exclusive replaces the existing target
|
|
517
|
+
* multi adds to the set. No archetype transition. */
|
|
518
|
+
add(e, t, s) {
|
|
519
|
+
return this._service.addRelation(e, t, s), this;
|
|
520
|
+
}
|
|
521
|
+
/** Remove a `(R, tgt)` pair from `src`. For multi, omitting `tgt` removes
|
|
522
|
+
* all of `src`'s targets. No archetype transition. */
|
|
523
|
+
remove(e, t, s) {
|
|
524
|
+
return this._service.removeRelation(e, t, s), this;
|
|
525
|
+
}
|
|
526
|
+
/** Whether `src` holds any pair under `R`. */
|
|
527
|
+
has(e, t) {
|
|
528
|
+
return this._service.hasRelation(e, t);
|
|
529
|
+
}
|
|
530
|
+
/** The single target of `src` under an exclusive relation, or `undefined`. */
|
|
531
|
+
targetOf(e, t) {
|
|
532
|
+
return this._service.targetOf(e, t);
|
|
533
|
+
}
|
|
534
|
+
/** All targets of `src` under `R`, ascending by id. */
|
|
535
|
+
targetsOf(e, t) {
|
|
536
|
+
return this._service.targetsOf(e, t);
|
|
537
|
+
}
|
|
538
|
+
/** Sources pointing at `tgt` under `R` (the reverse index), ascending by id.
|
|
539
|
+
* `(entity, def)` order, matching `targetOf` and `targetsOf`. */
|
|
540
|
+
sourcesOf(e, t) {
|
|
541
|
+
return this._service.sourcesOf(e, t);
|
|
542
|
+
}
|
|
543
|
+
/** All `(source, target)` pairs of relation `R`, the `(R, *)` wildcard.
|
|
544
|
+
* Sources in canonical entity-index order. Cold path. */
|
|
545
|
+
pairsOf(e) {
|
|
546
|
+
return this._service.pairsOf(e);
|
|
547
|
+
}
|
|
548
|
+
/** Every `(relation, source)` pointing at `tgt`, across all relation kinds,
|
|
549
|
+
* the `(*, T)` wildcard. Ordered by relation id then source id. */
|
|
550
|
+
sourcesOfAny(e) {
|
|
551
|
+
return this._service.sourcesOfAny(e);
|
|
552
|
+
}
|
|
553
|
+
/** Walk relation `R` up from `src` to its chain root, returning
|
|
554
|
+
* `[src, parent, …, root]` (nearest-ancestor-first). Exclusive only. */
|
|
555
|
+
ancestorsOf(e, t) {
|
|
556
|
+
return this._service.ancestorsOf(e, t);
|
|
557
|
+
}
|
|
558
|
+
/** The root of `src`'s `R`-chain (`src` itself when it has no target).
|
|
559
|
+
* Exclusive only. */
|
|
560
|
+
rootOf(e, t) {
|
|
561
|
+
return this._service.rootOf(e, t);
|
|
562
|
+
}
|
|
563
|
+
/** Walk relation `R` down from `root` over the reverse index, returning the
|
|
564
|
+
* subtree (including `root`) breadth-first, parents before children (the
|
|
565
|
+
* `cascade` order). Exclusive only. */
|
|
566
|
+
cascadeOf(e, t) {
|
|
567
|
+
return this._service.cascadeOf(e, t);
|
|
568
|
+
}
|
|
569
|
+
/** Reclaim relation reverse-index memory: drop every reverse entry whose
|
|
570
|
+
* target has been destroyed, returning the total dropped. Purely
|
|
571
|
+
* cold-path, no observable state change, call it at a scene boundary or at
|
|
572
|
+
* a snapshot boundary. */
|
|
573
|
+
compact() {
|
|
574
|
+
return this._service.compactRelations();
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
function j(A, e) {
|
|
578
|
+
return A.relations.register({
|
|
579
|
+
exclusive: !0,
|
|
580
|
+
onDeleteTarget: e?.onDeleteTarget ?? "clear"
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
function B(A, e) {
|
|
584
|
+
return A.relations.register({
|
|
585
|
+
exclusive: !0,
|
|
586
|
+
onDeleteTarget: e?.onDeleteTarget ?? "delete"
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
function z() {
|
|
590
|
+
return {
|
|
591
|
+
name: "relations",
|
|
592
|
+
install(A) {
|
|
593
|
+
const e = A.store, t = new H(e.relationHost());
|
|
594
|
+
return e.installRelations(t), { relations: new F(t) };
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
export {
|
|
599
|
+
F as ECSRelations,
|
|
600
|
+
B as registerChildOf,
|
|
601
|
+
j as registerIsA,
|
|
602
|
+
z as relations
|
|
603
|
+
};
|