68 lines
1.7 KiB
TypeScript
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();
|
|
}
|
|
}
|