From 11db76868b96b78cdde575bda2a2626ced492b92 Mon Sep 17 00:00:00 2001 From: Oscar Lorentzon Date: Mon, 4 Apr 2016 09:34:57 +0200 Subject: [PATCH] Make render camera changed handling robust. Do not expect that the next frame is a successive integer. Unit test render camera changed handling. --- spec/render/RenderCamera.spec.ts | 54 ++++++++++++++++++++++++++++++++ src/render/RenderCamera.ts | 25 ++++++++++++--- 2 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 spec/render/RenderCamera.spec.ts diff --git a/spec/render/RenderCamera.spec.ts b/spec/render/RenderCamera.spec.ts new file mode 100644 index 00000000..2d440a9b --- /dev/null +++ b/spec/render/RenderCamera.spec.ts @@ -0,0 +1,54 @@ +/// + +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); + }); +}); diff --git a/src/render/RenderCamera.ts b/src/render/RenderCamera.ts index 7ffd87f8..b01c3efa 100644 --- a/src/render/RenderCamera.ts +++ b/src/render/RenderCamera.ts @@ -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 {