mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-11-27 22:03:00 +08:00
refactor: Transform 可绑定多个更新对象
This commit is contained in:
parent
028e21b6c2
commit
ea047a4af6
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user