Archived
Private
Public Access
1
0
This repository has been archived on 2026-02-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ProjectBackup/C#/TSEngine/Core/World/simObject.ts
2022-09-04 12:45:01 +02:00

107 lines
3.3 KiB
TypeScript

namespace TSE {
export class SimObject {
public name: string;
public transform: Transform = new Transform();
private _id: number;
private _children: SimObject[] = [];
private _parent: SimObject;
private _scene: Scene;
private _isLoaded: boolean = false;
private _components: BaseComponent[] = [];
private _behaviors: BaseBehavior[] = [];
private _localMatrix: Matrix4x4 = Matrix4x4.identity();
private _worldMatrix: Matrix4x4 = Matrix4x4.identity();
public constructor(id: number, name: string, scene?: Scene) {
this._id = id;
this.name = name;
this._scene = scene;
}
public get id(): number { return this._id; }
public get parent(): SimObject { return this._parent; }
public get worldMatrix(): Matrix4x4 { return this._worldMatrix; }
public get isLoaded(): boolean { return this._isLoaded; }
public addChild(child: SimObject): void {
child._parent = this;
this._children.push(child);
child.load();
child.onAdded(this._scene);
}
public removeChild(child: SimObject): void {
const index = this._children.indexOf(child);
if (index == -1) return;
child._parent = undefined;
this._children.splice(index, 1);
}
public getObjectByName(name: string): SimObject {
if (this.name === name) return this;
for (let child of this._children) {
let result = child.getObjectByName(name);
if (result !== undefined) return result;
}
return undefined;
}
public addComponent(component: BaseComponent): void {
this._components.push(component);
component.owner = this;
}
public addBehavior(behavior: BaseBehavior): void {
this._behaviors.push(behavior);
behavior.owner = this;
}
public load(): void {
this._isLoaded = true;
for (let c of this._components)
c.load();
for (let child of this._children)
child.load();
}
public update(time: number): void {
this._localMatrix = this.transform.transformationMatrix;
this.updateWorldMatrix(this._parent?._worldMatrix);
for (let c of this._components)
c.update(time);
for (let c of this._behaviors)
c.update(time);
for (let child of this._children)
child.update(time);
}
public render(shader: Shader): void {
for (let c of this._components)
c.render(shader);
for (let child of this._children)
child.render(shader);
}
protected onAdded(scene: Scene): void {
this._scene = scene;
}
private updateWorldMatrix(parentWorldMatrix: Matrix4x4): void {
if (parentWorldMatrix !== undefined)
this._worldMatrix = Matrix4x4.multiply(parentWorldMatrix, this._localMatrix);
else
this._worldMatrix.copyFrom(this._localMatrix);
}
}
}