From 60f303ebb88a21ffe397dd6cd7072b34f222b37e Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 13 Apr 2017 16:15:11 -0400 Subject: [PATCH 1/3] Load tiles without extensions --- Source/Scene/Batched3DModel3DTileContent.js | 145 +++--------- Source/Scene/Cesium3DTile.js | 222 +++++++++++++----- Source/Scene/Cesium3DTileContent.js | 64 +---- Source/Scene/Cesium3DTileContentFactory.js | 22 +- Source/Scene/Cesium3DTileset.js | 186 +++++++-------- Source/Scene/Composite3DTileContent.js | 81 +------ Source/Scene/Empty3DTileContent.js | 20 +- Source/Scene/Instanced3DModel3DTileContent.js | 129 ++-------- Source/Scene/PointCloud3DTileContent.js | 110 ++------- Source/Scene/Tileset3DTileContent.js | 68 +++--- Specs/Scene/Cesium3DTilesetSpec.js | 1 - 11 files changed, 385 insertions(+), 663 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 11bf088f2f2f..532c152b618d 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -10,15 +10,10 @@ define([ '../Core/DeveloperError', '../Core/getAbsoluteUri', '../Core/getBaseUri', - '../Core/getMagic', '../Core/getStringFromTypedArray', - '../Core/loadArrayBuffer', - '../Core/Request', - '../Core/RequestScheduler', '../Core/RequestType', '../ThirdParty/when', './Cesium3DTileBatchTable', - './Cesium3DTileContentState', './Cesium3DTileFeature', './Cesium3DTileFeatureTable', './getAttributeOrUniformBySemantic', @@ -34,15 +29,10 @@ define([ DeveloperError, getAbsoluteUri, getBaseUri, - getMagic, getStringFromTypedArray, - loadArrayBuffer, - Request, - RequestScheduler, RequestType, when, Cesium3DTileBatchTable, - Cesium3DTileContentState, Cesium3DTileFeature, Cesium3DTileFeatureTable, getAttributeOrUniformBySemantic, @@ -59,7 +49,7 @@ define([ * * @private */ - function Batched3DModel3DTileContent(tileset, tile, url) { + function Batched3DModel3DTileContent(tileset, tile, url, arrayBuffer, byteOffset) { this._model = undefined; this._url = url; this._tileset = tileset; @@ -68,14 +58,12 @@ define([ /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = Cesium3DTileContentState.UNLOADED; this.batchTable = undefined; this.featurePropertiesDirty = false; - this._contentReadyToProcessPromise = when.defer(); - this._readyPromise = when.defer(); - this._featuresLength = 0; this._features = undefined; + + initialize(this, arrayBuffer, byteOffset); } // This can be overridden for testing purposes @@ -87,7 +75,7 @@ define([ */ featuresLength : { get : function() { - return this._featuresLength; + return this.batchTable.featuresLength; } }, @@ -105,10 +93,7 @@ define([ */ trianglesLength : { get : function() { - if (defined(this._model)) { - return this._model.trianglesLength; - } - return 0; + return this._model.trianglesLength; } }, @@ -117,10 +102,7 @@ define([ */ vertexMemorySizeInBytes : { get : function() { - if (defined(this._model)) { - return this._model.vertexMemorySizeInBytes; - } - return 0; + return this._model.vertexMemorySizeInBytes; } }, @@ -129,10 +111,7 @@ define([ */ textureMemorySizeInBytes : { get : function() { - if (defined(this._model)) { - return this._model.textureMemorySizeInBytes; - } - return 0; + return this._model.textureMemorySizeInBytes; } }, @@ -141,10 +120,7 @@ define([ */ batchTableMemorySizeInBytes : { get : function() { - if (defined(this.batchTable)) { - return this.batchTable.memorySizeInBytes; - } - return 0; + return this.batchTable.memorySizeInBytes; } }, @@ -157,28 +133,19 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ readyPromise : { get : function() { - return this._readyPromise.promise; + return this._model.readyPromise; } } }); function createFeatures(content) { var tileset = content._tileset; - var featuresLength = content._featuresLength; + var featuresLength = content.featuresLength; if (!defined(content._features) && (featuresLength > 0)) { var features = new Array(featuresLength); for (var i = 0; i < featuresLength; ++i) { @@ -199,7 +166,7 @@ define([ * Part of the {@link Cesium3DTileContent} interface. */ Batched3DModel3DTileContent.prototype.getFeature = function(batchId) { - var featuresLength = this._featuresLength; + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); if (!defined(batchId) || (batchId < 0) || (batchId >= featuresLength)) { throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + (featuresLength - 1) + ').'); @@ -212,38 +179,6 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Batched3DModel3DTileContent.prototype.request = function() { - var that = this; - - var distance = this._tile.distanceToCamera; - var promise = RequestScheduler.schedule(new Request({ - url : this._url, - server : this._tile.requestServer, - requestFunction : loadArrayBuffer, - type : RequestType.TILES3D, - distance : distance - })); - - if (!defined(promise)) { - return false; - } - - this.state = Cesium3DTileContentState.LOADING; - promise.then(function(arrayBuffer) { - if (that.isDestroyed()) { - return when.reject('tileset is destroyed'); - } - that.initialize(arrayBuffer); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - return true; - }; - function getBatchIdAttributeName(gltf) { var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, '_BATCHID'); if (!defined(batchIdAttributeName)) { @@ -285,21 +220,17 @@ define([ }; } - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Batched3DModel3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { + function initialize(content, arrayBuffer, byteOffset) { + var tileset = content._tileset; + var tile = content._tile; + var basePath = getAbsoluteUri(getBaseUri(content._url, true)); + var byteStart = defaultValue(byteOffset, 0); byteOffset = byteStart; var uint8Array = new Uint8Array(arrayBuffer); - var magic = getMagic(uint8Array, byteOffset); - if (magic !== 'b3dm') { - throw new DeveloperError('Invalid Batched 3D Model. Expected magic=b3dm. Read magic=' + magic); - } - var view = new DataView(arrayBuffer); - byteOffset += sizeOfUint32; // Skip magic number + byteOffset += sizeOfUint32; // Skip magic //>>includeStart('debug', pragmas.debug); var version = view.getUint32(byteOffset, true); @@ -371,7 +302,6 @@ define([ batchLength = featureTable.getGlobalProperty('BATCH_LENGTH', ComponentDatatype.UNSIGNED_INT); featureTable.featuresLength = batchLength; - this._featuresLength = batchLength; var batchTableJson; var batchTableBinary; @@ -394,48 +324,35 @@ define([ } } - var batchTable = new Cesium3DTileBatchTable(this, batchLength, batchTableJson, batchTableBinary); - this.batchTable = batchTable; + var batchTable = new Cesium3DTileBatchTable(content, batchLength, batchTableJson, batchTableBinary); + content.batchTable = batchTable; var gltfByteLength = byteStart + byteLength - byteOffset; var gltfView = new Uint8Array(arrayBuffer, byteOffset, gltfByteLength); // PERFORMANCE_IDEA: patch the shader on demand, e.g., the first time show/color changes. // The pick shader still needs to be patched. - var model = new Model({ + content._model = new Model({ gltf : gltfView, cull : false, // The model is already culled by the 3D tiles releaseGltfJson : true, // Models are unique and will not benefit from caching so save memory - basePath : getAbsoluteUri(getBaseUri(this._url, true)), - modelMatrix : this._tile.computedTransform, - upAxis : this._tileset._gltfUpAxis, - shadows: this._tileset.shadows, - debugWireframe: this._tileset.debugWireframe, + basePath : basePath, + requestType : RequestType.TILES3D, + modelMatrix : tile.computedTransform, + upAxis : tileset._gltfUpAxis, + shadows: tileset.shadows, + debugWireframe: tileset.debugWireframe, incrementallyLoadTextures : false, - pickPrimitive : this._tileset, - vertexShaderLoaded : getVertexShaderCallback(this), - fragmentShaderLoaded : getFragmentShaderCallback(this), + pickPrimitive : tileset, + vertexShaderLoaded : getVertexShaderCallback(content), + fragmentShaderLoaded : getFragmentShaderCallback(content), uniformMapLoaded : batchTable.getUniformMapCallback(), - pickVertexShaderLoaded : getPickVertexShaderCallback(this), + pickVertexShaderLoaded : getPickVertexShaderCallback(content), pickFragmentShaderLoaded : batchTable.getPickFragmentShaderCallback(), pickUniformMapLoaded : batchTable.getPickUniformMapCallback(), addBatchIdToGeneratedShaders : (batchLength > 0) // If the batch table has values in it, generated shaders will need a batchId attribute }); - - this._model = model; - this.state = Cesium3DTileContentState.PROCESSING; - this._contentReadyToProcessPromise.resolve(this); - - var that = this; - - model.readyPromise.then(function(model) { - that.state = Cesium3DTileContentState.READY; - that._readyPromise.resolve(that); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - }; + } /** * Part of the {@link Cesium3DTileContent} interface. diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index ae1a1c0787e6..cbe21565819a 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -13,16 +13,22 @@ define([ '../Core/DeveloperError', '../Core/GeometryInstance', '../Core/getExtensionFromUri', + '../Core/getMagic', + '../Core/getStringFromTypedArray', '../Core/Intersect', '../Core/joinUrls', + '../Core/loadArrayBuffer', '../Core/Matrix3', '../Core/Matrix4', '../Core/OrientedBoundingBox', '../Core/Rectangle', '../Core/RectangleOutlineGeometry', + '../Core/Request', '../Core/RequestScheduler', + '../Core/RequestType', '../Core/SphereOutlineGeometry', '../ThirdParty/Uri', + '../ThirdParty/when', './Cesium3DTileChildrenVisibility', './Cesium3DTileContentFactory', './Cesium3DTileContentState', @@ -50,16 +56,22 @@ define([ DeveloperError, GeometryInstance, getExtensionFromUri, + getMagic, + getStringFromTypedArray, Intersect, joinUrls, + loadArrayBuffer, Matrix3, Matrix4, OrientedBoundingBox, Rectangle, RectangleOutlineGeometry, + Request, RequestScheduler, + RequestType, SphereOutlineGeometry, Uri, + when, Cesium3DTileChildrenVisibility, Cesium3DTileContentFactory, Cesium3DTileContentState, @@ -163,17 +175,6 @@ define([ */ this.children = []; - /** - * Descendant tiles that need to be visible before this tile can refine. For example, if - * a child is empty (such as for accelerating culling), its descendants with content would - * be added here. This array is generated during runtime in {@link Cesium3DTileset#loadTileset}. - * If a tiles's children all have content, this is left undefined. - * - * @type {Array} - * @readonly - */ - this.descendantsWithContent = undefined; - /** * This tile's parent or undefined if this tile is the root. *

@@ -187,72 +188,75 @@ define([ */ this.parent = parent; - var hasContent; - var hasTilesetContent; + var content; + var hasEmptyContent; + var contentState; + var contentUrl; var requestServer; - var createContent; if (defined(contentHeader)) { - var contentUrl = contentHeader.url; - var url = joinUrls(baseUrl, contentUrl); - requestServer = RequestScheduler.getRequestServer(url); - var type = getExtensionFromUri(url); - var contentFactory = Cesium3DTileContentFactory[type]; - - if (type === 'json') { - hasContent = false; - hasTilesetContent = true; - } else { - hasContent = true; - hasTilesetContent = false; - } - - //>>includeStart('debug', pragmas.debug); - if (!defined(contentFactory)) { - throw new DeveloperError('Unknown tile content type, ' + type + ', for ' + url); - } - //>>includeEnd('debug'); - - var that = this; - createContent = function() { - return contentFactory(tileset, that, url); - }; + hasEmptyContent = false; + contentState = Cesium3DTileContentState.UNLOADED; + contentUrl = joinUrls(baseUrl, contentHeader.url); + requestServer = RequestScheduler.getRequestServer(contentUrl); } else { - hasContent = false; - hasTilesetContent = false; - - createContent = function() { - return new Empty3DTileContent(); - }; + content = new Empty3DTileContent(); + hasEmptyContent = true; + contentState = Cesium3DTileContentState.READY; } - this._createContent = createContent; - this._content = createContent(); + this._content = content; + this._contentUrl = contentUrl; + this._contentState = contentState; + this._contentReadyToProcessPromise = undefined; + this._contentReadyPromise = undefined; this._requestServer = requestServer; /** - * When true, the tile has content. This does not imply that the content is loaded. + * When true, the tile has no content. + * + * @type {Boolean} + * @readonly + * + * @see Empty3DTileContent + * + * @private + */ + this.hasEmptyContent = hasEmptyContent; + + /** + * When true, the tile's content is renderable. *

- * When a tile's content points to a external tileset, the tile is not considered to have content. + * This is false until the tile's content is loaded. *

* * @type {Boolean} * @readonly * + * @see Batched3DModel3DTileContent + * @see Instanced3DModel3DTileContent + * @see PointCloud3DTileContent + * @see Composite3DTileContent + * * @private */ - this.hasContent = hasContent; + this.hasRenderableContent = false; /** * When true, the tile's content points to an external tileset. + *

+ * This is false until the tile's content is loaded. + *

* * @type {Boolean} * @readonly * + * @see Tileset3DTileContent + * * @private */ - this.hasTilesetContent = hasTilesetContent; + this.hasTilesetContent = false; /** * The corresponding node in the cache replacement list. @@ -426,7 +430,7 @@ define([ */ contentReady : { get : function() { - return this._content.state === Cesium3DTileContentState.READY; + return this._contentState === Cesium3DTileContentState.READY; } }, @@ -441,7 +445,47 @@ define([ */ contentUnloaded : { get : function() { - return this._content.state === Cesium3DTileContentState.UNLOADED; + return this._contentState === Cesium3DTileContentState.UNLOADED; + } + }, + + /** + * Gets the promise that will be resolved when the tile's content is ready to process. + * This happens after the content is downloaded but before the content is ready + * to render. + *

+ * The promise remains undefined until the tile's content is requested. + *

+ * + * @type {Promise.} + * @readonly + * + * @private + */ + contentReadyToProcessPromise : { + get : function() { + if (defined(this._contentReadyToProcessPromise)) { + return this._contentReadyToProcessPromise.promise; + } + } + }, + + /** + * Gets the promise that will be resolved when the tile's content is ready to render. + *

+ * The promise remains undefined until the tile's content is requested. + *

+ * + * @type {Promise.} + * @readonly + * + * @private + */ + contentReadyPromise : { + get : function() { + if (defined(this._contentReadyPromise)) { + return this._contentReadyPromise.promise; + } } } }); @@ -455,7 +499,69 @@ define([ * @private */ Cesium3DTile.prototype.requestContent = function() { - this._content.request(); + var that = this; + + if (this.hasEmptyContent) { + return false; + } + + if (!this.canRequestContent()) { + return false; + } + + var distance = this.distanceToCamera; + var promise = RequestScheduler.schedule(new Request({ + url : this._contentUrl, + server : this._requestServer, + requestFunction : loadArrayBuffer, + type : RequestType.TILES3D, + distance : distance + })); + + if (!defined(promise)) { + return false; + } + + this._contentState = Cesium3DTileContentState.LOADING; + this._contentReadyToProcessPromise = when.defer(); + this._contentReadyPromise = when.defer(); + + promise.then(function(arrayBuffer) { + if (that.isDestroyed()) { + return when.reject('tileset is destroyed'); + } + var uint8Array = new Uint8Array(arrayBuffer); + var magic = getMagic(uint8Array); + var contentFactory = Cesium3DTileContentFactory[magic]; + var content; + + if (defined(contentFactory)) { + content = contentFactory(that._tileset, that, that._contentUrl, arrayBuffer, 0); + that.hasRenderableContent = true; + } else { + // The content may be json instead + content = Cesium3DTileContentFactory.json(that._tileset, that, that._contentUrl, arrayBuffer, 0); + that.hasTilesetContent = true; + } + + that._content = content; + that._contentState = Cesium3DTileContentState.PROCESSING; + that._contentReadyToProcessPromise.resolve(content); + + content.readyPromise.then(function(content) { + that._contentState = Cesium3DTileContentState.READY; + that._contentReadyPromise.resolve(content); + }).otherwise(function(error) { + that._contentState = Cesium3DTileContentState.FAILED; + that._contentReadyPromise.reject(error); + }); + }).otherwise(function(error) { + that._contentState = Cesium3DTileContentState.FAILED; + that._contentReadyPromise.reject(error); + that._contentReadyToProcessPromise.reject(error); + }); + + return true; }; /** @@ -481,8 +587,14 @@ define([ * @private */ Cesium3DTile.prototype.unloadContent = function() { + if (!this.hasRenderableContent) { + return; + } + this._content = this._content && this._content.destroy(); - this._content = this._createContent(); + this._contentState = Cesium3DTileContentState.UNLOADED; + this._contentReadyToProcessPromise = undefined; + this._contentReadyPromise = undefined; this.replacementNode = undefined; @@ -534,7 +646,7 @@ define([ * * @private */ - Cesium3DTile.prototype.contentsVisibility = function(frameState) { + Cesium3DTile.prototype.contentVisibility = function(frameState) { // Assumes the tile's bounding volume intersects the culling volume already, so // just return Intersect.INSIDE if there is no content bounding volume. if (!defined(this._contentBoundingVolume)) { diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index d5fe0bbdefc7..082040937664 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -26,22 +26,12 @@ define([ * @see Tileset3DTileContent * @see Empty3DTileContent */ - function Cesium3DTileContent(tileset, tile, url) { + function Cesium3DTileContent(tileset, tile, url, arrayBuffer, byteOffset) { // Private members are not exposed in the public Cesium API, but derived classes // need to implement them. The scope should be treated like C#'s internal. When // we're ready, we'll add these members to the public API so users can implement // new tile formats. - /** - * The current state of the tile's content. - * - * @type {Cesium3DTileContentState} - * @readonly - * - * @private - */ - this.state = undefined; - /** * Gets the batch table texture for this tile. * @@ -163,22 +153,6 @@ define([ } }, - /** - * Gets the promise that will be resolved when the tile's content is ready to process. - * This happens after the content is downloaded but before the content is ready - * to render. - * - * @type {Promise.} - * @readonly - * - * @private - */ - contentReadyToProcessPromise : { - get : function() { - DeveloperError.throwInstantiationError(); - } - }, - /** * Gets the promise that will be resolved when the tile's content is ready to render. * @@ -220,42 +194,6 @@ define([ DeveloperError.throwInstantiationError(); }; - /** - * Requests the tile's content. - *

- * The request may not be made if the Cesium Request Scheduler can't prioritize it. - *

- *

- * This is used to implement the Cesium3DTileContent interface, but is - * not part of the public Cesium API. - *

- * - * @returns {Boolean} Whether the request was initiated. May be false if the RequestScheduler is full. - * - * @private - */ - Cesium3DTileContent.prototype.request = function() { - DeveloperError.throwInstantiationError(); - }; - - /** - * Parses the tile's content's array buffer and initializes the content. This does not - * necessarily move the state to READY since WebGL resource creation may be - * amortized over several frames. - *

- * This is used to implement the Cesium3DTileContent interface, but is - * not part of the public Cesium API. - *

- * - * @param {Object} arrayBuffer The array buffer containing the contents payload. - * @param {Number} byteOffset The zero-based offset, in bytes, into the array buffer. - * - * @private - */ - Cesium3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { - DeveloperError.throwInstantiationError(); - }; - /** * Called when {@link Cesium3DTileset#debugColorizeTiles} changes. *

diff --git a/Source/Scene/Cesium3DTileContentFactory.js b/Source/Scene/Cesium3DTileContentFactory.js index 4a1b14fad74e..b4e9471511e2 100644 --- a/Source/Scene/Cesium3DTileContentFactory.js +++ b/Source/Scene/Cesium3DTileContentFactory.js @@ -20,23 +20,23 @@ define([ * @private */ var Cesium3DTileContentFactory = { - b3dm : function(tileset, tile, url) { - return new Batched3DModel3DTileContent(tileset, tile, url); + b3dm : function(tileset, tile, url, arrayBuffer, byteOffset) { + return new Batched3DModel3DTileContent(tileset, tile, url, arrayBuffer, byteOffset); }, - pnts : function(tileset, tile, url) { - return new PointCloud3DTileContent(tileset, tile, url); + pnts : function(tileset, tile, url, arrayBuffer, byteOffset) { + return new PointCloud3DTileContent(tileset, tile, url, arrayBuffer, byteOffset); }, - i3dm : function(tileset, tile, url) { - return new Instanced3DModel3DTileContent(tileset, tile, url); + i3dm : function(tileset, tile, url, arrayBuffer, byteOffset) { + return new Instanced3DModel3DTileContent(tileset, tile, url, arrayBuffer, byteOffset); }, - cmpt : function(tileset, tile, url) { + cmpt : function(tileset, tile, url, arrayBuffer, byteOffset) { // Send in the factory in order to avoid a cyclical dependency - return new Composite3DTileContent(tileset, tile, url, Cesium3DTileContentFactory); + return new Composite3DTileContent(tileset, tile, url, arrayBuffer, byteOffset, Cesium3DTileContentFactory); }, - json : function(tileset, tile, url) { - return new Tileset3DTileContent(tileset, tile, url); + json : function(tileset, tile, url, arrayBuffer, byteOffset) { + return new Tileset3DTileContent(tileset, tile, url, arrayBuffer, byteOffset); } }; return Cesium3DTileContentFactory; -}); \ No newline at end of file +}); diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 323d14d9145a..60e65fbfc3c7 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -500,14 +500,19 @@ define([ this._readyPromise = when.defer(); var that = this; - this.loadTileset(tilesetUrl).then(function(data) { - var tilesetJson = data.tilesetJson; + + // We don't know the distance of the tileset until tileset.json is loaded, so use the default distance for now + RequestScheduler.request(tilesetUrl, loadJson, undefined, RequestType.TILES3D).then(function(tilesetJson) { + if (that.isDestroyed()) { + return when.reject('tileset is destroyed'); + } + that._root = that.loadTileset(tilesetUrl, tilesetJson); + var gltfUpAxis = defined(tilesetJson.asset.gltfUpAxis) ? Axis.fromName(tilesetJson.asset.gltfUpAxis) : Axis.Y; that._asset = tilesetJson.asset; that._properties = tilesetJson.properties; that._geometricError = tilesetJson.geometricError; that._gltfUpAxis = gltfUpAxis; - that._root = data.root; that._readyPromise.resolve(that); }).otherwise(function(error) { that._readyPromise.reject(error); @@ -996,92 +1001,80 @@ define([ * * @private */ - Cesium3DTileset.prototype.loadTileset = function(tilesetUrl, parentTile) { - var that = this; - - // We don't know the distance of the tileset until tiles.json is loaded, so use the default distance for now - return RequestScheduler.request(tilesetUrl, loadJson, undefined, RequestType.TILES3D).then(function(tilesetJson) { - if (that.isDestroyed()) { - return when.reject('tileset is destroyed'); - } - - if (!defined(tilesetJson.asset) || (tilesetJson.asset.version !== '0.0')) { - throw new DeveloperError('The tileset must be 3D Tiles version 0.0. See https://github.com/AnalyticalGraphicsInc/3d-tiles#spec-status'); - } + Cesium3DTileset.prototype.loadTileset = function(tilesetUrl, tilesetJson, parentTile) { + if (!defined(tilesetJson.asset) || (tilesetJson.asset.version !== '0.0')) { + throw new DeveloperError('The tileset must be 3D Tiles version 0.0. See https://github.com/AnalyticalGraphicsInc/3d-tiles#spec-status'); + } - var stats = that._statistics; + var stats = this._statistics; - // Append the version to the baseUrl - var hasVersionQuery = /[?&]v=/.test(tilesetUrl); - if (!hasVersionQuery) { - var versionQuery = '?v=' + defaultValue(tilesetJson.asset.tilesetVersion, '0.0'); - that._baseUrl = joinUrls(that._baseUrl, versionQuery); - tilesetUrl = joinUrls(tilesetUrl, versionQuery, false); - } + // Append the version to the baseUrl + var hasVersionQuery = /[?&]v=/.test(tilesetUrl); + if (!hasVersionQuery) { + var versionQuery = '?v=' + defaultValue(tilesetJson.asset.tilesetVersion, '0.0'); + this._baseUrl = joinUrls(this._baseUrl, versionQuery); + tilesetUrl = joinUrls(tilesetUrl, versionQuery, false); + } - // A tileset.json referenced from a tile may exist in a different directory than the root tileset. - // Get the baseUrl relative to the external tileset. - var baseUrl = getBaseUri(tilesetUrl, true); - var rootTile = new Cesium3DTile(that, baseUrl, tilesetJson.root, parentTile); + // A tileset.json referenced from a tile may exist in a different directory than the root tileset. + // Get the baseUrl relative to the external tileset. + var baseUrl = getBaseUri(tilesetUrl, true); + var rootTile = new Cesium3DTile(this, baseUrl, tilesetJson.root, parentTile); - // If there is a parentTile, add the root of the currently loading tileset - // to parentTile's children, and update its _depth. - if (defined(parentTile)) { - parentTile.children.push(rootTile); - rootTile._depth = parentTile._depth + 1; - } + // If there is a parentTile, add the root of the currently loading tileset + // to parentTile's children, and update its _depth. + if (defined(parentTile)) { + parentTile.children.push(rootTile); + rootTile._depth = parentTile._depth + 1; + } - ++stats.numberTotal; + ++stats.numberTotal; - var stack = []; - stack.push({ - header : tilesetJson.root, - cesium3DTile : rootTile - }); + var stack = []; + stack.push({ + header : tilesetJson.root, + cesium3DTile : rootTile + }); - while (stack.length > 0) { - var tile = stack.pop(); - var tile3D = tile.cesium3DTile; - var children = tile.header.children; - if (defined(children)) { - var length = children.length; - for (var k = 0; k < length; ++k) { - var childHeader = children[k]; - var childTile = new Cesium3DTile(that, baseUrl, childHeader, tile3D); - tile3D.children.push(childTile); - childTile._depth = tile3D._depth + 1; - ++stats.numberTotal; - stack.push({ - header : childHeader, - cesium3DTile : childTile - }); - } + while (stack.length > 0) { + var tile = stack.pop(); + var tile3D = tile.cesium3DTile; + var children = tile.header.children; + if (defined(children)) { + var length = children.length; + for (var k = 0; k < length; ++k) { + var childHeader = children[k]; + var childTile = new Cesium3DTile(this, baseUrl, childHeader, tile3D); + tile3D.children.push(childTile); + childTile._depth = tile3D._depth + 1; + ++stats.numberTotal; + stack.push({ + header : childHeader, + cesium3DTile : childTile + }); } - Cesium3DTileOptimizations.checkChildrenWithinParent(tile3D, true); - - // Create a load heap, one for each unique server. We can only make limited requests to a given - // server so it is unnecessary to keep a queue of all tiles needed to be loaded. - // Instead of creating a list of all tiles to load and then sorting it entirely to find the best ones, - // we keep just a heap so we have the best `maximumRequestsPerServer` to load. The order of these does - // not matter much as we will try to load them all. - // The heap approach is a O(n log k) to find the best tiles for loading. - var requestServer = tile3D.requestServer; - if (defined(requestServer)) { - if (!defined(that._requestHeaps[requestServer])) { - var heap = new Heap(sortForLoad); - that._requestHeaps[requestServer] = heap; - heap.maximumSize = RequestScheduler.maximumRequestsPerServer; - heap.reserve(heap.maximumSize); - } - tile3D._requestHeap = that._requestHeaps[requestServer]; + } + Cesium3DTileOptimizations.checkChildrenWithinParent(tile3D, true); + + // Create a load heap, one for each unique server. We can only make limited requests to a given + // server so it is unnecessary to keep a queue of all tiles needed to be loaded. + // Instead of creating a list of all tiles to load and then sorting it entirely to find the best ones, + // we keep just a heap so we have the best `maximumRequestsPerServer` to load. The order of these does + // not matter much as we will try to load them all. + // The heap approach is a O(n log k) to find the best tiles for loading. + var requestServer = tile3D.requestServer; + if (defined(requestServer)) { + if (!defined(this._requestHeaps[requestServer])) { + var heap = new Heap(sortForLoad); + this._requestHeaps[requestServer] = heap; + heap.maximumSize = RequestScheduler.maximumRequestsPerServer; + heap.reserve(heap.maximumSize); } + tile3D._requestHeap = this._requestHeaps[requestServer]; } + } - return { - tilesetJson : tilesetJson, - root : rootTile - }; - }); + return rootTile; }; var scratchPositionNormal = new Cartesian3(); @@ -1237,23 +1230,25 @@ define([ if (!outOfCore) { return; } - if (!tile.canRequestContent()) { + + if (tile.hasEmptyContent) { return; } - tile.requestContent(); - var stats = tileset._statistics; - if (!tile.contentUnloaded) { - ++stats.numberOfPendingRequests; + var requested = tile.requestContent(); - var removeFunction = removeFromProcessingQueue(tileset, tile); - tile.content.contentReadyToProcessPromise.then(addToProcessingQueue(tileset, tile)).otherwise(removeFunction); - tile.content.readyPromise.then(removeFunction).otherwise(removeFunction); - } else { + if (!requested) { ++stats.numberOfAttemptedRequests; + return; } + + ++stats.numberOfPendingRequests; + + var removeFunction = removeFromProcessingQueue(tileset, tile); + tile.contentReadyToProcessPromise.then(addToProcessingQueue(tileset, tile)); + tile.contentReadyPromise.then(removeFunction).otherwise(removeFunction); } function selectTile(tileset, tile, frameState) { @@ -1261,7 +1256,7 @@ define([ // zoomed into a neighborhood and can cull the skyscrapers in the root node. if (tile.contentReady && ( (tile.visibilityPlaneMask === CullingVolume.MASK_INSIDE) || - (tile.contentsVisibility(frameState) !== Intersect.OUTSIDE) + (tile.contentVisibility(frameState) !== Intersect.OUTSIDE) )) { tileset._selectedTiles.push(tile); @@ -1338,8 +1333,8 @@ define([ var original = finalQueue.get(i); var tile = original; // traverse up the tree to find a ready ancestor - if (tile.hasContent || tile.hasTilesetContent) { // could be Empty3DTileContent - while (defined(tile) && !(tile.hasContent && tile.contentReady)) { + if (!tile.hasEmptyContent) { + while (defined(tile) && !(tile.hasRenderableContent && tile.contentReady)) { if (!tile.contentReady) { tileset._hasMixedContent = true; } @@ -1520,7 +1515,7 @@ define([ function selectionHeuristic(tileset, ancestor, tile) { var skipLevels = tileset.skipLODs ? tileset._skipLevels : 0; var skipSSEFactor = tileset.skipLODs ? tileset.skipSSEFactor : 0.1; - return (ancestor !== tile && tile.hasContent && !tileset.immediatelyLoadDesiredLOD) && + return (ancestor !== tile && tile.hasRenderableContent && !tileset.immediatelyLoadDesiredLOD) && (tile._sse < ancestor._sse / skipSSEFactor) && (tile._depth > ancestor._depth + skipLevels); } @@ -1605,12 +1600,7 @@ define([ var loadSiblings = tileset.loadSiblings; if (tile.hasTilesetContent) { - loadTile(tile); - if (!tile.contentReady) { - finalQueue.push(tile); - } else { - updateAndPushChildren(tileset, tile, frameState, stack, loadSiblings, outOfCore); - } + updateAndPushChildren(tileset, tile, frameState, stack, loadSiblings, outOfCore); } else { if (tile.refine === Cesium3DTileRefine.ADD) { loadAndAddToQueue(tileset, tile, finalQueue); @@ -1737,7 +1727,7 @@ define([ // Remove from processing queue tileset._processingQueue.splice(index, 1); --tileset._statistics.numberProcessing; - if (tile.hasContent) { + if (tile.hasRenderableContent) { // RESEARCH_IDEA: ability to unload tiles (without content) for an // external tileset when all the tiles are unloaded. ++tileset._statistics.numberContentReady; diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index 7bbc5d4b7350..3542dcde479a 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -37,21 +37,20 @@ define([ * * @private */ - function Composite3DTileContent(tileset, tile, url, factory) { + function Composite3DTileContent(tileset, tile, url, arrayBuffer, byteOffset, factory) { this._url = url; this._tileset = tileset; this._tile = tile; this._contents = []; - this._factory = factory; /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = Cesium3DTileContentState.UNLOADED; this.batchTable = undefined; - this._contentReadyToProcessPromise = when.defer(); this._readyPromise = when.defer(); + + initialize(this, arrayBuffer, byteOffset, factory); } defineProperties(Composite3DTileContent.prototype, { @@ -145,15 +144,6 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ @@ -182,53 +172,12 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Composite3DTileContent.prototype.request = function() { - var that = this; - - var distance = this._tile.distanceToCamera; - var promise = RequestScheduler.schedule(new Request({ - url : this._url, - server : this._tile.requestServer, - requestFunction : loadArrayBuffer, - type : RequestType.TILES3D, - distance : distance - })); - - if (!defined(promise)) { - return false; - } - - this.state = Cesium3DTileContentState.LOADING; - promise.then(function(arrayBuffer) { - if (that.isDestroyed()) { - return when.reject('tileset is destroyed'); - } - that.initialize(arrayBuffer); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - return true; - }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Composite3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { + function initialize(content, arrayBuffer, byteOffset, factory) { byteOffset = defaultValue(byteOffset, 0); var uint8Array = new Uint8Array(arrayBuffer); - var magic = getMagic(uint8Array, byteOffset); - if (magic !== 'cmpt') { - throw new DeveloperError('Invalid Composite Tile. Expected magic=cmpt. Read magic=' + magic); - } - var view = new DataView(arrayBuffer); - - byteOffset += sizeOfUint32; // Skip magic number + byteOffset += sizeOfUint32; // Skip magic //>>includeStart('debug', pragmas.debug); var version = view.getUint32(byteOffset, true); @@ -244,9 +193,6 @@ define([ var tilesLength = view.getUint32(byteOffset, true); byteOffset += sizeOfUint32; - this.state = Cesium3DTileContentState.PROCESSING; - this._contentReadyToProcessPromise.resolve(this); - var contentPromises = []; for (var i = 0; i < tilesLength; ++i) { @@ -255,12 +201,11 @@ define([ // Tile byte length is stored after magic and version var tileByteLength = view.getUint32(byteOffset + sizeOfUint32 * 2, true); - var contentFactory = this._factory[tileType]; + var contentFactory = factory[tileType]; if (defined(contentFactory)) { - var content = contentFactory(this._tileset, this._tile, this._url); - content.initialize(arrayBuffer, byteOffset); - this._contents.push(content); + var innerContent = contentFactory(content._tileset, content._tile, content._url, arrayBuffer, byteOffset); + content._contents.push(innerContent); contentPromises.push(content.readyPromise); } else { throw new DeveloperError('Unknown tile content type, ' + tileType + ', inside Composite tile'); @@ -269,16 +214,12 @@ define([ byteOffset += tileByteLength; } - var that = this; - when.all(contentPromises).then(function() { - that.state = Cesium3DTileContentState.READY; - that._readyPromise.resolve(that); + content._readyPromise.resolve(content); }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); + content._readyPromise.reject(error); }); - }; + } /** * Part of the {@link Cesium3DTileContent} interface. diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 503577a7811c..350558131e02 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -1,14 +1,10 @@ /*global define*/ define([ '../Core/defineProperties', - '../Core/destroyObject', - '../ThirdParty/when', - './Cesium3DTileContentState' + '../Core/destroyObject' ], function( defineProperties, - destroyObject, - when, - Cesium3DTileContentState) { + destroyObject) { 'use strict'; /** @@ -25,20 +21,8 @@ define([ /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = undefined; this.batchTable = undefined; this.featurePropertiesDirty = false; - - this._contentReadyToProcessPromise = when.defer(); - this._readyPromise = when.defer(); - - // Transition into the PROCESSING state. - this.state = Cesium3DTileContentState.PROCESSING; - this._contentReadyToProcessPromise.resolve(this); - - // Transition into the READY state. - this.state = Cesium3DTileContentState.READY; - this._readyPromise.resolve(this); } defineProperties(Empty3DTileContent.prototype, { diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index 9e9c543b1373..f12a093106ce 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -13,23 +13,18 @@ define([ '../Core/Ellipsoid', '../Core/getAbsoluteUri', '../Core/getBaseUri', - '../Core/getMagic', '../Core/getStringFromTypedArray', '../Core/joinUrls', - '../Core/loadArrayBuffer', '../Core/Math', '../Core/Matrix3', '../Core/Matrix4', '../Core/Quaternion', - '../Core/Request', - '../Core/RequestScheduler', '../Core/RequestType', '../Core/Transforms', '../Core/TranslationRotationScale', '../ThirdParty/Uri', '../ThirdParty/when', './Cesium3DTileBatchTable', - './Cesium3DTileContentState', './Cesium3DTileFeature', './Cesium3DTileFeatureTable', './ModelInstanceCollection' @@ -47,23 +42,18 @@ define([ Ellipsoid, getAbsoluteUri, getBaseUri, - getMagic, getStringFromTypedArray, joinUrls, - loadArrayBuffer, CesiumMath, Matrix3, Matrix4, Quaternion, - Request, - RequestScheduler, RequestType, Transforms, TranslationRotationScale, Uri, when, Cesium3DTileBatchTable, - Cesium3DTileContentState, Cesium3DTileFeature, Cesium3DTileFeatureTable, ModelInstanceCollection) { @@ -79,7 +69,7 @@ define([ * * @private */ - function Instanced3DModel3DTileContent(tileset, tile, url) { + function Instanced3DModel3DTileContent(tileset, tile, url, arrayBuffer, byteOffset) { this._modelInstanceCollection = undefined; this._url = url; this._tileset = tileset; @@ -88,13 +78,12 @@ define([ /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = Cesium3DTileContentState.UNLOADED; this.batchTable = undefined; this.featurePropertiesDirty = false; - this._contentReadyToProcessPromise = when.defer(); - this._readyPromise = when.defer(); this._features = undefined; + + initialize(this, arrayBuffer, byteOffset); } defineProperties(Instanced3DModel3DTileContent.prototype, { @@ -103,11 +92,7 @@ define([ */ featuresLength : { get : function() { - if (defined(this._modelInstanceCollection)) { - return this._modelInstanceCollection.length; - } else { - return 0; - } + return this.batchTable.featuresLength; } }, @@ -125,9 +110,9 @@ define([ */ trianglesLength : { get : function() { - var collection = this._modelInstanceCollection; - if (defined(collection) && defined(collection._model)) { - return collection._model.trianglesLength; + var model = this._modelInstanceCollection._model; + if (defined(model)) { + return model.trianglesLength; } return 0; } @@ -138,9 +123,9 @@ define([ */ vertexMemorySizeInBytes : { get : function() { - var collection = this._modelInstanceCollection; - if (defined(collection) && defined(collection._model)) { - return collection._model.vertexMemorySizeInBytes; + var model = this._modelInstanceCollection._model; + if (defined(model)) { + return model.vertexMemorySizeInBytes; } return 0; } @@ -151,9 +136,9 @@ define([ */ textureMemorySizeInBytes : { get : function() { - var collection = this._modelInstanceCollection; - if (defined(collection) && defined(collection._model)) { - return collection._model.textureMemorySizeInBytes; + var model = this._modelInstanceCollection._model; + if (defined(model)) { + return model.textureMemorySizeInBytes; } return 0; } @@ -164,10 +149,7 @@ define([ */ batchTableMemorySizeInBytes : { get : function() { - if (defined(this.batchTable)) { - return this.batchTable.memorySizeInBytes; - } - return 0; + return this.batchTable.memorySizeInBytes; } }, @@ -180,21 +162,12 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ readyPromise : { get : function() { - return this._readyPromise.promise; + return this._modelInstanceCollection.readyPromise; } } }); @@ -235,55 +208,16 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Instanced3DModel3DTileContent.prototype.request = function() { - var that = this; - var distance = this._tile.distanceToCamera; - var promise = RequestScheduler.schedule(new Request({ - url : this._url, - server : this._tile.requestServer, - requestFunction : loadArrayBuffer, - type : RequestType.TILES3D, - distance : distance - })); - - if (!defined(promise)) { - return false; - } - - this.state = Cesium3DTileContentState.LOADING; - promise.then(function(arrayBuffer) { - if (that.isDestroyed()) { - return when.reject('tileset is destroyed'); - } - that.initialize(arrayBuffer); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - return true; - }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Instanced3DModel3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { + function initialize(content, arrayBuffer, byteOffset) { var byteStart = defaultValue(byteOffset, 0); byteOffset = defaultValue(byteOffset, 0); var uint8Array = new Uint8Array(arrayBuffer); - var magic = getMagic(uint8Array, byteOffset); - if (magic !== 'i3dm') { - throw new DeveloperError('Invalid Instanced 3D Model. Expected magic=i3dm. Read magic=' + magic); - } - var view = new DataView(arrayBuffer); - byteOffset += sizeOfUint32; // Skip magic number + byteOffset += sizeOfUint32; // Skip magic - var version = view.getUint32(byteOffset, true); //>>includeStart('debug', pragmas.debug); + var version = view.getUint32(byteOffset, true); if (version !== 1) { throw new DeveloperError('Only Instanced 3D Model version 1 is supported. Version ' + version + ' is not.'); } @@ -351,7 +285,7 @@ define([ } } - this.batchTable = new Cesium3DTileBatchTable(this, instancesLength, batchTableJson, batchTableBinary); + content.batchTable = new Cesium3DTileBatchTable(content, instancesLength, batchTableJson, batchTableBinary); var gltfByteLength = byteStart + byteLength - byteOffset; //>>includeStart('debug', pragmas.debug); @@ -365,22 +299,22 @@ define([ // Create model instance collection var collectionOptions = { instances : new Array(instancesLength), - batchTable : this.batchTable, + batchTable : content.batchTable, cull : false, // Already culled by 3D Tiles url : undefined, requestType : RequestType.TILES3D, gltf : undefined, basePath : undefined, incrementallyLoadTextures : false, - upAxis : this._tileset._gltfUpAxis + upAxis : content._tileset._gltfUpAxis }; if (gltfFormat === 0) { var gltfUrl = getStringFromTypedArray(gltfView); - collectionOptions.url = getAbsoluteUri(joinUrls(getBaseUri(this._url, true), gltfUrl)); + collectionOptions.url = getAbsoluteUri(joinUrls(getBaseUri(content._url, true), gltfUrl)); } else { collectionOptions.gltf = gltfView; - collectionOptions.basePath = getBaseUri(this._url, true); + collectionOptions.basePath = getAbsoluteUri(getBaseUri(content._url, true)); } var eastNorthUp = featureTable.getGlobalProperty('EAST_NORTH_UP'); @@ -513,21 +447,8 @@ define([ }; } - var modelInstanceCollection = new ModelInstanceCollection(collectionOptions); - this._modelInstanceCollection = modelInstanceCollection; - this.state = Cesium3DTileContentState.PROCESSING; - this._contentReadyToProcessPromise.resolve(this); - - var that = this; - - modelInstanceCollection.readyPromise.then(function(modelInstanceCollection) { - that.state = Cesium3DTileContentState.READY; - that._readyPromise.resolve(that); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - }; + content._modelInstanceCollection = new ModelInstanceCollection(collectionOptions); + } /** * Part of the {@link Cesium3DTileContent} interface. diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 07034d7618d7..c640c3978f8f 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -10,16 +10,11 @@ define([ '../Core/defineProperties', '../Core/destroyObject', '../Core/DeveloperError', - '../Core/getMagic', '../Core/getStringFromTypedArray', - '../Core/loadArrayBuffer', '../Core/Matrix3', '../Core/Matrix4', '../Core/oneTimeWarning', '../Core/PrimitiveType', - '../Core/Request', - '../Core/RequestScheduler', - '../Core/RequestType', '../Core/Transforms', '../Core/WebGLConstants', '../Renderer/Buffer', @@ -34,7 +29,6 @@ define([ './BlendingState', './Cesium3DTileBatchTable', './Cesium3DTileColorBlendMode', - './Cesium3DTileContentState', './Cesium3DTileFeature', './Cesium3DTileFeatureTable', './SceneMode' @@ -49,16 +43,11 @@ define([ defineProperties, destroyObject, DeveloperError, - getMagic, getStringFromTypedArray, - loadArrayBuffer, Matrix3, Matrix4, oneTimeWarning, PrimitiveType, - Request, - RequestScheduler, - RequestType, Transforms, WebGLConstants, Buffer, @@ -73,7 +62,6 @@ define([ BlendingState, Cesium3DTileBatchTable, Cesium3DTileColorBlendMode, - Cesium3DTileContentState, Cesium3DTileFeature, Cesium3DTileFeatureTable, SceneMode) { @@ -89,7 +77,7 @@ define([ * * @private */ - function PointCloud3DTileContent(tileset, tile, url) { + function PointCloud3DTileContent(tileset, tile, url, arrayBuffer, byteOffset) { this._url = url; this._tileset = tileset; this._tile = tile; @@ -132,15 +120,15 @@ define([ /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = Cesium3DTileContentState.UNLOADED; this.batchTable = undefined; this.featurePropertiesDirty = false; - this._contentReadyToProcessPromise = when.defer(); this._readyPromise = when.defer(); this._features = undefined; this._pointsLength = 0; this._vertexMemorySizeInBytes = 0; + + initialize(this, arrayBuffer, byteOffset); } defineProperties(PointCloud3DTileContent.prototype, { @@ -213,15 +201,6 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ @@ -282,52 +261,12 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - PointCloud3DTileContent.prototype.request = function() { - var that = this; - - var distance = this._tile.distanceToCamera; - var promise = RequestScheduler.schedule(new Request({ - url : this._url, - server : this._tile.requestServer, - requestFunction : loadArrayBuffer, - type : RequestType.TILES3D, - distance : distance - })); - - if (!defined(promise)) { - return false; - } - - this.state = Cesium3DTileContentState.LOADING; - promise.then(function(arrayBuffer) { - if (that.isDestroyed()) { - return when.reject('tileset is destroyed'); - } - that.initialize(arrayBuffer); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - return true; - }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - PointCloud3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { + function initialize(content, arrayBuffer, byteOffset) { byteOffset = defaultValue(byteOffset, 0); var uint8Array = new Uint8Array(arrayBuffer); - var magic = getMagic(uint8Array, byteOffset); - if (magic !== 'pnts') { - throw new DeveloperError('Invalid Points tile. Expected magic=pnts. Read magic=' + magic); - } - var view = new DataView(arrayBuffer); - byteOffset += sizeOfUint32; // Skip magic number + byteOffset += sizeOfUint32; // Skip magic //>>includeStart('debug', pragmas.debug); var version = view.getUint32(byteOffset, true); @@ -398,7 +337,7 @@ define([ positions = featureTable.getPropertyArray('POSITION', ComponentDatatype.FLOAT, 3); var rtcCenter = featureTable.getGlobalProperty('RTC_CENTER'); if (defined(rtcCenter)) { - this._rtcCenter = Cartesian3.unpack(rtcCenter); + content._rtcCenter = Cartesian3.unpack(rtcCenter); } } else if (defined(featureTableJson.POSITION_QUANTIZED)) { positions = featureTable.getPropertyArray('POSITION_QUANTIZED', ComponentDatatype.UNSIGNED_SHORT, 3); @@ -410,7 +349,7 @@ define([ throw new DeveloperError('Global property: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.'); } //>>includeEnd('debug'); - this._quantizedVolumeScale = Cartesian3.unpack(quantizedVolumeScale); + content._quantizedVolumeScale = Cartesian3.unpack(quantizedVolumeScale); var quantizedVolumeOffset = featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET'); //>>includeStart('debug', pragmas.debug); @@ -418,7 +357,7 @@ define([ throw new DeveloperError('Global property: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.'); } //>>includeEnd('debug'); - this._quantizedVolumeOffset = Cartesian3.unpack(quantizedVolumeOffset); + content._quantizedVolumeOffset = Cartesian3.unpack(quantizedVolumeOffset); } //>>includeStart('debug', pragmas.debug); @@ -442,13 +381,13 @@ define([ isRGB565 = true; } else if (defined(featureTableJson.CONSTANT_RGBA)) { var constantRGBA = featureTable.getGlobalProperty('CONSTANT_RGBA'); - this._constantColor = Color.fromBytes(constantRGBA[0], constantRGBA[1], constantRGBA[2], constantRGBA[3], this._constantColor); + content._constantColor = Color.fromBytes(constantRGBA[0], constantRGBA[1], constantRGBA[2], constantRGBA[3], content._constantColor); } else { // Use a default constant color - this._constantColor = Color.clone(Color.DARKGRAY, this._constantColor); + content._constantColor = Color.clone(Color.DARKGRAY, content._constantColor); } - this._isTranslucent = isTranslucent; + content._isTranslucent = isTranslucent; // Get the normals var normals; @@ -486,7 +425,7 @@ define([ // Copy the batchTableBinary section and let the underlying ArrayBuffer be freed batchTableBinary = new Uint8Array(batchTableBinary); } - this.batchTable = new Cesium3DTileBatchTable(this, batchLength, batchTableJson, batchTableBinary); + content.batchTable = new Cesium3DTileBatchTable(content, batchLength, batchTableJson, batchTableBinary); } // If points are not batched and there are per-point properties, use these properties for styling purposes @@ -508,25 +447,22 @@ define([ } } - this._parsedContent = { + content._parsedContent = { positions : positions, colors : colors, normals : normals, batchIds : batchIds, styleableProperties : styleableProperties }; - this._pointsLength = pointsLength; - - this._isQuantized = isQuantized; - this._isOctEncoded16P = isOctEncoded16P; - this._isRGB565 = isRGB565; - this._hasColors = defined(colors); - this._hasNormals = defined(normals); - this._hasBatchIds = defined(batchIds); - - this.state = Cesium3DTileContentState.PROCESSING; - this._contentReadyToProcessPromise.resolve(this); - }; + content._pointsLength = pointsLength; + + content._isQuantized = isQuantized; + content._isOctEncoded16P = isOctEncoded16P; + content._isRGB565 = isRGB565; + content._hasColors = defined(colors); + content._hasNormals = defined(normals); + content._hasBatchIds = defined(batchIds); + } var positionLocation = 0; var colorLocation = 1; @@ -1210,8 +1146,6 @@ define([ createShaders(this, frameState, tileset.style); updateModelMatrix = true; - // Set state to ready - this.state = Cesium3DTileContentState.READY; this._readyPromise.resolve(this); this._parsedContent = undefined; // Unload } diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index 4110b9cf525a..d401d2162fbf 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -1,16 +1,20 @@ /*global define*/ define([ + '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', '../Core/destroyObject', - '../ThirdParty/when', - './Cesium3DTileContentState' + '../Core/DeveloperError', + '../Core/getStringFromTypedArray', + '../ThirdParty/when' ], function( + defaultValue, defined, defineProperties, destroyObject, - when, - Cesium3DTileContentState) { + DeveloperError, + getStringFromTypedArray, + when) { 'use strict'; /** @@ -23,7 +27,7 @@ define([ * * @private */ - function Tileset3DTileContent(tileset, tile, url) { + function Tileset3DTileContent(tileset, tile, url, arrayBuffer, byteOffset) { this._tileset = tileset; this._tile = tile; this._url = url; @@ -31,12 +35,12 @@ define([ /** * The following properties are part of the {@link Cesium3DTileContent} interface. */ - this.state = Cesium3DTileContentState.UNLOADED; this.batchTable = undefined; this.featurePropertiesDirty = false; - this._contentReadyToProcessPromise = when.defer(); this._readyPromise = when.defer(); + + initialize(this, arrayBuffer, byteOffset); } defineProperties(Tileset3DTileContent.prototype, { @@ -103,15 +107,6 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ @@ -122,6 +117,22 @@ define([ } }); + function initialize(content, arrayBuffer, byteOffset) { + byteOffset = defaultValue(byteOffset, 0); + var uint8Array = new Uint8Array(arrayBuffer); + var jsonString = getStringFromTypedArray(uint8Array, byteOffset); + var tilesetJson; + + try { + tilesetJson = JSON.parse(jsonString); + } catch (error) { + content._readyPromise.reject(new DeveloperError('Invalid json content')); + } + + content._tileset.loadTileset(content._url, tilesetJson, content._tile); + content._readyPromise.resolve(content); + } + /** * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent * always returns false since a tile of this type does not have any features. @@ -138,31 +149,6 @@ define([ return undefined; }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Tileset3DTileContent.prototype.request = function() { - var that = this; - - this.state = Cesium3DTileContentState.LOADING; - this._tileset.loadTileset(this._url, this._tile).then(function() { - that.state = Cesium3DTileContentState.PROCESSING; - that._contentReadyToProcessPromise.resolve(that); - that.state = Cesium3DTileContentState.READY; - that._readyPromise.resolve(that); - }).otherwise(function(error) { - that.state = Cesium3DTileContentState.FAILED; - that._readyPromise.reject(error); - }); - return true; - }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Tileset3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 9bc1ae00271f..53b86e4a07d8 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -271,7 +271,6 @@ defineSuite([ expect(tileset._geometricError).toEqual(240.0); expect(tileset._root).toBeDefined(); - expect(tileset._root.descendantsWithContent).toBeUndefined(); expect(tileset.url).toEqual(tilesetUrl); }); }); From 2c78cc99edfc1e923eb16a42b7d9c020ffc6797b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 18 Apr 2017 17:17:49 -0400 Subject: [PATCH 2/3] Tests --- Source/Scene/Batched3DModel3DTileContent.js | 1 - Source/Scene/Cesium3DTileContent.js | 14 +- Source/Scene/Cesium3DTileset.js | 2 +- Source/Scene/Composite3DTileContent.js | 12 +- Source/Scene/Empty3DTileContent.js | 23 +-- Source/Scene/Model.js | 2 +- Source/Scene/Tileset3DTileContent.js | 3 +- Specs/Cesium3DTilesTester.js | 49 +---- .../Tilesets/TilesetInvalid/lr.b3dm | Bin 14833 -> 0 bytes .../Tilesets/TilesetInvalid/tileset.json | 104 ----------- .../Tilesets/TilesetInvalid/ul.b3dm | Bin 14813 -> 0 bytes .../Tilesets/TilesetInvalid/ur.b3dm | Bin 14821 -> 0 bytes .../Scene/Batched3DModel3DTileContentSpec.js | 21 +-- ...iderSpec.js => Cesium3DTileContentSpec.js} | 22 ++- Specs/Scene/Cesium3DTileSpec.js | 20 +-- Specs/Scene/Cesium3DTilesetSpec.js | 168 +++++++----------- Specs/Scene/Composite3DTileContentSpec.js | 19 +- Specs/Scene/Empty3DTileContentSpec.js | 15 +- .../Instanced3DModel3DTileContentSpec.js | 49 +---- Specs/Scene/PointCloud3DTileContentSpec.js | 29 +-- Specs/Scene/Tileset3DTileContentSpec.js | 8 - .../Cesium3DTilesInspectorSpec.js | 12 +- 22 files changed, 129 insertions(+), 444 deletions(-) delete mode 100644 Specs/Data/Cesium3DTiles/Tilesets/TilesetInvalid/lr.b3dm delete mode 100644 Specs/Data/Cesium3DTiles/Tilesets/TilesetInvalid/tileset.json delete mode 100644 Specs/Data/Cesium3DTiles/Tilesets/TilesetInvalid/ul.b3dm delete mode 100644 Specs/Data/Cesium3DTiles/Tilesets/TilesetInvalid/ur.b3dm rename Specs/Scene/{Cesium3DTileProviderSpec.js => Cesium3DTileContentSpec.js} (58%) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 532c152b618d..68fab243dc29 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -386,7 +386,6 @@ define([ this._model.shadows = this._tileset.shadows; this._model.debugWireframe = this._tileset.debugWireframe; this._model.update(frameState); - frameState.addCommand = oldAddCommand; }; diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index 082040937664..c06afb803012 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -111,28 +111,28 @@ define([ }, /** - * Gets the tile's batch table memory in bytes. + * Gets the tile's texture memory in bytes. * * @memberof Cesium3DTileContent.prototype * * @type {Number} * @readonly */ - batchTableMemorySizeInBytes : { + textureMemorySizeInBytes : { get : function() { DeveloperError.throwInstantiationError(); } }, /** - * Gets the tile's texture memory in bytes. + * Gets the tile's batch table memory in bytes. * * @memberof Cesium3DTileContent.prototype * * @type {Number} * @readonly */ - textureMemorySizeInBytes : { + batchTableMemorySizeInBytes : { get : function() { DeveloperError.throwInstantiationError(); } @@ -142,7 +142,7 @@ define([ * Gets the array of {@link Cesium3DTileContent} objects that represent the * content a composite's inner tiles, which can also be composites. * - * @memberof Composite3DTileContent.prototype + * @memberof Cesium3DTileContent.prototype * * @type {Array} * @readonly @@ -156,10 +156,10 @@ define([ /** * Gets the promise that will be resolved when the tile's content is ready to render. * + * @memberof Cesium3DTileContent.prototype + * * @type {Promise.} * @readonly - * - * @private */ readyPromise : { get : function() { diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 60e65fbfc3c7..c4a120e74ddd 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -1515,7 +1515,7 @@ define([ function selectionHeuristic(tileset, ancestor, tile) { var skipLevels = tileset.skipLODs ? tileset._skipLevels : 0; var skipSSEFactor = tileset.skipLODs ? tileset.skipSSEFactor : 0.1; - return (ancestor !== tile && tile.hasRenderableContent && !tileset.immediatelyLoadDesiredLOD) && + return (ancestor !== tile && !tile.hasEmptyContent && !tileset.immediatelyLoadDesiredLOD) && (tile._sse < ancestor._sse / skipSSEFactor) && (tile._depth > ancestor._depth + skipLevels); } diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index 3542dcde479a..d58dc192a44c 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -10,8 +10,7 @@ define([ '../Core/Request', '../Core/RequestScheduler', '../Core/RequestType', - '../ThirdParty/when', - './Cesium3DTileContentState' + '../ThirdParty/when' ], function( defaultValue, defined, @@ -23,8 +22,7 @@ define([ Request, RequestScheduler, RequestType, - when, - Cesium3DTileContentState) { + when) { 'use strict'; /** @@ -206,7 +204,7 @@ define([ if (defined(contentFactory)) { var innerContent = contentFactory(content._tileset, content._tile, content._url, arrayBuffer, byteOffset); content._contents.push(innerContent); - contentPromises.push(content.readyPromise); + contentPromises.push(innerContent.readyPromise); } else { throw new DeveloperError('Unknown tile content type, ' + tileType + ', inside Composite tile'); } @@ -235,11 +233,11 @@ define([ /** * Part of the {@link Cesium3DTileContent} interface. */ - Composite3DTileContent.prototype.update = function(tileset, context, frameState, commandList) { + Composite3DTileContent.prototype.update = function(tileset, frameState) { var contents = this._contents; var length = contents.length; for (var i = 0; i < length; ++i) { - contents[i].update(tileset, context, frameState, commandList); + contents[i].update(tileset, frameState); } }; diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 350558131e02..724647d2a81e 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -89,21 +89,12 @@ define([ } }, - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - contentReadyToProcessPromise : { - get : function() { - return this._contentReadyToProcessPromise.promise; - } - }, - /** * Part of the {@link Cesium3DTileContent} interface. */ readyPromise : { get : function() { - return this._readyPromise.promise; + return undefined; } } }); @@ -124,18 +115,6 @@ define([ return undefined; }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Empty3DTileContent.prototype.request = function() { - }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Empty3DTileContent.prototype.initialize = function(arrayBuffer, byteOffset) { - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 8f6360e91f1b..c9b233c6e031 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -4290,7 +4290,7 @@ define([ var extensionsUsed = model.gltf.extensionsUsed; if (defined(extensionsUsed)) { var extensionsUsedCount = extensionsUsed.length; - for (var index=0;indexwLhYQA}X~$_hlTnfRpjJ|7OCHnMr~~LV`&^Y=m?&`6U^hCC(Co2*oND zQSlX*s?drH;@*laRcb@#SG6i`bzkdJw`!|h-s?x-r}*Bvcjo@)Ocs)0-}{5l%fP+o zckVgg`@QF$dw#!xU)t36_+9|;S3kfJ*t4IN zUU#(JUC|tjs%ny=3!QHIRY_O;rr&UUb)PP4eqF*5S=gCApNTg3QH08n z6;o9-#iwZwoGJT!x@pLUU)O}4X3DbPXX>VDI(8b;MH<-hHH9-`Ns`w<;<``45l{X? zLua-QzbvT*m9FBC-=`bMs-QCbvS#26nrixlBaZqcT&@G9`*Ed);#V}y@ski*kr7wZa>J*HRlOOg)*g_|M!6q6ZgK24Ps-6#3{K26d*2&MUCQ#T|D*JYp? z`uSADkWJH&RD%W3`bS?c4>Qp)J>|O3E1Q}wnLdo8-|%5h>zY@Q z6v?k)hD$z4(r~ll;Ux&*Q!xalruq#@_NjO@Jf`fGCCS7LR22oIsdy03lr;P?Fw5~c zDT|hSimOi~Q}J+YENfTrQ2vXSFL~Jl@$}+0`tfM9^-H+TvTn$_pOMyj5Yl z>a0X(rii3)uWb6j?1r7Rlh`%P#S?fwb`+!jg0#^Zde#aU!Q=*Z8`x zG%MKy1|vKWaI^vOnQ|$hAMa#r53MB`E5WiYJwI)+MzJ?q{q>S0Z{r7Sq=4$Sj+C!m%v(cZcI`QM?i1 zq>`82{quiioTEM3(UDD~YYSEz_CcK$kEZj-0w34dhbhzDRwNq><58l@u4p2fz&j|v z;bl_cM7leivJ#P{n9IxAs^eC=E6;&REUCIv(Ky~+dziKb&shfVm~Gii-e_J!Q*Co? zLp?5K@ZH$su5W0Z8?2*)g`1Vf-CVPV=Oew$JQZbkWSPe>AIb9k1y!-&iYT>k z$&H#sIL`Ld0mK^J6^*rHY!Q)9nhwXiV_3iP`H_xbtwV==kK4trIj6!%ue-pqr3lJ# zGMJdz6t~4-gcF!`?AfP)8$lkaaNz>WV`nNH=dcBtpEJ6LE$(pf`3dn_ogE6d;#84j zGS!ZI#74v(;Bq@s;m$Z_Xj50X-D2gsRKc^^N}<1FfEC%flz5R$b6-xbbkM21s&1%w zM=2?<^kA~|9C!|$G9?}X2Nni4IRnK9!g=U*r>%H6 zk%>ldn~No|b#6m-P2GapnzJ!C@;6G{F4JIuspNT9geB#W81ot%&aA28Rb!xMei=i0 zIn&kFFQ{p3s%dTv);D4KsVSLW$LXEoDQ@7%%V4~m+F3Gyn^Ig~t6JS$TUXOmT{~;m ze8fhtVs$NX!;xZ%9W+v`vto#Soj{+`nmb_7*;`CTLdq$!BwPktX<^q(tqV1Gpe@OS zQhQQ}g-?O2$dOWer#cgBmF0G!!eEv-wFYC9!5bk@EGrRiV~=Vr`0YdU;MZUNSei{l zJ1}>-MYeTN^6|P&(-9A5>)`wvoN~;rG@A<1DkK*hcM`=(8K!lz#K{+?EoMP6A(+0H z1I2XU`eFvS(~itWN;9A|A$W}_K6tSDRy=X+3hxqlP}xmNk#$+ty%K(ZR`I(tes?d| zOclS0%3l0e3QfVUl%_|+FZa4Cdv*M`2K@G@`xfC0F4xyRhXpIDzwUo){L%gQ9eQc- zhkyPJm%pm-4nDH!=Dw#szdkU{zcaAkt^4&edGlEx2I}6ORr%=4$LCIOX%Dtrrv#Y% z?8>^}f2E#`7X&pdmjTxmc2bkLsk z^>llOQo-fmgO&DEx1VnNUe@g7X-)R`Zqv9toDIdN^HO|@Lpe~+)P{1P_|%u;Q*M+4 z#Xqj+)Bba}y`8&j+N-&T%1-a!RR0o}Z;7__zt`87OZGjItDOV68>T+N<>w|$%I!br zfn3WIJ9BT9uj+4lXET@2s$buKb;G*c33L9C+y98eb2YzO&*kB4C_bH+;!_;TfpVrc zlmo@5z7(HwqZ}yyxz?t@fqy+H^j@qXv}#)kjAy5PBMyrJ*>?z~W-IvF@% z#>re>y#AEHMSn3u8z1(B?!Uhx_{@v|mnT1SVsOXh3qnU8H#@Xr%Jr4YrqAW_a5fa5 z&P(wr4&^{OQya>G;!|IWPq|SJ6#t}6+k$-)rrLiCO|zfg`1j!QhumDgrTnwtU4cXF zJ13lKe>_Yp*Q{NA6y$iVf<%6#WACJ77yYrfAd)`AE zgR{qd!R6s>C_bH+;!_;TfpVrclmo@5z7(HwqZ}yyb(MG8m&S9s6WU&z8QXZHJtMY- z%Ln{mgMD6bRc=M^X94Zxd+Y~7*K+xbihJx&zF3#r`Rq0QkFVcgZ~XicF1KHNvwhQL z<+)$i9U8dGb-!J)%e)8F~{@3)`Z zc10lj)jNUA$%j=kS-Wv_;FwE34`lAG3tlxl+yBy}+qt}KdQZRk$)>;|7rwZC#_^j2 zD;NKT%U>;D6u9u9j^J;Pcs;OU#e@BgF9x_goDIdN^HO|@Lpe~+)P{1P_|%u;Q*M+4 z#m~OeX+L?98T^wqHMDU29Q&ff=X3dqx9ja$D^>^nJEn&|+UL*)tW|CyUJ_wvv`BU`pJc{m%2 zPv@oh6o+!4oT&}vK=G+B#i!gT2a5mdb!$Txym@|T(UoV1o_y>_p&9GCxqS1u>q9LK zD?-)ruF!oiTp3z>!%{B))HyGtquK z+HXhu5#>?FgvM~hn9#V1n4D0(#);1eGLH$`IPuw)Jj$5R7>*bd8n^$e_^|&q6|ovY z=J6@mj41CZ@mcfoWlsK#AoG}@jgvpSlJ}JOjF2;xtVWGCXGC3M_IpZv=Gq@Q`7?sd z^9OC5{MnVfr^M&~^JnOLy{O5aSDtk8X9St&5862SvnzQ|$)9*;`F64h!Ru=oAWMRj8HZJ}O{ZKvwZK$mn6MkZh z^+SybJ258ggx_%ELNDxuAH@+m(F>n}HUdNFMKAQC7kbuTQC{E zjs0Xe6#fkk!}c&Z9DkSKNH_}Hqu^*b4vvLm;CSqh0T-MAZfxCfBAfyz!%1)|_9wwq zm;z;R8un%2fpYL->xI)n0vQx+6;Qzd9W*ep*T4sUsKB-Yrol{@0n?!p`{@vZAOxTa z`v6o!4a~xJ7MuaIp%%`>_Dq-q^)MIepaJ_jm3T<=)}Gqx*!VYVS65&4+)4v43gN#AO#mdH>9!e zh74q(2iqRF5SGAFScdH~=!F%q94>6SgX1EjXg1fQ38}5Po;Xb$*ev19Q@H2P-wqUyj9)zv%3-~$w z68oRSHh35wf?r|(5Ih3EhCXcjU_10f4s2{~_zgS`kHMqxTkIc&C*VnV3fre(2RsYU zz|-&?_D{nL@H==OUc~-+cnMyHSFn8rUWM1-b$A2YH{eb9J-iKX!8_Q$1@FRp@IJQh z!yn)y_z*sTkFoy%K7~KRC-52epTM8s&+s|6pTigQ5R6LR3&!>thbLt$pS|&1jpefs zp1rYr_Qf+hmd|)R-DCMoz&#d_&ijh4j#x6BaXGIdPMcU9>aijU zjuhW>nl=$%`i?}|o3XAg{Jog&y!W(;g?Elz@o+|S4SMNl(D=aDjYZyz;}XpjOh5cJtFrcFrYsNViA`bi6=#Yh zV@bBiVS&wKsu+Gl2;S(67zu)TlW zYv#+|>#V)jZ~yk%Yp-(#PHL38$RGfC+W`13_UxzWxOCs@_M25jQ>x2KrcJJz;vO%F zZ7%lH>JHVp$IlW4Nst9aPzA4`2|hs=jM;*_EEa7DC7bJlXfaOmD3ak5Mb&3`bwd}u zijdZ6x~k}^*N|jck~2D=WXOhBmVI7B;dVYzHbhkvWmS=gPBDC%VyLRY;S5FAL|O6q zG|k6#x`FtrxNG^Bq4L*(?v;>4aKW@xk~h^s)F+%c1DF%R7uuFRT8-sqp#~C8i@{;;YAeuRaNdM zX{t{XHPI(K8Wk-t9IDEZbe|#WKAcch94nt8BLP)IB`#q~Fx1eP#2t|&kEVGg9S41? zs!5_ENTLVvR0AjRDw-ing3p6HrlF1O)4g5{nV@-ms;)|sp{bhe#T_#|npZ_6pDsx{ znn;4~(G^KnMX#>N5-L@6k_;U5int_MMN{;WB@CZeQglrbb=)fC<5jH&h)ILeR} zP1g{^V4I>#v)dZNRg+kb8a{yH(|K+NYHNduL@b_gk8gGJi|VFWB9sipqD)!STwfoI z&jW8zB#iTVF_yJhF~-p z4RxMV0COpMDa1$Rp@p0LljTk^2O+!T-1qY+z6pecl2GlMmg%Wxpq5a(!$ z2P4hlWT+_|3f7t7rpADKd@|k~#G!Pxu&YT;C>n?_tY&qGVP--bh{pp9(^i@7Dhoy% zl8x-fD2s;RZjQ6L>jKHZc)`t9lr2DMSf?J*Y+$vC%$E)}NA_v_c#>k348$8)-BQ@O z%9*BG%I@dUapg?nbJ+Am6j{kd=E>mX%Te*wuC%c*vLx-wJiYL2oX9CTI=)xW%}Ttj zh>UPo!2SkA_er^cSeCGl=q)0|8jO)sx3ttu^_ zhD+&wCl=h($}6UtWppreqY~UzC07)cmsb?Cm}Gsij0^5+`{}c^m=5qPM2c8eL-+(h zM|q{q#vMmV)KMQ}cX+kUE;v!Vus0?iizTPoBdyFl9%6T6d?<51`L5$#D6fk;yr>sLBI617`L9cCl-lQ)Z;qonbjE3u@ye zF)^Ftwk-xD5XG!x&pjF3TI3NAWG=8gHpBxF8#W``=Zx;*EO#LL?1XsL&JG2tajM!_ zEMA9u#76iY;BxEZfrbcXXk}xdF38GtuENgdU>yA&1FXo-rDzw)gzamS%N=woFFqUM z7lPdKN)IMW&#vdtDO3FMuWMmolVjkz63&@a{%21ru}N{(#ML3bQ_j)1Bj8+h+aNr0 z*$o=+cAj&|UX90Gv7i5#j%*sMFFo!c-gz=l0mum}045EVE1L*AC}9@6shRW8>P`eB zfoL*Ri`$$nfz?yXi%ZI8l$OlI+(_Rjal3pP1B}P!1#4MS_J}dPqWsd5BD-pI^-M3L zM=xi((rGhFDk@8=D$Hq>Sbj=!ruX9XPVwY7aO9;iUQX@I8Nf}+uCH1tt|~1nsVpv? zH0g50Mz3sj&2ht#Y>DkQlC86Rh<%knpWK?;WzgAMOh!V=DY7J78e3^**K@5iHMgrR z$%I^cQi!=vhAYpJTzjWF6KjR#cBaB$mN>NrW0b@jp`BR4XrP8Ys?EZ09;zVYSN_@P z)Eo`fWA54(&DGtK&#v1v9nqt@dwz9KIcAreO_^wAl8cQyiQ=RT(>ht=>81M@L=^Vd*av?-X-v$vYV7F;Wu~Hga7>C)kPh@ zPYL5x{9Y()hDXP*)%b4Jol6^T;~>I|Y6Vm9*J7h3ktUAEj2^c%>EJcW!FI zsN#Z&BXnCf)D7+R`#(rEe{^ACz566<>Hf1UCV%UOv#n=}ewG?}%1CR{-?n!Y9nfrf zcjNh~SKhn7;CXp{>a%;tTE34bbuhU%8;VcorT7$wa-f{44dp=bsV~K++$aZ%e^>sk z{@-pJ+CFT$-+K1Bb^f_utt?=2{Y7{9xBu7mg**N<*qV6r&Hk;2C))DXQLFrO4}V(t z+M>1A!5z2z-`Ree$>eJ^mvvTCWwkAT=-+6avue3{ z`Plc&p?B}G&MlvB%d2nPXC2wI(%iZ8J~JY0vf3VBYs;_R@Sye1nupD$(Ukf5`)^p4 zkKS#|z1dKFIxoeiIFtkBOl>F!icfthKIKL^Q2f-0jn+TL{HE~TEt|~aS1z`MgKyjN zdw*DJJ$Txw=HM@%G~G|%Yn>PRq>#ybUw*_oa?f;g{z>)b>d#hLLly^Y`R_ly)!MkB z&3v??R?>}3D>y9;c2{SAeF&!*eVY2mZYB~Oj;M=x7u%WF2d{EyvK zZ%%$=SnAQF-+#x(<+gnD-Um2%ueVtrn#bGnmz}Gu6Bj()Q8G_3&l+*aI`gVk zDJBn_ddMnlyD?Qi=ZC2;j;ylU2mh*r$y1(RZ*3a&aN*{YHx$;5{>;kXJKUCgv!VEO zUW!j~CIP3f(ATR!{Bm8N@`Xbm}Z zFtuxy*PIKbw!E*!W&Y!ik5kiMSYwTN={mEu^Vha4-jXn%X&j#VZdtvxBXp+uX5MwS z+?x%>r}I*LibFY2&eVo-p!n36;!|#v1I6FDV^7N1vCTa6_!<7;ul~M$?{{|Ca)rLG z&6gIr{13GJIkn~WS8VxvzQNY!|2$$2fANSJT{$%6FZ#-s)sM~8!7-=$KY8RN z|JqxITC3p%Tkg$<;?sF4KE)AN}<@%m{y4p}%KF0m{ z80&i)<92+E+i}0%#<`x`aX*T~b-d?3U2Ql9*Ylq1dC&E%=RaKLV@%I=RPH)XZ73GC z`#Sz#7oT$CJUC`oj?}j6SWiA(ZF=(Oete8_pkrL7m|Vwwc+d6J_E_;bR&V}&jdMS4 zM>%mF=goVrr?wo2+HgCr<2~2+$Di9CD?az*ICM@bb34kB`*0oaxxPRC-1b=UxgW=& zb5fbxQI6b)>v+%g{qg6v$BNJWI1ZhY%G{1}+~Kes(reD23_=$usMc9bLc z;X2-PeSiG9?Xlty0`{u^ad14G2q(Z`I0^f~a59_%dD!N`sc;&63x>ey*bjj-;S3lG z-^P9@{2L5|v#>o2zJq@^a5kKS?KyBRjDYiCIE=)8IJn?^aAWI+3*dV&8b-nQu^$Cv zVGQKMh1lnV0OP=etp_dw5hReYl|cawyr6;)dlhsrU_7?tVFFBqOW>&f;A)6M1i}!*J`8b~4^5E3 zz6p}h3@zBUz%{S{7Q!NI7eOm5fi_qS*J8gIu7jnp4BKV!Be))Z49npL?3cp|xDkE= zE3y9xtb&{1W^8YUTi{msDXhkJHQWaO4!6S^Sd0A{xC7R~dTiIj2KX7=1$V+m?C*qo z;U2gfevbX!unB$v_hEY<+z$`HgRmLf&F~QX5*~qv;aAu{43ENN@Hn=Q!xOL-o`fy% z6!u%-Y1j_i;Mdr1gWte2(2i|8bU+F$=)|@YehWKc2RsYAuzwbI!*lRFw$H;0@Dl8S z7vW{>Uxaf6znFFL@9Q>~kERl!1JX$8$B1&tN=z z1NoeQXLcZ;6Y+EpuSV5gK0{8Psq!>bL5HylB%oQOGn+tyS{FeW1t`aeb1;1BLx}p zx4I_ewcyL;p=g5(sVc4(XP~602d^|}Hy=kG3)SHQLecydl*YJP^IQy8b>VETOS-Sh zHP#-^&(aa_75Xs~m>VI2t_a{+uy7F@X$V(O&-_`9joCF42#VHej5IOZjK%{^_$#Fo z^4j{^5qkyBi&@z~XY`p@v%2Z|%URt9_}f|8fph}ldt3aStnNef1+8xJ$MxEOX2kZa z%Xap$HHym#QCbKs3g)+Dk|(_pZ2vNAv;*m^*WO!&kCm~%=|TgRM){&g6kNRFFp7(Z z#Kz$lo_Irzy<05*GH<`x1{pbLyanF@Ee^$Td>rMQ4M29XjC&uva;z?N=*x_Ly2&Dj zaoX&xwTmLviRLJ>NxxQFQe<0Z!jqns17cPSF5Zm6^us@~%CCzh^V4ubcnq5_J5y~e z9Ak^@C79`91kX&yLWH1nY8Fw)jE6c$$wQ52A^l>%O_`bC37dqkQWs@OsQGCuXAVyQ S=gWO=@4sqR8i zSmQ^EO1;K~pqC)Mdpd3JP0MAjKCXcvVB!bwkq) z(UZMULq2o$)Rq)AK6|P?~G((bQ#j#Q~N%twT;PXiw z-cZp`KttJ=Q5k}wibz=%3E;)8E%9VH6^_T4 zvc9#kF_f4Y4$XHLl8ZXQ?Qz$4q(W7VjmZ$kM#x;&q!MA4zIYjoM_b~tP%Ks3(SjPE zD5*@@8bfPIL4%a7ch4*`F;CepMFZ^!fc_fBSP?K8aN8xHM^U}1sABHndGX1ZS{_aE$}*;ytonQ+ zW{f^}p(nTcSUeF8L|(&KImC6e|DcZ*(jlv@(3p?$!jGyCIMY6nfljMY-~mfpw}8%?4JP$b6Y#b7W2Bhm(}5R3OpB zs+NoeUdo%MPR#A+v2mqr;&a%{L=;)hN9M`ka@~fxURo9ka8hm4F zbsgQlxgK{o8fXf!4M*>2AQei40}*@w`9)^;Q=wpUEPPWdrmfqNSvI!?BCWQ+I}oi8 z<1Gj$#Tzc(-8270oTDM!*w~sx*Ev{i*avl?XgHZU7Wjb1K1`Wx2?bjt0X#}n*&L3A zV|eehZ*{3eAeL+iBto%Z2j=oZw(4jo*_`3PB$iYyiEtF}t8Gj>2hUjw@0Infsf^K# zs+#iJ@~TQ)O3(YS$6Z-fJ>9IJgW21Z$6Z@CyQHeBx|GEv=Zj_BTGlZVpEpFt&(jPnrxwTOwG$GWn4VVy#1mOpn{eu5C`)kxqA( z<(wR-jg!K}Y)#m<7>qy+vyMIWWO0MYBN516V0mmx1fn)-NQNVK<>#2@#>r% z3e@3L!FW8;fP2J7_#WVL8xw)1C}wC)bD$x_%5}cN&gM`8{T&0W$j+r;7s;gUYm>_# zbSkgx!zapa<&_>xmY&_up;M;#!(aEpz$VAQbtjxRsr2`rRAiIltjQb0e5ahFZ%4qn z>ajt1HS=yslR$zBy=uGmk1Oh-12)t6p(5br$MrvT)H6#$b4%au)p9h3-*-Sq5v z=yWGT(LgK}4&pZFN?_ges?xHGndN1(FgG$cO583@Wq^tJyikxOWv>`Bs;j1zmDp9I zyJuz@y?Qy*l~>LztF9@ltu`xbu>6$eP4C0$o#M%F;K)m5yqwyZH-MXxTVI`AT3cRG zR#RF&dGghWjb6Fxn&*Zixf0uBBv)to5c?v5KKV7b+n}?zn2dy!Q)EfFRJPLWuIF24 zYi@U2k_q|tq!4qTELWZ*`SwnACe|{`?QDg?EOBZL#wdk1LOZcSu|Pe0RGWj}I}{Io z^|K#KTVvry%w5}}wXR3<*>#(yBOc7Up83@?<(OT5Hf5ugO)fU>B#M(VOzUKclP^r0 z%Ys}&Fnulua_L~}a~a@HIx-u{&w%`duxmu_!GqPe+=*jXc$dI~%5GAUh`%&3yqMdD zp=kK^9KUg5CrO%DQbY}Z?}EQ(Q3U)#t>brX{L+YDzco#si&Nn5b3VLtlNmW}K%w=sH`MNpo zm1VYEb)vw8pTKem|smVcc&Joc>h$8SAnJvQtd^XAkmw%qx_*UV*= zdo1I?==AQbYt4~Ux7)H@xWXLy*sazz*L-TNI{IGmmj}OZ%YE5Ud^#`1r#O@YbWWZ^131Z=98wG=gq#>A6fceCX@TJq4;!O zicfJU2g;e+P!1HI`ciz#jdGy)FYkQWxAAZ7G7k;p~ z`HS`Db!YFhq>pd3XfMjf$^ z7=kVLWkd1lycD0}P!5zcwV@m+KJ}&elpEzh@!z_1ssG~xm!~h?l}!J2(F6XKAGvLL zW$_RET}{K&m(|y%7reE|KdO3!EnnbYZicc+cDEB&7PhuZRMb5{5t8@12c zw=I_5_Qmb~>pyzOmiw}y_;g;1PjM&*%9+|w4iumIQhdsda-jHUU8|+Hp0u_2`QV3U zs&Qocn~OiOWo6mu^j})1nTK9I%m30XSEe^^8E?xi3yabn!E4ONXKyq2E^(!Qb!mq! z-~ad}>55J3%}uM`HLqA(nto*W3R~{WhT_wCDL%!a94KdMLpe}<>Pzt{H_CzHckTVu z{CxHPt}p-G+Ew7c*#Dmg?y}{dSB&<*`P`nO&+e)&zU2L*W^_$#7n7CBL*^+v#NyZP zGp*8F&hsx`x51V_U3`weP?O9}M^|_KFu32`Ry*95`?8_XfO#P9GM>ldY;fB#HdexqqgdS?3=|F})x^*=O!WqOJ^+Lmh; ztxO+!aw=GHk>F5|+)(Y=Q-!{L{KkK5q{hyVuO5ap0+j3tv6ravZ@hJ}F zKsi$z%7NljUy4t;Q4SRUg147i=_fW@@9$Y+t-0tt>(G{mZTY%2ms=|+w!o#$mw~X z+-sTP(Oq|sn368GR@(CO4^2ytbhleaHeX;(UZkaOT-;#G=Rabk|D(OcN{@TD>%pBB z=?6#5vgN*PC_bH+;!_;TfpVrclmo@5z7(HwqZ}yy_xAWFJ+b$yUB7&COwj=4ooHW# z_Pfx&U)l57{G##gw@hOH<268e7uxU4+V?9zzU|_j7cRN5Xz3RvMFW&4q5Uqj--Y)5 z$^(oEjbXnrp>Z2vOlS=IjR|5pHUo?ajbXnrp>g{^i_d#6TZNE9IoR%_vvoKF}R-hT+e&1XFdPnG9P1luA_4IacV=csNGlb|El2A}TKlkHflmi{(GR5RN?!$Yor?$t7&$0UQ?{A#@aXZS1>o{-T zb3L`?IMjyQaUJiuejxtb_IUBRAIG6{QkmOPj@*aqc+d3%@#nV3i_iTy4xN+A+>UbO zK3vCpt{;d$w>@5b?#FTHoK)s^lq2`yI^J{rK>WGw@#1qojzj09GPk1~xewRzp6dtV z&uxzv|0H0q{11VXVHlhOL*Z2Hhr($v915^4fPa89;S4w(&cgn57y(~{v*8@<&xUj1 zAK~lRejWY^|9;>+7=`U9I3NBQM#BYgA@&!53oZgTwr;o>E`>{A3|xl&7#I)ZU@TmY z{aEn81n^?(g)2Y+5hQFSkU<3>D4=1lfDQ%}Vp|9kVG>*gS3(i?SAri*D25X3i=h%*T0S(bX7<2U0HQWyFaExuLdDP{NUv^UmAE z0(|W|7-sLrx|;EiVOlcY6AQ9$9l4@`l;Y~~+EI`3?k^nW8OR7g-!$sRNJd8dy{?G` zZTNb5IM(DsssdVp`1@J8flLD7n_K*?te!*k6|Ele$MxEOX2kZa+jjP| zHL}YIQAP+a2#syaCQoJ~*#2eLXa~|+uf4Z2AFE)0*@Xryjm8RI!QzEM#8ow<$9dJYkdZW$Ka~31w^s%bCL)!1?lD P9Q5${dl|!(EiCvSSa?#e diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index f7235fc84ae6..39c680b2b758 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -62,18 +62,11 @@ defineSuite([ scene.primitives.removeAll(); }); - it('throws with invalid magic', function() { - var arrayBuffer = Cesium3DTilesTester.generateBatchedTileBuffer({ - magic : [120, 120, 120, 120] - }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'b3dm'); - }); - it('throws with invalid version', function() { var arrayBuffer = Cesium3DTilesTester.generateBatchedTileBuffer({ - version: 2 + version : 2 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'b3dm'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'b3dm'); }); it('recognizes the legacy 20-byte header', function() { @@ -112,17 +105,13 @@ defineSuite([ it('throws with empty gltf', function() { // Expect to throw DeveloperError in Model due to invalid gltf magic var arrayBuffer = Cesium3DTilesTester.generateBatchedTileBuffer(); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'b3dm'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'b3dm'); }); it('resolves readyPromise', function() { return Cesium3DTilesTester.resolvesReadyPromise(scene, withoutBatchTableUrl); }); - it('rejects readyPromise on failed request', function() { - return Cesium3DTilesTester.rejectsReadyPromiseOnFailedRequest('b3dm'); - }); - it('renders with batch table', function() { return Cesium3DTilesTester.loadTileset(scene, withBatchTableUrl).then(function(tileset) { Cesium3DTilesTester.expectRenderTileset(scene, tileset); @@ -276,8 +265,4 @@ defineSuite([ return Cesium3DTilesTester.tileDestroys(scene, withoutBatchTableUrl); }); - it('destroys before loading finishes', function() { - return Cesium3DTilesTester.tileDestroysBeforeLoad(scene, withoutBatchTableUrl); - }); - }, 'WebGL'); diff --git a/Specs/Scene/Cesium3DTileProviderSpec.js b/Specs/Scene/Cesium3DTileContentSpec.js similarity index 58% rename from Specs/Scene/Cesium3DTileProviderSpec.js rename to Specs/Scene/Cesium3DTileContentSpec.js index 234cf1c9dd31..fddc7249aa7a 100644 --- a/Specs/Scene/Cesium3DTileProviderSpec.js +++ b/Specs/Scene/Cesium3DTileContentSpec.js @@ -10,9 +10,27 @@ defineSuite([ expect(function() { return content.featuresLength; }).toThrowDeveloperError(); + expect(function() { + return content.pointsLength; + }).toThrowDeveloperError(); + expect(function() { + return content.trianglesLength; + }).toThrowDeveloperError(); + expect(function() { + return content.vertexMemorySizeInBytes; + }).toThrowDeveloperError(); + expect(function() { + return content.textureMemorySizeInBytes; + }).toThrowDeveloperError(); + expect(function() { + return content.batchTableMemorySizeInBytes; + }).toThrowDeveloperError(); expect(function() { return content.innerContents; }).toThrowDeveloperError(); + expect(function() { + return content.readyPromise; + }).toThrowDeveloperError(); expect(function() { return content.hasProperty(0, 'height'); }).toThrowDeveloperError(); @@ -20,10 +38,10 @@ defineSuite([ return content.getFeature(0); }).toThrowDeveloperError(); expect(function() { - content.request(); + content.applyDebugSettings(); }).toThrowDeveloperError(); expect(function() { - content.initialize(); + content.applyStyleWithShader(); }).toThrowDeveloperError(); expect(function() { content.update(); diff --git a/Specs/Scene/Cesium3DTileSpec.js b/Specs/Scene/Cesium3DTileSpec.js index 806db5c39227..a594c06604a6 100644 --- a/Specs/Scene/Cesium3DTileSpec.js +++ b/Specs/Scene/Cesium3DTileSpec.js @@ -5,6 +5,7 @@ defineSuite([ 'Core/clone', 'Core/defined', 'Core/HeadingPitchRoll', + 'Core/loadWithXhr', 'Core/Math', 'Core/Matrix3', 'Core/Matrix4', @@ -20,6 +21,7 @@ defineSuite([ clone, defined, HeadingPitchRoll, + loadWithXhr, CesiumMath, Matrix3, Matrix4, @@ -115,18 +117,6 @@ defineSuite([ } }; - var tileWithInvalidExtension = { - geometricError : 1, - refine : 'replace', - children : [], - content : { - url : '0/0.xxxx' - }, - boundingVolume: { - box : [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] - } - }; - var mockTileset = { debugShowBoundingVolume : true, debugShowViewerRequestVolume : true, @@ -143,12 +133,6 @@ defineSuite([ return Matrix4.pack(transformMatrix, new Array(16)); } - it('throws if content has an unsupported extension', function() { - expect(function() { - return new Cesium3DTile(mockTileset, '/some_url', tileWithInvalidExtension, undefined); - }).toThrowDeveloperError(); - }); - it('destroys', function() { var tile = new Cesium3DTile(mockTileset, '/some_url', tileWithBoundingSphere, undefined); expect(tile.isDestroyed()).toEqual(false); diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 53b86e4a07d8..c1d79ed876df 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -62,9 +62,6 @@ defineSuite([ // Parent tile with content and four child tiles with content var tilesetUrl = './Data/Cesium3DTiles/Tilesets/Tileset/'; - // One child points to an invalid url - var tilesetInvalidUrl = './Data/Cesium3DTiles/Tilesets/TilesetInvalid/'; - // Parent tile with no content and four child tiles with content var tilesetEmptyRootUrl = './Data/Cesium3DTiles/Tilesets/TilesetEmptyRoot/'; @@ -104,7 +101,7 @@ defineSuite([ // 1 tile with opaque and translucent features var translucentOpaqueMixUrl = './Data/Cesium3DTiles/Batched/BatchedTranslucentOpaqueMix/'; - // Root tile is transformed from local space to wgs84, child tile is rotated, scales, and translated locally + // Root tile is transformed from local space to wgs84, child tile is rotated, scaled, and translated locally var tilesetWithTransformsUrl = './Data/Cesium3DTiles/Tilesets/TilesetWithTransforms'; // Root tile with 4 b3dm children and 1 pnts child with a viewer request volume @@ -184,7 +181,6 @@ defineSuite([ var tileset = scene.primitives.add(new Cesium3DTileset({ url : 'invalid.json' })); - scene.renderForSpecs(); return tileset.readyPromise.then(function() { fail('should not resolve'); }).otherwise(function(error) { @@ -194,8 +190,8 @@ defineSuite([ it('rejects readyPromise with invalid tileset version', function() { var tilesetJson = { - "asset" : { - "version" : "2.0" + asset : { + version : 2.0 } }; @@ -323,36 +319,51 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('requests tile with invalid magic', function() { + var invalidMagicBuffer = Cesium3DTilesTester.generateBatchedTileBuffer({ + magic : [120, 120, 120, 120] + }); + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + return tileset.readyPromise.then(function(tileset) { + // Start spying after the tileset json has been loaded + spyOn(loadWithXhr, 'load').and.callFake(function(url, responseType, method, data, headers, deferred, overrideMimeType) { + deferred.resolve(invalidMagicBuffer); + }); + scene.renderForSpecs(); // Request root + var root = tileset._root; + return root.contentReadyPromise.then(function() { + fail('should not resolve'); + }).otherwise(function(error) { + expect(error.message).toBe('Invalid tile content.'); + expect(root._contentState).toEqual(Cesium3DTileContentState.FAILED); + }); + }); + }); + it('handles failed tile requests', function() { viewRootOnly(); - return Cesium3DTilesTester.loadTileset(scene, tilesetInvalidUrl).then(function(tileset) { - viewAllTiles(); - scene.renderForSpecs(); - var stats = tileset._statistics; - expect(stats.numberOfPendingRequests).toEqual(4); - expect(stats.numberProcessing).toEqual(0); - - return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - expect(stats.numberOfPendingRequests).toEqual(0); - expect(stats.numberProcessing).toEqual(0); - - // Check that one tile has failed - var children = tileset._root.children; - var length = children.length; - var failedTiles = 0; - for (var i = 0; i < length; ++i) { - if (children[i].content.state === Cesium3DTileContentState.FAILED) { - ++failedTiles; - } - } - expect(failedTiles).toEqual(1); + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + return tileset.readyPromise.then(function(tileset) { + // Start spying after the tileset json has been loaded + spyOn(loadWithXhr, 'load').and.callFake(function(url, responseType, method, data, headers, deferred, overrideMimeType) { + deferred.reject(); }); - }); + scene.renderForSpecs(); // Request root + var root = tileset._root; + return root.contentReadyPromise.then(function() { + fail('should not resolve'); + }).otherwise(function(error) { + expect(root._contentState).toEqual(Cesium3DTileContentState.FAILED); + }); + }); }); it('renders tileset', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -382,7 +393,6 @@ defineSuite([ it('renders tileset with empty root tile', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetEmptyRootUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(4); // Empty tile doesn't issue a command @@ -418,7 +428,6 @@ defineSuite([ // Wait for all tiles to load and check that they are all visited and rendered return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberOfPendingRequests).toEqual(0); @@ -437,7 +446,6 @@ defineSuite([ expect(stats.numberOfTrianglesSelected).toEqual(0); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfFeaturesSelected).toEqual(features); expect(stats.numberOfFeaturesLoaded).toEqual(features); expect(stats.numberOfPointsSelected).toEqual(points); @@ -454,7 +462,6 @@ defineSuite([ expect(stats.numberOfTrianglesSelected).toEqual(0); tileset.trimLoadedTiles(); - scene.renderForSpecs(); expect(stats.numberOfFeaturesSelected).toEqual(0); @@ -622,7 +629,6 @@ defineSuite([ it('does not process tileset when screen space error is not met', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -637,7 +643,6 @@ defineSuite([ it('does not select tiles when outside of view frustum', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -657,7 +662,6 @@ defineSuite([ // Root tile has a content box that is half the extents of its box // Expect to cull root tile and three child tiles return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -717,7 +721,6 @@ defineSuite([ function testDynamicScreenSpaceError(url, distance) { return Cesium3DTilesTester.loadTileset(scene, url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; // Horizon view, only root is visible @@ -772,11 +775,9 @@ defineSuite([ }); it('additive refinement - selects root when sse is met', function() { + viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { // Meets screen space error, only root tile is rendered - viewRootOnly(); - scene.renderForSpecs(); - var stats = tileset._statistics; expect(stats.visited).toEqual(1); expect(stats.numberOfCommands).toEqual(1); @@ -786,9 +787,6 @@ defineSuite([ it('additive refinement - selects all tiles when sse is not met', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { // Does not meet screen space error, all tiles are visible - viewAllTiles(); - scene.renderForSpecs(); - var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -797,7 +795,6 @@ defineSuite([ it('additive refinement - use parent\'s geometric error on child\'s box for early refinement', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -829,11 +826,11 @@ defineSuite([ }); it('replacement refinement - selects root when sse is met', function() { + viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { tileset._root.refine = Cesium3DTileRefine.REPLACE; // Meets screen space error, only root tile is rendered - viewRootOnly(); scene.renderForSpecs(); var stats = tileset._statistics; @@ -847,7 +844,6 @@ defineSuite([ tileset._root.refine = Cesium3DTileRefine.REPLACE; // Does not meet screen space error, child tiles replace root tile - viewAllTiles(); scene.renderForSpecs(); var stats = tileset._statistics; @@ -917,15 +913,13 @@ defineSuite([ var stats = tileset._statistics; var root = tileset._root; - return when.join(root.children[0].readyPromise, root.children[1].readyPromise).then(function() { + return when.join(root.children[0].contentReadyPromise, root.children[1].contentReadyPromise).then(function() { // Even though root's children are loaded, the grandchildren need to be loaded before it becomes refinable - scene.renderForSpecs(); expect(numberOfChildrenWithoutContent(root)).toEqual(0); // Children are loaded expect(stats.numberOfCommands).toEqual(3); // Stencil, root backfaces, root expect(stats.numberOfPendingRequests).toEqual(4); // Loading grandchildren return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); // Render children }); }); @@ -943,18 +937,14 @@ defineSuite([ viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement2Url).then(function(tileset) { - scene.renderForSpecs(); - var stats = tileset._statistics; return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(1); setZoom(5.0); // Zoom into the last tile, when it is ready the root is refinable scene.renderForSpecs(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(2); // Renders two content tiles }); }); @@ -972,21 +962,19 @@ defineSuite([ viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; var root = tileset._root; expect(stats.numberOfCommands).toEqual(1); viewAllTiles(); scene.renderForSpecs(); - return root.children[0].content.readyPromise.then(function() { + return root.children[0].contentReadyPromise.then(function() { // The external tileset json is loaded, but the external tileset isn't. scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(2); // Stencil + Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading child content tiles return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(root.selected).toEqual(false); expect(stats.numberOfCommands).toEqual(4); // Render child content tiles }); @@ -1000,7 +988,6 @@ defineSuite([ // R A R A // return Cesium3DTilesTester.loadTileset(scene, tilesetRefinementMix).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(7); expect(stats.numberOfCommands).toEqual(6); @@ -1082,8 +1069,6 @@ defineSuite([ scene.renderForSpecs(); // wait for load because geometric error has changed return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); - expect(childRoot.visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); expect(childRoot.children[0].visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); @@ -1110,8 +1095,6 @@ defineSuite([ var root = tileset._root; var childRoot = root.children[0]; - scene.renderForSpecs(); - expect(childRoot.visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); expect(childRoot.children[0].visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); @@ -1139,11 +1122,8 @@ defineSuite([ var childRoot = root.children[0]; childRoot.geometricError = 0; - scene.renderForSpecs(); // wait for load because geometric error has changed return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); - expect(childRoot.visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); expect(childRoot.children[0].visibility(scene.frameState, CullingVolume.MASK_INDETERMINATE)).not.toEqual(CullingVolume.MASK_OUTSIDE); @@ -1169,7 +1149,6 @@ defineSuite([ // R A R A // return Cesium3DTilesTester.loadTileset(scene, tilesetRefinementMix).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(7); expect(stats.numberOfCommands).toEqual(6); @@ -1183,13 +1162,14 @@ defineSuite([ return Cesium3DTilesTester.loadTileset(scene, tilesetOfTilesetsUrl).then(function(tileset) { // Root points to an external tileset.json and has no children until it is requested var root = tileset._root; - expect(root.hasTilesetContent).toEqual(true); expect(root.children.length).toEqual(0); // Set view so that root's content is requested viewRootOnly(); scene.renderForSpecs(); - return root.content.readyPromise.then(function() { + return root.contentReadyPromise.then(function() { + expect(root.hasTilesetContent).toEqual(true); + // Root has one child now, the root of the external tileset expect(root.children.length).toEqual(1); @@ -1199,7 +1179,7 @@ defineSuite([ expect(root.refine).toEqual(subtreeRoot.refine); expect(root.contentBoundingVolume.boundingVolume).toEqual(subtreeRoot.contentBoundingVolume.boundingVolume); - // Check that Subtree root has 4 children + // Check that subtree root has 4 children expect(subtreeRoot.hasTilesetContent).toEqual(false); expect(subtreeRoot.children.length).toEqual(4); }); @@ -1225,7 +1205,7 @@ defineSuite([ viewRootOnly(); scene.renderForSpecs(); - return tileset._root.content.readyPromise; + return tileset._root.contentReadyPromise; }).then(function() { //Make sure tileset2.json was requested with query parameters and version var queryParamsWithVersion = queryParams + '&v=0.0'; @@ -1236,7 +1216,6 @@ defineSuite([ it('renders tileset with external tileset.json', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetOfTilesetsUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.visited).toEqual(7); // Visits two tiles with tileset content, five tiles with b3dm content expect(stats.numberOfCommands).toEqual(5); // Render the five tiles with b3dm content @@ -1410,7 +1389,7 @@ defineSuite([ viewRootOnly(); scene.renderForSpecs(); // Request root expect(tileset._statistics.numberOfPendingRequests).toEqual(1); - return tileset._root.content.contentReadyToProcessPromise.then(function() { + return tileset._root.contentReadyToProcessPromise.then(function() { scene.pickForSpecs(); expect(spy).not.toHaveBeenCalled(); scene.renderForSpecs(); @@ -1454,7 +1433,6 @@ defineSuite([ tileset.loadProgress.addEventListener(spyUpdate); viewRootOnly(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(3); expect(spyUpdate.calls.allArgs()).toEqual(results); }); @@ -1536,7 +1514,6 @@ defineSuite([ viewNothing(); return Cesium3DTilesTester.loadTileset(scene, tilesetOfTilesetsUrl).then(function(tileset) { var root = tileset._root; - var content = root.content; viewRootOnly(); scene.renderForSpecs(); // Request external tileset.json @@ -1545,7 +1522,7 @@ defineSuite([ expect(stats.numberOfPendingRequests).toEqual(1); scene.primitives.remove(tileset); - return content.readyPromise.then(function(root) { + return root.contentReadyPromise.then(function(root) { fail('should not resolve'); }).otherwise(function(error) { // Expect the root to not have added any children from the external tileset.json @@ -1556,19 +1533,18 @@ defineSuite([ }); it('destroys before tile finishes loading', function() { - viewNothing(); - return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + return tileset.readyPromise.then(function(tileset) { var root = tileset._root; - var content = root.content; - - viewRootOnly(); scene.renderForSpecs(); // Request root scene.primitives.remove(tileset); - return content.readyPromise.then(function(root) { + return root.contentReadyPromise.then(function(content) { fail('should not resolve'); }).otherwise(function(error) { - expect(content.state).toEqual(Cesium3DTileContentState.FAILED); + expect(root._contentState).toBe(Cesium3DTileContentState.FAILED); expect(RequestScheduler.getNumberOfAvailableRequests()).toEqual(RequestScheduler.maximumRequests); }); }); @@ -1981,7 +1957,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles }); @@ -2013,7 +1988,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles }); @@ -2042,7 +2016,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); }); @@ -2074,7 +2047,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -2106,7 +2078,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(4); }); @@ -2143,7 +2114,6 @@ defineSuite([ viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(5); }); @@ -2229,7 +2199,6 @@ defineSuite([ var i3dmCommands = scene.context.instancedArrays ? 1 : 25; // When instancing is not supported there is one command per instance var totalCommands = b3dmCommands + i3dmCommands; return Cesium3DTilesTester.loadTileset(scene, tilesetWithTransformsUrl).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; var root = tileset._root; var rootTransform = Matrix4.unpack(root._header.transform); @@ -2288,13 +2257,12 @@ defineSuite([ it('adds stencil clear command first when unresolved', function() { viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; var root = tileset._root; viewAllTiles(); scene.renderForSpecs(); - return root.children[0].content.readyPromise.then(function() { + return root.children[0].contentReadyPromise.then(function() { scene.renderForSpecs(); // 1 for root tiles, 1 for stencil clear expect(stats.numberOfCommands).toEqual(2); @@ -2312,13 +2280,12 @@ defineSuite([ scene.camera.moveDown(200.0); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; var root = tileset._root; viewAllTiles(); scene.renderForSpecs(); - return root.children[0].content.readyPromise.then(function() { + return root.children[0].contentReadyPromise.then(function() { scene.renderForSpecs(); // 2 for root tile, 1 for child, 1 for stencil clear expect(stats.numberOfCommands).toEqual(4); @@ -2341,13 +2308,12 @@ defineSuite([ it('does not create duplicate backface commands if no selected descendants', function() { viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; var root = tileset._root; viewAllTiles(); scene.renderForSpecs(); - return root.children[0].content.readyPromise.then(function() { + return root.children[0].contentReadyPromise.then(function() { scene.renderForSpecs(); // 1 for root tile, 1 for stencil clear expect(stats.numberOfCommands).toEqual(2); @@ -2373,7 +2339,6 @@ defineSuite([ it('does not add stencil clear command or backface commands when fully resolved', function() { viewAllTiles(); return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url).then(function(tileset) { - scene.renderForSpecs(); var stats = tileset._statistics; expect(stats.numberOfCommands).toEqual(tileset._selectedTiles.length); @@ -2394,12 +2359,10 @@ defineSuite([ return Cesium3DTilesTester.loadTileset(scene, tilesetReplacement3Url, { loadSiblings: false }).then(function(tileset) { var stats = tileset._statistics; - scene.renderForSpecs(); expect(stats.numberContentReady).toBe(2); tileset.loadSiblings = true; scene.renderForSpecs(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); expect(stats.numberContentReady).toBe(5); }); }); @@ -2417,18 +2380,14 @@ defineSuite([ skipLevels: 0 })); return Cesium3DTilesTester.waitForReady(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); - return tileset._root.content.readyPromise.then(function() { + return tileset._root.contentReadyPromise.then(function() { tileset._root.children[0].refine = Cesium3DTileRefine.REPLACE; return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { var stats = tileset._statistics; - scene.renderForSpecs(); expect(stats.numberContentReady).toBe(1); tileset.immediatelyLoadDesiredLOD = false; - scene.renderForSpecs(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); expect(stats.numberContentReady).toBe(2); }); }); @@ -2446,8 +2405,7 @@ defineSuite([ })); return Cesium3DTilesTester.waitForReady(scene, tileset).then(function(tileset) { - scene.renderForSpecs(); - return tileset._root.content.readyPromise.then(function() { + return tileset._root.contentReadyPromise.then(function() { tileset._root.children[0].refine = Cesium3DTileRefine.REPLACE; return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function(tileset) { var stats = tileset._statistics; diff --git a/Specs/Scene/Composite3DTileContentSpec.js b/Specs/Scene/Composite3DTileContentSpec.js index 91a22662c17c..6c0111372c8a 100644 --- a/Specs/Scene/Composite3DTileContentSpec.js +++ b/Specs/Scene/Composite3DTileContentSpec.js @@ -81,18 +81,11 @@ defineSuite([ }); } - it('throws with invalid magic', function() { - var arrayBuffer = Cesium3DTilesTester.generateCompositeTileBuffer({ - magic : [120, 120, 120, 120] - }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'cmpt'); - }); - it('throws with invalid version', function() { var arrayBuffer = Cesium3DTilesTester.generateCompositeTileBuffer({ version : 2 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'cmpt'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'cmpt'); }); it('throws with invalid inner tile content type', function() { @@ -101,7 +94,7 @@ defineSuite([ magic : [120, 120, 120, 120] })] }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'cmpt'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'cmpt'); }); it('resolves readyPromise', function() { @@ -121,10 +114,6 @@ defineSuite([ return Cesium3DTilesTester.rejectsReadyPromiseOnError(scene, arrayBuffer, 'cmpt'); }); - it('rejects readyPromise on failed request', function() { - return Cesium3DTilesTester.rejectsReadyPromiseOnFailedRequest('cmpt'); - }); - it('renders composite', function() { return Cesium3DTilesTester.loadTileset(scene, compositeUrl).then(expectRenderComposite); }); @@ -137,8 +126,4 @@ defineSuite([ return Cesium3DTilesTester.tileDestroys(scene, compositeUrl); }); - it('destroys before loading finishes', function() { - return Cesium3DTilesTester.tileDestroysBeforeLoad(scene, compositeUrl); - }); - }, 'WebGL'); diff --git a/Specs/Scene/Empty3DTileContentSpec.js b/Specs/Scene/Empty3DTileContentSpec.js index f47af925719a..669a3fafc586 100644 --- a/Specs/Scene/Empty3DTileContentSpec.js +++ b/Specs/Scene/Empty3DTileContentSpec.js @@ -1,21 +1,10 @@ /*global defineSuite*/ defineSuite([ - 'Scene/Empty3DTileContent', - 'Scene/Cesium3DTileContentState' + 'Scene/Empty3DTileContent' ], function( - Empty3DTileContent, - Cesium3DTileContentState) { + Empty3DTileContent) { 'use strict'; - it('resolves readyPromise', function() { - var content = new Empty3DTileContent(); - content.request(); - content.update(); - return content.readyPromise.then(function(content) { - expect(content.state).toEqual(Cesium3DTileContentState.READY); - }); - }); - it('destroys', function() { var content = new Empty3DTileContent(); expect(content.isDestroyed()).toEqual(false); diff --git a/Specs/Scene/Instanced3DModel3DTileContentSpec.js b/Specs/Scene/Instanced3DModel3DTileContentSpec.js index 20241b8172d2..f5f6fd95d99e 100644 --- a/Specs/Scene/Instanced3DModel3DTileContentSpec.js +++ b/Specs/Scene/Instanced3DModel3DTileContentSpec.js @@ -67,31 +67,24 @@ defineSuite([ scene.primitives.removeAll(); }); - it('throws with invalid magic', function() { - var arrayBuffer = Cesium3DTilesTester.generateInstancedTileBuffer({ - magic : [120, 120, 120, 120] - }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); - }); - it('throws with invalid format', function() { var arrayBuffer = Cesium3DTilesTester.generateInstancedTileBuffer({ gltfFormat : 2 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); }); it('throws with invalid version', function() { var arrayBuffer = Cesium3DTilesTester.generateInstancedTileBuffer({ version : 2 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); }); it('throws with empty gltf', function() { // Expect to throw DeveloperError in Model due to invalid gltf magic var arrayBuffer = Cesium3DTilesTester.generateInstancedTileBuffer(); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'i3dm'); }); it('resolves readyPromise', function() { @@ -109,38 +102,6 @@ defineSuite([ return Cesium3DTilesTester.rejectsReadyPromiseOnError(scene, arrayBuffer, 'i3dm'); }); - it('rejects readyPromise on failed request', function() { - return Cesium3DTilesTester.rejectsReadyPromiseOnFailedRequest('i3dm'); - }); - - var mockTile = { - contentBoundingVolume : new TileBoundingSphere(), - _header : { - content : { - boundingVolume : { - sphere : [0.0, 0.0, 0.0, 1.0] - } - } - } - }; - - it('loads with no instances, but does not become ready', function() { - var arrayBuffer = Cesium3DTilesTester.generateInstancedTileBuffer({ - featuresLength : 0, - gltfUri : '../Data/Models/Box/CesiumBoxTest.gltf' - }); - - var tileset = {}; - var url = ''; - var instancedTile = new Instanced3DModel3DTileContent(tileset, mockTile, url); - instancedTile.initialize(arrayBuffer); - // Expect the tile to never reach the ready state due to returning early in ModelInstanceCollection - for (var i = 0; i < 10; ++i) { - instancedTile.update(tileset, scene.frameState); - expect(instancedTile.state).toEqual(Cesium3DTileContentState.PROCESSING); - } - }); - it('renders with external gltf', function() { return Cesium3DTilesTester.loadTileset(scene, gltfExternalUrl).then(function(tileset) { Cesium3DTilesTester.expectRenderTileset(scene, tileset); @@ -349,8 +310,4 @@ defineSuite([ return Cesium3DTilesTester.tileDestroys(scene, withoutBatchTableUrl); }); - it('destroys before loading finishes', function() { - return Cesium3DTilesTester.tileDestroysBeforeLoad(scene, withoutBatchTableUrl); - }); - }, 'WebGL'); diff --git a/Specs/Scene/PointCloud3DTileContentSpec.js b/Specs/Scene/PointCloud3DTileContentSpec.js index 8cbaf3b946de..dc66d8a9ee53 100644 --- a/Specs/Scene/PointCloud3DTileContentSpec.js +++ b/Specs/Scene/PointCloud3DTileContentSpec.js @@ -81,25 +81,18 @@ defineSuite([ scene.primitives.removeAll(); }); - it('throws with invalid magic', function() { - var arrayBuffer = Cesium3DTilesTester.generatePointCloudTileBuffer({ - magic : [120, 120, 120, 120] - }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); - }); - it('throws with invalid version', function() { var arrayBuffer = Cesium3DTilesTester.generatePointCloudTileBuffer({ version: 2 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if featureTableJsonByteLength is 0', function() { var arrayBuffer = Cesium3DTilesTester.generatePointCloudTileBuffer({ featureTableJsonByteLength : 0 }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if the feature table does not contain POINTS_LENGTH', function() { @@ -110,7 +103,7 @@ defineSuite([ } } }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if the feature table does not contain POSITION or POSITION_QUANTIZED', function() { @@ -119,7 +112,7 @@ defineSuite([ POINTS_LENGTH : 1 } }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if the positions are quantized and the feature table does not contain QUANTIZED_VOLUME_SCALE', function() { @@ -132,7 +125,7 @@ defineSuite([ QUANTIZED_VOLUME_OFFSET : [0.0, 0.0, 0.0] } }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if the positions are quantized and the feature table does not contain QUANTIZED_VOLUME_OFFSET', function() { @@ -145,7 +138,7 @@ defineSuite([ QUANTIZED_VOLUME_SCALE : [1.0, 1.0, 1.0] } }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('throws if the BATCH_ID semantic is defined but BATCHES_LENGTH is not', function() { @@ -156,7 +149,7 @@ defineSuite([ BATCH_ID : [0, 1] } }); - return Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); + Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, 'pnts'); }); it('BATCH_ID semantic uses componentType of UNSIGNED_SHORT by default', function() { @@ -176,10 +169,6 @@ defineSuite([ return Cesium3DTilesTester.resolvesReadyPromise(scene, pointCloudRGBUrl); }); - it('rejects readyPromise on failed request', function() { - return Cesium3DTilesTester.rejectsReadyPromiseOnFailedRequest('pnts'); - }); - it('renders point cloud with rgb colors', function() { return Cesium3DTilesTester.loadTileset(scene, pointCloudRGBUrl).then(function(tileset) { Cesium3DTilesTester.expectRender(scene, tileset); @@ -701,8 +690,4 @@ defineSuite([ return Cesium3DTilesTester.tileDestroys(scene, pointCloudRGBUrl); }); - it('destroys before loading finishes', function() { - return Cesium3DTilesTester.tileDestroysBeforeLoad(scene, pointCloudRGBUrl); - }); - }, 'WebGL'); diff --git a/Specs/Scene/Tileset3DTileContentSpec.js b/Specs/Scene/Tileset3DTileContentSpec.js index c7d0bf486374..0e563e41ff3a 100644 --- a/Specs/Scene/Tileset3DTileContentSpec.js +++ b/Specs/Scene/Tileset3DTileContentSpec.js @@ -41,16 +41,8 @@ defineSuite([ return Cesium3DTilesTester.resolvesReadyPromise(scene, tilesetOfTilesetsUrl); }); - it('rejects readyPromise on failed request', function() { - return Cesium3DTilesTester.rejectsReadyPromiseOnFailedRequest('json'); - }); - it('destroys', function() { return Cesium3DTilesTester.tileDestroys(scene, tilesetOfTilesetsUrl); }); - it('destroys before loading finishes', function() { - return Cesium3DTilesTester.tileDestroysBeforeLoad(scene, tilesetOfTilesetsUrl); - }); - }, 'WebGL'); diff --git a/Specs/Widgets/CesiumInspector/Cesium3DTilesInspectorSpec.js b/Specs/Widgets/CesiumInspector/Cesium3DTilesInspectorSpec.js index 326358bb4717..c59d7453d568 100644 --- a/Specs/Widgets/CesiumInspector/Cesium3DTilesInspectorSpec.js +++ b/Specs/Widgets/CesiumInspector/Cesium3DTilesInspectorSpec.js @@ -1,18 +1,16 @@ /*global defineSuite*/ defineSuite([ - 'Scene/Cesium3DTileset', 'Widgets/CesiumInspector/Cesium3DTilesInspector', - 'Specs/createScene', 'Core/Ellipsoid', + 'Scene/Cesium3DTileset', 'Scene/Globe', - 'ThirdParty/when' + 'Specs/createScene' ], function( - Cesium3DTileset, Cesium3DTilesInspector, - createScene, Ellipsoid, + Cesium3DTileset, Globe, - when) { + createScene) { 'use strict'; // Parent tile with content and four child tiles with content @@ -66,7 +64,7 @@ defineSuite([ describe('logging', function() { var widget; var container; - + beforeAll(function() { container = document.createElement('div'); container.id = 'testContainer'; From e6c594b020004682329c60d0eb4adba9389a58aa Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Sun, 23 Apr 2017 13:56:30 -0400 Subject: [PATCH 3/3] Remove links --- Source/Scene/Cesium3DTile.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index cbe21565819a..ba0c0cfaaedd 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -219,8 +219,6 @@ define([ * @type {Boolean} * @readonly * - * @see Empty3DTileContent - * * @private */ this.hasEmptyContent = hasEmptyContent; @@ -234,11 +232,6 @@ define([ * @type {Boolean} * @readonly * - * @see Batched3DModel3DTileContent - * @see Instanced3DModel3DTileContent - * @see PointCloud3DTileContent - * @see Composite3DTileContent - * * @private */ this.hasRenderableContent = false; @@ -252,8 +245,6 @@ define([ * @type {Boolean} * @readonly * - * @see Tileset3DTileContent - * * @private */ this.hasTilesetContent = false;