decla-red/frontend/src/scripts/objects/camera.ts
2020-10-17 18:35:09 +02:00

42 lines
1.2 KiB
TypeScript

import { vec2 } from 'gl-matrix';
import { Renderer } from 'sdf-2d';
import { calculateViewArea, GameObject, mixRgb, settings, UpdateMessage } from 'shared';
import { Game } from '../game';
import { ViewObject } from './view-object';
export class Camera extends GameObject implements ViewObject {
public center: vec2 = vec2.create();
private aspectRatio?: number;
constructor(private game: Game) {
super(null);
}
public update(updates: Array<UpdateMessage>) {
throw new Error();
}
public step(deltaTimeInMilliseconds: number): void {}
public draw(renderer: Renderer) {
const canvasAspectRatio = renderer.canvasSize.x / renderer.canvasSize.y;
if (canvasAspectRatio !== this.aspectRatio) {
this.aspectRatio = canvasAspectRatio;
this.game.aspectRatioChanged(canvasAspectRatio);
}
const viewArea = calculateViewArea(this.center, canvasAspectRatio);
renderer.setViewArea(viewArea.topLeft, viewArea.size);
renderer.setRuntimeSettings({
ambientLight: mixRgb(
settings.backgroundGradient[0],
settings.backgroundGradient[1],
(this.center.x - settings.worldLeftEdge) /
(Math.abs(settings.worldLeftEdge) + Math.abs(settings.worldRightEdge)),
),
});
}
}