From 94c19976ef277bce22d57767e31406a910390905 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 14:53:25 +0800 Subject: [PATCH 1/6] feat: refactor transform API --- packages/core/src/Transform.ts | 51 +++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/packages/core/src/Transform.ts b/packages/core/src/Transform.ts index 2426853c8d..5844db33fa 100644 --- a/packages/core/src/Transform.ts +++ b/packages/core/src/Transform.ts @@ -1,6 +1,6 @@ import { MathUtil, Matrix, Matrix3x3, Quaternion, Vector3 } from "@oasis-engine/math"; import { BoolUpdateFlag } from "./BoolUpdateFlag"; -import { assignmentClone, deepClone, ignoreClone } from "./clone/CloneManager"; +import { deepClone, ignoreClone } from "./clone/CloneManager"; import { Component } from "./Component"; import { Entity } from "./Entity"; import { UpdateFlagManager } from "./UpdateFlagManager"; @@ -39,6 +39,13 @@ export class Transform extends Component { private _localMatrix: Matrix = new Matrix(); @deepClone private _worldMatrix: Matrix = new Matrix(); + @ignoreClone + private _worldForward: Vector3; + @ignoreClone + private _worldRight: Vector3; + @ignoreClone + private _up: Vector3; + @ignoreClone private _isParentDirty: boolean = true; @ignoreClone @@ -403,36 +410,42 @@ export class Transform extends Component { } /** - * Get the forward direction in world space. - * @param forward - Forward vector - * @returns Forward vector + * The forward direction in world space. */ - getWorldForward(forward: Vector3): Vector3 { + get worldForward(): Vector3 { + let worldForward = this._worldForward; + if (!worldForward) { + this._worldForward = worldForward = new Vector3(); + } const e = this.worldMatrix.elements; - forward.set(-e[8], -e[9], -e[10]); - return forward.normalize(); + worldForward.set(-e[8], -e[9], -e[10]); + return worldForward.normalize(); } /** - * Get the right direction in world space. - * @param right - Right vector - * @returns Right vector + * The right direction in world space. */ - getWorldRight(right: Vector3): Vector3 { + get worldRight(): Vector3 { + let worldRight = this._worldRight; + if (!worldRight) { + this._worldForward = worldRight = new Vector3(); + } const e = this.worldMatrix.elements; - right.set(e[0], e[1], e[2]); - return right.normalize(); + worldRight.set(e[0], e[1], e[2]); + return worldRight.normalize(); } /** - * Get the up direction in world space. - * @param up - Up vector - * @returns Up vector + * The up direction in world space. */ - getWorldUp(up: Vector3): Vector3 { + get worldUp(): Vector3 { + let worldUp = this._up; + if (!worldUp) { + this._worldForward = worldUp = new Vector3(); + } const e = this.worldMatrix.elements; - up.set(e[4], e[5], e[6]); - return up.normalize(); + worldUp.set(e[4], e[5], e[6]); + return worldUp.normalize(); } /** From a4116d9ba4af5a4bd07f6ec5d868fd40d6d6e847 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 15:56:10 +0800 Subject: [PATCH 2/6] refactor: opt code --- packages/core/src/Camera.ts | 4 ++-- packages/core/src/lighting/DirectLight.ts | 5 +---- packages/core/src/lighting/SpotLight.ts | 4 +--- packages/core/src/shadow/CascadedShadowCasterPass.ts | 7 ++++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/core/src/Camera.ts b/packages/core/src/Camera.ts index cb26b35e42..b82ae00e4a 100644 --- a/packages/core/src/Camera.ts +++ b/packages/core/src/Camera.ts @@ -436,9 +436,9 @@ export class Camera extends Component { const transform = this.entity.transform; Matrix.multiply(this.projectionMatrix, this.viewMatrix, virtualCamera.viewProjectionMatrix); - virtualCamera.forward.copyFrom(transform.worldPosition); + virtualCamera.position.copyFrom(transform.worldPosition); if (virtualCamera.isOrthographic) { - transform.getWorldForward(virtualCamera.forward); + virtualCamera.forward.copyFrom(transform.worldForward); } context.camera = this; diff --git a/packages/core/src/lighting/DirectLight.ts b/packages/core/src/lighting/DirectLight.ts index 5623f08a2f..4ad99bdb04 100644 --- a/packages/core/src/lighting/DirectLight.ts +++ b/packages/core/src/lighting/DirectLight.ts @@ -25,16 +25,13 @@ export class DirectLight extends Light { shaderData.setFloatArray(DirectLight._directionProperty, data.direction); } - private _forward: Vector3 = new Vector3(); - private _reverseDirection: Vector3 = new Vector3(); /** * Get direction. */ get direction(): Vector3 { - this.entity.transform.getWorldForward(this._forward); - return this._forward; + return this.entity.transform.worldForward; } /** diff --git a/packages/core/src/lighting/SpotLight.ts b/packages/core/src/lighting/SpotLight.ts index f35c1d6eec..0aee9ea1e8 100644 --- a/packages/core/src/lighting/SpotLight.ts +++ b/packages/core/src/lighting/SpotLight.ts @@ -44,7 +44,6 @@ export class SpotLight extends Light { /** Angle, in radians, from falloff begins to ends. */ penumbra: number = Math.PI / 12; - private _forward: Vector3 = new Vector3(); private _inverseDirection: Vector3 = new Vector3(); private _projectMatrix: Matrix = new Matrix(); @@ -59,8 +58,7 @@ export class SpotLight extends Light { * Get light direction. */ get direction(): Vector3 { - this.entity.transform.getWorldForward(this._forward); - return this._forward; + return this.entity.transform.worldForward; } /** diff --git a/packages/core/src/shadow/CascadedShadowCasterPass.ts b/packages/core/src/shadow/CascadedShadowCasterPass.ts index 218e2f8ebb..9a4845b78d 100644 --- a/packages/core/src/shadow/CascadedShadowCasterPass.ts +++ b/packages/core/src/shadow/CascadedShadowCasterPass.ts @@ -135,7 +135,8 @@ export class CascadedShadowCasterPass { lightSide.set(lightWorldE[0], lightWorldE[1], lightWorldE[2]); lightUp.set(lightWorldE[4], lightWorldE[5], lightWorldE[6]); lightForward.set(-lightWorldE[8], -lightWorldE[9], -lightWorldE[10]); - camera.entity.transform.getWorldForward(CascadedShadowCasterPass._tempVector); + const cameraForward = CascadedShadowCasterPass._tempVector; + cameraForward.copyFrom(camera.entity.transform.worldForward); const shadowTileResolution = this._shadowTileResolution; @@ -144,7 +145,7 @@ export class CascadedShadowCasterPass { splitDistance[j], splitDistance[j + 1], camera, - CascadedShadowCasterPass._tempVector.normalize(), + cameraForward, shadowSliceData ); ShadowUtils.getDirectionLightShadowCullPlanes( @@ -202,7 +203,7 @@ export class CascadedShadowCasterPass { const { x, y } = viewports[j]; rhi.setGlobalDepthBias(1.0, 1.0); - + rhi.viewport(x, y, shadowTileResolution, shadowTileResolution); // for no cascade is for the edge,for cascade is for the beyond maxCascade pixel can use (0,0,0) trick sample the shadowMap rhi.scissor(x + 1, y + 1, shadowTileResolution - 2, shadowTileResolution - 2); From b51e87ecd76fce282268a5bbc9f3c29be2421492 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 16:06:38 +0800 Subject: [PATCH 3/6] refactor: opt code --- tests/src/core/Transform.test.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tests/src/core/Transform.test.ts diff --git a/tests/src/core/Transform.test.ts b/tests/src/core/Transform.test.ts new file mode 100644 index 0000000000..60f3c97b0d --- /dev/null +++ b/tests/src/core/Transform.test.ts @@ -0,0 +1,26 @@ +import { MathUtil, Matrix, Ray, Vector2, Vector3, Vector4 } from "@oasis-engine/math"; +import { WebGLEngine } from "@oasis-engine/rhi-webgl"; +import { Camera, Entity } from "@oasis-engine/core"; +import { expect } from "chai"; + +const canvasDOM = document.createElement("canvas"); +canvasDOM.width = 1024; +canvasDOM.height = 1024; + +describe("Transform test", function () { + let entity: Entity; + before(() => { + const engine = new WebGLEngine(canvasDOM); + entity = engine.sceneManager.activeScene.createRootEntity(); + }); + + it("World direction", () => { + const transform = entity.transform; + transform.position.set(1, -2, 3); + transform.rotate(0, 45, 0); + + expect(transform.worldForward).to.deep.equal(new Vector3(-0.7071067811865476, -0, -0.7071067811865476)); + expect(transform.worldRight).to.deep.equal(new Vector3(0.7071067811865476, 0, -0.7071067811865476)); + expect(transform.worldUp).to.deep.equal(new Vector3(0, 1, 0)); + }); +}); From 83e87ce1c6d2f2209e21b42a0c0e7e6c22596c59 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 16:12:48 +0800 Subject: [PATCH 4/6] refactor: opt code --- packages/core/src/Transform.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Transform.ts b/packages/core/src/Transform.ts index 5844db33fa..1be4c309f4 100644 --- a/packages/core/src/Transform.ts +++ b/packages/core/src/Transform.ts @@ -44,7 +44,7 @@ export class Transform extends Component { @ignoreClone private _worldRight: Vector3; @ignoreClone - private _up: Vector3; + private _worldUp: Vector3; @ignoreClone private _isParentDirty: boolean = true; @@ -439,7 +439,7 @@ export class Transform extends Component { * The up direction in world space. */ get worldUp(): Vector3 { - let worldUp = this._up; + let worldUp = this._worldUp; if (!worldUp) { this._worldForward = worldUp = new Vector3(); } From 21f4190092cc0c391613b833384f60769767e2e2 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 16:29:18 +0800 Subject: [PATCH 5/6] refactor: opt code --- packages/core/src/Transform.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/core/src/Transform.ts b/packages/core/src/Transform.ts index 1be4c309f4..ef2b820795 100644 --- a/packages/core/src/Transform.ts +++ b/packages/core/src/Transform.ts @@ -413,10 +413,7 @@ export class Transform extends Component { * The forward direction in world space. */ get worldForward(): Vector3 { - let worldForward = this._worldForward; - if (!worldForward) { - this._worldForward = worldForward = new Vector3(); - } + const worldForward = (this._worldForward ||= new Vector3()); const e = this.worldMatrix.elements; worldForward.set(-e[8], -e[9], -e[10]); return worldForward.normalize(); @@ -426,10 +423,7 @@ export class Transform extends Component { * The right direction in world space. */ get worldRight(): Vector3 { - let worldRight = this._worldRight; - if (!worldRight) { - this._worldForward = worldRight = new Vector3(); - } + const worldRight = (this._worldRight ||= new Vector3()); const e = this.worldMatrix.elements; worldRight.set(e[0], e[1], e[2]); return worldRight.normalize(); @@ -439,10 +433,7 @@ export class Transform extends Component { * The up direction in world space. */ get worldUp(): Vector3 { - let worldUp = this._worldUp; - if (!worldUp) { - this._worldForward = worldUp = new Vector3(); - } + const worldUp = (this._worldUp ||= new Vector3()); const e = this.worldMatrix.elements; worldUp.set(e[4], e[5], e[6]); return worldUp.normalize(); From 7724d8cd2900930bd9929020e70c06fd59e92f88 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 22 Feb 2023 16:38:05 +0800 Subject: [PATCH 6/6] refactor: opt code --- packages/core/src/Transform.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/Transform.ts b/packages/core/src/Transform.ts index ef2b820795..867f3e8204 100644 --- a/packages/core/src/Transform.ts +++ b/packages/core/src/Transform.ts @@ -40,11 +40,11 @@ export class Transform extends Component { @deepClone private _worldMatrix: Matrix = new Matrix(); @ignoreClone - private _worldForward: Vector3; + private _worldForward: Vector3 = null; @ignoreClone - private _worldRight: Vector3; + private _worldRight: Vector3 = null; @ignoreClone - private _worldUp: Vector3; + private _worldUp: Vector3 = null; @ignoreClone private _isParentDirty: boolean = true;