freeblox/packages/editor/src/editor/core/editor.ts

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();
}
}