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.
494 lines
14 KiB
JavaScript
494 lines
14 KiB
JavaScript
import { CesiumTerrainProvider } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { Resource } from "../../Source/Cesium.js";
|
|
import { Globe } from "../../Source/Cesium.js";
|
|
import { SingleTileImageryProvider } from "../../Source/Cesium.js";
|
|
import { Color } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { HeadingPitchRoll } from "../../Source/Cesium.js";
|
|
import { NearFarScalar } from "../../Source/Cesium.js";
|
|
import createScene from "../createScene.js";
|
|
import pollToPromise from "../pollToPromise.js";
|
|
|
|
describe(
|
|
"Scene/Globe",
|
|
function () {
|
|
var scene;
|
|
var globe;
|
|
|
|
beforeAll(function () {
|
|
scene = createScene();
|
|
});
|
|
|
|
afterAll(function () {
|
|
scene.destroyForSpecs();
|
|
});
|
|
|
|
beforeEach(function () {
|
|
globe = new Globe();
|
|
scene.globe = globe;
|
|
});
|
|
|
|
afterEach(function () {
|
|
scene.globe = undefined;
|
|
Resource._Implementations.loadWithXhr =
|
|
Resource._DefaultImplementations.loadWithXhr;
|
|
});
|
|
|
|
function returnTileJson(path) {
|
|
var oldLoad = Resource._Implementations.loadWithXhr;
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
if (url.indexOf("layer.json") >= 0) {
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
path,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred
|
|
);
|
|
} else {
|
|
return oldLoad(
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
);
|
|
}
|
|
};
|
|
}
|
|
|
|
function returnVertexNormalTileJson() {
|
|
return returnTileJson(
|
|
"Data/CesiumTerrainTileJson/VertexNormals.tile.json"
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Repeatedly calls render until the load queue is empty. Returns a promise that resolves
|
|
* when the load queue is empty.
|
|
*/
|
|
function updateUntilDone(globe) {
|
|
// update until the load queue is empty.
|
|
return pollToPromise(function () {
|
|
globe._surface._debug.enableDebugOutput = true;
|
|
scene.render();
|
|
return globe.tilesLoaded;
|
|
});
|
|
}
|
|
|
|
it("renders with enableLighting", function () {
|
|
globe.enableLighting = true;
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("renders with dynamicAtmosphereLighting", function () {
|
|
globe.enableLighting = true;
|
|
globe.dynamicAtmosphereLighting = true;
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("renders with dynamicAtmosphereLightingFromSun", function () {
|
|
globe.enableLighting = true;
|
|
globe.dynamicAtmosphereLighting = true;
|
|
globe.dynamicAtmosphereLightingFromSun = true;
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("renders with showWaterEffect set to false", function () {
|
|
globe.showWaterEffect = false;
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("ImageryLayersUpdated event fires when layer is added, hidden, shown, moved, or removed", function () {
|
|
var timesEventRaised = 0;
|
|
globe.imageryLayersUpdatedEvent.addEventListener(function () {
|
|
++timesEventRaised;
|
|
});
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
var layer = layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
return updateUntilDone(globe)
|
|
.then(function () {
|
|
expect(timesEventRaised).toEqual(2);
|
|
|
|
layer.show = false;
|
|
return updateUntilDone(globe);
|
|
})
|
|
.then(function () {
|
|
expect(timesEventRaised).toEqual(3);
|
|
|
|
layer.show = true;
|
|
return updateUntilDone(globe);
|
|
})
|
|
.then(function () {
|
|
expect(timesEventRaised).toEqual(4);
|
|
|
|
layerCollection.raise(layer);
|
|
return updateUntilDone(globe);
|
|
})
|
|
.then(function () {
|
|
expect(timesEventRaised).toEqual(5);
|
|
|
|
layerCollection.remove(layer);
|
|
return updateUntilDone(globe);
|
|
})
|
|
.then(function () {
|
|
expect(timesEventRaised).toEqual(6);
|
|
});
|
|
});
|
|
|
|
it("terrainProviderChanged event fires", function () {
|
|
var terrainProvider = new CesiumTerrainProvider({
|
|
url: "made/up/url",
|
|
requestVertexNormals: true,
|
|
});
|
|
|
|
var spyListener = jasmine.createSpy("listener");
|
|
globe.terrainProviderChanged.addEventListener(spyListener);
|
|
|
|
globe.terrainProvider = terrainProvider;
|
|
|
|
expect(spyListener).toHaveBeenCalledWith(terrainProvider);
|
|
});
|
|
|
|
it("tilesLoaded return true when tile load queue is empty", function () {
|
|
expect(globe.tilesLoaded).toBe(true);
|
|
|
|
globe._surface._tileLoadQueueHigh.length = 2;
|
|
expect(globe.tilesLoaded).toBe(false);
|
|
|
|
globe._surface._tileLoadQueueHigh.length = 0;
|
|
expect(globe.tilesLoaded).toBe(true);
|
|
|
|
globe._surface._tileLoadQueueMedium.length = 2;
|
|
expect(globe.tilesLoaded).toBe(false);
|
|
|
|
globe._surface._tileLoadQueueMedium.length = 0;
|
|
expect(globe.tilesLoaded).toBe(true);
|
|
|
|
globe._surface._tileLoadQueueLow.length = 2;
|
|
expect(globe.tilesLoaded).toBe(false);
|
|
|
|
globe._surface._tileLoadQueueLow.length = 0;
|
|
expect(globe.tilesLoaded).toBe(true);
|
|
|
|
var terrainProvider = new CesiumTerrainProvider({
|
|
url: "made/up/url",
|
|
requestVertexNormals: true,
|
|
});
|
|
|
|
globe.terrainProvider = terrainProvider;
|
|
scene.render();
|
|
expect(globe.tilesLoaded).toBe(false);
|
|
});
|
|
|
|
it("renders terrain with enableLighting", function () {
|
|
globe.enableLighting = true;
|
|
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Red16x16.png" })
|
|
);
|
|
|
|
Resource._Implementations.loadWithXhr = function (
|
|
url,
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred,
|
|
overrideMimeType
|
|
) {
|
|
Resource._DefaultImplementations.loadWithXhr(
|
|
"Data/CesiumTerrainTileJson/tile.vertexnormals.terrain",
|
|
responseType,
|
|
method,
|
|
data,
|
|
headers,
|
|
deferred
|
|
);
|
|
};
|
|
|
|
returnVertexNormalTileJson();
|
|
|
|
var terrainProvider = new CesiumTerrainProvider({
|
|
url: "made/up/url",
|
|
requestVertexNormals: true,
|
|
});
|
|
|
|
globe.terrainProvider = terrainProvider;
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("renders with hue shift", function () {
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Blue.png" })
|
|
);
|
|
|
|
scene.camera.flyHome(0.0);
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).toRenderAndCall(function (rgba) {
|
|
scene.globe.atmosphereHueShift = 0.1;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).notToRender(rgba);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("renders with saturation shift", function () {
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Blue.png" })
|
|
);
|
|
|
|
scene.camera.flyHome(0.0);
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).toRenderAndCall(function (rgba) {
|
|
scene.globe.atmosphereSaturationShift = 0.1;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).notToRender(rgba);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("renders with brightness shift", function () {
|
|
var layerCollection = globe.imageryLayers;
|
|
layerCollection.removeAll();
|
|
layerCollection.addImageryProvider(
|
|
new SingleTileImageryProvider({ url: "Data/Images/Blue.png" })
|
|
);
|
|
|
|
scene.camera.flyHome(0.0);
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
scene.globe.show = false;
|
|
expect(scene).toRender([0, 0, 0, 255]);
|
|
scene.globe.show = true;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).toRenderAndCall(function (rgba) {
|
|
scene.globe.atmosphereBrightnessShift = 0.1;
|
|
expect(scene).notToRender([0, 0, 0, 255]);
|
|
expect(scene).notToRender(rgba);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("applies back face culling", function () {
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
globe.backFaceCulling = true;
|
|
scene.render();
|
|
var command = scene.frameState.commandList[0];
|
|
expect(command.renderState.cull.enabled).toBe(true);
|
|
globe.backFaceCulling = false;
|
|
scene.render();
|
|
command = scene.frameState.commandList[0];
|
|
expect(command.renderState.cull.enabled).toBe(false);
|
|
});
|
|
});
|
|
|
|
it("shows terrain skirts", function () {
|
|
scene.camera.setView({
|
|
destination: new Rectangle(0.0001, 0.0001, 0.0025, 0.0025),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
globe.showSkirts = true;
|
|
scene.render();
|
|
var command = scene.frameState.commandList[0];
|
|
var indexCount = command.count;
|
|
expect(indexCount).toBe(command.owner.data.renderedMesh.indices.length);
|
|
|
|
globe.showSkirts = false;
|
|
scene.render();
|
|
command = scene.frameState.commandList[0];
|
|
expect(command.count).toBeLessThan(indexCount);
|
|
expect(command.count).toBe(
|
|
command.owner.data.renderedMesh.indexCountWithoutSkirts
|
|
);
|
|
});
|
|
});
|
|
|
|
it("gets underground color", function () {
|
|
expect(globe.undergroundColor).toEqual(Color.BLACK);
|
|
});
|
|
|
|
it("sets underground color", function () {
|
|
globe.undergroundColor = Color.RED;
|
|
|
|
scene.camera.setView({
|
|
destination: new Cartesian3(
|
|
-524251.65918537375,
|
|
-5316355.5357514685,
|
|
3400179.253223899
|
|
),
|
|
orientation: new HeadingPitchRoll(
|
|
0.22779127099032603,
|
|
-0.7030060668670961,
|
|
0.0024147223687949193
|
|
),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
expect(scene).toRender([255, 0, 0, 255]);
|
|
});
|
|
});
|
|
|
|
it("gets underground color by distance", function () {
|
|
expect(globe.undergroundColorAlphaByDistance).toBeDefined();
|
|
});
|
|
|
|
it("sets underground color by distance", function () {
|
|
globe.baseColor = Color.BLACK;
|
|
globe.undergroundColor = Color.RED;
|
|
var radius = globe.ellipsoid.maximumRadius;
|
|
globe.undergroundColorAlphaByDistance = new NearFarScalar(
|
|
radius * 0.25,
|
|
0.0,
|
|
radius * 2.0,
|
|
1.0
|
|
);
|
|
|
|
scene.camera.setView({
|
|
destination: new Cartesian3(
|
|
-524251.65918537375,
|
|
-5316355.5357514685,
|
|
3400179.253223899
|
|
),
|
|
orientation: new HeadingPitchRoll(
|
|
0.24245689061958142,
|
|
-0.445653254172905,
|
|
0.0024147223687949193
|
|
),
|
|
});
|
|
|
|
return updateUntilDone(globe).then(function () {
|
|
expect(scene).toRenderAndCall(function (rgba) {
|
|
expect(rgba[0]).toBeGreaterThan(0);
|
|
expect(rgba[0]).toBeLessThan(255);
|
|
});
|
|
});
|
|
});
|
|
|
|
it("throws if underground color by distance far is less than near", function () {
|
|
expect(function () {
|
|
globe.undergroundColorAlphaByDistance = new NearFarScalar(
|
|
1.0,
|
|
0.0,
|
|
0.0,
|
|
1.0
|
|
);
|
|
}).toThrowDeveloperError();
|
|
});
|
|
},
|
|
"WebGL"
|
|
);
|