import { Cartesian3 } from "../../Source/Cesium.js"; import { Color } from "../../Source/Cesium.js"; import { DistanceDisplayCondition } from "../../Source/Cesium.js"; import { JulianDate } from "../../Source/Cesium.js"; import { Math as CesiumMath } from "../../Source/Cesium.js"; import { TimeInterval } from "../../Source/Cesium.js"; import { TimeIntervalCollection } from "../../Source/Cesium.js"; import { CallbackProperty } from "../../Source/Cesium.js"; import { EllipseGeometryUpdater } from "../../Source/Cesium.js"; import { Entity } from "../../Source/Cesium.js"; import { StaticOutlineGeometryBatch } from "../../Source/Cesium.js"; import { TimeIntervalCollectionProperty } from "../../Source/Cesium.js"; import { ShadowMode } from "../../Source/Cesium.js"; import createScene from "../createScene.js"; import pollToPromise from "../pollToPromise.js"; describe("DataSources/StaticOutlineGeometryBatch", function () { var time = JulianDate.now(); var scene; beforeAll(function () { scene = createScene(); }); afterAll(function () { scene.destroyForSpecs(); }); it("updates color attribute after rebuilding primitive", function () { var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); var entity = new Entity({ position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, show: new CallbackProperty(function () { return true; }, false), outline: true, outlineColor: Color.RED, height: 0, }, }); var updater = new EllipseGeometryUpdater(entity, scene); batch.add(time, updater); return pollToPromise(function () { scene.initializeFrame(); var isUpdated = batch.update(time); scene.render(time); return isUpdated; }).then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.color).toEqual([255, 0, 0, 255]); entity.ellipse.outlineColor = Color.GREEN; updater._onEntityPropertyChanged(entity, "ellipse"); batch.remove(updater); batch.add(time, updater); return pollToPromise(function () { scene.initializeFrame(); var isUpdated = batch.update(time); scene.render(time); return isUpdated; }).then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.color).toEqual([0, 128, 0, 255]); batch.removeAllPrimitives(); }); }); }); it("updates with sampled color out of range", function () { var validTime = JulianDate.fromIso8601("2018-02-14T04:10:00+1100"); var outOfRangeTime = JulianDate.fromIso8601("2018-02-14T04:20:00+1100"); var color = new TimeIntervalCollectionProperty(); color.intervals.addInterval( TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100", data: Color.RED, }) ); var entity = new Entity({ availability: new TimeIntervalCollection([ TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100", }), ]), position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, extrudedHeight: 20, outline: true, outlineColor: color, }, }); var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); var updater = new EllipseGeometryUpdater(entity, scene); batch.add(validTime, updater); return pollToPromise(function () { scene.initializeFrame(); var isUpdated = batch.update(validTime); scene.render(validTime); return isUpdated; }).then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.color).toEqual([255, 0, 0, 255]); batch.update(outOfRangeTime); scene.render(outOfRangeTime); primitive = scene.primitives.get(0); attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.color).toEqual([255, 255, 255, 255]); batch.removeAllPrimitives(); }); }); it("updates with sampled distance display condition out of range", function () { var validTime = JulianDate.fromIso8601("2018-02-14T04:10:00+1100"); var outOfRangeTime = JulianDate.fromIso8601("2018-02-14T04:20:00+1100"); var ddc = new TimeIntervalCollectionProperty(); ddc.intervals.addInterval( TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100", data: new DistanceDisplayCondition(1.0, 2.0), }) ); var entity = new Entity({ availability: new TimeIntervalCollection([ TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100", }), ]), position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, extrudedHeight: 20, outline: true, outlineColor: Color.RED, distanceDisplayCondition: ddc, }, }); var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); var updater = new EllipseGeometryUpdater(entity, scene); batch.add(validTime, updater); return pollToPromise(function () { scene.initializeFrame(); var isUpdated = batch.update(validTime); scene.render(validTime); return isUpdated; }).then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.distanceDisplayCondition).toEqualEpsilon( [1.0, 2.0], CesiumMath.EPSILON6 ); batch.update(outOfRangeTime); scene.render(outOfRangeTime); primitive = scene.primitives.get(0); attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.distanceDisplayCondition).toEqual([0.0, Infinity]); batch.removeAllPrimitives(); }); }); it("updates with sampled show out of range", function () { var validTime = JulianDate.fromIso8601("2018-02-14T04:10:00+1100"); var outOfRangeTime = JulianDate.fromIso8601("2018-02-14T04:20:00+1100"); var show = new TimeIntervalCollectionProperty(); show.intervals.addInterval( TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:15:00+1100", data: true, }) ); var entity = new Entity({ availability: new TimeIntervalCollection([ TimeInterval.fromIso8601({ iso8601: "2018-02-14T04:00:00+1100/2018-02-14T04:30:00+1100", }), ]), position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, extrudedHeight: 20, outline: true, show: show, }, }); var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); var updater = new EllipseGeometryUpdater(entity, scene); batch.add(validTime, updater); return pollToPromise(function () { scene.initializeFrame(); var isUpdated = batch.update(validTime); scene.render(validTime); return isUpdated; }).then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.show).toEqual([1]); batch.update(outOfRangeTime); scene.render(outOfRangeTime); primitive = scene.primitives.get(0); attributes = primitive.getGeometryInstanceAttributes(entity); expect(attributes.show).toEqual([0]); batch.removeAllPrimitives(); }); }); it("shows only one primitive while rebuilding primitive", function () { var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); function buildEntity() { return new Entity({ position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, height: 0, outline: true, outlineColor: Color.RED.withAlpha(0.5), }, }); } function renderScene() { scene.initializeFrame(); var isUpdated = batch.update(time); scene.render(time); return isUpdated; } var entity1 = buildEntity(); var entity2 = buildEntity(); var updater1 = new EllipseGeometryUpdater(entity1, scene); var updater2 = new EllipseGeometryUpdater(entity2, scene); batch.add(time, updater1); return pollToPromise(renderScene) .then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); expect(primitive.show).toBeTruthy(); }) .then(function () { batch.add(time, updater2); }) .then(function () { return pollToPromise(function () { renderScene(); return scene.primitives.length === 2; }); }) .then(function () { var showCount = 0; expect(scene.primitives.length).toEqual(2); showCount += !!scene.primitives.get(0).show; showCount += !!scene.primitives.get(1).show; expect(showCount).toEqual(1); }) .then(function () { return pollToPromise(renderScene); }) .then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); expect(primitive.show).toBeTruthy(); batch.removeAllPrimitives(); }); }); it("has correct show attribute after rebuilding primitive", function () { var batch = new StaticOutlineGeometryBatch( scene.primitives, scene, false, ShadowMode.DISABLED ); function buildEntity() { return new Entity({ position: new Cartesian3(1234, 5678, 9101112), ellipse: { semiMajorAxis: 2, semiMinorAxis: 1, height: 0, outline: true, outlineColor: Color.RED.withAlpha(0.5), }, }); } function renderScene() { scene.initializeFrame(); var isUpdated = batch.update(time); scene.render(time); return isUpdated; } var entity1 = buildEntity(); var updater1 = new EllipseGeometryUpdater(entity1, scene); batch.add(time, updater1); var entity2 = buildEntity(); var updater2 = new EllipseGeometryUpdater(entity2, scene); return pollToPromise(renderScene) .then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity1); expect(attributes.show).toEqual([1]); entity1.show = false; updater1._onEntityPropertyChanged(entity1, "isShowing"); return pollToPromise(renderScene); }) .then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity1); expect(attributes.show).toEqual([0]); batch.add(time, updater2); return pollToPromise(renderScene); }) .then(function () { expect(scene.primitives.length).toEqual(1); var primitive = scene.primitives.get(0); var attributes = primitive.getGeometryInstanceAttributes(entity1); expect(attributes.show).toEqual([0]); attributes = primitive.getGeometryInstanceAttributes(entity2); expect(attributes.show).toEqual([1]); batch.removeAllPrimitives(); }); }); });