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.

276 lines
10 KiB
JavaScript

import { BoundingSphere } from "../../Source/Cesium.js";
import { Cartesian3 } from "../../Source/Cesium.js";
import { defined } from "../../Source/Cesium.js";
import { JulianDate } from "../../Source/Cesium.js";
import { Matrix4 } from "../../Source/Cesium.js";
import { Resource } from "../../Source/Cesium.js";
import { BoundingSphereState } from "../../Source/Cesium.js";
import { ConstantPositionProperty } from "../../Source/Cesium.js";
import { ConstantProperty } from "../../Source/Cesium.js";
import { EntityCollection } from "../../Source/Cesium.js";
import { Cesium3DTilesetGraphics } from "../../Source/Cesium.js";
import { Cesium3DTilesetVisualizer } from "../../Source/Cesium.js";
import { Globe } from "../../Source/Cesium.js";
import createScene from "../createScene.js";
import pollToPromise from "../pollToPromise.js";
describe(
"DataSources/Cesium3DTilesetVisualizer",
function () {
var tilesetUrl = "./Data/Cesium3DTiles/Batched/BatchedColors/tileset.json";
var scene;
var visualizer;
beforeAll(function () {
scene = createScene();
scene.globe = new Globe();
});
afterAll(function () {
scene.destroyForSpecs();
});
afterEach(function () {
if (defined(visualizer)) {
visualizer = visualizer.destroy();
}
});
it("constructor throws if no scene is passed.", function () {
expect(function () {
return new Cesium3DTilesetVisualizer();
}).toThrowDeveloperError();
});
it("update throws if no time specified.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
expect(function () {
visualizer.update();
}).toThrowDeveloperError();
});
it("isDestroy returns false until destroyed.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
expect(visualizer.isDestroyed()).toEqual(false);
visualizer.destroy();
expect(visualizer.isDestroyed()).toEqual(true);
visualizer = undefined;
});
it("removes the listener from the entity collection when destroyed", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
expect(entityCollection.collectionChanged.numberOfListeners).toEqual(1);
visualizer.destroy();
expect(entityCollection.collectionChanged.numberOfListeners).toEqual(0);
visualizer = undefined;
});
it("object with no model does not create one.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var testObject = entityCollection.getOrCreateEntity("test");
testObject.position = new ConstantProperty(
new Cartesian3(1234, 5678, 9101112)
);
visualizer.update(JulianDate.now());
expect(scene.primitives.length).toEqual(0);
});
it("object with no position does not set modelMatrix.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var testObject = entityCollection.getOrCreateEntity("test");
var tileset = (testObject.tileset = new Cesium3DTilesetGraphics());
tileset.uri = new ConstantProperty(tilesetUrl);
visualizer.update(JulianDate.now());
var tilesetPrimitive = scene.primitives.get(0);
expect(tilesetPrimitive.modelMatrix).toEqual(Matrix4.IDENTITY);
});
it("A Cesium3DTilesetGraphics causes a primitive to be created and updated.", function () {
var time = JulianDate.now();
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var tileset = new Cesium3DTilesetGraphics();
tileset.show = new ConstantProperty(true);
tileset.maximumScreenSpaceError = new ConstantProperty(24.0);
tileset.uri = new ConstantProperty(tilesetUrl);
var testObject = entityCollection.getOrCreateEntity("test");
testObject.position = new ConstantPositionProperty(
Cartesian3.fromDegrees(1, 2, 3)
);
testObject.tileset = tileset;
visualizer.update(time);
expect(scene.primitives.length).toEqual(1);
var primitive = scene.primitives.get(0);
visualizer.update(time);
expect(primitive.show).toEqual(true);
expect(primitive.maximumScreenSpaceError).toEqual(24.0);
});
it("A Cesium3DTilesetGraphics with a Resource causes a primitive to be created.", function () {
var time = JulianDate.now();
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var tileset = new Cesium3DTilesetGraphics();
tileset.show = new ConstantProperty(true);
tileset.uri = new ConstantProperty(
new Resource({
url: tilesetUrl,
})
);
var testObject = entityCollection.getOrCreateEntity("test");
testObject.position = new ConstantPositionProperty(
Cartesian3.fromDegrees(1, 2, 3)
);
testObject.tileset = tileset;
visualizer.update(time);
expect(scene.primitives.length).toEqual(1);
});
it("removing removes primitives.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var tileset = new Cesium3DTilesetGraphics();
tileset.uri = new ConstantProperty(tilesetUrl);
var time = JulianDate.now();
var testObject = entityCollection.getOrCreateEntity("test");
testObject.position = new ConstantProperty(
new Cartesian3(5678, 1234, 1101112)
);
testObject.tileset = tileset;
visualizer.update(time);
expect(scene.primitives.length).toEqual(1);
visualizer.update(time);
entityCollection.removeAll();
visualizer.update(time);
expect(scene.primitives.length).toEqual(0);
});
it("Visualizer sets id property.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var time = JulianDate.now();
var testObject = entityCollection.getOrCreateEntity("test");
var tileset = new Cesium3DTilesetGraphics();
testObject.tileset = tileset;
testObject.position = new ConstantProperty(
new Cartesian3(5678, 1234, 1101112)
);
tileset.uri = new ConstantProperty(tilesetUrl);
visualizer.update(time);
var tilesetPrimitive = scene.primitives.get(0);
expect(tilesetPrimitive.id).toEqual(testObject);
});
it("Computes bounding sphere.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var time = JulianDate.now();
var testObject = entityCollection.getOrCreateEntity("test");
var tileset = new Cesium3DTilesetGraphics();
testObject.tileset = tileset;
testObject.position = new ConstantProperty(
new Cartesian3(5678, 1234, 1101112)
);
tileset.uri = new ConstantProperty(tilesetUrl);
visualizer.update(time);
var tilesetPrimitive = scene.primitives.get(0);
var result = new BoundingSphere();
var state = visualizer.getBoundingSphere(testObject, result);
expect(state).toBe(BoundingSphereState.PENDING);
return pollToPromise(function () {
scene.render();
state = visualizer.getBoundingSphere(testObject, result);
return state !== BoundingSphereState.PENDING;
}).then(function () {
expect(state).toBe(BoundingSphereState.DONE);
expect(result).toEqual(tilesetPrimitive.boundingSphere);
});
});
it("Fails bounding sphere for entity without tileset.", function () {
var entityCollection = new EntityCollection();
var testObject = entityCollection.getOrCreateEntity("test");
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
visualizer.update(JulianDate.now());
var result = new BoundingSphere();
var state = visualizer.getBoundingSphere(testObject, result);
expect(state).toBe(BoundingSphereState.FAILED);
});
it("Fails bounding sphere when model fails to load.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var time = JulianDate.now();
var testObject = entityCollection.getOrCreateEntity("test");
var tileset = new Cesium3DTilesetGraphics();
testObject.tileset = tileset;
testObject.position = new ConstantProperty(
new Cartesian3(5678, 1234, 1101112)
);
tileset.uri = new ConstantProperty("/path/to/incorrect/file");
visualizer.update(time);
var result = new BoundingSphere();
var state = visualizer.getBoundingSphere(testObject, result);
expect(state).toBe(BoundingSphereState.PENDING);
return pollToPromise(function () {
scene.render();
state = visualizer.getBoundingSphere(testObject, result);
return state !== BoundingSphereState.PENDING;
}).then(function () {
expect(state).toBe(BoundingSphereState.FAILED);
});
});
it("Compute bounding sphere throws without entity.", function () {
var entityCollection = new EntityCollection();
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
var result = new BoundingSphere();
expect(function () {
visualizer.getBoundingSphere(undefined, result);
}).toThrowDeveloperError();
});
it("Compute bounding sphere throws without result.", function () {
var entityCollection = new EntityCollection();
var testObject = entityCollection.getOrCreateEntity("test");
visualizer = new Cesium3DTilesetVisualizer(scene, entityCollection);
expect(function () {
visualizer.getBoundingSphere(testObject, undefined);
}).toThrowDeveloperError();
});
},
"WebGL"
);