aiecsjs 0.1.3 → 0.1.4
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 +9 -0
- package/README.md +22 -1
- package/README_ZHTW.md +22 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/serialize.cjs +1 -1
- package/dist/serialize.cjs.map +1 -1
- package/dist/serialize.js +1 -1
- package/dist/serialize.js.map +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
14
14
|
- Add `pipeAsync` for async system composition.
|
|
15
15
|
- Doc-test harness so README code blocks are mechanically verified.
|
|
16
16
|
|
|
17
|
+
## [0.1.4] - 2026-05-28
|
|
18
|
+
|
|
19
|
+
Docs-only release. Adds a cross-package integration section pointing at the `aibridgejs` JSON envelope contract; no source code changes.
|
|
20
|
+
|
|
21
|
+
### Documentation
|
|
22
|
+
|
|
23
|
+
- README and README_ZHTW gained an "Integration with aibridgejs" section explaining that `bridge.call` / `bridge.emit` enforce JSON-safe payloads and silently drop `Date`, `Map`, `Set`, and class instances. The correct shape for streaming world state across the bridge is `toJSON(world)` (or `serializeWorld(world)` wrapped in a JSON envelope) before emitting, not `getComponent(...)` direct. See [aiecsjs README · Integration with aibridgejs](README.md#integration-with-aibridgejs).
|
|
24
|
+
- Verified via the `aijs-integration-smoke` companion project: every named export from `aifsmjs@0.1.2`, `aibridgejs@0.1.3`, and `aiecsjs@0.1.3` can coexist in a single TypeScript module with zero identifier collisions under `tsc --noEmit --strict`.
|
|
25
|
+
|
|
17
26
|
## [0.1.3] - 2026-05-28
|
|
18
27
|
|
|
19
28
|
A "no known silent bugs" release. Two correctness fixes, one hot-path allocation removal, and a small batch of style cleanups. No public API behaviour changes; `_getWorldState` is removed from the root export (was undocumented, unused by every sub-path, leading underscore signalled internal).
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](LICENSE)
|
|
6
6
|

|
|
7
7
|

|
|
8
|
-

|
|
9
9
|

