Make render camera changed handling robust.

Do not expect that the next frame is a successive integer.
Unit test render camera changed handling.
This commit is contained in:
Oscar Lorentzon 2016-04-04 09:34:57 +02:00
parent 22b7f1841b
commit 11db76868b
2 changed files with 75 additions and 4 deletions

View File

@ -0,0 +1,54 @@
/// <reference path="../../typings/browser.d.ts" />
import * as THREE from "three";
import {Camera} from "../../src/Geo";
import {RenderCamera, RenderMode} from "../../src/Render";
describe("RenderCamera.ctor", () => {
it("should be defined", () => {
let renderCamera: RenderCamera = new RenderCamera(1, RenderMode.Letterbox);
expect(renderCamera).toBeDefined();
});
});
describe("RenderCamera.updateProjection", () => {
it("should not be changed when not updated", () => {
let renderCamera: RenderCamera = new RenderCamera(1, RenderMode.Letterbox);
renderCamera.frameId = 0;
expect(renderCamera.changed).toBe(false);
});
it("should be changed when projection has been updated", () => {
let renderCamera: RenderCamera = new RenderCamera(1, RenderMode.Letterbox);
renderCamera.updateProjection();
renderCamera.frameId = 0;
expect(renderCamera.changed).toBe(true);
});
it("should not be changed when multiple frame ids are set after projection has been updated", () => {
let renderCamera: RenderCamera = new RenderCamera(1, RenderMode.Letterbox);
renderCamera.updateProjection();
renderCamera.frameId = 0;
renderCamera.frameId = 1;
expect(renderCamera.changed).toBe(false);
});
});
describe("RenderCamera.updatePrespective", () => {
it("should be changed when not updated", () => {
let renderCamera: RenderCamera = new RenderCamera(1, RenderMode.Letterbox);
renderCamera.updatePerspective(new Camera());
renderCamera.frameId = 0;
expect(renderCamera.changed).toBe(true);
});
});

View File

@ -6,7 +6,6 @@ import {Camera} from "../Geo";
import {RenderMode} from "../Render";
export class RenderCamera {
public frameId: number;
public alpha: number;
public currentAspect: number;
public currentOrientation: number;
@ -19,12 +18,17 @@ export class RenderCamera {
private _camera: Camera;
private _perspective: THREE.PerspectiveCamera;
private _frameId: number;
private _changed: boolean;
private _changedForFrame: number;
constructor(perspectiveCameraAspect: number, renderMode: RenderMode) {
this.frameId = -1;
this.alpha = -1;
this._frameId = -1;
this._changed = false;
this._changedForFrame = -1;
this.currentAspect = 1;
@ -56,6 +60,19 @@ export class RenderCamera {
return this.frameId === this._changedForFrame;
}
public get frameId(): number {
return this._frameId;
}
public set frameId(value: number) {
this._frameId = value;
if (this._changed) {
this._changed = false;
this._changedForFrame = value;
}
}
public updateProjection(): void {
let currentAspect: number = this._getAspect(
this.currentAspect,
@ -76,7 +93,7 @@ export class RenderCamera {
this._perspective.fov = verticalFov;
this._perspective.updateProjectionMatrix();
this._changedForFrame = this.frameId + 1;
this._changed = true;
}
public updatePerspective(camera: Camera): void {
@ -84,7 +101,7 @@ export class RenderCamera {
this._perspective.position.copy(camera.position);
this._perspective.lookAt(camera.lookat);
this._changedForFrame = this.frameId + 1;
this._changed = true;
}
private _getVerticalFov(aspect: number, focal: number): number {