From be0dc8de20c0470b7217c4bd29b0b16d0cbd265e Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 6 Jul 2018 10:35:16 -0400 Subject: [PATCH 1/5] Move batch table hierarchy to extension --- CHANGES.md | 1 + Source/Scene/Cesium3DTileBatchTable.js | 157 +++++++++++------- Source/Scene/Cesium3DTileset.js | 16 ++ Source/Scene/PointCloud3DTileContent.js | 2 +- .../BatchTableHierarchyExtension/tile.b3dm | Bin 0 -> 78260 bytes .../BatchTableHierarchyExtension/tileset.json | 53 ++++++ Specs/Scene/Cesium3DTileBatchTableSpec.js | 16 ++ 7 files changed, 187 insertions(+), 58 deletions(-) create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tile.b3dm create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json diff --git a/CHANGES.md b/CHANGES.md index ed7d1095ee53..cf1f9558e178 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ Change Log #### Deprecated :hourglass_flowing_sand: * Support for 3D Tiles `content.url` is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use `content.uri instead`. Support for `content.url` will remain for backwards compatibility. [#6744](https://github.com/AnalyticalGraphicsInc/cesium/pull/6744) +* Support for the 3D Tiles pre-version 1.0 Batch Table Hierarchy is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use the [`3DTILES_batch_table_hierarchy`](https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/1.0/extensions/3DTILES_batch_table_hierarchy) extension instead. Support for the deprecated batch table hierarchy will remain for backwards compatibility. [#X](https://github.com/AnalyticalGraphicsInc/cesium/pull/X) #### Fixes :wrench: * Fixed bug causing billboards and labels to appear the wrong size when switching scene modes [#6745](https://github.com/AnalyticalGraphicsInc/cesium/issues/6745) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 1aeea246c2da..ca19c575458f 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -10,6 +10,7 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', + '../Core/deprecationWarning', '../Core/destroyObject', '../Core/DeveloperError', '../Core/Math', @@ -44,6 +45,7 @@ define([ defaultValue, defined, defineProperties, + deprecationWarning, destroyObject, DeveloperError, CesiumMath, @@ -80,33 +82,25 @@ define([ */ this.featuresLength = featuresLength; - this._translucentFeaturesLength = 0; // Number of features in the tile that are translucent - - /** - * @private - */ - this.batchTableJson = batchTableJson; - /** * @private */ this.batchTableBinary = batchTableBinary; - var batchTableHierarchy; - var batchTableBinaryProperties; + this._translucentFeaturesLength = 0; // Number of features in the tile that are translucent + + var extensions; if (defined(batchTableJson)) { - // Extract the hierarchy and remove it from the batch table json - batchTableHierarchy = batchTableJson.HIERARCHY; - if (defined(batchTableHierarchy)) { - delete batchTableJson.HIERARCHY; - batchTableHierarchy = initializeHierarchy(batchTableHierarchy, batchTableBinary); - } - // Get the binary properties - batchTableBinaryProperties = Cesium3DTileBatchTable.getBinaryProperties(featuresLength, batchTableJson, batchTableBinary); + extensions = batchTableJson.extensions; } + this._extensions = defaultValue(extensions, {}); + this._extras = defined(batchTableJson) ? batchTableJson.extras : undefined; - this._batchTableHierarchy = batchTableHierarchy; - this._batchTableBinaryProperties = batchTableBinaryProperties; + var properties = initializeProperties(batchTableJson); + this._properties = properties; + + this._batchTableHierarchy = initializeHierarchy(this, batchTableJson, batchTableBinary); + this._batchTableBinaryProperties = getBinaryProperties(featuresLength, properties, batchTableBinary); // PERFORMANCE_IDEA: These parallel arrays probably generate cache misses in get/set color/show // and use A LOT of memory. How can we use less memory? @@ -146,6 +140,9 @@ define([ this._textureStep = textureStep; } + // This can be overridden for testing purposes + Cesium3DTileBatchTable._deprecationWarning = deprecationWarning; + defineProperties(Cesium3DTileBatchTable.prototype, { memorySizeInBytes : { get : function() { @@ -161,23 +158,59 @@ define([ } }); - function initializeHierarchy(json, binary) { + function initializeProperties(jsonHeader) { + var properties = {}; + + if (!defined(jsonHeader)) { + return properties; + } + + for (var propertyName in jsonHeader) { + if (jsonHeader.hasOwnProperty(propertyName) + && propertyName !== 'HIERARCHY' // Deprecated HIERARCHY property + && propertyName !== 'extensions' + && propertyName !== 'extras') { + properties[propertyName] = clone(jsonHeader[propertyName], true); + } + } + + return properties; + } + + function initializeHierarchy(batchTable, jsonHeader, binaryBody) { + if (!defined(jsonHeader)) { + return; + } + + var hierarchy = batchTable.getExtension('3DTILES_batch_table_hierarchy'); + + var legacyHierarchy = jsonHeader.HIERARCHY; + if (defined(legacyHierarchy)) { + Cesium3DTileBatchTable._deprecationWarning('batchTableHierarchyExtension', 'The batch table HIERARCHY property has been moved to an extension. Use extension.3DTILES_batch_table_hierarchy instead.'); + batchTable._extensions['3DTILES_batch_table_hierarchy'] = legacyHierarchy; + hierarchy = legacyHierarchy; + } + + return initializeHierarchyValues(hierarchy, binaryBody); + } + + function initializeHierarchyValues(hierarchyJson, binaryBody) { var i; var classId; var binaryAccessor; - var instancesLength = json.instancesLength; - var classes = json.classes; - var classIds = json.classIds; - var parentCounts = json.parentCounts; - var parentIds = json.parentIds; + var instancesLength = hierarchyJson.instancesLength; + var classes = hierarchyJson.classes; + var classIds = hierarchyJson.classIds; + var parentCounts = hierarchyJson.parentCounts; + var parentIds = hierarchyJson.parentIds; var parentIdsLength = instancesLength; if (defined(classIds.byteOffset)) { classIds.componentType = defaultValue(classIds.componentType, ComponentDatatype.UNSIGNED_SHORT); classIds.type = AttributeType.SCALAR; binaryAccessor = getBinaryAccessor(classIds); - classIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + classIds.byteOffset, instancesLength); + classIds = binaryAccessor.createArrayBufferView(binaryBody.buffer, binaryBody.byteOffset + classIds.byteOffset, instancesLength); } var parentIndexes; @@ -186,7 +219,7 @@ define([ parentCounts.componentType = defaultValue(parentCounts.componentType, ComponentDatatype.UNSIGNED_SHORT); parentCounts.type = AttributeType.SCALAR; binaryAccessor = getBinaryAccessor(parentCounts); - parentCounts = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentCounts.byteOffset, instancesLength); + parentCounts = binaryAccessor.createArrayBufferView(binaryBody.buffer, binaryBody.byteOffset + parentCounts.byteOffset, instancesLength); } parentIndexes = new Uint16Array(instancesLength); parentIdsLength = 0; @@ -200,14 +233,14 @@ define([ parentIds.componentType = defaultValue(parentIds.componentType, ComponentDatatype.UNSIGNED_SHORT); parentIds.type = AttributeType.SCALAR; binaryAccessor = getBinaryAccessor(parentIds); - parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, parentIdsLength); + parentIds = binaryAccessor.createArrayBufferView(binaryBody.buffer, binaryBody.byteOffset + parentIds.byteOffset, parentIdsLength); } var classesLength = classes.length; for (i = 0; i < classesLength; ++i) { var classInstancesLength = classes[i].length; var properties = classes[i].instances; - var binaryProperties = Cesium3DTileBatchTable.getBinaryProperties(classInstancesLength, properties, binary); + var binaryProperties = getBinaryProperties(classInstancesLength, properties, binaryBody); classes[i].instances = combine(binaryProperties, properties); } @@ -282,11 +315,15 @@ define([ } //>>includeEnd('debug'); - Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { + function getBinaryProperties(featuresLength, properties, binaryBody) { + if (!defined(properties)) { + return; + } + var binaryProperties; - for (var name in json) { - if (json.hasOwnProperty(name)) { - var property = json[name]; + for (var name in properties) { + if (properties.hasOwnProperty(name)) { + var property = properties[name]; var byteOffset = property.byteOffset; if (defined(byteOffset)) { // This is a binary property @@ -298,14 +335,14 @@ define([ if (!defined(type)) { throw new RuntimeError('type is required.'); } - if (!defined(binary)) { + if (!defined(binaryBody)) { throw new RuntimeError('Property ' + name + ' requires a batch table binary.'); } var binaryAccessor = getBinaryAccessor(property); var componentCount = binaryAccessor.componentsPerAttribute; var classType = binaryAccessor.classType; - var typedArray = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + byteOffset, featuresLength); + var typedArray = binaryAccessor.createArrayBufferView(binaryBody.buffer, binaryBody.byteOffset + byteOffset, featuresLength); if (!defined(binaryProperties)) { binaryProperties = {}; @@ -322,6 +359,10 @@ define([ } } return binaryProperties; + } + + Cesium3DTileBatchTable.prototype.getBinaryProperties = function(featuresLength) { + return getBinaryProperties(featuresLength, this._properties, this.batchTableBinary); }; function getByteLength(batchTable) { @@ -738,8 +779,7 @@ define([ Check.typeOf.string('name', name); //>>includeEnd('debug'); - var json = this.batchTableJson; - return (defined(json) && defined(json[name])) || (defined(this._batchTableHierarchy) && hasPropertyInHierarchy(this, batchId, name)); + return (defined(this._properties[name])) || (defined(this._batchTableHierarchy) && hasPropertyInHierarchy(this, batchId, name)); }; Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId, results) { @@ -750,12 +790,8 @@ define([ results = defined(results) ? results : []; results.length = 0; - var json = this.batchTableJson; - for (var name in json) { - if (json.hasOwnProperty(name)) { - results.push(name); - } - } + var propertyNames = Object.keys(this._properties); + results.push.apply(results, propertyNames); if (defined(this._batchTableHierarchy)) { getPropertyNamesInHierarchy(this, batchId, results); @@ -770,10 +806,6 @@ define([ Check.typeOf.string('name', name); //>>includeEnd('debug'); - if (!defined(this.batchTableJson)) { - return undefined; - } - if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { @@ -781,7 +813,7 @@ define([ } } - var propertyValues = this.batchTableJson[name]; + var propertyValues = this._properties[name]; if (defined(propertyValues)) { return clone(propertyValues[batchId], true); } @@ -817,17 +849,11 @@ define([ } } - if (!defined(this.batchTableJson)) { - // Tile payload did not have a batch table. Create one for new user-defined properties. - this.batchTableJson = {}; - } - - var propertyValues = this.batchTableJson[name]; - + var propertyValues = this._properties[name]; if (!defined(propertyValues)) { // Property does not exist. Create it. - this.batchTableJson[name] = new Array(featuresLength); - propertyValues = this.batchTableJson[name]; + this._properties[name] = new Array(featuresLength); + propertyValues = this._properties[name]; } propertyValues[batchId] = clone(value, true); @@ -1466,6 +1492,23 @@ define([ } }; + /** + * Returns the contents of the batch table extension, or undefined + * if the extension is not present. + * @param {String} extensionName The name of the extension. + * + * @returns {Object|undefined} The contents of the batch table extension, or undefined + * if the extension is not present. + */ + Cesium3DTileBatchTable.prototype.getExtension = function(extensionName) { + var extensions = this._extensions; + if (!defined(extensions)) { + return; + } + + return extensions[extensionName]; + }; + Cesium3DTileBatchTable.prototype.isDestroyed = function() { return false; }; diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 086f27e75a79..f2da08fe3eee 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -167,6 +167,7 @@ define([ this._asset = undefined; // Metadata for the entire tileset this._properties = undefined; // Metadata for per-model/point/etc properties this._geometricError = undefined; // Geometric error when the tree is not rendered at all + this._extensionsUsed = undefined; this._gltfUpAxis = undefined; this._processingQueue = []; this._selectedTiles = []; @@ -709,6 +710,7 @@ define([ that._asset = tilesetJson.asset; that._properties = tilesetJson.properties; that._geometricError = tilesetJson.geometricError; + that._extensionsUsed = tilesetJson.extensionsUsed; that._gltfUpAxis = gltfUpAxis; that._readyPromise.resolve(that); }).otherwise(function(error) { @@ -1915,6 +1917,20 @@ define([ } }; + /** + * true if this the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + * @param {String} extensionName The name of the extension to check. + * + * @returns {Boolean} true if this the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + */ + Cesium3DTileset.prototype.hasExtension = function(extensionName) { + if (!defined(this._extensionsUsed)) { + return false; + } + + return (this._extensionsUsed.indexOf(extensionName) > -1); + }; + /** * Returns true if this object was destroyed; otherwise, false. *

diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 4bb1850225ae..28e610a66e4b 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -393,7 +393,7 @@ define([ // If points are not batched and there are per-point properties, use these properties for styling purposes var styleableProperties; if (!defined(batchIds) && defined(batchTableBinary)) { - styleableProperties = Cesium3DTileBatchTable.getBinaryProperties(pointsLength, batchTableJson, batchTableBinary); + styleableProperties = content._batchTable.getBinaryProperties(pointsLength); // WebGL does not support UNSIGNED_INT, INT, or DOUBLE vertex attributes. Convert these to FLOAT. for (var name in styleableProperties) { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tile.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..c9eda60d78cf14d4e58b6cdffb7327864796e626 GIT binary patch literal 78260 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⩔&%}Dt}*f6Oz(m9-lEKZ zN0zWJ)XI*3i?P3lm(TyT-%a$rR$~+YJ zyNTax^gDO8HMZtvAM_&0dTzmL-MQs#S` z``??=|CWyX9V)q2V}EWhD`xyW=Kf|X{!MDrf4?99tw{Xa-2bQlyU6(bFZjRt-$KT} z`?$ZiN!-`|>;F45@qKpF@B8bY+v|NN(#f*v_x(-3@7wp~#NQH>`8!Fi6MG*Of4?qB ze7`Qx-zvo4ukCl<4gO7C{C!;ZoBsR#%>GoKv;VtZ+|%9Pe<+{-f4EO=`h7pMvoff6 z$CdrP&+W$z*jM!axuSOGhwr16`&}UBnSAG58NJf)rQzYecm0)*j8<{GIg)O;z*e?5jF2RpC!A?Vrlz>L2l`>b}^({JOa7 zwI_eauSi$VO~3EE{IM?VpX8cM>dtPxJZE}oeQfYPTh;lk;(9jDo8-ou0j;r3W#i9* z*MT*-sciH)=)fFqDjR4d>`X7|7>HFU-`u~&K zR5tz`G-n<+m5o0K9hk>WW#iAmq0Hl^vhn9&5c9Y(mI?6Q7|Y4<-Wbc-@ZK29#qj>0 zl&k3f-z>B6zo~5eIkSHuE+IH^*uVbf5Muz<`!& zU^Q<``UPN!tj?A4YEZTWYtmNT+X{an7*gNb+lJcKl&#Rx$Xa+yqt^m!d9|t4_O=DL z05{{RL!50vv8Y3|YT$NwuLjmY)}?F*R;RW-rLMPwlRFTty0;@&b?Wt~?da`9)S6&T z>N~??D{w37yAXeCuRc<^HLbgN4QOisqiwuhVN?r!S8!J^hgy!e8(16MmQn|72<}FE zL$DE;<26PKbLi6qDclt=yCa1Sh_MG!xC>GDL<;MBdvVo=!(NnJuAO0+OKHlr6U>|O zNiLX6y%|0B0{2GljfXwG=J?zLy*b$2%cGV@#NE9XaA<H6S_k~M^Ewi(4SGkglh>JAM`T;B&amhV!`9UI zN82C0v)2XL$vXfk?1c4!NMT33bVUj~5ThGXSV+`^kir5uHA4yyMjlN2L0)$(yPx0&t(i5#0 z@^ETB!Jc?I0x3KM??)nqJ&1i2QrI0f&5#FsN7Hf?`qALgUSDc`u|Lx5hleB3`+@!O zd^lQvu)jBe+5lqq_KxueA_pM*a1DgTKp6I7FV*n|anGJOry*x>P4)goISD+Owi(_j_?re!qkgJ) z8nsg?r=T5+JRNVxqMr_)?wvvH4DU?v1n@YnvxsvhC>CcC?L_cwyq^gE3waLZY;Xp( zb1CO|=Q(*E(Pnt(bIqWB0k!kJ3yFF%crx{iU~vj~3iXSLf2wy0Qg|w@7kih|b}5Wb z^DcwY>FAe%mwA^{yWG11JOezFauzrfyn^m-a|;?0<0fK z3g_cx5mI>ZK7zg&TAmE= zjC>LK6xYkJco~LIu$RvAUg0{+`#0BFw7!IV*?Sdy$$Jece2Jc~BZV*G_YI_QIg#E( z3SWT1TS(zD_{~BJ-$uSo`&-@$EZ;<50ltHWH_+Yz-|^n1_AdTkXE(o!d>8o|eHg|-s8()-f; z3j7MIuhCc1{x$e1E#H9Oc;C|RQ*ae>HP>g}ca(3z?`d1@{eZt!;412CydSBpq5OdM z1@b4neS!WH_>;Gm+FI{t@N4i(u3w1rGbk3n5bYcASG<1%eurE~`4wDE?KjFg?{_DE zC)#T753beJ|D^T@57R#&J^y>^zP|rag%qx#HSj~)LjNb2MgCftg?>aW z^3&AP{$}7>Z!`aA$}jNS9Ndi0Hs_Nqz_ectDNNIEOQbNuYjvbBBt{LSFz{1;O{6g8 zZ^f1JebD!}=JI_H^!#nOJpWIx7N2bG*P?6#)}&U;uZ^sYhnoJj_^g4xEx4^;hguyX zR`<7q!BZYN{-2f@v7B;nzwf$XbX@I^fxT~K-EeHGh{%&~K1${SgH@_jZ zhWOvvZ$z|u=#9X}eiLeqkUMcTfkhJ-?nr%iwB6C0_Vwf z3|srZvcLBC_ebyIcL6(N(S^?r06X~yB88pk*%c}5h~I8VVFw}|gcKIS;9#V%0DiTQ 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 L<+=*5>YDxsY^(Rc literal 0 HcmV?d00001 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json new file mode 100644 index 000000000000..500049f65f4a --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json @@ -0,0 +1,53 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 70, + "root": { + "transform": [ + 0.9686356343768792, + 0.24848542777253735, + 0, + 0, + -0.15986460744966327, + 0.623177611820219, + 0.765567091384559, + 0, + 0.19023226619126932, + -0.7415555652213445, + 0.6433560667227647, + 0, + 1215011.9317263428, + -4736309.3434217675, + 4081602.0044800863, + 1 + ], + "refine": "ADD", + "boundingVolume": { + "box": [ + 0, + 0, + 10, + 50, + 0, + 0, + 0, + 50, + 0, + 0, + 0, + 10 + ] + }, + "geometricError": 0, + "content": { + "uri": "tile.b3dm" + } + }, + "extensionsUsed": [ + "3DTILES_batch_table_hierarchy" + ], + "extensionsRequired": [ + "3DTILES_batch_table_hierarchy" + ] +} diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index e9f36c782644..0e4d1ed1e40b 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -39,6 +39,7 @@ defineSuite([ var batchTableHierarchyBinaryUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json'; var batchTableHierarchyMultipleParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json'; var batchTableHierarchyNoParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json'; + var batchTableHierarchyExtensionUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json'; var result = new Color(); @@ -58,6 +59,9 @@ defineSuite([ // One feature is located at the center, point the camera there var center = Cartesian3.fromRadians(centerLongitude, centerLatitude); scene.camera.lookAt(center, new HeadingPitchRange(0.0, -1.57, 20.0)); + + // Keep the error from logging to the console when running tests + Cesium3DTileBatchTable._deprecationWarning = function () {}; }); afterAll(function() { @@ -900,6 +904,10 @@ defineSuite([ return checkBatchTableHierarchy(batchTableHierarchyUrl, false); }); + it('renders tileset with batch table hierarchy extension', function() { + return checkBatchTableHierarchy(batchTableHierarchyExtensionUrl, false); + }); + it('renders tileset with batch table hierarchy using binary properties', function() { return checkBatchTableHierarchy(batchTableHierarchyBinaryUrl, true); }); @@ -912,6 +920,14 @@ defineSuite([ return checkBatchTableHierarchyNoParents(batchTableHierarchyNoParentsUrl); }); + it('warns about deprecated batch hierarchy (pre-version 1.0)', function() { + spyOn(Cesium3DTileBatchTable, '_deprecationWarning'); + return checkBatchTableHierarchy(batchTableHierarchyUrl, false) + .then(function(tileset) { + expect(Cesium3DTileBatchTable._deprecationWarning).toHaveBeenCalled(); + }); + }); + it('validates hierarchy with multiple parents', function() { // building0 // / \ From 5874498a6af037f2b872bf1f9b9001208c6aff01 Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 6 Jul 2018 10:38:24 -0400 Subject: [PATCH 2/5] Update CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index cf1f9558e178..72925636f8b2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ Change Log #### Deprecated :hourglass_flowing_sand: * Support for 3D Tiles `content.url` is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use `content.uri instead`. Support for `content.url` will remain for backwards compatibility. [#6744](https://github.com/AnalyticalGraphicsInc/cesium/pull/6744) -* Support for the 3D Tiles pre-version 1.0 Batch Table Hierarchy is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use the [`3DTILES_batch_table_hierarchy`](https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/1.0/extensions/3DTILES_batch_table_hierarchy) extension instead. Support for the deprecated batch table hierarchy will remain for backwards compatibility. [#X](https://github.com/AnalyticalGraphicsInc/cesium/pull/X) +* Support for the 3D Tiles pre-version 1.0 Batch Table Hierarchy is deprecated to reflect updates to the [3D Tiles spec](https://github.com/AnalyticalGraphicsInc/3d-tiles/pull/301). Use the [`3DTILES_batch_table_hierarchy`](https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/1.0/extensions/3DTILES_batch_table_hierarchy) extension instead. Support for the deprecated batch table hierarchy will remain for backwards compatibility. [#6780](https://github.com/AnalyticalGraphicsInc/cesium/pull/6780) #### Fixes :wrench: * Fixed bug causing billboards and labels to appear the wrong size when switching scene modes [#6745](https://github.com/AnalyticalGraphicsInc/cesium/issues/6745) From e740853a6c050a16dd86040fb7091e76adb5925f Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 6 Jul 2018 13:29:56 -0400 Subject: [PATCH 3/5] Update specs --- Source/Scene/Cesium3DTileBatchTable.js | 8 +++++-- Source/Scene/PointCloud3DTileContent.js | 2 +- .../BatchTableHierarchyBinary/tile.b3dm | Bin 95229 -> 79364 bytes .../BatchTableHierarchyBinary/tileset.json | 12 +++++++--- .../tile.b3dm | Bin 94125 -> 78228 bytes .../tileset.json | 4 ++-- .../tile.b3dm | Bin 94461 -> 78596 bytes .../tileset.json | 12 +++++++--- .../BatchTableHierarchyNoParents/tile.b3dm | Bin 93789 -> 77924 bytes .../BatchTableHierarchyNoParents/tileset.json | 12 +++++++--- .../Scene/Batched3DModel3DTileContentSpec.js | 7 ++++-- Specs/Scene/Cesium3DTileBatchTableSpec.js | 21 ++++++++++-------- 12 files changed, 53 insertions(+), 25 deletions(-) rename Specs/Data/Cesium3DTiles/Hierarchy/{BatchTableHierarchy => BatchTableHierarchyLegacy}/tile.b3dm (69%) rename Specs/Data/Cesium3DTiles/Hierarchy/{BatchTableHierarchy => BatchTableHierarchyLegacy}/tileset.json (93%) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index ca19c575458f..08b465e0754f 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -191,6 +191,10 @@ define([ hierarchy = legacyHierarchy; } + if (!defined(hierarchy)) { + return; + } + return initializeHierarchyValues(hierarchy, binaryBody); } @@ -361,8 +365,8 @@ define([ return binaryProperties; } - Cesium3DTileBatchTable.prototype.getBinaryProperties = function(featuresLength) { - return getBinaryProperties(featuresLength, this._properties, this.batchTableBinary); + Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, batchTableJson, batchTableBinary) { + return getBinaryProperties(featuresLength, batchTableJson, batchTableBinary); }; function getByteLength(batchTable) { diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 28e610a66e4b..4bb1850225ae 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -393,7 +393,7 @@ define([ // If points are not batched and there are per-point properties, use these properties for styling purposes var styleableProperties; if (!defined(batchIds) && defined(batchTableBinary)) { - styleableProperties = content._batchTable.getBinaryProperties(pointsLength); + styleableProperties = Cesium3DTileBatchTable.getBinaryProperties(pointsLength, batchTableJson, batchTableBinary); // WebGL does not support UNSIGNED_INT, INT, or DOUBLE vertex attributes. Convert these to FLOAT. for (var name in styleableProperties) { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index a58039a483bf0305b2815c90f1083f7d6f2d6324..992d1a7190e9f01b0bc08cd2bdef907303d0836c 100644 GIT binary patch delta 8721 zcmc&%&u<$=7#&wBm5NeYR0)&|?g$}JP4Tbh$6gw@P1{t76OsUjC^Bn%9Is@1quot^ z$TE`y5*%B6>48HJ9D3kT)B_xgxNzXW3FX)m^ZF2=-;22|Vez~xAx!h>;+|{-Dg}K#I+4L&)l4q71qExqpV>*@k-5-AW^R-0h$@eF|J$34STj z-rnp>>)GD=M0a9*;_S>uCv~tdNBiH5&m=awe~c%kYc{tU!u@blv|!e=9iHO1ghO+2 zgJ&D9S0bupJtcQ%3oGQEEY8i1Gg)o1hh>E6;(t>y}kcmF$e zM(!1@dX7~U+{k2KSRR1E=#hG+vk5{Ym!Fx;hG3k|%uXKkWaOu3XsHil{(!~q)EnpI z#i>m8rKTJmP1E#*W0{S;gV`!Oi^4M-4Xd(ZZ*SIHNS+>_vgwK|cEfhAnH37bSkI*V z4;Y-FFxbn0wMP;xrI!(t+1RR^i#8o1Us^7F{K*``tlHan7FTh!Rc_SaL!`K9TCQu| z5<&NRI)%@MZ&$c=L0-G|nGbGapyJZXVqpQXq2GJ>F3q- z9ppPcUkhJ+y3gLsUh}tGW|Is$w(S+El2qLa9zTEAzoUjW4_e7sCz(vX`(A=wo-eW| zyKkTTS?*k7Oe3UDacE1e)3Y6^@c7v*ekX>64BMc%9_Js@vD$j*t0fG{Cy$tZ7VB|9 z#v#&21J7SflfGJqp1+6e;TKz2FPCx(U3fp zzfJ>Er#Q6n_a7&q56EAiIJ7B$od%>z@nsAX5;AOq;(FvC(y`il%3r4ed6f9)Fct%( za*-_<9~{Vk@Ztz+DgVI04({WIR3Z2^j1LJpY@?FCdj;fw5AKJ>1N4pr%D*4ML+nQh z8727u-1z@5;tBinBme#d>h>RD&_kg74=u*HCUuHKTWX#D5xxJzoWNs5qy&_|5~3k_ zq)u^YORdvCru=`x(P;zauT31aIWTzLgle{y(!%!*>7x delta 8445 zcmdT}-ESjT6`!QtZr7V;DIYDgAWcW8O3D!Y6|dt6iI8|VF4<)3q}x`}%DT3%?Sb*w z%#2O4t8jThLgEcsLOk*>pnZY|B>sX*yz$mb2wsrjg~v*qbMMT(Gh@ezyKyRV6#LFS z=bq2sJ=ePP%YVK2**|aO>bYijLDRI)yany+@Qr^bH#O~di<lr2WQ0wxXFgW)V1^TmzAm`3YSc{>XMbuEbb zIBljM!O5JjZds=JTNB2;tf7%D#260_-Dx`uO>@}&=_B%$YSS%JcOk?1p z@h0&}$u!QSPK1}xE72CsF(NNwP$Xe5&|Fy0j^2JnUx_KJWmGm3t4BAM-(s)`ape=Y zjo{7YHwwA9f-vK<&MiI+GPkibiFueCY3dlS*ezaSyMT_v*G^{RZQ!E=S=n|j0 z7O{C1!v|4ApEf#<_0s_&Bp9;+MN|%nJ>Uuq(yd$6fl3^w*Rp2#p8+FHtJNBKu=Y4( za)LS9wLF1Z+^aw+==Eu1U=vqt+HkUCIhF%0jyEXZC63o8E`8H!oEoLf8HU=WUPm~A zBcn9>@A4{B8(#K8)7U?#KG@oWD8jB8HZ;>XDu1|ra8TXBh!q<;lWEj=r>^Wo86mj9 zJTw#wdT^9$IX@6hMx_j*^5c*$ zRzS*_Mx$fdO_yTJ<9a;O?c2}~L`A&@b#Q_BhWz3)HxqE4hK7%oQm)4b^bB0e0!73D zpx|*5JU74*mjn;cnA$Gsa=pQrZwTVUK~f+1A_k(4B(<`@zu&rGR}4z=1BqJ;4oNWA+{p01BMcPYsWDiQ`)h zsPuz_o$?-gR4IP|s1Sz})ah;k)wsPM(+0XWaplA6!Mo+{qsqbl*h=C2#8uoLnyc(T zDpwE7N7b$UL-z3CupHB}4)$fI3r|gOtbmTmMi*lM1XWnI+|E&DuY9;uxp(h<&<(3p zD~v4zj>lv}9Al}j7_!zgS#&~nNZue5OxX(K$%Zg1$%GXkR2G&yE*^BzNL^4k3W2zM zq_u`?0%t>T#N}nbWfAcl!aC?LfDhSeAWc4;TpUu=A$9zTbet^~^JaDIQ~PpjN=XkT>9sy2z(q{(ZX zV-vml{0@9gn~m6P;#V%sX7pD$@S1j2#I8!w=hVZdMDn^ee`51DG1UTtcRll?Z)g`0 zyGY=C{u|mA5IaZ7o7(*7o0=k~hHCUJZ8nm(mwLHet7~Cd;jEd$At1_)9JO+7J zqjDY02e&n2^Wl9>g2B{x+a%_V~b3A>>}fVQb;))@axuL1_)4fIO0=dTETroD;=m8nM0?qQhc}!j JgV4@W{{v;#+%5nB diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json index 01d4746f1ded..500049f65f4a 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "1.0" + "version": "0.0" }, "geometricError": 70, "root": { @@ -41,7 +41,13 @@ }, "geometricError": 0, "content": { - "url": "tile.b3dm" + "uri": "tile.b3dm" } - } + }, + "extensionsUsed": [ + "3DTILES_batch_table_hierarchy" + ], + "extensionsRequired": [ + "3DTILES_batch_table_hierarchy" + ] } diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyLegacy/tile.b3dm similarity index 69% rename from Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm rename to Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyLegacy/tile.b3dm index 1f7b54d4f418a2d5d15ea9e0be821940bdef06ee..17e76151f1cc428a6095a4d1a48700ca0ec6805e 100644 GIT binary patch delta 8673 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 CKGUE8 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json index 01d4746f1ded..500049f65f4a 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "1.0" + "version": "0.0" }, "geometricError": 70, "root": { @@ -41,7 +41,13 @@ }, "geometricError": 0, "content": { - "url": "tile.b3dm" + "uri": "tile.b3dm" } - } + }, + "extensionsUsed": [ + "3DTILES_batch_table_hierarchy" + ], + "extensionsRequired": [ + "3DTILES_batch_table_hierarchy" + ] } diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tile.b3dm index 362a919adabd3f9ae5ee430a7f25b039275de996..c63977a14720a8e16abc7a369b291a48086614d2 100644 GIT binary patch delta 8757 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 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json index 01d4746f1ded..500049f65f4a 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "1.0" + "version": "0.0" }, "geometricError": 70, "root": { @@ -41,7 +41,13 @@ }, "geometricError": 0, "content": { - "url": "tile.b3dm" + "uri": "tile.b3dm" } - } + }, + "extensionsUsed": [ + "3DTILES_batch_table_hierarchy" + ], + "extensionsRequired": [ + "3DTILES_batch_table_hierarchy" + ] } diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index 52a2ef22f301..69601adfb6fe 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -54,6 +54,9 @@ defineSuite([ beforeAll(function() { scene = createScene(); + + // Keep the error from logging to the console when running tests + Batched3DModel3DTileContent._deprecationWarning = function() {}; }); afterAll(function() { @@ -82,7 +85,7 @@ defineSuite([ expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); Cesium3DTilesTester.expectRenderTileset(scene, tileset); var batchTable = tileset._root._content.batchTable; - expect(batchTable.batchTableJson).toBeDefined(); + expect(batchTable._properties).toBeDefined(); expect(batchTable.batchTableBinary).toBeUndefined(); }); }); @@ -94,7 +97,7 @@ defineSuite([ expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); Cesium3DTilesTester.expectRenderTileset(scene, tileset); var batchTable = tileset._root._content.batchTable; - expect(batchTable.batchTableJson).toBeDefined(); + expect(batchTable._properties).toBeDefined(); expect(batchTable.batchTableBinary).toBeUndefined(); }); }); diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index 0e4d1ed1e40b..d62f216a534b 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -9,6 +9,7 @@ defineSuite([ 'Core/Matrix3', 'Core/Matrix4', 'Renderer/ContextLimits', + 'Scene/Batched3DModel3DTileContent', 'Scene/Cesium3DTileStyle', 'Specs/Cesium3DTilesTester', 'Specs/createScene' @@ -23,6 +24,7 @@ defineSuite([ Matrix3, Matrix4, ContextLimits, + Batched3DModel3DTileContent, Cesium3DTileStyle, Cesium3DTilesTester, createScene) { @@ -35,11 +37,11 @@ defineSuite([ var withBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithBatchTable/tileset.json'; var withoutBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithoutBatchTable/tileset.json'; var noBatchIdsUrl = './Data/Cesium3DTiles/Batched/BatchedNoBatchIds/tileset.json'; - var batchTableHierarchyUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json'; + var batchTableHierarchyExtensionUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json'; var batchTableHierarchyBinaryUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json'; var batchTableHierarchyMultipleParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json'; var batchTableHierarchyNoParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json'; - var batchTableHierarchyExtensionUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json'; + var batchTableHierarchyLegacyUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyLegacy/tileset.json'; var result = new Color(); @@ -61,7 +63,8 @@ defineSuite([ scene.camera.lookAt(center, new HeadingPitchRange(0.0, -1.57, 20.0)); // Keep the error from logging to the console when running tests - Cesium3DTileBatchTable._deprecationWarning = function () {}; + Cesium3DTileBatchTable._deprecationWarning = function() {}; + Batched3DModel3DTileContent._deprecationWarning = function() {}; }); afterAll(function() { @@ -370,7 +373,7 @@ defineSuite([ var batchTable = new Cesium3DTileBatchTable(mockTileset, 3); batchTable.setProperty(0, 'height', 1.0); - expect(batchTable.batchTableJson.height.length).toEqual(3); + expect(batchTable._properties.height.length).toEqual(3); expect(batchTable.getProperty(0, 'height')).toEqual(1.0); expect(batchTable.getProperty(1, 'height')).toBeUndefined(); expect(batchTable.getProperty(2, 'height')).toBeUndefined(); @@ -900,10 +903,6 @@ defineSuite([ }); } - it('renders tileset with batch table hierarchy', function() { - return checkBatchTableHierarchy(batchTableHierarchyUrl, false); - }); - it('renders tileset with batch table hierarchy extension', function() { return checkBatchTableHierarchy(batchTableHierarchyExtensionUrl, false); }); @@ -920,9 +919,13 @@ defineSuite([ return checkBatchTableHierarchyNoParents(batchTableHierarchyNoParentsUrl); }); + it('renders tileset with legacy batch table hierarchy (pre-version 1.0)', function() { + return checkBatchTableHierarchy(batchTableHierarchyLegacyUrl, false); + }); + it('warns about deprecated batch hierarchy (pre-version 1.0)', function() { spyOn(Cesium3DTileBatchTable, '_deprecationWarning'); - return checkBatchTableHierarchy(batchTableHierarchyUrl, false) + return checkBatchTableHierarchy(batchTableHierarchyLegacyUrl, false) .then(function(tileset) { expect(Cesium3DTileBatchTable._deprecationWarning).toHaveBeenCalled(); }); From 91033c55765fbf511333c8a016d48c765aa8cd6b Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 13 Jul 2018 11:45:51 -0400 Subject: [PATCH 4/5] Cleanup and fix spec for Batch Table Hierarchy extension --- Source/Scene/Cesium3DTileBatchTable.js | 31 ++---------------- Source/Scene/Cesium3DTileset.js | 4 +-- .../tile.b3dm | Bin .../tileset.json | 0 .../Scene/Batched3DModel3DTileContentSpec.js | 5 +-- Specs/Scene/Cesium3DTileBatchTableSpec.js | 9 +++-- Specs/Scene/Cesium3DTilesetSpec.js | 9 +++++ 7 files changed, 18 insertions(+), 40 deletions(-) rename Specs/Data/Cesium3DTiles/Hierarchy/{BatchTableHierarchyExtension => BatchTableHierarchy}/tile.b3dm (100%) rename Specs/Data/Cesium3DTiles/Hierarchy/{BatchTableHierarchyExtension => BatchTableHierarchy}/tileset.json (100%) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 08b465e0754f..33f7e93b0b60 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -82,11 +82,6 @@ define([ */ this.featuresLength = featuresLength; - /** - * @private - */ - this.batchTableBinary = batchTableBinary; - this._translucentFeaturesLength = 0; // Number of features in the tile that are translucent var extensions; @@ -94,7 +89,6 @@ define([ extensions = batchTableJson.extensions; } this._extensions = defaultValue(extensions, {}); - this._extras = defined(batchTableJson) ? batchTableJson.extras : undefined; var properties = initializeProperties(batchTableJson); this._properties = properties; @@ -182,11 +176,11 @@ define([ return; } - var hierarchy = batchTable.getExtension('3DTILES_batch_table_hierarchy'); + var hierarchy = batchTable._extensions['3DTILES_batch_table_hierarchy']; var legacyHierarchy = jsonHeader.HIERARCHY; if (defined(legacyHierarchy)) { - Cesium3DTileBatchTable._deprecationWarning('batchTableHierarchyExtension', 'The batch table HIERARCHY property has been moved to an extension. Use extension.3DTILES_batch_table_hierarchy instead.'); + Cesium3DTileBatchTable._deprecationWarning('batchTableHierarchyExtension', 'The batch table HIERARCHY property has been moved to an extension. Use extensions.3DTILES_batch_table_hierarchy instead.'); batchTable._extensions['3DTILES_batch_table_hierarchy'] = legacyHierarchy; hierarchy = legacyHierarchy; } @@ -320,10 +314,6 @@ define([ //>>includeEnd('debug'); function getBinaryProperties(featuresLength, properties, binaryBody) { - if (!defined(properties)) { - return; - } - var binaryProperties; for (var name in properties) { if (properties.hasOwnProperty(name)) { @@ -1496,23 +1486,6 @@ define([ } }; - /** - * Returns the contents of the batch table extension, or undefined - * if the extension is not present. - * @param {String} extensionName The name of the extension. - * - * @returns {Object|undefined} The contents of the batch table extension, or undefined - * if the extension is not present. - */ - Cesium3DTileBatchTable.prototype.getExtension = function(extensionName) { - var extensions = this._extensions; - if (!defined(extensions)) { - return; - } - - return extensions[extensionName]; - }; - Cesium3DTileBatchTable.prototype.isDestroyed = function() { return false; }; diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index f2da08fe3eee..19bd749a7313 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -1918,10 +1918,10 @@ define([ }; /** - * true if this the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + * true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. * @param {String} extensionName The name of the extension to check. * - * @returns {Boolean} true if this the tileset JSON file lists the extension in extensionsUsed; otherwise, false. + * @returns {Boolean} true if the tileset JSON file lists the extension in extensionsUsed; otherwise, false. */ Cesium3DTileset.prototype.hasExtension = function(extensionName) { if (!defined(this._extensionsUsed)) { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm similarity index 100% rename from Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tile.b3dm rename to Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json similarity index 100% rename from Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json rename to Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index 69601adfb6fe..eeea8a004f83 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -56,7 +56,7 @@ defineSuite([ scene = createScene(); // Keep the error from logging to the console when running tests - Batched3DModel3DTileContent._deprecationWarning = function() {}; + spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); }); afterAll(function() { @@ -79,7 +79,6 @@ defineSuite([ }); it('recognizes the legacy 20-byte header', function() { - spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); return Cesium3DTilesTester.loadTileset(scene, deprecated1Url) .then(function(tileset) { expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); @@ -91,7 +90,6 @@ defineSuite([ }); it('recognizes the legacy 24-byte header', function() { - spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); return Cesium3DTilesTester.loadTileset(scene, deprecated2Url) .then(function(tileset) { expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); @@ -103,7 +101,6 @@ defineSuite([ }); it('logs deprecation warning for use of BATCHID without prefixed underscore', function() { - spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); return Cesium3DTilesTester.loadTileset(scene, deprecated1Url) .then(function(tileset) { expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index d62f216a534b..65028807093b 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -37,7 +37,7 @@ defineSuite([ var withBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithBatchTable/tileset.json'; var withoutBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithoutBatchTable/tileset.json'; var noBatchIdsUrl = './Data/Cesium3DTiles/Batched/BatchedNoBatchIds/tileset.json'; - var batchTableHierarchyExtensionUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyExtension/tileset.json'; + var batchTableHierarchyUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json'; var batchTableHierarchyBinaryUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json'; var batchTableHierarchyMultipleParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json'; var batchTableHierarchyNoParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json'; @@ -63,8 +63,8 @@ defineSuite([ scene.camera.lookAt(center, new HeadingPitchRange(0.0, -1.57, 20.0)); // Keep the error from logging to the console when running tests - Cesium3DTileBatchTable._deprecationWarning = function() {}; - Batched3DModel3DTileContent._deprecationWarning = function() {}; + spyOn(Cesium3DTileBatchTable, '_deprecationWarning'); + spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); }); afterAll(function() { @@ -904,7 +904,7 @@ defineSuite([ } it('renders tileset with batch table hierarchy extension', function() { - return checkBatchTableHierarchy(batchTableHierarchyExtensionUrl, false); + return checkBatchTableHierarchy(batchTableHierarchyUrl, false); }); it('renders tileset with batch table hierarchy using binary properties', function() { @@ -924,7 +924,6 @@ defineSuite([ }); it('warns about deprecated batch hierarchy (pre-version 1.0)', function() { - spyOn(Cesium3DTileBatchTable, '_deprecationWarning'); return checkBatchTableHierarchy(batchTableHierarchyLegacyUrl, false) .then(function(tileset) { expect(Cesium3DTileBatchTable._deprecationWarning).toHaveBeenCalled(); diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index b072e9e9d1f1..be683c7c3f27 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -86,6 +86,8 @@ defineSuite([ var withBatchTableUrl = 'Data/Cesium3DTiles/Batched/BatchedWithBatchTable/tileset.json'; var noBatchIdsUrl = 'Data/Cesium3DTiles/Batched/BatchedNoBatchIds/tileset.json'; + var withBatchTableHierarchyUrl = 'Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json'; + var withTransformBoxUrl = 'Data/Cesium3DTiles/Batched/BatchedWithTransformBox/tileset.json'; var withTransformSphereUrl = 'Data/Cesium3DTiles/Batched/BatchedWithTransformSphere/tileset.json'; var withTransformRegionUrl = 'Data/Cesium3DTiles/Batched/BatchedWithTransformRegion/tileset.json'; @@ -358,6 +360,13 @@ defineSuite([ }); }); + it('hasExtension returns true if the tileset JSON file uses the specified extension', function() { + return Cesium3DTilesTester.loadTileset(scene, withBatchTableHierarchyUrl).then(function(tileset) { + expect(tileset.hasExtension('3DTILES_batch_table_hierarchy')).toBe(true); + expect(tileset.hasExtension('3DTILES_nonexistant_extension')).toBe(false); + }); + }); + it('passes version in query string to tiles', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { expect(tileset._root.content._resource.url).toEqual(getAbsoluteUri(tilesetUrl.replace('tileset.json','parent.b3dm?v=1.2.3'))); From ab89ce13cda04a9aa1f266aff9311f3dc2b456bf Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 13 Jul 2018 12:01:37 -0400 Subject: [PATCH 5/5] Minor tweaks --- .../Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json | 2 +- .../Hierarchy/BatchTableHierarchyBinary/tileset.json | 2 +- .../Hierarchy/BatchTableHierarchyMultipleParents/tileset.json | 2 +- .../Hierarchy/BatchTableHierarchyNoParents/tileset.json | 2 +- Specs/Scene/Batched3DModel3DTileContentSpec.js | 2 -- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json index 500049f65f4a..b58514642f34 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "0.0" + "version": "1.0" }, "geometricError": 70, "root": { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json index 500049f65f4a..b58514642f34 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "0.0" + "version": "1.0" }, "geometricError": 70, "root": { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json index 500049f65f4a..b58514642f34 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "0.0" + "version": "1.0" }, "geometricError": 70, "root": { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json index 500049f65f4a..b58514642f34 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyNoParents/tileset.json @@ -1,6 +1,6 @@ { "asset": { - "version": "0.0" + "version": "1.0" }, "geometricError": 70, "root": { diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index eeea8a004f83..14fe3dc13f8d 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -85,7 +85,6 @@ defineSuite([ Cesium3DTilesTester.expectRenderTileset(scene, tileset); var batchTable = tileset._root._content.batchTable; expect(batchTable._properties).toBeDefined(); - expect(batchTable.batchTableBinary).toBeUndefined(); }); }); @@ -96,7 +95,6 @@ defineSuite([ Cesium3DTilesTester.expectRenderTileset(scene, tileset); var batchTable = tileset._root._content.batchTable; expect(batchTable._properties).toBeDefined(); - expect(batchTable.batchTableBinary).toBeUndefined(); }); });