From 0d004aa98639e00afa64aede6d5b46ea18e033ba Mon Sep 17 00:00:00 2001 From: cptbtptpbcptdtptp Date: Wed, 11 Dec 2024 11:07:26 +0800 Subject: [PATCH] feat: update code --- packages/core/src/Camera.ts | 2 +- packages/core/src/Entity.ts | 8 +++----- packages/core/src/Renderer.ts | 18 ++++++++++++++++-- packages/core/src/Transform.ts | 1 + packages/core/src/mesh/SkinnedMeshRenderer.ts | 1 + 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/core/src/Camera.ts b/packages/core/src/Camera.ts index 5d60234bae..ea86aaf362 100644 --- a/packages/core/src/Camera.ts +++ b/packages/core/src/Camera.ts @@ -783,7 +783,7 @@ export class Camera extends Component { private _updateShaderData(): void { const shaderData = this.shaderData; - const transform = this.entity.transform; + const transform = this._entity.transform; shaderData.setMatrix(Camera._inverseViewMatrixProperty, transform.worldMatrix); shaderData.setVector3(Camera._cameraPositionProperty, transform.worldPosition); shaderData.setVector3(Camera._cameraForwardProperty, transform.worldForward); diff --git a/packages/core/src/Entity.ts b/packages/core/src/Entity.ts index 4fdeab8887..b04aab2713 100644 --- a/packages/core/src/Entity.ts +++ b/packages/core/src/Entity.ts @@ -1,5 +1,4 @@ import { Matrix } from "@galacean/engine-math"; -import { ignoreClone } from "."; import { BoolUpdateFlag } from "./BoolUpdateFlag"; import { Component } from "./Component"; import { ComponentsDependencies } from "./ComponentsDependencies"; @@ -97,7 +96,6 @@ export class Entity extends EngineObject { /** @internal */ _isTemplate: boolean = false; /** @internal */ - @ignoreClone _updateFlagManager: UpdateFlagManager = new UpdateFlagManager(); private _transform: Transform; @@ -224,7 +222,7 @@ export class Entity extends EngineObject { this.name = name; for (let i = 0, n = components.length; i < n; i++) { const type = components[i]; - if (!Transform.prototype.isPrototypeOf(type.prototype) || !this.transform) { + if (!(type.prototype instanceof Transform) || !this.transform) { this.addComponent(type); } } @@ -242,7 +240,7 @@ export class Entity extends EngineObject { type: T, ...args: ComponentArguments ): InstanceType { - Transform.prototype.isPrototypeOf(type.prototype) && this.transform?.destroy(); + type.prototype instanceof Transform && this.transform?.destroy(); ComponentsDependencies._addCheck(this, type); const component = new type(this, ...args) as InstanceType; this._components.push(component); @@ -466,7 +464,7 @@ export class Entity extends EngineObject { } /** - * Register world transform change flag. + * Listen for changes in the world pose of this `Entity`. * @returns Change flag */ registerWorldChangeFlag(): BoolUpdateFlag { diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index 93e77e436b..1a8a38e28a 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -68,6 +68,8 @@ export class Renderer extends Component implements IComponentCustomClone { protected _dirtyUpdateFlag: number = 0; @ignoreClone protected _rendererLayer: Vector4 = new Vector4(); + @ignoreClone + protected _transformEntity: Entity; @deepClone private _shaderData: ShaderData = new ShaderData(ShaderDataGroup.Renderer); @@ -170,7 +172,7 @@ export class Renderer extends Component implements IComponentCustomClone { this._addResourceReferCount(this.shaderData, 1); this._onTransformChanged = this._onTransformChanged.bind(this); - entity._updateFlagManager.addListener(this._onTransformChanged); + this._setTransformEntity(entity); shaderData.enableMacro(Renderer._receiveShadowMacro); shaderData.setVector4(Renderer._rendererLayerProperty, this._rendererLayer); @@ -364,7 +366,7 @@ export class Renderer extends Component implements IComponentCustomClone { protected override _onDestroy(): void { super._onDestroy(); - this._entity._updateFlagManager.removeListener(this._onTransformChanged); + this._setTransformEntity(null); this._addResourceReferCount(this.shaderData, -1); const materials = this._materials; @@ -460,6 +462,18 @@ export class Renderer extends Component implements IComponentCustomClone { } } + /** + * @internal + */ + protected _setTransformEntity(entity: Entity): void { + const preEntity = this._transformEntity; + if (entity !== preEntity) { + preEntity?._updateFlagManager.removeListener(this._onTransformChanged); + entity?._updateFlagManager.addListener(this._onTransformChanged); + this._transformEntity = entity; + } + } + /** * @internal */ diff --git a/packages/core/src/Transform.ts b/packages/core/src/Transform.ts index fd4b4c7442..e5c47d5c7f 100644 --- a/packages/core/src/Transform.ts +++ b/packages/core/src/Transform.ts @@ -887,6 +887,7 @@ export class Transform extends Component { //--------------------------------------------------------------deprecated---------------------------------------------------------------- /** + * Listen for changes in the world position of this `Transform`. * @deprecated */ registerWorldChangeFlag(): BoolUpdateFlag { diff --git a/packages/core/src/mesh/SkinnedMeshRenderer.ts b/packages/core/src/mesh/SkinnedMeshRenderer.ts index cadc2d49a0..14b123b929 100644 --- a/packages/core/src/mesh/SkinnedMeshRenderer.ts +++ b/packages/core/src/mesh/SkinnedMeshRenderer.ts @@ -266,6 +266,7 @@ export class SkinnedMeshRenderer extends MeshRenderer { } break; case SkinUpdateFlag.RootBoneChanged: + this._setTransformEntity(value); this._dirtyUpdateFlag |= RendererUpdateFlags.WorldVolume; break; }