defineSuite([ 'Scene/PointPrimitiveCollection', 'Core/BoundingRectangle', 'Core/BoundingSphere', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Color', 'Core/DistanceDisplayCondition', 'Core/Math', 'Core/NearFarScalar', 'Core/Rectangle', 'Scene/BlendOption', 'Scene/PointPrimitive', 'Specs/createScene' ], function( PointPrimitiveCollection, BoundingRectangle, BoundingSphere, Cartesian2, Cartesian3, Color, DistanceDisplayCondition, CesiumMath, NearFarScalar, Rectangle, BlendOption, PointPrimitive, createScene) { 'use strict'; var scene; var camera; var pointPrimitives; beforeAll(function() { scene = createScene(); camera = scene.camera; }); afterAll(function() { scene.destroyForSpecs(); }); beforeEach(function() { scene.morphTo3D(0); camera.position = new Cartesian3(10.0, 0.0, 0.0); camera.direction = Cartesian3.negate(Cartesian3.UNIT_X, new Cartesian3()); camera.up = Cartesian3.clone(Cartesian3.UNIT_Z); pointPrimitives = new PointPrimitiveCollection(); scene.primitives.add(pointPrimitives); }); afterEach(function() { // pointPrimitives are destroyed by removeAll(). scene.primitives.removeAll(); }); it('constructs a default pointPrimitive', function() { var p = pointPrimitives.add(); expect(p.show).toEqual(true); expect(p.position).toEqual(Cartesian3.ZERO); expect(p.pixelSize).toEqual(10.0); expect(p.color.red).toEqual(1.0); expect(p.color.green).toEqual(1.0); expect(p.color.blue).toEqual(1.0); expect(p.color.alpha).toEqual(1.0); expect(p.outlineColor.red).toEqual(0.0); expect(p.outlineColor.green).toEqual(0.0); expect(p.outlineColor.blue).toEqual(0.0); expect(p.outlineColor.alpha).toEqual(0.0); expect(p.outlineWidth).toEqual(0.0); expect(p.scaleByDistance).not.toBeDefined(); expect(p.translucencyByDistance).not.toBeDefined(); expect(p.distanceDisplayCondition).not.toBeDefined(); expect(p.disableDepthTestDistance).toEqual(0.0); expect(p.id).not.toBeDefined(); }); it('can add and remove before first render.', function() { var p = pointPrimitives.add(); pointPrimitives.remove(p); scene.renderForSpecs(); }); it('explicitly constructs a pointPrimitive', function() { var p = pointPrimitives.add({ show : false, position : new Cartesian3(1.0, 2.0, 3.0), pixelSize : 2.0, color : { red : 0.1, green : 0.2, blue : 0.3, alpha : 0.4 }, outlineColor : { red : 0.5, green : 0.6, blue : 0.7, alpha : 0.8 }, outlineWidth : 4.0, scaleByDistance : new NearFarScalar(1.0, 3.0, 1.0e6, 0.0), translucencyByDistance : new NearFarScalar(1.0, 1.0, 1.0e6, 0.0), distanceDisplayCondition : new DistanceDisplayCondition(10.0, 100.0), disableDepthTestDistance : 10.0, id : 'id' }); expect(p.show).toEqual(false); expect(p.position).toEqual(new Cartesian3(1.0, 2.0, 3.0)); expect(p.pixelSize).toEqual(2.0); expect(p.color.red).toEqual(0.1); expect(p.color.green).toEqual(0.2); expect(p.color.blue).toEqual(0.3); expect(p.color.alpha).toEqual(0.4); expect(p.outlineColor.red).toEqual(0.5); expect(p.outlineColor.green).toEqual(0.6); expect(p.outlineColor.blue).toEqual(0.7); expect(p.outlineColor.alpha).toEqual(0.8); expect(p.outlineWidth).toEqual(4.0); expect(p.scaleByDistance).toEqual(new NearFarScalar(1.0, 3.0, 1.0e6, 0.0)); expect(p.translucencyByDistance).toEqual(new NearFarScalar(1.0, 1.0, 1.0e6, 0.0)); expect(p.distanceDisplayCondition).toEqual(new DistanceDisplayCondition(10.0, 100.0)); expect(p.disableDepthTestDistance).toEqual(10.0); expect(p.id).toEqual('id'); }); it('sets pointPrimitive properties', function() { var p = pointPrimitives.add(); p.show = false; p.position = new Cartesian3(1.0, 2.0, 3.0); p.pixelSize = 2.0; p.color = new Color(0.1, 0.2, 0.3, 0.4); p.outlineColor = new Color(0.5, 0.6, 0.7, 0.8); p.outlineWidth = 4.0; p.scaleByDistance = new NearFarScalar(1.0e6, 3.0, 1.0e8, 0.0); p.translucencyByDistance = new NearFarScalar(1.0e6, 1.0, 1.0e8, 0.0); p.distanceDisplayCondition = new DistanceDisplayCondition(10.0, 100.0); p.disableDepthTestDistance = 10.0; expect(p.show).toEqual(false); expect(p.position).toEqual(new Cartesian3(1.0, 2.0, 3.0)); expect(p.pixelSize).toEqual(2.0); expect(p.color.red).toEqual(0.1); expect(p.color.green).toEqual(0.2); expect(p.color.blue).toEqual(0.3); expect(p.color.alpha).toEqual(0.4); expect(p.outlineColor.red).toEqual(0.5); expect(p.outlineColor.green).toEqual(0.6); expect(p.outlineColor.blue).toEqual(0.7); expect(p.outlineColor.alpha).toEqual(0.8); expect(p.outlineWidth).toEqual(4.0); expect(p.scaleByDistance).toEqual(new NearFarScalar(1.0e6, 3.0, 1.0e8, 0.0)); expect(p.translucencyByDistance).toEqual(new NearFarScalar(1.0e6, 1.0, 1.0e8, 0.0)); expect(p.distanceDisplayCondition).toEqual(new DistanceDisplayCondition(10.0, 100.0)); expect(p.disableDepthTestDistance).toEqual(10.0); }); it('is not destroyed', function() { expect(pointPrimitives.isDestroyed()).toEqual(false); }); it('renders pointPrimitive in multiple passes', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); camera.position = new Cartesian3(2.0, 0.0, 0.0); var frameState = scene.frameState; frameState.commandList.length = 0; pointPrimitives.blendOption = BlendOption.OPAQUE_AND_TRANSLUCENT; pointPrimitives.update(frameState); expect(frameState.commandList.length).toEqual(2); frameState.commandList.length = 0; pointPrimitives.blendOption = BlendOption.OPAQUE; pointPrimitives.update(frameState); expect(frameState.commandList.length).toEqual(1); frameState.commandList.length = 0; pointPrimitives.blendOption = BlendOption.TRANSLUCENT; pointPrimitives.update(frameState); expect(frameState.commandList.length).toEqual(1); }); it('disables pointPrimitive scaleByDistance', function() { var p = pointPrimitives.add({ scaleByDistance : new NearFarScalar(1.0, 3.0, 1.0e6, 0.0) }); p.scaleByDistance = undefined; expect(p.scaleByDistance).not.toBeDefined(); }); it('disables pointPrimitive translucencyByDistance', function() { var p = pointPrimitives.add({ translucencyByDistance : new NearFarScalar(1.0, 1.0, 1.0e6, 0.0) }); p.translucencyByDistance = undefined; expect(p.translucencyByDistance).not.toBeDefined(); }); it('renders pointPrimitive with scaleByDistance', function() { pointPrimitives.add({ position : Cartesian3.ZERO, scaleByDistance: new NearFarScalar(2.0, 1.0, 4.0, 0.0), color : Color.LIME }); camera.position = new Cartesian3(2.0, 0.0, 0.0); expect(scene).toRender([0, 255, 0, 255]); camera.position = new Cartesian3(4.0, 0.0, 0.0); expect(scene).toRender([0, 0, 0, 255]); }); it('renders pointPrimitive with translucencyByDistance', function() { pointPrimitives.add({ position : Cartesian3.ZERO, translucencyByDistance: new NearFarScalar(2.0, 1.0, 4.0, 0.0), color : Color.LIME }); camera.position = new Cartesian3(2.0, 0.0, 0.0); expect(scene).toRender([0, 255, 0, 255]); camera.position = new Cartesian3(4.0, 0.0, 0.0); expect(scene).toRender([0, 0, 0, 255]); }); it('throws scaleByDistance with nearDistance === farDistance', function() { var p = pointPrimitives.add(); var scale = new NearFarScalar(2.0e5, 1.0, 2.0e5, 0.0); expect(function() { p.scaleByDistance = scale; }).toThrowDeveloperError(); }); it('throws new pointPrimitive with invalid scaleByDistance (nearDistance === farDistance)', function() { var scale = new NearFarScalar(2.0e5, 1.0, 2.0e5, 0.0); expect(function() { pointPrimitives.add({ scaleByDistance : scale }); }).toThrowDeveloperError(); }); it('throws scaleByDistance with nearDistance > farDistance', function() { var p = pointPrimitives.add(); var scale = new NearFarScalar(1.0e9, 1.0, 1.0e5, 1.0); expect(function() { p.scaleByDistance = scale; }).toThrowDeveloperError(); }); it('throws translucencyByDistance with nearDistance === farDistance', function() { var p = pointPrimitives.add(); var translucency = new NearFarScalar(2.0e5, 1.0, 2.0e5, 0.0); expect(function() { p.translucencyByDistance = translucency; }).toThrowDeveloperError(); }); it('throws new pointPrimitive with invalid translucencyByDistance (nearDistance === farDistance)', function() { var translucency = new NearFarScalar(2.0e5, 1.0, 2.0e5, 0.0); expect(function() { pointPrimitives.add({ translucencyByDistance : translucency }); }).toThrowDeveloperError(); }); it('throws translucencyByDistance with nearDistance > farDistance', function() { var p = pointPrimitives.add(); var translucency = new NearFarScalar(1.0e9, 1.0, 1.0e5, 1.0); expect(function() { p.translucencyByDistance = translucency; }).toThrowDeveloperError(); }); it('renders pointPrimitive with distanceDisplayCondition', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME, distanceDisplayCondition : new DistanceDisplayCondition(10.0, 100.0) }); camera.position = new Cartesian3(200.0, 0.0, 0.0); expect(scene).toRender([0, 0, 0, 255]); camera.position = new Cartesian3(50.0, 0.0, 0.0); expect(scene).toRender([0, 255, 0, 255]); camera.position = new Cartesian3(5.0, 0.0, 0.0); expect(scene).toRender([0, 0, 0, 255]); }); it('throws new pointPrimitive with invalid distanceDisplayCondition (near >= far)', function() { var dc = new DistanceDisplayCondition(100.0, 10.0); expect(function() { pointPrimitives.add({ distanceDisplayCondition : dc }); }).toThrowDeveloperError(); }); it('throws distanceDisplayCondition with near >= far', function() { var p = pointPrimitives.add(); var dc = new DistanceDisplayCondition(100.0, 10.0); expect(function() { p.distanceDisplayCondition = dc; }).toThrowDeveloperError(); }); it('renders with disableDepthTestDistance', function() { var p = pointPrimitives.add({ position : new Cartesian3(-1.0, 0.0, 0.0), pixelSize : 10.0, color : Color.LIME }); pointPrimitives.add({ position : Cartesian3.ZERO, pixelSize : 10.0, color : Color.BLUE }); expect(scene).toRender([0 , 0, 255, 255]); p.disableDepthTestDistance = Number.POSITIVE_INFINITY; expect(scene).toRender([0, 255, 0, 255]); }); it('throws with new point primitive with invalid disableDepthTestDistance (< 0.0)', function() { expect(function() { pointPrimitives.add({ disableDepthTestDistance : -1.0 }); }).toThrowDeveloperError(); }); it('throws with disableDepthTestDistance set less than 0.0', function() { var p = pointPrimitives.add(); expect(function() { p.disableDepthTestDistance = -1.0; }).toThrowDeveloperError(); }); it('set a removed pointPrimitive property', function() { var p = pointPrimitives.add(); pointPrimitives.remove(p); p.show = false; expect(p.show).toEqual(false); }); it('has zero pointPrimitives when constructed', function() { expect(pointPrimitives.length).toEqual(0); }); it('adds a pointPrimitive', function() { var p = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); expect(pointPrimitives.length).toEqual(1); expect(pointPrimitives.get(0)).toEqual(p); }); it('removes the first pointPrimitive', function() { var one = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); var two = pointPrimitives.add({ position : new Cartesian3(4.0, 5.0, 6.0) }); expect(pointPrimitives.length).toEqual(2); expect(pointPrimitives.remove(one)).toEqual(true); expect(pointPrimitives.length).toEqual(1); expect(pointPrimitives.get(0)).toEqual(two); }); it('removes the last pointPrimitive', function() { var one = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); var two = pointPrimitives.add({ position : new Cartesian3(4.0, 5.0, 6.0) }); expect(pointPrimitives.length).toEqual(2); expect(pointPrimitives.remove(two)).toEqual(true); expect(pointPrimitives.length).toEqual(1); expect(pointPrimitives.get(0)).toEqual(one); }); it('removes the same pointPrimitive twice', function() { var p = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); expect(pointPrimitives.length).toEqual(1); expect(pointPrimitives.remove(p)).toEqual(true); expect(pointPrimitives.length).toEqual(0); expect(pointPrimitives.remove(p)).toEqual(false); expect(pointPrimitives.length).toEqual(0); }); it('returns false when removing undefined', function() { pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); expect(pointPrimitives.length).toEqual(1); expect(pointPrimitives.remove(undefined)).toEqual(false); expect(pointPrimitives.length).toEqual(1); }); it('adds and removes pointPrimitives', function() { var one = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); var two = pointPrimitives.add({ position : new Cartesian3(4.0, 5.0, 6.0) }); expect(pointPrimitives.length).toEqual(2); expect(pointPrimitives.get(0)).toEqual(one); expect(pointPrimitives.get(1)).toEqual(two); expect(pointPrimitives.remove(two)).toEqual(true); var three = pointPrimitives.add({ position : new Cartesian3(7.0, 8.0, 9.0) }); expect(pointPrimitives.length).toEqual(2); expect(pointPrimitives.get(0)).toEqual(one); expect(pointPrimitives.get(1)).toEqual(three); }); it('removes all pointPrimitives', function() { pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); pointPrimitives.add({ position : new Cartesian3(4.0, 5.0, 6.0) }); expect(pointPrimitives.length).toEqual(2); pointPrimitives.removeAll(); expect(pointPrimitives.length).toEqual(0); }); it('can check if it contains a pointPrimitive', function() { var pointPrimitive = pointPrimitives.add(); expect(pointPrimitives.contains(pointPrimitive)).toEqual(true); }); it('returns false when checking if it contains a pointPrimitive it does not contain', function() { var pointPrimitive = pointPrimitives.add(); pointPrimitives.remove(pointPrimitive); expect(pointPrimitives.contains(pointPrimitive)).toEqual(false); }); it('does not contain undefined', function() { expect(pointPrimitives.contains(undefined)).toEqual(false); }); it('does not contain random other objects', function() { expect(pointPrimitives.contains({})).toEqual(false); expect(pointPrimitives.contains(new Cartesian2())).toEqual(false); }); it('does not render when constructed', function() { expect(scene).toRender([0, 0, 0, 255]); }); it('modifies and removes a pointPrimitive, then renders', function() { var p1 = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); pointPrimitives.add({ position : new Cartesian3(-1.0, 0.0, 0.0), color : Color.BLUE }); expect(scene).toRender([0, 255, 0, 255]); p1.pixelSize = 2.0; pointPrimitives.remove(p1); expect(scene).toRender([0, 0, 255, 255]); }); it('renders a green pointPrimitive', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); expect(scene).toRender([0, 255, 0, 255]); }); it('adds and renders a pointPrimitive', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); expect(scene).toRender([0, 255, 0, 255]); pointPrimitives.add({ position : new Cartesian3(1.0, 0.0, 0.0), // Closer to camera color : Color.BLUE }); expect(scene).toRender([0, 0, 255, 255]); }); it('removes and renders a pointPrimitive', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); var bluePointPrimitive = pointPrimitives.add({ position : new Cartesian3(1.0, 0.0, 0.0), // Closer to camera color : Color.BLUE }); expect(scene).toRender([0, 0, 255, 255]); pointPrimitives.remove(bluePointPrimitive); expect(scene).toRender([0, 255, 0, 255]); }); it('removes all pointPrimitives and renders', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); expect(scene).toRender([0, 255, 0, 255]); pointPrimitives.removeAll(); expect(scene).toRender([0, 0, 0, 255]); }); it('removes all pointPrimitives, adds a pointPrimitive, and renders', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); expect(scene).toRender([0, 255, 0, 255]); pointPrimitives.removeAll(); pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.BLUE }); expect(scene).toRender([0, 0, 255, 255]); }); it('renders using pointPrimitive show property', function() { var greenPointPrimitive = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); var bluePointPrimitive = pointPrimitives.add({ show : false, position : Cartesian3.ZERO, color : Color.BLUE }); expect(scene).toRender([0, 255, 0, 255]); greenPointPrimitive.show = false; bluePointPrimitive.show = true; expect(scene).toRender([0, 0, 255, 255]); }); it('renders using pointPrimitive position property', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME }); expect(scene).toRender([0, 255, 0, 255]); p.position = new Cartesian3(20.0, 0.0, 0.0); // Behind camera expect(scene).toRender([0, 0, 0, 255]); p.position = new Cartesian3(1.0, 0.0, 0.0); // Back in front of camera expect(scene).toRender([0, 255, 0, 255]); }); it('renders using pointPrimitive color property', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE }); expect(scene).toRender([255, 255, 255, 255]); p.color = new Color(1.0, 0.0, 1.0, 1.0); expect(scene).toRender([255, 0, 255, 255]); // Update a second time since it goes through a different vertex array update path p.color = new Color(0.0, 1.0, 0.0, 1.0); expect(scene).toRender([0, 255, 0, 255]); }); it('renders bounding volume with debugShowBoundingVolume', function() { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.LIME, pixelSize : 0.5 // bring bounding volume in view }); pointPrimitives.debugShowBoundingVolume = true; expect(scene).notToRender([0, 0, 0, 255]); }); it('updates 10% of pointPrimitives', function() { for ( var i = 0; i < 10; ++i) { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE, show : (i === 3) }); } // First render - default pointPrimitive color is white. expect(scene).toRender([255, 255, 255, 255]); pointPrimitives.get(3).color = new Color(0.0, 1.0, 0.0, 1.0); // Second render - pointPrimitive is green expect(scene).toRender([0, 255, 0, 255]); pointPrimitives.get(3).color = new Color(1.0, 0.0, 0.0, 1.0); // Third render - update goes through a different vertex array update path expect(scene).toRender([255, 0, 0, 255]); }); it('renders more than 64K pointPrimitives', function() { for ( var i = 0; i < 64 * 1024; ++i) { pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.TRANSPARENT }); } pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE }); expect(scene).toRender([255, 255, 255, 255]); }); it('is picked', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE, id : 'id' }); expect(scene).toPickAndCall(function(result) { expect(result.primitive).toEqual(p); expect(result.id).toEqual('id'); }); }); it('can change pick id', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE, id : 'id' }); 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', function() { pointPrimitives.add({ show : false, position : Cartesian3.ZERO, color : Color.WHITE }); expect(scene).notToPick(); }); it('picks a pointPrimitive using scaleByDistance', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE }); var scaleByDistance = new NearFarScalar(1.0, 4.0, 3.0e9, 2.0); p.scaleByDistance = scaleByDistance; expect(scene).toPickPrimitive(p); scaleByDistance.nearValue = 0.0; scaleByDistance.farValue = 0.0; p.scaleByDistance = scaleByDistance; expect(scene).notToPick(); }); it('picks a pointPrimitive using translucencyByDistance', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO, color : Color.WHITE }); var translucency = new NearFarScalar(1.0, 0.9, 3.0e9, 0.8); p.translucencyByDistance = translucency; expect(scene).toPickPrimitive(p); translucency.nearValue = 0.0; translucency.farValue = 0.0; p.translucencyByDistance = translucency; expect(scene).notToPick(); }); it('computes screen space position', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO }); scene.renderForSpecs(); expect(p.computeScreenSpacePosition(scene)).toEqualEpsilon(new Cartesian2(0.5, 0.5), CesiumMath.EPSILON1); }); it('stores screen space position in a result', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO }); var result = new Cartesian2(); scene.renderForSpecs(); var actual = p.computeScreenSpacePosition(scene, result); expect(actual).toEqual(result); expect(result).toEqualEpsilon(new Cartesian2(0.5, 0.5), CesiumMath.EPSILON1); }); it('throws when computing screen space position when not in a collection', function() { var p = pointPrimitives.add({ position : Cartesian3.ZERO }); pointPrimitives.remove(p); expect(function() { p.computeScreenSpacePosition(scene); }).toThrowDeveloperError(); }); it('throws when computing screen space position without scene', function() { var p = pointPrimitives.add(); expect(function() { p.computeScreenSpacePosition(); }).toThrowDeveloperError(); }); it('computes screen space bounding box', function() { var size = 10; var p = pointPrimitives.add({ size : size }); var halfWidth = size * 0.5; var halfHeight = halfWidth; var bbox = PointPrimitive.getScreenSpaceBoundingBox(p, Cartesian2.ZERO); expect(bbox.x).toEqual(-halfWidth); expect(bbox.y).toEqual(-halfHeight); expect(bbox.width).toEqual(size); expect(bbox.height).toEqual(size); }); it('computes screen space bounding box with result', function() { var size = 10; var p = pointPrimitives.add({ size : size }); var halfWidth = size * 0.5; var halfHeight = halfWidth; var result = new BoundingRectangle(); var bbox = PointPrimitive.getScreenSpaceBoundingBox(p, Cartesian2.ZERO, result); expect(bbox.x).toEqual(-halfWidth); expect(bbox.y).toEqual(-halfHeight); expect(bbox.width).toEqual(size); expect(bbox.height).toEqual(size); expect(bbox).toBe(result); }); it('equals another pointPrimitive', function() { var p = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0), color : { red : 1.0, green : 0.0, blue : 0.0, alpha : 1.0 } }); var p2 = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0), color : { red : 1.0, green : 0.0, blue : 0.0, alpha : 1.0 } }); // This tests the `PointPrimitiveCollection.equals` function itself, not simple equality. expect(p.equals(p2)).toEqual(true); }); it('does not equal another pointPrimitive', function() { var p = pointPrimitives.add({ position : new Cartesian3(1.0, 2.0, 3.0) }); var p2 = pointPrimitives.add({ position : new Cartesian3(4.0, 5.0, 6.0) }); // This tests the `PointPrimitiveCollection.equals` function itself, not simple equality. expect(p.equals(p2)).toEqual(false); }); it('does not equal undefined', function() { // This tests the `PointPrimitiveCollection.equals` function itself, not simple equality. var pointPrimitive = pointPrimitives.add(); expect(pointPrimitive.equals(undefined)).toEqual(false); }); it('throws when accessing without an index', function() { expect(function() { pointPrimitives.get(); }).toThrowDeveloperError(); }); it('computes bounding sphere in 3D', function() { var one = pointPrimitives.add({ position : Cartesian3.fromDegrees(-50.0, -50.0) }); var two = pointPrimitives.add({ position : Cartesian3.fromDegrees(-50.0, 50.0) }); scene.renderForSpecs(); var actual = scene.frameState.commandList[0].boundingVolume; var positions = [one.position, two.position]; var expected = BoundingSphere.fromPoints(positions); expect(actual.center).toEqual(expected.center); expect(actual.radius).toEqual(expected.radius); }); it('computes bounding sphere in Columbus view', function() { var projection = scene.mapProjection; var ellipsoid = projection.ellipsoid; var one = pointPrimitives.add({ position : Cartesian3.fromDegrees(-50.0, -50.0) }); var two = pointPrimitives.add({ position : Cartesian3.fromDegrees(-50.0, 50.0) }); // Update scene state scene.morphToColumbusView(0); scene.renderForSpecs(); var actual = scene.frameState.commandList[0].boundingVolume; var projectedPositions = [ projection.project(ellipsoid.cartesianToCartographic(one.position)), projection.project(ellipsoid.cartesianToCartographic(two.position)) ]; var expected = BoundingSphere.fromPoints(projectedPositions); expected.center = new Cartesian3(0.0, expected.center.x, expected.center.y); expect(actual.center).toEqualEpsilon(expected.center, CesiumMath.EPSILON8); expect(actual.radius).toBeGreaterThanOrEqualTo(expected.radius); }); it('computes bounding sphere in 2D', function() { var projection = scene.mapProjection; var ellipsoid = projection.ellipsoid; var one = pointPrimitives.add({ color : Color.LIME, position : Cartesian3.fromDegrees(-50.0, -50.0) }); var two = pointPrimitives.add({ color : Color.LIME, position : Cartesian3.fromDegrees(-50.0, 50.0) }); camera.setView({ destination : Rectangle.fromDegrees(-60.0, -60.0, -40.0, 60.0) }); scene.morphTo2D(0); scene.renderForSpecs(); scene.renderForSpecs(); var actual = scene.frameState.commandList[0].boundingVolume; var projectedPositions = [ projection.project(ellipsoid.cartesianToCartographic(one.position)), projection.project(ellipsoid.cartesianToCartographic(two.position)) ]; var expected = BoundingSphere.fromPoints(projectedPositions); expected.center = new Cartesian3(0.0, expected.center.x, expected.center.y); expect(actual.center).toEqualEpsilon(expected.center, CesiumMath.EPSILON8); expect(actual.radius).toBeGreaterThan(expected.radius); }); }, 'WebGL');