From f6bcb386915d2befed15a6a3a5566f9e04b2493d Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Tue, 19 Apr 2022 15:02:33 +0800 Subject: [PATCH 1/4] feat: physics tests --- packages/core/src/physics/PhysicsManager.ts | 2 +- .../core/tests/physics/PhysicsManager.test.ts | 46 +++++++++++++++++++ .../physics-lite/src/LitePhysicsManager.ts | 31 +++++++------ 3 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 packages/core/tests/physics/PhysicsManager.test.ts diff --git a/packages/core/src/physics/PhysicsManager.ts b/packages/core/src/physics/PhysicsManager.ts index ae23e5ce91..c7cb0660a4 100644 --- a/packages/core/src/physics/PhysicsManager.ts +++ b/packages/core/src/physics/PhysicsManager.ts @@ -18,7 +18,7 @@ export class PhysicsManager { private _engine: Engine; private _restTime: number = 0; - private _gravity: Vector3 = new Vector3(); + private _gravity: Vector3 = new Vector3(0, -9.81, 0); private _nativePhysicsManager: IPhysicsManager; private _physicalObjectsMap: Record = {}; private _onContactEnter = (obj1: number, obj2: number) => { diff --git a/packages/core/tests/physics/PhysicsManager.test.ts b/packages/core/tests/physics/PhysicsManager.test.ts new file mode 100644 index 0000000000..d3ae65ba84 --- /dev/null +++ b/packages/core/tests/physics/PhysicsManager.test.ts @@ -0,0 +1,46 @@ +// @ts-nocheck +import { LitePhysics } from "@oasis-engine/physics-lite"; +import { WebGLEngine } from "@oasis-engine/rhi-webgl"; +import { Ray, Vector3 } from "@oasis-engine/math"; +import { BoxColliderShape, Layer, StaticCollider } from "@oasis-engine/core"; + +const canvasDOM = document.createElement("canvas"); +canvasDOM.width = 1024; +canvasDOM.height = 1024; + +describe("physics manager test", () => { + it("constructor", () => { + const engine = new WebGLEngine(canvasDOM); + engine.physicsManager.initialize(LitePhysics); + + expect(engine.physicsManager.gravity.y).toEqual(-9.81); + expect(engine.physicsManager.maxSumTimeStep).toEqual(1 / 3); + expect(engine.physicsManager.fixedTimeStep).toEqual(1 / 60); + }); + + it("raycast", () => { + const engine = new WebGLEngine(canvasDOM); + engine.physicsManager.initialize(LitePhysics); + + const scene = engine.sceneManager.activeScene; + const rootEntity = scene.createRootEntity("root"); + + const collider = rootEntity.addComponent(StaticCollider); + const box = new BoxColliderShape(); + collider.addShape(box); + let ray = new Ray(new Vector3(3, 3, 3), new Vector3(0, 1, 0)); + expect(engine.physicsManager.raycast(ray)).toEqual(false); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE)).toEqual(false); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE, Layer.Everything)).toEqual(false); + + ray = new Ray(new Vector3(3, 3, 3), new Vector3(-1, -1, -1)); + expect(engine.physicsManager.raycast(ray)).toEqual(true); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE)).toEqual(true); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE, Layer.Everything)).toEqual(true); + + collider.removeShape(box); + expect(engine.physicsManager.raycast(ray)).toEqual(false); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE)).toEqual(false); + expect(engine.physicsManager.raycast(ray, Number.MAX_VALUE, Layer.Everything)).toEqual(false); + }); +}); diff --git a/packages/physics-lite/src/LitePhysicsManager.ts b/packages/physics-lite/src/LitePhysicsManager.ts index 22841374c9..0e286e2580 100644 --- a/packages/physics-lite/src/LitePhysicsManager.ts +++ b/packages/physics-lite/src/LitePhysicsManager.ts @@ -66,15 +66,16 @@ export class LitePhysicsManager implements IPhysicsManager { */ removeColliderShape(colliderShape: LiteColliderShape): void { const { _eventPool: eventPool, _currentEvents: currentEvents } = this; - const { _id: shapeID } = colliderShape; for (let i = currentEvents.length - 1; i >= 0; i--) { const event = currentEvents.get(i); - if (event.index1 == shapeID || event.index2 == shapeID) { + if (event.index1 == colliderShape._id || event.index2 == colliderShape._id) { + event.state = TriggerEventState.Exit; currentEvents.deleteByIndex(i); eventPool.push(event); } } - delete this._eventMap[shapeID]; + + delete this._eventMap[colliderShape._id]; } /** @@ -202,20 +203,20 @@ export class LitePhysicsManager implements IPhysicsManager { const index1 = shape._id; const index2 = myShape._id; const event = index1 < index2 ? this._eventMap[index1][index2] : this._eventMap[index2][index1]; - if (event !== undefined && !event.needUpdate) { + if (event !== undefined && !event.alreadyInvoked) { continue; } if (shape != myShape && this._boxCollision(shape)) { if (event === undefined) { const event = index1 < index2 ? this._getTrigger(index1, index2) : this._getTrigger(index2, index1); event.state = TriggerEventState.Enter; - event.needUpdate = false; + event.alreadyInvoked = false; this._currentEvents.add(event); } else if (event.state === TriggerEventState.Enter) { event.state = TriggerEventState.Stay; - event.needUpdate = false; + event.alreadyInvoked = false; } else if (event.state === TriggerEventState.Stay) { - event.needUpdate = false; + event.alreadyInvoked = false; } } } @@ -229,20 +230,20 @@ export class LitePhysicsManager implements IPhysicsManager { const index1 = shape._id; const index2 = myShape._id; const event = index1 < index2 ? this._eventMap[index1][index2] : this._eventMap[index2][index1]; - if (event !== undefined && !event.needUpdate) { + if (event !== undefined && !event.alreadyInvoked) { continue; } if (shape != myShape && this._sphereCollision(shape)) { if (event === undefined) { const event = index1 < index2 ? this._getTrigger(index1, index2) : this._getTrigger(index2, index1); event.state = TriggerEventState.Enter; - event.needUpdate = false; + event.alreadyInvoked = false; this._currentEvents.add(event); } else if (event.state === TriggerEventState.Enter) { event.state = TriggerEventState.Stay; - event.needUpdate = false; + event.alreadyInvoked = false; } else if (event.state === TriggerEventState.Stay) { - event.needUpdate = false; + event.alreadyInvoked = false; } } } @@ -255,13 +256,13 @@ export class LitePhysicsManager implements IPhysicsManager { const { _eventPool: eventPool, _currentEvents: currentEvents } = this; for (let i = currentEvents.length - 1; i >= 0; i--) { const event = currentEvents.get(i); - if (!event.needUpdate) { + if (!event.alreadyInvoked) { if (event.state == TriggerEventState.Enter) { this._onTriggerEnter(event.index1, event.index2); - event.needUpdate = true; + event.alreadyInvoked = true; } else if (event.state == TriggerEventState.Stay) { this._onTriggerStay(event.index1, event.index2); - event.needUpdate = true; + event.alreadyInvoked = true; } } else { event.state = TriggerEventState.Exit; @@ -318,7 +319,7 @@ class TriggerEvent { state: TriggerEventState; index1: number; index2: number; - needUpdate: boolean = false; + alreadyInvoked: boolean = false; constructor(index1: number, index2: number) { this.index1 = index1; From 56fb6e70e3985d20e0c106cfe90a94dad03dd9c4 Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Tue, 19 Apr 2022 15:04:44 +0800 Subject: [PATCH 2/4] feat: physics tests --- packages/physics-lite/src/LitePhysicsManager.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/physics-lite/src/LitePhysicsManager.ts b/packages/physics-lite/src/LitePhysicsManager.ts index 0e286e2580..1624ae33a3 100644 --- a/packages/physics-lite/src/LitePhysicsManager.ts +++ b/packages/physics-lite/src/LitePhysicsManager.ts @@ -66,16 +66,17 @@ export class LitePhysicsManager implements IPhysicsManager { */ removeColliderShape(colliderShape: LiteColliderShape): void { const { _eventPool: eventPool, _currentEvents: currentEvents } = this; + const { _id: shapeID } = colliderShape; for (let i = currentEvents.length - 1; i >= 0; i--) { const event = currentEvents.get(i); - if (event.index1 == colliderShape._id || event.index2 == colliderShape._id) { + if (event.index1 == shapeID || event.index2 == shapeID) { event.state = TriggerEventState.Exit; currentEvents.deleteByIndex(i); eventPool.push(event); } } - delete this._eventMap[colliderShape._id]; + delete this._eventMap[shapeID]; } /** From 061791e68bd5783300324af8146f36314ff3db2e Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Tue, 19 Apr 2022 15:05:34 +0800 Subject: [PATCH 3/4] feat: physics tests --- packages/physics-lite/src/LitePhysicsManager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/physics-lite/src/LitePhysicsManager.ts b/packages/physics-lite/src/LitePhysicsManager.ts index 1624ae33a3..024e06c735 100644 --- a/packages/physics-lite/src/LitePhysicsManager.ts +++ b/packages/physics-lite/src/LitePhysicsManager.ts @@ -70,7 +70,6 @@ export class LitePhysicsManager implements IPhysicsManager { for (let i = currentEvents.length - 1; i >= 0; i--) { const event = currentEvents.get(i); if (event.index1 == shapeID || event.index2 == shapeID) { - event.state = TriggerEventState.Exit; currentEvents.deleteByIndex(i); eventPool.push(event); } From e2246e151ec09b4941a0d8a6a00f00a4d704328f Mon Sep 17 00:00:00 2001 From: yangfengzzz Date: Tue, 19 Apr 2022 15:06:29 +0800 Subject: [PATCH 4/4] feat: physics tests --- packages/physics-lite/src/LitePhysicsManager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/physics-lite/src/LitePhysicsManager.ts b/packages/physics-lite/src/LitePhysicsManager.ts index 024e06c735..6e749ae381 100644 --- a/packages/physics-lite/src/LitePhysicsManager.ts +++ b/packages/physics-lite/src/LitePhysicsManager.ts @@ -74,7 +74,6 @@ export class LitePhysicsManager implements IPhysicsManager { eventPool.push(event); } } - delete this._eventMap[shapeID]; }