@gg-web-engine/rapier3d 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,8 +1,9 @@
1
- import { Gg3dWorld, IRaycastVehicleComponent, IVisualScene3dComponent, Point3, Point4, SuspensionOptions, WheelOptions } from '@gg-web-engine/core';
1
+ import { Gg3dWorld, IRaycastVehicleComponent, IVisualScene3dComponent, Point3, Point4, SuspensionOptions, VisualTypeDocRepo3D, WheelOptions } from '@gg-web-engine/core';
2
2
  import { DynamicRayCastVehicleController } from '@dimforge/rapier3d-compat';
3
3
  import { Rapier3dRigidBodyComponent } from './rapier-3d-rigid-body.component';
4
4
  import { Rapier3dWorldComponent } from './rapier-3d-world.component';
5
- export declare class Rapier3dRaycastVehicleComponent extends Rapier3dRigidBodyComponent implements IRaycastVehicleComponent<Rapier3dWorldComponent> {
5
+ import { Rapier3dPhysicsTypeDocRepo } from '../types';
6
+ export declare class Rapier3dRaycastVehicleComponent extends Rapier3dRigidBodyComponent implements IRaycastVehicleComponent<Rapier3dPhysicsTypeDocRepo> {
6
7
  protected readonly world: Rapier3dWorldComponent;
7
8
  private chassisBody;
8
9
  protected _nativeVehicle: DynamicRayCastVehicleController | null;
@@ -10,8 +11,8 @@ export declare class Rapier3dRaycastVehicleComponent extends Rapier3dRigidBodyCo
10
11
  private wheelDescr;
11
12
  constructor(world: Rapier3dWorldComponent, chassisBody: Rapier3dRigidBodyComponent);
12
13
  get wheelSpeed(): number;
13
- addToWorld(world: Gg3dWorld<IVisualScene3dComponent, Rapier3dWorldComponent>): void;
14
- removeFromWorld(world: Gg3dWorld<IVisualScene3dComponent, Rapier3dWorldComponent>): void;
14
+ addToWorld(world: Gg3dWorld<VisualTypeDocRepo3D, Rapier3dPhysicsTypeDocRepo, IVisualScene3dComponent, Rapier3dWorldComponent>): void;
15
+ removeFromWorld(world: Gg3dWorld<VisualTypeDocRepo3D, Rapier3dPhysicsTypeDocRepo, IVisualScene3dComponent, Rapier3dWorldComponent>): void;
15
16
  addWheel(options: WheelOptions, suspensionOptions: SuspensionOptions): void;
16
17
  setSteering(wheelIndex: number, steering: number): void;
17
18
  applyEngineForce(wheelIndex: number, force: number): void;
@@ -22,5 +23,6 @@ export declare class Rapier3dRaycastVehicleComponent extends Rapier3dRigidBodyCo
22
23
  rotation: Point4;
23
24
  };
24
25
  resetSuspension(): void;
26
+ clone(): Rapier3dRaycastVehicleComponent;
25
27
  dispose(): void;
26
28
  }
@@ -81,6 +81,9 @@ export class Rapier3dRaycastVehicleComponent extends Rapier3dRigidBodyComponent
81
81
  resetSuspension() {
82
82
  // TODO
83
83
  }
