DSDSWeb/static/js/Cesium-1.53/Specs/Scene/PolylineCollectionSpec.js

1662 lines
45 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'Scene/PolylineCollection',
'Core/BoundingSphere',
'Core/Cartesian3',
'Core/Color',
'Core/DistanceDisplayCondition',
'Core/HeadingPitchRange',
'Core/Math',
'Core/Matrix4',
'Scene/Camera',
'Scene/Material',
'Scene/SceneMode',
'Specs/createScene'
], function(
PolylineCollection,
BoundingSphere,
Cartesian3,
Color,
DistanceDisplayCondition,
HeadingPitchRange,
CesiumMath,
Matrix4,
Camera,
Material,
SceneMode,
createScene) {
'use strict';
var scene;
var polylines;
beforeAll(function() {
scene = createScene();
scene.primitives.destroyPrimitives = false;
});
afterAll(function() {
scene.destroyForSpecs();
});
beforeEach(function() {
polylines = new PolylineCollection();
scene.mode = SceneMode.SCENE3D;
scene.camera = new Camera(scene);
});
afterEach(function() {
scene.primitives.removeAll();
if (!polylines.isDestroyed()) {
polylines.removeAll();
polylines.destroy();
}
});
it('default constructs a polyline', function() {
var p = polylines.add();
expect(p.show).toEqual(true);
expect(p.positions.length).toEqual(0);
expect(p.width).toEqual(1.0);
expect(p.material.uniforms.color).toEqual(new Color(1.0, 1.0, 1.0, 1.0));
expect(p.id).not.toBeDefined();
expect(p.loop).toEqual(false);
});
it('explicitly constructs a polyline', function() {
var material = Material.fromType(Material.PolylineOutlineType);
var p = polylines.add({
show : false,
positions : [new Cartesian3(1.0, 2.0, 3.0), new Cartesian3(4.0, 5.0, 6.0), new Cartesian3(7.0, 8.0, 9.0)],
loop : true,
width : 2,
material : material,
id : 'id'
});
expect(p.show).toEqual(false);
expect(p.positions[0]).toEqual(new Cartesian3(1.0, 2.0, 3.0));
expect(p.positions[1]).toEqual(new Cartesian3(4.0, 5.0, 6.0));
expect(p.positions[2]).toEqual(new Cartesian3(7.0, 8.0, 9.0));
expect(p.positions.length).toEqual(3);
expect(p.loop).toEqual(true);
expect(p.width).toEqual(2);
expect(p.material.uniforms.color).toEqual(material.uniforms.color);
expect(p.material.uniforms.outlineColor).toEqual(material.uniforms.outlineColor);
expect(p.material.uniforms.outlineWidth).toEqual(material.uniforms.outlineWidth);
expect(p.id).toEqual('id');
});
it('sets polyline properties', function() {
var material = Material.fromType(Material.PolylineOutlineType);
var p = polylines.add();
p.show = false;
p.positions = [new Cartesian3(1.0, 2.0, 3.0), new Cartesian3(4.0, 5.0, 6.0), new Cartesian3(7.0, 8.0, 9.0)];
p.loop = true;
p.width = 2;
p.material = material;
expect(p.show).toEqual(false);
expect(p.positions[0]).toEqual(new Cartesian3(1.0, 2.0, 3.0));
expect(p.positions[1]).toEqual(new Cartesian3(4.0, 5.0, 6.0));
expect(p.positions[2]).toEqual(new Cartesian3(7.0, 8.0, 9.0));
expect(p.positions.length).toEqual(3);
expect(p.loop).toEqual(true);
expect(p.width).toEqual(2);
expect(p.material.uniforms.color).toEqual(material.uniforms.color);
expect(p.material.uniforms.outlineColor).toEqual(material.uniforms.outlineColor);
expect(p.material.uniforms.outlineWidth).toEqual(material.uniforms.outlineWidth);
});
it('constructor sets loop only when number of positions is greater than 2', function() {
var p = polylines.add({
positions : [new Cartesian3(0.0, 1.0, 2.0), new Cartesian3(3.0, 4.0, 5.0)],
loop : true
});
expect(p.positions.length).toEqual(2);
});
it('sets loop only when number of positions is greater than 2', function() {
var p = polylines.add({
positions : [new Cartesian3(0.0, 1.0, 2.0), new Cartesian3(3.0, 4.0, 5.0)]
});
p.loop = true;
expect(p.positions.length).toEqual(2);
});
it('sets removed polyline properties', function() {
var p = polylines.add();
polylines.remove(p);
p.show = false;
expect(p.show).toEqual(false);
});
it('has zero polylines when constructed', function() {
expect(polylines.length).toEqual(0);
});
it('adds a polyline', function() {
var p = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(1);
expect(polylines.get(0) === p).toEqual(true);
});
it('removes the first polyline', function() {
var one = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
var two = polylines.add({
positions : [{
x : 4.0,
y : 5.0,
z : 6.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(2);
expect(polylines.remove(one)).toEqual(true);
expect(polylines.length).toEqual(1);
expect(polylines.get(0) === two).toEqual(true);
});
it('removes the last polyline', function() {
var one = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
var two = polylines.add({
positions : [{
x : 4.0,
y : 5.0,
z : 6.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(2);
expect(polylines.remove(two)).toEqual(true);
expect(polylines.length).toEqual(1);
expect(polylines.get(0) === one).toEqual(true);
});
it('removes the same polyline twice', function() {
var p = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(1);
expect(polylines.remove(p)).toEqual(true);
expect(polylines.length).toEqual(0);
expect(polylines.remove(p)).toEqual(false);
expect(polylines.length).toEqual(0);
});
it('returns false when removing undefined', function() {
polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
}, {
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(1);
expect(polylines.remove(undefined)).toEqual(false);
expect(polylines.length).toEqual(1);
});
it('adds and removes polylines', function() {
var one = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
var two = polylines.add({
positions : [{
x : 4.0,
y : 5.0,
z : 6.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(2);
expect(polylines.get(0) === one).toEqual(true);
expect(polylines.get(1) === two).toEqual(true);
expect(polylines.remove(two)).toEqual(true);
var three = polylines.add({
positions : [{
x : 7.0,
y : 8.0,
z : 9.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(2);
expect(polylines.get(0) === one).toEqual(true);
expect(polylines.get(1) === three).toEqual(true);
});
it('removes all polylines', function() {
polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
polylines.add({
positions : [{
x : 4.0,
y : 5.0,
z : 6.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
expect(polylines.length).toEqual(2);
polylines.removeAll();
expect(polylines.length).toEqual(0);
});
it('removes a polyline from the updated list when removed', function() {
var firstPolyline = polylines.add();
var secondPolyline = polylines.add();
firstPolyline.width = 4;
secondPolyline.width = 5;
expect(polylines._polylinesToUpdate.length).toEqual(2);
polylines.remove(secondPolyline);
expect(polylines._polylinesToUpdate.length).toEqual(1);
});
it('only adds polyline to the update list once', function() {
var firstPolyline = polylines.add();
var secondPolyline = polylines.add();
firstPolyline.width = 4;
secondPolyline.width = 5;
secondPolyline.width = 7;
expect(polylines._polylinesToUpdate.length).toEqual(2);
polylines.remove(secondPolyline);
expect(polylines._polylinesToUpdate.length).toEqual(1);
});
it('can check if it contains a polyline', function() {
var polyline = polylines.add();
expect(polylines.contains(polyline)).toEqual(true);
});
it('returns false when checking if it contains a polyline it does not contain', function() {
var polyline = polylines.add();
polylines.remove(polyline);
expect(polylines.contains(polyline)).toEqual(false);
});
it('does not contain undefined', function() {
expect(polylines.contains(undefined)).toEqual(false);
});
it('does not contain random other objects', function() {
expect(polylines.contains({})).toEqual(false);
expect(polylines.contains(new Cartesian3())).toEqual(false);
});
it('does not render when constructed', function() {
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).toRender([0, 0, 0, 255]);
});
it('renders polylines. one polyline with no positions', function() {
var positions = [];
for (var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
polylines.add();
polylines.add({
positions: positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('does not crash if polyline has one position', function() {
polylines.add({
positions : [{
x : 1647745.6656519484,
y : 4949018.87918947,
z : 3661524.164064342
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).toRender([0, 0, 0, 255]);
});
it('renders polylines with duplicate positions at construction', function() {
polylines.add({
positions : [
new Cartesian3(0.0, -1000000.0, 0.0),
new Cartesian3(0.0, 1000000.0, 0.0),
new Cartesian3(0.0, 1000000.0, 0.0),
new Cartesian3(0.0, 2000000.0, 0.0)
]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders polylines with duplicate positions after setting positions', function() {
var p = polylines.add();
p.positions = [
new Cartesian3(0.0, -1000000.0, 0.0),
new Cartesian3(0.0, 1000000.0, 0.0),
new Cartesian3(0.0, 1000000.0, 0.0),
new Cartesian3(0.0, 2000000.0, 0.0)
];
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('A polyline that used to cross the IDL but now does not, triggers vertex creation (This code used to crash)', function() {
//Need to be in 2D or CV
scene.mode = SceneMode.SCENE2D;
//These positions cross the IDL
var positions = [];
positions.push({
x : 12163600,
y : -47362500,
z : 40812700
});
positions.push({
x : -50442500,
y : 83936900,
z : 37992500
});
//Create a line
var line = polylines.add({
positions : positions
});
//Render it
scene.primitives.add(polylines);
scene.render();
//We need to set positions and render it again
//in order for BufferUsage.STREAM_DRAW to be
//triggered, which ends up rebuilding vertex arrays.
line.positions = positions;
scene.render();
//Now set the second position which results in a line that does not cross the IDL
positions[1] = {
x : 19616100,
y : -46499100,
z : 38870500
};
line.positions = positions;
//Render the new line. The fact that the new position no longer crosses the IDL
//is what triggers the vertex array creation. If the vertex array were not
//recreaated, an exception would be thrown do to positions having less data then expected.
scene.render();
});
it('renders 64K vertices of same polyline', function() {
var positions = [];
for ( var i = 0; i < CesiumMath.SIXTY_FOUR_KILOBYTES / 2; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('creates two vertex arrays and renders', function() {
var positions = [];
for ( var i = 0; i < CesiumMath.SIXTY_FOUR_KILOBYTES / 2; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
var p1 = polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p1.show = false;
expect(scene).toRender([0, 0, 0, 255]);
polylines.add({
positions : positions
});
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders more than 64K vertices of same polyline', function() {
var positions = [];
for ( var i = 0; i < CesiumMath.SIXTY_FOUR_KILOBYTES; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders a polyline with no positions', function() {
var positions = [];
for ( var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.add({
positions : []
});
scene.primitives.removeAll();
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders an updated polyline with no positions using set positions', function() {
var positions = [];
for ( var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
var p2 = polylines.add({
positions : []
});
expect(scene).notToRender([0, 0, 0, 255]);
//recreates vertex array because buffer usage changed
p2.positions = [];
expect(scene).notToRender([0, 0, 0, 255]);
//should call PolylineCollection.writePositionsUpdate
p2.positions = [];
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders an updated polyline with no positions using show', function() {
var positions = [];
for ( var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
var p2 = polylines.add({
positions : []
});
expect(scene).notToRender([0, 0, 0, 255]);
//recreates vertex array because buffer usage changed
p2.show = false;
expect(scene).notToRender([0, 0, 0, 255]);
//should call PolylineCollection.writeMiscUpdate
p2.show = true;
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders an updated polyline with no positions using material', function() {
var positions = [];
for ( var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
var p2 = polylines.add({
positions : []
});
expect(scene).notToRender([0, 0, 0, 255]);
//recreates vertex array because buffer usage changed
p2.material = Material.fromType(Material.PolylineOutlineType);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('changes buffer usage after 100 iterations of not changing', function() {
var positions = [];
for ( var i = 0; i < 100; ++i) {
positions.push({
x : 0,
y : -1000000,
z : 0
});
positions.push({
x : 0,
y : 1000000,
z : 0
});
}
var p = polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
// changes buffer usage, recreates vertex arrays
p.positions = positions;
for(var j = 0; j < 101; ++j){
scene.render();
}
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders more than 64K vertices of different polylines', function() {
var positions = [];
for ( var i = 0; i < CesiumMath.SIXTY_FOUR_KILOBYTES; ++i) {
positions.push({
x : -1000000,
y : -1000000,
z : 0
});
positions.push({
x : -1000000,
y : 1000000,
z : 0
});
}
polylines.add({
positions : positions
});
polylines.add({
positions : [{
x : 0,
y : -1000000,
z : 0
},{
x : 0,
y : 1000000,
z : 0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders bounding volume with debugShowBoundingVolume', function() {
polylines.debugShowBoundingVolume = true;
var material = Material.fromType('Color');
material.uniforms.color = new Color(1.0, 1.0, 1.0, 0.0);
var p = polylines.add({
positions : [{
x : 1.0,
y : -1000.0,
z : 1.0
},{
x : 1.0,
y : 1000.00,
z : 1.0
}],
material : material
});
var bounds = BoundingSphere.fromPoints(p.positions);
scene.camera.viewBoundingSphere(bounds);
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('does not render', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p.show = false;
expect(scene).toRender([0, 0, 0, 255]);
});
it('modifies and removes a polyline, then renders', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.remove(p);
expect(scene).toRender([0, 0, 0, 255]);
});
it('renders a green polyline', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('adds and renders a polyline', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.add({
positions : [{
x : 500000.0,
y : -1000000.0,
z : 0.0
}, {
x : 500000.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).notToRender([0, 0, 0, 255]);
});
it('removes and renders a polyline', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
var bluePolyline = polylines.add({
positions : [{
x : 500000.0,
y : -1000000.0,
z : 0.0
}, {
x : 500000.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.remove(bluePolyline);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('removes all polylines and renders', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.removeAll();
expect(scene).toRender([0, 0, 0, 255]);
});
it('removes all polylines, adds a polyline, and renders', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
polylines.removeAll();
expect(scene).toRender([0, 0, 0, 255]);
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders using polyline positions property', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p.positions = [{
x : 0.0,
y : -1000000.0,
z : -2000000.0
}, {
x : 0.0,
y : 1000000.0,
z : -2000000.0
}]; // Behind viewer
expect(scene).toRender([0, 0, 0, 255]);
p.positions = [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]; // Back in front of viewer
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders and updates one polyline from many polylines using show property', function() {
var positions = [{
x : 0.0,
y : -1000000.0,
z : -2000000.0
}, {
x : 0.0,
y : 1000000.0,
z : -2000000.0
}];
polylines.add({
positions : positions,
width : 2
});
polylines.add({
positions : positions,
width : 2
});
polylines.add({
positions : positions,
width : 2
});
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
width : 2
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p.show = false;
expect(scene).toRender([0, 0, 0, 255]);
p.show = true;
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders using polyline show property', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
show:true
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p.show = false;
expect(scene).toRender([0, 0, 0, 255]);
p.show = true;
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders four polylines with different widths', function() {
var positions = [];
for(var i = 0; i < 200; ++i){
positions.push({
x : -1000000.0,
y : 1000000.0,
z : 0.0
},{
x : -1000000.0,
y : -1000000.0,
z : 0.0
});
}
polylines.add({
positions : positions,
width : 3
});
polylines.add({
positions : positions,
width : 1
});
polylines.add({
positions : positions,
width : 2
});
polylines.add({
positions : [{
x : 0.0,
y : -1.0,
z : 0.0
}, {
x : 0.0,
y : 1.0,
z : 0.0
}],
width : 7
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders three polylines with different widths and updates one', function() {
var positions = [];
for(var i = 0; i < 200; ++i){
positions.push({
x : -1000000.0,
y : 1000000.0,
z : 0.0
},{
x : -1000000.0,
y : -1000000.0,
z : 0.0
});
}
polylines.add({
positions : positions,
width : 3
});
polylines.add({
positions : positions,
width : 4
});
var p2 = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
width : 7
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p2.material = Material.fromType(Material.PolylineOutlineType);
expect(scene).notToRender([0, 0, 0, 255]);
p2.material = Material.fromType(Material.ColorType);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('does not render with width 0.0', function() {
var line = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
width : 7
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
line.width = 0.0;
expect(scene).toRender([0, 0, 0, 255]);
});
it('renders with a distance display condition', function() {
var near = 100.0;
var far = 10000.0;
var line = polylines.add({
positions : [{
x : 10.0,
y : -10.0,
z : 0.0
}, {
x : 10.0,
y : 10.0,
z : 0.0
}],
width : 7,
distanceDisplayCondition : new DistanceDisplayCondition(near, far)
});
scene.primitives.add(polylines);
scene.renderForSpecs();
var boundingSphere = line._boundingVolumeWC;
var center = boundingSphere.center;
var radius = boundingSphere.radius;
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + near - 10.0));
expect(scene).toRender([0, 0, 0, 255]);
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + near + 1.0));
expect(scene).notToRender([0, 0, 0, 255]);
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + far + 10.0));
expect(scene).toRender([0, 0, 0, 255]);
});
it('renders with a distance display condition after creation', function() {
var near = 100.0;
var far = 10000.0;
var line = polylines.add({
positions : [{
x : 10.0,
y : -10.0,
z : 0.0
}, {
x : 10.0,
y : 10.0,
z : 0.0
}],
width : 7
});
scene.primitives.add(polylines);
scene.renderForSpecs();
line.distanceDisplayCondition = new DistanceDisplayCondition(near, far);
var boundingSphere = line._boundingVolumeWC;
var center = boundingSphere.center;
var radius = boundingSphere.radius;
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + near - 10.0));
expect(scene).toRender([0, 0, 0, 255]);
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + near + 1.0));
expect(scene).notToRender([0, 0, 0, 255]);
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -CesiumMath.PI_OVER_TWO, radius + far + 10.0));
expect(scene).toRender([0, 0, 0, 255]);
});
it('changes polyline position size recreates vertex arrays', function() {
var positions = [];
for(var i = 0; i < 20; ++i){
positions.push({
x : 0.0,
y : 1000000.0,
z : 0.0
},{
x : 0.0,
y : -1000000.0,
z : 0.0
});
}
var p = polylines.add({
positions : positions
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p.positions = positions;
expect(scene).notToRender([0, 0, 0, 255]);
positions.push({
x : 0.0,
y : 1000000.0,
z : 0.0
});
p.positions = positions;
expect(scene).notToRender([0, 0, 0, 255]);
});
it('changes polyline width property', function() {
var p1 = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
var p2 = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).notToRender([0, 0, 0, 255]);
p1.width = 2;
expect(scene).notToRender([0, 0, 0, 255]);
p2.width = 2;
expect(scene).notToRender([0, 0, 0, 255]);
p1.width = 1;
expect(scene).notToRender([0, 0, 0, 255]);
});
it('renders with model matrix', function() {
polylines.add({
positions : [{
x : 0.0,
y : 0.0,
z : 0.0
}, {
x : 0.0,
y : 1.0,
z : 0.0
}]
});
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(polylines);
expect(scene).toRender([0, 0, 0, 255]);
polylines.modelMatrix = Matrix4.fromUniformScale(1000000.0, polylines.modelMatrix);
expect(scene).notToRender([0, 0, 0, 255]);
});
it('is picked', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
id : 'id'
});
scene.primitives.add(polylines);
expect(scene).toPickAndCall(function(result) {
expect(result.primitive).toEqual(p);
expect(result.id).toEqual('id');
});
});
it('can change pick id', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
id : 'id'
});
scene.primitives.add(polylines);
expect(scene).toPickAndCall(function(result) {
expect(result.primitive).toEqual(p);
expect(result.id).toEqual('id');
});
p.id = 'id2';
expect(scene).toPickAndCall(function(result) {
expect(result.primitive).toEqual(p);
expect(result.id).toEqual('id2');
});
});
it('is not picked (show === false)', function() {
polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}],
show : false
});
scene.primitives.add(polylines);
expect(scene).notToPick();
});
it('is not picked (alpha === 0.0)', function() {
var p = polylines.add({
positions : [{
x : 0.0,
y : -1000000.0,
z : 0.0
}, {
x : 0.0,
y : 1000000.0,
z : 0.0
}]
});
p.material.uniforms.color.alpha = 0.0;
scene.primitives.add(polylines);
expect(scene).notToPick();
});
it('does not equal undefined', function() {
var polyline = polylines.add();
expect(polyline).not.toEqual(undefined);
});
it('throws when accessing without an index', function() {
expect(function() {
polylines.get();
}).toThrowDeveloperError();
});
it('computes bounding sphere in 3D', function() {
var one = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
var two = polylines.add({
positions : [{
x : 4.0,
y : 5.0,
z : 6.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
var three = polylines.add({
positions : [{
x : 7.0,
y : 8.0,
z : 9.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
scene.primitives.add(polylines);
scene.render();
var boundingVolume = scene.frameState.commandList[0].boundingVolume;
expect(one._boundingVolume).toEqual(BoundingSphere.fromPoints(one.positions));
expect(two._boundingVolume).toEqual(BoundingSphere.fromPoints(two.positions));
expect(three._boundingVolume).toEqual(BoundingSphere.fromPoints(three.positions));
expect(boundingVolume).toEqual(BoundingSphere.union(BoundingSphere.union(one._boundingVolume, two._boundingVolume), three._boundingVolume));
});
function testBoundingSphere() {
var projection = scene.mapProjection;
var ellipsoid = projection.ellipsoid;
var one = polylines.add({
positions : Cartesian3.fromDegreesArray([
-50.0, -50.0,
50.0, -50.0
])
});
var two = polylines.add({
positions : Cartesian3.fromDegreesArray([
50.0, 50.0,
-50.0, 50.0
])
});
scene.primitives.add(polylines);
scene.render();
var boundingVolume = scene.frameState.commandList[0].boundingVolume;
var positions = one.positions;
var projectedPositions = [];
var i;
for (i = 0; i < positions.length; ++i) {
projectedPositions.push(projection.project(ellipsoid.cartesianToCartographic(positions[i])));
}
var bs = BoundingSphere.fromPoints(projectedPositions);
bs.center = new Cartesian3(bs.center.z, bs.center.x, bs.center.y);
expect(one._boundingVolume2D.center).toEqualEpsilon(bs.center, CesiumMath.EPSILON8);
expect(one._boundingVolume2D.radius).toEqualEpsilon(bs.radius, CesiumMath.EPSILON12);
positions = two.positions;
projectedPositions = [];
for (i = 0; i < positions.length; ++i) {
projectedPositions.push(projection.project(ellipsoid.cartesianToCartographic(positions[i])));
}
bs = BoundingSphere.fromPoints(projectedPositions);
bs.center = new Cartesian3(bs.center.z, bs.center.x, bs.center.y);
expect(two._boundingVolume2D.center).toEqualEpsilon(bs.center, CesiumMath.EPSILON8);
expect(two._boundingVolume2D.radius).toEqualEpsilon(bs.radius, CesiumMath.EPSILON12);
var expected = BoundingSphere.union(one._boundingVolume2D, two._boundingVolume2D);
expect(boundingVolume.center).toEqualEpsilon(expected.center, CesiumMath.EPSILON8);
expect(boundingVolume.radius).toEqualEpsilon(expected.radius, CesiumMath.EPSILON8);
}
it('computes bounding sphere in Columbus view', function() {
scene.mode = SceneMode.COLUMBUS_VIEW;
testBoundingSphere();
});
it('computes bounding sphere in 2D', function() {
scene.mode = SceneMode.SCENE2D;
testBoundingSphere();
});
it('computes optimized bounding volumes per material', function() {
var one = polylines.add({
positions : [{
x : 1.0,
y : 2.0,
z : 3.0
},{
x : 2.0,
y : 3.0,
z : 4.0
}]
});
one.material.uniforms.color = new Color(1.0, 0.0, 0.0, 1.0);
var two = polylines.add({
positions : [{
x : 2.0,
y : 3.0,
z : 4.0
},{
x : 4.0,
y : 5.0,
z : 6.0
}]
});
two.material.uniforms.color = new Color(0.0, 1.0, 0.0, 1.0);
scene.primitives.add(polylines);
scene.render();
expect(scene.frameState.commandList[0].boundingVolume).toEqual(one._boundingVolume);
expect(scene.frameState.commandList[1].boundingVolume).toEqual(two._boundingVolume);
});
it('isDestroyed', function() {
expect(polylines.isDestroyed()).toEqual(false);
polylines.destroy();
expect(polylines.isDestroyed()).toEqual(true);
});
}, 'WebGL');