mapillary-js
Version:
WebGL JavaScript library for displaying street level imagery from mapillary.com
267 lines (209 loc) • 9.35 kB
text/typescript
import * as THREE from "three";
import {NodeHelper} from "../helper/NodeHelper.spec";
import {IFillNode} from "../../src/API";
import {Camera} from "../../src/Geo";
import {Node} from "../../src/Graph";
import {IState, TransitionMode, TraversingState} from "../../src/State";
describe("TraversingState.ctor", () => {
it("should be defined", () => {
let state: IState = {
alpha: 1,
camera: new Camera(),
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TraversingState = new TraversingState(state);
expect(traversingState).toBeDefined();
});
});
class TestTraversingState extends TraversingState {
public get currentCamera(): Camera {
return this._currentCamera;
}
public get previousCamera(): Camera {
return this._previousCamera;
}
}
class TestNode extends Node {
constructor() {
super({
cl: { lat: 0, lon: 0 },
key: "key",
l: { lat: 0, lon: 0 },
sequence_key: "skey",
});
}
public get assetsCached(): boolean {
return true;
}
public get image(): HTMLImageElement {
return null;
}
}
describe("TraversingState.currentCamera.lookat", () => {
let precision: number = 1e-8;
let helper: NodeHelper;
beforeEach(() => {
helper = new NodeHelper();
});
it("should correspond to set node", () => {
let camera: Camera = new Camera();
camera.position.fromArray([10, 10, 0]);
camera.lookat.fromArray([15, 15, 0]);
let state: IState = {
alpha: 1,
camera: camera,
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TestTraversingState = new TestTraversingState(state);
let node: TestNode = new TestNode();
let fillNode: IFillNode = helper.createFillNode();
node.makeFull(fillNode);
traversingState.set([node]);
expect(traversingState.currentCamera.position.x).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.y).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.z).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.x).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.y).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.z).toBeGreaterThan(0);
});
it("should correspond to set nodes", () => {
let camera: Camera = new Camera();
camera.position.fromArray([10, 10, 0]);
camera.lookat.fromArray([15, 15, 0]);
let state: IState = {
alpha: 1,
camera: camera,
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TestTraversingState = new TestTraversingState(state);
let previousNode: TestNode = new TestNode();
let previousFillNode: IFillNode = helper.createFillNode();
previousFillNode.c_rotation = [Math.PI, 0, 0];
previousNode.makeFull(previousFillNode);
let currentNode: TestNode = new TestNode();
let currentFillNode: IFillNode = helper.createFillNode();
currentNode.makeFull(currentFillNode);
traversingState.set([previousNode]);
traversingState.set([currentNode]);
expect(traversingState.currentCamera.position.x).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.y).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.z).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.x).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.y).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.lookat.z).toBeGreaterThan(0);
});
it("should correspond to lookat of camera when full pano", () => {
let camera: Camera = new Camera();
camera.position.fromArray([10, 10, 0]);
camera.lookat.fromArray([15, 15, 0]);
let state: IState = {
alpha: 1,
camera: camera,
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TestTraversingState = new TestTraversingState(state);
let previousNode: TestNode = new TestNode();
let preivousFillNode: IFillNode = helper.createFillNode();
preivousFillNode.c_rotation = [Math.PI, 0, 0];
previousNode.makeFull(preivousFillNode);
let currentNode: TestNode = new TestNode();
let currentFillNode: IFillNode = helper.createFillNode();
currentFillNode.gpano = {
CroppedAreaImageHeightPixels: 1,
CroppedAreaImageWidthPixels: 1,
CroppedAreaLeftPixels: 0,
CroppedAreaTopPixels: 0,
FullPanoHeightPixels: 1,
FullPanoWidthPixels: 1,
};
currentNode.makeFull(currentFillNode);
traversingState.set([previousNode]);
traversingState.set([currentNode]);
expect(traversingState.currentCamera.position.x).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.y).toBeCloseTo(0, precision);
expect(traversingState.currentCamera.position.z).toBeCloseTo(0, precision);
let lookat: THREE.Vector3 = camera.lookat.clone().sub(camera.position);
expect(traversingState.currentCamera.lookat.x).toBeCloseTo(lookat.x, precision);
expect(traversingState.currentCamera.lookat.y).toBeCloseTo(lookat.y, precision);
expect(traversingState.currentCamera.lookat.z).toBeCloseTo(lookat.z, precision);
});
});
describe("TraversingState.previousCamera.lookat", () => {
let precision: number = 1e-8;
let helper: NodeHelper;
beforeEach(() => {
helper = new NodeHelper();
});
it("should correspond to current node camera when previous node not set", () => {
let camera: Camera = new Camera();
camera.position.fromArray([10, 10, 0]);
camera.lookat.fromArray([15, 15, 0]);
let state: IState = {
alpha: 1,
camera: camera,
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TestTraversingState = new TestTraversingState(state);
let node: TestNode = new TestNode();
let fillNode: IFillNode = helper.createFillNode();
node.makeFull(fillNode);
traversingState.set([node]);
expect(traversingState.previousCamera.position.x).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.position.y).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.position.z).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.lookat.x).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.lookat.y).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.lookat.z).toBeGreaterThan(0);
});
it("should correspond to camera when previous node set", () => {
let camera: Camera = new Camera();
camera.position.fromArray([10, 10, 0]);
camera.lookat.fromArray([15, 15, 0]);
let state: IState = {
alpha: 1,
camera: camera,
currentIndex: -1,
reference: { alt: 0, lat: 0, lon: 0 },
trajectory: [],
transitionMode: TransitionMode.Default,
zoom: 0,
};
let traversingState: TestTraversingState = new TestTraversingState(state);
let previousNode: TestNode = new TestNode();
let previousFillNode: IFillNode = helper.createFillNode();
previousFillNode.c_rotation = [Math.PI, 0, 0];
previousNode.makeFull(previousFillNode);
let currentNode: TestNode = new TestNode();
let currentFillNode: IFillNode = helper.createFillNode();
currentNode.makeFull(currentFillNode);
traversingState.set([previousNode]);
traversingState.set([currentNode]);
expect(traversingState.previousCamera.position.x).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.position.y).toBeCloseTo(0, precision);
expect(traversingState.previousCamera.position.z).toBeCloseTo(0, precision);
let lookat: THREE.Vector3 = camera.lookat.clone().sub(camera.position);
expect(traversingState.previousCamera.lookat.x).toBeCloseTo(lookat.x, precision);
expect(traversingState.previousCamera.lookat.y).toBeCloseTo(lookat.y, precision);
expect(traversingState.previousCamera.lookat.z).toBeCloseTo(lookat.z, precision);
});
});