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.
258 lines
7.3 KiB
JavaScript
258 lines
7.3 KiB
JavaScript
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Color } from "../../Source/Cesium.js";
|
|
import { ColorGeometryInstanceAttribute } from "../../Source/Cesium.js";
|
|
import { defaultValue } from "../../Source/Cesium.js";
|
|
import { GeometryInstance } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { PerspectiveFrustum } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { RectangleGeometry } from "../../Source/Cesium.js";
|
|
import { Resource } from "../../Source/Cesium.js";
|
|
import { Transforms } from "../../Source/Cesium.js";
|
|
import { BillboardCollection } from "../../Source/Cesium.js";
|
|
import { Globe } from "../../Source/Cesium.js";
|
|
import { HorizontalOrigin } from "../../Source/Cesium.js";
|
|
import { LabelCollection } from "../../Source/Cesium.js";
|
|
import { Material } from "../../Source/Cesium.js";
|
|
import { PerInstanceColorAppearance } from "../../Source/Cesium.js";
|
|
import { PolylineCollection } from "../../Source/Cesium.js";
|
|
import { Primitive } from "../../Source/Cesium.js";
|
|
import { SceneMode } from "../../Source/Cesium.js";
|
|
import { VerticalOrigin } from "../../Source/Cesium.js";
|
|
import createScene from "../createScene.js";
|
|
|
|
describe(
|
|
"Scene/PrimitiveCulling",
|
|
function () {
|
|
var scene;
|
|
var rectangle = Rectangle.fromDegrees(-100.0, 30.0, -93.0, 37.0);
|
|
var primitive;
|
|
var greenImage;
|
|
|
|
beforeAll(function () {
|
|
scene = createScene();
|
|
scene.primitives.destroyPrimitives = false;
|
|
|
|
return Resource.fetchImage("./Data/Images/Green.png").then(function (
|
|
image
|
|
) {
|
|
greenImage = image;
|
|
});
|
|
});
|
|
|
|
afterAll(function () {
|
|
scene.destroyForSpecs();
|
|
});
|
|
|
|
beforeEach(function () {
|
|
scene.morphTo3D(0.0);
|
|
|
|
var camera = scene.camera;
|
|
camera.frustum = new PerspectiveFrustum();
|
|
camera.frustum.aspectRatio =
|
|
scene.drawingBufferWidth / scene.drawingBufferHeight;
|
|
camera.frustum.fov = CesiumMath.toRadians(60.0);
|
|
});
|
|
|
|
afterEach(function () {
|
|
scene.primitives.removeAll();
|
|
primitive = primitive && primitive.destroy();
|
|
});
|
|
|
|
function testCull(primitive) {
|
|
scene.camera.setView({
|
|
destination: rectangle,
|
|
});
|
|
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.primitives.add(primitive);
|
|
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
|
|
if (scene.mode !== SceneMode.SCENE2D) {
|
|
// move the camera through the rectangle so that is behind the view frustum
|
|
scene.camera.moveForward(100000000.0);
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
}
|
|
}
|
|
|
|
function testCullIn3D(primitive) {
|
|
scene.mode = SceneMode.SCENE3D;
|
|
testCull(primitive);
|
|
}
|
|
|
|
function testCullInColumbusView(primitive) {
|
|
scene.mode = SceneMode.COLUMBUS_VIEW;
|
|
testCull(primitive);
|
|
}
|
|
|
|
function testCullIn2D(primitive) {
|
|
scene.mode = SceneMode.SCENE2D;
|
|
testCull(primitive);
|
|
}
|
|
|
|
function testOcclusionCull(primitive) {
|
|
scene.mode = SceneMode.SCENE3D;
|
|
scene.camera.setView({
|
|
destination: rectangle,
|
|
});
|
|
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.primitives.add(primitive);
|
|
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
|
|
// create the globe; it should occlude the primitive
|
|
scene.globe = new Globe();
|
|
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
|
|
scene.globe = undefined;
|
|
}
|
|
|
|
function createPrimitive(height) {
|
|
height = defaultValue(height, 0);
|
|
var primitive = new Primitive({
|
|
geometryInstances: new GeometryInstance({
|
|
geometry: new RectangleGeometry({
|
|
rectangle: rectangle,
|
|
vertexFormat: PerInstanceColorAppearance.VERTEX_FORMAT,
|
|
height: height,
|
|
}),
|
|
attributes: {
|
|
color: ColorGeometryInstanceAttribute.fromColor(Color.RED),
|
|
},
|
|
}),
|
|
appearance: new PerInstanceColorAppearance(),
|
|
asynchronous: false,
|
|
});
|
|
return primitive;
|
|
}
|
|
|
|
it("frustum culls polygon in 3D", function () {
|
|
primitive = createPrimitive();
|
|
testCullIn3D(primitive);
|
|
});
|
|
|
|
it("frustum culls polygon in Columbus view", function () {
|
|
primitive = createPrimitive();
|
|
testCullInColumbusView(primitive);
|
|
});
|
|
|
|
it("frustum culls polygon in 2D", function () {
|
|
primitive = createPrimitive();
|
|
testCullIn2D(primitive);
|
|
});
|
|
|
|
it("polygon occlusion", function () {
|
|
primitive = createPrimitive(-1000000.0);
|
|
testOcclusionCull(primitive);
|
|
});
|
|
|
|
function createLabels(height) {
|
|
height = defaultValue(height, 0);
|
|
var labels = new LabelCollection();
|
|
var center = Cartesian3.fromDegrees(-96.5, 33.5, height);
|
|
labels.modelMatrix = Transforms.eastNorthUpToFixedFrame(center);
|
|
labels.add({
|
|
position: Cartesian3.ZERO,
|
|
text: "X",
|
|
horizontalOrigin: HorizontalOrigin.CENTER,
|
|
verticalOrigin: VerticalOrigin.CENTER,
|
|
});
|
|
return labels;
|
|
}
|
|
|
|
it("frustum culls labels in 3D", function () {
|
|
primitive = createLabels();
|
|
testCullIn3D(primitive);
|
|
});
|
|
|
|
it("frustum culls labels in Columbus view", function () {
|
|
primitive = createLabels();
|
|
testCullInColumbusView(primitive);
|
|
});
|
|
|
|
it("frustum culls labels in 2D", function () {
|
|
primitive = createLabels();
|
|
testCullIn2D(primitive);
|
|
});
|
|
|
|
it("label occlusion", function () {
|
|
primitive = createLabels(-1000000.0);
|
|
testOcclusionCull(primitive);
|
|
});
|
|
|
|
function createBillboard(height) {
|
|
height = defaultValue(height, 0);
|
|
var billboards = new BillboardCollection();
|
|
billboards.add({
|
|
position: Cartesian3.fromDegrees(-96.5, 33.5, height),
|
|
image: greenImage,
|
|
});
|
|
return billboards;
|
|
}
|
|
|
|
it("frustum culls billboards in 3D", function () {
|
|
primitive = createBillboard();
|
|
testCullIn3D(primitive);
|
|
});
|
|
|
|
it("frustum culls billboards in Columbus view", function () {
|
|
primitive = createBillboard();
|
|
testCullInColumbusView(primitive);
|
|
});
|
|
|
|
it("frustum culls billboards in 2D", function () {
|
|
primitive = createBillboard();
|
|
testCullIn2D(primitive);
|
|
});
|
|
|
|
it("billboard occlusion", function () {
|
|
primitive = createBillboard(-1000000.0);
|
|
testOcclusionCull(primitive);
|
|
});
|
|
|
|
function createPolylines(height) {
|
|
height = defaultValue(height, 0);
|
|
var material = Material.fromType("Color");
|
|
material.translucent = false;
|
|
|
|
var polylines = new PolylineCollection();
|
|
polylines.add({
|
|
positions: Cartesian3.fromDegreesArrayHeights([
|
|
-100.0,
|
|
30.0,
|
|
height,
|
|
-93.0,
|
|
37.0,
|
|
height,
|
|
]),
|
|
material: material,
|
|
});
|
|
return polylines;
|
|
}
|
|
|
|
it("frustum culls polylines in 3D", function () {
|
|
primitive = createPolylines();
|
|
testCullIn3D(primitive);
|
|
});
|
|
|
|
it("frustum culls polylines in Columbus view", function () {
|
|
primitive = createPolylines();
|
|
testCullInColumbusView(primitive);
|
|
});
|
|
|
|
it("frustum culls polylines in 2D", function () {
|
|
primitive = createPolylines();
|
|
testCullIn2D(primitive);
|
|
});
|
|
|
|
it("polyline occlusion", function () {
|
|
primitive = createPolylines(-1000000.0);
|
|
testOcclusionCull(primitive);
|
|
});
|
|
},
|
|
"WebGL"
|
|
);
|