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

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"
);