Skip to content

Commit 0e4afd3

Browse files
authored
Merge pull request #6204 from AnalyticalGraphicsInc/promise-url
Allow promise to url for Cesium terrain, 3d tiles and TMS imagery
2 parents 14bb593 + 64d50a8 commit 0e4afd3

7 files changed

+195
-101
lines changed

CHANGES.md

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ Change Log
33

44
### 1.43 - 2018-03-01
55

6+
##### Additions :tada:
7+
* Added support for a promise to a resource for `CesiumTerrainProvider`, `createTileMapServiceImageryProvider` and `Cesium3DTileset` [#6204](https://github.com/AnalyticalGraphicsInc/cesium/pull/6204)
8+
69
##### Fixes :wrench:
710
* Fixed bug where AxisAlignedBoundingBox did not copy over center value when cloning an undefined result. [#6183](https://github.com/AnalyticalGraphicsInc/cesium/pull/6183)
811
* Fixed `Resource.fetch` when called with no arguments [#6206](https://github.com/AnalyticalGraphicsInc/cesium/issues/6206)

Source/Core/CesiumTerrainProvider.js

+24-16
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ define([
6868
* @constructor
6969
*
7070
* @param {Object} options Object with the following properties:
71-
* @param {Resource|String} options.url The URL of the Cesium terrain server.
71+
* @param {Resource|String|Promise<Resource>|Promise<String>} options.url The URL of the Cesium terrain server.
7272
* @param {Boolean} [options.requestVertexNormals=false] Flag that indicates if the client should request additional lighting information from the server, in the form of per vertex normals if available.
7373
* @param {Boolean} [options.requestWaterMask=false] Flag that indicates if the client should request per tile water masks from the server, if available.
7474
* @param {Ellipsoid} [options.ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
@@ -112,11 +112,6 @@ define([
112112
deprecationWarning('CesiumTerrainProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.');
113113
}
114114

115-
var resource = Resource.createIfNeeded(options.url, {
116-
proxy: options.proxy
117-
});
118-
resource.appendForwardSlash();
119-
120115
this._tilingScheme = new GeographicTilingScheme({
121116
numberOfLevelZeroTilesX : 2,
122117
numberOfLevelZeroTilesY : 1,
@@ -156,20 +151,34 @@ define([
156151

157152
this._availability = undefined;
158153

154+
var deferred = when.defer();
159155
this._ready = false;
160-
this._readyPromise = when.defer();
161-
162-
var lastResource = resource;
163-
var metadataResource = lastResource.getDerivedResource({
164-
url: 'layer.json'
165-
});
156+
this._readyPromise = deferred;
166157

167158
var that = this;
159+
var lastResource;
160+
var metadataResource;
168161
var metadataError;
169162

170163
var layers = this._layers = [];
171164
var attribution = '';
172165
var overallAvailability = [];
166+
when(options.url)
167+
.then(function(url) {
168+
var resource = Resource.createIfNeeded(url, {
169+
proxy: options.proxy
170+
});
171+
resource.appendForwardSlash();
172+
lastResource = resource;
173+
metadataResource = lastResource.getDerivedResource({
174+
url: 'layer.json'
175+
});
176+
177+
requestMetadata();
178+
})
179+
.otherwise(function(e) {
180+
deferred.reject(e);
181+
});
173182

174183
function parseMetadataSuccess(data) {
175184
var message;
@@ -343,11 +352,10 @@ define([
343352
}
344353

345354
function requestMetadata() {
346-
var metadata = metadataResource.fetchJson();
347-
when(metadata, metadataSuccess, metadataFailure);
355+
when(metadataResource.fetchJson())
356+
.then(metadataSuccess)
357+
.otherwise(metadataFailure);
348358
}
349-
350-
requestMetadata();
351359
}
352360

353361
/**

Source/Scene/Cesium3DTileset.js

+30-23
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ define([
9494
* @constructor
9595
*
9696
* @param {Object} options Object with the following properties:
97-
* @param {Resource|String} options.url The url to a tileset.json file or to a directory containing a tileset.json file.
97+
* @param {Resource|String|Promise<Resource>|Promise<String>} options.url The url to a tileset.json file or to a directory containing a tileset.json file.
9898
* @param {Boolean} [options.show=true] Determines if the tileset will be shown.
9999
* @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] A 4x4 transformation matrix that transforms the tileset's root tile.
100100
* @param {ShadowMode} [options.shadows=ShadowMode.ENABLED] Determines whether the tileset casts or receives shadows from each light source.
@@ -165,26 +165,9 @@ define([
165165
Check.defined('options.url', options.url);
166166
//>>includeEnd('debug');
167167

168-
var resource = Resource.createIfNeeded(options.url);
169-
170-
var tilesetResource = resource;
171-
var basePath;
172-
173-
if (resource.extension === 'json') {
174-
basePath = resource.getBaseUri(true);
175-
} else if (resource.isDataUri) {
176-
basePath = '';
177-
} else {
178-
resource.appendForwardSlash();
179-
tilesetResource = resource.getDerivedResource({
180-
url: 'tileset.json'
181-
});
182-
basePath = resource.url;
183-
}
184-
185-
this._url = resource.url;
186-
this._tilesetUrl = tilesetResource.url;
187-
this._basePath = basePath;
168+
this._url = undefined;
169+
this._tilesetUrl = undefined;
170+
this._basePath = undefined;
188171
this._root = undefined;
189172
this._asset = undefined; // Metadata for the entire tileset
190173
this._properties = undefined; // Metadata for per-model/point/etc properties
@@ -699,9 +682,33 @@ define([
699682
this._brokenUrlWorkaround = false;
700683

701684
var that = this;
685+
var tilesetResource;
686+
when(options.url)
687+
.then(function(url) {
688+
var basePath;
689+
var resource = Resource.createIfNeeded(url);
690+
691+
tilesetResource = resource;
692+
693+
if (resource.extension === 'json') {
694+
basePath = resource.getBaseUri(true);
695+
} else if (resource.isDataUri) {
696+
basePath = '';
697+
} else {
698+
resource.appendForwardSlash();
699+
tilesetResource = resource.getDerivedResource({
700+
url: 'tileset.json'
701+
});
702+
basePath = resource.url;
703+
}
702704

703-
// We don't know the distance of the tileset until tileset.json is loaded, so use the default distance for now
704-
Cesium3DTileset.loadJson(tilesetResource)
705+
that._url = resource.url;
706+
that._tilesetUrl = tilesetResource.url;
707+
that._basePath = basePath;
708+
709+
// We don't know the distance of the tileset until tileset.json is loaded, so use the default distance for now
710+
return Cesium3DTileset.loadJson(tilesetResource);
711+
})
705712
.then(function(tilesetJson) {
706713
return detectBrokenUrlWorkaround(that, tilesetResource, tilesetJson);
707714
})

Source/Scene/createTileMapServiceImageryProvider.js

+19-11
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ define([
3737
* @exports createTileMapServiceImageryProvider
3838
*
3939
* @param {Object} [options] Object with the following properties:
40-
* @param {Resource|String} [options.url='.'] Path to image tiles on server.
40+
* @param {Resource|String|Promise<Resource>|Promise<String>} [options.url='.'] Path to image tiles on server.
4141
* @param {String} [options.fileExtension='png'] The file extension for images on the server.
4242
* @param {Credit|String} [options.credit=''] A credit for the data source, which is displayed on the canvas.
4343
* @param {Number} [options.minimumLevel=0] The minimum level-of-detail supported by the imagery provider. Take care when specifying
@@ -95,19 +95,28 @@ define([
9595
deprecationWarning('createTileMapServiceImageryProvider.proxy', 'The options.proxy parameter has been deprecated. Specify options.url as a Resource instance and set the proxy property there.');
9696
}
9797

98-
var resource = Resource.createIfNeeded(options.url, {
99-
proxy : options.proxy
100-
});
101-
resource.appendForwardSlash();
102-
103-
var xmlResource = resource.getDerivedResource({
104-
url: 'tilemapresource.xml'
105-
});
106-
10798
var deferred = when.defer();
10899
var imageryProvider = new UrlTemplateImageryProvider(deferred.promise);
109100

110101
var metadataError;
102+
var resource;
103+
var xmlResource;
104+
when(options.url)
105+
.then(function(url) {
106+
resource = Resource.createIfNeeded(url, {
107+
proxy : options.proxy
108+
});
109+
resource.appendForwardSlash();
110+
111+
xmlResource = resource.getDerivedResource({
112+
url: 'tilemapresource.xml'
113+
});
114+
115+
requestMetadata();
116+
})
117+
.otherwise(function(e) {
118+
deferred.reject(e);
119+
});
111120

112121
function metadataSuccess(xml) {
113122
var tileFormatRegex = /tileformat/i;
@@ -282,7 +291,6 @@ define([
282291
xmlResource.fetchXML().then(metadataSuccess).otherwise(metadataFailure);
283292
}
284293

285-
requestMetadata();
286294
return imageryProvider;
287295
}
288296

Specs/Core/CesiumTerrainProviderSpec.js

+26
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,17 @@ defineSuite([
139139
});
140140
});
141141

142+
it('resolves readyPromise when url promise is used', function() {
143+
var provider = new CesiumTerrainProvider({
144+
url : when.resolve('made/up/url')
145+
});
146+
147+
return provider.readyPromise.then(function (result) {
148+
expect(result).toBe(true);
149+
expect(provider.ready).toBe(true);
150+
});
151+
});
152+
142153
it('resolves readyPromise with Resource', function() {
143154
var resource = new Resource({
144155
url : 'made/up/url'
@@ -154,6 +165,21 @@ defineSuite([
154165
});
155166
});
156167

168+
it('rejects readyPromise when url rejects', function() {
169+
var error = new Error();
170+
var provider = new CesiumTerrainProvider({
171+
url: when.reject(error)
172+
});
173+
return provider.readyPromise
174+
.then(function() {
175+
fail('should not resolve');
176+
})
177+
.otherwise(function(result) {
178+
expect(result).toBe(error);
179+
expect(provider.ready).toBe(false);
180+
});
181+
});
182+
157183
it('uses geographic tiling scheme by default', function() {
158184
returnHeightmapTileJson();
159185

Specs/Scene/Cesium3DTilesetSpec.js

+17
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,23 @@ defineSuite([
255255
});
256256
});
257257

258+
it('Constructor works with promise to resource', function() {
259+
var resource = new Resource({
260+
url: 'Data/Cesium3DTiles/Tilesets/TilesetOfTilesets'
261+
});
262+
263+
// setup tileset with invalid url (overridden loadJson should replace invalid url with correct url)
264+
var tileset = new Cesium3DTileset({
265+
url : when.resolve(resource)
266+
});
267+
268+
return tileset.readyPromise.then(function() {
269+
expect(tileset.ready).toEqual(true);
270+
}).otherwise(function(error) {
271+
fail('should not fail');
272+
});
273+
});
274+
258275
it('Constructor works with directory resource', function() {
259276
var resource = new Resource({
260277
url: 'Data/Cesium3DTiles/Tilesets/TilesetOfTilesets'

0 commit comments

Comments
 (0)