84
+ clone() {
85
+ return new Rapier3dRaycastVehicleComponent(this.world, this.chassisBody.clone());
86
+ }
84
87
  dispose() {
85
88
  var _a;
86
89
  (_a = this.nativeVehicle) === null || _a === void 0 ? void 0 : _a.free();
@@ -1,7 +1,9 @@
1
- import { Body3DOptions, Entity3d, Gg3dWorld, IRigidBody3dComponent, IVisualScene3dComponent, Point3, Point4 } from '@gg-web-engine/core';
1
+ import { Body3DOptions, CollisionGroup, Entity3d, Gg3dWorld, IRigidBody3dComponent, Point3, Point4, VisualTypeDocRepo3D } from '@gg-web-engine/core';
2
2
  import { Collider, ColliderDesc, RigidBody, RigidBodyDesc } from '@dimforge/rapier3d-compat';
3
3
  import { Rapier3dWorldComponent } from './rapier-3d-world.component';
4
- export declare class Rapier3dRigidBodyComponent implements IRigidBody3dComponent<Rapier3dWorldComponent> {
4
+ import { Rapier3dPhysicsTypeDocRepo } from '../types';
5
+ import { InteractionGroups } from '@dimforge/rapier3d-compat/geometry/interaction_groups';
6
+ export declare class Rapier3dRigidBodyComponent implements IRigidBody3dComponent<Rapier3dPhysicsTypeDocRepo> {
5
7
  protected readonly world: Rapier3dWorldComponent;
6
8
  protected _colliderDescr: ColliderDesc[];
7
9
  protected _bodyDescr: RigidBodyDesc;
@@ -22,9 +24,14 @@ export declare class Rapier3dRigidBodyComponent implements IRigidBody3dComponent
22
24
  name: string;
23
25
  get factoryProps(): [ColliderDesc[], RigidBodyDesc, Omit<Omit<Body3DOptions, 'dynamic'>, 'mass'>];
24
26
  constructor(world: Rapier3dWorldComponent, _colliderDescr: ColliderDesc[], _bodyDescr: RigidBodyDesc, _colliderOptions: Omit<Omit<Body3DOptions, 'dynamic'>, 'mass'>);
27
+ protected collisionGroups: InteractionGroups;
28
+ get interactWithCollisionGroups(): CollisionGroup[];
29
+ set interactWithCollisionGroups(value: CollisionGroup[] | 'all');
30
+ get ownCollisionGroups(): CollisionGroup[];
31
+ set ownCollisionGroups(value: CollisionGroup[] | 'all');
25
32
  clone(): Rapier3dRigidBodyComponent;
26
- addToWorld(world: Gg3dWorld<IVisualScene3dComponent, Rapier3dWorldComponent>): void;
27
- removeFromWorld(world: Gg3dWorld<IVisualScene3dComponent, Rapier3dWorldComponent>): void;
33
+ addToWorld(world: Gg3dWorld<VisualTypeDocRepo3D, Rapier3dPhysicsTypeDocRepo>): void;
34
+ removeFromWorld(world: Gg3dWorld<VisualTypeDocRepo3D, Rapier3dPhysicsTypeDocRepo>): void;
28
35
  resetMotion(): void;
29
36
  dispose(): void;
30
37
  }
@@ -1,4 +1,4 @@
1
- import { Pnt3, Qtrn, } from '@gg-web-engine/core';
1
+ import { BitMask, Pnt3, Qtrn, } from '@gg-web-engine/core';
2
2
  import { ColliderDesc, Quaternion, RigidBodyDesc, Vector3 } from '@dimforge/rapier3d-compat';
3
3
  export class Rapier3dRigidBodyComponent {
4
4
  constructor(world, _colliderDescr, _bodyDescr, _colliderOptions) {
@@ -10,6 +10,9 @@ export class Rapier3dRigidBodyComponent {
10
10
  this._nativeBody = null;
11
11
  this._nativeBodyColliders = null;
12
12
  this.name = '';
13
+ this.collisionGroups = BitMask.full(32);
14
+ this.ownCollisionGroups = (_colliderOptions === null || _colliderOptions === void 0 ? void 0 : _colliderOptions.ownCollisionGroups) || 'all';
15
+ this.interactWithCollisionGroups = (_colliderOptions === null || _colliderOptions === void 0 ? void 0 : _colliderOptions.interactWithCollisionGroups) || 'all';
13
16
  }
14
17
  get position() {
15
18
  return Pnt3.clone(this.nativeBody ? this.nativeBody.translation() : this._bodyDescr.translation);
@@ -79,8 +82,54 @@ export class Rapier3dRigidBodyComponent {
79
82
  // TODO more fields here?
80
83
  return [colliderDescr, bd, this._colliderOptions];
81
84
  }
85
+ get interactWithCollisionGroups() {
86
+ return BitMask.unpack(this.collisionGroups, 16);
87
+ }
88
+ set interactWithCollisionGroups(value) {
89
+ let mask;
90
+ if (value === 'all') {
91
+ mask = BitMask.full(16);
92
+ }
93
+ else {
94
+ mask = BitMask.pack(value, 16);
95
+ }
96
+ mask = mask | (this.collisionGroups & (BitMask.full(16) << 16));
97
+ if (mask === this.collisionGroups) {
98
+ return;
99
+ }
100
+ this.collisionGroups = mask;
101
+ if (this.nativeBody) {
102
+ for (let i = 0; i < this.nativeBody.numColliders(); i++) {
103
+ this.nativeBody.collider(i).setCollisionGroups(this.collisionGroups);
104
+ }
105
+ }
106
+ }
107
+ get ownCollisionGroups() {
108
+ return BitMask.unpack(this.collisionGroups >> 16, 16);
109
+ }
110
+ set ownCollisionGroups(value) {
111
+ let mask;
112
+ if (value === 'all') {
113
+ mask = BitMask.full(16);
114
+ }
115
+ else {
116
+ mask = BitMask.pack(value, 16);
117
+ }
118
+ mask = (mask << 16) | (this.collisionGroups & BitMask.full(16));
119
+ if (mask === this.collisionGroups) {
120
+ return;
121
+ }
122
+ this.collisionGroups = mask;
123
+ if (this.nativeBody) {
124
+ for (let i = 0; i < this.nativeBody.numColliders(); i++) {
125
+ this.nativeBody.collider(i).setCollisionGroups(this.collisionGroups);
126
+ }
127
+ }
128
+ }
82
129
  clone() {
83
- return new Rapier3dRigidBodyComponent(this.world, ...this.factoryProps);
130
+ const comp = new Rapier3dRigidBodyComponent(this.world, ...this.factoryProps);
131
+ comp.collisionGroups = this.collisionGroups;
132
+ return comp;
84
133
  }
85
134
  addToWorld(world) {
86
135
  if (world.physicsWorld != this.world) {
@@ -91,6 +140,7 @@ export class Rapier3dRigidBodyComponent {
91
140
  const col = this.world.nativeWorld.createCollider(c, this._nativeBody);
92
141
  col.setFriction(this._colliderOptions.friction);
93
142
  col.setRestitution(this._colliderOptions.restitution);
143
+ col.setCollisionGroups(this.collisionGroups);
94
144
  return col;
95
145
  });
96
146
  this.world.handleIdEntityMap.set(this._nativeBody.handle, this);
@@ -1,9 +1,10 @@
1
1
  import { Observable, Subject } from 'rxjs';
2
2
  import { ColliderDesc, RigidBodyDesc } from '@dimforge/rapier3d-compat';
3
3
  import { Rapier3dRigidBodyComponent } from './rapier-3d-rigid-body.component';
4
- import { Gg3dWorld, ITrigger3dComponent, IVisualScene3dComponent } from '@gg-web-engine/core';
4
+ import { Gg3dWorld, ITrigger3dComponent, VisualTypeDocRepo3D } from '@gg-web-engine/core';
5
5
  import { Rapier3dWorldComponent } from './rapier-3d-world.component';
6
- export declare class Rapier3dTriggerComponent extends Rapier3dRigidBodyComponent implements ITrigger3dComponent<Rapier3dWorldComponent> {
6
+ import { Rapier3dPhysicsTypeDocRepo } from '../types';
7
+ export declare class Rapier3dTriggerComponent extends Rapier3dRigidBodyComponent implements ITrigger3dComponent<Rapier3dPhysicsTypeDocRepo> {
7
8
  protected readonly world: Rapier3dWorldComponent;
8
9
  protected _colliderDescr: ColliderDesc[];
9
10
  protected _bodyDescr: RigidBodyDesc;
@@ -12,7 +13,7 @@ export declare class Rapier3dTriggerComponent extends Rapier3dRigidBodyComponent
12
13
  protected readonly onEnter$: Subject<Rapier3dRigidBodyComponent>;
13
14
  protected readonly onLeft$: Subject<Rapier3dRigidBodyComponent>;
14
15
  constructor(world: Rapier3dWorldComponent, _colliderDescr: ColliderDesc[], _bodyDescr: RigidBodyDesc);
15
- addToWorld(world: Gg3dWorld<IVisualScene3dComponent, Rapier3dWorldComponent>): void;
16
+ addToWorld(world: Gg3dWorld<VisualTypeDocRepo3D, Rapier3dPhysicsTypeDocRepo>): void;
16
17
  checkOverlaps(): void;
17
18
  clone(): Rapier3dTriggerComponent;
18
19
  }
@@ -1,9 +1,10 @@
1
- import { Gg3dWorld, IDebugPhysicsDrawer, IPhysicsWorld3dComponent, Point3, Point4 } from '@gg-web-engine/core';
1
+ import { CollisionGroup, Gg3dWorld, IDebugPhysicsDrawer, IPhysicsWorld3dComponent, Point3, Point4 } from '@gg-web-engine/core';
2
2
  import { EventQueue, World } from '@dimforge/rapier3d-compat';
3
3
  import { Rapier3dRigidBodyComponent } from './rapier-3d-rigid-body.component';
4
4
  import { Rapier3dFactory } from '../rapier-3d-factory';
5
5
  import { Rapier3dLoader } from '../rapier-3d-loader';
6
- export declare class Rapier3dWorldComponent implements IPhysicsWorld3dComponent {
6
+ import { Rapier3dPhysicsTypeDocRepo } from '../types';
7
+ export declare class Rapier3dWorldComponent implements IPhysicsWorld3dComponent<Rapier3dPhysicsTypeDocRepo> {
7
8
  private _factory;
8
9
  get factory(): Rapier3dFactory;
9
10
  private _loader;
@@ -22,6 +23,9 @@ export declare class Rapier3dWorldComponent implements IPhysicsWorld3dComponent
22
23
  readonly handleIdEntityMap: Map<number, Rapier3dRigidBodyComponent>;
23
24
  init(): Promise<void>;
24
25
  simulate(delta: number): void;
26
+ protected lockedCollisionGroups: number[];
27
+ registerCollisionGroup(): CollisionGroup;
28
+ deregisterCollisionGroup(group: CollisionGroup): void;
25
29
  startDebugger(world: Gg3dWorld, drawer: IDebugPhysicsDrawer<Point3, Point4>): void;
26
30
  stopDebugger(): void;
27
31
  dispose(): void;
@@ -19,6 +19,7 @@ export class Rapier3dWorldComponent {
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) {
@@ -78,6 +79,18 @@ export class Rapier3dWorldComponent {
78
79
  this._nativeWorld.timestep = (this.timeScale * delta) / 1000;
79
80
  (_a = this._nativeWorld) === null || _a === void 0 ? void 0 : _a.step(this.eventQueue);
80
81
  }
82
+ registerCollisionGroup() {
83
+ for (let i = 0; i < 16; i++) {
84
+ if (!this.lockedCollisionGroups.includes(i)) {
85
+ this.lockedCollisionGroups.push(i);
86
+ return i;
87
+ }
88
+ }
89
+ throw new Error('App tries to register 17th collision group, but rapier 3D supports only 16');
90
+ }
91
+ deregisterCollisionGroup(group) {
92
+ this.lockedCollisionGroups = this.lockedCollisionGroups.filter(x => x !== group);
93
+ }
81
94
  startDebugger(world, drawer) {
82
95
  // TODO
83
96
  throw new Error('rapier-3d DebugDrawer not implemented');
package/dist/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from './components/rapier-3d-trigger.component';
3
3
  export * from './components/rapier-3d-world.component';
4
4
  export * from './rapier-3d-factory';
5
5
  export * from './rapier-3d-loader';
6
+ export * from './types';
package/dist/index.js CHANGED
@@ -4,3 +4,4 @@ export * from './components/rapier-3d-trigger.component';
4
4
  export * from './components/rapier-3d-world.component';
5
5
  export * from './rapier-3d-factory';
6
6
  export * from './rapier-3d-loader';
7
+ export * from './types';
@@ -3,7 +3,8 @@ import { ColliderDesc, RigidBodyDesc } from '@dimforge/rapier3d-compat';
3
3
  import { Rapier3dRigidBodyComponent } from './components/rapier-3d-rigid-body.component';
4
4
  import { Rapier3dTriggerComponent } from './components/rapier-3d-trigger.component';
5
5
  import { Rapier3dWorldComponent } from './components/rapier-3d-world.component';
6
- export declare class Rapier3dFactory implements IPhysicsBody3dComponentFactory<Rapier3dRigidBodyComponent, Rapier3dTriggerComponent> {
6
+ import { Rapier3dPhysicsTypeDocRepo } from './types';
7
+ export declare class Rapier3dFactory implements IPhysicsBody3dComponentFactory<Rapier3dPhysicsTypeDocRepo> {
7
8
  protected readonly world: Rapier3dWorldComponent;
8
9
  constructor(world: Rapier3dWorldComponent);
9
10
  createRigidBody(descriptor: BodyShape3DDescriptor, transform?: {
@@ -14,6 +15,7 @@ export declare class Rapier3dFactory implements IPhysicsBody3dComponentFactory<R
14
15
  position?: Point3;
15
16
  rotation?: Point4;
16
17
  }): Rapier3dTriggerComponent;
18
+ createRaycastVehicle(chassis: Rapier3dRigidBodyComponent): never;
17
19
  createColliderDescr(descriptor: Shape3DDescriptor): ColliderDesc[];
18
20
  createRigidBodyDescr(options: Partial<Body3DOptions>, transform?: {
19
21
  position?: Point3;
@@ -7,7 +7,7 @@ export class Rapier3dFactory {
7
7
  this.world = world;
8
8
  }
9
9
  createRigidBody(descriptor, transform) {
10
- return new Rapier3dRigidBodyComponent(this.world, this.createColliderDescr(descriptor.shape), this.createRigidBodyDescr(descriptor.body, transform), Object.assign({ friction: 0.5, restitution: 0.1 }, descriptor.body));
10
+ return new Rapier3dRigidBodyComponent(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);
@@ -17,9 +17,17 @@ export class Rapier3dFactory {
17
17
  });
18
18
  return new Rapier3dTriggerComponent(this.world, colliderDescr, this.createRigidBodyDescr({ dynamic: false }, transform));
19
19
  }
20
+ createRaycastVehicle(chassis) {
21
+ throw new Error('Raycast vehicle bindings for rapier3D are not implemented');
22
+ }
20
23
  createColliderDescr(descriptor) {
21
24
  const yToZUp = Qtrn.rotAround(Qtrn.O, Pnt3.X, Math.PI / 2);
22
25
  switch (descriptor.shape) {
26
+ // TODO looks like not exposed in rapier3d-compat
27
+ // case 'PLANE':
28
+ // return [
29
+ // ColliderDesc.halfspace(new Vector3(0, 0, 1)),
30
+ // ];
23
31
  case 'BOX':
24
32
  return [
25
33
  ColliderDesc.cuboid(descriptor.dimensions.x / 2, descriptor.dimensions.y / 2, descriptor.dimensions.z / 2),
@@ -1,6 +1,7 @@
1
1
  import { IPhysicsBody3dComponentLoader } from '@gg-web-engine/core';
2
2
  import { Rapier3dWorldComponent } from './components/rapier-3d-world.component';
3
- export declare class Rapier3dLoader extends IPhysicsBody3dComponentLoader {
3
+ import { Rapier3dPhysicsTypeDocRepo } from './types';
4
+ export declare class Rapier3dLoader extends IPhysicsBody3dComponentLoader<Rapier3dPhysicsTypeDocRepo> {
4
5
  protected readonly world: Rapier3dWorldComponent;
5
6
  constructor(world: Rapier3dWorldComponent);
6
7
  }
@@ -0,0 +1,11 @@
1
+ import { Rapier3dFactory } from './rapier-3d-factory';
2
+ import { Rapier3dLoader } from './rapier-3d-loader';
3
+ import { Rapier3dRigidBodyComponent } from './components/rapier-3d-rigid-body.component';
4
+ import { Rapier3dTriggerComponent } from './components/rapier-3d-trigger.component';
5
+ export declare type Rapier3dPhysicsTypeDocRepo = {
6
+ factory: Rapier3dFactory;
7
+ loader: Rapier3dLoader;
8
+ rigidBody: Rapier3dRigidBodyComponent;
9
+ trigger: Rapier3dTriggerComponent;
10
+ raycastVehicle: never;
11
+ };
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/rapier3d",
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",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "devDependencies": {
32
32
  "@dimforge/rapier3d-compat": "0.0.0-c23a138-20231001",
33
- "@gg-web-engine/core": "0.0.28",
33
+ "@gg-web-engine/core": "0.0.30",
34
34
  "prettier": "^2.8.6",
35
35
  "rxjs": "7.8.0",
36
36
  "typescript": "~4.7.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@dimforge/rapier3d-compat": "0.0.0-c23a138-20231001",
40
- "@gg-web-engine/core": "0.0.28",
40
+ "@gg-web-engine/core": "0.0.30",
41
41
  "rxjs": "7.8.0"
42
42
  }
43
43
  }