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.
614 lines
18 KiB
JavaScript
614 lines
18 KiB
JavaScript
import { AxisAlignedBoundingBox } from "../../Source/Cesium.js";
|
|
import { BoundingSphere } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { CullingVolume } from "../../Source/Cesium.js";
|
|
import { Intersect } from "../../Source/Cesium.js";
|
|
import { PerspectiveFrustum } from "../../Source/Cesium.js";
|
|
|
|
describe("Core/CullingVolume", function () {
|
|
var cullingVolume;
|
|
|
|
beforeEach(function () {
|
|
var frustum = new PerspectiveFrustum();
|
|
frustum.near = 1.0;
|
|
frustum.far = 2.0;
|
|
frustum.fov = Math.PI / 3;
|
|
frustum.aspectRatio = 1.0;
|
|
cullingVolume = frustum.computeCullingVolume(
|
|
new Cartesian3(),
|
|
Cartesian3.negate(Cartesian3.UNIT_Z, new Cartesian3()),
|
|
Cartesian3.UNIT_Y
|
|
);
|
|
});
|
|
|
|
it("computeVisibility throws without a bounding volume", function () {
|
|
expect(function () {
|
|
return new CullingVolume().computeVisibility();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeVisibilityWithPlaneMask throws without a bounding volume", function () {
|
|
expect(function () {
|
|
return new CullingVolume().computeVisibilityWithPlaneMask(
|
|
undefined,
|
|
CullingVolume.MASK_INDETERMINATE
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("computeVisibilityWithPlaneMask throws without a parent plane mask", function () {
|
|
expect(function () {
|
|
return new CullingVolume().computeVisibilityWithPlaneMask(
|
|
new BoundingSphere(),
|
|
undefined
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
function testWithAndWithoutPlaneMask(culling, bound, intersect) {
|
|
expect(culling.computeVisibility(bound)).toEqual(intersect);
|
|
|
|
var mask = culling.computeVisibilityWithPlaneMask(
|
|
bound,
|
|
CullingVolume.MASK_INDETERMINATE
|
|
);
|
|
if (intersect === Intersect.INSIDE) {
|
|
expect(mask).toEqual(CullingVolume.MASK_INSIDE);
|
|
} else if (intersect === Intersect.OUTSIDE) {
|
|
expect(mask).toEqual(CullingVolume.MASK_OUTSIDE);
|
|
} else {
|
|
expect(mask).not.toEqual(CullingVolume.MASK_INSIDE);
|
|
expect(mask).not.toEqual(CullingVolume.MASK_OUTSIDE);
|
|
}
|
|
expect(culling.computeVisibilityWithPlaneMask(bound, mask)).toEqual(mask);
|
|
}
|
|
|
|
describe("box intersections", function () {
|
|
it("can contain an axis aligned bounding box", function () {
|
|
var box1 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -1.25),
|
|
new Cartesian3(0.5, 0, -1.25),
|
|
new Cartesian3(-0.5, 0, -1.75),
|
|
new Cartesian3(0.5, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box1, Intersect.INSIDE);
|
|
});
|
|
|
|
describe("can partially contain an axis aligned bounding box", function () {
|
|
it("on the far plane", function () {
|
|
var box2 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -1.5),
|
|
new Cartesian3(0.5, 0, -1.5),
|
|
new Cartesian3(-0.5, 0, -2.5),
|
|
new Cartesian3(0.5, 0, -2.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box2,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the near plane", function () {
|
|
var box3 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -0.5),
|
|
new Cartesian3(0.5, 0, -0.5),
|
|
new Cartesian3(-0.5, 0, -1.5),
|
|
new Cartesian3(0.5, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box3,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the left plane", function () {
|
|
var box4 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-1.5, 0, -1.25),
|
|
new Cartesian3(0, 0, -1.25),
|
|
new Cartesian3(-1.5, 0, -1.5),
|
|
new Cartesian3(0, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box4,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the right plane", function () {
|
|
var box5 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(0, 0, -1.25),
|
|
new Cartesian3(1.5, 0, -1.25),
|
|
new Cartesian3(0, 0, -1.5),
|
|
new Cartesian3(1.5, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box5,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the top plane", function () {
|
|
var box6 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -1.25),
|
|
new Cartesian3(0.5, 0, -1.25),
|
|
new Cartesian3(-0.5, 2.0, -1.75),
|
|
new Cartesian3(0.5, 2.0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box6,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the bottom plane", function () {
|
|
var box7 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, -2.0, -1.25),
|
|
new Cartesian3(0.5, 0, -1.25),
|
|
new Cartesian3(-0.5, -2.0, -1.5),
|
|
new Cartesian3(0.5, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
box7,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("can not contain an axis aligned bounding box", function () {
|
|
it("past the far plane", function () {
|
|
var box8 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -2.25),
|
|
new Cartesian3(0.5, 0, -2.25),
|
|
new Cartesian3(-0.5, 0, -2.75),
|
|
new Cartesian3(0.5, 0, -2.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box8, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("before the near plane", function () {
|
|
var box9 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 0, -0.25),
|
|
new Cartesian3(0.5, 0, -0.25),
|
|
new Cartesian3(-0.5, 0, -0.75),
|
|
new Cartesian3(0.5, 0, -0.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box9, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the left plane", function () {
|
|
var box10 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-5, 0, -1.25),
|
|
new Cartesian3(-3, 0, -1.25),
|
|
new Cartesian3(-5, 0, -1.75),
|
|
new Cartesian3(-3, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box10, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the right plane", function () {
|
|
var box11 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(3, 0, -1.25),
|
|
new Cartesian3(5, 0, -1.25),
|
|
new Cartesian3(3, 0, -1.75),
|
|
new Cartesian3(5, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box11, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the top plane", function () {
|
|
var box12 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, 3, -1.25),
|
|
new Cartesian3(0.5, 3, -1.25),
|
|
new Cartesian3(-0.5, 5, -1.75),
|
|
new Cartesian3(0.5, 5, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box12, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the bottom plane", function () {
|
|
var box13 = AxisAlignedBoundingBox.fromPoints([
|
|
new Cartesian3(-0.5, -3, -1.25),
|
|
new Cartesian3(0.5, -3, -1.25),
|
|
new Cartesian3(-0.5, -5, -1.75),
|
|
new Cartesian3(0.5, -5, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, box13, Intersect.OUTSIDE);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("sphere intersection", function () {
|
|
it("can contain a sphere", function () {
|
|
var sphere1 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -1.25),
|
|
new Cartesian3(0, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere1, Intersect.INSIDE);
|
|
});
|
|
|
|
describe("can partially contain a sphere", function () {
|
|
it("on the far plane", function () {
|
|
var sphere2 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -1.5),
|
|
new Cartesian3(0, 0, -2.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere2,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the near plane", function () {
|
|
var sphere3 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -0.5),
|
|
new Cartesian3(0, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere3,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the left plane", function () {
|
|
var sphere4 = BoundingSphere.fromPoints([
|
|
new Cartesian3(-1.0, 0, -1.5),
|
|
new Cartesian3(0, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere4,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the right plane", function () {
|
|
var sphere5 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -1.5),
|
|
new Cartesian3(1.0, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere5,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the top plane", function () {
|
|
var sphere6 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -1.5),
|
|
new Cartesian3(0, 2.0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere6,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the bottom plane", function () {
|
|
var sphere7 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, -2.0, -1.5),
|
|
new Cartesian3(0, 0, -1.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere7,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("can not contain a sphere", function () {
|
|
it("past the far plane", function () {
|
|
var sphere8 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -2.25),
|
|
new Cartesian3(0, 0, -2.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere8, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("before the near plane", function () {
|
|
var sphere9 = BoundingSphere.fromPoints([
|
|
new Cartesian3(0, 0, -0.25),
|
|
new Cartesian3(0, 0, -0.5),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere9, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the left plane", function () {
|
|
var sphere10 = BoundingSphere.fromPoints([
|
|
new Cartesian3(-5, 0, -1.25),
|
|
new Cartesian3(-4.5, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere10, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the right plane", function () {
|
|
var sphere11 = BoundingSphere.fromPoints([
|
|
new Cartesian3(4.5, 0, -1.25),
|
|
new Cartesian3(5, 0, -1.75),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere11, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the top plane", function () {
|
|
var sphere12 = BoundingSphere.fromPoints([
|
|
new Cartesian3(-0.5, 4.5, -1.25),
|
|
new Cartesian3(-0.5, 5, -1.25),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere12, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the bottom plane", function () {
|
|
var sphere13 = BoundingSphere.fromPoints([
|
|
new Cartesian3(-0.5, -4.5, -1.25),
|
|
new Cartesian3(-0.5, -5, -1.25),
|
|
]);
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere13, Intersect.OUTSIDE);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("construct from bounding sphere", function () {
|
|
var boundingSphereCullingVolume = new BoundingSphere(
|
|
new Cartesian3(1000.0, 2000.0, 3000.0),
|
|
100.0
|
|
);
|
|
var cullingVolume = CullingVolume.fromBoundingSphere(
|
|
boundingSphereCullingVolume
|
|
);
|
|
|
|
it("throws without a boundingSphere", function () {
|
|
expect(function () {
|
|
CullingVolume.fromBoundingSphere(undefined);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("can contain a volume", function () {
|
|
var sphere1 = BoundingSphere.clone(boundingSphereCullingVolume);
|
|
sphere1.radius *= 0.5;
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere1, Intersect.INSIDE);
|
|
});
|
|
|
|
describe("can partially contain a volume", function () {
|
|
it("on the far plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
0.0,
|
|
boundingSphereCullingVolume.radius * 1.5
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere2 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere2,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the near plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
0.0,
|
|
-boundingSphereCullingVolume.radius * 1.5
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere3 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere3,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the left plane", function () {
|
|
var offset = new Cartesian3(
|
|
-boundingSphereCullingVolume.radius * 1.5,
|
|
0.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere4 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere4,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the right plane", function () {
|
|
var offset = new Cartesian3(
|
|
boundingSphereCullingVolume.radius * 1.5,
|
|
0.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere5 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere5,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the top plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
boundingSphereCullingVolume.radius * 1.5,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere6 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere6,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
|
|
it("on the bottom plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
-boundingSphereCullingVolume.radius * 1.5,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere7 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(
|
|
cullingVolume,
|
|
sphere7,
|
|
Intersect.INTERSECTING
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("can not contain a volume", function () {
|
|
it("past the far plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
0.0,
|
|
boundingSphereCullingVolume.radius * 2.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere8 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere8, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("before the near plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
0.0,
|
|
-boundingSphereCullingVolume.radius * 2.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere9 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere9, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the left plane", function () {
|
|
var offset = new Cartesian3(
|
|
-boundingSphereCullingVolume.radius * 2.0,
|
|
0.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere10 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere10, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the right plane", function () {
|
|
var offset = new Cartesian3(
|
|
boundingSphereCullingVolume.radius * 2.0,
|
|
0.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere11 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere11, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the top plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
boundingSphereCullingVolume.radius * 2.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere12 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere12, Intersect.OUTSIDE);
|
|
});
|
|
|
|
it("past the bottom plane", function () {
|
|
var offset = new Cartesian3(
|
|
0.0,
|
|
-boundingSphereCullingVolume.radius * 2.0,
|
|
0.0
|
|
);
|
|
var center = Cartesian3.add(
|
|
boundingSphereCullingVolume.center,
|
|
offset,
|
|
new Cartesian3()
|
|
);
|
|
var radius = boundingSphereCullingVolume.radius * 0.5;
|
|
var sphere13 = new BoundingSphere(center, radius);
|
|
|
|
testWithAndWithoutPlaneMask(cullingVolume, sphere13, Intersect.OUTSIDE);
|
|
});
|
|
});
|
|
});
|
|
});
|