@gg-web-engine/rapier2d 0.0.28 → 0.0.30

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.
@@ -1,7 +1,8 @@
1
- import { Body2DOptions, Entity2d, Gg2dWorld, IRigidBody2dComponent, IVisualScene2dComponent, Point2 } from '@gg-web-engine/core';
2
- import { Collider, ColliderDesc, RigidBody, RigidBodyDesc } from '@dimforge/rapier2d-compat';
1
+ import { Body2DOptions, CollisionGroup, Entity2d, Gg2dWorld, IRigidBody2dComponent, Point2, VisualTypeDocRepo2D } from '@gg-web-engine/core';
2
+ import { Collider, ColliderDesc, InteractionGroups, RigidBody, RigidBodyDesc } from '@dimforge/rapier2d-compat';
3
3
  import { Rapier2dWorldComponent } from './rapier-2d-world.component';
4
- export declare class Rapier2dRigidBodyComponent implements IRigidBody2dComponent<Rapier2dWorldComponent> {
4
+ import { Rapier2dPhysicsTypeDocRepo } from '../types';
5
+ export declare class Rapier2dRigidBodyComponent implements IRigidBody2dComponent<Rapier2dPhysicsTypeDocRepo> {
5
6
  protected readonly world: Rapier2dWorldComponent;
6
7
  protected _colliderDescr: ColliderDesc[];
7
8
  protected _bodyDescr: RigidBodyDesc;
@@ -22,9 +23,14 @@ export declare class Rapier2dRigidBodyComponent implements IRigidBody2dComponent
22
23
  name: string;
23
24
  get factoryProps(): [ColliderDesc[], RigidBodyDesc, Omit<Omit<Body2DOptions, 'dynamic'>, 'mass'>];
24
25
  constructor(world: Rapier2dWorldComponent, _colliderDescr: ColliderDesc[], _bodyDescr: RigidBodyDesc, _colliderOptions: Omit<Omit<Body2DOptions, 'dynamic'>, 'mass'>);
26
+ protected collisionGroups: InteractionGroups;
27
+ get interactWithCollisionGroups(): CollisionGroup[];
28
+ set interactWithCollisionGroups(value: CollisionGroup[] | 'all');
29
+ get ownCollisionGroups(): CollisionGroup[];
30
+ set ownCollisionGroups(value: CollisionGroup[] | 'all');
25
31
  clone(): Rapier2dRigidBodyComponent;
26
- addToWorld(world: Gg2dWorld<IVisualScene2dComponent, Rapier2dWorldComponent>): void;
27
- removeFromWorld(world: Gg2dWorld<IVisualScene2dComponent, Rapier2dWorldComponent>): void;
32
+ addToWorld(world: Gg2dWorld<VisualTypeDocRepo2D, Rapier2dPhysicsTypeDocRepo>): void;
33
+ removeFromWorld(world: Gg2dWorld<VisualTypeDocRepo2D, Rapier2dPhysicsTypeDocRepo>): void;
28
34
  resetMotion(): void;
29
35
  dispose(): void;
30
36
  }
@@ -1,5 +1,5 @@
1
- import { Pnt2, } from '@gg-web-engine/core';
2
- import { Vector2 } from '@dimforge/rapier2d-compat';
1
+ import { BitMask, Pnt2, } from '@gg-web-engine/core';
2
+ import { Vector2, } from '@dimforge/rapier2d-compat';
3
3
  export class Rapier2dRigidBodyComponent {
4
4
  constructor(world, _colliderDescr, _bodyDescr, _colliderOptions) {
5
5
  this.world = world;
@@ -10,6 +10,7 @@ export class Rapier2dRigidBodyComponent {
10
10
  this._nativeBody = null;
11
11
  this._nativeBodyColliders = null;
12
12
  this.name = '';
13
+ this.collisionGroups = BitMask.full(32);
13
14
  }
14
15
  get position() {
15
16
  return Pnt2.clone(this.nativeBody ? this.nativeBody.translation() : this._bodyDescr.translation);
@@ -63,6 +64,50 @@ export class Rapier2dRigidBodyComponent {
63
64
  get factoryProps() {
64
65
  return [this._colliderDescr, this._bodyDescr, this._colliderOptions];
65
66
  }
67
+ get interactWithCollisionGroups() {
68
+ return BitMask.unpack(this.collisionGroups, 16);
69
+ }
70
+ set interactWithCollisionGroups(value) {
71
+ let mask;
72
+ if (value === 'all') {
73
+ mask = BitMask.full(16);
74
+ }
75
+ else {
76
+ mask = BitMask.pack(value, 16);
77
+ }
78
+ mask = mask | (this.collisionGroups & (BitMask.full(16) << 16));
79
+ if (mask === this.collisionGroups) {
80
+ return;
81
+ }
82
+ this.collisionGroups = mask;
83
+ if (this.nativeBody) {
84
+ for (let i = 0; i < this.nativeBody.numColliders(); i++) {
85
+ this.nativeBody.collider(i).setCollisionGroups(this.collisionGroups);
86
+ }
87
+ }
88
+ }
89
+ get ownCollisionGroups() {
90
+ return BitMask.unpack(this.collisionGroups >> 16, 16);
91
+ }
92
+ set ownCollisionGroups(value) {
93
+ let mask;
94
+ if (value === 'all') {
95
+ mask = BitMask.full(16);
96
+ }
97
+ else {
98
+ mask = BitMask.pack(value, 16);
99
+ }
100
+ mask = (mask << 16) | (this.collisionGroups & BitMask.full(16));
101
+ if (mask === this.collisionGroups) {
102
+ return;
103
+ }
104
+ this.collisionGroups = mask;
105
+ if (this.nativeBody) {
106
+ for (let i = 0; i < this.nativeBody.numColliders(); i++) {
107
+ this.nativeBody.collider(i).setCollisionGroups(this.collisionGroups);
108
+ }
109
+ }
110
+ }
66
111
  clone() {
67
112
  // TODO probably need to clone factory props to not share the same reference?
68
113
  return new Rapier2dRigidBodyComponent(this.world, ...this.factoryProps);
@@ -1,9 +1,10 @@
1
1
  import { Observable, Subject } from 'rxjs';
2
2
  import { ColliderDesc, RigidBodyDesc } from '@dimforge/rapier2d-compat';
3
3
  import { Rapier2dRigidBodyComponent } from './rapier-2d-rigid-body.component';
4
- import { Gg2dWorld, ITrigger2dComponent, IVisualScene2dComponent } from '@gg-web-engine/core';
4
+ import { Gg2dWorld, ITrigger2dComponent, VisualTypeDocRepo2D } from '@gg-web-engine/core';
5
5
  import { Rapier2dWorldComponent } from './rapier-2d-world.component';
6
- export declare class Rapier2dTriggerComponent extends Rapier2dRigidBodyComponent implements ITrigger2dComponent<Rapier2dWorldComponent> {
6
+ import { Rapier2dPhysicsTypeDocRepo } from '../types';
7
+ export declare class Rapier2dTriggerComponent extends Rapier2dRigidBodyComponent implements ITrigger2dComponent<Rapier2dPhysicsTypeDocRepo> {
7
8
  protected readonly world: Rapier2dWorldComponent;
8
9
  protected _colliderDescr: ColliderDesc[];
9
10
  protected _bodyDescr: RigidBodyDesc;
@@ -12,7 +13,7 @@ export declare class Rapier2dTriggerComponent extends Rapier2dRigidBodyComponent
12
13
  protected readonly onEnter$: Subject<Rapier2dRigidBodyComponent>;
13
14
  protected readonly onLeft$: Subject<Rapier2dRigidBodyComponent>;
14
15
  constructor(world: Rapier2dWorldComponent, _colliderDescr: ColliderDesc[], _bodyDescr: RigidBodyDesc);
15
- addToWorld(world: Gg2dWorld<IVisualScene2dComponent, Rapier2dWorldComponent>): void;
16
+ addToWorld(world: Gg2dWorld<VisualTypeDocRepo2D, Rapier2dPhysicsTypeDocRepo>): void;
16
17
  checkOverlaps(): void;
17
18
  clone(): Rapier2dTriggerComponent;
18
19
  }
@@ -1,8 +1,9 @@
1
- import { Gg2dWorld, IDebugPhysicsDrawer, IPhysicsWorld2dComponent, Point2 } from '@gg-web-engine/core';
1
+ import { CollisionGroup, Gg2dWorld, IDebugPhysicsDrawer, IPhysicsWorld2dComponent, Point2 } from '@gg-web-engine/core';
2
2
  import { EventQueue, World } from '@dimforge/rapier2d-compat';
3
3
  import { Rapier2dRigidBodyComponent } from './rapier-2d-rigid-body.component';
4
4
  import { Rapier2dFactory } from '../rapier-2d-factory';
5
- export declare class Rapier2dWorldComponent implements IPhysicsWorld2dComponent {
5
+ import { Rapier2dPhysicsTypeDocRepo } from '../types';
6
+ export declare class Rapier2dWorldComponent implements IPhysicsWorld2dComponent<Rapier2dPhysicsTypeDocRepo> {
6
7
  private _factory;
7
8
  get factory(): Rapier2dFactory;
8
9
  private readonly unitScale;
@@ -20,6 +21,9 @@ export declare class Rapier2dWorldComponent implements IPhysicsWorld2dComponent
20
21
  readonly handleIdEntityMap: Map<number, Rapier2dRigidBodyComponent>;
21
22
  init(): Promise<void>;
22
23
  simulate(delta: number): void;
24
+ protected lockedCollisionGroups: number[];
25
+ registerCollisionGroup(): CollisionGroup;
26
+ deregisterCollisionGroup(group: CollisionGroup): void;
23
27
  startDebugger(world: Gg2dWorld, drawer: IDebugPhysicsDrawer<Point2, number>): void;
24
28
  stopDebugger(): void;
25
29
  dispose(): void;
@@ -7,8 +7,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { Pnt2 } from '@gg-web-engine/core';
11
- import { init, EventQueue, Vector2, World } from '@dimforge/rapier2d-compat';
10
+ import { Pnt2, } from '@gg-web-engine/core';
11
+ import { EventQueue, init, Vector2, World } from '@dimforge/rapier2d-compat';
12
12
  import { Rapier2dFactory } from '../rapier-2d-factory';
13
13
  export class Rapier2dWorldComponent {
14
14
  constructor() {
@@ -19,6 +19,7 @@ export class Rapier2dWorldComponent {
19
19
  this._nativeWorld = null;
20
20
  this._eventQueue = null;
21
21
  this.handleIdEntityMap = new Map();
22
+ this.lockedCollisionGroups = [];
22
23
  }
23
24
  get factory() {
24
25
  if (!this._factory) {
@@ -70,6 +71,18 @@ export class Rapier2dWorldComponent {
70
71
  this._nativeWorld.timestep = (this.timeScale * delta) / 1000;
71
72
  (_a = this._nativeWorld) === null || _a === void 0 ? void 0 : _a.step(this.eventQueue);
72
73
  }
74
+ registerCollisionGroup() {
75
+ for (let i = 0; i < 16; i++) {
76
+ if (!this.lockedCollisionGroups.includes(i)) {
77
+ this.lockedCollisionGroups.push(i);
78
+ return i;
79
+ }
80
+ }
81
+ throw new Error('App tries to register 17th collision group, but rapier 2D supports only 16');
82
+ }
83
+ deregisterCollisionGroup(group) {
84
+ this.lockedCollisionGroups = this.lockedCollisionGroups.filter(x => x !== group);
85
+ }
73
86
  startDebugger(world, drawer) {
74
87
  // TODO
75
88
  throw new Error('rapier-2d DebugDrawer not implemented');
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './components/rapier-2d-rigid-body.component';
2
2
  export * from './components/rapier-2d-trigger.component';
3
3
  export * from './components/rapier-2d-world.component';
4
4
  export * from './rapier-2d-factory';
5
+ export * from './types';
package/dist/index.js CHANGED
@@ -2,3 +2,4 @@ export * from './components/rapier-2d-rigid-body.component';
2
2
  export * from './components/rapier-2d-trigger.component';
3
3
  export * from './components/rapier-2d-world.component';
4
4
  export * from './rapier-2d-factory';
5
+ export * from './types';
@@ -3,7 +3,8 @@ import { ColliderDesc, RigidBodyDesc } from '@dimforge/rapier2d-compat';
3
3
  import { Rapier2dRigidBodyComponent } from './components/rapier-2d-rigid-body.component';
4
4
  import { Rapier2dTriggerComponent } from './components/rapier-2d-trigger.component';
5
5
  import { Rapier2dWorldComponent } from './components/rapier-2d-world.component';
6
- export declare class Rapier2dFactory implements IPhysicsBody2dComponentFactory<Rapier2dRigidBodyComponent, Rapier2dTriggerComponent> {
6
+ import { Rapier2dPhysicsTypeDocRepo } from './types';
7
+ export declare class Rapier2dFactory implements IPhysicsBody2dComponentFactory<Rapier2dPhysicsTypeDocRepo> {
7
8
  protected readonly world: Rapier2dWorldComponent;
8
9
  constructor(world: Rapier2dWorldComponent);
9
10
  createRigidBody(descriptor: BodyShape2DDescriptor, transform?: {
@@ -7,7 +7,7 @@ export class Rapier2dFactory {
7
7
  this.world = world;
8
8
  }
9
9
  createRigidBody(descriptor, transform) {
10
- return new Rapier2dRigidBodyComponent(this.world, this.createColliderDescr(descriptor.shape), this.createRigidBodyDescr(descriptor.body, transform), Object.assign({ friction: 0.5, restitution: 0.1 }, descriptor.body));
10
+ return new Rapier2dRigidBodyComponent(this.world, this.createColliderDescr(descriptor.shape), this.createRigidBodyDescr(descriptor.body, transform), Object.assign({ friction: 0.5, restitution: 0.1, ownCollisionGroups: 'all', interactWithCollisionGroups: 'all' }, descriptor.body));
11
11
  }
12
12
  createTrigger(descriptor, transform) {
13
13
  const colliderDescr = this.createColliderDescr(descriptor);
@@ -0,0 +1,8 @@
1
+ import { Rapier2dFactory } from './rapier-2d-factory';
2
+ import { Rapier2dRigidBodyComponent } from './components/rapier-2d-rigid-body.component';
3
+ import { Rapier2dTriggerComponent } from './components/rapier-2d-trigger.component';
4
+ export declare type Rapier2dPhysicsTypeDocRepo = {
5
+ factory: Rapier2dFactory;
6
+ rigidBody: Rapier2dRigidBodyComponent;
7
+ trigger: Rapier2dTriggerComponent;
8
+ };
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gg-web-engine/rapier2d",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "description": "An attempt to create open source game engine for browser",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,14 +28,14 @@
28
28
  "homepage": "https://github.com/AndyGura/gg-web-engine#readme",
29
29
  "devDependencies": {
30
30
  "@dimforge/rapier2d-compat": "0.0.0-c23a138-20231001",
31
- "@gg-web-engine/core": "0.0.28",
31
+ "@gg-web-engine/core": "0.0.30",
32
32
  "prettier": "^2.8.6",
33
33
  "rxjs": "7.8.0",
34
34
  "typescript": "~4.7.2"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@dimforge/rapier2d-compat": "0.0.0-c23a138-20231001",
38
- "@gg-web-engine/core": "0.0.28",
38
+ "@gg-web-engine/core": "0.0.30",
39
39
  "rxjs": "7.8.0"
40
40
  }
41
41
  }