You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
309 lines
8.9 KiB
JavaScript
309 lines
8.9 KiB
JavaScript
import { Cartesian2 } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Cartesian4 } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { Matrix4 } from "../../Source/Cesium.js";
|
|
import { PerspectiveOffCenterFrustum } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/PerspectiveOffCenterFrustum", function () {
|
|
var frustum, planes;
|
|
|
|
beforeEach(function () {
|
|
frustum = new PerspectiveOffCenterFrustum();
|
|
frustum.right = 1.0;
|
|
frustum.left = -frustum.right;
|
|
frustum.top = 1.0;
|
|
frustum.bottom = -frustum.top;
|
|
frustum.near = 1.0;
|
|
frustum.far = 2.0;
|
|
planes = frustum.computeCullingVolume(
|
|
new Cartesian3(),
|
|
Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()),
|
|
Cartesian3.UNIT_Y
|
|
).planes;
|
|
});
|
|
|
|
it("constructs", function () {
|
|
var options = {
|
|
left: -1.0,
|
|
right: 2.0,
|
|
top: 5.0,
|
|
bottom: -1.0,
|
|
near: 3.0,
|
|
far: 4.0,
|
|
};
|
|
var f = new PerspectiveOffCenterFrustum(options);
|
|
expect(f.width).toEqual(options.width);
|
|
expect(f.aspectRatio).toEqual(options.aspectRatio);
|
|
expect(f.near).toEqual(options.near);
|
|
expect(f.far).toEqual(options.far);
|
|
});
|
|
|
|
it("default constructs", function () {
|
|
var f = new PerspectiveOffCenterFrustum();
|
|
expect(f.left).toBeUndefined();
|
|
expect(f.right).toBeUndefined();
|
|
expect(f.top).toBeUndefined();
|
|
expect(f.bottom).toBeUndefined();
|
|
expect(f.near).toEqual(1.0);
|
|
expect(f.far).toEqual(500000000.0);
|
|
});
|
|
|
|
it("out of range near plane throws an exception", function () {
|
|
frustum.near = -1.0;
|
|
expect(function () {
|
|
return frustum.projectionMatrix;
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("negative far plane throws an exception", function () {
|
|
frustum.far = -1.0;
|
|
expect(function () {
|
|
return frustum.projectionMatrix;
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeCullingVolume with no position throws an exception", function () {
|
|
expect(function () {
|
|
return frustum.computeCullingVolume();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeCullingVolume with no direction throws an exception", function () {
|
|
expect(function () {
|
|
return frustum.computeCullingVolume(new Cartesian3());
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeCullingVolume with no up throws an exception", function () {
|
|
expect(function () {
|
|
return frustum.computeCullingVolume(new Cartesian3(), new Cartesian3());
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get frustum left plane", function () {
|
|
var leftPlane = planes[0];
|
|
var x = 1.0 / Math.sqrt(2.0);
|
|
var expectedResult = new Cartesian4(x, 0.0, -x, 0.0);
|
|
expect(leftPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get frustum right plane", function () {
|
|
var rightPlane = planes[1];
|
|
var x = 1.0 / Math.sqrt(2.0);
|
|
var expectedResult = new Cartesian4(-x, 0.0, -x, 0.0);
|
|
expect(rightPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get frustum bottom plane", function () {
|
|
var bottomPlane = planes[2];
|
|
var x = 1.0 / Math.sqrt(2.0);
|
|
var expectedResult = new Cartesian4(0.0, x, -x, 0.0);
|
|
expect(bottomPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get frustum top plane", function () {
|
|
var topPlane = planes[3];
|
|
var x = 1.0 / Math.sqrt(2.0);
|
|
var expectedResult = new Cartesian4(0.0, -x, -x, 0.0);
|
|
expect(topPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get frustum near plane", function () {
|
|
var nearPlane = planes[4];
|
|
var expectedResult = new Cartesian4(0.0, 0.0, -1.0, -1.0);
|
|
expect(nearPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get frustum far plane", function () {
|
|
var farPlane = planes[5];
|
|
var expectedResult = new Cartesian4(0.0, 0.0, 1.0, 2.0);
|
|
expect(farPlane).toEqualEpsilon(expectedResult, CesiumMath.EPSILON15);
|
|
});
|
|
|
|
it("get perspective projection matrix", function () {
|
|
var projectionMatrix = frustum.projectionMatrix;
|
|
|
|
var top = frustum.top;
|
|
var bottom = frustum.bottom;
|
|
var right = frustum.right;
|
|
var left = frustum.left;
|
|
var near = frustum.near;
|
|
var far = frustum.far;
|
|
var expected = Matrix4.computePerspectiveOffCenter(
|
|
left,
|
|
right,
|
|
bottom,
|
|
top,
|
|
near,
|
|
far,
|
|
new Matrix4()
|
|
);
|
|
|
|
expect(projectionMatrix).toEqualEpsilon(expected, CesiumMath.EPSILON6);
|
|
});
|
|
|
|
it("get infinite perspective matrix", function () {
|
|
var top = frustum.top;
|
|
var bottom = frustum.bottom;
|
|
var right = frustum.right;
|
|
var left = frustum.left;
|
|
var near = frustum.near;
|
|
|
|
var expected = Matrix4.computeInfinitePerspectiveOffCenter(
|
|
left,
|
|
right,
|
|
bottom,
|
|
top,
|
|
near,
|
|
new Matrix4()
|
|
);
|
|
expect(expected).toEqual(frustum.infiniteProjectionMatrix);
|
|
});
|
|
|
|
it("get pixel dimensions throws without canvas height", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(
|
|
1.0,
|
|
undefined,
|
|
1.0,
|
|
1.0,
|
|
new Cartesian2()
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions throws without canvas width", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(
|
|
undefined,
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
new Cartesian2()
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions throws with canvas width less than or equal to zero", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(0.0, 1.0, 1.0, 1.0, new Cartesian2());
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions throws with canvas height less than or equal to zero", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(1.0, 0.0, 1.0, 1.0, new Cartesian2());
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions throws without pixel ratio", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
undefined,
|
|
new Cartesian2()
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions throws with pixel ratio less than or equal to zero", function () {
|
|
expect(function () {
|
|
return frustum.getPixelDimensions(1.0, 1.0, 1.0, 0.0, new Cartesian2());
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("get pixel dimensions", function () {
|
|
var pixelSize = frustum.getPixelDimensions(
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
new Cartesian2()
|
|
);
|
|
expect(pixelSize.x).toEqual(2.0);
|
|
expect(pixelSize.y).toEqual(2.0);
|
|
});
|
|
|
|
it("get pixel dimensions with pixel ratio", function () {
|
|
var pixelSize = frustum.getPixelDimensions(
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
2.0,
|
|
new Cartesian2()
|
|
);
|
|
expect(pixelSize.x).toEqual(4.0);
|
|
expect(pixelSize.y).toEqual(4.0);
|
|
});
|
|
|
|
it("equals", function () {
|
|
var frustum2 = new PerspectiveOffCenterFrustum();
|
|
frustum2.right = 1.0;
|
|
frustum2.left = -frustum.right;
|
|
frustum2.top = 1.0;
|
|
frustum2.bottom = -frustum.top;
|
|
frustum2.near = 1.0;
|
|
frustum2.far = 2.0;
|
|
frustum2.position = new Cartesian3();
|
|
frustum2.direction = Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3());
|
|
frustum2.up = Cartesian3.UNIT_Y;
|
|
|
|
expect(frustum).toEqual(frustum2);
|
|
});
|
|
|
|
it("equals epsilon", function () {
|
|
var frustum2 = new PerspectiveOffCenterFrustum();
|
|
frustum2.right = 1.0;
|
|
frustum2.left = -frustum.right;
|
|
frustum2.top = 1.0;
|
|
frustum2.bottom = -frustum.top;
|
|
frustum2.near = 1.0;
|
|
frustum2.far = 2.0;
|
|
expect(frustum.equalsEpsilon(frustum2, CesiumMath.EPSILON7)).toEqual(true);
|
|
|
|
var frustum3 = new PerspectiveOffCenterFrustum();
|
|
frustum3.right = 1.01;
|
|
frustum3.left = -frustum.right;
|
|
frustum3.top = 1.01;
|
|
frustum3.bottom = -frustum.top;
|
|
frustum3.near = 1.01;
|
|
frustum3.far = 1.99;
|
|
expect(frustum.equalsEpsilon(frustum3, CesiumMath.EPSILON1)).toEqual(true);
|
|
|
|
var frustum4 = new PerspectiveOffCenterFrustum();
|
|
frustum4.right = 1.1;
|
|
frustum4.left = -frustum.right;
|
|
frustum4.top = 1.0;
|
|
frustum4.bottom = -frustum.top;
|
|
frustum4.near = 1.0;
|
|
frustum4.far = 2.0;
|
|
expect(frustum.equalsEpsilon(frustum4, CesiumMath.EPSILON2)).toEqual(false);
|
|
});
|
|
|
|
it("equals undefined", function () {
|
|
expect(frustum.equals()).toEqual(false);
|
|
});
|
|
|
|
it("throws with undefined frustum parameters", function () {
|
|
var frustum = new PerspectiveOffCenterFrustum();
|
|
expect(function () {
|
|
return frustum.infiniteProjectionMatrix;
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("clone", function () {
|
|
var frustum2 = frustum.clone();
|
|
expect(frustum).toEqual(frustum2);
|
|
});
|
|
|
|
it("clone with result parameter", function () {
|
|
var result = new PerspectiveOffCenterFrustum();
|
|
var frustum2 = frustum.clone(result);
|
|
expect(frustum2).toBe(result);
|
|
expect(frustum).toEqual(frustum2);
|
|
});
|
|
});
|