63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { EventEmitter, GameRunner, Renderer } from '@freeblox/engine';
|
|
import { EditorViewport } from './viewport';
|
|
import { EditorEvents } from '../types/events';
|
|
import { EditorWorkspace } from './workspace';
|
|
import { EditorMouse } from './mouse';
|
|
import { EditorEnvironment } from './environment';
|
|
|
|
export class Editor extends GameRunner {
|
|
public lastTick = performance.now();
|
|
public events = new EventEmitter<EditorEvents>();
|
|
public render!: Renderer;
|
|
public element!: HTMLElement;
|
|
public viewport!: EditorViewport;
|
|
public workspace!: EditorWorkspace;
|
|
public mouse!: EditorMouse;
|
|
public environment!: EditorEnvironment;
|
|
public running = false;
|
|
|
|
override mount(element: HTMLElement) {
|
|
this.element = element;
|
|
this.render = new Renderer(element);
|
|
|
|
this.viewport = new EditorViewport(this.render, this.events);
|
|
this.viewport.initialize();
|
|
|
|
this.workspace = new EditorWorkspace(this.render, this.events);
|
|
this.workspace.initialize();
|
|
|
|
this.mouse = new EditorMouse(this.render, this.events);
|
|
this.mouse.initialize();
|
|
|
|
this.environment = new EditorEnvironment(this.render, this.events);
|
|
this.environment.initialize();
|
|
|
|
this.start();
|
|
}
|
|
|
|
override loop(now: DOMHighResTimeStamp) {
|
|
const delta = now - this.lastTick;
|
|
this.lastTick = now;
|
|
|
|
this.running && requestAnimationFrame((ts) => this.loop(ts));
|
|
|
|
this.viewport.update(delta);
|
|
this.workspace.update(delta);
|
|
this.mouse.update(delta);
|
|
|
|
this.render.render();
|
|
}
|
|
|
|
override start() {
|
|
this.running = true;
|
|
this.loop(this.lastTick);
|
|
}
|
|
|
|
override stop() {
|
|
this.running = false;
|
|
this.viewport.cleanUp();
|
|
this.workspace.cleanUp();
|
|
this.mouse.cleanUp();
|
|
}
|
|
}
|