import { BoundingRectangle } from "../../Source/Cesium.js";
|
import { BoundingSphere } from "../../Source/Cesium.js";
|
import { Cartesian2 } from "../../Source/Cesium.js";
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
import { Color } from "../../Source/Cesium.js";
|
import { defined } from "../../Source/Cesium.js";
|
import { DistanceDisplayCondition } from "../../Source/Cesium.js";
|
import { JulianDate } from "../../Source/Cesium.js";
|
import { NearFarScalar } from "../../Source/Cesium.js";
|
import { BillboardGraphics } from "../../Source/Cesium.js";
|
import { BillboardVisualizer } from "../../Source/Cesium.js";
|
import { BoundingSphereState } from "../../Source/Cesium.js";
|
import { ConstantProperty } from "../../Source/Cesium.js";
|
import { EntityCluster } from "../../Source/Cesium.js";
|
import { EntityCollection } from "../../Source/Cesium.js";
|
import { HeightReference } from "../../Source/Cesium.js";
|
import { HorizontalOrigin } from "../../Source/Cesium.js";
|
import { VerticalOrigin } from "../../Source/Cesium.js";
|
import createGlobe from "../createGlobe.js";
|
import createScene from "../createScene.js";
|
import pollToPromise from "../pollToPromise.js";
|
|
describe(
|
"DataSources/BillboardVisualizer",
|
function () {
|
var scene;
|
var entityCluster;
|
var visualizer;
|
|
beforeAll(function () {
|
scene = createScene();
|
scene.globe = createGlobe();
|
});
|
|
afterAll(function () {
|
scene.destroyForSpecs();
|
});
|
|
beforeEach(function () {
|
entityCluster = new EntityCluster();
|
entityCluster._initialize(scene);
|
});
|
|
afterEach(function () {
|
if (defined(visualizer)) {
|
visualizer = visualizer.destroy();
|
}
|
entityCluster.destroy();
|
});
|
|
it("constructor throws if no entityCluster is passed.", function () {
|
expect(function () {
|
return new BillboardVisualizer();
|
}).toThrowDeveloperError();
|
});
|
|
it("update throws if no time specified.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
expect(function () {
|
visualizer.update();
|
}).toThrowDeveloperError();
|
});
|
|
it("isDestroy returns false until destroyed.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, 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();
|
var visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
expect(entityCollection.collectionChanged.numberOfListeners).toEqual(1);
|
visualizer.destroy();
|
expect(entityCollection.collectionChanged.numberOfListeners).toEqual(0);
|
});
|
|
it("object with no billboard does not create a billboard.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
visualizer.update(JulianDate.now());
|
expect(entityCluster._billboardCollection).not.toBeDefined();
|
});
|
|
it("object with no position does not create a billboard.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
billboard.show = new ConstantProperty(true);
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
|
visualizer.update(JulianDate.now());
|
expect(entityCluster._billboardCollection).not.toBeDefined();
|
});
|
|
it("object with no image does not create a billboard.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
billboard.show = new ConstantProperty(true);
|
|
visualizer.update(JulianDate.now());
|
expect(entityCluster._billboardCollection).not.toBeDefined();
|
});
|
|
it("A BillboardGraphics causes a Billboard to be created and updated.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
|
var time = JulianDate.now();
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
var bb;
|
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
billboard.show = new ConstantProperty(true);
|
billboard.color = new ConstantProperty(new Color(0.5, 0.5, 0.5, 0.5));
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
billboard.imageSubRegion = new ConstantProperty(
|
new BoundingRectangle(0, 0, 1, 1)
|
);
|
billboard.eyeOffset = new ConstantProperty(new Cartesian3(1.0, 2.0, 3.0));
|
billboard.scale = new ConstantProperty(12.5);
|
billboard.rotation = new ConstantProperty(1.5);
|
billboard.alignedAxis = new ConstantProperty(Cartesian3.UNIT_Z);
|
billboard.heightReference = new ConstantProperty(
|
HeightReference.CLAMP_TO_GROUND
|
);
|
billboard.horizontalOrigin = new ConstantProperty(HorizontalOrigin.RIGHT);
|
billboard.verticalOrigin = new ConstantProperty(VerticalOrigin.TOP);
|
billboard.pixelOffset = new ConstantProperty(new Cartesian2(3, 2));
|
billboard.width = new ConstantProperty(15);
|
billboard.height = new ConstantProperty(5);
|
billboard.scaleByDistance = new ConstantProperty(new NearFarScalar());
|
billboard.translucencyByDistance = new ConstantProperty(
|
new NearFarScalar()
|
);
|
billboard.pixelOffsetScaleByDistance = new ConstantProperty(
|
new NearFarScalar(1.0, 0.0, 3.0e9, 0.0)
|
);
|
billboard.sizeInMeters = new ConstantProperty(true);
|
billboard.distanceDisplayCondition = new ConstantProperty(
|
new DistanceDisplayCondition(10.0, 100.0)
|
);
|
billboard.disableDepthTestDistance = new ConstantProperty(10.0);
|
|
visualizer.update(time);
|
|
var billboardCollection = entityCluster._billboardCollection;
|
expect(billboardCollection.length).toEqual(1);
|
|
bb = billboardCollection.get(0);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return bb.show; //true once the image is loaded.
|
}).then(function () {
|
expect(bb.position).toEqual(testObject.position.getValue(time));
|
expect(bb.color).toEqual(testObject.billboard.color.getValue(time));
|
expect(bb.eyeOffset).toEqual(
|
testObject.billboard.eyeOffset.getValue(time)
|
);
|
expect(bb.scale).toEqual(testObject.billboard.scale.getValue(time));
|
expect(bb.rotation).toEqual(
|
testObject.billboard.rotation.getValue(time)
|
);
|
expect(bb.alignedAxis).toEqual(
|
testObject.billboard.alignedAxis.getValue(time)
|
);
|
expect(bb.heightReference).toEqual(
|
testObject.billboard.heightReference.getValue(time)
|
);
|
expect(bb.horizontalOrigin).toEqual(
|
testObject.billboard.horizontalOrigin.getValue(time)
|
);
|
expect(bb.verticalOrigin).toEqual(
|
testObject.billboard.verticalOrigin.getValue(time)
|
);
|
expect(bb.width).toEqual(testObject.billboard.width.getValue(time));
|
expect(bb.height).toEqual(testObject.billboard.height.getValue(time));
|
expect(bb.scaleByDistance).toEqual(
|
testObject.billboard.scaleByDistance.getValue(time)
|
);
|
expect(bb.translucencyByDistance).toEqual(
|
testObject.billboard.translucencyByDistance.getValue(time)
|
);
|
expect(bb.pixelOffsetScaleByDistance).toEqual(
|
testObject.billboard.pixelOffsetScaleByDistance.getValue(time)
|
);
|
expect(bb.sizeInMeters).toEqual(
|
testObject.billboard.sizeInMeters.getValue(time)
|
);
|
expect(bb.distanceDisplayCondition).toEqual(
|
testObject.billboard.distanceDisplayCondition.getValue(time)
|
);
|
expect(bb.disableDepthTestDistance).toEqual(
|
testObject.billboard.disableDepthTestDistance.getValue(time)
|
);
|
expect(bb._imageSubRegion).toEqual(
|
testObject.billboard.imageSubRegion.getValue(time)
|
);
|
|
billboard.show = new ConstantProperty(false);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return !bb.show;
|
});
|
});
|
});
|
|
it("Display billboard after toggling show", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
|
var time = JulianDate.now();
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
var bb;
|
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
billboard.show = new ConstantProperty(true);
|
billboard.color = new ConstantProperty(new Color(0.5, 0.5, 0.5, 0.5));
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
billboard.imageSubRegion = new ConstantProperty(
|
new BoundingRectangle(0, 0, 1, 1)
|
);
|
billboard.eyeOffset = new ConstantProperty(new Cartesian3(1.0, 2.0, 3.0));
|
billboard.scale = new ConstantProperty(12.5);
|
billboard.rotation = new ConstantProperty(1.5);
|
billboard.alignedAxis = new ConstantProperty(Cartesian3.UNIT_Z);
|
billboard.heightReference = new ConstantProperty(
|
HeightReference.CLAMP_TO_GROUND
|
);
|
billboard.horizontalOrigin = new ConstantProperty(HorizontalOrigin.RIGHT);
|
billboard.verticalOrigin = new ConstantProperty(VerticalOrigin.TOP);
|
billboard.pixelOffset = new ConstantProperty(new Cartesian2(3, 2));
|
billboard.width = new ConstantProperty(15);
|
billboard.height = new ConstantProperty(5);
|
billboard.scaleByDistance = new ConstantProperty(new NearFarScalar());
|
billboard.translucencyByDistance = new ConstantProperty(
|
new NearFarScalar()
|
);
|
billboard.pixelOffsetScaleByDistance = new ConstantProperty(
|
new NearFarScalar(1.0, 0.0, 3.0e9, 0.0)
|
);
|
billboard.sizeInMeters = new ConstantProperty(true);
|
billboard.distanceDisplayCondition = new ConstantProperty(
|
new DistanceDisplayCondition(10.0, 100.0)
|
);
|
billboard.disableDepthTestDistance = new ConstantProperty(10.0);
|
|
visualizer.update(time);
|
|
var billboardCollection = entityCluster._billboardCollection;
|
expect(billboardCollection.length).toEqual(1);
|
|
bb = billboardCollection.get(0);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return bb.show; //true once the image is loaded.
|
}).then(function () {
|
billboard.show = new ConstantProperty(false);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return !bb.show;
|
}).then(function () {
|
billboard.show = new ConstantProperty(true);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return bb.show;
|
}).then(function () {
|
expect(bb.position).toEqual(testObject.position.getValue(time));
|
expect(bb.color).toEqual(testObject.billboard.color.getValue(time));
|
expect(bb.eyeOffset).toEqual(
|
testObject.billboard.eyeOffset.getValue(time)
|
);
|
expect(bb.scale).toEqual(testObject.billboard.scale.getValue(time));
|
expect(bb.rotation).toEqual(
|
testObject.billboard.rotation.getValue(time)
|
);
|
expect(bb.alignedAxis).toEqual(
|
testObject.billboard.alignedAxis.getValue(time)
|
);
|
expect(bb.heightReference).toEqual(
|
testObject.billboard.heightReference.getValue(time)
|
);
|
expect(bb.horizontalOrigin).toEqual(
|
testObject.billboard.horizontalOrigin.getValue(time)
|
);
|
expect(bb.verticalOrigin).toEqual(
|
testObject.billboard.verticalOrigin.getValue(time)
|
);
|
expect(bb.width).toEqual(testObject.billboard.width.getValue(time));
|
expect(bb.height).toEqual(
|
testObject.billboard.height.getValue(time)
|
);
|
expect(bb.scaleByDistance).toEqual(
|
testObject.billboard.scaleByDistance.getValue(time)
|
);
|
expect(bb.translucencyByDistance).toEqual(
|
testObject.billboard.translucencyByDistance.getValue(time)
|
);
|
expect(bb.pixelOffsetScaleByDistance).toEqual(
|
testObject.billboard.pixelOffsetScaleByDistance.getValue(time)
|
);
|
expect(bb.sizeInMeters).toEqual(
|
testObject.billboard.sizeInMeters.getValue(time)
|
);
|
expect(bb.distanceDisplayCondition).toEqual(
|
testObject.billboard.distanceDisplayCondition.getValue(time)
|
);
|
expect(bb.disableDepthTestDistance).toEqual(
|
testObject.billboard.disableDepthTestDistance.getValue(time)
|
);
|
expect(bb.image).toBeDefined();
|
expect(bb._imageSubRegion).toEqual(
|
testObject.billboard.imageSubRegion.getValue(time)
|
);
|
});
|
});
|
});
|
});
|
|
it("Reuses primitives when hiding one and showing another", function () {
|
var time = JulianDate.now();
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
testObject.billboard = new BillboardGraphics();
|
testObject.billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
testObject.billboard.show = new ConstantProperty(true);
|
|
visualizer.update(time);
|
|
var billboardCollection = entityCluster._billboardCollection;
|
expect(billboardCollection.length).toEqual(1);
|
|
testObject.billboard.show = new ConstantProperty(false);
|
|
visualizer.update(time);
|
|
expect(billboardCollection.length).toEqual(1);
|
|
var testObject2 = entityCollection.getOrCreateEntity("test2");
|
testObject2.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
testObject2.billboard = new BillboardGraphics();
|
testObject2.billboard.image = new ConstantProperty(
|
"Data/Images/Blue.png"
|
);
|
testObject2.billboard.show = new ConstantProperty(true);
|
|
visualizer.update(time);
|
expect(billboardCollection.length).toEqual(1);
|
});
|
|
it("clear hides billboards.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
|
var time = JulianDate.now();
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
billboard.show = new ConstantProperty(true);
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
visualizer.update(time);
|
|
var billboardCollection = entityCluster._billboardCollection;
|
expect(billboardCollection.length).toEqual(1);
|
var bb = billboardCollection.get(0);
|
|
return pollToPromise(function () {
|
visualizer.update(time);
|
return bb.show;
|
}).then(function () {
|
//Clearing won't actually remove the billboard because of the
|
//internal cache used by the visualizer, instead it just hides it.
|
entityCollection.removeAll();
|
expect(bb.show).toEqual(false);
|
expect(bb.id).toBeUndefined();
|
});
|
});
|
|
it("Visualizer sets entity property.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
var time = JulianDate.now();
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
billboard.show = new ConstantProperty(true);
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
visualizer.update(time);
|
|
var billboardCollection = entityCluster._billboardCollection;
|
expect(billboardCollection.length).toEqual(1);
|
var bb = billboardCollection.get(0);
|
expect(bb.id).toEqual(testObject);
|
});
|
|
it("Computes bounding sphere.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
|
var testObject = entityCollection.getOrCreateEntity("test");
|
var time = JulianDate.now();
|
var billboard = (testObject.billboard = new BillboardGraphics());
|
|
testObject.position = new ConstantProperty(
|
new Cartesian3(1234, 5678, 9101112)
|
);
|
billboard.show = new ConstantProperty(true);
|
billboard.image = new ConstantProperty("Data/Images/Blue.png");
|
visualizer.update(time);
|
|
var result = new BoundingSphere();
|
var state = visualizer.getBoundingSphere(testObject, result);
|
|
expect(state).toBe(BoundingSphereState.DONE);
|
expect(result.center).toEqual(testObject.position.getValue());
|
expect(result.radius).toEqual(0);
|
});
|
|
it("Fails bounding sphere for entity without billboard.", function () {
|
var entityCollection = new EntityCollection();
|
var testObject = entityCollection.getOrCreateEntity("test");
|
visualizer = new BillboardVisualizer(entityCluster, entityCollection);
|
visualizer.update(JulianDate.now());
|
var result = new BoundingSphere();
|
var state = visualizer.getBoundingSphere(testObject, result);
|
expect(state).toBe(BoundingSphereState.FAILED);
|
});
|
|
it("Compute bounding sphere throws without entity.", function () {
|
var entityCollection = new EntityCollection();
|
visualizer = new BillboardVisualizer(entityCluster, 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 BillboardVisualizer(entityCluster, entityCollection);
|
expect(function () {
|
visualizer.getBoundingSphere(testObject, undefined);
|
}).toThrowDeveloperError();
|
});
|
},
|
"WebGL"
|
);
|