diff --git a/CHANGES.md b/CHANGES.md index 6d5eab321bf9..51e6b5ce2ea4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Change Log * Added `Rectangle.simpleIntersection`. * Added the ability to specify retina options, such as `@2x.png`, via the `MapboxImageryProvider` `format` option. * Removed an unnecessary reprojection of Web Mercator imagery tiles to the Geographic projection on load. This should improve both visual quality and load performance slightly. +* Fix a issue where a billboard entity would not render after toggling the show propery. [#4408](https://github.com/AnalyticalGraphicsInc/cesium/issues/4408) ### 1.26 - 2016-10-03 diff --git a/Source/DataSources/BillboardVisualizer.js b/Source/DataSources/BillboardVisualizer.js index bf249387aa43..8eb358446a7f 100644 --- a/Source/DataSources/BillboardVisualizer.js +++ b/Source/DataSources/BillboardVisualizer.js @@ -148,7 +148,7 @@ define([ } billboard.show = show; - if (item.textureValue !== textureValue) { + if (!defined(billboard.image) || item.textureValue !== textureValue) { billboard.image = textureValue; item.textureValue = textureValue; } diff --git a/Specs/DataSources/BillboardVisualizerSpec.js b/Specs/DataSources/BillboardVisualizerSpec.js index 9c9bfb03cd40..df82126feca4 100644 --- a/Specs/DataSources/BillboardVisualizerSpec.js +++ b/Specs/DataSources/BillboardVisualizerSpec.js @@ -204,6 +204,83 @@ defineSuite([ }); }); + 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)); + + 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.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();