refactor: Transform 可绑定多个更新对象

This commit is contained in:
unanmed 2025-11-19 16:28:58 +08:00
parent 028e21b6c2
commit ea047a4af6
5 changed files with 62 additions and 46 deletions

View File

@ -7,7 +7,7 @@ import { EffectBase } from './base';
export class Image3DEffect export class Image3DEffect
extends EffectBase<void> extends EffectBase<void>
implements ITransformUpdatable implements ITransformUpdatable<Transform3D>
{ {
/** 图片的模型变换 */ /** 图片的模型变换 */
private model: Transform3D = new Transform3D(); private model: Transform3D = new Transform3D();
@ -65,7 +65,7 @@ export class Image3DEffect
* @param model * @param model
*/ */
setModel(model: Transform3D) { setModel(model: Transform3D) {
this.model.bind(); this.model.unbind(this);
this.model = model; this.model = model;
model.bind(this); model.bind(this);
} }
@ -75,7 +75,7 @@ export class Image3DEffect
* @param model * @param model
*/ */
setView(view: Transform3D) { setView(view: Transform3D) {
this.view.bind(); this.view.unbind(this);
this.view = view; this.view = view;
view.bind(this); view.bind(this);
} }
@ -85,7 +85,7 @@ export class Image3DEffect
* @param model * @param model
*/ */
setProj(proj: Transform3D) { setProj(proj: Transform3D) {
this.proj.bind(); this.proj.unbind(this);
this.proj = proj; this.proj = proj;
proj.bind(this); proj.bind(this);
} }

View File

@ -1,8 +1,4 @@
import { import { MotaOffscreenCanvas2D, RenderItem } from '@motajs/render-core';
MotaOffscreenCanvas2D,
RenderItem,
Transform
} from '@motajs/render-core';
import { ILayerState, state } from '@user/data-state'; import { ILayerState, state } from '@user/data-state';
import { IMapRenderer } from './types'; import { IMapRenderer } from './types';
import { MapRenderer } from './renderer'; import { MapRenderer } from './renderer';
@ -51,10 +47,6 @@ export class MapRender extends RenderItem {
this.sizeGL(width, height); this.sizeGL(width, height);
} }
updateTransform(transform: Transform): void {
super.updateTransform(transform);
}
protected render(canvas: MotaOffscreenCanvas2D): void { protected render(canvas: MotaOffscreenCanvas2D): void {
this.renderer.clear(true, true); this.renderer.clear(true, true);
const map = this.renderer.render(); const map = this.renderer.render();

View File

@ -42,7 +42,7 @@ import {
DYNAMIC_RESERVE, DYNAMIC_RESERVE,
MOVING_TOLERANCE MOVING_TOLERANCE
} from '../shared'; } from '../shared';
import { ITransformUpdatable, Transform } from '@motajs/render-core'; import { Transform } from '@motajs/render-core';
import { MapViewport } from './viewport'; import { MapViewport } from './viewport';
import { INSTANCED_COUNT } from './constant'; import { INSTANCED_COUNT } from './constant';
import { StaticBlockStatus } from './status'; import { StaticBlockStatus } from './status';
@ -54,11 +54,7 @@ const enum BackgroundType {
} }
export class MapRenderer export class MapRenderer
implements implements IMapRenderer, IMovingRenderer, IMapDataGetter
IMapRenderer,
IMovingRenderer,
ITransformUpdatable<Transform>,
IMapDataGetter
{ {
//#region 实例属性 //#region 实例属性
@ -296,7 +292,7 @@ export class MapRenderer
//#region 状态控制 //#region 状态控制
setTransform(transform: Transform): void { setTransform(transform: Transform): void {
this.transform.bind(); this.transform.unbind(this);
this.transform = transform; this.transform = transform;
transform.bind(this); transform.bind(this);
this.viewport.bindTransform(transform); this.viewport.bindTransform(transform);

View File

@ -301,7 +301,7 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
/** 该元素的变换矩阵 */ /** 该元素的变换矩阵 */
private _transform: Transform = new Transform(); private _transform: Transform = new Transform();
set transform(value: Transform) { set transform(value: Transform) {
this._transform.bind(); this._transform.unbind(this);
this._transform = value; this._transform = value;
value.bind(this); value.bind(this);
} }
@ -798,7 +798,7 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
this._parent = void 0; this._parent = void 0;
parent.requestSort(); parent.requestSort();
parent.update(); parent.update();
this._transform.bind(); this._transform.unbind(this);
if (!success) return false; if (!success) return false;
this._root?.disconnect(this); this._root?.disconnect(this);
this._root = void 0; this._root = void 0;

View File

@ -1,7 +1,11 @@
import { mat3, mat4, ReadonlyMat3, ReadonlyVec3, vec2, vec3 } from 'gl-matrix'; import { mat3, mat4, ReadonlyMat3, ReadonlyVec3, vec2, vec3 } from 'gl-matrix';
export interface ITransformUpdatable<T> { export interface ITransformUpdatable<T> {
updateTransform?(transform: T): void; /**
*
* @param transform
*/
updateTransform(transform: T): void;
} }
export class Transform { export class Transform {
@ -17,14 +21,26 @@ export class Transform {
private modified: boolean = false; private modified: boolean = false;
/** 绑定的可更新元素 */ /** 绑定的可更新元素 */
bindedObject?: ITransformUpdatable<Transform>; bindedObject: Set<ITransformUpdatable<Transform>> = new Set();
/** /**
* update * update
* @param obj * @param obj
*/ */
bind(obj?: ITransformUpdatable<Transform>) { bind(obj: ITransformUpdatable<Transform>) {
this.bindedObject = obj; this.bindedObject.add(obj);
}
/**
*
* @param obj
*/
unbind(obj: ITransformUpdatable<Transform>) {
this.bindedObject.delete(obj);
}
private emitUpdate() {
this.bindedObject.forEach(v => v.updateTransform(this));
} }
/** /**
@ -38,7 +54,7 @@ export class Transform {
this.scaleY = 1; this.scaleY = 1;
this.rad = 0; this.rad = 0;
this.modified = false; this.modified = false;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
} }
/** /**
@ -49,7 +65,7 @@ export class Transform {
this.scaleX *= x; this.scaleX *= x;
this.scaleY *= y; this.scaleY *= y;
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -61,7 +77,7 @@ export class Transform {
this.x += x; this.x += x;
this.y += y; this.y += y;
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -76,7 +92,7 @@ export class Transform {
this.rad -= n * Math.PI * 2; this.rad -= n * Math.PI * 2;
} }
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -88,7 +104,7 @@ export class Transform {
this.scaleX = x; this.scaleX = x;
this.scaleY = y; this.scaleY = y;
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -100,7 +116,7 @@ export class Transform {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -111,7 +127,7 @@ export class Transform {
mat3.rotate(this.mat, this.mat, rad - this.rad); mat3.rotate(this.mat, this.mat, rad - this.rad);
this.rad = rad; this.rad = rad;
this.modified = true; this.modified = true;
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -138,7 +154,7 @@ export class Transform {
mat3.fromValues(a, b, 0, c, d, 0, e, f, 1) mat3.fromValues(a, b, 0, c, d, 0, e, f, 1)
); );
this.calAttributes(); this.calAttributes();
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -161,7 +177,7 @@ export class Transform {
): this { ): this {
mat3.set(this.mat, a, b, 0, c, d, 0, e, f, 1); mat3.set(this.mat, a, b, 0, c, d, 0, e, f, 1);
this.calAttributes(); this.calAttributes();
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -285,14 +301,26 @@ export class Transform3D {
mat: mat4 = mat4.create(); mat: mat4 = mat4.create();
/** 绑定的可更新元素 */ /** 绑定的可更新元素 */
bindedObject?: ITransformUpdatable<Transform3D>; bindedObject: Set<ITransformUpdatable<Transform3D>> = new Set();
/** /**
* * update
* @param obj * @param obj
*/ */
bind(obj?: ITransformUpdatable<Transform3D>) { bind(obj: ITransformUpdatable<Transform3D>) {
this.bindedObject = obj; this.bindedObject.add(obj);
}
/**
*
* @param obj
*/
unbind(obj: ITransformUpdatable<Transform3D>) {
this.bindedObject.delete(obj);
}
private emitUpdate() {
this.bindedObject.forEach(v => v.updateTransform(this));
} }
/** /**
@ -300,7 +328,7 @@ export class Transform3D {
*/ */
reset(): this { reset(): this {
mat4.identity(this.mat); mat4.identity(this.mat);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -312,7 +340,7 @@ export class Transform3D {
*/ */
scale(x: number, y: number, z: number): this { scale(x: number, y: number, z: number): this {
mat4.scale(this.mat, this.mat, [x, y, z]); mat4.scale(this.mat, this.mat, [x, y, z]);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -324,7 +352,7 @@ export class Transform3D {
*/ */
translate(x: number, y: number, z: number): this { translate(x: number, y: number, z: number): this {
mat4.translate(this.mat, this.mat, [x, y, z]); mat4.translate(this.mat, this.mat, [x, y, z]);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -335,7 +363,7 @@ export class Transform3D {
*/ */
rotate(rad: number, axis: vec3): this { rotate(rad: number, axis: vec3): this {
mat4.rotate(this.mat, this.mat, rad, axis); mat4.rotate(this.mat, this.mat, rad, axis);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -371,7 +399,7 @@ export class Transform3D {
*/ */
lookAt(eye: vec3, center: vec3, up: vec3): this { lookAt(eye: vec3, center: vec3, up: vec3): this {
mat4.lookAt(this.mat, eye, center, up); mat4.lookAt(this.mat, eye, center, up);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -384,7 +412,7 @@ export class Transform3D {
*/ */
perspective(fovy: number, aspect: number, near: number, far: number): this { perspective(fovy: number, aspect: number, near: number, far: number): this {
mat4.perspective(this.mat, fovy, aspect, near, far); mat4.perspective(this.mat, fovy, aspect, near, far);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }
@ -406,7 +434,7 @@ export class Transform3D {
far: number far: number
): this { ): this {
mat4.ortho(this.mat, left, right, bottom, top, near, far); mat4.ortho(this.mat, left, right, bottom, top, near, far);
this.bindedObject?.updateTransform?.(this); this.emitUpdate();
return this; return this;
} }