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

68 lines
1.7 KiB
TypeScript

import {
EnvironmentComponent,
MouseComponent,
ViewportComponent,
EventEmitter,
GameRunner,
Renderer,
} from '@freeblox/engine';
import { EditorEvents } from '../types/events';
import { WorkspaceComponent } from './workspace';
export class Editor extends GameRunner {
public lastTick = performance.now();
public events = new EventEmitter<EditorEvents>();
public render!: Renderer;
public element!: HTMLElement;
public viewport!: ViewportComponent;
public workspace!: WorkspaceComponent;
public mouse!: MouseComponent;
public environment!: EnvironmentComponent;
public running = false;
override mount(element: HTMLElement) {
this.element = element;
this.render = new Renderer(element);
this.viewport = new ViewportComponent(this.render, this.events);
this.viewport.initialize();
this.workspace = new WorkspaceComponent(this.render, this.events);
this.workspace.initialize();
this.mouse = new MouseComponent(this.render, this.events);
this.mouse.initialize();
this.environment = new EnvironmentComponent(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();
this.render.cleanUp();
}
}