@lagless/physics-shared 0.0.38
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/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/body-type.d.ts +9 -0
- package/dist/lib/body-type.d.ts.map +1 -0
- package/dist/lib/body-type.js +8 -0
- package/dist/lib/body-type.js.map +1 -0
- package/dist/lib/collider-entity-map.d.ts +12 -0
- package/dist/lib/collider-entity-map.d.ts.map +1 -0
- package/dist/lib/collider-entity-map.js +43 -0
- package/dist/lib/collider-entity-map.js.map +1 -0
- package/dist/lib/collision-events-base.d.ts +76 -0
- package/dist/lib/collision-events-base.d.ts.map +1 -0
- package/dist/lib/collision-events-base.js +196 -0
- package/dist/lib/collision-events-base.js.map +1 -0
- package/dist/lib/collision-layers.d.ts +20 -0
- package/dist/lib/collision-layers.d.ts.map +1 -0
- package/dist/lib/collision-layers.js +53 -0
- package/dist/lib/collision-layers.js.map +1 -0
- package/dist/lib/physics-simulation-base.d.ts +34 -0
- package/dist/lib/physics-simulation-base.d.ts.map +1 -0
- package/dist/lib/physics-simulation-base.js +84 -0
- package/dist/lib/physics-simulation-base.js.map +1 -0
- package/dist/lib/physics-sync-interfaces.d.ts +23 -0
- package/dist/lib/physics-sync-interfaces.d.ts.map +1 -0
- package/dist/lib/physics-sync-interfaces.js +3 -0
- package/dist/lib/physics-sync-interfaces.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +55 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './lib/body-type.js';
|
|
2
|
+
export * from './lib/collider-entity-map.js';
|
|
3
|
+
export * from './lib/collision-layers.js';
|
|
4
|
+
export * from './lib/collision-events-base.js';
|
|
5
|
+
export * from './lib/physics-simulation-base.js';
|
|
6
|
+
export * from './lib/physics-sync-interfaces.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './lib/body-type.js';
|
|
2
|
+
export * from './lib/collider-entity-map.js';
|
|
3
|
+
export * from './lib/collision-layers.js';
|
|
4
|
+
export * from './lib/collision-events-base.js';
|
|
5
|
+
export * from './lib/physics-simulation-base.js';
|
|
6
|
+
export * from './lib/physics-sync-interfaces.js';
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './lib/body-type.js';\nexport * from './lib/collider-entity-map.js';\nexport * from './lib/collision-layers.js';\nexport * from './lib/collision-events-base.js';\nexport * from './lib/physics-simulation-base.js';\nexport * from './lib/physics-sync-interfaces.js';\n"],"names":[],"rangeMappings":";;;;;","mappings":"AAAA,cAAc,qBAAqB;AACnC,cAAc,+BAA+B;AAC7C,cAAc,4BAA4B;AAC1C,cAAc,iCAAiC;AAC/C,cAAc,mCAAmC;AACjD,cAAc,mCAAmC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Body type constants matching the auto-generated PhysicsRefs.bodyType field. */
|
|
2
|
+
export declare const BodyType: {
|
|
3
|
+
readonly DYNAMIC: 0;
|
|
4
|
+
readonly FIXED: 1;
|
|
5
|
+
readonly KINEMATIC_POSITION: 2;
|
|
6
|
+
readonly KINEMATIC_VELOCITY: 3;
|
|
7
|
+
};
|
|
8
|
+
export type BodyTypeValue = typeof BodyType[keyof typeof BodyType];
|
|
9
|
+
//# sourceMappingURL=body-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-type.d.ts","sourceRoot":"","sources":["../../src/lib/body-type.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/body-type.ts"],"sourcesContent":["/** Body type constants matching the auto-generated PhysicsRefs.bodyType field. */\nexport const BodyType = {\n DYNAMIC: 0,\n FIXED: 1,\n KINEMATIC_POSITION: 2,\n KINEMATIC_VELOCITY: 3,\n} as const;\n\nexport type BodyTypeValue = typeof BodyType[keyof typeof BodyType];\n"],"names":["BodyType","DYNAMIC","FIXED","KINEMATIC_POSITION","KINEMATIC_VELOCITY"],"rangeMappings":";;;;;","mappings":"AAAA,gFAAgF,GAChF,OAAO,MAAMA,WAAW;IACtBC,SAAS;IACTC,OAAO;IACPC,oBAAoB;IACpBC,oBAAoB;AACtB,EAAW"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const UNMAPPED_ENTITY = -1;
|
|
2
|
+
export declare function handleToIndex(handle: number): number;
|
|
3
|
+
export declare class ColliderEntityMap {
|
|
4
|
+
private _map;
|
|
5
|
+
constructor(initialCapacity?: number);
|
|
6
|
+
set(colliderHandle: number, entity: number): void;
|
|
7
|
+
get(colliderHandle: number): number;
|
|
8
|
+
delete(colliderHandle: number): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
private _grow;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=collider-entity-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collider-entity-map.d.ts","sourceRoot":"","sources":["../../src/lib/collider-entity-map.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,KAAK,CAAC;AAOlC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAa;gBAEb,eAAe,GAAE,MAAyB;IAI/C,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjD,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAMnC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAOpC,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,KAAK;CAMd"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const UNMAPPED_ENTITY = -1;
|
|
2
|
+
const DEFAULT_CAPACITY = 256;
|
|
3
|
+
// Reinterpret float64 bit pattern → uint32 index (low 32 bits of IEEE 754)
|
|
4
|
+
const _f64 = new Float64Array(1);
|
|
5
|
+
const _u32 = new Uint32Array(_f64.buffer);
|
|
6
|
+
export function handleToIndex(handle) {
|
|
7
|
+
_f64[0] = handle;
|
|
8
|
+
return _u32[0]; // low 32 bits = Rapier arena index
|
|
9
|
+
}
|
|
10
|
+
export class ColliderEntityMap {
|
|
11
|
+
set(colliderHandle, entity) {
|
|
12
|
+
const idx = handleToIndex(colliderHandle);
|
|
13
|
+
if (idx >= this._map.length) {
|
|
14
|
+
this._grow(idx + 1);
|
|
15
|
+
}
|
|
16
|
+
this._map[idx] = entity;
|
|
17
|
+
}
|
|
18
|
+
get(colliderHandle) {
|
|
19
|
+
const idx = handleToIndex(colliderHandle);
|
|
20
|
+
if (idx >= this._map.length) return UNMAPPED_ENTITY;
|
|
21
|
+
return this._map[idx];
|
|
22
|
+
}
|
|
23
|
+
delete(colliderHandle) {
|
|
24
|
+
const idx = handleToIndex(colliderHandle);
|
|
25
|
+
if (idx < this._map.length) {
|
|
26
|
+
this._map[idx] = UNMAPPED_ENTITY;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
clear() {
|
|
30
|
+
this._map.fill(UNMAPPED_ENTITY);
|
|
31
|
+
}
|
|
32
|
+
_grow(minCapacity) {
|
|
33
|
+
const newCapacity = Math.max(minCapacity, this._map.length * 2);
|
|
34
|
+
const newMap = new Int32Array(newCapacity).fill(UNMAPPED_ENTITY);
|
|
35
|
+
newMap.set(this._map);
|
|
36
|
+
this._map = newMap;
|
|
37
|
+
}
|
|
38
|
+
constructor(initialCapacity = DEFAULT_CAPACITY){
|
|
39
|
+
this._map = new Int32Array(initialCapacity).fill(UNMAPPED_ENTITY);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=collider-entity-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collider-entity-map.ts"],"sourcesContent":["export const UNMAPPED_ENTITY = -1;\nconst DEFAULT_CAPACITY = 256;\n\n// Reinterpret float64 bit pattern → uint32 index (low 32 bits of IEEE 754)\nconst _f64 = new Float64Array(1);\nconst _u32 = new Uint32Array(_f64.buffer);\n\nexport function handleToIndex(handle: number): number {\n _f64[0] = handle;\n return _u32[0]; // low 32 bits = Rapier arena index\n}\n\nexport class ColliderEntityMap {\n private _map: Int32Array;\n\n constructor(initialCapacity: number = DEFAULT_CAPACITY) {\n this._map = new Int32Array(initialCapacity).fill(UNMAPPED_ENTITY);\n }\n\n public set(colliderHandle: number, entity: number): void {\n const idx = handleToIndex(colliderHandle);\n if (idx >= this._map.length) {\n this._grow(idx + 1);\n }\n this._map[idx] = entity;\n }\n\n public get(colliderHandle: number): number {\n const idx = handleToIndex(colliderHandle);\n if (idx >= this._map.length) return UNMAPPED_ENTITY;\n return this._map[idx];\n }\n\n public delete(colliderHandle: number): void {\n const idx = handleToIndex(colliderHandle);\n if (idx < this._map.length) {\n this._map[idx] = UNMAPPED_ENTITY;\n }\n }\n\n public clear(): void {\n this._map.fill(UNMAPPED_ENTITY);\n }\n\n private _grow(minCapacity: number): void {\n const newCapacity = Math.max(minCapacity, this._map.length * 2);\n const newMap = new Int32Array(newCapacity).fill(UNMAPPED_ENTITY);\n newMap.set(this._map);\n this._map = newMap;\n }\n}\n"],"names":["UNMAPPED_ENTITY","DEFAULT_CAPACITY","_f64","Float64Array","_u32","Uint32Array","buffer","handleToIndex","handle","ColliderEntityMap","set","colliderHandle","entity","idx","_map","length","_grow","get","delete","clear","fill","minCapacity","newCapacity","Math","max","newMap","Int32Array","constructor","initialCapacity"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAO,MAAMA,kBAAkB,CAAC,EAAE;AAClC,MAAMC,mBAAmB;AAEzB,2EAA2E;AAC3E,MAAMC,OAAO,IAAIC,aAAa;AAC9B,MAAMC,OAAO,IAAIC,YAAYH,KAAKI,MAAM;AAExC,OAAO,SAASC,cAAcC,MAAc;IAC1CN,IAAI,CAAC,EAAE,GAAGM;IACV,OAAOJ,IAAI,CAAC,EAAE,EAAE,mCAAmC;AACrD;AAEA,OAAO,MAAMK;IAOJC,IAAIC,cAAsB,EAAEC,MAAc,EAAQ;QACvD,MAAMC,MAAMN,cAAcI;QAC1B,IAAIE,OAAO,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE;YAC3B,IAAI,CAACC,KAAK,CAACH,MAAM;QACnB;QACA,IAAI,CAACC,IAAI,CAACD,IAAI,GAAGD;IACnB;IAEOK,IAAIN,cAAsB,EAAU;QACzC,MAAME,MAAMN,cAAcI;QAC1B,IAAIE,OAAO,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE,OAAOf;QACpC,OAAO,IAAI,CAACc,IAAI,CAACD,IAAI;IACvB;IAEOK,OAAOP,cAAsB,EAAQ;QAC1C,MAAME,MAAMN,cAAcI;QAC1B,IAAIE,MAAM,IAAI,CAACC,IAAI,CAACC,MAAM,EAAE;YAC1B,IAAI,CAACD,IAAI,CAACD,IAAI,GAAGb;QACnB;IACF;IAEOmB,QAAc;QACnB,IAAI,CAACL,IAAI,CAACM,IAAI,CAACpB;IACjB;IAEQgB,MAAMK,WAAmB,EAAQ;QACvC,MAAMC,cAAcC,KAAKC,GAAG,CAACH,aAAa,IAAI,CAACP,IAAI,CAACC,MAAM,GAAG;QAC7D,MAAMU,SAAS,IAAIC,WAAWJ,aAAaF,IAAI,CAACpB;QAChDyB,OAAOf,GAAG,CAAC,IAAI,CAACI,IAAI;QACpB,IAAI,CAACA,IAAI,GAAGW;IACd;IAlCAE,YAAYC,kBAA0B3B,gBAAgB,CAAE;QACtD,IAAI,CAACa,IAAI,GAAG,IAAIY,WAAWE,iBAAiBR,IAAI,CAACpB;IACnD;AAiCF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ColliderEntityMap } from './collider-entity-map.js';
|
|
2
|
+
/** Minimal Rapier EventQueue interface (identical in 2D and 3D). */
|
|
3
|
+
export interface IRapierEventQueue {
|
|
4
|
+
free(): void;
|
|
5
|
+
drainCollisionEvents(f: (h1: number, h2: number, started: boolean) => void): void;
|
|
6
|
+
drainContactForceEvents(f: (event: {
|
|
7
|
+
collider1(): number;
|
|
8
|
+
collider2(): number;
|
|
9
|
+
totalForceMagnitude(): number;
|
|
10
|
+
maxForceMagnitude(): number;
|
|
11
|
+
maxForceDirection(): unknown;
|
|
12
|
+
}) => void): void;
|
|
13
|
+
clear(): void;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal world interface for checking sensor status during event drain. */
|
|
16
|
+
export interface IColliderSensorChecker {
|
|
17
|
+
getCollider(handle: number): {
|
|
18
|
+
isSensor(): boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Factory interface for creating an EventQueue. */
|
|
22
|
+
export interface IEventQueueFactory {
|
|
23
|
+
new (autoDrain: boolean): IRapierEventQueue;
|
|
24
|
+
}
|
|
25
|
+
export declare class CollisionEventsBase {
|
|
26
|
+
private readonly _eventQueue;
|
|
27
|
+
private readonly _drainCollisionCb;
|
|
28
|
+
private readonly _drainForceCb;
|
|
29
|
+
private _currentEntityMap;
|
|
30
|
+
private _currentWorld;
|
|
31
|
+
private _collisionEnterA;
|
|
32
|
+
private _collisionEnterB;
|
|
33
|
+
private _collisionEnterCount;
|
|
34
|
+
private _collisionExitA;
|
|
35
|
+
private _collisionExitB;
|
|
36
|
+
private _collisionExitCount;
|
|
37
|
+
private _sensorEnterA;
|
|
38
|
+
private _sensorEnterB;
|
|
39
|
+
private _sensorEnterCount;
|
|
40
|
+
private _sensorExitA;
|
|
41
|
+
private _sensorExitB;
|
|
42
|
+
private _sensorExitCount;
|
|
43
|
+
private _contactForceA;
|
|
44
|
+
private _contactForceB;
|
|
45
|
+
private _contactForceMagnitude;
|
|
46
|
+
private _contactForceCount;
|
|
47
|
+
constructor(eventQueueFactory: IEventQueueFactory, initialCapacity?: number);
|
|
48
|
+
get eventQueue(): IRapierEventQueue;
|
|
49
|
+
/** Drain Rapier events into internal buffers. Clears previous events first. */
|
|
50
|
+
drain(entityMap: ColliderEntityMap, world: IColliderSensorChecker): void;
|
|
51
|
+
/** Clear all event buffers. */
|
|
52
|
+
clear(): void;
|
|
53
|
+
get collisionEnterCount(): number;
|
|
54
|
+
collisionEnterEntityA(index: number): number;
|
|
55
|
+
collisionEnterEntityB(index: number): number;
|
|
56
|
+
get collisionExitCount(): number;
|
|
57
|
+
collisionExitEntityA(index: number): number;
|
|
58
|
+
collisionExitEntityB(index: number): number;
|
|
59
|
+
get sensorEnterCount(): number;
|
|
60
|
+
sensorEnterEntityA(index: number): number;
|
|
61
|
+
sensorEnterEntityB(index: number): number;
|
|
62
|
+
get sensorExitCount(): number;
|
|
63
|
+
sensorExitEntityA(index: number): number;
|
|
64
|
+
sensorExitEntityB(index: number): number;
|
|
65
|
+
get contactForceCount(): number;
|
|
66
|
+
contactForceEntityA(index: number): number;
|
|
67
|
+
contactForceEntityB(index: number): number;
|
|
68
|
+
contactForceMagnitude(index: number): number;
|
|
69
|
+
dispose(): void;
|
|
70
|
+
private _pushCollisionEnter;
|
|
71
|
+
private _pushCollisionExit;
|
|
72
|
+
private _pushSensorEnter;
|
|
73
|
+
private _pushSensorExit;
|
|
74
|
+
private _pushContactForce;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=collision-events-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-events-base.d.ts","sourceRoot":"","sources":["../../src/lib/collision-events-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { UNMAPPED_ENTITY } from './collider-entity-map.js';
|
|
2
|
+
const DEFAULT_CAPACITY = 64;
|
|
3
|
+
export class CollisionEventsBase {
|
|
4
|
+
get eventQueue() {
|
|
5
|
+
return this._eventQueue;
|
|
6
|
+
}
|
|
7
|
+
/** Drain Rapier events into internal buffers. Clears previous events first. */ drain(entityMap, world) {
|
|
8
|
+
this.clear();
|
|
9
|
+
this._currentEntityMap = entityMap;
|
|
10
|
+
this._currentWorld = world;
|
|
11
|
+
this._eventQueue.drainCollisionEvents(this._drainCollisionCb);
|
|
12
|
+
this._eventQueue.drainContactForceEvents(this._drainForceCb);
|
|
13
|
+
this._currentEntityMap = null;
|
|
14
|
+
this._currentWorld = null;
|
|
15
|
+
}
|
|
16
|
+
/** Clear all event buffers. */ clear() {
|
|
17
|
+
this._collisionEnterCount = 0;
|
|
18
|
+
this._collisionExitCount = 0;
|
|
19
|
+
this._sensorEnterCount = 0;
|
|
20
|
+
this._sensorExitCount = 0;
|
|
21
|
+
this._contactForceCount = 0;
|
|
22
|
+
}
|
|
23
|
+
// --- Collision enter ---
|
|
24
|
+
get collisionEnterCount() {
|
|
25
|
+
return this._collisionEnterCount;
|
|
26
|
+
}
|
|
27
|
+
collisionEnterEntityA(index) {
|
|
28
|
+
return this._collisionEnterA[index];
|
|
29
|
+
}
|
|
30
|
+
collisionEnterEntityB(index) {
|
|
31
|
+
return this._collisionEnterB[index];
|
|
32
|
+
}
|
|
33
|
+
// --- Collision exit ---
|
|
34
|
+
get collisionExitCount() {
|
|
35
|
+
return this._collisionExitCount;
|
|
36
|
+
}
|
|
37
|
+
collisionExitEntityA(index) {
|
|
38
|
+
return this._collisionExitA[index];
|
|
39
|
+
}
|
|
40
|
+
collisionExitEntityB(index) {
|
|
41
|
+
return this._collisionExitB[index];
|
|
42
|
+
}
|
|
43
|
+
// --- Sensor enter ---
|
|
44
|
+
get sensorEnterCount() {
|
|
45
|
+
return this._sensorEnterCount;
|
|
46
|
+
}
|
|
47
|
+
sensorEnterEntityA(index) {
|
|
48
|
+
return this._sensorEnterA[index];
|
|
49
|
+
}
|
|
50
|
+
sensorEnterEntityB(index) {
|
|
51
|
+
return this._sensorEnterB[index];
|
|
52
|
+
}
|
|
53
|
+
// --- Sensor exit ---
|
|
54
|
+
get sensorExitCount() {
|
|
55
|
+
return this._sensorExitCount;
|
|
56
|
+
}
|
|
57
|
+
sensorExitEntityA(index) {
|
|
58
|
+
return this._sensorExitA[index];
|
|
59
|
+
}
|
|
60
|
+
sensorExitEntityB(index) {
|
|
61
|
+
return this._sensorExitB[index];
|
|
62
|
+
}
|
|
63
|
+
// --- Contact forces ---
|
|
64
|
+
get contactForceCount() {
|
|
65
|
+
return this._contactForceCount;
|
|
66
|
+
}
|
|
67
|
+
contactForceEntityA(index) {
|
|
68
|
+
return this._contactForceA[index];
|
|
69
|
+
}
|
|
70
|
+
contactForceEntityB(index) {
|
|
71
|
+
return this._contactForceB[index];
|
|
72
|
+
}
|
|
73
|
+
contactForceMagnitude(index) {
|
|
74
|
+
return this._contactForceMagnitude[index];
|
|
75
|
+
}
|
|
76
|
+
dispose() {
|
|
77
|
+
this._eventQueue.free();
|
|
78
|
+
}
|
|
79
|
+
// --- Internal push methods with auto-grow ---
|
|
80
|
+
_pushCollisionEnter(a, b) {
|
|
81
|
+
const idx = this._collisionEnterCount++;
|
|
82
|
+
if (idx >= this._collisionEnterA.length) {
|
|
83
|
+
this._collisionEnterA = _grow(this._collisionEnterA);
|
|
84
|
+
this._collisionEnterB = _grow(this._collisionEnterB);
|
|
85
|
+
}
|
|
86
|
+
this._collisionEnterA[idx] = a;
|
|
87
|
+
this._collisionEnterB[idx] = b;
|
|
88
|
+
}
|
|
89
|
+
_pushCollisionExit(a, b) {
|
|
90
|
+
const idx = this._collisionExitCount++;
|
|
91
|
+
if (idx >= this._collisionExitA.length) {
|
|
92
|
+
this._collisionExitA = _grow(this._collisionExitA);
|
|
93
|
+
this._collisionExitB = _grow(this._collisionExitB);
|
|
94
|
+
}
|
|
95
|
+
this._collisionExitA[idx] = a;
|
|
96
|
+
this._collisionExitB[idx] = b;
|
|
97
|
+
}
|
|
98
|
+
_pushSensorEnter(nonSensor, sensor) {
|
|
99
|
+
const idx = this._sensorEnterCount++;
|
|
100
|
+
if (idx >= this._sensorEnterA.length) {
|
|
101
|
+
this._sensorEnterA = _grow(this._sensorEnterA);
|
|
102
|
+
this._sensorEnterB = _grow(this._sensorEnterB);
|
|
103
|
+
}
|
|
104
|
+
this._sensorEnterA[idx] = nonSensor;
|
|
105
|
+
this._sensorEnterB[idx] = sensor;
|
|
106
|
+
}
|
|
107
|
+
_pushSensorExit(nonSensor, sensor) {
|
|
108
|
+
const idx = this._sensorExitCount++;
|
|
109
|
+
if (idx >= this._sensorExitA.length) {
|
|
110
|
+
this._sensorExitA = _grow(this._sensorExitA);
|
|
111
|
+
this._sensorExitB = _grow(this._sensorExitB);
|
|
112
|
+
}
|
|
113
|
+
this._sensorExitA[idx] = nonSensor;
|
|
114
|
+
this._sensorExitB[idx] = sensor;
|
|
115
|
+
}
|
|
116
|
+
_pushContactForce(a, b, magnitude) {
|
|
117
|
+
const idx = this._contactForceCount++;
|
|
118
|
+
if (idx >= this._contactForceA.length) {
|
|
119
|
+
this._contactForceA = _grow(this._contactForceA);
|
|
120
|
+
this._contactForceB = _grow(this._contactForceB);
|
|
121
|
+
this._contactForceMagnitude = _growFloat(this._contactForceMagnitude);
|
|
122
|
+
}
|
|
123
|
+
this._contactForceA[idx] = a;
|
|
124
|
+
this._contactForceB[idx] = b;
|
|
125
|
+
this._contactForceMagnitude[idx] = magnitude;
|
|
126
|
+
}
|
|
127
|
+
constructor(eventQueueFactory, initialCapacity = DEFAULT_CAPACITY){
|
|
128
|
+
// Transient references set during drain()
|
|
129
|
+
this._currentEntityMap = null;
|
|
130
|
+
this._currentWorld = null;
|
|
131
|
+
this._collisionEnterCount = 0;
|
|
132
|
+
this._collisionExitCount = 0;
|
|
133
|
+
this._sensorEnterCount = 0;
|
|
134
|
+
this._sensorExitCount = 0;
|
|
135
|
+
this._contactForceCount = 0;
|
|
136
|
+
this._eventQueue = new eventQueueFactory(false);
|
|
137
|
+
this._collisionEnterA = new Int32Array(initialCapacity);
|
|
138
|
+
this._collisionEnterB = new Int32Array(initialCapacity);
|
|
139
|
+
this._collisionExitA = new Int32Array(initialCapacity);
|
|
140
|
+
this._collisionExitB = new Int32Array(initialCapacity);
|
|
141
|
+
this._sensorEnterA = new Int32Array(initialCapacity);
|
|
142
|
+
this._sensorEnterB = new Int32Array(initialCapacity);
|
|
143
|
+
this._sensorExitA = new Int32Array(initialCapacity);
|
|
144
|
+
this._sensorExitB = new Int32Array(initialCapacity);
|
|
145
|
+
this._contactForceA = new Int32Array(initialCapacity);
|
|
146
|
+
this._contactForceB = new Int32Array(initialCapacity);
|
|
147
|
+
this._contactForceMagnitude = new Float32Array(initialCapacity);
|
|
148
|
+
// Pre-bind callbacks
|
|
149
|
+
this._drainCollisionCb = (h1, h2, started)=>{
|
|
150
|
+
const entityMap = this._currentEntityMap;
|
|
151
|
+
const world = this._currentWorld;
|
|
152
|
+
const e1 = entityMap.get(h1);
|
|
153
|
+
const e2 = entityMap.get(h2);
|
|
154
|
+
if (e1 === UNMAPPED_ENTITY || e2 === UNMAPPED_ENTITY) return;
|
|
155
|
+
const c1 = world.getCollider(h1);
|
|
156
|
+
const c2 = world.getCollider(h2);
|
|
157
|
+
const c1Sensor = c1.isSensor();
|
|
158
|
+
const c2Sensor = c2.isSensor();
|
|
159
|
+
if (c1Sensor || c2Sensor) {
|
|
160
|
+
// Convention: A = non-sensor entity, B = sensor entity
|
|
161
|
+
const nonSensorE = c1Sensor ? e2 : e1;
|
|
162
|
+
const sensorE = c1Sensor ? e1 : e2;
|
|
163
|
+
if (started) {
|
|
164
|
+
this._pushSensorEnter(nonSensorE, sensorE);
|
|
165
|
+
} else {
|
|
166
|
+
this._pushSensorExit(nonSensorE, sensorE);
|
|
167
|
+
}
|
|
168
|
+
} else {
|
|
169
|
+
if (started) {
|
|
170
|
+
this._pushCollisionEnter(e1, e2);
|
|
171
|
+
} else {
|
|
172
|
+
this._pushCollisionExit(e1, e2);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
this._drainForceCb = (event)=>{
|
|
177
|
+
const entityMap = this._currentEntityMap;
|
|
178
|
+
const e1 = entityMap.get(event.collider1());
|
|
179
|
+
const e2 = entityMap.get(event.collider2());
|
|
180
|
+
if (e1 === UNMAPPED_ENTITY || e2 === UNMAPPED_ENTITY) return;
|
|
181
|
+
this._pushContactForce(e1, e2, event.totalForceMagnitude());
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function _grow(arr) {
|
|
186
|
+
const next = new Int32Array(arr.length * 2);
|
|
187
|
+
next.set(arr);
|
|
188
|
+
return next;
|
|
189
|
+
}
|
|
190
|
+
function _growFloat(arr) {
|
|
191
|
+
const next = new Float32Array(arr.length * 2);
|
|
192
|
+
next.set(arr);
|
|
193
|
+
return next;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
//# sourceMappingURL=collision-events-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collision-events-base.ts"],"sourcesContent":["import { ColliderEntityMap, UNMAPPED_ENTITY } from './collider-entity-map.js';\n\n/** Minimal Rapier EventQueue interface (identical in 2D and 3D). */\nexport interface IRapierEventQueue {\n free(): void;\n drainCollisionEvents(f: (h1: number, h2: number, started: boolean) => void): void;\n drainContactForceEvents(f: (event: { collider1(): number; collider2(): number; totalForceMagnitude(): number; maxForceMagnitude(): number; maxForceDirection(): unknown }) => void): void;\n clear(): void;\n}\n\n/** Minimal world interface for checking sensor status during event drain. */\nexport interface IColliderSensorChecker {\n getCollider(handle: number): { isSensor(): boolean };\n}\n\n/** Factory interface for creating an EventQueue. */\nexport interface IEventQueueFactory {\n new (autoDrain: boolean): IRapierEventQueue;\n}\n\nconst DEFAULT_CAPACITY = 64;\n\nexport class CollisionEventsBase {\n private readonly _eventQueue: IRapierEventQueue;\n\n // Pre-bound drain callbacks (zero allocation per tick)\n private readonly _drainCollisionCb: (h1: number, h2: number, started: boolean) => void;\n private readonly _drainForceCb: (event: { collider1(): number; collider2(): number; totalForceMagnitude(): number; maxForceMagnitude(): number; maxForceDirection(): unknown }) => void;\n\n // Transient references set during drain()\n private _currentEntityMap: ColliderEntityMap | null = null;\n private _currentWorld: IColliderSensorChecker | null = null;\n\n // Collision enter (solid bodies)\n private _collisionEnterA: Int32Array;\n private _collisionEnterB: Int32Array;\n private _collisionEnterCount = 0;\n\n // Collision exit (solid bodies)\n private _collisionExitA: Int32Array;\n private _collisionExitB: Int32Array;\n private _collisionExitCount = 0;\n\n // Sensor enter\n private _sensorEnterA: Int32Array;\n private _sensorEnterB: Int32Array;\n private _sensorEnterCount = 0;\n\n // Sensor exit\n private _sensorExitA: Int32Array;\n private _sensorExitB: Int32Array;\n private _sensorExitCount = 0;\n\n // Contact forces\n private _contactForceA: Int32Array;\n private _contactForceB: Int32Array;\n private _contactForceMagnitude: Float32Array;\n private _contactForceCount = 0;\n\n constructor(eventQueueFactory: IEventQueueFactory, initialCapacity: number = DEFAULT_CAPACITY) {\n this._eventQueue = new eventQueueFactory(false);\n\n this._collisionEnterA = new Int32Array(initialCapacity);\n this._collisionEnterB = new Int32Array(initialCapacity);\n this._collisionExitA = new Int32Array(initialCapacity);\n this._collisionExitB = new Int32Array(initialCapacity);\n this._sensorEnterA = new Int32Array(initialCapacity);\n this._sensorEnterB = new Int32Array(initialCapacity);\n this._sensorExitA = new Int32Array(initialCapacity);\n this._sensorExitB = new Int32Array(initialCapacity);\n this._contactForceA = new Int32Array(initialCapacity);\n this._contactForceB = new Int32Array(initialCapacity);\n this._contactForceMagnitude = new Float32Array(initialCapacity);\n\n // Pre-bind callbacks\n this._drainCollisionCb = (h1: number, h2: number, started: boolean): void => {\n const entityMap = this._currentEntityMap!;\n const world = this._currentWorld!;\n\n const e1 = entityMap.get(h1);\n const e2 = entityMap.get(h2);\n if (e1 === UNMAPPED_ENTITY || e2 === UNMAPPED_ENTITY) return;\n\n const c1 = world.getCollider(h1);\n const c2 = world.getCollider(h2);\n const c1Sensor = c1.isSensor();\n const c2Sensor = c2.isSensor();\n\n if (c1Sensor || c2Sensor) {\n // Convention: A = non-sensor entity, B = sensor entity\n const nonSensorE = c1Sensor ? e2 : e1;\n const sensorE = c1Sensor ? e1 : e2;\n if (started) {\n this._pushSensorEnter(nonSensorE, sensorE);\n } else {\n this._pushSensorExit(nonSensorE, sensorE);\n }\n } else {\n if (started) {\n this._pushCollisionEnter(e1, e2);\n } else {\n this._pushCollisionExit(e1, e2);\n }\n }\n };\n\n this._drainForceCb = (event: { collider1(): number; collider2(): number; totalForceMagnitude(): number; maxForceMagnitude(): number; maxForceDirection(): unknown }): void => {\n const entityMap = this._currentEntityMap!;\n const e1 = entityMap.get(event.collider1());\n const e2 = entityMap.get(event.collider2());\n if (e1 === UNMAPPED_ENTITY || e2 === UNMAPPED_ENTITY) return;\n this._pushContactForce(e1, e2, event.totalForceMagnitude());\n };\n }\n\n public get eventQueue(): IRapierEventQueue {\n return this._eventQueue;\n }\n\n /** Drain Rapier events into internal buffers. Clears previous events first. */\n public drain(entityMap: ColliderEntityMap, world: IColliderSensorChecker): void {\n this.clear();\n this._currentEntityMap = entityMap;\n this._currentWorld = world;\n\n this._eventQueue.drainCollisionEvents(this._drainCollisionCb);\n this._eventQueue.drainContactForceEvents(this._drainForceCb);\n\n this._currentEntityMap = null;\n this._currentWorld = null;\n }\n\n /** Clear all event buffers. */\n public clear(): void {\n this._collisionEnterCount = 0;\n this._collisionExitCount = 0;\n this._sensorEnterCount = 0;\n this._sensorExitCount = 0;\n this._contactForceCount = 0;\n }\n\n // --- Collision enter ---\n public get collisionEnterCount(): number { return this._collisionEnterCount; }\n public collisionEnterEntityA(index: number): number { return this._collisionEnterA[index]; }\n public collisionEnterEntityB(index: number): number { return this._collisionEnterB[index]; }\n\n // --- Collision exit ---\n public get collisionExitCount(): number { return this._collisionExitCount; }\n public collisionExitEntityA(index: number): number { return this._collisionExitA[index]; }\n public collisionExitEntityB(index: number): number { return this._collisionExitB[index]; }\n\n // --- Sensor enter ---\n public get sensorEnterCount(): number { return this._sensorEnterCount; }\n public sensorEnterEntityA(index: number): number { return this._sensorEnterA[index]; }\n public sensorEnterEntityB(index: number): number { return this._sensorEnterB[index]; }\n\n // --- Sensor exit ---\n public get sensorExitCount(): number { return this._sensorExitCount; }\n public sensorExitEntityA(index: number): number { return this._sensorExitA[index]; }\n public sensorExitEntityB(index: number): number { return this._sensorExitB[index]; }\n\n // --- Contact forces ---\n public get contactForceCount(): number { return this._contactForceCount; }\n public contactForceEntityA(index: number): number { return this._contactForceA[index]; }\n public contactForceEntityB(index: number): number { return this._contactForceB[index]; }\n public contactForceMagnitude(index: number): number { return this._contactForceMagnitude[index]; }\n\n public dispose(): void {\n this._eventQueue.free();\n }\n\n // --- Internal push methods with auto-grow ---\n\n private _pushCollisionEnter(a: number, b: number): void {\n const idx = this._collisionEnterCount++;\n if (idx >= this._collisionEnterA.length) {\n this._collisionEnterA = _grow(this._collisionEnterA);\n this._collisionEnterB = _grow(this._collisionEnterB);\n }\n this._collisionEnterA[idx] = a;\n this._collisionEnterB[idx] = b;\n }\n\n private _pushCollisionExit(a: number, b: number): void {\n const idx = this._collisionExitCount++;\n if (idx >= this._collisionExitA.length) {\n this._collisionExitA = _grow(this._collisionExitA);\n this._collisionExitB = _grow(this._collisionExitB);\n }\n this._collisionExitA[idx] = a;\n this._collisionExitB[idx] = b;\n }\n\n private _pushSensorEnter(nonSensor: number, sensor: number): void {\n const idx = this._sensorEnterCount++;\n if (idx >= this._sensorEnterA.length) {\n this._sensorEnterA = _grow(this._sensorEnterA);\n this._sensorEnterB = _grow(this._sensorEnterB);\n }\n this._sensorEnterA[idx] = nonSensor;\n this._sensorEnterB[idx] = sensor;\n }\n\n private _pushSensorExit(nonSensor: number, sensor: number): void {\n const idx = this._sensorExitCount++;\n if (idx >= this._sensorExitA.length) {\n this._sensorExitA = _grow(this._sensorExitA);\n this._sensorExitB = _grow(this._sensorExitB);\n }\n this._sensorExitA[idx] = nonSensor;\n this._sensorExitB[idx] = sensor;\n }\n\n private _pushContactForce(a: number, b: number, magnitude: number): void {\n const idx = this._contactForceCount++;\n if (idx >= this._contactForceA.length) {\n this._contactForceA = _grow(this._contactForceA);\n this._contactForceB = _grow(this._contactForceB);\n this._contactForceMagnitude = _growFloat(this._contactForceMagnitude);\n }\n this._contactForceA[idx] = a;\n this._contactForceB[idx] = b;\n this._contactForceMagnitude[idx] = magnitude;\n }\n}\n\nfunction _grow(arr: Int32Array): Int32Array {\n const next = new Int32Array(arr.length * 2);\n next.set(arr);\n return next;\n}\n\nfunction _growFloat(arr: Float32Array): Float32Array {\n const next = new Float32Array(arr.length * 2);\n next.set(arr);\n return next;\n}\n"],"names":["UNMAPPED_ENTITY","DEFAULT_CAPACITY","CollisionEventsBase","eventQueue","_eventQueue","drain","entityMap","world","clear","_currentEntityMap","_currentWorld","drainCollisionEvents","_drainCollisionCb","drainContactForceEvents","_drainForceCb","_collisionEnterCount","_collisionExitCount","_sensorEnterCount","_sensorExitCount","_contactForceCount","collisionEnterCount","collisionEnterEntityA","index","_collisionEnterA","collisionEnterEntityB","_collisionEnterB","collisionExitCount","collisionExitEntityA","_collisionExitA","collisionExitEntityB","_collisionExitB","sensorEnterCount","sensorEnterEntityA","_sensorEnterA","sensorEnterEntityB","_sensorEnterB","sensorExitCount","sensorExitEntityA","_sensorExitA","sensorExitEntityB","_sensorExitB","contactForceCount","contactForceEntityA","_contactForceA","contactForceEntityB","_contactForceB","contactForceMagnitude","_contactForceMagnitude","dispose","free","_pushCollisionEnter","a","b","idx","length","_grow","_pushCollisionExit","_pushSensorEnter","nonSensor","sensor","_pushSensorExit","_pushContactForce","magnitude","_growFloat","constructor","eventQueueFactory","initialCapacity","Int32Array","Float32Array","h1","h2","started","e1","get","e2","c1","getCollider","c2","c1Sensor","isSensor","c2Sensor","nonSensorE","sensorE","event","collider1","collider2","totalForceMagnitude","arr","next","set"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class CollisionLayers {
|
|
2
|
+
private _nextBit;
|
|
3
|
+
private readonly _names;
|
|
4
|
+
private readonly _pairs;
|
|
5
|
+
/** Register a named layer, returns bit index (0..15). */
|
|
6
|
+
layer(name: string): number;
|
|
7
|
+
/** Allow interactions between two layers (bidirectional). */
|
|
8
|
+
pair(a: string, b: string): this;
|
|
9
|
+
/** Allow a layer to interact with itself. */
|
|
10
|
+
selfPair(name: string): this;
|
|
11
|
+
/**
|
|
12
|
+
* Build Rapier InteractionGroups for a given layer name.
|
|
13
|
+
* Returns u32: bits 0-15 = membership (1 << bit), bits 16-31 = filter mask.
|
|
14
|
+
*/
|
|
15
|
+
groups(name: string): number;
|
|
16
|
+
/** Get bit index for a layer name. */
|
|
17
|
+
bit(name: string): number;
|
|
18
|
+
private _bit;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=collision-layers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collision-layers.d.ts","sourceRoot":"","sources":["../../src/lib/collision-layers.ts"],"names":[],"mappings":"AAEA,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD,yDAAyD;IAClD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYlC,6DAA6D;IACtD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAQvC,6CAA6C;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnC;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOnC,sCAAsC;IAC/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,OAAO,CAAC,IAAI;CAOb"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const MAX_LAYERS = 16;
|
|
2
|
+
export class CollisionLayers {
|
|
3
|
+
/** Register a named layer, returns bit index (0..15). */ layer(name) {
|
|
4
|
+
if (this._names.has(name)) {
|
|
5
|
+
throw new Error(`CollisionLayers: layer "${name}" already exists`);
|
|
6
|
+
}
|
|
7
|
+
if (this._nextBit >= MAX_LAYERS) {
|
|
8
|
+
throw new Error(`CollisionLayers: maximum ${MAX_LAYERS} layers exceeded`);
|
|
9
|
+
}
|
|
10
|
+
const bit = this._nextBit++;
|
|
11
|
+
this._names.set(name, bit);
|
|
12
|
+
return bit;
|
|
13
|
+
}
|
|
14
|
+
/** Allow interactions between two layers (bidirectional). */ pair(a, b) {
|
|
15
|
+
const bitA = this._bit(a);
|
|
16
|
+
const bitB = this._bit(b);
|
|
17
|
+
this._pairs[bitA] |= 1 << bitB;
|
|
18
|
+
this._pairs[bitB] |= 1 << bitA;
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
/** Allow a layer to interact with itself. */ selfPair(name) {
|
|
22
|
+
const bit = this._bit(name);
|
|
23
|
+
this._pairs[bit] |= 1 << bit;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build Rapier InteractionGroups for a given layer name.
|
|
28
|
+
* Returns u32: bits 0-15 = membership (1 << bit), bits 16-31 = filter mask.
|
|
29
|
+
*/ groups(name) {
|
|
30
|
+
const bit = this._bit(name);
|
|
31
|
+
const membership = 1 << bit;
|
|
32
|
+
const filter = this._pairs[bit];
|
|
33
|
+
return filter << 16 | membership;
|
|
34
|
+
}
|
|
35
|
+
/** Get bit index for a layer name. */ bit(name) {
|
|
36
|
+
return this._bit(name);
|
|
37
|
+
}
|
|
38
|
+
_bit(name) {
|
|
39
|
+
const bit = this._names.get(name);
|
|
40
|
+
if (bit === undefined) {
|
|
41
|
+
throw new Error(`CollisionLayers: unknown layer "${name}"`);
|
|
42
|
+
}
|
|
43
|
+
return bit;
|
|
44
|
+
}
|
|
45
|
+
constructor(){
|
|
46
|
+
this._nextBit = 0;
|
|
47
|
+
this._names = new Map();
|
|
48
|
+
this._pairs = new Uint16Array(MAX_LAYERS) // per-layer filter mask
|
|
49
|
+
;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=collision-layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/collision-layers.ts"],"sourcesContent":["const MAX_LAYERS = 16;\n\nexport class CollisionLayers {\n private _nextBit = 0;\n private readonly _names = new Map<string, number>();\n private readonly _pairs = new Uint16Array(MAX_LAYERS); // per-layer filter mask\n\n /** Register a named layer, returns bit index (0..15). */\n public layer(name: string): number {\n if (this._names.has(name)) {\n throw new Error(`CollisionLayers: layer \"${name}\" already exists`);\n }\n if (this._nextBit >= MAX_LAYERS) {\n throw new Error(`CollisionLayers: maximum ${MAX_LAYERS} layers exceeded`);\n }\n const bit = this._nextBit++;\n this._names.set(name, bit);\n return bit;\n }\n\n /** Allow interactions between two layers (bidirectional). */\n public pair(a: string, b: string): this {\n const bitA = this._bit(a);\n const bitB = this._bit(b);\n this._pairs[bitA] |= (1 << bitB);\n this._pairs[bitB] |= (1 << bitA);\n return this;\n }\n\n /** Allow a layer to interact with itself. */\n public selfPair(name: string): this {\n const bit = this._bit(name);\n this._pairs[bit] |= (1 << bit);\n return this;\n }\n\n /**\n * Build Rapier InteractionGroups for a given layer name.\n * Returns u32: bits 0-15 = membership (1 << bit), bits 16-31 = filter mask.\n */\n public groups(name: string): number {\n const bit = this._bit(name);\n const membership = 1 << bit;\n const filter = this._pairs[bit];\n return (filter << 16) | membership;\n }\n\n /** Get bit index for a layer name. */\n public bit(name: string): number {\n return this._bit(name);\n }\n\n private _bit(name: string): number {\n const bit = this._names.get(name);\n if (bit === undefined) {\n throw new Error(`CollisionLayers: unknown layer \"${name}\"`);\n }\n return bit;\n }\n}\n"],"names":["MAX_LAYERS","CollisionLayers","layer","name","_names","has","Error","_nextBit","bit","set","pair","a","b","bitA","_bit","bitB","_pairs","selfPair","groups","membership","filter","get","undefined","Map","Uint16Array"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,MAAMA,aAAa;AAEnB,OAAO,MAAMC;IAKX,uDAAuD,GACvD,AAAOC,MAAMC,IAAY,EAAU;QACjC,IAAI,IAAI,CAACC,MAAM,CAACC,GAAG,CAACF,OAAO;YACzB,MAAM,IAAIG,MAAM,CAAC,wBAAwB,EAAEH,KAAK,gBAAgB,CAAC;QACnE;QACA,IAAI,IAAI,CAACI,QAAQ,IAAIP,YAAY;YAC/B,MAAM,IAAIM,MAAM,CAAC,yBAAyB,EAAEN,WAAW,gBAAgB,CAAC;QAC1E;QACA,MAAMQ,MAAM,IAAI,CAACD,QAAQ;QACzB,IAAI,CAACH,MAAM,CAACK,GAAG,CAACN,MAAMK;QACtB,OAAOA;IACT;IAEA,2DAA2D,GAC3D,AAAOE,KAAKC,CAAS,EAAEC,CAAS,EAAQ;QACtC,MAAMC,OAAO,IAAI,CAACC,IAAI,CAACH;QACvB,MAAMI,OAAO,IAAI,CAACD,IAAI,CAACF;QACvB,IAAI,CAACI,MAAM,CAACH,KAAK,IAAK,KAAKE;QAC3B,IAAI,CAACC,MAAM,CAACD,KAAK,IAAK,KAAKF;QAC3B,OAAO,IAAI;IACb;IAEA,2CAA2C,GAC3C,AAAOI,SAASd,IAAY,EAAQ;QAClC,MAAMK,MAAM,IAAI,CAACM,IAAI,CAACX;QACtB,IAAI,CAACa,MAAM,CAACR,IAAI,IAAK,KAAKA;QAC1B,OAAO,IAAI;IACb;IAEA;;;GAGC,GACD,AAAOU,OAAOf,IAAY,EAAU;QAClC,MAAMK,MAAM,IAAI,CAACM,IAAI,CAACX;QACtB,MAAMgB,aAAa,KAAKX;QACxB,MAAMY,SAAS,IAAI,CAACJ,MAAM,CAACR,IAAI;QAC/B,OAAO,AAACY,UAAU,KAAMD;IAC1B;IAEA,oCAAoC,GACpC,AAAOX,IAAIL,IAAY,EAAU;QAC/B,OAAO,IAAI,CAACW,IAAI,CAACX;IACnB;IAEQW,KAAKX,IAAY,EAAU;QACjC,MAAMK,MAAM,IAAI,CAACJ,MAAM,CAACiB,GAAG,CAAClB;QAC5B,IAAIK,QAAQc,WAAW;YACrB,MAAM,IAAIhB,MAAM,CAAC,gCAAgC,EAAEH,KAAK,CAAC,CAAC;QAC5D;QACA,OAAOK;IACT;;aAvDQD,WAAW;aACFH,SAAS,IAAImB;aACbP,SAAS,IAAIQ,YAAYxB,YAAa,wBAAwB;;;AAsDjF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ECSConfig, ECSSimulation, AbstractInputProvider, ECSDeps } from '@lagless/core';
|
|
2
|
+
/** Minimal interface for a physics world manager that supports snapshot/restore. */
|
|
3
|
+
export interface IPhysicsWorldManagerBase {
|
|
4
|
+
takeSnapshot(): Uint8Array;
|
|
5
|
+
restoreSnapshot(data: Uint8Array): void;
|
|
6
|
+
}
|
|
7
|
+
export declare class PhysicsSimulationBase extends ECSSimulation {
|
|
8
|
+
private readonly _physicsWorldManager;
|
|
9
|
+
private _rapierSnapshotHistory;
|
|
10
|
+
private readonly _initialRapierSnapshot;
|
|
11
|
+
constructor(config: ECSConfig, deps: ECSDeps, inputProvider: AbstractInputProvider, _physicsWorldManager: IPhysicsWorldManagerBase);
|
|
12
|
+
protected saveSnapshot(tick: number): void;
|
|
13
|
+
protected rollback(tick: number): void;
|
|
14
|
+
applyExternalState(state: ArrayBuffer, tick: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Apply an external Rapier snapshot (e.g. from late-join state transfer).
|
|
17
|
+
*/
|
|
18
|
+
applyExternalPhysicsState(rapierSnapshot: Uint8Array, tick: number): void;
|
|
19
|
+
/**
|
|
20
|
+
* Export current Rapier world snapshot for state transfer.
|
|
21
|
+
*/
|
|
22
|
+
exportPhysicsSnapshot(): Uint8Array;
|
|
23
|
+
/**
|
|
24
|
+
* Export combined ECS + Rapier state for network transfer.
|
|
25
|
+
* Format: [ecsLength:u32LE][ecsBytes][rapierBytes]
|
|
26
|
+
*/
|
|
27
|
+
exportStateForTransfer(): ArrayBuffer;
|
|
28
|
+
/**
|
|
29
|
+
* Apply combined ECS + Rapier state from network transfer.
|
|
30
|
+
* Splits the blob, applies ECS state, restores Rapier world, saves snapshot.
|
|
31
|
+
*/
|
|
32
|
+
applyStateFromTransfer(blob: ArrayBuffer, tick: number): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=physics-simulation-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-simulation-base.d.ts","sourceRoot":"","sources":["../../src/lib/physics-simulation-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKzF,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACvC,YAAY,IAAI,UAAU,CAAC;IAC3B,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IAQpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAPvC,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;gBAGlD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,qBAAqB,EACnB,oBAAoB,EAAE,wBAAwB;cAO9C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;cAKhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkB/B,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1E;;OAEG;IACI,yBAAyB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhF;;OAEG;IACI,qBAAqB,IAAI,UAAU;IAI1C;;;OAGG;IACa,sBAAsB,IAAI,WAAW;IAcrD;;;OAGG;IACa,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAoB9E"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ECSSimulation } from '@lagless/core';
|
|
2
|
+
import { SnapshotHistory, createLogger } from '@lagless/misc';
|
|
3
|
+
const log = createLogger('PhysicsSimulationBase');
|
|
4
|
+
export class PhysicsSimulationBase extends ECSSimulation {
|
|
5
|
+
saveSnapshot(tick) {
|
|
6
|
+
super.saveSnapshot(tick);
|
|
7
|
+
this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());
|
|
8
|
+
}
|
|
9
|
+
rollback(tick) {
|
|
10
|
+
// Rollback ECS state first (calls super which restores ArrayBuffer)
|
|
11
|
+
super.rollback(tick);
|
|
12
|
+
// Rollback Rapier world
|
|
13
|
+
let rapierSnapshot;
|
|
14
|
+
try {
|
|
15
|
+
rapierSnapshot = this._rapierSnapshotHistory.getNearest(tick);
|
|
16
|
+
log.warn(`Rapier rollback to tick ${tick} succeeded`);
|
|
17
|
+
} catch (e) {
|
|
18
|
+
rapierSnapshot = this._initialRapierSnapshot;
|
|
19
|
+
log.warn(`Rapier rollback to tick ${tick} failed, using initial snapshot`);
|
|
20
|
+
}
|
|
21
|
+
this._physicsWorldManager.restoreSnapshot(rapierSnapshot);
|
|
22
|
+
this._rapierSnapshotHistory.rollback(this.mem.tickManager.tick);
|
|
23
|
+
}
|
|
24
|
+
applyExternalState(state, tick) {
|
|
25
|
+
// Reset rapier snapshot history BEFORE super call — super.applyExternalState()
|
|
26
|
+
// calls this.saveSnapshot(tick), which writes to _rapierSnapshotHistory.
|
|
27
|
+
// If we reset after, the old _lastTick causes "Ticks must be non-decreasing".
|
|
28
|
+
this._rapierSnapshotHistory = new SnapshotHistory(this._ECSConfig.snapshotHistorySize);
|
|
29
|
+
super.applyExternalState(state, tick);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Apply an external Rapier snapshot (e.g. from late-join state transfer).
|
|
33
|
+
*/ applyExternalPhysicsState(rapierSnapshot, tick) {
|
|
34
|
+
log.info(`Applying external physics state at tick ${tick} (${rapierSnapshot.byteLength} bytes)`);
|
|
35
|
+
this._physicsWorldManager.restoreSnapshot(rapierSnapshot);
|
|
36
|
+
this._rapierSnapshotHistory = new SnapshotHistory(this._ECSConfig.snapshotHistorySize);
|
|
37
|
+
this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Export current Rapier world snapshot for state transfer.
|
|
41
|
+
*/ exportPhysicsSnapshot() {
|
|
42
|
+
return this._physicsWorldManager.takeSnapshot();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Export combined ECS + Rapier state for network transfer.
|
|
46
|
+
* Format: [ecsLength:u32LE][ecsBytes][rapierBytes]
|
|
47
|
+
*/ exportStateForTransfer() {
|
|
48
|
+
const ecsSnapshot = this.mem.exportSnapshot();
|
|
49
|
+
const rapierSnapshot = this._physicsWorldManager.takeSnapshot();
|
|
50
|
+
const blob = new ArrayBuffer(4 + ecsSnapshot.byteLength + rapierSnapshot.byteLength);
|
|
51
|
+
const view = new DataView(blob);
|
|
52
|
+
view.setUint32(0, ecsSnapshot.byteLength, true);
|
|
53
|
+
new Uint8Array(blob, 4, ecsSnapshot.byteLength).set(new Uint8Array(ecsSnapshot));
|
|
54
|
+
new Uint8Array(blob, 4 + ecsSnapshot.byteLength).set(rapierSnapshot);
|
|
55
|
+
log.info(`exportStateForTransfer: ecs=${ecsSnapshot.byteLength} rapier=${rapierSnapshot.byteLength} total=${blob.byteLength}`);
|
|
56
|
+
return blob;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Apply combined ECS + Rapier state from network transfer.
|
|
60
|
+
* Splits the blob, applies ECS state, restores Rapier world, saves snapshot.
|
|
61
|
+
*/ applyStateFromTransfer(blob, tick) {
|
|
62
|
+
const view = new DataView(blob);
|
|
63
|
+
const ecsLength = view.getUint32(0, true);
|
|
64
|
+
const ecsState = blob.slice(4, 4 + ecsLength);
|
|
65
|
+
const rapierBytes = new Uint8Array(blob, 4 + ecsLength);
|
|
66
|
+
log.info(`applyStateFromTransfer: tick=${tick} ecs=${ecsLength} rapier=${rapierBytes.byteLength}`);
|
|
67
|
+
// Apply ECS state (calls applyExternalState → saveSnapshot)
|
|
68
|
+
this.applyExternalState(ecsState, tick);
|
|
69
|
+
// Restore Rapier world from transferred snapshot
|
|
70
|
+
this._physicsWorldManager.restoreSnapshot(rapierBytes);
|
|
71
|
+
// Save rapier snapshot at this tick (overwrite the empty one saved by applyExternalState)
|
|
72
|
+
this._rapierSnapshotHistory = new SnapshotHistory(this._ECSConfig.snapshotHistorySize);
|
|
73
|
+
this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());
|
|
74
|
+
this.notifyStateTransferHandlers(tick);
|
|
75
|
+
}
|
|
76
|
+
constructor(config, deps, inputProvider, _physicsWorldManager){
|
|
77
|
+
super(config, deps, inputProvider);
|
|
78
|
+
this._physicsWorldManager = _physicsWorldManager;
|
|
79
|
+
this._rapierSnapshotHistory = new SnapshotHistory(config.snapshotHistorySize);
|
|
80
|
+
this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=physics-simulation-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-simulation-base.ts"],"sourcesContent":["import { ECSConfig, ECSSimulation, AbstractInputProvider, ECSDeps } from '@lagless/core';\nimport { SnapshotHistory, createLogger } from '@lagless/misc';\n\nconst log = createLogger('PhysicsSimulationBase');\n\n/** Minimal interface for a physics world manager that supports snapshot/restore. */\nexport interface IPhysicsWorldManagerBase {\n takeSnapshot(): Uint8Array;\n restoreSnapshot(data: Uint8Array): void;\n}\n\nexport class PhysicsSimulationBase extends ECSSimulation {\n private _rapierSnapshotHistory: SnapshotHistory<Uint8Array>;\n private readonly _initialRapierSnapshot: Uint8Array;\n\n constructor(\n config: ECSConfig,\n deps: ECSDeps,\n inputProvider: AbstractInputProvider,\n private readonly _physicsWorldManager: IPhysicsWorldManagerBase,\n ) {\n super(config, deps, inputProvider);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(config.snapshotHistorySize);\n this._initialRapierSnapshot = this._physicsWorldManager.takeSnapshot();\n }\n\n protected override saveSnapshot(tick: number): void {\n super.saveSnapshot(tick);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n }\n\n protected override rollback(tick: number): void {\n // Rollback ECS state first (calls super which restores ArrayBuffer)\n super.rollback(tick);\n\n // Rollback Rapier world\n let rapierSnapshot: Uint8Array;\n try {\n rapierSnapshot = this._rapierSnapshotHistory.getNearest(tick);\n log.warn(`Rapier rollback to tick ${tick} succeeded`);\n } catch {\n rapierSnapshot = this._initialRapierSnapshot;\n log.warn(`Rapier rollback to tick ${tick} failed, using initial snapshot`);\n }\n\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory.rollback(this.mem.tickManager.tick);\n }\n\n public override applyExternalState(state: ArrayBuffer, tick: number): void {\n // Reset rapier snapshot history BEFORE super call — super.applyExternalState()\n // calls this.saveSnapshot(tick), which writes to _rapierSnapshotHistory.\n // If we reset after, the old _lastTick causes \"Ticks must be non-decreasing\".\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n super.applyExternalState(state, tick);\n }\n\n /**\n * Apply an external Rapier snapshot (e.g. from late-join state transfer).\n */\n public applyExternalPhysicsState(rapierSnapshot: Uint8Array, tick: number): void {\n log.info(`Applying external physics state at tick ${tick} (${rapierSnapshot.byteLength} bytes)`);\n this._physicsWorldManager.restoreSnapshot(rapierSnapshot);\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n }\n\n /**\n * Export current Rapier world snapshot for state transfer.\n */\n public exportPhysicsSnapshot(): Uint8Array {\n return this._physicsWorldManager.takeSnapshot();\n }\n\n /**\n * Export combined ECS + Rapier state for network transfer.\n * Format: [ecsLength:u32LE][ecsBytes][rapierBytes]\n */\n public override exportStateForTransfer(): ArrayBuffer {\n const ecsSnapshot = this.mem.exportSnapshot();\n const rapierSnapshot = this._physicsWorldManager.takeSnapshot();\n\n const blob = new ArrayBuffer(4 + ecsSnapshot.byteLength + rapierSnapshot.byteLength);\n const view = new DataView(blob);\n view.setUint32(0, ecsSnapshot.byteLength, true);\n new Uint8Array(blob, 4, ecsSnapshot.byteLength).set(new Uint8Array(ecsSnapshot));\n new Uint8Array(blob, 4 + ecsSnapshot.byteLength).set(rapierSnapshot);\n\n log.info(`exportStateForTransfer: ecs=${ecsSnapshot.byteLength} rapier=${rapierSnapshot.byteLength} total=${blob.byteLength}`);\n return blob;\n }\n\n /**\n * Apply combined ECS + Rapier state from network transfer.\n * Splits the blob, applies ECS state, restores Rapier world, saves snapshot.\n */\n public override applyStateFromTransfer(blob: ArrayBuffer, tick: number): void {\n const view = new DataView(blob);\n const ecsLength = view.getUint32(0, true);\n const ecsState = blob.slice(4, 4 + ecsLength);\n const rapierBytes = new Uint8Array(blob, 4 + ecsLength);\n\n log.info(`applyStateFromTransfer: tick=${tick} ecs=${ecsLength} rapier=${rapierBytes.byteLength}`);\n\n // Apply ECS state (calls applyExternalState → saveSnapshot)\n this.applyExternalState(ecsState, tick);\n\n // Restore Rapier world from transferred snapshot\n this._physicsWorldManager.restoreSnapshot(rapierBytes);\n\n // Save rapier snapshot at this tick (overwrite the empty one saved by applyExternalState)\n this._rapierSnapshotHistory = new SnapshotHistory<Uint8Array>(this._ECSConfig.snapshotHistorySize);\n this._rapierSnapshotHistory.set(tick, this._physicsWorldManager.takeSnapshot());\n\n this.notifyStateTransferHandlers(tick);\n }\n}\n"],"names":["ECSSimulation","SnapshotHistory","createLogger","log","PhysicsSimulationBase","saveSnapshot","tick","_rapierSnapshotHistory","set","_physicsWorldManager","takeSnapshot","rollback","rapierSnapshot","getNearest","warn","_initialRapierSnapshot","restoreSnapshot","mem","tickManager","applyExternalState","state","_ECSConfig","snapshotHistorySize","applyExternalPhysicsState","info","byteLength","exportPhysicsSnapshot","exportStateForTransfer","ecsSnapshot","exportSnapshot","blob","ArrayBuffer","view","DataView","setUint32","Uint8Array","applyStateFromTransfer","ecsLength","getUint32","ecsState","slice","rapierBytes","notifyStateTransferHandlers","constructor","config","deps","inputProvider"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface IPhysicsRefsComponent {
|
|
2
|
+
bodyHandle: {
|
|
3
|
+
get(entity: number): number;
|
|
4
|
+
set(entity: number, v: number): void;
|
|
5
|
+
};
|
|
6
|
+
bodyType: {
|
|
7
|
+
get(entity: number): number;
|
|
8
|
+
set(entity: number, v: number): void;
|
|
9
|
+
};
|
|
10
|
+
colliderHandle: {
|
|
11
|
+
get(entity: number): number;
|
|
12
|
+
set(entity: number, v: number): void;
|
|
13
|
+
};
|
|
14
|
+
collisionLayer: {
|
|
15
|
+
get(entity: number): number;
|
|
16
|
+
set(entity: number, v: number): void;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface IFilter {
|
|
20
|
+
readonly length: number;
|
|
21
|
+
entities(index: number): number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=physics-sync-interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-sync-interfaces.d.ts","sourceRoot":"","sources":["../../src/lib/physics-sync-interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAClF,QAAQ,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAChF,cAAc,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtF,cAAc,EAAE;QAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACvF;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/physics-sync-interfaces.ts"],"sourcesContent":["export interface IPhysicsRefsComponent {\n bodyHandle: { get(entity: number): number; set(entity: number, v: number): void };\n bodyType: { get(entity: number): number; set(entity: number, v: number): void };\n colliderHandle: { get(entity: number): number; set(entity: number, v: number): void };\n collisionLayer: { get(entity: number): number; set(entity: number, v: number): void };\n}\n\nexport interface IFilter {\n readonly length: number;\n entities(index: number): number;\n}\n"],"names":[],"rangeMappings":"","mappings":"AAOA,WAGC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":"5.9.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lagless/physics-shared",
|
|
3
|
+
"version": "0.0.38",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/GbGr/lagless",
|
|
8
|
+
"directory": "libs/physics-shared"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": "./package.json",
|
|
16
|
+
".": {
|
|
17
|
+
"@lagless/source": "./src/index.ts",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"nx": {
|
|
24
|
+
"sourceRoot": "libs/physics-shared/src",
|
|
25
|
+
"targets": {
|
|
26
|
+
"build": {
|
|
27
|
+
"executor": "@nx/js:swc",
|
|
28
|
+
"outputs": [
|
|
29
|
+
"{options.outputPath}"
|
|
30
|
+
],
|
|
31
|
+
"options": {
|
|
32
|
+
"outputPath": "libs/physics-shared/dist",
|
|
33
|
+
"main": "libs/physics-shared/src/index.ts",
|
|
34
|
+
"tsConfig": "libs/physics-shared/tsconfig.lib.json",
|
|
35
|
+
"stripLeadingPaths": true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@swc/helpers": "~0.5.11",
|
|
42
|
+
"@lagless/core": "0.0.38",
|
|
43
|
+
"@lagless/misc": "0.0.38"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"unplugin-swc": "^1.5.7"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
}
|
|
55
|
+
}
|