diff --git a/CHANGES.md b/CHANGES.md index 47a3a45e686..afbb1c54348 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.37 - 2017-09-01 * Fixed `replaceState` bug that was causing the `CesiumViewer` demo application to crash in Safari and iOS +* Fixed issue where `Model` and `BillboardCollection` would throw an error if the globe is undefined [#5638](https://github.com/AnalyticalGraphicsInc/cesium/issues/5638) ### 1.36 - 2017-08-01 diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index 8e46636ec7b..ec9c06b3619 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -319,7 +319,7 @@ define([ }; var scene = this._scene; - if (defined(scene)) { + if (defined(scene) && defined(scene.terrainProviderChanged)) { this._removeCallbackFunc = scene.terrainProviderChanged.addEventListener(function() { var billboards = this._billboards; var length = billboards.length; diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index bb4ecb33b1e..a6248a04806 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -522,8 +522,8 @@ define([ this._removeUpdateHeightCallback = undefined; var scene = options.scene; this._scene = scene; - if (defined(scene)) { - scene.terrainProviderChanged.addEventListener(function() { + if (defined(scene) && defined(scene.terrainProviderChanged)) { + this._terrainProviderChangedCallback = scene.terrainProviderChanged.addEventListener(function() { this._heightChanged = true; }, this); } @@ -4799,6 +4799,11 @@ define([ this._removeUpdateHeightCallback = undefined; } + if (defined(this._terrainProviderChangedCallback)) { + this._terrainProviderChangedCallback(); + this._terrainProviderChangedCallback = undefined; + } + this._rendererResources = undefined; this._cachedRendererResources = this._cachedRendererResources && this._cachedRendererResources.release(); diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 7ce1b5d96d5..f78c96c463a 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -898,6 +898,10 @@ define([ */ imageryLayers : { get : function() { + if (!defined(this.globe)) { + return undefined; + } + return this.globe.imageryLayers; } }, @@ -910,10 +914,16 @@ define([ */ terrainProvider : { get : function() { + if (!defined(this.globe)) { + return undefined; + } + return this.globe.terrainProvider; }, set : function(terrainProvider) { - this.globe.terrainProvider = terrainProvider; + if (defined(this.globe)) { + this.globe.terrainProvider = terrainProvider; + } } }, @@ -926,6 +936,10 @@ define([ */ terrainProviderChanged : { get : function() { + if (!defined(this.globe)) { + return undefined; + } + return this.globe.terrainProviderChanged; } }, diff --git a/Specs/Scene/SceneSpec.js b/Specs/Scene/SceneSpec.js index 4aefefb9da2..f8075de3b87 100644 --- a/Specs/Scene/SceneSpec.js +++ b/Specs/Scene/SceneSpec.js @@ -2,6 +2,7 @@ defineSuite([ 'Core/BoundingSphere', 'Core/Cartesian2', 'Core/Cartesian3', + 'Core/CesiumTerrainProvider', 'Core/Color', 'Core/defined', 'Core/Ellipsoid', @@ -42,6 +43,7 @@ defineSuite([ BoundingSphere, Cartesian2, Cartesian3, + CesiumTerrainProvider, Color, defined, Ellipsoid, @@ -1121,4 +1123,48 @@ defineSuite([ expect(SceneTransforms.wgs84ToWindowCoordinates).toHaveBeenCalledWith(scene, mockPosition, result); }); + it('Gets imageryLayers', function() { + var scene = createScene(); + var globe = scene.globe = new Globe(Ellipsoid.UNIT_SPHERE); + expect(scene.imageryLayers).toBe(globe.imageryLayers); + + scene.globe = undefined; + expect(scene.imageryLayers).toBeUndefined(); + }); + + it('Gets terrainProvider', function() { + var scene = createScene(); + var globe = scene.globe = new Globe(Ellipsoid.UNIT_SPHERE); + expect(scene.terrainProvider).toBe(globe.terrainProvider); + + scene.globe = undefined; + expect(scene.terrainProvider).toBeUndefined(); + }); + + it('Sets terrainProvider', function() { + var scene = createScene(); + var globe = scene.globe = new Globe(Ellipsoid.UNIT_SPHERE); + scene.terrainProvider = new CesiumTerrainProvider({ + url: '//terrain/tiles' + }); + + expect(scene.terrainProvider).toBe(globe.terrainProvider); + + scene.globe = undefined; + expect(function() { + scene.terrainProvider = new CesiumTerrainProvider({ + url: '//newTerrain/tiles' + }); + }).not.toThrow(); + }); + + it('Gets terrainProviderChanged', function() { + var scene = createScene(); + var globe = scene.globe = new Globe(Ellipsoid.UNIT_SPHERE); + expect(scene.terrainProviderChanged).toBe(globe.terrainProviderChanged); + + scene.globe = undefined; + expect(scene.terrainProviderChanged).toBeUndefined(); + }); + }, 'WebGL');