|
|
10
10
|
|
|
11
11
|
> A TypeScript-first archetype ECS for browser and Node, with SAB-ready snapshot transport and AI-readable documentation.
|
|
@@ -86,6 +86,27 @@ The core stays narrow on purpose. The following are explicit non-goals; reach fo
|
|
|
86
86
|
- **Reactive value-predicate queries.** `enterQuery` / `exitQuery` fire on component-set membership change only. Component value mutations are not tracked.
|
|
87
87
|
- **Prefab / entity inheritance / hierarchy.** `aiecsjs/relations` provides plain entity-to-entity references, not inheritance.
|
|
88
88
|
|
|
89
|
+
## Integration with aibridgejs
|
|
90
|
+
|
|
91
|
+
If you stream world state across an [aibridgejs](https://www.npmjs.com/package/aibridgejs) bridge (iframe / Flutter InAppWebView), the bridge enforces a strict JSON envelope and silently drops `Date`, `Map`, `Set`, and class instances. AoS components from `defineObjectComponent(...)` can legally hold any of these; sending them as-is corrupts the payload on the host side.
|
|
92
|
+
|
|
93
|
+
Correct shape — serialise first, emit a plain object or byte array:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { toJSON } from 'aiecsjs/serialize'
|
|
97
|
+
|
|
98
|
+
const snap = toJSON(world)
|
|
99
|
+
await bridge.emit('world.snapshot', snap)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Do NOT do — `getComponent` returns the live column view or the AoS instance with its prototype intact, which the bridge cannot transport:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
await bridge.emit('inv', getComponent(world, eid, Inventory))
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`serializeWorld(world)` (binary, `Uint8Array`) is also bridge-safe; wrap the bytes in a JSON envelope like `{ kind: 'binary', bytes: Array.from(snap) }`, or use a transferable channel when the host supports it.
|
|
109
|
+
|
|
89
110
|
## Install
|
|
90
111
|
|
|
91
112
|
```bash
|
package/README_ZHTW.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](LICENSE)
|
|
6
6
|

|
|
7
7
|

|
|
8
|
-

|
|
9
9
|

|
|
10
10
|
|
|
11
11
|
> 為 TypeScript 而設計的原型式 ECS,支援瀏覽器與 Node,內建 SAB 快照傳輸(snapshot transport)與 AI 可讀文件。
|
|
@@ -93,6 +93,27 @@ pipe(movement)(world, 1/60)
|
|
|
93
93
|
- **反應式 value-predicate query。** `enterQuery` / `exitQuery` 只在元件集合 membership 變動時觸發。元件值變動不追蹤。
|
|
94
94
|
- **Prefab / 實體繼承 / 階層。** `aiecsjs/relations` 提供純粹的實體對實體關聯,不是繼承。
|
|
95
95
|
|
|
96
|
+
## 與 aibridgejs 整合
|
|
97
|
+
|
|
98
|
+
若你透過 [aibridgejs](https://www.npmjs.com/package/aibridgejs) bridge(iframe / Flutter InAppWebView)傳遞 world 狀態,bridge 強制要求 JSON 信封並會無聲剝除 `Date`、`Map`、`Set` 與類別實例。`defineObjectComponent(...)` 的 AoS 元件可合法持有上述任何一種;直接 emit 過去會在 host 端被破壞。
|
|
99
|
+
|
|
100
|
+
正確作法——先序列化,再 emit 純物件或 byte 陣列:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { toJSON } from 'aiecsjs/serialize'
|
|
104
|
+
|
|
105
|
+
const snap = toJSON(world)
|
|
106
|
+
await bridge.emit('world.snapshot', snap)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
不要這樣做——`getComponent` 回傳的是 live column view 或保留 prototype 的 AoS 實例,bridge 無法傳輸:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
await bridge.emit('inv', getComponent(world, eid, Inventory))
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`serializeWorld(world)` 回傳的二進位 `Uint8Array` 也是 bridge-safe;把 byte 用 `{ kind: 'binary', bytes: Array.from(snap) }` 之類的 JSON 信封包起,或在 host 支援時改用 transferable channel。
|
|
116
|
+
|
|
96
117
|
## 安裝
|
|
97
118
|
|
|
98
119
|
```bash
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var U="0.1.3";function b(n){return new Uint32Array(n)}function h(n,e){let t=e>>>5;n[t]=(n[t]??0)|1<<(e&31);}function D(n,e){let t=e>>>5;n[t]=(n[t]??0)&~(1<<(e&31));}function C(n,e){let t=e>>>5;return ((n[t]??0)&1<<(e&31))!==0}function g(n){let e=new Uint32Array(n.length);for(let t=0;t<n.length;t++)e[t]=n[t]??0;return e}function O(n){let e=[];for(let t=0;t<n.length;t++)e.push((n[t]??0).toString(16));return e.join(",")}function q(n){for(let e=0;e<n.length;e++)if((n[e]??0)!==0)return false;return true}function E(n,e,t,r,o,i){let a=!o;for(let s=0;s<i;s++){let c=n[s]??0,u=e[s]??0,d=t[s]??0,y=r[s]??0;if((c&u)!==u||(c&y)!==0)return false;!a&&(c&d)!==0&&(a=true);}return a}function B(n){let e=[];for(let t=0;t<n.length;t++){let r=n[t]??0;for(;r!==0;){let o=(t<<5)+P(r);e.push(o),r&=r-1;}}return e}function V(n,e,t,r){for(let o=0;o<t;o++){let i=n[e+o]??0;for(;i!==0;){let a=(o<<5)+P(i);r(a),i&=i-1;}}}function P(n){return 31-Math.clz32(n&-n)}var W={initialCapacity:1024,maxEntities:1e6,indexBits:24,generationBits:8},de=256,ye=1,k=new Map;function f(n){let e=k.get(n.id);if(!e)throw new Error(`aiecsjs: world ${n.id} is destroyed or unknown`);if(e.destroyed)throw new Error(`aiecsjs: world ${n.id} is destroyed`);return e}function fe(n){k.set(n.id,n);}function pe(n){k.delete(n);}function le(n){let e=n??{},t=e.indexBits??W.indexBits,r=e.generationBits??W.generationBits,o=de;if(t<1||t>24)throw new Error("aiecsjs: indexBits must be in [1, 24]");if(r<0||r>16)throw new Error("aiecsjs: generationBits must be in [0, 16]");let i=1<<t,a=Math.max(1,Math.min(e.initialCapacity??W.initialCapacity,i)),s=Math.max(a,Math.min(e.maxEntities??W.maxEntities,i));return {initialCapacity:a,maxEntities:s,indexBits:t,generationBits:r,maxComponents:o,maskWordCount:Math.ceil(o/32),buffer:e.buffer??null,bufferByteOffset:e.bufferByteOffset??0}}function me(n,e){return {id:0,mask:b(n),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:[],edgeAdd:new Int32Array(e).fill(-1),edgeRemove:new Int32Array(e).fill(-1)}}function be(n){let e=le(n),t=ye++,r=e.generationBits>8?Uint16Array:Uint8Array,o=new r(e.initialCapacity),i={id:t,capacity:e.initialCapacity,version:U,options:e,size:0,nextFreshIndex:1,freeList:[],generations:o,destroyed:false,componentBitFor:new Map,componentInfoByBit:new Array(e.maxComponents).fill(null),componentStorageByBit:new Array(e.maxComponents).fill(null),nextComponentBit:0,entityArchetype:new Uint32Array(e.initialCapacity),entityMask:new Uint32Array(e.initialCapacity*e.maskWordCount),archetypes:[],archetypeByMaskHash:new Map,queryVersion:0,queries:[],queryMasks:new Map,queryArchetypeCache:[],queryArchetypeStamp:[],bitToQueries:new Map,reactiveBuffers:new Map,observers:[],relationStorage:new Map,sab:e.buffer,readOnly:false},a=me(e.maskWordCount,e.maxComponents);return a.id=0,i.archetypes.push(a),i.archetypeByMaskHash.set(O(a.mask),0),fe(i),he(i)}function he(n){return {id:n.id,get capacity(){return n.capacity},version:n.version}}function Ce(n){let e=k.get(n.id);!e||e.destroyed||(e.destroyed=true,e.archetypes=[],e.archetypeByMaskHash.clear(),e.componentInfoByBit=[],e.componentStorageByBit=[],e.queries=[],e.queryMasks.clear(),e.queryArchetypeCache=[],e.observers=[],e.relationStorage.clear(),e.reactiveBuffers.clear(),pe(n.id));}function Ae(n){let e=f(n);e.size=0,e.nextFreshIndex=1,e.freeList=[],e.generations.fill(0),e.entityArchetype.fill(0),e.entityMask.fill(0);for(let t of e.archetypes)t.size=0,t.entityRow.clear();for(let t of e.componentStorageByBit)if(t)if(t.kind==="soa"&&t.soa)for(let r of Object.keys(t.soa))t.soa[r]?.fill(0);else t.kind==="aos"&&t.aos&&t.aos.fill(void 0);e.queryVersion++;for(let t of e.reactiveBuffers.values())t.entered.length=0,t.exited.length=0;}function xe(n){return f(n).size}function ge(n){return f(n).capacity}function $(n,e){if(e<=n.capacity)return;if(e>n.options.maxEntities)throw new Error(`aiecsjs: requested capacity ${e} exceeds maxEntities ${n.options.maxEntities}`);let t=n.capacity;for(;t<e;)t=Math.min(t*2,n.options.maxEntities);ke(n,t);}function ke(n,e){let t=n.generations.constructor,r=new t(e);r.set(n.generations),n.generations=r;let o=new Uint32Array(e);o.set(n.entityArchetype),n.entityArchetype=o;let i=n.options.maskWordCount,a=new Uint32Array(e*i);a.set(n.entityMask),n.entityMask=a;for(let s of n.componentStorageByBit)if(s)if(s.kind==="soa"&&s.soa){let c=n.componentInfoByBit[s.bit];c&&Ie(s.soa,c.fields,e);}else s.kind==="aos"&&s.aos&&(s.aos.length=e);n.capacity=e;}function Ie(n,e,t){for(let r of e){let o=n[r.name];if(!o)continue;let i=t*r.vectorLen;if(o.length>=i)continue;let a=new r.ctor(i);a.set(o),n[r.name]=a;}}function H(n,e){let t=O(e),r=n.archetypeByMaskHash.get(t);if(r!==void 0)return {archId:r,created:false};let o=n.archetypes.length,i={id:o,mask:g(e),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:we(e),edgeAdd:new Int32Array(n.options.maxComponents).fill(-1),edgeRemove:new Int32Array(n.options.maxComponents).fill(-1)};return n.archetypes.push(i),n.archetypeByMaskHash.set(t,o),n.queryVersion++,{archId:o,created:true}}function M(n,e){if(e<=n.capacity)return;let t=n.capacity;for(;t<e;)t*=2;let r=new Uint32Array(t);r.set(n.entities),n.entities=r,n.capacity=t;}function we(n){let e=[];for(let t=0;t<n.length;t++){let r=n[t]??0;for(;r!==0;){let o=r&-r,i=(t<<5)+(31-Math.clz32(o));e.push(i),r&=r-1;}}return e}function A(n,e){let t=n.componentBitFor.get(e.id);if(t!==void 0)return t;if(n.nextComponentBit>=n.options.maxComponents)throw new Error(`aiecsjs: world reached maxComponents=${n.options.maxComponents}`);let r=n.nextComponentBit++;n.componentBitFor.set(e.id,r),n.componentInfoByBit[r]=e;let o;if(e.kind==="soa"){let i={};for(let a of e.fields)i[a.name]=new a.ctor(n.capacity*a.vectorLen);o={kind:"soa",componentId:e.id,bit:r,soa:i};}else e.kind==="aos"?o={kind:"aos",componentId:e.id,bit:r,aos:new Array(n.capacity)}:o={kind:"tag",componentId:e.id,bit:r};return n.componentStorageByBit[r]=o,r}function x(n,e){let t=n.options.maskWordCount,r=new Uint32Array(t),o=e*t;for(let i=0;i<t;i++)r[i]=n.entityMask[o+i]??0;return r}function K(n,e,t){let r=n.options.maskWordCount,o=e*r;for(let i=0;i<r;i++)n.entityMask[o+i]=t[i]??0;}function I(n,e){return n.componentBitFor.get(e.id)}function ve(n){if(!n||typeof n!="object")return false;let e=n;return typeof e.id!="number"||typeof e.version!="string"?false:k.has(e.id)}function Se(n){let e=f(n);if(e.readOnly)throw new Error("aiecsjs: cannot createEntity on a read-only world (worker-attached)");let t;if(e.freeList.length>0)t=e.freeList.pop();else {if(e.nextFreshIndex>=e.options.maxEntities)throw new Error(`aiecsjs: reached maxEntities ${e.options.maxEntities}`);e.nextFreshIndex>=e.capacity&&$(e,e.nextFreshIndex+1),t=e.nextFreshIndex++;}let r=e.archetypes[0];if(!r)throw new Error("aiecsjs: missing empty archetype");M(r,r.size+1);let o=r.size;r.entities[o]=t,r.entityRow.set(t,o),r.size++,e.entityArchetype[t]=0;let i=e.options.maskWordCount,a=t*i;for(let s=0;s<i;s++)e.entityMask[a+s]=0;return e.size++,t}function Ee(n,e){let t=f(n);if(t.readOnly)throw new Error("aiecsjs: cannot destroyEntity on a read-only world");if(!p(t,e))return;Z(t,e);let o=t.entityArchetype[e]??0,i=t.archetypes[o];if(i){let u=i.entityRow.get(e);if(u!==void 0){let d=i.size-1;if(u!==d){let y=i.entities[d]??0;i.entities[u]=y,i.entityRow.set(y,u);}i.entities[d]=0,i.entityRow.delete(e),i.size--;}}t.entityArchetype[e]=0;let a=t.options.maskWordCount,s=e*a;for(let u=0;u<a;u++)t.entityMask[s+u]=0;let c=e;t.generations[c]=(t.generations[c]??0)+1&65535,t.freeList.push(e),t.size--;}function Y(n,e){let t=f(n);return p(t,e)}function p(n,e){if(e<=0||e>=n.capacity)return false;let t=n.entityArchetype[e]??0,r=n.archetypes[t];return r?r.entityRow.has(e):false}function Be(n){return n}function We(n){return 0}function Me(n,e){return n}function _e(n,e){return typeof e!="number"?false:Y(n,e)}var T=1,Qe={i8:Int8Array,u8:Uint8Array,i16:Int16Array,u16:Uint16Array,i32:Int32Array,u32:Uint32Array,f32:Float32Array,f64:Float64Array,eid:Uint32Array,bool:Uint8Array},w=new Map;function Re(n){let e=[];for(let[i,a]of Object.entries(n)){let s,c=1;if(typeof a=="string")s=a;else if(Array.isArray(a)){let[d,y]=a;s=d,c=y;}else throw new TypeError(`aiecsjs: invalid field declaration for "${i}"`);let u=Qe[s];if(!u)throw new TypeError(`aiecsjs: unknown field type "${s}" for field "${i}"`);e.push({name:i,type:s,vectorLen:c,ctor:u,bytesPerElement:u.BYTES_PER_ELEMENT});}let t=T++,r={id:t,kind:"soa",schema:n,fields:e,factory:null};return w.set(t,r),{__kind:"soa",__id:t,__schema:n}}function Te(){let n=T++,e={id:n,kind:"tag",schema:null,fields:[],factory:null};return w.set(n,e),{__kind:"tag",__id:n}}function Le(n){let e=T++,t=n??(()=>({})),r={id:e,kind:"aos",schema:null,fields:[],factory:t};return w.set(e,r),{__kind:"aos",__id:e,__factory:t}}function l(n){let e=w.get(n.__id);if(!e)throw new Error("aiecsjs: component is not registered (call defineComponent/defineTag/defineObjectComponent)");return e}function Q(n,e,t,r){let o=f(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,e))throw new Error(`aiecsjs: addComponent on dead entity ${e}`);let i=l(t),a=A(o,i),s=x(o,e);if(C(s,a)){r!==void 0&&R(o,e,t,r);return}let c=g(s);h(c,a),J(o,e,c),R(o,e,t,r),te(o,e,a,s,c);}function Fe(n,e,t){let r=f(n);if(r.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(r,e))return;let o=l(t),i=I(r,o);if(i===void 0)return;let a=x(r,e);if(!C(a,i))return;let s=g(a);D(s,i),J(r,e,s);let c=r.componentStorageByBit[i];c?.kind==="soa"&&c.soa?X(c.soa,o.fields,e):c?.kind==="aos"&&c.aos&&(c.aos[e]=void 0),te(r,e,i,a,s);}function je(n,e,t){let r=f(n);if(!p(r,e))return false;let o=l(t),i=I(r,o);if(i===void 0)return false;let a=x(r,e);return C(a,i)}function ze(n,e,t){let r=f(n);if(!p(r,e))return;let o=l(t),i=I(r,o);if(i===void 0)return;let a=x(r,e);if(!C(a,i))return;let s=r.componentStorageByBit[i];if(s)return s.kind==="soa"?s.soa:s.kind==="aos"?s.aos?.[e]:true}function De(n,e,t,r){let o=f(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,e))throw new Error(`aiecsjs: setComponent on dead entity ${e}`);let i=l(t),a=I(o,i);if(a===void 0){Q(n,e,t,r);return}let s=x(o,e);if(!C(s,a)){Q(n,e,t,r);return}R(o,e,t,r);}function R(n,e,t,r){let o=l(t),i=n.componentBitFor.get(o.id);if(i===void 0)return;let a=n.componentStorageByBit[i];if(a){if(o.kind==="soa"&&a.soa){if(r==null)return;let s=r;for(let c of o.fields){if(!(c.name in s))continue;let u=a.soa[c.name];if(!u)continue;let d=s[c.name];if(c.vectorLen===1)u[e]=typeof d=="boolean"?d?1:0:Number(d);else if(Array.isArray(d)||ArrayBuffer.isView(d)){let y=e*c.vectorLen,ue=d;for(let S=0;S<c.vectorLen;S++)u[y+S]=Number(ue[S]??0);}}}else if(o.kind==="aos"&&a.aos){let s=o.factory??(()=>({})),c=a.aos[e];c===void 0&&(c=s(),a.aos[e]=c),r&&typeof r=="object"&&Object.assign(c,r);}}}function X(n,e,t){for(let r of e){let o=n[r.name];if(o)if(r.vectorLen===1)o[t]=0;else {let i=t*r.vectorLen;for(let a=0;a<r.vectorLen;a++)o[i+a]=0;}}}function Z(n,e){let t=n.options.maskWordCount,r=e,o=r*t;V(n.entityMask,o,t,i=>{let a=n.componentStorageByBit[i],s=n.componentInfoByBit[i];a?.kind==="soa"&&a.soa&&s?X(a.soa,s.fields,r):a?.kind==="aos"&&a.aos&&(a.aos[r]=void 0);});}function J(n,e,t){let r=n.entityArchetype[e]??0,o=n.archetypes[r];if(!o)return;let a=H(n,t).archId,s=n.archetypes[a];if(s){if(a!==r){let c=o.entityRow.get(e);if(c!==void 0){let d=o.size-1;if(c!==d){let y=o.entities[d]??0;o.entities[c]=y,o.entityRow.set(y,c);}o.entities[d]=0,o.entityRow.delete(e),o.size--;}M(s,s.size+1);let u=s.size;s.entities[u]=e,s.entityRow.set(e,u),s.size++,n.entityArchetype[e]=a;}K(n,e,t);}}var ee=()=>{};function ne(n){ee=n;}function te(n,e,t,r,o){ee(n,e,t,r,o);}function re(n){return w.get(n)}var z=1,m=new Map;function $e(n){let e=(n.all??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-"),t=(n.any??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-"),r=(n.none??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-");return `A${e}|Y${t}|N${r}`}function He(n){let e=Array.isArray(n)?{all:n}:n;for(let i of [...e.all??[],...e.any??[],...e.none??[]])if(!i||typeof i!="object"||typeof i.__id!="number")throw new TypeError("aiecsjs: defineQuery received a non-component value");let t=$e(e),r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:(e.all??[]).map(i=>i.__id),any:(e.any??[]).map(i=>i.__id),none:(e.none??[]).map(i=>i.__id),columnViewCache:[...e.all??[],...e.any??[]],reactiveKind:"normal",sourceQueryId:-1,sourceQuery:null};return m.set(t,o),o}function Ke(n){let e=n,t=`enter:${e.id}`,r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"enter",sourceQueryId:e.id,sourceQuery:e};return m.set(t,o),o}function Ne(n){let e=n,t=`exit:${e.id}`,r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"exit",sourceQueryId:e.id,sourceQuery:e};return m.set(t,o),o}function v(n,e){if(n.queries[e.id]===e&&n.queryMasks.has(e.id))return;let t=n.options.maskWordCount,r=b(t),o=b(t),i=b(t);for(let c of e.all){let u=F(c),d=A(n,u);h(r,d);}for(let c of e.any){let u=F(c),d=A(n,u);h(o,d);}for(let c of e.none){let u=F(c),d=A(n,u);h(i,d);}let a={withMask:r,anyMask:o,noneMask:i,anyHasBits:!q(o)};n.queryMasks.set(e.id,a),n.queries[e.id]=e,n.queryArchetypeCache[e.id]=null,n.queryArchetypeStamp[e.id]=-1;let s=[...B(r),...B(o),...B(i)];for(let c of s){let u=n.bitToQueries.get(c);u||(u=new Set,n.bitToQueries.set(c,u)),u.add(e.id);}e.reactiveKind!=="normal"&&(n.reactiveBuffers.has(e.id)||n.reactiveBuffers.set(e.id,{entered:[],exited:[]}),e.sourceQuery&&v(n,e.sourceQuery));}function _(n,e){if(v(n,e),n.queryArchetypeCache[e.id]&&n.queryArchetypeStamp[e.id]===n.queryVersion)return n.queryArchetypeCache[e.id];let t=n.queryMasks.get(e.id),r=n.options.maskWordCount,o=[];for(let i=0;i<n.archetypes.length;i++){let a=n.archetypes[i];E(a.mask,t.withMask,t.anyMask,t.noneMask,t.anyHasBits,r)&&o.push(i);}return n.queryArchetypeCache[e.id]=o,n.queryArchetypeStamp[e.id]=n.queryVersion,o}function Ge(n,e){let t=f(n),o=_(t,e),i=[];for(let a of o){let s=t.archetypes[a];i.push({id:s.id,mask:Array.from(s.mask),size:s.size});}return i}function Ye(n,e){let t=f(n),r=e,o=[];if(r.reactiveKind==="enter"){let a=t.reactiveBuffers.get(r.id);if(a){for(let s of a.entered)o.push(s);a.entered.length=0;}return o}if(r.reactiveKind==="exit"){let a=t.reactiveBuffers.get(r.id);if(a){for(let s of a.exited)o.push(s);a.exited.length=0;}return o}let i=_(t,r);for(let a of i){let s=t.archetypes[a];for(let c=0;c<s.size;c++)o.push(s.entities[c]);}return o}function*Ze(n,e){let t=f(n),r=e;if(r.reactiveKind!=="normal"){let i=t.reactiveBuffers.get(r.id);if(!i)return;let a=r.reactiveKind==="enter"?i.entered:i.exited;for(let s of a)yield s;a.length=0;return}let o=_(t,r);for(let i of o){let a=t.archetypes[i];for(let s=0;s<a.size;s++)yield a.entities[s];}}function Xe(n,e,t){let r=f(n),o=e;if(o.reactiveKind!=="normal"){let s=r.reactiveBuffers.get(o.id);if(!s)return;let c=o.reactiveKind==="enter"?s.entered:s.exited;if(c.length===0)return;let u=ie(r,o);for(let d=0;d<c.length;d++){let y=c[d];oe(t,y,u);}c.length=0;return}v(r,o);let i=_(r,o),a=ie(r,o);for(let s of i){let c=r.archetypes[s],u=c.entities,d=c.size;for(let y=0;y<d;y++)oe(t,u[y],a);}}function oe(n,e,t){switch(t.length){case 0:n(e);break;case 1:n(e,t[0]);break;case 2:n(e,t[0],t[1]);break;case 3:n(e,t[0],t[1],t[2]);break;case 4:n(e,t[0],t[1],t[2],t[3]);break;case 5:n(e,t[0],t[1],t[2],t[3],t[4]);break;default:n(e,...t);}}function ie(n,e){let t=[];for(let r of e.columnViewCache){let o=l(r),i=n.componentBitFor.get(o.id);if(i===void 0){t.push(void 0);continue}let a=n.componentStorageByBit[i];if(!a){t.push(void 0);continue}a.kind==="soa"?t.push(a.soa):a.kind==="aos"?t.push(a.aos):t.push(true);}return t}function se(n,e,t,r,o){for(let s of m.values())s.reactiveKind!=="normal"&&s.sourceQuery&&n.queries[s.sourceQuery.id]!==s.sourceQuery&&v(n,s.sourceQuery);let i=n.bitToQueries.get(t);if(!i)return;let a=n.options.maskWordCount;for(let s of i){let c=n.queries[s];if(!c||c.reactiveKind!=="normal")continue;let u=n.queryMasks.get(s);if(!u)continue;let d=E(r,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,a),y=E(o,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,a);!d&&y?ae(n,s,"enter",e):d&&!y&&ae(n,s,"exit",e);}}function ae(n,e,t,r){for(let o of m.values()){if(o.sourceQueryId!==e||o.reactiveKind!==t)continue;v(n,o);let i=Je(n,o.id);t==="enter"?i.entered.push(r):i.exited.push(r);}}function Je(n,e){let t=n.reactiveBuffers.get(e);return t||(t={entered:[],exited:[]},n.reactiveBuffers.set(e,t)),t}function F(n){let e=en(n);if(!e)throw new Error(`aiecsjs: component id ${n} not registered`);return e}var j=null;function ce(n){j=n;}function en(n){return j?j(n):void 0}var nn={i8:"i8",u8:"u8",i16:"i16",u16:"u16",i32:"i32",u32:"u32",f32:"f32",f64:"f64",eid:"eid",bool:"bool"};function tn(...n){return n.length===0?e=>e:n.length===1?n[0]:(e,t)=>{let r=e;for(let o of n)r=o(r,t);return r}}ce(n=>re(n));ne((n,e,t,r,o)=>{se(n,e,t,r,o);});var Bn=typeof SharedArrayBuffer<"u";exports.IS_SAB_SUPPORTED=Bn;exports.Types=nn;exports.VERSION=U;exports.addComponent=Q;exports.createEntity=Se;exports.createWorld=be;exports.defineComponent=Re;exports.defineObjectComponent=Le;exports.defineQuery=He;exports.defineTag=Te;exports.destroyEntity=Ee;exports.destroyWorld=Ce;exports.enterQuery=Ke;exports.entityExists=Y;exports.exitQuery=Ne;exports.forEachEntity=Xe;exports.getComponent=ze;exports.getEntityGeneration=We;exports.getEntityIndex=Be;exports.getWorldCapacity=ge;exports.getWorldSize=xe;exports.hasComponent=je;exports.isEntity=_e;exports.isWorld=ve;exports.iterQuery=Ze;exports.packEntity=Me;exports.pipe=tn;exports.queryArchetypes=Ge;exports.removeComponent=Fe;exports.resetWorld=Ae;exports.runQuery=Ye;exports.setComponent=De;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var U="0.1.4";function b(n){return new Uint32Array(n)}function h(n,e){let t=e>>>5;n[t]=(n[t]??0)|1<<(e&31);}function D(n,e){let t=e>>>5;n[t]=(n[t]??0)&~(1<<(e&31));}function C(n,e){let t=e>>>5;return ((n[t]??0)&1<<(e&31))!==0}function g(n){let e=new Uint32Array(n.length);for(let t=0;t<n.length;t++)e[t]=n[t]??0;return e}function O(n){let e=[];for(let t=0;t<n.length;t++)e.push((n[t]??0).toString(16));return e.join(",")}function q(n){for(let e=0;e<n.length;e++)if((n[e]??0)!==0)return false;return true}function E(n,e,t,r,o,i){let a=!o;for(let s=0;s<i;s++){let c=n[s]??0,u=e[s]??0,d=t[s]??0,y=r[s]??0;if((c&u)!==u||(c&y)!==0)return false;!a&&(c&d)!==0&&(a=true);}return a}function B(n){let e=[];for(let t=0;t<n.length;t++){let r=n[t]??0;for(;r!==0;){let o=(t<<5)+P(r);e.push(o),r&=r-1;}}return e}function V(n,e,t,r){for(let o=0;o<t;o++){let i=n[e+o]??0;for(;i!==0;){let a=(o<<5)+P(i);r(a),i&=i-1;}}}function P(n){return 31-Math.clz32(n&-n)}var W={initialCapacity:1024,maxEntities:1e6,indexBits:24,generationBits:8},de=256,ye=1,k=new Map;function f(n){let e=k.get(n.id);if(!e)throw new Error(`aiecsjs: world ${n.id} is destroyed or unknown`);if(e.destroyed)throw new Error(`aiecsjs: world ${n.id} is destroyed`);return e}function fe(n){k.set(n.id,n);}function pe(n){k.delete(n);}function le(n){let e=n??{},t=e.indexBits??W.indexBits,r=e.generationBits??W.generationBits,o=de;if(t<1||t>24)throw new Error("aiecsjs: indexBits must be in [1, 24]");if(r<0||r>16)throw new Error("aiecsjs: generationBits must be in [0, 16]");let i=1<<t,a=Math.max(1,Math.min(e.initialCapacity??W.initialCapacity,i)),s=Math.max(a,Math.min(e.maxEntities??W.maxEntities,i));return {initialCapacity:a,maxEntities:s,indexBits:t,generationBits:r,maxComponents:o,maskWordCount:Math.ceil(o/32),buffer:e.buffer??null,bufferByteOffset:e.bufferByteOffset??0}}function me(n,e){return {id:0,mask:b(n),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:[],edgeAdd:new Int32Array(e).fill(-1),edgeRemove:new Int32Array(e).fill(-1)}}function be(n){let e=le(n),t=ye++,r=e.generationBits>8?Uint16Array:Uint8Array,o=new r(e.initialCapacity),i={id:t,capacity:e.initialCapacity,version:U,options:e,size:0,nextFreshIndex:1,freeList:[],generations:o,destroyed:false,componentBitFor:new Map,componentInfoByBit:new Array(e.maxComponents).fill(null),componentStorageByBit:new Array(e.maxComponents).fill(null),nextComponentBit:0,entityArchetype:new Uint32Array(e.initialCapacity),entityMask:new Uint32Array(e.initialCapacity*e.maskWordCount),archetypes:[],archetypeByMaskHash:new Map,queryVersion:0,queries:[],queryMasks:new Map,queryArchetypeCache:[],queryArchetypeStamp:[],bitToQueries:new Map,reactiveBuffers:new Map,observers:[],relationStorage:new Map,sab:e.buffer,readOnly:false},a=me(e.maskWordCount,e.maxComponents);return a.id=0,i.archetypes.push(a),i.archetypeByMaskHash.set(O(a.mask),0),fe(i),he(i)}function he(n){return {id:n.id,get capacity(){return n.capacity},version:n.version}}function Ce(n){let e=k.get(n.id);!e||e.destroyed||(e.destroyed=true,e.archetypes=[],e.archetypeByMaskHash.clear(),e.componentInfoByBit=[],e.componentStorageByBit=[],e.queries=[],e.queryMasks.clear(),e.queryArchetypeCache=[],e.observers=[],e.relationStorage.clear(),e.reactiveBuffers.clear(),pe(n.id));}function Ae(n){let e=f(n);e.size=0,e.nextFreshIndex=1,e.freeList=[],e.generations.fill(0),e.entityArchetype.fill(0),e.entityMask.fill(0);for(let t of e.archetypes)t.size=0,t.entityRow.clear();for(let t of e.componentStorageByBit)if(t)if(t.kind==="soa"&&t.soa)for(let r of Object.keys(t.soa))t.soa[r]?.fill(0);else t.kind==="aos"&&t.aos&&t.aos.fill(void 0);e.queryVersion++;for(let t of e.reactiveBuffers.values())t.entered.length=0,t.exited.length=0;}function xe(n){return f(n).size}function ge(n){return f(n).capacity}function $(n,e){if(e<=n.capacity)return;if(e>n.options.maxEntities)throw new Error(`aiecsjs: requested capacity ${e} exceeds maxEntities ${n.options.maxEntities}`);let t=n.capacity;for(;t<e;)t=Math.min(t*2,n.options.maxEntities);ke(n,t);}function ke(n,e){let t=n.generations.constructor,r=new t(e);r.set(n.generations),n.generations=r;let o=new Uint32Array(e);o.set(n.entityArchetype),n.entityArchetype=o;let i=n.options.maskWordCount,a=new Uint32Array(e*i);a.set(n.entityMask),n.entityMask=a;for(let s of n.componentStorageByBit)if(s)if(s.kind==="soa"&&s.soa){let c=n.componentInfoByBit[s.bit];c&&Ie(s.soa,c.fields,e);}else s.kind==="aos"&&s.aos&&(s.aos.length=e);n.capacity=e;}function Ie(n,e,t){for(let r of e){let o=n[r.name];if(!o)continue;let i=t*r.vectorLen;if(o.length>=i)continue;let a=new r.ctor(i);a.set(o),n[r.name]=a;}}function H(n,e){let t=O(e),r=n.archetypeByMaskHash.get(t);if(r!==void 0)return {archId:r,created:false};let o=n.archetypes.length,i={id:o,mask:g(e),size:0,capacity:16,entities:new Uint32Array(16),entityRow:new Map,componentBits:we(e),edgeAdd:new Int32Array(n.options.maxComponents).fill(-1),edgeRemove:new Int32Array(n.options.maxComponents).fill(-1)};return n.archetypes.push(i),n.archetypeByMaskHash.set(t,o),n.queryVersion++,{archId:o,created:true}}function M(n,e){if(e<=n.capacity)return;let t=n.capacity;for(;t<e;)t*=2;let r=new Uint32Array(t);r.set(n.entities),n.entities=r,n.capacity=t;}function we(n){let e=[];for(let t=0;t<n.length;t++){let r=n[t]??0;for(;r!==0;){let o=r&-r,i=(t<<5)+(31-Math.clz32(o));e.push(i),r&=r-1;}}return e}function A(n,e){let t=n.componentBitFor.get(e.id);if(t!==void 0)return t;if(n.nextComponentBit>=n.options.maxComponents)throw new Error(`aiecsjs: world reached maxComponents=${n.options.maxComponents}`);let r=n.nextComponentBit++;n.componentBitFor.set(e.id,r),n.componentInfoByBit[r]=e;let o;if(e.kind==="soa"){let i={};for(let a of e.fields)i[a.name]=new a.ctor(n.capacity*a.vectorLen);o={kind:"soa",componentId:e.id,bit:r,soa:i};}else e.kind==="aos"?o={kind:"aos",componentId:e.id,bit:r,aos:new Array(n.capacity)}:o={kind:"tag",componentId:e.id,bit:r};return n.componentStorageByBit[r]=o,r}function x(n,e){let t=n.options.maskWordCount,r=new Uint32Array(t),o=e*t;for(let i=0;i<t;i++)r[i]=n.entityMask[o+i]??0;return r}function K(n,e,t){let r=n.options.maskWordCount,o=e*r;for(let i=0;i<r;i++)n.entityMask[o+i]=t[i]??0;}function I(n,e){return n.componentBitFor.get(e.id)}function ve(n){if(!n||typeof n!="object")return false;let e=n;return typeof e.id!="number"||typeof e.version!="string"?false:k.has(e.id)}function Se(n){let e=f(n);if(e.readOnly)throw new Error("aiecsjs: cannot createEntity on a read-only world (worker-attached)");let t;if(e.freeList.length>0)t=e.freeList.pop();else {if(e.nextFreshIndex>=e.options.maxEntities)throw new Error(`aiecsjs: reached maxEntities ${e.options.maxEntities}`);e.nextFreshIndex>=e.capacity&&$(e,e.nextFreshIndex+1),t=e.nextFreshIndex++;}let r=e.archetypes[0];if(!r)throw new Error("aiecsjs: missing empty archetype");M(r,r.size+1);let o=r.size;r.entities[o]=t,r.entityRow.set(t,o),r.size++,e.entityArchetype[t]=0;let i=e.options.maskWordCount,a=t*i;for(let s=0;s<i;s++)e.entityMask[a+s]=0;return e.size++,t}function Ee(n,e){let t=f(n);if(t.readOnly)throw new Error("aiecsjs: cannot destroyEntity on a read-only world");if(!p(t,e))return;Z(t,e);let o=t.entityArchetype[e]??0,i=t.archetypes[o];if(i){let u=i.entityRow.get(e);if(u!==void 0){let d=i.size-1;if(u!==d){let y=i.entities[d]??0;i.entities[u]=y,i.entityRow.set(y,u);}i.entities[d]=0,i.entityRow.delete(e),i.size--;}}t.entityArchetype[e]=0;let a=t.options.maskWordCount,s=e*a;for(let u=0;u<a;u++)t.entityMask[s+u]=0;let c=e;t.generations[c]=(t.generations[c]??0)+1&65535,t.freeList.push(e),t.size--;}function Y(n,e){let t=f(n);return p(t,e)}function p(n,e){if(e<=0||e>=n.capacity)return false;let t=n.entityArchetype[e]??0,r=n.archetypes[t];return r?r.entityRow.has(e):false}function Be(n){return n}function We(n){return 0}function Me(n,e){return n}function _e(n,e){return typeof e!="number"?false:Y(n,e)}var T=1,Qe={i8:Int8Array,u8:Uint8Array,i16:Int16Array,u16:Uint16Array,i32:Int32Array,u32:Uint32Array,f32:Float32Array,f64:Float64Array,eid:Uint32Array,bool:Uint8Array},w=new Map;function Re(n){let e=[];for(let[i,a]of Object.entries(n)){let s,c=1;if(typeof a=="string")s=a;else if(Array.isArray(a)){let[d,y]=a;s=d,c=y;}else throw new TypeError(`aiecsjs: invalid field declaration for "${i}"`);let u=Qe[s];if(!u)throw new TypeError(`aiecsjs: unknown field type "${s}" for field "${i}"`);e.push({name:i,type:s,vectorLen:c,ctor:u,bytesPerElement:u.BYTES_PER_ELEMENT});}let t=T++,r={id:t,kind:"soa",schema:n,fields:e,factory:null};return w.set(t,r),{__kind:"soa",__id:t,__schema:n}}function Te(){let n=T++,e={id:n,kind:"tag",schema:null,fields:[],factory:null};return w.set(n,e),{__kind:"tag",__id:n}}function Le(n){let e=T++,t=n??(()=>({})),r={id:e,kind:"aos",schema:null,fields:[],factory:t};return w.set(e,r),{__kind:"aos",__id:e,__factory:t}}function l(n){let e=w.get(n.__id);if(!e)throw new Error("aiecsjs: component is not registered (call defineComponent/defineTag/defineObjectComponent)");return e}function Q(n,e,t,r){let o=f(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,e))throw new Error(`aiecsjs: addComponent on dead entity ${e}`);let i=l(t),a=A(o,i),s=x(o,e);if(C(s,a)){r!==void 0&&R(o,e,t,r);return}let c=g(s);h(c,a),J(o,e,c),R(o,e,t,r),te(o,e,a,s,c);}function Fe(n,e,t){let r=f(n);if(r.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(r,e))return;let o=l(t),i=I(r,o);if(i===void 0)return;let a=x(r,e);if(!C(a,i))return;let s=g(a);D(s,i),J(r,e,s);let c=r.componentStorageByBit[i];c?.kind==="soa"&&c.soa?X(c.soa,o.fields,e):c?.kind==="aos"&&c.aos&&(c.aos[e]=void 0),te(r,e,i,a,s);}function je(n,e,t){let r=f(n);if(!p(r,e))return false;let o=l(t),i=I(r,o);if(i===void 0)return false;let a=x(r,e);return C(a,i)}function ze(n,e,t){let r=f(n);if(!p(r,e))return;let o=l(t),i=I(r,o);if(i===void 0)return;let a=x(r,e);if(!C(a,i))return;let s=r.componentStorageByBit[i];if(s)return s.kind==="soa"?s.soa:s.kind==="aos"?s.aos?.[e]:true}function De(n,e,t,r){let o=f(n);if(o.readOnly)throw new Error("aiecsjs: cannot mutate a read-only world");if(!p(o,e))throw new Error(`aiecsjs: setComponent on dead entity ${e}`);let i=l(t),a=I(o,i);if(a===void 0){Q(n,e,t,r);return}let s=x(o,e);if(!C(s,a)){Q(n,e,t,r);return}R(o,e,t,r);}function R(n,e,t,r){let o=l(t),i=n.componentBitFor.get(o.id);if(i===void 0)return;let a=n.componentStorageByBit[i];if(a){if(o.kind==="soa"&&a.soa){if(r==null)return;let s=r;for(let c of o.fields){if(!(c.name in s))continue;let u=a.soa[c.name];if(!u)continue;let d=s[c.name];if(c.vectorLen===1)u[e]=typeof d=="boolean"?d?1:0:Number(d);else if(Array.isArray(d)||ArrayBuffer.isView(d)){let y=e*c.vectorLen,ue=d;for(let S=0;S<c.vectorLen;S++)u[y+S]=Number(ue[S]??0);}}}else if(o.kind==="aos"&&a.aos){let s=o.factory??(()=>({})),c=a.aos[e];c===void 0&&(c=s(),a.aos[e]=c),r&&typeof r=="object"&&Object.assign(c,r);}}}function X(n,e,t){for(let r of e){let o=n[r.name];if(o)if(r.vectorLen===1)o[t]=0;else {let i=t*r.vectorLen;for(let a=0;a<r.vectorLen;a++)o[i+a]=0;}}}function Z(n,e){let t=n.options.maskWordCount,r=e,o=r*t;V(n.entityMask,o,t,i=>{let a=n.componentStorageByBit[i],s=n.componentInfoByBit[i];a?.kind==="soa"&&a.soa&&s?X(a.soa,s.fields,r):a?.kind==="aos"&&a.aos&&(a.aos[r]=void 0);});}function J(n,e,t){let r=n.entityArchetype[e]??0,o=n.archetypes[r];if(!o)return;let a=H(n,t).archId,s=n.archetypes[a];if(s){if(a!==r){let c=o.entityRow.get(e);if(c!==void 0){let d=o.size-1;if(c!==d){let y=o.entities[d]??0;o.entities[c]=y,o.entityRow.set(y,c);}o.entities[d]=0,o.entityRow.delete(e),o.size--;}M(s,s.size+1);let u=s.size;s.entities[u]=e,s.entityRow.set(e,u),s.size++,n.entityArchetype[e]=a;}K(n,e,t);}}var ee=()=>{};function ne(n){ee=n;}function te(n,e,t,r,o){ee(n,e,t,r,o);}function re(n){return w.get(n)}var z=1,m=new Map;function $e(n){let e=(n.all??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-"),t=(n.any??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-"),r=(n.none??[]).map(o=>o.__id).sort((o,i)=>o-i).join("-");return `A${e}|Y${t}|N${r}`}function He(n){let e=Array.isArray(n)?{all:n}:n;for(let i of [...e.all??[],...e.any??[],...e.none??[]])if(!i||typeof i!="object"||typeof i.__id!="number")throw new TypeError("aiecsjs: defineQuery received a non-component value");let t=$e(e),r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:(e.all??[]).map(i=>i.__id),any:(e.any??[]).map(i=>i.__id),none:(e.none??[]).map(i=>i.__id),columnViewCache:[...e.all??[],...e.any??[]],reactiveKind:"normal",sourceQueryId:-1,sourceQuery:null};return m.set(t,o),o}function Ke(n){let e=n,t=`enter:${e.id}`,r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"enter",sourceQueryId:e.id,sourceQuery:e};return m.set(t,o),o}function Ne(n){let e=n,t=`exit:${e.id}`,r=m.get(t);if(r)return r;let o={id:z++,mask:[],all:e.all,any:e.any,none:e.none,columnViewCache:e.columnViewCache,reactiveKind:"exit",sourceQueryId:e.id,sourceQuery:e};return m.set(t,o),o}function v(n,e){if(n.queries[e.id]===e&&n.queryMasks.has(e.id))return;let t=n.options.maskWordCount,r=b(t),o=b(t),i=b(t);for(let c of e.all){let u=F(c),d=A(n,u);h(r,d);}for(let c of e.any){let u=F(c),d=A(n,u);h(o,d);}for(let c of e.none){let u=F(c),d=A(n,u);h(i,d);}let a={withMask:r,anyMask:o,noneMask:i,anyHasBits:!q(o)};n.queryMasks.set(e.id,a),n.queries[e.id]=e,n.queryArchetypeCache[e.id]=null,n.queryArchetypeStamp[e.id]=-1;let s=[...B(r),...B(o),...B(i)];for(let c of s){let u=n.bitToQueries.get(c);u||(u=new Set,n.bitToQueries.set(c,u)),u.add(e.id);}e.reactiveKind!=="normal"&&(n.reactiveBuffers.has(e.id)||n.reactiveBuffers.set(e.id,{entered:[],exited:[]}),e.sourceQuery&&v(n,e.sourceQuery));}function _(n,e){if(v(n,e),n.queryArchetypeCache[e.id]&&n.queryArchetypeStamp[e.id]===n.queryVersion)return n.queryArchetypeCache[e.id];let t=n.queryMasks.get(e.id),r=n.options.maskWordCount,o=[];for(let i=0;i<n.archetypes.length;i++){let a=n.archetypes[i];E(a.mask,t.withMask,t.anyMask,t.noneMask,t.anyHasBits,r)&&o.push(i);}return n.queryArchetypeCache[e.id]=o,n.queryArchetypeStamp[e.id]=n.queryVersion,o}function Ge(n,e){let t=f(n),o=_(t,e),i=[];for(let a of o){let s=t.archetypes[a];i.push({id:s.id,mask:Array.from(s.mask),size:s.size});}return i}function Ye(n,e){let t=f(n),r=e,o=[];if(r.reactiveKind==="enter"){let a=t.reactiveBuffers.get(r.id);if(a){for(let s of a.entered)o.push(s);a.entered.length=0;}return o}if(r.reactiveKind==="exit"){let a=t.reactiveBuffers.get(r.id);if(a){for(let s of a.exited)o.push(s);a.exited.length=0;}return o}let i=_(t,r);for(let a of i){let s=t.archetypes[a];for(let c=0;c<s.size;c++)o.push(s.entities[c]);}return o}function*Ze(n,e){let t=f(n),r=e;if(r.reactiveKind!=="normal"){let i=t.reactiveBuffers.get(r.id);if(!i)return;let a=r.reactiveKind==="enter"?i.entered:i.exited;for(let s of a)yield s;a.length=0;return}let o=_(t,r);for(let i of o){let a=t.archetypes[i];for(let s=0;s<a.size;s++)yield a.entities[s];}}function Xe(n,e,t){let r=f(n),o=e;if(o.reactiveKind!=="normal"){let s=r.reactiveBuffers.get(o.id);if(!s)return;let c=o.reactiveKind==="enter"?s.entered:s.exited;if(c.length===0)return;let u=ie(r,o);for(let d=0;d<c.length;d++){let y=c[d];oe(t,y,u);}c.length=0;return}v(r,o);let i=_(r,o),a=ie(r,o);for(let s of i){let c=r.archetypes[s],u=c.entities,d=c.size;for(let y=0;y<d;y++)oe(t,u[y],a);}}function oe(n,e,t){switch(t.length){case 0:n(e);break;case 1:n(e,t[0]);break;case 2:n(e,t[0],t[1]);break;case 3:n(e,t[0],t[1],t[2]);break;case 4:n(e,t[0],t[1],t[2],t[3]);break;case 5:n(e,t[0],t[1],t[2],t[3],t[4]);break;default:n(e,...t);}}function ie(n,e){let t=[];for(let r of e.columnViewCache){let o=l(r),i=n.componentBitFor.get(o.id);if(i===void 0){t.push(void 0);continue}let a=n.componentStorageByBit[i];if(!a){t.push(void 0);continue}a.kind==="soa"?t.push(a.soa):a.kind==="aos"?t.push(a.aos):t.push(true);}return t}function se(n,e,t,r,o){for(let s of m.values())s.reactiveKind!=="normal"&&s.sourceQuery&&n.queries[s.sourceQuery.id]!==s.sourceQuery&&v(n,s.sourceQuery);let i=n.bitToQueries.get(t);if(!i)return;let a=n.options.maskWordCount;for(let s of i){let c=n.queries[s];if(!c||c.reactiveKind!=="normal")continue;let u=n.queryMasks.get(s);if(!u)continue;let d=E(r,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,a),y=E(o,u.withMask,u.anyMask,u.noneMask,u.anyHasBits,a);!d&&y?ae(n,s,"enter",e):d&&!y&&ae(n,s,"exit",e);}}function ae(n,e,t,r){for(let o of m.values()){if(o.sourceQueryId!==e||o.reactiveKind!==t)continue;v(n,o);let i=Je(n,o.id);t==="enter"?i.entered.push(r):i.exited.push(r);}}function Je(n,e){let t=n.reactiveBuffers.get(e);return t||(t={entered:[],exited:[]},n.reactiveBuffers.set(e,t)),t}function F(n){let e=en(n);if(!e)throw new Error(`aiecsjs: component id ${n} not registered`);return e}var j=null;function ce(n){j=n;}function en(n){return j?j(n):void 0}var nn={i8:"i8",u8:"u8",i16:"i16",u16:"u16",i32:"i32",u32:"u32",f32:"f32",f64:"f64",eid:"eid",bool:"bool"};function tn(...n){return n.length===0?e=>e:n.length===1?n[0]:(e,t)=>{let r=e;for(let o of n)r=o(r,t);return r}}ce(n=>re(n));ne((n,e,t,r,o)=>{se(n,e,t,r,o);});var Bn=typeof SharedArrayBuffer<"u";exports.IS_SAB_SUPPORTED=Bn;exports.Types=nn;exports.VERSION=U;exports.addComponent=Q;exports.createEntity=Se;exports.createWorld=be;exports.defineComponent=Re;exports.defineObjectComponent=Le;exports.defineQuery=He;exports.defineTag=Te;exports.destroyEntity=Ee;exports.destroyWorld=Ce;exports.enterQuery=Ke;exports.entityExists=Y;exports.exitQuery=Ne;exports.forEachEntity=Xe;exports.getComponent=ze;exports.getEntityGeneration=We;exports.getEntityIndex=Be;exports.getWorldCapacity=ge;exports.getWorldSize=xe;exports.hasComponent=je;exports.isEntity=_e;exports.isWorld=ve;exports.iterQuery=Ze;exports.packEntity=Me;exports.pipe=tn;exports.queryArchetypes=Ge;exports.removeComponent=Fe;exports.resetWorld=Ae;exports.runQuery=Ye;exports.setComponent=De;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|