DSDSServer2024/build/build.20240805/static/js/Cesium-1.53/Specs/DataSources/BillboardVisualizerSpec.js

419 lines
19 KiB
JavaScript
Raw Normal View History

defineSuite([
'DataSources/BillboardVisualizer',
'Core/BoundingRectangle',
'Core/BoundingSphere',
'Core/Cartesian2',
'Core/Cartesian3',
'Core/Color',
'Core/defined',
'Core/DistanceDisplayCondition',
'Core/JulianDate',
'Core/NearFarScalar',
'DataSources/BillboardGraphics',
'DataSources/BoundingSphereState',
'DataSources/ConstantProperty',
'DataSources/EntityCluster',
'DataSources/EntityCollection',
'Scene/HeightReference',
'Scene/HorizontalOrigin',
'Scene/VerticalOrigin',
'Specs/createGlobe',
'Specs/createScene',
'Specs/pollToPromise'
], function(
BillboardVisualizer,
BoundingRectangle,
BoundingSphere,
Cartesian2,
Cartesian3,
Color,
defined,
DistanceDisplayCondition,
JulianDate,
NearFarScalar,
BillboardGraphics,
BoundingSphereState,
ConstantProperty,
EntityCluster,
EntityCollection,
HeightReference,
HorizontalOrigin,
VerticalOrigin,
createGlobe,
createScene,
pollToPromise) {
'use strict';
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');